#pragma once #include #include #include #include #include #include #include "render/Renderer.h" #include "InteractiveObjectState.h" namespace FRG { class Renderer; struct LoadedGameObject { std::string name; // identity key — stays at top level LoadedGameObjectState creationInfo; // paths + transforms for save/recreate std::shared_ptr texture; std::shared_ptr textureDarklands; VertexRenderStruct mesh; }; struct InteractiveObject { LoadedGameObject loadedObject; // rendering assets InteractiveObjectState state; // all mutable + creation state // Factory: creates a fully-loaded InteractiveObject from a state descriptor. // Loads textures and mesh from state.objectInfo, computes mesh centering, // and sets state.position = jsonPosition + meshCenter. static InteractiveObject createFromState(InteractiveObjectState st, Renderer& renderer, const std::string& zipPath = ""); // callbackName, if given, is the global Lua function name backing onComplete — // stored in the AnimTask so it survives save/load (see ScriptEngine::rehydrateNamedCallback). void moveTo(const Eigen::Vector3f& target, float durationSec, std::function onComplete = {}, std::string callbackName = ""); void rotateTo(float targetRotY, float durationSec, std::function onComplete = {}, std::string callbackName = ""); void scaleTo(float targetScale, float durationSec, std::function onComplete = {}, std::string callbackName = ""); void fadeTo(float targetAlpha, float durationSec, std::function onComplete = {}, std::string callbackName = ""); void update(int64_t deltaMs); void draw(Renderer& renderer) const; void drawDarklands(Renderer& renderer) const; }; } // namespace FRG