Files
EVEngine/examples/primitive-drawing/main.nut
T

88 lines
3.3 KiB
Plaintext

// Persistent 3D primitive example.
// Shows depth-tested lines, screen-space dashes, a wire sphere and an AABB.
persist primitiveCamera = null
persist primitiveObjects = []
persist animatedRoute = null
persist primitiveTime = 0.0
function requirePrimitive(result, label) {
if (!result.ok) {
throw label + ": " + result.status.summary;
}
primitiveObjects.push(result.value);
return result.value;
}
function requireUpdate(result, label) {
if (!result.ok) {
throw label + ": " + result.status.summary;
}
}
function buildPrimitiveScene() {
// X/Y/Z axes. Ignore depth so the origin remains readable through other shapes.
local xAxis = requirePrimitive(
gfx.newPrimitiveLine3D(0.0, 0.0, 0.0, 4.0, 0.0, 0.0, 1.0, 0.2, 0.2, 1.0, 4.0), "x axis");
local yAxis = requirePrimitive(
gfx.newPrimitiveLine3D(0.0, 0.0, 0.0, 0.0, 4.0, 0.0, 0.2, 1.0, 0.3, 1.0, 4.0), "y axis");
local zAxis = requirePrimitive(
gfx.newPrimitiveLine3D(0.0, 0.0, 0.0, 0.0, 0.0, -4.0, 0.25, 0.55, 1.0, 1.0, 4.0), "z axis");
requireUpdate(xAxis.setDepthMode("ignore"), "x axis depth");
requireUpdate(yAxis.setDepthMode("ignore"), "y axis depth");
requireUpdate(zAxis.setDepthMode("ignore"), "z axis depth");
// A screen-space dashed route. Its dash phase is animated in eve_update().
animatedRoute = requirePrimitive(
gfx.newPrimitiveLine3D(-4.0, 0.35, -1.0, 4.0, 2.4, -5.0, 1.0, 0.72, 0.12, 1.0, 5.0),
"dashed route");
requireUpdate(animatedRoute.setDepthMode("test"), "route depth");
requireUpdate(animatedRoute.setDash(18.0, 10.0, 0.0, "screen"), "route dash");
local sphere = requirePrimitive(
gfx.newPrimitiveSphere3D(-2.2, 1.4, -4.5, 1.35, 0.25, 0.85, 1.0, 0.95, 3.0),
"wire sphere");
requireUpdate(sphere.setDepthMode("test"), "sphere depth");
local bounds = requirePrimitive(
gfx.newPrimitiveAabb3D(0.7, 0.1, -6.0, 3.3, 2.7, -3.4,
1.0, 0.45, 0.12, 0.9, 3.0),
"wire aabb");
requireUpdate(bounds.setDepthMode("test"), "aabb depth");
requireUpdate(bounds.setDash(0.35, 0.18, 0.0, "world"), "aabb dash");
local cone = requirePrimitive(
gfx.newPrimitiveCone3D(-4.0, 2.0, -6.0, 0.0, -1.0, 0.0, 2.0, 0.8,
0.8, 0.3, 1.0, 0.8, 2.0), "cone");
requireUpdate(cone.setPaintMode("fill-stroke"), "cone fill");
local arrow = requirePrimitive(
gfx.newPrimitiveArrow3D(2.0, 3.0, -4.0, 4.0, 3.0, -6.0, 0.5, 0.2,
0.2, 1.0, 0.65, 1.0, 3.0), "arrow");
requireUpdate(arrow.setLineCap("round"), "arrow cap");
}
eve_init = function() {
gfx.setBackgroundColor(0.025, 0.035, 0.06, 1.0);
gfx.setDirectionalLight(-0.4, 0.9, 0.3, 1.0, 0.95, 0.85);
primitiveCamera = eve.Camera3D();
primitiveCamera.setEye(8.5, 6.0, 11.5);
primitiveCamera.setTarget(0.0, 1.2, -3.0);
primitiveCamera.setFov(52.0);
primitiveCamera.setAmbient(0.24, 0.27, 0.34);
if (primitiveObjects.len() == 0) buildPrimitiveScene();
};
eve_update = function(dt) {
primitiveTime += dt;
if (animatedRoute != null && !animatedRoute.isStale()) {
requireUpdate(animatedRoute.setDash(18.0, 10.0, primitiveTime * 28.0, "screen"),
"animate route dash");
}
};
eve_render = function() {
gfx.clear();
gfx.render3D();
};