Files
simian/include/Application.h
T
nick cd754fda28
CI / build-and-test (push) Successful in 2m9s
feat: class instances for entity scripts
2026-03-09 12:55:55 +13:00

82 lines
2.7 KiB
C++

#pragma once
#include "scripting/ScriptEngine.h"
#include "HotReload.h"
#include "gui/GuiManager.h"
#include "raylib.h"
#include "ShaderManager.h"
#include "ModelManager.h"
#include "MaterialManager.h"
#include "InputManager.h"
#include <entt.hpp>
#include <string>
#include <unordered_map>
class Application {
public:
Application();
~Application();
bool Initialize(int argc, char* argv[]);
void Run();
void Shutdown();
void RequestShutdown() { queueShutdown = true; }
bool IsEditorEnabled() const { return enableEditor; }
bool HasScriptCompilationError() const { return scriptCompilationError; }
entt::registry& GetRegistry() { return registry; }
private:
struct EntityScriptModule {
std::string path;
std::string moduleName;
asIScriptModule* module = nullptr;
// For object-instance based entity scripts we cache the object type
// (stored opaquely here to avoid requiring the AngelScript headers
// in all translation units) and the object-methods (Init/Update/Shutdown)
// to avoid repeated lookups.
asITypeInfo* objectType = nullptr;
std::string objectTypeName;
asIScriptFunction* initFunc = nullptr; // object method: Init(uint)
asIScriptFunction* updateFunc = nullptr; // object method: Update(uint,float)
asIScriptFunction* shutdownFunc = nullptr;// object method: Shutdown(uint)
bool valid = false;
};
ScriptEngine scriptEngine;
HotReload* hotReload;
bool scriptCompilationError;
FILE* logFile;
GuiManager guiManager;
bool enableEditor;
bool queueShutdown = false;
RenderTexture2D renderTexture; // renderTexture for Raylib rendering
// ECS
entt::registry registry;
// Resource managers
ShaderManager shaderManager;
ModelManager modelManager;
MaterialManager materialManager;
InputManager inputManager;
std::unordered_map<std::string, EntityScriptModule> entityScriptModules;
std::unordered_map<entt::entity, std::string> entityScriptBindings;
unsigned int entityScriptModuleCounter = 0;
std::string currentSceneScriptPath;
static const int WINDOW_WIDTH = 1280;
static const int WINDOW_HEIGHT = 720;
static const int TARGET_FPS = 60;
static const char* WINDOW_TITLE;
static const char* SCRIPT_FILE;
void Update(float deltaTime);
void UpdateSystems(float deltaTime);
void UpdateEntityScripts(float deltaTime);
void ShutdownEntityScripts();
void ProcessSceneScriptChanges();
void ReloadEntityScriptModules();
EntityScriptModule* GetEntityScriptModule(const std::string& path);
void RenderScene();
void Draw();
};