Hotfix for adding frames, spritesheets, etc.
This commit is contained in:
42
src/anm2.cpp
42
src/anm2.cpp
@@ -913,40 +913,42 @@ Anm2Frame* anm2_frame_add(Anm2* self, Anm2Frame* frame, Anm2Reference* reference
|
||||
{
|
||||
Anm2Animation* animation = anm2_animation_from_reference(self, reference);
|
||||
Anm2Item* item = anm2_item_from_reference(self, reference);
|
||||
|
||||
if (!animation || !item)
|
||||
|
||||
if (!animation || !item)
|
||||
return nullptr;
|
||||
|
||||
if (item)
|
||||
Anm2Frame frameAdd = frame ? *frame : Anm2Frame{};
|
||||
s32 index = reference->frameIndex + 1;
|
||||
|
||||
if (reference->itemType == ANM2_TRIGGERS)
|
||||
{
|
||||
Anm2Frame frameAdd = frame ? *frame : Anm2Frame{};
|
||||
s32 index = reference->frameIndex + 1;
|
||||
s32 triggerIndex = time;
|
||||
|
||||
if (reference->itemType == ANM2_TRIGGERS)
|
||||
for (auto& frameCheck : item->frames)
|
||||
{
|
||||
s32 index = time;
|
||||
|
||||
for (auto& frameCheck : item->frames)
|
||||
if (frameCheck.atFrame == time)
|
||||
{
|
||||
if (frameCheck.atFrame == time)
|
||||
{
|
||||
index++;
|
||||
break;
|
||||
}
|
||||
triggerIndex++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
frameAdd.atFrame = index;
|
||||
index = item->frames.size();
|
||||
return &item->frames.emplace_back(frameAdd);
|
||||
frameAdd.atFrame = triggerIndex;
|
||||
return &item->frames.emplace_back(frameAdd);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (index >= static_cast<s32>(item->frames.size()))
|
||||
{
|
||||
item->frames.push_back(frameAdd);
|
||||
return &item->frames.back();
|
||||
}
|
||||
else
|
||||
{
|
||||
item->frames.insert(item->frames.begin() + index, frameAdd);
|
||||
return &item->frames[index];
|
||||
return &item->frames[static_cast<size_t>(index)];
|
||||
}
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void anm2_frame_erase(Anm2* self, Anm2Reference* reference)
|
||||
|
@@ -26,9 +26,9 @@ void editor_draw(Editor* self)
|
||||
canvas_viewport_set(&self->canvas);
|
||||
canvas_clear(self->settings->editorBackgroundColor);
|
||||
|
||||
if (self->spritesheetID != ID_NONE)
|
||||
if (Anm2Spritesheet* spritesheet = map_find(self->anm2->spritesheets, self->spritesheetID))
|
||||
{
|
||||
Texture& texture = self->anm2->spritesheets[self->spritesheetID].texture;
|
||||
Texture& texture = spritesheet->texture;
|
||||
|
||||
mat4 spritesheetTransform = transform * canvas_model_get(texture.size);
|
||||
canvas_texture_draw(&self->canvas, shaderTexture, texture.id, spritesheetTransform);
|
||||
|
@@ -26,23 +26,27 @@ void generate_preview_draw(GeneratePreview* self)
|
||||
canvas_clear(self->settings->previewBackgroundColor);
|
||||
|
||||
Anm2Item* item = anm2_item_from_reference(self->anm2, self->reference);
|
||||
Texture& texture = self->anm2->spritesheets[self->anm2->layers[self->reference->itemID].spritesheetID].texture;
|
||||
|
||||
if (item && !texture.isInvalid)
|
||||
|
||||
if (item)
|
||||
{
|
||||
const s32 index = std::clamp((s32)(self->time * count), 0, count);
|
||||
const s32 row = index / columns;
|
||||
const s32 column = index % columns;
|
||||
vec2 crop = startPosition + vec2(size.x * column, size.y * row);
|
||||
if (Anm2Spritesheet* spritesheet = map_find(self->anm2->spritesheets, self->anm2->layers[self->reference->itemID].spritesheetID))
|
||||
{
|
||||
Texture& texture = spritesheet->texture;
|
||||
|
||||
vec2 uvMin = crop / vec2(texture.size);
|
||||
vec2 uvMax = (crop + size) / vec2(texture.size);
|
||||
f32 vertices[] = UV_VERTICES(uvMin, uvMax);
|
||||
const s32 index = std::clamp((s32)(self->time * count), 0, count);
|
||||
const s32 row = index / columns;
|
||||
const s32 column = index % columns;
|
||||
vec2 crop = startPosition + vec2(size.x * column, size.y * row);
|
||||
|
||||
mat4 generateTransform = transform * canvas_model_get(size, {}, pivot);
|
||||
canvas_texture_draw(&self->canvas, shaderTexture, texture.id, generateTransform, vertices, COLOR_OPAQUE, COLOR_OFFSET_NONE);
|
||||
vec2 uvMin = crop / vec2(texture.size);
|
||||
vec2 uvMax = (crop + size) / vec2(texture.size);
|
||||
f32 vertices[] = UV_VERTICES(uvMin, uvMax);
|
||||
|
||||
mat4 generateTransform = transform * canvas_model_get(size, {}, pivot);
|
||||
canvas_texture_draw(&self->canvas, shaderTexture, texture.id, generateTransform, vertices, COLOR_OPAQUE, COLOR_OFFSET_NONE);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
canvas_unbind();
|
||||
}
|
||||
|
||||
|
@@ -1201,7 +1201,7 @@ static void _imgui_timeline(Imgui* self)
|
||||
if (_imgui_button(IMGUI_ADD_FRAME.copy({!item}), self))
|
||||
{
|
||||
Anm2Reference frameReference = *self->reference;
|
||||
frameReference.frameIndex = std::clamp(frameReference.frameIndex, 0, (s32)item->frames.size() - 1);
|
||||
frameReference.frameIndex = item->frames.empty() ? 0 : std::clamp(frameReference.frameIndex, 0, static_cast<s32>(item->frames.size() - 1));
|
||||
Anm2Frame* addFrame = anm2_frame_from_reference(self->anm2, &frameReference);
|
||||
anm2_frame_add(self->anm2, addFrame, &frameReference);
|
||||
}
|
||||
@@ -2445,7 +2445,7 @@ static void _imgui_frame_properties(Imgui* self)
|
||||
|
||||
bool isLayerFrame = frame && type == ANM2_LAYER;
|
||||
|
||||
if (type != ANM2_TRIGGERS || !frame)
|
||||
if (!frame || type != ANM2_TRIGGERS)
|
||||
{
|
||||
_imgui_drag_float2(IMGUI_FRAME_PROPERTIES_CROP.copy({!isLayerFrame}), self, !isLayerFrame ? dummy_value<vec2>() : frame->crop);
|
||||
_imgui_drag_float2(IMGUI_FRAME_PROPERTIES_SIZE.copy({!isLayerFrame}), self, !isLayerFrame ? dummy_value<vec2>() : frame->size);
|
||||
|
@@ -488,7 +488,7 @@ struct ImguiItem
|
||||
std::string dragDrop{};
|
||||
std::string focusWindow{};
|
||||
std::vector<std::string> items{};
|
||||
AtlasType atlas;
|
||||
AtlasType atlas = ATLAS_NONE;
|
||||
ImGuiKeyChord chord = IMGUI_CHORD_NONE;
|
||||
ImGuiKey mnemonicKey = ImGuiKey_None;
|
||||
s32 mnemonicIndex = INDEX_NONE;
|
||||
@@ -513,7 +513,7 @@ struct ImguiItem
|
||||
s32 min{};
|
||||
s32 max{};
|
||||
s32 value{};
|
||||
vec2 atlasOffset;
|
||||
vec2 atlasOffset{};
|
||||
s32 border{};
|
||||
s32 flags{};
|
||||
s32 windowFlags{};
|
||||
@@ -553,7 +553,7 @@ struct ImguiItem
|
||||
i++;
|
||||
}
|
||||
}
|
||||
else
|
||||
else
|
||||
labelNew += label[i];
|
||||
}
|
||||
|
||||
|
@@ -1,5 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
#include <SDL3/SDL_main.h>
|
||||
|
||||
#define ARGUMENT_RESCALE "--rescale"
|
||||
#define ARGUMENT_RESCALE_ARGUMENT_ERROR "--rescale: specify both anm2 and scale arguments"
|
||||
#define ARGUMENT_RESCALE_ANM2_ERROR "Unable to rescale anm2 {} by value {}. Make sure the file is valid."
|
||||
|
@@ -136,7 +136,11 @@ void preview_draw(Preview* self)
|
||||
mat4 model = canvas_model_get(frame.size, frame.position, frame.pivot, PERCENT_TO_UNIT(frame.scale), frame.rotation);
|
||||
mat4 layerTransform = transform * (rootModel * model);
|
||||
|
||||
Texture& texture = self->anm2->spritesheets[self->anm2->layers[id].spritesheetID].texture;
|
||||
Anm2Spritesheet* spritesheet = map_find(self->anm2->spritesheets, self->anm2->layers[id].spritesheetID);
|
||||
|
||||
if (!spritesheet) continue;
|
||||
|
||||
Texture& texture = spritesheet->texture;
|
||||
|
||||
if (!texture.isInvalid)
|
||||
{
|
||||
|
@@ -235,8 +235,8 @@ previewPanX=0.000
|
||||
previewPanY=0.000
|
||||
previewGridSizeX=32
|
||||
previewGridSizeY=32
|
||||
previewGridOffsetX=0
|
||||
previewGridOffsetY=0
|
||||
previewGridOffsetX=16
|
||||
previewGridOffsetY=16
|
||||
previewGridColorR=1.000
|
||||
previewGridColorG=1.000
|
||||
previewGridColorB=1.000
|
||||
@@ -267,8 +267,8 @@ editorPanX=0.000
|
||||
editorPanY=0.000
|
||||
editorGridSizeX=32
|
||||
editorGridSizeY=32
|
||||
editorGridOffsetX=0
|
||||
editorGridOffsetY=0
|
||||
editorGridOffsetX=16
|
||||
editorGridOffsetY=16
|
||||
editorGridColorR=1.000
|
||||
editorGridColorG=1.000
|
||||
editorGridColorB=1.000
|
||||
|
Reference in New Issue
Block a user