Script Templates

Ready-to-use script templates for common use cases.

Minimal Runtime Script

Wrapper-based, simplest possible script:

Scripts/Minimal.cpp CPP
1 400">class="text-violet-400">#include "ScriptRuntime.h"
2
3 400">void TickUpdate(400">ScriptContext& ctx, 400">float /*dt*/) {
4 400">if (!ctx.object) 400">return;
5 // Your logic here
6 }

Script with Inspector

Adds custom ImGui UI in the Inspector panel:

Scripts/WithInspector.cpp CPP
1 400">class="text-violet-400">#include "ScriptRuntime.h"
2 400">class="text-violet-400">#include "ThirdParty/imgui/imgui.h"
3
4 400">void TickUpdate(400">ScriptContext& ctx, 400">float /*dt*/) {
5 400">if (!ctx.object) 400">return;
6 }
7
8 400">extern "C" 400">void Script_OnInspector(400">ScriptContext& ctx) {
9 400">ImGui::TextDisabled("Hello from inspector!");
10 (400">void)ctx;
11 }

Rotating Object

Continuously rotates an object with adjustable speed:

Scripts/Rotator.cpp CPP
1 400">class="text-violet-400">#include "ScriptRuntime.h"
2 400">class="text-violet-400">#include "ThirdParty/imgui/imgui.h"
3
4 400">static 400">bool autoRotate = 400">true;
5 400">static 400">glm::400">vec3 rotationSpeed = {0, 45, 0};
6
7 400">void TickUpdate(400">ScriptContext& ctx, 400">float dt) {
8 400">if (!ctx.object || !autoRotate) 400">return;
9 ctx.SetRotation(ctx.object->rotation + rotationSpeed * dt);
10 }
11
12 400">extern "C" 400">void Script_OnInspector(400">ScriptContext& ctx) {
13 ctx.AutoSetting("autoRotate", autoRotate);
14 ctx.AutoSetting("rotationSpeed", rotationSpeed);
15
16 400">ImGui::Checkbox("Auto Rotate", &autoRotate);
17 400">ImGui::DragFloat3("Speed (deg/s)", &rotationSpeed.x, 1.0f);
18
19 ctx.SaveAutoSettings();
20 }

Button Handler

Responds to UI button clicks:

Scripts/ButtonHandler.cpp CPP
1 400">class="text-violet-400">#include "ScriptRuntime.h"
2
3 400">static 400">int clickCount = 0;
4
5 400">void TickUpdate(400">ScriptContext& ctx, 400">float) {
6 400">if (ctx.IsUIButtonPressed()) {
7 clickCount++;
8 ctx.AddConsoleMessage("Clicked " + std::to_string(clickCount) + " times",
9 ConsoleMessageType::Info);
10 }
11 }

Health Bar (Slider)

Read-only slider as a health meter:

Scripts/HealthBar.cpp CPP
1 400">class="text-violet-400">#include "ScriptRuntime.h"
2 400">class="text-violet-400">#include "ThirdParty/imgui/imgui.h"
3
4 400">static 400">float maxHealth = 100.0f;
5 400">static 400">float currentHealth = 100.0f;
6
7 400">void TickUpdate(400">ScriptContext& ctx, 400">float) {
8 ctx.SetUIInteractable(400">false);
9 ctx.SetUISliderStyle(UISliderStyle::Fill);
10 ctx.SetUISliderRange(0.0f, maxHealth);
11 ctx.SetUISliderValue(currentHealth);
12
13 // Color based on health percentage
14 400">float pct = currentHealth / maxHealth;
15 400">if (pct > 0.5f) {
16 ctx.SetUIColor(400">glm::400">vec4(0.2f, 0.8f, 0.2f, 1.0f)); // Green
17 } 400">else 400">if (pct > 0.25f) {
18 ctx.SetUIColor(400">glm::400">vec4(0.9f, 0.7f, 0.1f, 1.0f)); // Yellow
19 } 400">else {
20 ctx.SetUIColor(400">glm::400">vec4(0.9f, 0.2f, 0.2f, 1.0f)); // Red
21 }
22 }
23
24 400">extern "C" 400">void Script_OnInspector(400">ScriptContext& ctx) {
25 400">ImGui::SliderFloat("Current Health", &currentHealth, 0, maxHealth);
26 400">ImGui::SliderFloat("Max Health", &maxHealth, 1, 200);
27 ctx.MarkDirty();
28 }

FPS Display

Attach to a UI Text object to show framerate:

Scripts/FPSDisplay.cpp CPP
1 400">class="text-violet-400">#include "ScriptRuntime.h"
2 400">class="text-violet-400">#include "ThirdParty/imgui/imgui.h"
3 400">class="text-violet-400">#include <cstdio>
4
5 400">static 400">bool clampFPS = 400">false;
6 400">static 400">float fps = 0.0f;
7
8 400">void TickUpdate(400">ScriptContext& ctx, 400">float dt) {
9 400">if (!ctx.object || ctx.object->type != ObjectType::UIText) 400">return;
10
11 fps = (dt > 0.0f) ? (1.0f / dt) : 0.0f;
12 400">if (clampFPS && fps > 120.0f) fps = 120.0f;
13
14 400">char buf[32];
15 snprintf(buf, 400">sizeof(buf), "FPS: %.1f", fps);
16 ctx.object->ui.label = buf;
17 }
18
19 400">extern "C" 400">void Script_OnInspector(400">ScriptContext& ctx) {
20 ctx.AutoSetting("clampFPS", clampFPS);
21 400">ImGui::Checkbox("Clamp to 120 FPS", &clampFPS);
22 400">ImGui::Text("Current: %.1f FPS", fps);
23 ctx.SaveAutoSettings();
24 }

Custom Editor Window

Creates a custom tab in the editor:

Scripts/CustomTool.cpp CPP
1 400">class="text-violet-400">#include "ScriptRuntime.h"
2 400">class="text-violet-400">#include "ThirdParty/imgui/imgui.h"
3
4 400">static 400">int counter = 0;
5
6 400">extern "C" 400">void RenderEditorWindow(400">ScriptContext& ctx) {
7 400">ImGui::Text("Custom Tool Window");
8 400">ImGui::Separator();
9
10 400">if (400">ImGui::Button("Increment")) {
11 counter++;
12 }
13 400">ImGui::SameLine();
14 400">if (400">ImGui::Button("Reset")) {
15 counter = 0;
16 }
17
18 400">ImGui::Text("Counter: %d", counter);
19
20 400">if (400">ImGui::Button("Log to Console")) {
21 ctx.AddConsoleMessage("Counter is " + std::to_string(counter),
22 ConsoleMessageType::Info);
23 }
24 }
25
26 400">extern "C" 400">void ExitRenderEditorWindow(400">ScriptContext& ctx) {
27 ctx.AddConsoleMessage("Custom window closed", ConsoleMessageType::Info);
28 }