// Example script showing how to use the new script-driven rendering system // Global variables to track our resources uint g_toonShader = 0; uint g_outlineShader = 0; uint g_cubeModel = 0; uint g_sphereModel = 0; uint g_redMaterial = 0; uint g_blueMaterial = 0; // Entities uint g_camera = 0; uint g_light = 0; uint g_cube = 0; uint g_sphere = 0; void Init() { Toast::Info("Initializing script-driven rendering..."); // === Load Shaders === g_toonShader = Shader::Load("shaders/toon.vs", "shaders/toon.fs"); g_outlineShader = Shader::Load("shaders/outline.vs", "shaders/outline.fs"); if (g_toonShader == 0 || g_outlineShader == 0) { Toast::Error("Failed to load shaders!"); return; } // === Load Models === g_cubeModel = Model::LoadCube(1.0, 1.0, 1.0); g_sphereModel = Model::LoadSphere(0.5, 16, 16); // === Create Materials === // Red material with toon shader g_redMaterial = Material::Create(g_toonShader, 255, 100, 100, 255); // Blue material with toon shader g_blueMaterial = Material::Create(g_toonShader, 100, 100, 255, 255); // === Set up Camera === g_camera = ECS::CreateEntity(); ECS::AddCamera3D(g_camera, 5.0, 5.0, 5.0, // position 0.0, 0.0, 0.0, // target 45.0); // fovy ECS::AddTag(g_camera, "MainCamera"); // === Set up Light === g_light = ECS::CreateEntity(); ECS::AddLight(g_light, 0.5, 0.7, 0.3, 1.0); // direction + intensity ECS::AddTag(g_light, "MainLight"); // === Create Cube with Outline === g_cube = ECS::CreateEntity(); ECS::AddTransform(g_cube, -1.5, 0.5, 0.0); ECS::AddSprite(g_cube, g_cubeModel, 0xFFFFFFFF, 0.0); ECS::AddMaterial(g_cube, g_redMaterial); ECS::AddTag(g_cube, "Cube"); ECS::AddVelocity(g_cube, 0.0, 0.0, 0.0, 1.0); // rotating // Add outline render pass (order 0 = first) ECS::AddRenderPass(g_cube, 0, false, true, g_outlineShader); // order=0, no depth test // === Create Sphere === g_sphere = ECS::CreateEntity(); ECS::AddTransform(g_sphere, 1.5, 0.5, 0.0); ECS::AddSprite(g_sphere, g_sphereModel, 0xFFFFFFFF, 0.0); ECS::AddMaterial(g_sphere, g_blueMaterial); ECS::AddTag(g_sphere, "Sphere"); ECS::AddVelocity(g_sphere, 0.5, 0.0, 0.2, 0.5); // moving and rotating // Add main render pass (order 1 = second, after outlines) ECS::AddRenderPass(g_sphere, 1, true, true, 0); // order=1, with depth test Toast::Success("Script-driven rendering initialized!"); } bool lightToggle = false; void Update(float dt) { // Camera orbital movement if (ECS::HasCamera3D(g_camera)) { float angle = GetTime() * 0.3; float radius = 7.0; float x = Math::Cos(angle) * radius; float z = Math::Sin(angle) * radius; ECS::SetCameraPosition(g_camera, x, 5.0, z); } // Example: Toggle light direction with space if (IsKeyPressed(KEY_SPACE)) { lightToggle = !lightToggle; if (lightToggle) { ECS::SetLightDirection(g_light, -0.5, 0.7, -0.3); Toast::Info("Light direction changed!"); } else { ECS::SetLightDirection(g_light, 0.5, 0.7, 0.3); Toast::Info("Light direction reset!"); } } }