#pragma once #include #include #include #include "SparkEmitter.h" namespace FRG { class Renderer; class Texture; struct TeleportZone { std::string id; Eigen::Vector3f position = Eigen::Vector3f::Zero(); float radius = 0.0f; bool active = false; std::string destinationLocation; Eigen::Vector3f destinationPosition = Eigen::Vector3f::Zero(); float destinationRotationY = 0.0f; std::unique_ptr sparks; std::shared_ptr activeTexture; std::shared_ptr inactiveTexture; bool automatic = false; float automaticRadius = 0.0f; // Runtime tracking — prevents re-firing immediately on arrival at destination. bool automaticPlayerInside = false; bool automaticInitialized = false; void initSparks(std::shared_ptr activeTex, std::shared_ptr inactiveTex); void setActive(bool isActive); void update(float deltaMs); void prepareForDraw(const Eigen::Matrix4f& viewMatrix); void draw(Renderer& renderer, float zoom, int width, int height); }; } // namespace FRG