Files
simian/scripts/example_rendering.as
T
nick a37910de25
CI / build-and-test (push) Successful in 2m0s
chore: remove g_ prfix noise
2026-03-08 11:09:09 +13:00

102 lines
3.2 KiB
ActionScript 3

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