Files
EVEngine/examples/tree-generator/main.nut
T
西风逍遥游 293be41d66 Merge remote-tracking branch 'origin/dev' into codex/architecture-consolidation
# Conflicts:
#	cmake/module_manifest.cmake
#	docs/usr/modules/procgen.md
#	src/engine/CMakeLists.txt
#	src/engine/cmdline/Run.cpp
#	src/engine/common/ScriptModule.h
#	src/modules/animation/Animation.cpp
#	src/modules/physics/World.cpp
#	src/modules/physics/World3D.cpp
#	src/modules/procgen/Procgen.cpp
#	src/modules/procgen/Procgen.h
#	src/modules/scene/SceneCapabilities.cpp
#	src/modules/schema/Schema.cpp
#	src/modules/schema/Schema.h
2026-08-27 14:52:28 +08:00

83 lines
2.8 KiB
Plaintext

// Arbor Lab — interactive procedural tree recipe showcase.
// R regenerate, 1/2 Low Poly/Realistic, A algorithm, L leaves, [/] density, C canopy.
persist treeSeed = 31415
persist treeStyle = "lowpoly"
persist treeAlgorithm = "weberPenn"
persist leafMode = "cards"
persist leafDensity = 0.65
persist treeMesh = null
persist treeObject = null
persist treeCamera = null
persist treeYaw = 0.0
function pressed(k) {
return key_just_pressed(k);
}
function rebuildTree() {
local paramsResult = procgen.newParams();
if (!paramsResult.ok) return;
local p = paramsResult.value;
p.setSeed(treeSeed);
p.setString("style", treeStyle);
p.setString("branchAlgorithm", treeAlgorithm);
p.setString("leafMode", leafMode);
p.setFloat("leafDensity", leafDensity);
p.setFloat("height", 6.2);
p.setFloat("crownRadius", 2.15);
p.setInt("branchLevels", treeStyle == "realistic" ? 3 : 2);
p.setInt("branchCount", treeStyle == "realistic" ? 10 : 6);
local meshResult = procgen.generateMesh("mesh.tree", p, gfx);
if (!meshResult.ok) return;
treeMesh = meshResult.value;
if (treeObject == null) {
treeObject = eve.Renderable3D();
treeObject.setPosition(1.35, -3.0, 0.0);
treeObject.setTint(0.34, 0.48, 0.22, 1.0);
treeObject.setRoughness(0.86);
treeObject.setCastShadow(true);
}
treeObject.setMesh(treeMesh);
}
if (treeCamera == null) {
treeCamera = eve.Camera3D();
treeCamera.setEye(10.0, 4.6, 12.0);
treeCamera.setTarget(1.1, 0.2, 0.0);
treeCamera.setUp(0.0, 1.0, 0.0);
treeCamera.setFov(38.0);
treeCamera.setAmbient(0.32, 0.38, 0.30);
treeCamera.setActive(true);
gfx.setDirectionalLight(-0.45, -1.0, -0.35, 1.35, 1.24, 1.02);
}
if (treeMesh == null) rebuildTree();
gfx.setBackgroundColor(0.055, 0.075, 0.07, 1.0);
function eve_update(dt) {
treeYaw += dt * 7.0;
treeObject.setYaw(treeYaw);
if (pressed("r") || pressed("R")) { treeSeed += 1; rebuildTree(); }
if (pressed("1")) { treeStyle = "lowpoly"; rebuildTree(); }
if (pressed("2")) { treeStyle = "realistic"; rebuildTree(); }
if (pressed("a") || pressed("A")) {
treeAlgorithm = treeAlgorithm == "weberPenn" ? "spaceColonization" : "weberPenn";
rebuildTree();
}
if (pressed("l") || pressed("L")) {
leafMode = leafMode == "none" ? "cards" : "none";
rebuildTree();
}
if (pressed("c") || pressed("C")) {
leafMode = leafMode == "canopy" ? "cards" : "canopy";
rebuildTree();
}
if (pressed("leftbracket")) { leafDensity = max(0.0, leafDensity - 0.1); rebuildTree(); }
if (pressed("rightbracket")) { leafDensity = min(1.0, leafDensity + 0.1); rebuildTree(); }
}
function eve_render() {
gfx.clear();
gfx.render3D();
gfx.drawSolidRect(28.0, 28.0, 310.0, 212.0, 0.92, 0.94, 0.86, 0.96);
}