Hotfix for adding frames, spritesheets, etc.

This commit is contained in:
2025-08-28 08:37:47 -07:00
parent 8f3c666922
commit 2c62f5701c
10 changed files with 78 additions and 87 deletions

View File

@@ -1,4 +1,5 @@
cmake_minimum_required(VERSION 3.15) cmake_minimum_required(VERSION 3.15)
if(WIN32 AND DEFINED ENV{VCPKG_ROOT} AND NOT DEFINED CMAKE_TOOLCHAIN_FILE) if(WIN32 AND DEFINED ENV{VCPKG_ROOT} AND NOT DEFINED CMAKE_TOOLCHAIN_FILE)
set(CMAKE_TOOLCHAIN_FILE "$ENV{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake" set(CMAKE_TOOLCHAIN_FILE "$ENV{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake"
CACHE STRING "Vcpkg toolchain file") CACHE STRING "Vcpkg toolchain file")
@@ -10,44 +11,34 @@ find_package(SDL3 REQUIRED)
find_package(GLEW REQUIRED) find_package(GLEW REQUIRED)
find_package(OpenGL REQUIRED) find_package(OpenGL REQUIRED)
# Gather project sources
file(GLOB SOURCES file(GLOB SOURCES
"include/imgui/imgui.cpp" include/imgui/*.cpp
"include/imgui/imgui_draw.cpp" include/imgui/backends/imgui_impl_sdl3.cpp
"include/imgui/imgui_tables.cpp" include/imgui/backends/imgui_impl_opengl3.cpp
"include/imgui/imgui_widgets.cpp" include/tinyxml2/tinyxml2.cpp
"include/imgui/backends/imgui_impl_sdl3.cpp" src/*.cpp
"include/imgui/backends/imgui_impl_opengl3.cpp" src/*.h
"include/tinyxml2/tinyxml2.cpp"
"${PROJECT_SOURCE_DIR}/src/*.cpp"
"${PROJECT_SOURCE_DIR}/src/*.h"
) )
if (WIN32) add_executable(${PROJECT_NAME} ${SOURCES})
enable_language("RC")
set (WIN32_RESOURCES ${CMAKE_CURRENT_SOURCE_DIR}/assets/Icon.rc)
endif()
add_executable(${PROJECT_NAME} ${SOURCES} ${WIN32_RESOURCES}) if(WIN32)
enable_language(RC)
target_sources(${PROJECT_NAME} PRIVATE assets/Icon.rc)
set_target_properties(${PROJECT_NAME} PROPERTIES WIN32_EXECUTABLE TRUE)
endif()
target_compile_features(${PROJECT_NAME} PUBLIC cxx_std_23) target_compile_features(${PROJECT_NAME} PUBLIC cxx_std_23)
target_include_directories(${PROJECT_NAME} PRIVATE include include/imgui include/tinyxml2 src) target_include_directories(${PROJECT_NAME} PRIVATE include include/imgui include/tinyxml2 src)
if (NOT MSVC) if(MSVC)
set(CMAKE_CXX_FLAGS "-O2 -std=c++23 -Wall -Wextra -pedantic -fmax-errors=1") target_compile_options(${PROJECT_NAME} PRIVATE /std:c++latest /EHsc)
target_link_options(${PROJECT_NAME} PRIVATE /STACK:0xffffff)
else() else()
set(CMAKE_CXX_FLAGS "/std:c++latest /EHsc") target_compile_options(${PROJECT_NAME} PRIVATE -O2 -std=c++23 -Wall -Wextra -pedantic -fmax-errors=1)
target_link_options(${PROJECT_NAME} PRIVATE "/STACK:0xffffff") if(CMAKE_BUILD_TYPE STREQUAL "Debug")
endif() target_compile_options(${PROJECT_NAME} PRIVATE -DDEBUG -g)
endif()
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DDEBUG -g")
else()
set(CMAKE_BUILD_TYPE "Release")
endif()
if(NOT MSVC)
target_link_libraries(${PROJECT_NAME} PRIVATE m) target_link_libraries(${PROJECT_NAME} PRIVATE m)
endif() endif()
@@ -56,4 +47,3 @@ target_link_libraries(${PROJECT_NAME} PRIVATE OpenGL::GL GLEW::GLEW SDL3::SDL3)
message("System: ${CMAKE_SYSTEM_NAME}") message("System: ${CMAKE_SYSTEM_NAME}")
message("Project: ${PROJECT_NAME}") message("Project: ${PROJECT_NAME}")
message("Build: ${CMAKE_BUILD_TYPE}") message("Build: ${CMAKE_BUILD_TYPE}")
message("Flags: ${CMAKE_CXX_FLAGS}")

View File

@@ -10,17 +10,6 @@
"cmakeCommandArgs": "", "cmakeCommandArgs": "",
"buildCommandArgs": "", "buildCommandArgs": "",
"ctestCommandArgs": "" "ctestCommandArgs": ""
},
{
"name": "x64-Release",
"generator": "Ninja",
"configurationType": "Release",
"inheritEnvironments": [ "msvc_x64_x64" ],
"buildRoot": "${projectDir}\\build\\${name}",
"installRoot": "${projectDir}\\install\\${name}",
"cmakeCommandArgs": "",
"buildCommandArgs": "",
"ctestCommandArgs": ""
} }
] ]
} }

View File

@@ -917,36 +917,38 @@ Anm2Frame* anm2_frame_add(Anm2* self, Anm2Frame* frame, Anm2Reference* reference
if (!animation || !item) if (!animation || !item)
return nullptr; 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 triggerIndex = time;
s32 index = reference->frameIndex + 1;
if (reference->itemType == ANM2_TRIGGERS) for (auto& frameCheck : item->frames)
{ {
s32 index = time; if (frameCheck.atFrame == time)
for (auto& frameCheck : item->frames)
{ {
if (frameCheck.atFrame == time) triggerIndex++;
{ break;
index++;
break;
}
} }
}
frameAdd.atFrame = index; frameAdd.atFrame = triggerIndex;
index = item->frames.size(); return &item->frames.emplace_back(frameAdd);
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 else
{ {
item->frames.insert(item->frames.begin() + index, frameAdd); 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) void anm2_frame_erase(Anm2* self, Anm2Reference* reference)

View File

@@ -26,9 +26,9 @@ void editor_draw(Editor* self)
canvas_viewport_set(&self->canvas); canvas_viewport_set(&self->canvas);
canvas_clear(self->settings->editorBackgroundColor); 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); mat4 spritesheetTransform = transform * canvas_model_get(texture.size);
canvas_texture_draw(&self->canvas, shaderTexture, texture.id, spritesheetTransform); canvas_texture_draw(&self->canvas, shaderTexture, texture.id, spritesheetTransform);

View File

@@ -26,21 +26,25 @@ void generate_preview_draw(GeneratePreview* self)
canvas_clear(self->settings->previewBackgroundColor); canvas_clear(self->settings->previewBackgroundColor);
Anm2Item* item = anm2_item_from_reference(self->anm2, self->reference); 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); if (Anm2Spritesheet* spritesheet = map_find(self->anm2->spritesheets, self->anm2->layers[self->reference->itemID].spritesheetID))
const s32 row = index / columns; {
const s32 column = index % columns; Texture& texture = spritesheet->texture;
vec2 crop = startPosition + vec2(size.x * column, size.y * row);
vec2 uvMin = crop / vec2(texture.size); const s32 index = std::clamp((s32)(self->time * count), 0, count);
vec2 uvMax = (crop + size) / vec2(texture.size); const s32 row = index / columns;
f32 vertices[] = UV_VERTICES(uvMin, uvMax); const s32 column = index % columns;
vec2 crop = startPosition + vec2(size.x * column, size.y * row);
mat4 generateTransform = transform * canvas_model_get(size, {}, pivot); vec2 uvMin = crop / vec2(texture.size);
canvas_texture_draw(&self->canvas, shaderTexture, texture.id, generateTransform, vertices, COLOR_OPAQUE, COLOR_OFFSET_NONE); 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(); canvas_unbind();

View File

@@ -1201,7 +1201,7 @@ static void _imgui_timeline(Imgui* self)
if (_imgui_button(IMGUI_ADD_FRAME.copy({!item}), self)) if (_imgui_button(IMGUI_ADD_FRAME.copy({!item}), self))
{ {
Anm2Reference frameReference = *self->reference; 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); Anm2Frame* addFrame = anm2_frame_from_reference(self->anm2, &frameReference);
anm2_frame_add(self->anm2, addFrame, &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; 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_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); _imgui_drag_float2(IMGUI_FRAME_PROPERTIES_SIZE.copy({!isLayerFrame}), self, !isLayerFrame ? dummy_value<vec2>() : frame->size);

View File

@@ -488,7 +488,7 @@ struct ImguiItem
std::string dragDrop{}; std::string dragDrop{};
std::string focusWindow{}; std::string focusWindow{};
std::vector<std::string> items{}; std::vector<std::string> items{};
AtlasType atlas; AtlasType atlas = ATLAS_NONE;
ImGuiKeyChord chord = IMGUI_CHORD_NONE; ImGuiKeyChord chord = IMGUI_CHORD_NONE;
ImGuiKey mnemonicKey = ImGuiKey_None; ImGuiKey mnemonicKey = ImGuiKey_None;
s32 mnemonicIndex = INDEX_NONE; s32 mnemonicIndex = INDEX_NONE;
@@ -513,7 +513,7 @@ struct ImguiItem
s32 min{}; s32 min{};
s32 max{}; s32 max{};
s32 value{}; s32 value{};
vec2 atlasOffset; vec2 atlasOffset{};
s32 border{}; s32 border{};
s32 flags{}; s32 flags{};
s32 windowFlags{}; s32 windowFlags{};

View File

@@ -1,5 +1,7 @@
#pragma once #pragma once
#include <SDL3/SDL_main.h>
#define ARGUMENT_RESCALE "--rescale" #define ARGUMENT_RESCALE "--rescale"
#define ARGUMENT_RESCALE_ARGUMENT_ERROR "--rescale: specify both anm2 and scale arguments" #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." #define ARGUMENT_RESCALE_ANM2_ERROR "Unable to rescale anm2 {} by value {}. Make sure the file is valid."

View File

@@ -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 model = canvas_model_get(frame.size, frame.position, frame.pivot, PERCENT_TO_UNIT(frame.scale), frame.rotation);
mat4 layerTransform = transform * (rootModel * model); 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) if (!texture.isInvalid)
{ {

View File

@@ -235,8 +235,8 @@ previewPanX=0.000
previewPanY=0.000 previewPanY=0.000
previewGridSizeX=32 previewGridSizeX=32
previewGridSizeY=32 previewGridSizeY=32
previewGridOffsetX=0 previewGridOffsetX=16
previewGridOffsetY=0 previewGridOffsetY=16
previewGridColorR=1.000 previewGridColorR=1.000
previewGridColorG=1.000 previewGridColorG=1.000
previewGridColorB=1.000 previewGridColorB=1.000
@@ -267,8 +267,8 @@ editorPanX=0.000
editorPanY=0.000 editorPanY=0.000
editorGridSizeX=32 editorGridSizeX=32
editorGridSizeY=32 editorGridSizeY=32
editorGridOffsetX=0 editorGridOffsetX=16
editorGridOffsetY=0 editorGridOffsetY=16
editorGridColorR=1.000 editorGridColorR=1.000
editorGridColorG=1.000 editorGridColorG=1.000
editorGridColorB=1.000 editorGridColorB=1.000