fix tools

This commit is contained in:
2026-05-22 11:50:03 -04:00
parent 8c421595c4
commit 93707b234c
3 changed files with 63 additions and 34 deletions
+1 -1
View File
@@ -1 +1 @@
/home/anon/sda/Personal/Repos/anm2ed/out/build/linux-debug/compile_commands.json /home/anon/sda/Personal/Repos/anm2ed/out/build/linux-release/compile_commands.json
+7 -3
View File
@@ -1051,13 +1051,17 @@ namespace anm2ed::imgui
auto selected_frame_references_get = [&]() auto selected_frame_references_get = [&]()
{ {
std::set<Reference> result = document.frames.references; std::set<Reference> result = document.frames.references;
if (result.empty())
for (auto frameIndex : frames) for (auto frameIndex : frames)
result.insert({reference.animationIndex, reference.itemType, reference.itemID, frameIndex}); result.insert({reference.animationIndex, reference.itemType, reference.itemID, frameIndex});
if (result.empty() && reference.itemType != NONE && reference.frameIndex != -1) result.insert(reference);
std::erase_if(result, std::erase_if(result,
[](const Reference& frameReference) [](const Reference& frameReference)
{ return frameReference.itemType == NONE || frameReference.itemType == TRIGGER; }); {
return frameReference.itemType == NONE || frameReference.itemType == TRIGGER ||
frameReference.frameIndex < 0;
});
if (result.empty() && reference.itemType != NONE && reference.itemType != TRIGGER &&
reference.frameIndex != -1)
result.insert(reference);
return result; return result;
}; };
auto selectedFrameReferences = selected_frame_references_get(); auto selectedFrameReferences = selected_frame_references_get();
+53 -28
View File
@@ -56,7 +56,6 @@ namespace anm2ed::imgui
auto& shaderTexture = resources.shaders[shader::TEXTURE]; auto& shaderTexture = resources.shaders[shader::TEXTURE];
auto& shaderLine = resources.shaders[shader::LINE]; auto& shaderLine = resources.shaders[shader::LINE];
auto& dashedShader = resources.shaders[shader::DASHED]; auto& dashedShader = resources.shaders[shader::DASHED];
auto& frames = document.frames.selection;
auto& regionReference = document.region.reference; auto& regionReference = document.region.reference;
auto& regionSelection = document.region.selection; auto& regionSelection = document.region.selection;
@@ -358,6 +357,18 @@ namespace anm2ed::imgui
auto layer = anm2.element_get(ElementType::LAYER_ELEMENT, reference.itemID); auto layer = anm2.element_get(ElementType::LAYER_ELEMENT, reference.itemID);
bool isReferenceLayerOnSpritesheet = bool isReferenceLayerOnSpritesheet =
frame && reference.itemID > -1 && layer && layer->spritesheetId == referenceSpritesheet; frame && reference.itemID > -1 && layer && layer->spritesheetId == referenceSpritesheet;
auto selectedFrameReferences = document.frames.references;
for (auto frameIndex : document.frames.selection)
selectedFrameReferences.insert({reference.animationIndex, reference.itemType, reference.itemID, frameIndex});
std::erase_if(selectedFrameReferences, [&](const Reference& frameReference)
{
if (frameReference.frameIndex < 0) return true;
if (frameReference.itemType != LAYER) return true;
auto frameLayer = document.anm2.element_get(ElementType::LAYER_ELEMENT, frameReference.itemID);
return !frameLayer || frameLayer->spritesheetId != referenceSpritesheet;
});
if (selectedFrameReferences.empty() && reference.frameIndex != -1 && isReferenceLayerOnSpritesheet)
selectedFrameReferences.insert(reference);
auto useTool = tool; auto useTool = tool;
auto step = (float)(isMod ? STEP_FAST : STEP); auto step = (float)(isMod ? STEP_FAST : STEP);
auto stepX = isGridSnap ? step * gridSize.x : step; auto stepX = isGridSnap ? step * gridSize.x : step;
@@ -384,6 +395,8 @@ namespace anm2ed::imgui
maxPoint.y = std::ceil((maxPoint.y - offsetY) / sizeY) * sizeY + offsetY; maxPoint.y = std::ceil((maxPoint.y - offsetY) / sizeY) * sizeY + offsetY;
} }
} }
minPoint = vec2(ivec2(minPoint));
maxPoint = vec2(ivec2(maxPoint));
return std::pair{minPoint, maxPoint}; return std::pair{minPoint, maxPoint};
}; };
@@ -401,37 +414,54 @@ namespace anm2ed::imgui
}; };
auto frame_change_apply = [&](FrameChange frameChange, ChangeType changeType = ChangeType::ADJUST) auto frame_change_apply = [&](FrameChange frameChange, ChangeType changeType = ChangeType::ADJUST)
{ {
auto queuedReference = reference; auto queuedFrameReferences = selectedFrameReferences;
auto queuedReferenceItemType = referenceItemType;
std::set<int> queuedFrames(frames.begin(), frames.end());
manager.command_push({manager.selected, manager.command_push({manager.selected,
[=](Manager&, Document& document) [=](Manager&, Document& document)
{ {
auto item = document.anm2.element_get(queuedReference.animationIndex, std::map<Reference, std::set<int>> groupedFrames{};
queuedReferenceItemType, for (auto frameReference : queuedFrameReferences)
queuedReference.itemID); groupedFrames[{frameReference.animationIndex, frameReference.itemType,
if (!item) return; frameReference.itemID, -1}]
frames_change(*item, frameChange, queuedReferenceItemType, changeType, queuedFrames); .insert(frameReference.frameIndex);
for (auto& [itemReference, itemFrames] : groupedFrames)
{
auto itemType = static_cast<ItemType>(itemReference.itemType);
auto item = document.anm2.element_get(itemReference.animationIndex, itemType,
itemReference.itemID);
if (!item) continue;
frames_change(*item, frameChange, itemType, changeType, itemFrames);
}
}}); }});
}; };
auto frame_change_from_current_apply = [&](auto frameChangeGet, ChangeType changeType = ChangeType::ADJUST) auto frame_change_from_current_apply = [&](auto frameChangeGet, ChangeType changeType = ChangeType::ADJUST)
{ {
auto queuedReference = reference; auto queuedReference = reference;
auto queuedReferenceItemType = referenceItemType; auto queuedReferenceItemType = referenceItemType;
std::set<int> queuedFrames(frames.begin(), frames.end()); auto queuedFrameReferences = selectedFrameReferences;
manager.command_push({manager.selected, manager.command_push({manager.selected,
[=](Manager&, Document& document) [=](Manager&, Document& document)
{ {
auto item = document.anm2.element_get(queuedReference.animationIndex,
queuedReferenceItemType,
queuedReference.itemID);
auto frame = document.anm2.element_get(queuedReference.animationIndex, auto frame = document.anm2.element_get(queuedReference.animationIndex,
queuedReferenceItemType, queuedReferenceItemType,
queuedReference.frameIndex, queuedReference.frameIndex,
queuedReference.itemID); queuedReference.itemID);
if (!item || !frame) return; if (!frame) return;
frames_change(*item, frameChangeGet(*frame), queuedReferenceItemType, changeType,
queuedFrames); std::map<Reference, std::set<int>> groupedFrames{};
for (auto frameReference : queuedFrameReferences)
groupedFrames[{frameReference.animationIndex, frameReference.itemType,
frameReference.itemID, -1}]
.insert(frameReference.frameIndex);
for (auto& [itemReference, itemFrames] : groupedFrames)
{
auto itemType = static_cast<ItemType>(itemReference.itemType);
auto item = document.anm2.element_get(itemReference.animationIndex, itemType,
itemReference.itemID);
if (!item) continue;
frames_change(*item, frameChangeGet(*frame), itemType, changeType, itemFrames);
}
}}); }});
}; };
auto frame_crop_normalize_apply = [&](bool isSnap, ivec2 snapGridSize, ivec2 snapGridOffset) auto frame_crop_normalize_apply = [&](bool isSnap, ivec2 snapGridSize, ivec2 snapGridOffset)
@@ -625,9 +655,9 @@ namespace anm2ed::imgui
bool isFrameRequired = bool isFrameRequired =
!(useTool == tool::PAN || useTool == tool::DRAW || useTool == tool::ERASE || useTool == tool::COLOR_PICKER); !(useTool == tool::PAN || useTool == tool::DRAW || useTool == tool::ERASE || useTool == tool::COLOR_PICKER);
bool isRegionInUse = frame && frame->regionId != -1 && (useTool == tool::CROP || useTool == tool::MOVE); bool isRegionInUse = frame && frame->regionId != -1 && (useTool == tool::CROP || useTool == tool::MOVE);
bool isFrameAvailable = !isFrameRequired || (frame && !isRegionInUse) || bool isFrameAvailable = !isFrameRequired || (frame && !isRegionInUse && !selectedFrameReferences.empty()) ||
(useTool == tool::CROP && !frame && !regionSelection.empty()) || (useTool == tool::CROP && !regionSelection.empty()) ||
(useTool == tool::MOVE && !frame && regionReference != -1); (useTool == tool::MOVE && regionReference != -1);
bool isSpritesheetRequired = useTool == tool::DRAW || useTool == tool::ERASE || useTool == tool::COLOR_PICKER; bool isSpritesheetRequired = useTool == tool::DRAW || useTool == tool::ERASE || useTool == tool::COLOR_PICKER;
bool isSpritesheetAvailable = !isSpritesheetRequired || (texture && texture->is_valid()); bool isSpritesheetAvailable = !isSpritesheetRequired || (texture && texture->is_valid());
auto cursor = (isAreaAllowed && isFrameAvailable && isSpritesheetAvailable) ? toolInfo.cursor auto cursor = (isAreaAllowed && isFrameAvailable && isSpritesheetAvailable) ? toolInfo.cursor
@@ -662,8 +692,7 @@ namespace anm2ed::imgui
if (isMouseDown || isMouseMiddleDown) pan += mouseDelta; if (isMouseDown || isMouseMiddleDown) pan += mouseDelta;
break; break;
case tool::MOVE: case tool::MOVE:
if (isRegionInUse) break; if ((isRegionInUse || selectedFrameReferences.empty()) && regionReference != -1)
if (!frame && regionReference != -1)
{ {
if (!spritesheet) break; if (!spritesheet) break;
auto region = region_get(regionReference); auto region = region_get(regionReference);
@@ -691,7 +720,7 @@ namespace anm2ed::imgui
break; break;
} }
if (!item || frames.empty()) break; if (!item || !frame || selectedFrameReferences.empty() || isRegionInUse) break;
if (isBegin) snapshot_push(EDIT_FRAME_PIVOT); if (isBegin) snapshot_push(EDIT_FRAME_PIVOT);
if (isMouseDown) if (isMouseDown)
{ {
@@ -724,8 +753,7 @@ namespace anm2ed::imgui
if (isEnd) document_change_push(Document::FRAMES); if (isEnd) document_change_push(Document::FRAMES);
break; break;
case tool::CROP: case tool::CROP:
if (isRegionInUse) break; if ((isRegionInUse || selectedFrameReferences.empty()) && !regionSelection.empty())
if (frames.empty())
{ {
if (!spritesheet || regionSelection.empty()) break; if (!spritesheet || regionSelection.empty()) break;
if (isBegin) snapshot_push(EDIT_REGION_CROP); if (isBegin) snapshot_push(EDIT_REGION_CROP);
@@ -769,7 +797,7 @@ namespace anm2ed::imgui
break; break;
} }
if (!item) break; if (!item || !frame || selectedFrameReferences.empty() || isRegionInUse) break;
if (isBegin) snapshot_push(EDIT_FRAME_CROP); if (isBegin) snapshot_push(EDIT_FRAME_CROP);
if (isMouseClicked) if (isMouseClicked)
@@ -791,9 +819,6 @@ namespace anm2ed::imgui
if (isUpPressed) frame_change_apply({.cropY = stepY}, ChangeType::SUBTRACT); if (isUpPressed) frame_change_apply({.cropY = stepY}, ChangeType::SUBTRACT);
if (isDownPressed) frame_change_apply({.cropY = stepY}, ChangeType::ADD); if (isDownPressed) frame_change_apply({.cropY = stepY}, ChangeType::ADD);
frame_change_apply(
{.cropX = frame->crop.x, .cropY = frame->crop.y, .sizeX = frame->size.x, .sizeY = frame->size.y});
if (isDuring) if (isDuring)
{ {
if (!isMouseDown) if (!isMouseDown)