Render animation fixes, vs code tasks
This commit is contained in:
+1
-1
@@ -80,7 +80,7 @@ namespace anm2ed::anm2
|
||||
bool animations_deserialize(const std::string&, int, std::set<int>&, std::string* = nullptr);
|
||||
|
||||
Item* item_get(int, Type, int = -1);
|
||||
Reference layer_animation_add(Reference = {}, std::string = {}, int = 0,
|
||||
Reference layer_animation_add(Reference = {}, int = -1, std::string = {}, int = 0,
|
||||
types::destination::Type = types::destination::ALL);
|
||||
Reference null_animation_add(Reference = {}, std::string = {}, bool = false,
|
||||
types::destination::Type = types::destination::ALL);
|
||||
|
||||
+20
-6
@@ -30,7 +30,7 @@ namespace anm2ed::anm2
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
Reference Anm2::layer_animation_add(Reference reference, std::string name, int spritesheetID,
|
||||
Reference Anm2::layer_animation_add(Reference reference, int insertBeforeID, std::string name, int spritesheetID,
|
||||
destination::Type destination)
|
||||
{
|
||||
auto id = reference.itemID == -1 ? map::next_id_get(content.layers) : reference.itemID;
|
||||
@@ -39,21 +39,35 @@ namespace anm2ed::anm2
|
||||
layer.name = !name.empty() ? name : layer.name;
|
||||
layer.spritesheetID = content.spritesheets.contains(spritesheetID) ? spritesheetID : 0;
|
||||
|
||||
auto add = [&](Animation* animation, int id)
|
||||
auto add = [&](Animation* animation, int id, bool insertBeforeReference)
|
||||
{
|
||||
animation->layerAnimations[id] = Item();
|
||||
|
||||
if (insertBeforeReference && insertBeforeID != -1)
|
||||
{
|
||||
auto it = std::find(animation->layerOrder.begin(), animation->layerOrder.end(), insertBeforeID);
|
||||
if (it != animation->layerOrder.end())
|
||||
{
|
||||
animation->layerOrder.insert(it, id);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
animation->layerOrder.push_back(id);
|
||||
};
|
||||
|
||||
if (destination == destination::ALL)
|
||||
{
|
||||
for (auto& animation : animations.items)
|
||||
if (!animation.layerAnimations.contains(id)) add(&animation, id);
|
||||
for (size_t index = 0; index < animations.items.size(); ++index)
|
||||
{
|
||||
auto& animation = animations.items[index];
|
||||
if (!animation.layerAnimations.contains(id)) add(&animation, id, true);
|
||||
}
|
||||
}
|
||||
else if (destination == destination::THIS)
|
||||
{
|
||||
if (auto animation = animation_get(reference.animationIndex))
|
||||
if (!animation->layerAnimations.contains(id)) add(animation, id);
|
||||
if (!animation->layerAnimations.contains(id)) add(animation, id, true);
|
||||
}
|
||||
|
||||
return {reference.animationIndex, LAYER, id};
|
||||
@@ -82,4 +96,4 @@ namespace anm2ed::anm2
|
||||
|
||||
return {reference.animationIndex, NULL_, id};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+3
-2
@@ -104,9 +104,10 @@ namespace anm2ed::anm2
|
||||
{
|
||||
bool noRegions = has_flag(flags, NO_REGIONS);
|
||||
bool frameNoRegionValues = has_flag(flags, FRAME_NO_REGION_VALUES);
|
||||
bool writeRegionValues = !frameNoRegionValues || noRegions;
|
||||
bool hasValidRegion = !noRegions && regionID != -1;
|
||||
bool writeRegionValues = !frameNoRegionValues || !hasValidRegion;
|
||||
|
||||
if (!noRegions && regionID != -1) element->SetAttribute("RegionId", regionID);
|
||||
if (hasValidRegion) element->SetAttribute("RegionId", regionID);
|
||||
element->SetAttribute("XPosition", position.x);
|
||||
element->SetAttribute("YPosition", position.y);
|
||||
if (writeRegionValues)
|
||||
|
||||
@@ -85,6 +85,27 @@ namespace anm2ed::imgui
|
||||
frames.clear();
|
||||
}
|
||||
|
||||
void pixels_unpremultiply_alpha(std::vector<uint8_t>& pixels)
|
||||
{
|
||||
for (size_t index = 0; index + 3 < pixels.size(); index += 4)
|
||||
{
|
||||
auto alpha = pixels[index + 3];
|
||||
if (alpha == 0)
|
||||
{
|
||||
pixels[index + 0] = 0;
|
||||
pixels[index + 1] = 0;
|
||||
pixels[index + 2] = 0;
|
||||
continue;
|
||||
}
|
||||
if (alpha == 255) continue;
|
||||
|
||||
float alphaUnit = (float)alpha / 255.0f;
|
||||
pixels[index + 0] = (uint8_t)glm::clamp((float)std::round((float)pixels[index + 0] / alphaUnit), 0.0f, 255.0f);
|
||||
pixels[index + 1] = (uint8_t)glm::clamp((float)std::round((float)pixels[index + 1] / alphaUnit), 0.0f, 255.0f);
|
||||
pixels[index + 2] = (uint8_t)glm::clamp((float)std::round((float)pixels[index + 2] / alphaUnit), 0.0f, 255.0f);
|
||||
}
|
||||
}
|
||||
|
||||
bool render_audio_stream_generate(AudioStream& audioStream, std::map<int, anm2::Sound>& sounds,
|
||||
const std::vector<int>& frameSoundIDs, int fps)
|
||||
{
|
||||
@@ -320,6 +341,7 @@ namespace anm2ed::imgui
|
||||
|
||||
bind();
|
||||
auto pixels = pixels_get();
|
||||
if (settings.renderIsRawAnimation) pixels_unpremultiply_alpha(pixels);
|
||||
auto frameIndex = (int)renderTempFrames.size();
|
||||
auto framePath = renderTempDirectory / render_frame_filename(settings.renderFormat, frameIndex);
|
||||
if (Texture::write_pixels_png(framePath, size, pixels.data()))
|
||||
|
||||
@@ -3,14 +3,12 @@
|
||||
#include <algorithm>
|
||||
#include <ranges>
|
||||
|
||||
#include <filesystem>
|
||||
#include <format>
|
||||
|
||||
#include "document.hpp"
|
||||
#include "log.hpp"
|
||||
#include "map_.hpp"
|
||||
#include "math_.hpp"
|
||||
#include "path_.hpp"
|
||||
#include "strings.hpp"
|
||||
#include "toast.hpp"
|
||||
#include "vector_.hpp"
|
||||
|
||||
@@ -1780,11 +1780,12 @@ namespace anm2ed::imgui
|
||||
if (ImGui::Button(localize.get(BASIC_ADD), widgetSize))
|
||||
{
|
||||
anm2::Reference addReference{};
|
||||
int insertBeforeID = reference.itemType == anm2::LAYER ? reference.itemID : -1;
|
||||
|
||||
document.snapshot(localize.get(EDIT_ADD_ITEM));
|
||||
if (type == anm2::LAYER)
|
||||
addReference = anm2.layer_animation_add({reference.animationIndex, anm2::LAYER, addItemID}, addItemName,
|
||||
addItemSpritesheetID, (destination::Type)destination);
|
||||
addReference = anm2.layer_animation_add({reference.animationIndex, anm2::LAYER, addItemID}, insertBeforeID,
|
||||
addItemName, addItemSpritesheetID, (destination::Type)destination);
|
||||
else if (type == anm2::NULL_)
|
||||
addReference = anm2.null_animation_add({reference.animationIndex, anm2::NULL_, addItemID}, addItemName,
|
||||
addItemIsShowRect, (destination::Type)destination);
|
||||
|
||||
+2
-1
@@ -149,7 +149,8 @@ namespace anm2ed
|
||||
{
|
||||
case render::GIF:
|
||||
command +=
|
||||
" -lavfi \"split[s0][s1];[s0]palettegen=stats_mode=full[p];[s1][p]paletteuse=dither=floyd_steinberg\""
|
||||
" -lavfi \"split[s0][s1];[s0]palettegen=stats_mode=full:reserve_transparent=1[p];"
|
||||
"[s1][p]paletteuse=dither=floyd_steinberg:alpha_threshold=128\""
|
||||
" -loop 0";
|
||||
command += std::format(" \"{}\"", pathString);
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user