102 lines
3.3 KiB
ActionScript 3
102 lines
3.3 KiB
ActionScript 3
// 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!");
|
|
}
|
|
}
|
|
}
|