courseVisuals.sceneModule
One paragraph describing what this module builds and where it belongs in a scene.
courseVisuals
One paragraph describing what this module builds and where it belongs in a scene.
Inputs
count: number(default 3) — what it controls, units, sensible range.spacing: number(default 1.5) — what it controls, units, sensible range.
Placement
local placed = entity.spawn("courseVisuals_0")
placed.component.add("SceneModule", {
source = asset.resolve("courseVisuals", "sceneModule"),
params = { count = 5 },
})
placed.localPosition = { 0, 0, 0 }
Interface
What this asset declares: the schema it conforms to, what it exposes, and the rendered structured payload.
conforms to
zero/source-extract/v2game.world.courseVisuals — draws SURF VOID's course from game.course. Every solid in `Course.solids` becomes one mesh built from the exact vertices and faces the controller collides with (Course.collideSphere), so what is drawn is what is surfed. Nothing here adds collision: gates, the arch, the beam and the set dressing are visual only. Surfaces use the `game.world.surf_grid` shader. Each vertex colour carries face data for it: r = t across the face (0 base edge, 1 ridge/top), g/b = face role (00 main, 10 side, 01 cap/trim, 11 underside), a = 0 marks a checker strip. See surf_grid.shader/shader.wgsl. Placed once by scenes/main.scene/build.luau (entity "course_placement"). Rebuild after editing: layers.active.asset:build() in edit mode.
newGeo( ) → void
push3(t: ?, v: ?) → void
| arg | type | description |
|---|---|---|
| t | ? | |
| v | ? |
addPoly(g: ?, pts: ?, n: ?, uvs: ?, cols: ?) → void
Add a convex planar polygon. `pts` CCW from outside, `n` its normal, `uvs` one {u,v} per point, `cols` one {r,g,b,a} per point.
| arg | type | description |
|---|---|---|
| g | ? | |
| pts | ? | |
| n | ? | |
| uvs | ? | |
| cols | ? |
finishGeo(g: ?) → void
| arg | type | description |
|---|---|---|
| g | ? |
faceFrame(pts: ?, n: ?) → void
Planar UV frame for a face: u along its longest edge, v across it, in units of `grid` metres, origin at the face's first vertex.
| arg | type | description |
|---|---|---|
| pts | ? | |
| n | ? |
planarUVs(pts: ?, n: ?, grid: ?, origin: ?) → void
| arg | type | description |
|---|---|---|
| pts | ? | |
| n | ? | |
| grid | ? | |
| origin | ? |
role(r: ?, t: ?, a: ?) → void
| arg | type | description |
|---|---|---|
| r | ? | |
| t | ? | |
| a | ? |
rampGeometry(solid: ?, grid: ?) → void
| arg | type | description |
|---|---|---|
| solid | ? | |
| grid | ? |
boxGeometry(solid: ?, grid: ?, split: ?) → void
Boxes (pads, finish). `split` optionally cuts the top face into a grid of coplanar, non-overlapping cells: { xs = {...}, zs = {...}, checker = fn(ix, iz) } in the box's local metres (x along `right`, z along `fwd`).
| arg | type | description |
|---|---|---|
| solid | ? | |
| grid | ? | |
| split | ? |
P(lx: ?, lz: ?) → void
| arg | type | description |
|---|---|---|
| lx | ? | |
| lz | ? |
addBox(g: ?, c: ?, ax: ?, ay: ?, az: ?, h: ?, col: ?) → void
A box in a local frame: centre c, axes (ax, ay, az) unit, half sizes h. UVs run 0..1 across each face (for the glow shader's border term).
| arg | type | description |
|---|---|---|
| g | ? | |
| c | ? | |
| ax | ? | |
| ay | ? | |
| az | ? | |
| h | ? | |
| col | ? |
P(sx: ?, sy: ?, sz: ?) → void
| arg | type | description |
|---|---|---|
| sx | ? | |
| sy | ? | |
| sz | ? |
gateFrame(origin: ?, right: ?, fwd: ?) → void
| arg | type | description |
|---|---|---|
| origin | ? | |
| right | ? | |
| fwd | ? |
gatePanel(origin: ?, right: ?) → void
| arg | type | description |
|---|---|---|
| origin | ? | |
| right | ? |
archGeometry(base: ?, right: ?, fwd: ?, depth: ?) → void
| arg | type | description |
|---|---|---|
| base | ? | |
| right | ? | |
| fwd | ? | |
| depth | ? |
P(xy: ?, z: ?) → void
| arg | type | description |
|---|---|---|
| xy | ? | |
| z | ? |
quad(pts: ?, tvals: ?, r: ?, uvgrid: ?) → void
| arg | type | description |
|---|---|---|
| pts | ? | |
| tvals | ? | |
| r | ? | |
| uvgrid | ? |
beamGeometry(radius: ?, height: ?, sides: ?) → void
Vertical light beam: an open cylinder, uv.y 0 at the bottom, 1 at the top.
| arg | type | description |
|---|---|---|
| radius | ? | |
| height | ? | |
| sides | ? |
rng(seed: ?) → void
| arg | type | description |
|---|---|---|
| seed | ? |
addPrismSolid(g: ?, origin: ?, yaw: ?, length: ?, halfWidth: ?, height: ?, drop: ?, grid: ?) → void
| arg | type | description |
|---|---|---|
| g | ? | |
| origin | ? | |
| yaw | ? | |
| length | ? | |
| halfWidth | ? | |
| height | ? | |
| drop | ? | |
| grid | ? |
P(lat: ?, up: ?, along: ?) → void
| arg | type | description |
|---|---|---|
| lat | ? | |
| up | ? | |
| along | ? |
addSlab(g: ?, centre: ?, yaw: ?, hx: ?, hz: ?, thick: ?, grid: ?) → void
| arg | type | description |
|---|---|---|
| g | ? | |
| centre | ? | |
| yaw | ? | |
| hx | ? | |
| hz | ? | |
| thick | ? | |
| grid | ? |
P(sx: ?, sy: ?, sz: ?) → void
| arg | type | description |
|---|---|---|
| sx | ? | |
| sy | ? | |
| sz | ? |
decorGeometry(count: ?, seed: ?) → void
| arg | type | description |
|---|---|---|
| count | ? | |
| seed | ? |
surfMat(name: ?, props: ?) → void
| arg | type | description |
|---|---|---|
| name | ? | |
| props | ? |
glowMat(name: ?, props: ?) → void
| arg | type | description |
|---|---|---|
| name | ? | |
| props | ? |
holoQuad(centre: ?, yaw: ?, w: ?, h: ?) → void
A quad centred on `centre`, facing a player travelling along `yaw`. uv (0,0) is the image's top-left, read left-to-right from that player.
| arg | type | description |
|---|---|---|
| centre | ? | |
| yaw | ? | |
| w | ? | |
| h | ? |
label(name: ?, parent: ?, pos: ?, yaw: ?, text: ?, color: ?, height: ?, _italic: ?) → void
| arg | type | description |
|---|---|---|
| name | ? | |
| parent | ? | |
| pos | ? | |
| yaw | ? | |
| text | ? | |
| color | ? | |
| height | ? | |
| _italic | ? |
glowModel(name: ?, parent: ?, mesh: ?, mat: ?, pos: ?) → void
| arg | type | description |
|---|---|---|
| name | ? | |
| parent | ? | |
| mesh | ? | |
| mat | ? | |
| pos | ? |
pointLight(name: ?, parent: ?, pos: ?, color: ?, intensity: ?, radius: ?) → void
| arg | type | description |
|---|---|---|
| name | ? | |
| parent | ? | |
| pos | ? | |
| color | ? | |
| intensity | ? | |
| radius | ? |
placeGate(root: ?, pad: ?, key: ?, along: ?, text: ?, textHeight: ?, textY: ?) → void
A gate (frame + panel + label + light) standing on `pad`, `along` metres along the pad's heading from its centre.
| arg | type | description |
|---|---|---|
| root | ? | |
| pad | ? | |
| key | ? | |
| along | ? | |
| text | ? | |
| textHeight | ? | |
| textY | ? |
checker(_ix: ?, iz: ?) → void
| arg | type | description |
|---|---|---|
| _ix | ? | |
| iz | ? |
Sub-parts
Everything contained inside this part. Assets are composite children (clickable cards). Files are leaf payloads. Expand any row to view its source.
Showing the 199 items nearest this part. It holds more than this page lists.
Problems
Everything affecting this asset right now: its own problems, anything wrong inside it, and problems on its direct dependencies.
agent_score is exposed.+ quality × 0.35
+ performance × 0.25
± compat factor
Usability ratings
Did the part work as advertised when consumers tried to drop it in. Separate from upvotes: those are taste; this is "did it function".
Scoped to this part · feeds back into the world's score.