From 2c62f5701c9468a001c54488793e949e6557780f Mon Sep 17 00:00:00 2001 From: Shweet Date: Thu, 28 Aug 2025 08:37:47 -0700 Subject: [PATCH] Hotfix for adding frames, spritesheets, etc. --- CMakeLists.txt | 52 ++++++++++++++++------------------------ CMakeSettings.json | 11 --------- src/anm2.cpp | 42 ++++++++++++++++---------------- src/editor.cpp | 4 ++-- src/generate_preview.cpp | 30 +++++++++++++---------- src/imgui.cpp | 4 ++-- src/imgui.h | 6 ++--- src/main.h | 2 ++ src/preview.cpp | 6 ++++- src/settings.h | 8 +++---- 10 files changed, 78 insertions(+), 87 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3b8e26a..ee59f4f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,5 @@ cmake_minimum_required(VERSION 3.15) + if(WIN32 AND DEFINED ENV{VCPKG_ROOT} AND NOT DEFINED CMAKE_TOOLCHAIN_FILE) set(CMAKE_TOOLCHAIN_FILE "$ENV{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake" CACHE STRING "Vcpkg toolchain file") @@ -10,44 +11,34 @@ find_package(SDL3 REQUIRED) find_package(GLEW REQUIRED) find_package(OpenGL REQUIRED) -# Gather project sources file(GLOB SOURCES - "include/imgui/imgui.cpp" - "include/imgui/imgui_draw.cpp" - "include/imgui/imgui_tables.cpp" - "include/imgui/imgui_widgets.cpp" - "include/imgui/backends/imgui_impl_sdl3.cpp" - "include/imgui/backends/imgui_impl_opengl3.cpp" - "include/tinyxml2/tinyxml2.cpp" - "${PROJECT_SOURCE_DIR}/src/*.cpp" - "${PROJECT_SOURCE_DIR}/src/*.h" + include/imgui/*.cpp + include/imgui/backends/imgui_impl_sdl3.cpp + include/imgui/backends/imgui_impl_opengl3.cpp + include/tinyxml2/tinyxml2.cpp + src/*.cpp + src/*.h ) -if (WIN32) - enable_language("RC") - set (WIN32_RESOURCES ${CMAKE_CURRENT_SOURCE_DIR}/assets/Icon.rc) -endif() +add_executable(${PROJECT_NAME} ${SOURCES}) -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_include_directories(${PROJECT_NAME} PRIVATE include include/imgui include/tinyxml2 src) -if (NOT MSVC) - set(CMAKE_CXX_FLAGS "-O2 -std=c++23 -Wall -Wextra -pedantic -fmax-errors=1") +if(MSVC) + target_compile_options(${PROJECT_NAME} PRIVATE /std:c++latest /EHsc) + target_link_options(${PROJECT_NAME} PRIVATE /STACK:0xffffff) else() - set(CMAKE_CXX_FLAGS "/std:c++latest /EHsc") - target_link_options(${PROJECT_NAME} PRIVATE "/STACK:0xffffff") -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_compile_options(${PROJECT_NAME} PRIVATE -O2 -std=c++23 -Wall -Wextra -pedantic -fmax-errors=1) + if(CMAKE_BUILD_TYPE STREQUAL "Debug") + target_compile_options(${PROJECT_NAME} PRIVATE -DDEBUG -g) + endif() target_link_libraries(${PROJECT_NAME} PRIVATE m) endif() @@ -55,5 +46,4 @@ target_link_libraries(${PROJECT_NAME} PRIVATE OpenGL::GL GLEW::GLEW SDL3::SDL3) message("System: ${CMAKE_SYSTEM_NAME}") message("Project: ${PROJECT_NAME}") -message("Build: ${CMAKE_BUILD_TYPE}") -message("Flags: ${CMAKE_CXX_FLAGS}") +message("Build: ${CMAKE_BUILD_TYPE}") \ No newline at end of file diff --git a/CMakeSettings.json b/CMakeSettings.json index 137e083..c580f0e 100644 --- a/CMakeSettings.json +++ b/CMakeSettings.json @@ -10,17 +10,6 @@ "cmakeCommandArgs": "", "buildCommandArgs": "", "ctestCommandArgs": "" - }, - { - "name": "x64-Release", - "generator": "Ninja", - "configurationType": "Release", - "inheritEnvironments": [ "msvc_x64_x64" ], - "buildRoot": "${projectDir}\\build\\${name}", - "installRoot": "${projectDir}\\install\\${name}", - "cmakeCommandArgs": "", - "buildCommandArgs": "", - "ctestCommandArgs": "" } ] } \ No newline at end of file diff --git a/src/anm2.cpp b/src/anm2.cpp index 0eef615..b6d792d 100644 --- a/src/anm2.cpp +++ b/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(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(index)]; } } - - return nullptr; } void anm2_frame_erase(Anm2* self, Anm2Reference* reference) diff --git a/src/editor.cpp b/src/editor.cpp index 75f27cd..14dfe89 100644 --- a/src/editor.cpp +++ b/src/editor.cpp @@ -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); diff --git a/src/generate_preview.cpp b/src/generate_preview.cpp index 2e0d46f..8b91eff 100644 --- a/src/generate_preview.cpp +++ b/src/generate_preview.cpp @@ -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(); } diff --git a/src/imgui.cpp b/src/imgui.cpp index b93f5b6..ddc3f7e 100644 --- a/src/imgui.cpp +++ b/src/imgui.cpp @@ -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(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() : frame->crop); _imgui_drag_float2(IMGUI_FRAME_PROPERTIES_SIZE.copy({!isLayerFrame}), self, !isLayerFrame ? dummy_value() : frame->size); diff --git a/src/imgui.h b/src/imgui.h index 36af4f8..9d96081 100644 --- a/src/imgui.h +++ b/src/imgui.h @@ -488,7 +488,7 @@ struct ImguiItem std::string dragDrop{}; std::string focusWindow{}; std::vector 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]; } diff --git a/src/main.h b/src/main.h index 0f10f02..88b5315 100644 --- a/src/main.h +++ b/src/main.h @@ -1,5 +1,7 @@ #pragma once +#include + #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." diff --git a/src/preview.cpp b/src/preview.cpp index 873b11c..8534bfd 100644 --- a/src/preview.cpp +++ b/src/preview.cpp @@ -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) { diff --git a/src/settings.h b/src/settings.h index 5ecc9dd..7412a2c 100644 --- a/src/settings.h +++ b/src/settings.h @@ -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