@origingame/engine 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/dist/web/origin-engine.d.ts +38 -2
  2. package/dist/web/origin-engine.js +250 -10
  3. package/dist/web/origin-engine_bg.wasm +0 -0
  4. package/dist/web/origin-engine_bg.wasm.d.ts +14 -2
  5. package/dist/web-publish/origin-engine-lanes.js +255 -34
  6. package/dist/web-publish/origin-engine-lanes_bg.wasm +0 -0
  7. package/dist/web-publish/origin-engine.d.ts +39 -3
  8. package/dist/web-publish/origin-engine.js +253 -32
  9. package/dist/web-publish/origin-engine_bg.wasm +0 -0
  10. package/dist/web-publish/origin-engine_bg.wasm.d.ts +15 -3
  11. package/dist/web-publish-2d/origin-engine-lanes.js +253 -32
  12. package/dist/web-publish-2d/origin-engine-lanes_bg.wasm +0 -0
  13. package/dist/web-publish-2d/origin-engine.d.ts +38 -2
  14. package/dist/web-publish-2d/origin-engine.js +250 -29
  15. package/dist/web-publish-2d/origin-engine_bg.wasm +0 -0
  16. package/dist/web-publish-2d/origin-engine_bg.wasm.d.ts +14 -2
  17. package/knowledge/README.md +2 -1
  18. package/knowledge/guides/three-to-og.md +393 -0
  19. package/knowledge/knowledge.json +2 -1
  20. package/knowledge/package.json +3 -2
  21. package/knowledge/scaffold/origin-engine.json +2 -2
  22. package/knowledge/scaffold/template/package.json +1 -1
  23. package/knowledge/scaffold/template/project.ogt +1 -1
  24. package/knowledge/scripts/validate.ts +140 -21
  25. package/knowledge/skills/og-audio/SKILL.md +2 -2
  26. package/knowledge/skills/og-build/SKILL.md +22 -3
  27. package/knowledge/skills/og-core/SKILL.md +20 -5
  28. package/knowledge/skills/og-feel/SKILL.md +2 -2
  29. package/knowledge/skills/og-game/SKILL.md +481 -35
  30. package/knowledge/skills/og-i18n/SKILL.md +7 -7
  31. package/knowledge/skills/og-model/SKILL.md +374 -0
  32. package/knowledge/skills/og-platform-sdk/SKILL.md +1 -1
  33. package/knowledge/skills/og-ui/SKILL.md +15 -8
  34. package/knowledge/wiki/ai.md +20 -20
  35. package/knowledge/wiki/anim.md +63 -55
  36. package/knowledge/wiki/atmosphere.md +13 -13
  37. package/knowledge/wiki/audio.md +18 -18
  38. package/knowledge/wiki/camera.md +13 -13
  39. package/knowledge/wiki/commands.md +11 -11
  40. package/knowledge/wiki/debug.md +13 -13
  41. package/knowledge/wiki/game.md +8 -8
  42. package/knowledge/wiki/i18n.md +7 -7
  43. package/knowledge/wiki/index.md +57 -3
  44. package/knowledge/wiki/input.md +47 -47
  45. package/knowledge/wiki/load.md +57 -57
  46. package/knowledge/wiki/nav.md +34 -34
  47. package/knowledge/wiki/net.md +10 -10
  48. package/knowledge/wiki/path.md +14 -14
  49. package/knowledge/wiki/physics.md +95 -95
  50. package/knowledge/wiki/platform.md +44 -44
  51. package/knowledge/wiki/probe.md +86 -86
  52. package/knowledge/wiki/reflect.md +16 -4
  53. package/knowledge/wiki/render.md +1168 -170
  54. package/knowledge/wiki/rng.md +14 -14
  55. package/knowledge/wiki/shapes.md +727 -0
  56. package/knowledge/wiki/stream.md +15 -15
  57. package/knowledge/wiki/system.md +8 -8
  58. package/knowledge/wiki/systems.md +2 -2
  59. package/knowledge/wiki/terrain.md +24 -20
  60. package/knowledge/wiki/tilemap.md +13 -13
  61. package/knowledge/wiki/time.md +4 -4
  62. package/knowledge/wiki/timeline.md +14 -14
  63. package/knowledge/wiki/transform.md +8 -8
  64. package/knowledge/wiki/tween.md +17 -17
  65. package/knowledge/wiki/ui.md +245 -269
  66. package/knowledge/wiki/video.md +5 -5
  67. package/knowledge/wiki/world.md +36 -36
  68. package/package.json +4 -4
  69. package/schema/api.schema.json +1834 -305
  70. package/shell/platform.ts +5 -0
  71. package/shell/player.ts +8 -2
  72. package/shell/transport.ts +6 -0
  73. package/src/generated/abi.ts +37 -1
  74. package/src/geom.ts +260 -0
  75. package/src/index.ts +8 -1
  76. package/src/node/playtest-run.ts +1 -0
  77. package/src/platform-local.ts +2 -0
  78. package/src/playtest.ts +8 -0
  79. package/src/runtime.ts +87 -6
  80. package/src/ui-kit/settings.ts +9 -0
  81. package/src/web/shell.ts +1 -1
  82. package/src/web/worker.ts +2 -2
  83. package/types/bindings.json +697 -402
  84. package/types/index.d.ts +1045 -127
@@ -14,7 +14,7 @@ module render {
14
14
  # declarations follow, each quoted below
15
15
  ```
16
16
 
17
- <sub>`api.ogt` line 2237</sub>
17
+ <sub>`api.ogt` line 2243</sub>
18
18
 
19
19
  ## Contents
20
20
 
@@ -39,7 +39,10 @@ module render {
39
39
  | [`og.SpotLight`](#record-SpotLight) | component | A cone of light along the entity's local -Z, as three.js SpotLight. |
40
40
  | [`ToneMapping`](#type-ToneMapping) | enum | The curve from the lit HDR image to the display, as three.js toneMapping. RenderSettings.toneMapped false clamps instead, whichever is chosen. |
41
41
  | [`ToneMapping()`](#column-ToneMapping) | column kind | A ToneMapping field: the variant's index. |
42
- | [`og.RenderSettings`](#record-RenderSettings) | resource | The frame's look after lighting: environment light, sky, bloom, exposure metering and tone mapping. Read after each tick; it never feeds back into the simulation. Camera.exposure is the manual exposure. |
42
+ | [`GraphicsQuality`](#type-GraphicsQuality) | enum | A graphics preset: a row of RenderSettings' quality fields that og.render.applyQuality writes (its doc has the table). The settings screen (og.ui.settingsScreen) offers the three. |
43
+ | [`QualityPreset`](#type-QualityPreset) | enum | The preset RenderSettings' quality fields were last written with (RenderSettings.quality). |
44
+ | [`QualityPreset()`](#column-QualityPreset) | column kind | A QualityPreset field: the variant's index. |
45
+ | [`og.RenderSettings`](#record-RenderSettings) | resource | The frame's look after lighting: environment light, sky, bloom, exposure metering and tone mapping, and what the frame may cost: the quality fields (rectShadows to msaaSamples) that og.render.applyQuality sets from a graphics preset. Read after each tick; it never feeds back into the simulation. Camera.exposure is the manual exposure. |
43
46
  | [`Lut`](#type-Lut) | handle | A colour lookup table for PostEffects.lut, from og.load.lut (a `.cube` file). |
44
47
  | [`EnvironmentMap`](#type-EnvironmentMap) | handle | A prefiltered HDR environment map for Environment.map, from og.load.environment (an `.ogt` of `type environment` naming an equirectangular `.hdr` or `.exr`, a KTX2 cube map, or six face images). |
45
48
  | [`ParticleEmitter`](#type-ParticleEmitter) | handle | A particle emitter asset for ParticleSystem.emitter, from og.load.emitter (an `.ogt` of `type particles`). |
@@ -109,6 +112,7 @@ module render {
109
112
  | [`og.render.setMaterialShader`](#fn-setMaterialShader) | function | Give an existing material a material shader, or take it away with null: a loaded model's material (GltfInfo.materials) draws its skinned or static meshes through the hooks, with the shader's parameters at their defaults. Every mesh drawn with that material changes. |
110
113
  | [`og.render.setShaderParam`](#fn-setShaderParam) | function | Set a parameter of a shader material, by the name its shader declares: a number for float, two to four for vec2, vec3, vec4 and color. |
111
114
  | [`og.render.applyLook`](#fn-applyLook) | function | Apply a look, in GameDesc.start (or name it in GameDesc.look) or at any tick for a level's mood, a flashback or a photo mode: every resource the look names is replaced whole (the fields it sets take its values, the rest their defaults; PostEffects.flash and PostEffects.shakeTrauma, which game code animates, keep theirs), and the UI is configured with its style, keeping the rest of the last UiDesc. Resources it does not name are left as they are. Inside a system, the system must declare those resources among its writes. A look that switches the stylisation (a Stylise pass on or off, the pixel grid, retro 3D, the material style) starts TAA's history over, as a camera cut does, so its first frame holds no ghost of the old look. |
115
+ | [`og.render.applyQuality`](#fn-applyQuality) | function | Apply a graphics preset: write its row of RenderSettings' quality fields (the rest of RenderSettings keeps its values) and record it in RenderSettings.quality. The renderer reads those fields and nothing else, so what the probe and dump_world show of RenderSettings is what the next frame draws. The settings screen calls it when the player picks a preset (SettingsDesc.world); a game applies a saved preset itself at start. Inside a system, the system must declare RenderSettings among its writes. The rows: |
112
116
  | [`og.render.look`](#fn-look) | function | The look last applied (by og.render.applyLook or GameDesc.look), as og.load.lookInfo describes it; null before any. |
113
117
  | [`og.render.capabilities`](#fn-capabilities) | function | The renderer's tier and limits on this device. |
114
118
  | [`og.render.text`](#fn-text) | function | Draw text this frame. Systems and commands may call it; the list is cleared at every tick, so submit it every tick the text should show. Multi-page fonts are drawn page by page with one layout. |
@@ -131,6 +135,30 @@ module render {
131
135
  | [`og.render.ringGeometry`](#fn-ringGeometry) | function | Make a ring geometry for og.Mesh (one-sided: give it a double-sided material to see it from behind). |
132
136
  | [`og.render.circleGeometry`](#fn-circleGeometry) | function | Make a circle geometry for og.Mesh (one-sided, as ringGeometry). |
133
137
  | [`og.render.tubeGeometry`](#fn-tubeGeometry) | function | Make a tube along a curve through points for og.Mesh: pipes, cables, rails, a path shown as a ribbon of geometry. Physics can use it as a triangle-mesh Collider.mesh. |
138
+ | [`ShapePoints`](#type-ShapePoints) | struct | A shape as points, what og.Shape.extractPoints returns and what shapeGeometry, extrudeGeometry and sweepGeometry read: the outline, then each hole. A repeated closing point is dropped, as three.js drops it. |
139
+ | [`ShapeGeometryDesc`](#type-ShapeGeometryDesc) | desc struct | A flat shape with holes in the xy plane facing +Z, as three.js ShapeGeometry(shapes, curveSegments): triangulated by earcut (three.js's own port), the outline made clockwise and the holes counter-clockwise first, so its vertices and triangles are three.js's for the same shape. uvs are world x and y (v flipped to run down the image). |
140
+ | [`ExtrudeGeometryDesc`](#type-ExtrudeGeometryDesc) | desc struct | Shapes pushed along +Z, or along a path, as three.js ExtrudeGeometry(shapes, options) with its option names and defaults: a closed solid, its lids from earcut and its walls ring by ring, rounded by a bevel of bevelSegments rings at each face. Unindexed as three.js's (every triangle its own vertices, flat normals), three.js's vertex order and counts; uvs from three.js's WorldUVGenerator (v flipped to run down the image). |
141
+ | [`LatheGeometryDesc`](#type-LatheGeometryDesc) | desc struct | A profile turned round +Y, as three.js LatheGeometry(points, segments, phiStart, phiLength): vases, bottles, columns, wheels. three.js's vertices, indices and smooth normals; u round the axis, v along the profile (flipped to run down the image). A whole turn's seam meets exactly. |
142
+ | [`PolyhedronGeometryDesc`](#type-PolyhedronGeometryDesc) | desc struct | A polyhedron from vertices and faces, every face subdivided `detail` times and every vertex pushed onto the sphere of `radius`, as three.js PolyhedronGeometry(vertices, indices, radius, detail): unindexed, flat normals at detail 0 and the sphere's above, three.js's spherical uvs. |
143
+ | [`SolidGeometryDesc`](#type-SolidGeometryDesc) | desc struct | A regular solid, as three.js IcosahedronGeometry, DodecahedronGeometry, OctahedronGeometry and TetrahedronGeometry(radius, detail): PolyhedronGeometryDesc with the solid's own vertices and faces. An icosahedron at detail 2 or more is a sphere with even triangles. |
144
+ | [`SweepKey`](#type-SweepKey) | struct | A value at a fraction of a sweep's path: linear between keys, held before the first and past the last. |
145
+ | [`SweepGeometryDesc`](#type-SweepGeometryDesc) | desc struct | A section swept along a path, scaled and twisted over it: horns, tusks, handles, blades, tapered pipes, twisted columns (img2threejs's tapered sweep; three.js has no class for it). The section's x lies along the path's normal and y along its binormal (three.js's Frenet frames), rings evenly spaced along the path's length; u runs along the path, v round the section (flipped to run down the image), the sides smooth. An open path's ends are capped. |
146
+ | [`MirrorAxis`](#type-MirrorAxis) | enum | The world axis a part is mirrored along, after its placement. |
147
+ | [`GeometryPart`](#type-GeometryPart) | desc struct | A geometry placed as an Object3D is (scale, then rotate, then move), then mirrored: one part of og.render.mergeGeometries or an operand of og.render.csgGeometry. |
148
+ | [`CsgOp`](#type-CsgOp) | enum | A boolean operation on two solids. |
149
+ | [`CsgGeometryDesc`](#type-CsgGeometryDesc) | desc struct | Two closed geometries combined by a boolean operation, each placed first: a box with a hole bored through it, a dice, a window cut in a wall. The result is closed when both are (every edge shared by two triangles, wound opposite), every piece keeps its source's normals, uvs and colours (b's turned inside out where it is subtracted). Where a plane side or an edge crossing is decided, the decision is exact (Shewchuk's predicates), so every host makes the same cuts; faces that coincide keep one copy or none, as the operation says. |
150
+ | [`MergeGeometriesDesc`](#type-MergeGeometriesDesc) | desc struct | Geometries placed and merged into one, as three.js BufferGeometryUtils.mergeGeometries after applying each part's matrix: a prop of parts drawn in one draw, a mirrored half, an array (the same part at several placements). Normals follow each placement; a mirrored part turns its triangles so they still face out. Vertex colours are kept when any part has them. |
151
+ | [`og.render.shapeGeometry`](#fn-shapeGeometry) | function | Make a flat shape for og.Mesh (one-sided, as circleGeometry): an og.Shape with holes, or a points array. Physics can use it as a triangle-mesh Collider.mesh. |
152
+ | [`og.render.extrudeGeometry`](#fn-extrudeGeometry) | function | Make an extruded solid for og.Mesh: a three.js extrusion is a paste (`og.render.extrudeGeometry(world, { shapes: shape, depth: 0.2, bevelEnabled: true })`). Gears, signs, keys, logos, cookie cutters; along a path, a rail or a moulding. |
153
+ | [`og.render.latheGeometry`](#fn-latheGeometry) | function | Make a solid of revolution for og.Mesh: a profile turned round +Y. |
154
+ | [`og.render.polyhedronGeometry`](#fn-polyhedronGeometry) | function | Make a polyhedron from vertices and faces for og.Mesh, subdivided onto a sphere. |
155
+ | [`og.render.icosahedronGeometry`](#fn-icosahedronGeometry) | function | Make an icosahedron (twenty faces) for og.Mesh; with detail, a geodesic sphere. |
156
+ | [`og.render.dodecahedronGeometry`](#fn-dodecahedronGeometry) | function | Make a dodecahedron (twelve pentagons, thirty-six triangles) for og.Mesh. |
157
+ | [`og.render.octahedronGeometry`](#fn-octahedronGeometry) | function | Make an octahedron (eight faces) for og.Mesh. |
158
+ | [`og.render.tetrahedronGeometry`](#fn-tetrahedronGeometry) | function | Make a tetrahedron (four faces) for og.Mesh. |
159
+ | [`og.render.sweepGeometry`](#fn-sweepGeometry) | function | Make a section swept along a path for og.Mesh, tapered and twisted by keys. |
160
+ | [`og.render.csgGeometry`](#fn-csgGeometry) | function | Make the union, difference or intersection of two placed geometries for og.Mesh. Chain calls for more operands (a cube minus six spheres is six calls); each result is a geometry like any other. |
161
+ | [`og.render.mergeGeometries`](#fn-mergeGeometries) | function | Make one geometry of several placed ones for og.Mesh: one draw instead of many, mirrored halves, arrays. |
134
162
  | [`LineMode`](#type-LineMode) | enum | How a line set's points join, as three.js's three line objects. |
135
163
  | [`LineMode()`](#column-LineMode) | column kind | A LineMode field: the variant's index. |
136
164
  | [`LinesDesc`](#type-LinesDesc) | desc struct | Lines through points, drawn this frame only (immediate mode, as og.render.sprite): submit them every tick they should show. three.js Line, LineSegments and LineLoop with a LineBasicMaterial or LineDashedMaterial, but any width on every tier (each segment is a quad in screen space with a feathered edge, so WebGL2's one-pixel lines do not apply). |
@@ -155,7 +183,7 @@ module render {
155
183
  | [`Post()`](#column-Post) | column kind | A Post handle field (0 is none). |
156
184
  | [`og.render.setPostParam`](#fn-setPostParam) | function | Set a parameter of a custom post pass, by the name its asset declares: a number for float, two to four for vec2, vec3, vec4 and color. Every frame it runs in reads it. |
157
185
  | [`PostError`](#type-PostError) | struct | A custom post pass the device failed to compile. |
158
- | [`og.render.postErrors`](#fn-postErrors) | function | The custom post passes PostEffects.custom1 to custom8 name that failed to compile on this device, each skipped (the frame draws as without it). The cook validates every pass for each back end, so this is a device's own refusal. |
186
+ | [`og.render.postErrors`](#fn-postErrors) | function | The custom post passes PostEffects.custom names that failed to compile on this device, each skipped (the frame draws as without it). The cook validates every pass for each back end, so this is a device's own refusal. |
159
187
  | [`VolumetricFog`](#type-VolumetricFog) | enum | How the device draws Fog.volumetric (RenderCapabilities.volumetricFog). |
160
188
  | [`og.RectLight`](#record-RectLight) | component | A rectangle of light, as three.js RectAreaLight: width by height metres centred on the entity in its local xy plane, facing along its local -Z (aim it with transform.lookAt, as a spot), emitting color * intensity from its front, or from both faces with twoSided. Shaded with linearly transformed cosines (Heitz et al. 2016, three.js's tables), so its highlight on a glossy floor is the rectangle's shape and its light on a matte wall falls off as a real panel's does. With castShadow it casts a soft shadow in the frame; og bake lightmaps traces its exact soft shadows into the bounce light either way. |
161
189
  | [`og.LightVolume`](#record-LightVolume) | component | A box of baked light probes (an irradiance volume): og bake lightmaps traces the light arriving from the scene (bounced off its static models, from the sky, from emissive surfaces) at a grid of points spacing metres apart inside it, as first-order spherical harmonics. Every mesh, model, skinned character and particle-lit surface drawn inside it that has no lightmap of its own takes its ambient light from the probes instead of the sky's, blended at the box's edge over one spacing: a ball rolling past a red wall turns red on that side. |
@@ -192,7 +220,7 @@ fn ribbon {
192
220
  }
193
221
  ```
194
222
 
195
- <sub>`api.ogt` line 3532</sub>
223
+ <sub>`api.ogt` line 3584</sub>
196
224
 
197
225
  <a id="fn-sprite"></a>
198
226
 
@@ -222,7 +250,7 @@ fn sprite {
222
250
  }
223
251
  ```
224
252
 
225
- <sub>`api.ogt` line 3660</sub>
253
+ <sub>`api.ogt` line 3712</sub>
226
254
 
227
255
  <a id="fn-floatingText"></a>
228
256
 
@@ -252,7 +280,7 @@ fn floatingText {
252
280
  }
253
281
  ```
254
282
 
255
- <sub>`api.ogt` line 3840</sub>
283
+ <sub>`api.ogt` line 3892</sub>
256
284
 
257
285
  <a id="fn-measureText"></a>
258
286
 
@@ -282,7 +310,7 @@ fn measureText {
282
310
  }
283
311
  ```
284
312
 
285
- <sub>`api.ogt` line 3847</sub>
313
+ <sub>`api.ogt` line 3899</sub>
286
314
 
287
315
  <a id="fn-boxGeometry"></a>
288
316
 
@@ -312,7 +340,7 @@ fn boxGeometry {
312
340
  }
313
341
  ```
314
342
 
315
- <sub>`api.ogt` line 3916</sub>
343
+ <sub>`api.ogt` line 3968</sub>
316
344
 
317
345
  <a id="fn-planeGeometry"></a>
318
346
 
@@ -342,7 +370,7 @@ fn planeGeometry {
342
370
  }
343
371
  ```
344
372
 
345
- <sub>`api.ogt` line 3923</sub>
373
+ <sub>`api.ogt` line 3975</sub>
346
374
 
347
375
  <a id="fn-sphereGeometry"></a>
348
376
 
@@ -372,7 +400,7 @@ fn sphereGeometry {
372
400
  }
373
401
  ```
374
402
 
375
- <sub>`api.ogt` line 3930</sub>
403
+ <sub>`api.ogt` line 3982</sub>
376
404
 
377
405
  <a id="fn-standardMaterial"></a>
378
406
 
@@ -402,7 +430,7 @@ fn standardMaterial {
402
430
  }
403
431
  ```
404
432
 
405
- <sub>`api.ogt` line 4010</sub>
433
+ <sub>`api.ogt` line 4064</sub>
406
434
 
407
435
  <a id="fn-updateMaterial"></a>
408
436
 
@@ -434,7 +462,7 @@ fn updateMaterial {
434
462
  }
435
463
  ```
436
464
 
437
- <sub>`api.ogt` line 4017</sub>
465
+ <sub>`api.ogt` line 4071</sub>
438
466
 
439
467
  <a id="fn-shaderMaterial"></a>
440
468
 
@@ -466,7 +494,7 @@ fn shaderMaterial {
466
494
  }
467
495
  ```
468
496
 
469
- <sub>`api.ogt` line 4027</sub>
497
+ <sub>`api.ogt` line 4081</sub>
470
498
 
471
499
  <a id="fn-setMaterialShader"></a>
472
500
 
@@ -498,7 +526,7 @@ fn setMaterialShader {
498
526
  }
499
527
  ```
500
528
 
501
- <sub>`api.ogt` line 4035</sub>
529
+ <sub>`api.ogt` line 4089</sub>
502
530
 
503
531
  <a id="fn-setShaderParam"></a>
504
532
 
@@ -532,7 +560,7 @@ fn setShaderParam {
532
560
  }
533
561
  ```
534
562
 
535
- <sub>`api.ogt` line 4043</sub>
563
+ <sub>`api.ogt` line 4097</sub>
536
564
 
537
565
  <a id="fn-applyLook"></a>
538
566
 
@@ -562,7 +590,61 @@ fn applyLook {
562
590
  }
563
591
  ```
564
592
 
565
- <sub>`api.ogt` line 4052</sub>
593
+ <sub>`api.ogt` line 4106</sub>
594
+
595
+ <a id="fn-applyQuality"></a>
596
+
597
+ ### `og.render.applyQuality`
598
+
599
+ Apply a graphics preset: write its row of RenderSettings' quality fields (the rest of RenderSettings keeps its values) and record it in RenderSettings.quality. The renderer reads those fields and nothing else, so what the probe and dump_world show of RenderSettings is what the next frame draws. The settings screen calls it when the player picks a preset (SettingsDesc.world); a game applies a saved preset itself at start. Inside a system, the system must declare RenderSettings among its writes. The rows:
600
+
601
+ | Field | low | medium | high |
602
+ |---|---|---|---|
603
+ | rectShadows | false | true | true |
604
+ | shadowedLights | 2 | 8 | 8 |
605
+ | shadowMapScale | 0.5 | 1 | 2 |
606
+ | volumetricFog | false | true | true |
607
+ | softParticles | false | true | true |
608
+ | screenSpaceReflections | false | true | true |
609
+ | ambientOcclusion | false | true | true |
610
+ | msaaSamples | 1 | 4 | 4 |
611
+
612
+ Medium is every field's default, the frame drawn before any preset.
613
+
614
+ ```ts
615
+ og.render.applyQuality(world: World, preset: GraphicsQuality): Result<void>
616
+ ```
617
+
618
+ | Parameter | Type | Optional | Doc |
619
+ |---|---|---|---|
620
+ | `world` | `World` | no | The world whose RenderSettings change. |
621
+ | `preset` | `GraphicsQuality` | no | The preset. |
622
+
623
+ **Returns** `Result<void>`: Refused for a world that is not alive, or inside a system that did not declare RenderSettings among its writes.
624
+
625
+ Binding symbol `og_render_apply_quality` · publish builds: kept
626
+
627
+ ```ogt
628
+ fn applyQuality {
629
+ doc "Apply a graphics preset: write its row of RenderSettings' quality fields (the rest of RenderSettings keeps its values) and record it in RenderSettings.quality. The renderer reads those fields and nothing else, so what the probe and dump_world show of RenderSettings is what the next frame draws. The settings screen calls it when the player picks a preset (SettingsDesc.world); a game applies a saved preset itself at start. Inside a system, the system must declare RenderSettings among its writes. The rows:"
630
+ doc "| Field | low | medium | high |"
631
+ doc "|---|---|---|---|"
632
+ doc "| rectShadows | false | true | true |"
633
+ doc "| shadowedLights | 2 | 8 | 8 |"
634
+ doc "| shadowMapScale | 0.5 | 1 | 2 |"
635
+ doc "| volumetricFog | false | true | true |"
636
+ doc "| softParticles | false | true | true |"
637
+ doc "| screenSpaceReflections | false | true | true |"
638
+ doc "| ambientOcclusion | false | true | true |"
639
+ doc "| msaaSamples | 1 | 4 | 4 |"
640
+ doc "Medium is every field's default, the frame drawn before any preset."
641
+ param world World "The world whose RenderSettings change."
642
+ param preset GraphicsQuality "The preset."
643
+ returns Result.Void "Refused for a world that is not alive, or inside a system that did not declare RenderSettings among its writes."
644
+ }
645
+ ```
646
+
647
+ <sub>`api.ogt` line 4113</sub>
566
648
 
567
649
  <a id="fn-look"></a>
568
650
 
@@ -590,7 +672,7 @@ fn look {
590
672
  }
591
673
  ```
592
674
 
593
- <sub>`api.ogt` line 4059</sub>
675
+ <sub>`api.ogt` line 4131</sub>
594
676
 
595
677
  <a id="fn-capabilities"></a>
596
678
 
@@ -618,7 +700,7 @@ fn capabilities {
618
700
  }
619
701
  ```
620
702
 
621
- <sub>`api.ogt` line 4065</sub>
703
+ <sub>`api.ogt` line 4137</sub>
622
704
 
623
705
  <a id="fn-text"></a>
624
706
 
@@ -648,7 +730,7 @@ fn text {
648
730
  }
649
731
  ```
650
732
 
651
- <sub>`api.ogt` line 4071</sub>
733
+ <sub>`api.ogt` line 4143</sub>
652
734
 
653
735
  <a id="fn-bufferGeometry"></a>
654
736
 
@@ -678,7 +760,7 @@ fn bufferGeometry {
678
760
  }
679
761
  ```
680
762
 
681
- <sub>`api.ogt` line 4109</sub>
763
+ <sub>`api.ogt` line 4181</sub>
682
764
 
683
765
  <a id="fn-updateGeometry"></a>
684
766
 
@@ -710,7 +792,7 @@ fn updateGeometry {
710
792
  }
711
793
  ```
712
794
 
713
- <sub>`api.ogt` line 4116</sub>
795
+ <sub>`api.ogt` line 4188</sub>
714
796
 
715
797
  <a id="fn-geometryInfo"></a>
716
798
 
@@ -740,7 +822,7 @@ fn geometryInfo {
740
822
  }
741
823
  ```
742
824
 
743
- <sub>`api.ogt` line 4124</sub>
825
+ <sub>`api.ogt` line 4196</sub>
744
826
 
745
827
  <a id="fn-cylinderGeometry"></a>
746
828
 
@@ -770,7 +852,7 @@ fn cylinderGeometry {
770
852
  }
771
853
  ```
772
854
 
773
- <sub>`api.ogt` line 4319</sub>
855
+ <sub>`api.ogt` line 4391</sub>
774
856
 
775
857
  <a id="fn-coneGeometry"></a>
776
858
 
@@ -800,7 +882,7 @@ fn coneGeometry {
800
882
  }
801
883
  ```
802
884
 
803
- <sub>`api.ogt` line 4326</sub>
885
+ <sub>`api.ogt` line 4398</sub>
804
886
 
805
887
  <a id="fn-capsuleGeometry"></a>
806
888
 
@@ -830,7 +912,7 @@ fn capsuleGeometry {
830
912
  }
831
913
  ```
832
914
 
833
- <sub>`api.ogt` line 4333</sub>
915
+ <sub>`api.ogt` line 4405</sub>
834
916
 
835
917
  <a id="fn-torusGeometry"></a>
836
918
 
@@ -860,7 +942,7 @@ fn torusGeometry {
860
942
  }
861
943
  ```
862
944
 
863
- <sub>`api.ogt` line 4340</sub>
945
+ <sub>`api.ogt` line 4412</sub>
864
946
 
865
947
  <a id="fn-ringGeometry"></a>
866
948
 
@@ -890,7 +972,7 @@ fn ringGeometry {
890
972
  }
891
973
  ```
892
974
 
893
- <sub>`api.ogt` line 4347</sub>
975
+ <sub>`api.ogt` line 4419</sub>
894
976
 
895
977
  <a id="fn-circleGeometry"></a>
896
978
 
@@ -920,7 +1002,7 @@ fn circleGeometry {
920
1002
  }
921
1003
  ```
922
1004
 
923
- <sub>`api.ogt` line 4354</sub>
1005
+ <sub>`api.ogt` line 4426</sub>
924
1006
 
925
1007
  <a id="fn-tubeGeometry"></a>
926
1008
 
@@ -950,7 +1032,337 @@ fn tubeGeometry {
950
1032
  }
951
1033
  ```
952
1034
 
953
- <sub>`api.ogt` line 4361</sub>
1035
+ <sub>`api.ogt` line 4433</sub>
1036
+
1037
+ <a id="fn-shapeGeometry"></a>
1038
+
1039
+ ### `og.render.shapeGeometry`
1040
+
1041
+ Make a flat shape for og.Mesh (one-sided, as circleGeometry): an og.Shape with holes, or a points array. Physics can use it as a triangle-mesh Collider.mesh.
1042
+
1043
+ ```ts
1044
+ og.render.shapeGeometry(world: World, desc?: ShapeGeometryDesc): Result<Geometry>
1045
+ ```
1046
+
1047
+ | Parameter | Type | Optional | Doc |
1048
+ |---|---|---|---|
1049
+ | `world` | `World` | no | The world whose renderer owns the geometry. |
1050
+ | `desc` | `ShapeGeometryDesc` | yes | The shapes and their tessellation. |
1051
+
1052
+ **Returns** `Result<Geometry>`: Refused for a shape whose points are not finite or that triangulates to nothing.
1053
+
1054
+ Binding symbol `og_render_shape_geometry` · publish builds: kept
1055
+
1056
+ ```ogt
1057
+ fn shapeGeometry {
1058
+ doc "Make a flat shape for og.Mesh (one-sided, as circleGeometry): an og.Shape with holes, or a points array. Physics can use it as a triangle-mesh Collider.mesh."
1059
+ param world World "The world whose renderer owns the geometry."
1060
+ param desc ShapeGeometryDesc "The shapes and their tessellation."
1061
+ returns Result.Geometry "Refused for a shape whose points are not finite or that triangulates to nothing."
1062
+ }
1063
+ ```
1064
+
1065
+ <sub>`api.ogt` line 4670</sub>
1066
+
1067
+ <a id="fn-extrudeGeometry"></a>
1068
+
1069
+ ### `og.render.extrudeGeometry`
1070
+
1071
+ Make an extruded solid for og.Mesh: a three.js extrusion is a paste (`og.render.extrudeGeometry(world, { shapes: shape, depth: 0.2, bevelEnabled: true })`). Gears, signs, keys, logos, cookie cutters; along a path, a rail or a moulding.
1072
+
1073
+ ```ts
1074
+ og.render.extrudeGeometry(world: World, desc?: ExtrudeGeometryDesc): Result<Geometry>
1075
+ ```
1076
+
1077
+ | Parameter | Type | Optional | Doc |
1078
+ |---|---|---|---|
1079
+ | `world` | `World` | no | The world whose renderer owns the geometry. |
1080
+ | `desc` | `ExtrudeGeometryDesc` | yes | The shapes, depth, bevel and path. |
1081
+
1082
+ **Returns** `Result<Geometry>`: Refused for a shape whose points are not finite or that triangulates to nothing, or an extrudePath that is not alive.
1083
+
1084
+ Binding symbol `og_render_extrude_geometry` · publish builds: kept
1085
+
1086
+ ```ogt
1087
+ fn extrudeGeometry {
1088
+ doc "Make an extruded solid for og.Mesh: a three.js extrusion is a paste (`og.render.extrudeGeometry(world, { shapes: shape, depth: 0.2, bevelEnabled: true })`). Gears, signs, keys, logos, cookie cutters; along a path, a rail or a moulding."
1089
+ param world World "The world whose renderer owns the geometry."
1090
+ param desc ExtrudeGeometryDesc "The shapes, depth, bevel and path."
1091
+ returns Result.Geometry "Refused for a shape whose points are not finite or that triangulates to nothing, or an extrudePath that is not alive."
1092
+ }
1093
+ ```
1094
+
1095
+ <sub>`api.ogt` line 4677</sub>
1096
+
1097
+ <a id="fn-latheGeometry"></a>
1098
+
1099
+ ### `og.render.latheGeometry`
1100
+
1101
+ Make a solid of revolution for og.Mesh: a profile turned round +Y.
1102
+
1103
+ ```ts
1104
+ og.render.latheGeometry(world: World, desc?: LatheGeometryDesc): Result<Geometry>
1105
+ ```
1106
+
1107
+ | Parameter | Type | Optional | Doc |
1108
+ |---|---|---|---|
1109
+ | `world` | `World` | no | The world whose renderer owns the geometry. |
1110
+ | `desc` | `LatheGeometryDesc` | yes | The profile and the turn. |
1111
+
1112
+ **Returns** `Result<Geometry>`: Refused for fewer than two points or one that is not finite.
1113
+
1114
+ Binding symbol `og_render_lathe_geometry` · publish builds: kept
1115
+
1116
+ ```ogt
1117
+ fn latheGeometry {
1118
+ doc "Make a solid of revolution for og.Mesh: a profile turned round +Y."
1119
+ param world World "The world whose renderer owns the geometry."
1120
+ param desc LatheGeometryDesc "The profile and the turn."
1121
+ returns Result.Geometry "Refused for fewer than two points or one that is not finite."
1122
+ }
1123
+ ```
1124
+
1125
+ <sub>`api.ogt` line 4684</sub>
1126
+
1127
+ <a id="fn-polyhedronGeometry"></a>
1128
+
1129
+ ### `og.render.polyhedronGeometry`
1130
+
1131
+ Make a polyhedron from vertices and faces for og.Mesh, subdivided onto a sphere.
1132
+
1133
+ ```ts
1134
+ og.render.polyhedronGeometry(world: World, desc?: PolyhedronGeometryDesc): Result<Geometry>
1135
+ ```
1136
+
1137
+ | Parameter | Type | Optional | Doc |
1138
+ |---|---|---|---|
1139
+ | `world` | `World` | no | The world whose renderer owns the geometry. |
1140
+ | `desc` | `PolyhedronGeometryDesc` | yes | The vertices, faces, radius and detail. |
1141
+
1142
+ **Returns** `Result<Geometry>`: Refused for no faces, an index past the vertices, or a count that is not a multiple of three.
1143
+
1144
+ Binding symbol `og_render_polyhedron_geometry` · publish builds: kept
1145
+
1146
+ ```ogt
1147
+ fn polyhedronGeometry {
1148
+ doc "Make a polyhedron from vertices and faces for og.Mesh, subdivided onto a sphere."
1149
+ param world World "The world whose renderer owns the geometry."
1150
+ param desc PolyhedronGeometryDesc "The vertices, faces, radius and detail."
1151
+ returns Result.Geometry "Refused for no faces, an index past the vertices, or a count that is not a multiple of three."
1152
+ }
1153
+ ```
1154
+
1155
+ <sub>`api.ogt` line 4691</sub>
1156
+
1157
+ <a id="fn-icosahedronGeometry"></a>
1158
+
1159
+ ### `og.render.icosahedronGeometry`
1160
+
1161
+ Make an icosahedron (twenty faces) for og.Mesh; with detail, a geodesic sphere.
1162
+
1163
+ ```ts
1164
+ og.render.icosahedronGeometry(world: World, desc?: SolidGeometryDesc): Result<Geometry>
1165
+ ```
1166
+
1167
+ | Parameter | Type | Optional | Doc |
1168
+ |---|---|---|---|
1169
+ | `world` | `World` | no | The world whose renderer owns the geometry. |
1170
+ | `desc` | `SolidGeometryDesc` | yes | Its radius and detail. |
1171
+
1172
+ **Returns** `Result<Geometry>`.
1173
+
1174
+ Binding symbol `og_render_icosahedron_geometry` · publish builds: kept
1175
+
1176
+ ```ogt
1177
+ fn icosahedronGeometry {
1178
+ doc "Make an icosahedron (twenty faces) for og.Mesh; with detail, a geodesic sphere."
1179
+ param world World "The world whose renderer owns the geometry."
1180
+ param desc SolidGeometryDesc "Its radius and detail."
1181
+ returns Result.Geometry
1182
+ }
1183
+ ```
1184
+
1185
+ <sub>`api.ogt` line 4698</sub>
1186
+
1187
+ <a id="fn-dodecahedronGeometry"></a>
1188
+
1189
+ ### `og.render.dodecahedronGeometry`
1190
+
1191
+ Make a dodecahedron (twelve pentagons, thirty-six triangles) for og.Mesh.
1192
+
1193
+ ```ts
1194
+ og.render.dodecahedronGeometry(world: World, desc?: SolidGeometryDesc): Result<Geometry>
1195
+ ```
1196
+
1197
+ | Parameter | Type | Optional | Doc |
1198
+ |---|---|---|---|
1199
+ | `world` | `World` | no | The world whose renderer owns the geometry. |
1200
+ | `desc` | `SolidGeometryDesc` | yes | Its radius and detail. |
1201
+
1202
+ **Returns** `Result<Geometry>`.
1203
+
1204
+ Binding symbol `og_render_dodecahedron_geometry` · publish builds: kept
1205
+
1206
+ ```ogt
1207
+ fn dodecahedronGeometry {
1208
+ doc "Make a dodecahedron (twelve pentagons, thirty-six triangles) for og.Mesh."
1209
+ param world World "The world whose renderer owns the geometry."
1210
+ param desc SolidGeometryDesc "Its radius and detail."
1211
+ returns Result.Geometry
1212
+ }
1213
+ ```
1214
+
1215
+ <sub>`api.ogt` line 4705</sub>
1216
+
1217
+ <a id="fn-octahedronGeometry"></a>
1218
+
1219
+ ### `og.render.octahedronGeometry`
1220
+
1221
+ Make an octahedron (eight faces) for og.Mesh.
1222
+
1223
+ ```ts
1224
+ og.render.octahedronGeometry(world: World, desc?: SolidGeometryDesc): Result<Geometry>
1225
+ ```
1226
+
1227
+ | Parameter | Type | Optional | Doc |
1228
+ |---|---|---|---|
1229
+ | `world` | `World` | no | The world whose renderer owns the geometry. |
1230
+ | `desc` | `SolidGeometryDesc` | yes | Its radius and detail. |
1231
+
1232
+ **Returns** `Result<Geometry>`.
1233
+
1234
+ Binding symbol `og_render_octahedron_geometry` · publish builds: kept
1235
+
1236
+ ```ogt
1237
+ fn octahedronGeometry {
1238
+ doc "Make an octahedron (eight faces) for og.Mesh."
1239
+ param world World "The world whose renderer owns the geometry."
1240
+ param desc SolidGeometryDesc "Its radius and detail."
1241
+ returns Result.Geometry
1242
+ }
1243
+ ```
1244
+
1245
+ <sub>`api.ogt` line 4712</sub>
1246
+
1247
+ <a id="fn-tetrahedronGeometry"></a>
1248
+
1249
+ ### `og.render.tetrahedronGeometry`
1250
+
1251
+ Make a tetrahedron (four faces) for og.Mesh.
1252
+
1253
+ ```ts
1254
+ og.render.tetrahedronGeometry(world: World, desc?: SolidGeometryDesc): Result<Geometry>
1255
+ ```
1256
+
1257
+ | Parameter | Type | Optional | Doc |
1258
+ |---|---|---|---|
1259
+ | `world` | `World` | no | The world whose renderer owns the geometry. |
1260
+ | `desc` | `SolidGeometryDesc` | yes | Its radius and detail. |
1261
+
1262
+ **Returns** `Result<Geometry>`.
1263
+
1264
+ Binding symbol `og_render_tetrahedron_geometry` · publish builds: kept
1265
+
1266
+ ```ogt
1267
+ fn tetrahedronGeometry {
1268
+ doc "Make a tetrahedron (four faces) for og.Mesh."
1269
+ param world World "The world whose renderer owns the geometry."
1270
+ param desc SolidGeometryDesc "Its radius and detail."
1271
+ returns Result.Geometry
1272
+ }
1273
+ ```
1274
+
1275
+ <sub>`api.ogt` line 4719</sub>
1276
+
1277
+ <a id="fn-sweepGeometry"></a>
1278
+
1279
+ ### `og.render.sweepGeometry`
1280
+
1281
+ Make a section swept along a path for og.Mesh, tapered and twisted by keys.
1282
+
1283
+ ```ts
1284
+ og.render.sweepGeometry(world: World, desc?: SweepGeometryDesc): Result<Geometry>
1285
+ ```
1286
+
1287
+ | Parameter | Type | Optional | Doc |
1288
+ |---|---|---|---|
1289
+ | `world` | `World` | no | The world whose renderer owns the geometry. |
1290
+ | `desc` | `SweepGeometryDesc` | yes | The section, path, keys and caps. |
1291
+
1292
+ **Returns** `Result<Geometry>`: Refused for a path that is not alive, a section of fewer than three points or of no area, or a value that is not finite.
1293
+
1294
+ Binding symbol `og_render_sweep_geometry` · publish builds: kept
1295
+
1296
+ ```ogt
1297
+ fn sweepGeometry {
1298
+ doc "Make a section swept along a path for og.Mesh, tapered and twisted by keys."
1299
+ param world World "The world whose renderer owns the geometry."
1300
+ param desc SweepGeometryDesc "The section, path, keys and caps."
1301
+ returns Result.Geometry "Refused for a path that is not alive, a section of fewer than three points or of no area, or a value that is not finite."
1302
+ }
1303
+ ```
1304
+
1305
+ <sub>`api.ogt` line 4726</sub>
1306
+
1307
+ <a id="fn-csgGeometry"></a>
1308
+
1309
+ ### `og.render.csgGeometry`
1310
+
1311
+ Make the union, difference or intersection of two placed geometries for og.Mesh. Chain calls for more operands (a cube minus six spheres is six calls); each result is a geometry like any other.
1312
+
1313
+ ```ts
1314
+ og.render.csgGeometry(world: World, desc?: CsgGeometryDesc): Result<Geometry>
1315
+ ```
1316
+
1317
+ | Parameter | Type | Optional | Doc |
1318
+ |---|---|---|---|
1319
+ | `world` | `World` | no | The world whose renderer owns the geometry. |
1320
+ | `desc` | `CsgGeometryDesc` | yes | The operation and its operands. |
1321
+
1322
+ **Returns** `Result<Geometry>`: Refused for a dead geometry, a placement with a zero scale, or a position that is not finite.
1323
+
1324
+ Binding symbol `og_render_csg_geometry` · publish builds: kept
1325
+
1326
+ ```ogt
1327
+ fn csgGeometry {
1328
+ doc "Make the union, difference or intersection of two placed geometries for og.Mesh. Chain calls for more operands (a cube minus six spheres is six calls); each result is a geometry like any other."
1329
+ param world World "The world whose renderer owns the geometry."
1330
+ param desc CsgGeometryDesc "The operation and its operands."
1331
+ returns Result.Geometry "Refused for a dead geometry, a placement with a zero scale, or a position that is not finite."
1332
+ }
1333
+ ```
1334
+
1335
+ <sub>`api.ogt` line 4733</sub>
1336
+
1337
+ <a id="fn-mergeGeometries"></a>
1338
+
1339
+ ### `og.render.mergeGeometries`
1340
+
1341
+ Make one geometry of several placed ones for og.Mesh: one draw instead of many, mirrored halves, arrays.
1342
+
1343
+ ```ts
1344
+ og.render.mergeGeometries(world: World, desc?: MergeGeometriesDesc): Result<Geometry>
1345
+ ```
1346
+
1347
+ | Parameter | Type | Optional | Doc |
1348
+ |---|---|---|---|
1349
+ | `world` | `World` | no | The world whose renderer owns the geometry. |
1350
+ | `desc` | `MergeGeometriesDesc` | yes | The parts and their placements. |
1351
+
1352
+ **Returns** `Result<Geometry>`: Refused for no parts, a dead geometry, or a placement with a zero scale.
1353
+
1354
+ Binding symbol `og_render_merge_geometries` · publish builds: kept
1355
+
1356
+ ```ogt
1357
+ fn mergeGeometries {
1358
+ doc "Make one geometry of several placed ones for og.Mesh: one draw instead of many, mirrored halves, arrays."
1359
+ param world World "The world whose renderer owns the geometry."
1360
+ param desc MergeGeometriesDesc "The parts and their placements."
1361
+ returns Result.Geometry "Refused for no parts, a dead geometry, or a placement with a zero scale."
1362
+ }
1363
+ ```
1364
+
1365
+ <sub>`api.ogt` line 4740</sub>
954
1366
 
955
1367
  <a id="fn-lines"></a>
956
1368
 
@@ -980,7 +1392,7 @@ fn lines {
980
1392
  }
981
1393
  ```
982
1394
 
983
- <sub>`api.ogt` line 4419</sub>
1395
+ <sub>`api.ogt` line 4798</sub>
984
1396
 
985
1397
  <a id="fn-points"></a>
986
1398
 
@@ -1010,7 +1422,7 @@ fn points {
1010
1422
  }
1011
1423
  ```
1012
1424
 
1013
- <sub>`api.ogt` line 4454</sub>
1425
+ <sub>`api.ogt` line 4833</sub>
1014
1426
 
1015
1427
  <a id="fn-raycast"></a>
1016
1428
 
@@ -1042,7 +1454,7 @@ fn raycast {
1042
1454
  }
1043
1455
  ```
1044
1456
 
1045
- <sub>`api.ogt` line 4558</sub>
1457
+ <sub>`api.ogt` line 4937</sub>
1046
1458
 
1047
1459
  <a id="fn-renderTarget"></a>
1048
1460
 
@@ -1072,7 +1484,7 @@ fn renderTarget {
1072
1484
  }
1073
1485
  ```
1074
1486
 
1075
- <sub>`api.ogt` line 4614</sub>
1487
+ <sub>`api.ogt` line 4993</sub>
1076
1488
 
1077
1489
  <a id="fn-setPostParam"></a>
1078
1490
 
@@ -1106,13 +1518,13 @@ fn setPostParam {
1106
1518
  }
1107
1519
  ```
1108
1520
 
1109
- <sub>`api.ogt` line 4726</sub>
1521
+ <sub>`api.ogt` line 5105</sub>
1110
1522
 
1111
1523
  <a id="fn-postErrors"></a>
1112
1524
 
1113
1525
  ### `og.render.postErrors`
1114
1526
 
1115
- The custom post passes PostEffects.custom1 to custom8 name that failed to compile on this device, each skipped (the frame draws as without it). The cook validates every pass for each back end, so this is a device's own refusal.
1527
+ The custom post passes PostEffects.custom names that failed to compile on this device, each skipped (the frame draws as without it). The cook validates every pass for each back end, so this is a device's own refusal.
1116
1528
 
1117
1529
  ```ts
1118
1530
  og.render.postErrors(world: World): readonly PostError[]
@@ -1128,13 +1540,13 @@ Binding symbol `og_render_post_errors` · publish builds: kept
1128
1540
 
1129
1541
  ```ogt
1130
1542
  fn postErrors {
1131
- doc "The custom post passes PostEffects.custom1 to custom8 name that failed to compile on this device, each skipped (the frame draws as without it). The cook validates every pass for each back end, so this is a device's own refusal."
1543
+ doc "The custom post passes PostEffects.custom names that failed to compile on this device, each skipped (the frame draws as without it). The cook validates every pass for each back end, so this is a device's own refusal."
1132
1544
  param world World "The world asked."
1133
1545
  returns List.PostError
1134
1546
  }
1135
1547
  ```
1136
1548
 
1137
- <sub>`api.ogt` line 4741</sub>
1549
+ <sub>`api.ogt` line 5120</sub>
1138
1550
 
1139
1551
  <a id="fn-bakedLighting"></a>
1140
1552
 
@@ -1162,7 +1574,7 @@ fn bakedLighting {
1162
1574
  }
1163
1575
  ```
1164
1576
 
1165
- <sub>`api.ogt` line 4809</sub>
1577
+ <sub>`api.ogt` line 5188</sub>
1166
1578
 
1167
1579
  ## Components, resources and events
1168
1580
 
@@ -1220,7 +1632,7 @@ component Mesh {
1220
1632
  }
1221
1633
  ```
1222
1634
 
1223
- <sub>`api.ogt` line 2505</sub>
1635
+ <sub>`api.ogt` line 2511</sub>
1224
1636
 
1225
1637
  <a id="record-DirectionalLight"></a>
1226
1638
 
@@ -1275,7 +1687,7 @@ component DirectionalLight {
1275
1687
  }
1276
1688
  ```
1277
1689
 
1278
- <sub>`api.ogt` line 2535</sub>
1690
+ <sub>`api.ogt` line 2541</sub>
1279
1691
 
1280
1692
  <a id="record-PointLight"></a>
1281
1693
 
@@ -1318,7 +1730,7 @@ component PointLight {
1318
1730
  }
1319
1731
  ```
1320
1732
 
1321
- <sub>`api.ogt` line 2567</sub>
1733
+ <sub>`api.ogt` line 2573</sub>
1322
1734
 
1323
1735
  <a id="record-SpotLight"></a>
1324
1736
 
@@ -1372,13 +1784,13 @@ component SpotLight {
1372
1784
  }
1373
1785
  ```
1374
1786
 
1375
- <sub>`api.ogt` line 2588</sub>
1787
+ <sub>`api.ogt` line 2594</sub>
1376
1788
 
1377
1789
  <a id="record-RenderSettings"></a>
1378
1790
 
1379
1791
  ### `og.RenderSettings` (resource)
1380
1792
 
1381
- The frame's look after lighting: environment light, sky, bloom, exposure metering and tone mapping. Read after each tick; it never feeds back into the simulation. Camera.exposure is the manual exposure.
1793
+ The frame's look after lighting: environment light, sky, bloom, exposure metering and tone mapping, and what the frame may cost: the quality fields (rectShadows to msaaSamples) that og.render.applyQuality sets from a graphics preset. Read after each tick; it never feeds back into the simulation. Camera.exposure is the manual exposure.
1382
1794
 
1383
1795
  Token `og.RenderSettings`, registered under the schema name `og.RenderSettings`; its value type is `RenderSettings`.
1384
1796
 
@@ -1397,12 +1809,21 @@ Token `og.RenderSettings`, registered under the schema name `og.RenderSettings`;
1397
1809
  | `toneMapping` | `ToneMapping` | `"aces"` | — | — | — | Which curve tone maps the frame while toneMapped is true: aces (the default), agx or none. |
1398
1810
  | `exposure` | `number` | `1` | 0 … 16 | — | tunable | A multiplier on every camera's Camera.exposure, as three.js renderer.toneMappingExposure is one for the whole frame: a look's brightness without touching the cameras; 1 leaves them as they are. |
1399
1811
  | `decalAtlas` | `Texture` | `0` | — | — | — | The texture Decal components take their uvMin to uvMax region from; 0 draws decals as solid colour. |
1400
- | `lodBias` | `number` | `1` | 0 … 16 | — | tunable | A multiplier on every model's projected size when its level of detail is picked (og.Model.lodBias multiplies it again): 1 is the engine's choice, 2 keeps full meshes twice as far, 0.5 simplifies sooner; 0 draws every model at its full mesh. |
1812
+ | `lodBias` | `number` | `1` | 0 … 16 | — | tunable | A multiplier on every model's projected level-of-detail error when its level is picked (og.Model.lodBias multiplies it again): a level is drawn while its error, measured by the cook against the full mesh, covers less than a pixel on the screen. 1 is the engine's choice, 2 keeps full meshes twice as far, 0.5 simplifies sooner; 0 draws every model at its full mesh. |
1401
1813
  | `bakedLighting` | `boolean` | `true` | — | — | — | Draw the baked lighting of the scenes that have it (og bake lightmaps): static models with their lightmaps, everything else inside a LightVolume with its probes. False draws every scene as if unbaked, its ambient light from the sky or the environment map: to compare, or to see the realtime lights alone. |
1814
+ | `quality` | `QualityPreset` | `"none"` | — | — | — | The graphics preset og.render.applyQuality last wrote into the quality fields below (rectShadows to msaaSamples), or none. A record for the settings screen and the probe: the renderer reads the fields, never this, so a field the game sets after the preset is drawn as set. |
1815
+ | `rectShadows` | `boolean` | `true` | — | — | — | Rect lights whose castShadow is on cast their soft shadows; false draws every rect light unshadowed, each keeping its castShadow for when this is on again. The low preset turns it off: a rect light's shadow is the costliest light in the frame. |
1816
+ | `shadowedLights` | `number` | `8` | 0 … 8 | — | — | At most this many point, spot and rect lights cast shadows in a frame, the brightest at the camera kept (RenderCapabilities.shadowedLights caps it); 0 casts none. The directional light's cascades are not counted. |
1817
+ | `shadowMapScale` | `number` | `1` | 0.125 … 4 | — | — | The shadow maps at this fraction of their full side: the directional light's cascades (2048 texels by default) and the local lights' layers (512), each kept within 64 texels and the device's limit (4096 for the cascades). Changing it makes the maps again at the next frame; RenderCapabilities.shadowMapSize is the cascades' side drawn. |
1818
+ | `volumetricFog` | `boolean` | `true` | — | — | — | An og.VolumetricFog is drawn lit, with its light shafts; false draws the same medium as plain distance and height fog. |
1819
+ | `softParticles` | `boolean` | `true` | — | — | — | Particles with a softDistance fade against the scene behind them; false draws them hard-edged and asks no depth prepass for them. |
1820
+ | `screenSpaceReflections` | `boolean` | `true` | — | — | — | PostEffects.ssr draws (on the full tier); false leaves smooth surfaces the reflection probes' and the environment's reflection. PostEffects keeps its settings either way. |
1821
+ | `ambientOcclusion` | `boolean` | `true` | — | — | — | PostEffects.ao darkens creases; false draws none. PostEffects keeps its settings either way. |
1822
+ | `msaaSamples` | `number` | `4` | 1 … 4 | — | — | Samples per pixel where the antialiasing multisamples (msaa, the WebGL2 tier's choice; RenderCapabilities.antialias): 4, or 1, which draws FXAA instead. TAA, FXAA and no antialiasing take one sample whatever it says. Changing it makes the multisampled targets and pipelines again at the next frame. |
1402
1823
 
1403
1824
  ```ogt
1404
1825
  resource RenderSettings {
1405
- doc "The frame's look after lighting: environment light, sky, bloom, exposure metering and tone mapping. Read after each tick; it never feeds back into the simulation. Camera.exposure is the manual exposure."
1826
+ doc "The frame's look after lighting: environment light, sky, bloom, exposure metering and tone mapping, and what the frame may cost: the quality fields (rectShadows to msaaSamples) that og.render.applyQuality sets from a graphics preset. Read after each tick; it never feeds back into the simulation. Camera.exposure is the manual exposure."
1406
1827
  field environmentIntensity f32 "The strength of the image-based ambient light from the sky; og.Environment.intensity takes its place while an environment map is set." {
1407
1828
  default 0.55
1408
1829
  min 0
@@ -1448,7 +1869,7 @@ resource RenderSettings {
1448
1869
  tunable true
1449
1870
  }
1450
1871
  field decalAtlas Texture "The texture Decal components take their uvMin to uvMax region from; 0 draws decals as solid colour."
1451
- field lodBias f32 "A multiplier on every model's projected size when its level of detail is picked (og.Model.lodBias multiplies it again): 1 is the engine's choice, 2 keeps full meshes twice as far, 0.5 simplifies sooner; 0 draws every model at its full mesh." {
1872
+ field lodBias f32 "A multiplier on every model's projected level-of-detail error when its level is picked (og.Model.lodBias multiplies it again): a level is drawn while its error, measured by the cook against the full mesh, covers less than a pixel on the screen. 1 is the engine's choice, 2 keeps full meshes twice as far, 0.5 simplifies sooner; 0 draws every model at its full mesh." {
1452
1873
  default 1
1453
1874
  min 0
1454
1875
  max 16
@@ -1457,10 +1878,41 @@ resource RenderSettings {
1457
1878
  field bakedLighting bool "Draw the baked lighting of the scenes that have it (og bake lightmaps): static models with their lightmaps, everything else inside a LightVolume with its probes. False draws every scene as if unbaked, its ambient light from the sky or the environment map: to compare, or to see the realtime lights alone." {
1458
1879
  default true
1459
1880
  }
1881
+ field quality QualityPreset "The graphics preset og.render.applyQuality last wrote into the quality fields below (rectShadows to msaaSamples), or none. A record for the settings screen and the probe: the renderer reads the fields, never this, so a field the game sets after the preset is drawn as set."
1882
+ field rectShadows bool "Rect lights whose castShadow is on cast their soft shadows; false draws every rect light unshadowed, each keeping its castShadow for when this is on again. The low preset turns it off: a rect light's shadow is the costliest light in the frame." {
1883
+ default true
1884
+ }
1885
+ field shadowedLights u32 "At most this many point, spot and rect lights cast shadows in a frame, the brightest at the camera kept (RenderCapabilities.shadowedLights caps it); 0 casts none. The directional light's cascades are not counted." {
1886
+ default 8
1887
+ min 0
1888
+ max 8
1889
+ }
1890
+ field shadowMapScale f32 "The shadow maps at this fraction of their full side: the directional light's cascades (2048 texels by default) and the local lights' layers (512), each kept within 64 texels and the device's limit (4096 for the cascades). Changing it makes the maps again at the next frame; RenderCapabilities.shadowMapSize is the cascades' side drawn." {
1891
+ default 1
1892
+ min 0.125
1893
+ max 4
1894
+ }
1895
+ field volumetricFog bool "An og.VolumetricFog is drawn lit, with its light shafts; false draws the same medium as plain distance and height fog." {
1896
+ default true
1897
+ }
1898
+ field softParticles bool "Particles with a softDistance fade against the scene behind them; false draws them hard-edged and asks no depth prepass for them." {
1899
+ default true
1900
+ }
1901
+ field screenSpaceReflections bool "PostEffects.ssr draws (on the full tier); false leaves smooth surfaces the reflection probes' and the environment's reflection. PostEffects keeps its settings either way." {
1902
+ default true
1903
+ }
1904
+ field ambientOcclusion bool "PostEffects.ao darkens creases; false draws none. PostEffects keeps its settings either way." {
1905
+ default true
1906
+ }
1907
+ field msaaSamples u32 "Samples per pixel where the antialiasing multisamples (msaa, the WebGL2 tier's choice; RenderCapabilities.antialias): 4, or 1, which draws FXAA instead. TAA, FXAA and no antialiasing take one sample whatever it says. Changing it makes the multisampled targets and pipelines again at the next frame." {
1908
+ default 4
1909
+ min 1
1910
+ max 4
1911
+ }
1460
1912
  }
1461
1913
  ```
1462
1914
 
1463
- <sub>`api.ogt` line 2634</sub>
1915
+ <sub>`api.ogt` line 2662</sub>
1464
1916
 
1465
1917
  <a id="record-Environment"></a>
1466
1918
 
@@ -1500,7 +1952,7 @@ resource Environment {
1500
1952
  }
1501
1953
  ```
1502
1954
 
1503
- <sub>`api.ogt` line 2719</sub>
1955
+ <sub>`api.ogt` line 2778</sub>
1504
1956
 
1505
1957
  <a id="record-PostEffects"></a>
1506
1958
 
@@ -1565,14 +2017,7 @@ Token `og.PostEffects`, registered under the schema name `og.PostEffects`; its v
1565
2017
  | `ssrSteps` | `number` | `32` | 4 … 128 | — | — | Steps along each ray (a binary refinement follows the hit). |
1566
2018
  | `ssrFade` | `number` | `0.15` | 0 … 1 | `ratio` | — | The fraction of the screen's edge, and of the march's end, over which a reflection fades into the probes'. |
1567
2019
  | `ssrIntensity` | `number` | `1` | 0 … 1 | — | tunable | How much of the reflection is laid over the frame; 1 is physically weighted by the surface's Fresnel. |
1568
- | `custom1` | `Post` | `0` | — | — | — | The first custom post pass (og.load.post, a `type post` asset; 0 is none). PostEffects.custom1 to custom8 are an ordered list, as many as og-render runs (RenderCapabilities.maxCustomPosts): each runs over the one before it (the lit image for the first), after depth of field and motion blur and before exposure, bloom and the tone curve, and reads the lit image, depth and normals too (it turns the prepass on). Its parameters are set with og.render.setPostParam. A pass the device fails to compile is reported (og.render.postErrors) and skipped. |
1569
- | `custom2` | `Post` | `0` | — | — | — | The second custom post pass, over the first's output (0 skips the slot). |
1570
- | `custom3` | `Post` | `0` | — | — | — | The third custom post pass. |
1571
- | `custom4` | `Post` | `0` | — | — | — | The fourth custom post pass. |
1572
- | `custom5` | `Post` | `0` | — | — | — | The fifth custom post pass. |
1573
- | `custom6` | `Post` | `0` | — | — | — | The sixth custom post pass. |
1574
- | `custom7` | `Post` | `0` | — | — | — | The seventh custom post pass. |
1575
- | `custom8` | `Post` | `0` | — | — | — | The eighth and last custom post pass, over every one before it. |
2020
+ | `custom` | `readonly Post[]` | `[]` | — | — | a list of at most 8 `Post` (`List.Post.8`): reads a frozen copy, writes a whole array | The custom post passes, in order (og.load.post, `type post` assets): at most RenderCapabilities.maxCustomPosts (8, og-render's MAX_CUSTOM_POSTS). Each runs over the one before it (the lit image for the first), after depth of field and motion blur and before exposure, bloom and the tone curve, and reads the lit image, depth and normals too (any pass turns the prepass on). Write the whole list: `post.custom = [grade, crt]`, `post.custom = []`; a look gives it on one line (`custom "post/tint.ogt" "post/crt.ogt"`). A 0 in it is skipped. Its parameters are set with og.render.setPostParam. A pass the device fails to compile is reported (og.render.postErrors) and skipped. |
1576
2021
 
1577
2022
  ```ogt
1578
2023
  resource PostEffects {
@@ -1778,18 +2223,11 @@ resource PostEffects {
1778
2223
  max 1
1779
2224
  tunable true
1780
2225
  }
1781
- field custom1 Post "The first custom post pass (og.load.post, a `type post` asset; 0 is none). PostEffects.custom1 to custom8 are an ordered list, as many as og-render runs (RenderCapabilities.maxCustomPosts): each runs over the one before it (the lit image for the first), after depth of field and motion blur and before exposure, bloom and the tone curve, and reads the lit image, depth and normals too (it turns the prepass on). Its parameters are set with og.render.setPostParam. A pass the device fails to compile is reported (og.render.postErrors) and skipped."
1782
- field custom2 Post "The second custom post pass, over the first's output (0 skips the slot)."
1783
- field custom3 Post "The third custom post pass."
1784
- field custom4 Post "The fourth custom post pass."
1785
- field custom5 Post "The fifth custom post pass."
1786
- field custom6 Post "The sixth custom post pass."
1787
- field custom7 Post "The seventh custom post pass."
1788
- field custom8 Post "The eighth and last custom post pass, over every one before it."
2226
+ field custom List.Post.8 "The custom post passes, in order (og.load.post, `type post` assets): at most RenderCapabilities.maxCustomPosts (8, og-render's MAX_CUSTOM_POSTS). Each runs over the one before it (the lit image for the first), after depth of field and motion blur and before exposure, bloom and the tone curve, and reads the lit image, depth and normals too (any pass turns the prepass on). Write the whole list: `post.custom = [grade, crt]`, `post.custom = []`; a look gives it on one line (`custom \"post/tint.ogt\" \"post/crt.ogt\"`). A 0 in it is skipped. Its parameters are set with og.render.setPostParam. A pass the device fails to compile is reported (og.render.postErrors) and skipped."
1789
2227
  }
1790
2228
  ```
1791
2229
 
1792
- <sub>`api.ogt` line 2799</sub>
2230
+ <sub>`api.ogt` line 2858</sub>
1793
2231
 
1794
2232
  <a id="record-Stylise"></a>
1795
2233
 
@@ -2044,7 +2482,7 @@ resource Stylise {
2044
2482
  }
2045
2483
  ```
2046
2484
 
2047
- <sub>`api.ogt` line 3055</sub>
2485
+ <sub>`api.ogt` line 3107</sub>
2048
2486
 
2049
2487
  <a id="record-MaterialStyle"></a>
2050
2488
 
@@ -2109,7 +2547,7 @@ resource MaterialStyle {
2109
2547
  }
2110
2548
  ```
2111
2549
 
2112
- <sub>`api.ogt` line 3248</sub>
2550
+ <sub>`api.ogt` line 3300</sub>
2113
2551
 
2114
2552
  <a id="record-Lighting2D"></a>
2115
2553
 
@@ -2148,7 +2586,7 @@ resource Lighting2D {
2148
2586
  }
2149
2587
  ```
2150
2588
 
2151
- <sub>`api.ogt` line 3298</sub>
2589
+ <sub>`api.ogt` line 3350</sub>
2152
2590
 
2153
2591
  <a id="record-Light2D"></a>
2154
2592
 
@@ -2199,7 +2637,7 @@ component Light2D {
2199
2637
  }
2200
2638
  ```
2201
2639
 
2202
- <sub>`api.ogt` line 3317</sub>
2640
+ <sub>`api.ogt` line 3369</sub>
2203
2641
 
2204
2642
  <a id="record-Occluder2D"></a>
2205
2643
 
@@ -2230,7 +2668,7 @@ component Occluder2D {
2230
2668
  }
2231
2669
  ```
2232
2670
 
2233
- <sub>`api.ogt` line 3347</sub>
2671
+ <sub>`api.ogt` line 3399</sub>
2234
2672
 
2235
2673
  <a id="record-Decal"></a>
2236
2674
 
@@ -2285,7 +2723,7 @@ component Decal {
2285
2723
  }
2286
2724
  ```
2287
2725
 
2288
- <sub>`api.ogt` line 3361</sub>
2726
+ <sub>`api.ogt` line 3413</sub>
2289
2727
 
2290
2728
  <a id="record-ParticleSystem"></a>
2291
2729
 
@@ -2322,7 +2760,7 @@ component ParticleSystem {
2322
2760
  }
2323
2761
  ```
2324
2762
 
2325
- <sub>`api.ogt` line 3395</sub>
2763
+ <sub>`api.ogt` line 3447</sub>
2326
2764
 
2327
2765
  <a id="record-Trail"></a>
2328
2766
 
@@ -2398,7 +2836,7 @@ component Trail {
2398
2836
  }
2399
2837
  ```
2400
2838
 
2401
- <sub>`api.ogt` line 3411</sub>
2839
+ <sub>`api.ogt` line 3463</sub>
2402
2840
 
2403
2841
  <a id="record-Beam"></a>
2404
2842
 
@@ -2464,7 +2902,7 @@ component Beam {
2464
2902
  }
2465
2903
  ```
2466
2904
 
2467
- <sub>`api.ogt` line 3459</sub>
2905
+ <sub>`api.ogt` line 3511</sub>
2468
2906
 
2469
2907
  <a id="record-Sprite"></a>
2470
2908
 
@@ -2599,7 +3037,7 @@ component Sprite {
2599
3037
  }
2600
3038
  ```
2601
3039
 
2602
- <sub>`api.ogt` line 3667</sub>
3040
+ <sub>`api.ogt` line 3719</sub>
2603
3041
 
2604
3042
  <a id="record-Afterimage"></a>
2605
3043
 
@@ -2647,7 +3085,7 @@ component Afterimage {
2647
3085
  }
2648
3086
  ```
2649
3087
 
2650
- <sub>`api.ogt` line 3755</sub>
3088
+ <sub>`api.ogt` line 3807</sub>
2651
3089
 
2652
3090
  <a id="record-ReflectionProbe"></a>
2653
3091
 
@@ -2700,7 +3138,7 @@ component ReflectionProbe {
2700
3138
  }
2701
3139
  ```
2702
3140
 
2703
- <sub>`api.ogt` line 3978</sub>
3141
+ <sub>`api.ogt` line 4032</sub>
2704
3142
 
2705
3143
  <a id="record-Lines"></a>
2706
3144
 
@@ -2763,7 +3201,7 @@ component Lines {
2763
3201
  }
2764
3202
  ```
2765
3203
 
2766
- <sub>`api.ogt` line 4461</sub>
3204
+ <sub>`api.ogt` line 4840</sub>
2767
3205
 
2768
3206
  <a id="record-Points"></a>
2769
3207
 
@@ -2817,7 +3255,7 @@ component Points {
2817
3255
  }
2818
3256
  ```
2819
3257
 
2820
- <sub>`api.ogt` line 4498</sub>
3258
+ <sub>`api.ogt` line 4877</sub>
2821
3259
 
2822
3260
  <a id="record-CameraView"></a>
2823
3261
 
@@ -2924,7 +3362,7 @@ component CameraView {
2924
3362
  }
2925
3363
  ```
2926
3364
 
2927
- <sub>`api.ogt` line 4621</sub>
3365
+ <sub>`api.ogt` line 5000</sub>
2928
3366
 
2929
3367
  <a id="record-Mirror"></a>
2930
3368
 
@@ -2969,7 +3407,7 @@ component Mirror {
2969
3407
  }
2970
3408
  ```
2971
3409
 
2972
- <sub>`api.ogt` line 4693</sub>
3410
+ <sub>`api.ogt` line 5072</sub>
2973
3411
 
2974
3412
  <a id="record-RectLight"></a>
2975
3413
 
@@ -3019,7 +3457,7 @@ component RectLight {
3019
3457
  }
3020
3458
  ```
3021
3459
 
3022
- <sub>`api.ogt` line 4755</sub>
3460
+ <sub>`api.ogt` line 5134</sub>
3023
3461
 
3024
3462
  <a id="record-LightVolume"></a>
3025
3463
 
@@ -3053,7 +3491,7 @@ component LightVolume {
3053
3491
  }
3054
3492
  ```
3055
3493
 
3056
- <sub>`api.ogt` line 4782</sub>
3494
+ <sub>`api.ogt` line 5161</sub>
3057
3495
 
3058
3496
  ## Types
3059
3497
 
@@ -3069,7 +3507,7 @@ A generational handle: a number the engine hands out. A dead handle is an error
3069
3507
  handle Geometry "Vertex and index data, as three.js BufferGeometry. Comes from a loaded glTF."
3070
3508
  ```
3071
3509
 
3072
- <sub>`api.ogt` line 2241</sub>
3510
+ <sub>`api.ogt` line 2247</sub>
3073
3511
 
3074
3512
  <a id="type-Material"></a>
3075
3513
 
@@ -3083,7 +3521,7 @@ A generational handle: a number the engine hands out. A dead handle is an error
3083
3521
  handle Material "A material instance."
3084
3522
  ```
3085
3523
 
3086
- <sub>`api.ogt` line 2242</sub>
3524
+ <sub>`api.ogt` line 2248</sub>
3087
3525
 
3088
3526
  <a id="type-Texture"></a>
3089
3527
 
@@ -3097,7 +3535,7 @@ A generational handle: a number the engine hands out. A dead handle is an error
3097
3535
  handle Texture "A cooked texture."
3098
3536
  ```
3099
3537
 
3100
- <sub>`api.ogt` line 2243</sub>
3538
+ <sub>`api.ogt` line 2249</sub>
3101
3539
 
3102
3540
  <a id="type-Side"></a>
3103
3541
 
@@ -3122,7 +3560,7 @@ enum Side {
3122
3560
  }
3123
3561
  ```
3124
3562
 
3125
- <sub>`api.ogt` line 2259</sub>
3563
+ <sub>`api.ogt` line 2265</sub>
3126
3564
 
3127
3565
  <a id="type-RenderTier"></a>
3128
3566
 
@@ -3153,7 +3591,7 @@ enum RenderTier {
3153
3591
  }
3154
3592
  ```
3155
3593
 
3156
- <sub>`api.ogt` line 2266</sub>
3594
+ <sub>`api.ogt` line 2272</sub>
3157
3595
 
3158
3596
  <a id="type-Antialias"></a>
3159
3597
 
@@ -3182,7 +3620,7 @@ enum Antialias {
3182
3620
  }
3183
3621
  ```
3184
3622
 
3185
- <sub>`api.ogt` line 2276</sub>
3623
+ <sub>`api.ogt` line 2282</sub>
3186
3624
 
3187
3625
  <a id="type-PointShadows"></a>
3188
3626
 
@@ -3207,7 +3645,7 @@ enum PointShadows {
3207
3645
  }
3208
3646
  ```
3209
3647
 
3210
- <sub>`api.ogt` line 2285</sub>
3648
+ <sub>`api.ogt` line 2291</sub>
3211
3649
 
3212
3650
  <a id="type-TaaHistory"></a>
3213
3651
 
@@ -3230,7 +3668,7 @@ enum TaaHistory {
3230
3668
  }
3231
3669
  ```
3232
3670
 
3233
- <sub>`api.ogt` line 2292</sub>
3671
+ <sub>`api.ogt` line 2298</sub>
3234
3672
 
3235
3673
  <a id="type-DebugView"></a>
3236
3674
 
@@ -3259,7 +3697,7 @@ enum DebugView {
3259
3697
  }
3260
3698
  ```
3261
3699
 
3262
- <sub>`api.ogt` line 2298</sub>
3700
+ <sub>`api.ogt` line 2304</sub>
3263
3701
 
3264
3702
  <a id="type-RenderOptions"></a>
3265
3703
 
@@ -3299,7 +3737,7 @@ struct RenderOptions {
3299
3737
  }
3300
3738
  ```
3301
3739
 
3302
- <sub>`api.ogt` line 2307</sub>
3740
+ <sub>`api.ogt` line 2313</sub>
3303
3741
 
3304
3742
  <a id="type-StandardMaterialDesc"></a>
3305
3743
 
@@ -3569,7 +4007,7 @@ struct StandardMaterialDesc {
3569
4007
  }
3570
4008
  ```
3571
4009
 
3572
- <sub>`api.ogt` line 2326</sub>
4010
+ <sub>`api.ogt` line 2332</sub>
3573
4011
 
3574
4012
  <a id="type-ToneMapping"></a>
3575
4013
 
@@ -3594,7 +4032,59 @@ enum ToneMapping {
3594
4032
  }
3595
4033
  ```
3596
4034
 
3597
- <sub>`api.ogt` line 2620</sub>
4035
+ <sub>`api.ogt` line 2626</sub>
4036
+
4037
+ <a id="type-GraphicsQuality"></a>
4038
+
4039
+ ### `GraphicsQuality` (enum)
4040
+
4041
+ A graphics preset: a row of RenderSettings' quality fields that og.render.applyQuality writes (its doc has the table). The settings screen (og.ui.settingsScreen) offers the three.
4042
+
4043
+ A string: one of the variants below. The zero value is `"medium"`.
4044
+
4045
+ | Variant | Doc |
4046
+ |---|---|
4047
+ | `"medium"` | The full frame: every quality field at its default. |
4048
+ | `"low"` | The cheapest frame: no rect-light shadows, two shadowed lights, half-size shadow maps, plain fog, hard particles, no screen-space reflections or ambient occlusion, FXAA for MSAA. |
4049
+ | `"high"` | The full frame with the shadow maps at twice their side. |
4050
+
4051
+ ```ogt
4052
+ enum GraphicsQuality {
4053
+ doc "A graphics preset: a row of RenderSettings' quality fields that og.render.applyQuality writes (its doc has the table). The settings screen (og.ui.settingsScreen) offers the three."
4054
+ variant medium "The full frame: every quality field at its default."
4055
+ variant low "The cheapest frame: no rect-light shadows, two shadowed lights, half-size shadow maps, plain fog, hard particles, no screen-space reflections or ambient occlusion, FXAA for MSAA."
4056
+ variant high "The full frame with the shadow maps at twice their side."
4057
+ }
4058
+ ```
4059
+
4060
+ <sub>`api.ogt` line 2640</sub>
4061
+
4062
+ <a id="type-QualityPreset"></a>
4063
+
4064
+ ### `QualityPreset` (enum)
4065
+
4066
+ The preset RenderSettings' quality fields were last written with (RenderSettings.quality).
4067
+
4068
+ A string: one of the variants below. The zero value is `"none"`.
4069
+
4070
+ | Variant | Doc |
4071
+ |---|---|
4072
+ | `"none"` | No preset applied: the fields are their defaults or the game's own. |
4073
+ | `"low"` | og.render.applyQuality(world, "low"). |
4074
+ | `"medium"` | og.render.applyQuality(world, "medium"). |
4075
+ | `"high"` | og.render.applyQuality(world, "high"). |
4076
+
4077
+ ```ogt
4078
+ enum QualityPreset {
4079
+ doc "The preset RenderSettings' quality fields were last written with (RenderSettings.quality)."
4080
+ variant none "No preset applied: the fields are their defaults or the game's own."
4081
+ variant low "og.render.applyQuality(world, \"low\")."
4082
+ variant medium "og.render.applyQuality(world, \"medium\")."
4083
+ variant high "og.render.applyQuality(world, \"high\")."
4084
+ }
4085
+ ```
4086
+
4087
+ <sub>`api.ogt` line 2647</sub>
3598
4088
 
3599
4089
  <a id="type-Lut"></a>
3600
4090
 
@@ -3608,7 +4098,7 @@ A generational handle: a number the engine hands out. A dead handle is an error
3608
4098
  handle Lut "A colour lookup table for PostEffects.lut, from og.load.lut (a `.cube` file)."
3609
4099
  ```
3610
4100
 
3611
- <sub>`api.ogt` line 2694</sub>
4101
+ <sub>`api.ogt` line 2753</sub>
3612
4102
 
3613
4103
  <a id="type-EnvironmentMap"></a>
3614
4104
 
@@ -3622,7 +4112,7 @@ A generational handle: a number the engine hands out. A dead handle is an error
3622
4112
  handle EnvironmentMap "A prefiltered HDR environment map for Environment.map, from og.load.environment (an `.ogt` of `type environment` naming an equirectangular `.hdr` or `.exr`, a KTX2 cube map, or six face images)."
3623
4113
  ```
3624
4114
 
3625
- <sub>`api.ogt` line 2695</sub>
4115
+ <sub>`api.ogt` line 2754</sub>
3626
4116
 
3627
4117
  <a id="type-ParticleEmitter"></a>
3628
4118
 
@@ -3636,7 +4126,7 @@ A generational handle: a number the engine hands out. A dead handle is an error
3636
4126
  handle ParticleEmitter "A particle emitter asset for ParticleSystem.emitter, from og.load.emitter (an `.ogt` of `type particles`)."
3637
4127
  ```
3638
4128
 
3639
- <sub>`api.ogt` line 2696</sub>
4129
+ <sub>`api.ogt` line 2755</sub>
3640
4130
 
3641
4131
  <a id="type-AoMethod"></a>
3642
4132
 
@@ -3661,7 +4151,7 @@ enum AoMethod {
3661
4151
  }
3662
4152
  ```
3663
4153
 
3664
- <sub>`api.ogt` line 2746</sub>
4154
+ <sub>`api.ogt` line 2805</sub>
3665
4155
 
3666
4156
  <a id="type-DofQuality"></a>
3667
4157
 
@@ -3684,7 +4174,7 @@ enum DofQuality {
3684
4174
  }
3685
4175
  ```
3686
4176
 
3687
- <sub>`api.ogt` line 2760</sub>
4177
+ <sub>`api.ogt` line 2819</sub>
3688
4178
 
3689
4179
  <a id="type-SpriteBlend"></a>
3690
4180
 
@@ -3707,7 +4197,7 @@ enum SpriteBlend {
3707
4197
  }
3708
4198
  ```
3709
4199
 
3710
- <sub>`api.ogt` line 2773</sub>
4200
+ <sub>`api.ogt` line 2832</sub>
3711
4201
 
3712
4202
  <a id="type-StripBlend"></a>
3713
4203
 
@@ -3730,7 +4220,7 @@ enum StripBlend {
3730
4220
  }
3731
4221
  ```
3732
4222
 
3733
- <sub>`api.ogt` line 2786</sub>
4223
+ <sub>`api.ogt` line 2845</sub>
3734
4224
 
3735
4225
  <a id="type-Palette"></a>
3736
4226
 
@@ -3744,7 +4234,7 @@ A generational handle: a number the engine hands out. A dead handle is an error
3744
4234
  handle Palette "A colour palette for Stylise.palette, from og.load.palette (a `.hex` or GIMP `.gpl` file of up to 256 colours)."
3745
4235
  ```
3746
4236
 
3747
- <sub>`api.ogt` line 3014</sub>
4237
+ <sub>`api.ogt` line 3066</sub>
3748
4238
 
3749
4239
  <a id="type-Look"></a>
3750
4240
 
@@ -3758,7 +4248,7 @@ A generational handle: a number the engine hands out. A dead handle is an error
3758
4248
  handle Look "A look from og.load.look (an `.ogt` of `type look`): the frame's whole art direction as data, applied with og.render.applyLook."
3759
4249
  ```
3760
4250
 
3761
- <sub>`api.ogt` line 3015</sub>
4251
+ <sub>`api.ogt` line 3067</sub>
3762
4252
 
3763
4253
  <a id="type-DitherPattern"></a>
3764
4254
 
@@ -3789,7 +4279,7 @@ enum DitherPattern {
3789
4279
  }
3790
4280
  ```
3791
4281
 
3792
- <sub>`api.ogt` line 3024</sub>
4282
+ <sub>`api.ogt` line 3076</sub>
3793
4283
 
3794
4284
  <a id="type-StyliseSpace"></a>
3795
4285
 
@@ -3814,7 +4304,7 @@ enum StyliseSpace {
3814
4304
  }
3815
4305
  ```
3816
4306
 
3817
- <sub>`api.ogt` line 3041</sub>
4307
+ <sub>`api.ogt` line 3093</sub>
3818
4308
 
3819
4309
  <a id="type-LookInfo"></a>
3820
4310
 
@@ -3845,7 +4335,7 @@ struct LookInfo {
3845
4335
  }
3846
4336
  ```
3847
4337
 
3848
- <sub>`api.ogt` line 3287</sub>
4338
+ <sub>`api.ogt` line 3339</sub>
3849
4339
 
3850
4340
  <a id="type-RibbonPoint"></a>
3851
4341
 
@@ -3885,7 +4375,7 @@ struct RibbonPoint {
3885
4375
  }
3886
4376
  ```
3887
4377
 
3888
- <sub>`api.ogt` line 3499</sub>
4378
+ <sub>`api.ogt` line 3551</sub>
3889
4379
 
3890
4380
  <a id="type-RibbonDesc"></a>
3891
4381
 
@@ -3916,7 +4406,7 @@ struct RibbonDesc {
3916
4406
  }
3917
4407
  ```
3918
4408
 
3919
- <sub>`api.ogt` line 3520</sub>
4409
+ <sub>`api.ogt` line 3572</sub>
3920
4410
 
3921
4411
  <a id="type-TextDesc"></a>
3922
4412
 
@@ -3978,7 +4468,7 @@ struct TextDesc {
3978
4468
  }
3979
4469
  ```
3980
4470
 
3981
- <sub>`api.ogt` line 3539</sub>
4471
+ <sub>`api.ogt` line 3591</sub>
3982
4472
 
3983
4473
  <a id="type-TextMeasureDesc"></a>
3984
4474
 
@@ -4007,7 +4497,7 @@ struct TextMeasureDesc {
4007
4497
  }
4008
4498
  ```
4009
4499
 
4010
- <sub>`api.ogt` line 3573</sub>
4500
+ <sub>`api.ogt` line 3625</sub>
4011
4501
 
4012
4502
  <a id="type-TextMetrics"></a>
4013
4503
 
@@ -4030,7 +4520,7 @@ struct TextMetrics {
4030
4520
  }
4031
4521
  ```
4032
4522
 
4033
- <sub>`api.ogt` line 3584</sub>
4523
+ <sub>`api.ogt` line 3636</sub>
4034
4524
 
4035
4525
  <a id="type-SpriteDesc"></a>
4036
4526
 
@@ -4141,7 +4631,7 @@ struct SpriteDesc {
4141
4631
  }
4142
4632
  ```
4143
4633
 
4144
- <sub>`api.ogt` line 3591</sub>
4634
+ <sub>`api.ogt` line 3643</sub>
4145
4635
 
4146
4636
  <a id="type-FloatingTextDesc"></a>
4147
4637
 
@@ -4229,7 +4719,7 @@ struct FloatingTextDesc {
4229
4719
  }
4230
4720
  ```
4231
4721
 
4232
- <sub>`api.ogt` line 3782</sub>
4722
+ <sub>`api.ogt` line 3834</sub>
4233
4723
 
4234
4724
  <a id="type-BoxGeometryDesc"></a>
4235
4725
 
@@ -4271,7 +4761,7 @@ struct BoxGeometryDesc {
4271
4761
  }
4272
4762
  ```
4273
4763
 
4274
- <sub>`api.ogt` line 3854</sub>
4764
+ <sub>`api.ogt` line 3906</sub>
4275
4765
 
4276
4766
  <a id="type-PlaneGeometryDesc"></a>
4277
4767
 
@@ -4307,7 +4797,7 @@ struct PlaneGeometryDesc {
4307
4797
  }
4308
4798
  ```
4309
4799
 
4310
- <sub>`api.ogt` line 3877</sub>
4800
+ <sub>`api.ogt` line 3929</sub>
4311
4801
 
4312
4802
  <a id="type-SphereGeometryDesc"></a>
4313
4803
 
@@ -4347,7 +4837,7 @@ struct SphereGeometryDesc {
4347
4837
  }
4348
4838
  ```
4349
4839
 
4350
- <sub>`api.ogt` line 3895</sub>
4840
+ <sub>`api.ogt` line 3947</sub>
4351
4841
 
4352
4842
  <a id="type-RenderCapabilities"></a>
4353
4843
 
@@ -4370,11 +4860,13 @@ What the renderer can do on this device. Backend limits are reported here, never
4370
4860
  | `reflectionProbes` | `number` | `0` | — | — | — | How many og.ReflectionProbe components one frame samples (MAX_REFLECTION_PROBES on every tier). |
4371
4861
  | `renderTargetDepth` | `boolean` | `false` | — | — | — | Whether a render target made with `depth` gets its view's depth drawn: true on every tier with a renderer (WebGPU, Vulkan, Metal and WebGL2 alike), false without one. The depth comes from the view's own depth prepass of its opaque meshes into a linear-depth colour target, never from its depth buffer, which WebGL2 cannot read in a shader. |
4372
4862
  | `maxRenderTargetSize` | `number` | `0` | — | — | — | The largest side of a render target (the device's largest 2D texture). |
4373
- | `maxCustomPosts` | `number` | `0` | — | — | — | The most custom post passes a frame runs: 8 on every tier, PostEffects.custom1 to custom8 (numbered fields, as a reflected record has no list field). |
4863
+ | `maxCustomPosts` | `number` | `0` | — | — | — | The most custom post passes a frame runs: 8 on every tier, PostEffects.custom's capacity. |
4374
4864
  | `volumetricFog` | `VolumetricFog` | `"froxel"` | — | — | — | How Fog.volumetric is drawn on this device: a froxel grid (the full tier) or a raymarch along each pixel's view ray (WebGL2), each lit by the sun through its shadows and by the point, spot and rect lights around each sample (up to volumetricLights of them) through their shadows and cookies. |
4375
4865
  | `volumetricLights` | `number` | `0` | — | — | — | The most point, spot and rect lights that light one sample of Fog.volumetric: those of its screen cluster, MAX_CLUSTER_LIGHTS (64) in the froxel grid, 8 in WebGL2's raymarch, the brightest at the camera first. |
4376
4866
  | `maxLightCookies` | `number` | `0` | — | — | — | The most light cookie layers one frame draws (24 on every tier): a SpotLight.cookie takes one, a PointLight.cookie six (its cube's faces), and a texture several lights of one kind share takes its layers once. Cookies past it, in the order of their lights' entities, are not drawn: those lights shine without them, and the log names them in a warning. |
4377
- | `gpuTimestamps` | `boolean` | `false` | — | — | — | Whether the device times each render pass on the GPU (timestamp queries: Vulkan, Metal and D3D12 adapters that have them, WebGPU with `timestamp-query`; never WebGL2): ProbeTimings.gpuPasses and the trace's gpu thread are filled only where it is true. |
4867
+ | `gpuTimestamps` | `boolean` | `false` | — | — | — | Whether the device times each render pass on the GPU (timestamp queries: Vulkan, Metal and D3D12 adapters that have them, WebGPU with `timestamp-query`; never WebGL2, and never in a publish build, which leaves the queries out): ProbeTimings.gpuPasses and the trace's gpu thread are filled only where it is true. |
4868
+ | `spriteAnisotropy` | `number` | `0` | — | — | — | The anisotropic filtering of sprites and og.ui's images (text is not filtered anisotropically: its distance field would lose its edge): 16 where the device filters anisotropically (WebGPU, Vulkan, Metal, WebGL2 with EXT_texture_filter_anisotropic), 1 where it has none and on a software rasterizer (the vulkan-cpu tier: lavapipe's anisotropic filter softens even an image drawn 1:1), 0 without a renderer. Above 1, an image squeezed along one axis keeps the other axis's detail: a style's nine-slice middle squeezed into a short button keeps its outline as crisp as the corners. At 1 the squeezed piece reads a smaller mip level and blurs; og.ui bounds a middle's squeeze at twice its art, so the outline there is one mip level softer than the corners. |
4869
+ | `world3d` | `boolean` | `false` | — | — | — | Whether the renderer draws the 3D world subsystems: terrain, planar water (og.Water), the 3D fluids, scattered copies and volumetric fog. False in the 2D profile's publish and lanes modules, which leave them out (a scene's are not drawn, og.terrain's calls and a SHAPE_HEIGHTFIELD collider answer a refusal naming this field, and `og build --publish` refuses a 2D project whose scenes hold og.Terrain, og.TerrainScatter, og.Water, og.WaterSurface or og.Fluid3D, by scene file and line); true in the 3D modules, the dev module and the native host. |
4378
4870
 
4379
4871
  ```ogt
4380
4872
  struct RenderCapabilities {
@@ -4392,15 +4884,17 @@ struct RenderCapabilities {
4392
4884
  field reflectionProbes u32 "How many og.ReflectionProbe components one frame samples (MAX_REFLECTION_PROBES on every tier)."
4393
4885
  field renderTargetDepth bool "Whether a render target made with `depth` gets its view's depth drawn: true on every tier with a renderer (WebGPU, Vulkan, Metal and WebGL2 alike), false without one. The depth comes from the view's own depth prepass of its opaque meshes into a linear-depth colour target, never from its depth buffer, which WebGL2 cannot read in a shader."
4394
4886
  field maxRenderTargetSize u32 "The largest side of a render target (the device's largest 2D texture)."
4395
- field maxCustomPosts u32 "The most custom post passes a frame runs: 8 on every tier, PostEffects.custom1 to custom8 (numbered fields, as a reflected record has no list field)."
4887
+ field maxCustomPosts u32 "The most custom post passes a frame runs: 8 on every tier, PostEffects.custom's capacity."
4396
4888
  field volumetricFog VolumetricFog "How Fog.volumetric is drawn on this device: a froxel grid (the full tier) or a raymarch along each pixel's view ray (WebGL2), each lit by the sun through its shadows and by the point, spot and rect lights around each sample (up to volumetricLights of them) through their shadows and cookies."
4397
4889
  field volumetricLights u32 "The most point, spot and rect lights that light one sample of Fog.volumetric: those of its screen cluster, MAX_CLUSTER_LIGHTS (64) in the froxel grid, 8 in WebGL2's raymarch, the brightest at the camera first."
4398
4890
  field maxLightCookies u32 "The most light cookie layers one frame draws (24 on every tier): a SpotLight.cookie takes one, a PointLight.cookie six (its cube's faces), and a texture several lights of one kind share takes its layers once. Cookies past it, in the order of their lights' entities, are not drawn: those lights shine without them, and the log names them in a warning."
4399
- field gpuTimestamps bool "Whether the device times each render pass on the GPU (timestamp queries: Vulkan, Metal and D3D12 adapters that have them, WebGPU with `timestamp-query`; never WebGL2): ProbeTimings.gpuPasses and the trace's gpu thread are filled only where it is true."
4891
+ field gpuTimestamps bool "Whether the device times each render pass on the GPU (timestamp queries: Vulkan, Metal and D3D12 adapters that have them, WebGPU with `timestamp-query`; never WebGL2, and never in a publish build, which leaves the queries out): ProbeTimings.gpuPasses and the trace's gpu thread are filled only where it is true."
4892
+ field spriteAnisotropy u32 "The anisotropic filtering of sprites and og.ui's images (text is not filtered anisotropically: its distance field would lose its edge): 16 where the device filters anisotropically (WebGPU, Vulkan, Metal, WebGL2 with EXT_texture_filter_anisotropic), 1 where it has none and on a software rasterizer (the vulkan-cpu tier: lavapipe's anisotropic filter softens even an image drawn 1:1), 0 without a renderer. Above 1, an image squeezed along one axis keeps the other axis's detail: a style's nine-slice middle squeezed into a short button keeps its outline as crisp as the corners. At 1 the squeezed piece reads a smaller mip level and blurs; og.ui bounds a middle's squeeze at twice its art, so the outline there is one mip level softer than the corners."
4893
+ field world3d bool "Whether the renderer draws the 3D world subsystems: terrain, planar water (og.Water), the 3D fluids, scattered copies and volumetric fog. False in the 2D profile's publish and lanes modules, which leave them out (a scene's are not drawn, og.terrain's calls and a SHAPE_HEIGHTFIELD collider answer a refusal naming this field, and `og build --publish` refuses a 2D project whose scenes hold og.Terrain, og.TerrainScatter, og.Water, og.WaterSurface or og.Fluid3D, by scene file and line); true in the 3D modules, the dev module and the native host."
4400
4894
  }
4401
4895
  ```
4402
4896
 
4403
- <sub>`api.ogt` line 3941</sub>
4897
+ <sub>`api.ogt` line 3993</sub>
4404
4898
 
4405
4899
  <a id="type-ReflectionProbeMode"></a>
4406
4900
 
@@ -4423,7 +4917,7 @@ enum ReflectionProbeMode {
4423
4917
  }
4424
4918
  ```
4425
4919
 
4426
- <sub>`api.ogt` line 3965</sub>
4920
+ <sub>`api.ogt` line 4019</sub>
4427
4921
 
4428
4922
  <a id="type-Shader"></a>
4429
4923
 
@@ -4437,7 +4931,7 @@ A generational handle: a number the engine hands out. A dead handle is an error
4437
4931
  handle Shader "A material shader from og.load.shader (an `.ogt` of `type shader`): WGSL hooks of the lit shader, or with `mode full` its own vertex and fragment entries, and the parameters they read."
4438
4932
  ```
4439
4933
 
4440
- <sub>`api.ogt` line 4025</sub>
4934
+ <sub>`api.ogt` line 4079</sub>
4441
4935
 
4442
4936
  <a id="type-BufferGeometryDesc"></a>
4443
4937
 
@@ -4478,7 +4972,7 @@ struct BufferGeometryDesc {
4478
4972
  }
4479
4973
  ```
4480
4974
 
4481
- <sub>`api.ogt` line 4080</sub>
4975
+ <sub>`api.ogt` line 4152</sub>
4482
4976
 
4483
4977
  <a id="type-GeometryInfo"></a>
4484
4978
 
@@ -4509,7 +5003,7 @@ struct GeometryInfo {
4509
5003
  }
4510
5004
  ```
4511
5005
 
4512
- <sub>`api.ogt` line 4096</sub>
5006
+ <sub>`api.ogt` line 4168</sub>
4513
5007
 
4514
5008
  <a id="type-CylinderGeometryDesc"></a>
4515
5009
 
@@ -4568,7 +5062,7 @@ struct CylinderGeometryDesc {
4568
5062
  }
4569
5063
  ```
4570
5064
 
4571
- <sub>`api.ogt` line 4131</sub>
5065
+ <sub>`api.ogt` line 4203</sub>
4572
5066
 
4573
5067
  <a id="type-ConeGeometryDesc"></a>
4574
5068
 
@@ -4612,7 +5106,7 @@ struct ConeGeometryDesc {
4612
5106
  }
4613
5107
  ```
4614
5108
 
4615
- <sub>`api.ogt` line 4167</sub>
5109
+ <sub>`api.ogt` line 4239</sub>
4616
5110
 
4617
5111
  <a id="type-CapsuleGeometryDesc"></a>
4618
5112
 
@@ -4659,7 +5153,7 @@ struct CapsuleGeometryDesc {
4659
5153
  }
4660
5154
  ```
4661
5155
 
4662
- <sub>`api.ogt` line 4191</sub>
5156
+ <sub>`api.ogt` line 4263</sub>
4663
5157
 
4664
5158
  <a id="type-TorusGeometryDesc"></a>
4665
5159
 
@@ -4706,7 +5200,7 @@ struct TorusGeometryDesc {
4706
5200
  }
4707
5201
  ```
4708
5202
 
4709
- <sub>`api.ogt` line 4218</sub>
5203
+ <sub>`api.ogt` line 4290</sub>
4710
5204
 
4711
5205
  <a id="type-RingGeometryDesc"></a>
4712
5206
 
@@ -4757,7 +5251,7 @@ struct RingGeometryDesc {
4757
5251
  }
4758
5252
  ```
4759
5253
 
4760
- <sub>`api.ogt` line 4245</sub>
5254
+ <sub>`api.ogt` line 4317</sub>
4761
5255
 
4762
5256
  <a id="type-CircleGeometryDesc"></a>
4763
5257
 
@@ -4797,7 +5291,7 @@ struct CircleGeometryDesc {
4797
5291
  }
4798
5292
  ```
4799
5293
 
4800
- <sub>`api.ogt` line 4275</sub>
5294
+ <sub>`api.ogt` line 4347</sub>
4801
5295
 
4802
5296
  <a id="type-TubeGeometryDesc"></a>
4803
5297
 
@@ -4841,7 +5335,499 @@ struct TubeGeometryDesc {
4841
5335
  }
4842
5336
  ```
4843
5337
 
4844
- <sub>`api.ogt` line 4296</sub>
5338
+ <sub>`api.ogt` line 4368</sub>
5339
+
5340
+ <a id="type-ShapePoints"></a>
5341
+
5342
+ ### `ShapePoints` (struct)
5343
+
5344
+ A shape as points, what og.Shape.extractPoints returns and what shapeGeometry, extrudeGeometry and sweepGeometry read: the outline, then each hole. A repeated closing point is dropped, as three.js drops it.
5345
+
5346
+ | Field | Type | Default | Range | Unit | Notes | Doc |
5347
+ |---|---|---|---|---|---|---|
5348
+ | `shape` | `readonly Vector2[]` | `[]` | — | — | — | The outline's points, in order. |
5349
+ | `holes` | `readonly (readonly Vector2[])[]` | `[]` | — | — | — | Each hole's points, in order. |
5350
+
5351
+ ```ogt
5352
+ struct ShapePoints {
5353
+ doc "A shape as points, what og.Shape.extractPoints returns and what shapeGeometry, extrudeGeometry and sweepGeometry read: the outline, then each hole. A repeated closing point is dropped, as three.js drops it."
5354
+ field shape List.Vector2 "The outline's points, in order."
5355
+ field holes List.List.Vector2 "Each hole's points, in order."
5356
+ }
5357
+ ```
5358
+
5359
+ <sub>`api.ogt` line 4442</sub>
5360
+
5361
+ <a id="type-ShapeGeometryDesc"></a>
5362
+
5363
+ ### `ShapeGeometryDesc` (desc struct)
5364
+
5365
+ A flat shape with holes in the xy plane facing +Z, as three.js ShapeGeometry(shapes, curveSegments): triangulated by earcut (three.js's own port), the outline made clockwise and the holes counter-clockwise first, so its vertices and triangles are three.js's for the same shape. uvs are world x and y (v flipped to run down the image).
5366
+
5367
+ A desc: every field may be omitted and takes its default; `{}` is valid.
5368
+
5369
+ | Field | Type | Default | Range | Unit | Notes | Doc |
5370
+ |---|---|---|---|---|---|---|
5371
+ | `shapes` | `Path2 \| readonly Path2[] \| readonly Vector2[] \| null` | `null` | — | — | — | One og.Shape (an og.Path2 is a shape without holes), a list of them, or the outline's points. Without it, three.js's default triangle (0, 0.5), (-0.5, -0.5), (0.5, -0.5). |
5372
+ | `curveSegments` | `number` | `12` | ≥ 1 | — | — | Points per curve when an og.Shape's curves are flattened (three.js extractPoints(curveSegments); an ellipse takes twice as many, a spline as many per point). |
5373
+ | `uvRepeat` | `Vector2` | `{ x: 1, y: 1 }` | — | — | — | How many times a texture repeats across it, along u and v: its UVs scaled by uvRepeat (three.js texture.repeat, here on the geometry; material textures sample with repeat wrapping). |
5374
+ | `physics` | `boolean` | `true` | — | — | — | Register it as a physics mesh too (BufferGeometryDesc.physics). |
5375
+ | `dynamic` | `boolean` | `false` | — | — | — | Whether og.render.updateGeometry may rewrite it later (BufferGeometryDesc.dynamic). |
5376
+
5377
+ ```ogt
5378
+ struct ShapeGeometryDesc {
5379
+ doc "A flat shape with holes in the xy plane facing +Z, as three.js ShapeGeometry(shapes, curveSegments): triangulated by earcut (three.js's own port), the outline made clockwise and the holes counter-clockwise first, so its vertices and triangles are three.js's for the same shape. uvs are world x and y (v flipped to run down the image)."
5380
+ desc true
5381
+ field shapes Option.OneOf.Path2.OneOf.List.Path2.List.Vector2 "One og.Shape (an og.Path2 is a shape without holes), a list of them, or the outline's points. Without it, three.js's default triangle (0, 0.5), (-0.5, -0.5), (0.5, -0.5)."
5382
+ field curveSegments u32 "Points per curve when an og.Shape's curves are flattened (three.js extractPoints(curveSegments); an ellipse takes twice as many, a spline as many per point)." {
5383
+ default 12
5384
+ min 1
5385
+ }
5386
+ field uvRepeat Vector2 "How many times a texture repeats across it, along u and v: its UVs scaled by uvRepeat (three.js texture.repeat, here on the geometry; material textures sample with repeat wrapping)." {
5387
+ default 1 1
5388
+ }
5389
+ field physics bool "Register it as a physics mesh too (BufferGeometryDesc.physics)." {
5390
+ default true
5391
+ }
5392
+ field dynamic bool "Whether og.render.updateGeometry may rewrite it later (BufferGeometryDesc.dynamic)."
5393
+ }
5394
+ ```
5395
+
5396
+ <sub>`api.ogt` line 4448</sub>
5397
+
5398
+ <a id="type-ExtrudeGeometryDesc"></a>
5399
+
5400
+ ### `ExtrudeGeometryDesc` (desc struct)
5401
+
5402
+ Shapes pushed along +Z, or along a path, as three.js ExtrudeGeometry(shapes, options) with its option names and defaults: a closed solid, its lids from earcut and its walls ring by ring, rounded by a bevel of bevelSegments rings at each face. Unindexed as three.js's (every triangle its own vertices, flat normals), three.js's vertex order and counts; uvs from three.js's WorldUVGenerator (v flipped to run down the image).
5403
+
5404
+ A desc: every field may be omitted and takes its default; `{}` is valid.
5405
+
5406
+ | Field | Type | Default | Range | Unit | Notes | Doc |
5407
+ |---|---|---|---|---|---|---|
5408
+ | `shapes` | `Path2 \| readonly Path2[] \| readonly Vector2[] \| null` | `null` | — | — | — | One og.Shape, a list of them, or the outline's points. Without it, three.js's default square of side 1. |
5409
+ | `depth` | `number` | `1` | ≥ 0 | `m` | — | How far the shape is pushed along +Z (without extrudePath). |
5410
+ | `steps` | `number` | `1` | ≥ 1 | — | — | Rings along the depth or the path. |
5411
+ | `bevelEnabled` | `boolean` | `true` | — | — | — | Round the edges of both faces. |
5412
+ | `bevelThickness` | `number` | `0.2` | ≥ 0 | `m` | — | How far the bevel reaches beyond each face, along z. |
5413
+ | `bevelSize` | `number \| null` | `null` | — | `m` | — | How far the bevel reaches out from the outline. Null or unset, bevelThickness - 0.1, as three.js derives it (0.1 at the default thickness, 0 at a thickness of 0.1). |
5414
+ | `bevelOffset` | `number` | `0` | — | `m` | — | How far the bevel starts out from the outline. |
5415
+ | `bevelSegments` | `number` | `3` | ≥ 1 | — | — | Rings in each bevel. |
5416
+ | `curveSegments` | `number` | `12` | ≥ 1 | — | — | Points per curve when an og.Shape's curves are flattened. |
5417
+ | `extrudePath` | `Path` | `0` | — | — | — | A path (og.path.create or og.path.find) to extrude along instead of +Z: the shape's x along the path's normal and y along its binormal (three.js's Frenet frames), steps rings evenly spaced along it. A path turns the bevel off, as three.js. 0 extrudes along +Z. |
5418
+ | `uvRepeat` | `Vector2` | `{ x: 1, y: 1 }` | — | — | — | How many times a texture repeats across it, along u and v: its UVs scaled by uvRepeat (three.js texture.repeat, here on the geometry; material textures sample with repeat wrapping). |
5419
+ | `physics` | `boolean` | `true` | — | — | — | Register it as a physics mesh too. |
5420
+ | `dynamic` | `boolean` | `false` | — | — | — | Whether og.render.updateGeometry may rewrite it later. |
5421
+
5422
+ ```ogt
5423
+ struct ExtrudeGeometryDesc {
5424
+ doc "Shapes pushed along +Z, or along a path, as three.js ExtrudeGeometry(shapes, options) with its option names and defaults: a closed solid, its lids from earcut and its walls ring by ring, rounded by a bevel of bevelSegments rings at each face. Unindexed as three.js's (every triangle its own vertices, flat normals), three.js's vertex order and counts; uvs from three.js's WorldUVGenerator (v flipped to run down the image)."
5425
+ desc true
5426
+ field shapes Option.OneOf.Path2.OneOf.List.Path2.List.Vector2 "One og.Shape, a list of them, or the outline's points. Without it, three.js's default square of side 1."
5427
+ field depth f32 "How far the shape is pushed along +Z (without extrudePath)." {
5428
+ default 1
5429
+ min 0
5430
+ unit m
5431
+ }
5432
+ field steps u32 "Rings along the depth or the path." {
5433
+ default 1
5434
+ min 1
5435
+ }
5436
+ field bevelEnabled bool "Round the edges of both faces." {
5437
+ default true
5438
+ }
5439
+ field bevelThickness f32 "How far the bevel reaches beyond each face, along z." {
5440
+ default 0.2
5441
+ min 0
5442
+ unit m
5443
+ }
5444
+ field bevelSize Option.f32 "How far the bevel reaches out from the outline. Null or unset, bevelThickness - 0.1, as three.js derives it (0.1 at the default thickness, 0 at a thickness of 0.1)." {
5445
+ unit m
5446
+ }
5447
+ field bevelOffset f32 "How far the bevel starts out from the outline." {
5448
+ unit m
5449
+ }
5450
+ field bevelSegments u32 "Rings in each bevel." {
5451
+ default 3
5452
+ min 1
5453
+ }
5454
+ field curveSegments u32 "Points per curve when an og.Shape's curves are flattened." {
5455
+ default 12
5456
+ min 1
5457
+ }
5458
+ field extrudePath Path "A path (og.path.create or og.path.find) to extrude along instead of +Z: the shape's x along the path's normal and y along its binormal (three.js's Frenet frames), steps rings evenly spaced along it. A path turns the bevel off, as three.js. 0 extrudes along +Z."
5459
+ field uvRepeat Vector2 "How many times a texture repeats across it, along u and v: its UVs scaled by uvRepeat (three.js texture.repeat, here on the geometry; material textures sample with repeat wrapping)." {
5460
+ default 1 1
5461
+ }
5462
+ field physics bool "Register it as a physics mesh too." {
5463
+ default true
5464
+ }
5465
+ field dynamic bool "Whether og.render.updateGeometry may rewrite it later."
5466
+ }
5467
+ ```
5468
+
5469
+ <sub>`api.ogt` line 4465</sub>
5470
+
5471
+ <a id="type-LatheGeometryDesc"></a>
5472
+
5473
+ ### `LatheGeometryDesc` (desc struct)
5474
+
5475
+ A profile turned round +Y, as three.js LatheGeometry(points, segments, phiStart, phiLength): vases, bottles, columns, wheels. three.js's vertices, indices and smooth normals; u round the axis, v along the profile (flipped to run down the image). A whole turn's seam meets exactly.
5476
+
5477
+ A desc: every field may be omitted and takes its default; `{}` is valid.
5478
+
5479
+ | Field | Type | Default | Range | Unit | Notes | Doc |
5480
+ |---|---|---|---|---|---|---|
5481
+ | `points` | `readonly Vector2[]` | `[]` | — | `m` | — | The profile, x the distance from the axis and y the height, in order (at least two). Without it, three.js's default (0, -0.5), (0.5, 0), (0, 0.5). |
5482
+ | `segments` | `number` | `12` | ≥ 1 | — | — | Segments round the axis. |
5483
+ | `phiStart` | `number` | `0` | — | `rad` | — | Where the turn starts, from +Z towards +X. |
5484
+ | `phiLength` | `number` | `6.283185307179586` | — | `rad` | — | How far it turns; 2 pi is whole (clamped to it). |
5485
+ | `uvRepeat` | `Vector2` | `{ x: 1, y: 1 }` | — | — | — | How many times a texture repeats across it, along u and v: its UVs scaled by uvRepeat (three.js texture.repeat, here on the geometry; material textures sample with repeat wrapping). |
5486
+ | `physics` | `boolean` | `true` | — | — | — | Register it as a physics mesh too. |
5487
+ | `dynamic` | `boolean` | `false` | — | — | — | Whether og.render.updateGeometry may rewrite it later. |
5488
+
5489
+ ```ogt
5490
+ struct LatheGeometryDesc {
5491
+ doc "A profile turned round +Y, as three.js LatheGeometry(points, segments, phiStart, phiLength): vases, bottles, columns, wheels. three.js's vertices, indices and smooth normals; u round the axis, v along the profile (flipped to run down the image). A whole turn's seam meets exactly."
5492
+ desc true
5493
+ field points List.Vector2 "The profile, x the distance from the axis and y the height, in order (at least two). Without it, three.js's default (0, -0.5), (0.5, 0), (0, 0.5)." {
5494
+ unit m
5495
+ }
5496
+ field segments u32 "Segments round the axis." {
5497
+ default 12
5498
+ min 1
5499
+ }
5500
+ field phiStart f32 "Where the turn starts, from +Z towards +X." {
5501
+ unit rad
5502
+ }
5503
+ field phiLength f32 "How far it turns; 2 pi is whole (clamped to it)." {
5504
+ default 6.283185307179586
5505
+ unit rad
5506
+ }
5507
+ field uvRepeat Vector2 "How many times a texture repeats across it, along u and v: its UVs scaled by uvRepeat (three.js texture.repeat, here on the geometry; material textures sample with repeat wrapping)." {
5508
+ default 1 1
5509
+ }
5510
+ field physics bool "Register it as a physics mesh too." {
5511
+ default true
5512
+ }
5513
+ field dynamic bool "Whether og.render.updateGeometry may rewrite it later."
5514
+ }
5515
+ ```
5516
+
5517
+ <sub>`api.ogt` line 4510</sub>
5518
+
5519
+ <a id="type-PolyhedronGeometryDesc"></a>
5520
+
5521
+ ### `PolyhedronGeometryDesc` (desc struct)
5522
+
5523
+ A polyhedron from vertices and faces, every face subdivided `detail` times and every vertex pushed onto the sphere of `radius`, as three.js PolyhedronGeometry(vertices, indices, radius, detail): unindexed, flat normals at detail 0 and the sphere's above, three.js's spherical uvs.
5524
+
5525
+ A desc: every field may be omitted and takes its default; `{}` is valid.
5526
+
5527
+ | Field | Type | Default | Range | Unit | Notes | Doc |
5528
+ |---|---|---|---|---|---|---|
5529
+ | `vertices` | `readonly number[]` | `[]` | — | — | — | The corners, x y z each (three.js's flat array). |
5530
+ | `indices` | `readonly number[]` | `[]` | — | — | — | The faces, three corner indices each, counter-clockwise seen from outside. |
5531
+ | `radius` | `number` | `1` | ≥ 0 | `m` | — | The sphere the vertices are pushed onto. |
5532
+ | `detail` | `number` | `0` | ≤ 64 | — | — | Subdivisions of each face: (detail + 1)² triangles a face. |
5533
+ | `uvRepeat` | `Vector2` | `{ x: 1, y: 1 }` | — | — | — | How many times a texture repeats across it, along u and v: its UVs scaled by uvRepeat (three.js texture.repeat, here on the geometry; material textures sample with repeat wrapping). |
5534
+ | `physics` | `boolean` | `true` | — | — | — | Register it as a physics mesh too. |
5535
+ | `dynamic` | `boolean` | `false` | — | — | — | Whether og.render.updateGeometry may rewrite it later. |
5536
+
5537
+ ```ogt
5538
+ struct PolyhedronGeometryDesc {
5539
+ doc "A polyhedron from vertices and faces, every face subdivided `detail` times and every vertex pushed onto the sphere of `radius`, as three.js PolyhedronGeometry(vertices, indices, radius, detail): unindexed, flat normals at detail 0 and the sphere's above, three.js's spherical uvs."
5540
+ desc true
5541
+ field vertices List.f32 "The corners, x y z each (three.js's flat array)."
5542
+ field indices List.u32 "The faces, three corner indices each, counter-clockwise seen from outside."
5543
+ field radius f32 "The sphere the vertices are pushed onto." {
5544
+ default 1
5545
+ min 0
5546
+ unit m
5547
+ }
5548
+ field detail u32 "Subdivisions of each face: (detail + 1)² triangles a face." {
5549
+ max 64
5550
+ }
5551
+ field uvRepeat Vector2 "How many times a texture repeats across it, along u and v: its UVs scaled by uvRepeat (three.js texture.repeat, here on the geometry; material textures sample with repeat wrapping)." {
5552
+ default 1 1
5553
+ }
5554
+ field physics bool "Register it as a physics mesh too." {
5555
+ default true
5556
+ }
5557
+ field dynamic bool "Whether og.render.updateGeometry may rewrite it later."
5558
+ }
5559
+ ```
5560
+
5561
+ <sub>`api.ogt` line 4536</sub>
5562
+
5563
+ <a id="type-SolidGeometryDesc"></a>
5564
+
5565
+ ### `SolidGeometryDesc` (desc struct)
5566
+
5567
+ A regular solid, as three.js IcosahedronGeometry, DodecahedronGeometry, OctahedronGeometry and TetrahedronGeometry(radius, detail): PolyhedronGeometryDesc with the solid's own vertices and faces. An icosahedron at detail 2 or more is a sphere with even triangles.
5568
+
5569
+ A desc: every field may be omitted and takes its default; `{}` is valid.
5570
+
5571
+ | Field | Type | Default | Range | Unit | Notes | Doc |
5572
+ |---|---|---|---|---|---|---|
5573
+ | `radius` | `number` | `1` | ≥ 0 | `m` | — | The radius. |
5574
+ | `detail` | `number` | `0` | ≤ 64 | — | — | Subdivisions of each face. |
5575
+ | `uvRepeat` | `Vector2` | `{ x: 1, y: 1 }` | — | — | — | How many times a texture repeats across it, along u and v: its UVs scaled by uvRepeat (three.js texture.repeat, here on the geometry; material textures sample with repeat wrapping). |
5576
+ | `physics` | `boolean` | `true` | — | — | — | Register it as a physics mesh too. |
5577
+ | `dynamic` | `boolean` | `false` | — | — | — | Whether og.render.updateGeometry may rewrite it later. |
5578
+
5579
+ ```ogt
5580
+ struct SolidGeometryDesc {
5581
+ doc "A regular solid, as three.js IcosahedronGeometry, DodecahedronGeometry, OctahedronGeometry and TetrahedronGeometry(radius, detail): PolyhedronGeometryDesc with the solid's own vertices and faces. An icosahedron at detail 2 or more is a sphere with even triangles."
5582
+ desc true
5583
+ field radius f32 "The radius." {
5584
+ default 1
5585
+ min 0
5586
+ unit m
5587
+ }
5588
+ field detail u32 "Subdivisions of each face." {
5589
+ max 64
5590
+ }
5591
+ field uvRepeat Vector2 "How many times a texture repeats across it, along u and v: its UVs scaled by uvRepeat (three.js texture.repeat, here on the geometry; material textures sample with repeat wrapping)." {
5592
+ default 1 1
5593
+ }
5594
+ field physics bool "Register it as a physics mesh too." {
5595
+ default true
5596
+ }
5597
+ field dynamic bool "Whether og.render.updateGeometry may rewrite it later."
5598
+ }
5599
+ ```
5600
+
5601
+ <sub>`api.ogt` line 4558</sub>
5602
+
5603
+ <a id="type-SweepKey"></a>
5604
+
5605
+ ### `SweepKey` (struct)
5606
+
5607
+ A value at a fraction of a sweep's path: linear between keys, held before the first and past the last.
5608
+
5609
+ | Field | Type | Default | Range | Unit | Notes | Doc |
5610
+ |---|---|---|---|---|---|---|
5611
+ | `t` | `number` | `0` | — | `ratio` | — | The fraction of the path's length, 0 to 1. |
5612
+ | `value` | `number` | `0` | — | — | — | The value there. |
5613
+
5614
+ ```ogt
5615
+ struct SweepKey {
5616
+ doc "A value at a fraction of a sweep's path: linear between keys, held before the first and past the last."
5617
+ field t f32 "The fraction of the path's length, 0 to 1." {
5618
+ unit ratio
5619
+ }
5620
+ field value f32 "The value there."
5621
+ }
5622
+ ```
5623
+
5624
+ <sub>`api.ogt` line 4578</sub>
5625
+
5626
+ <a id="type-SweepGeometryDesc"></a>
5627
+
5628
+ ### `SweepGeometryDesc` (desc struct)
5629
+
5630
+ A section swept along a path, scaled and twisted over it: horns, tusks, handles, blades, tapered pipes, twisted columns (img2threejs's tapered sweep; three.js has no class for it). The section's x lies along the path's normal and y along its binormal (three.js's Frenet frames), rings evenly spaced along the path's length; u runs along the path, v round the section (flipped to run down the image), the sides smooth. An open path's ends are capped.
5631
+
5632
+ A desc: every field may be omitted and takes its default; `{}` is valid.
5633
+
5634
+ | Field | Type | Default | Range | Unit | Notes | Doc |
5635
+ |---|---|---|---|---|---|---|
5636
+ | `section` | `Path2 \| readonly Vector2[] \| null` | `null` | — | — | — | The section's outline: an og.Shape or og.Path2 (flattened by curveSegments; holes are not swept) or its points, at least three, either winding. |
5637
+ | `path` | `Path` | `0` | — | — | — | The path (og.path.create or og.path.find). |
5638
+ | `steps` | `number` | `64` | ≥ 1 | — | — | Rings along the path, less one. |
5639
+ | `scale` | `readonly SweepKey[]` | `[]` | — | — | — | The section's scale over the path (none: 1 throughout). A horn: [{ t: 0, value: 1 }, { t: 1, value: 0.05 }]. |
5640
+ | `twist` | `readonly SweepKey[]` | `[]` | — | — | — | The section's turn round the path over its length, in radians (none: 0). |
5641
+ | `caps` | `boolean` | `true` | — | — | — | Close the ends of an open path. |
5642
+ | `curveSegments` | `number` | `12` | ≥ 1 | — | — | Points per curve when an og.Shape section is flattened. |
5643
+ | `uvRepeat` | `Vector2` | `{ x: 1, y: 1 }` | — | — | — | How many times a texture repeats across it, along u and v: its UVs scaled by uvRepeat (three.js texture.repeat, here on the geometry; material textures sample with repeat wrapping). |
5644
+ | `physics` | `boolean` | `true` | — | — | — | Register it as a physics mesh too. |
5645
+ | `dynamic` | `boolean` | `false` | — | — | — | Whether og.render.updateGeometry may rewrite it later. |
5646
+
5647
+ ```ogt
5648
+ struct SweepGeometryDesc {
5649
+ doc "A section swept along a path, scaled and twisted over it: horns, tusks, handles, blades, tapered pipes, twisted columns (img2threejs's tapered sweep; three.js has no class for it). The section's x lies along the path's normal and y along its binormal (three.js's Frenet frames), rings evenly spaced along the path's length; u runs along the path, v round the section (flipped to run down the image), the sides smooth. An open path's ends are capped."
5650
+ desc true
5651
+ field section Option.OneOf.Path2.List.Vector2 "The section's outline: an og.Shape or og.Path2 (flattened by curveSegments; holes are not swept) or its points, at least three, either winding."
5652
+ field path Path "The path (og.path.create or og.path.find)."
5653
+ field steps u32 "Rings along the path, less one." {
5654
+ default 64
5655
+ min 1
5656
+ }
5657
+ field scale List.SweepKey "The section's scale over the path (none: 1 throughout). A horn: [{ t: 0, value: 1 }, { t: 1, value: 0.05 }]."
5658
+ field twist List.SweepKey "The section's turn round the path over its length, in radians (none: 0)."
5659
+ field caps bool "Close the ends of an open path." {
5660
+ default true
5661
+ }
5662
+ field curveSegments u32 "Points per curve when an og.Shape section is flattened." {
5663
+ default 12
5664
+ min 1
5665
+ }
5666
+ field uvRepeat Vector2 "How many times a texture repeats across it, along u and v: its UVs scaled by uvRepeat (three.js texture.repeat, here on the geometry; material textures sample with repeat wrapping)." {
5667
+ default 1 1
5668
+ }
5669
+ field physics bool "Register it as a physics mesh too." {
5670
+ default true
5671
+ }
5672
+ field dynamic bool "Whether og.render.updateGeometry may rewrite it later."
5673
+ }
5674
+ ```
5675
+
5676
+ <sub>`api.ogt` line 4586</sub>
5677
+
5678
+ <a id="type-MirrorAxis"></a>
5679
+
5680
+ ### `MirrorAxis` (enum)
5681
+
5682
+ The world axis a part is mirrored along, after its placement.
5683
+
5684
+ A string: one of the variants below. The zero value is `"none"`.
5685
+
5686
+ | Variant | Doc |
5687
+ |---|---|
5688
+ | `"none"` | Not mirrored. |
5689
+ | `"x"` | x negated: the mirror image across the yz plane. |
5690
+ | `"y"` | y negated: across the xz plane. |
5691
+ | `"z"` | z negated: across the xy plane. |
5692
+
5693
+ ```ogt
5694
+ enum MirrorAxis {
5695
+ doc "The world axis a part is mirrored along, after its placement."
5696
+ variant none "Not mirrored."
5697
+ variant x "x negated: the mirror image across the yz plane."
5698
+ variant y "y negated: across the xz plane."
5699
+ variant z "z negated: across the xy plane."
5700
+ }
5701
+ ```
5702
+
5703
+ <sub>`api.ogt` line 4613</sub>
5704
+
5705
+ <a id="type-GeometryPart"></a>
5706
+
5707
+ ### `GeometryPart` (desc struct)
5708
+
5709
+ A geometry placed as an Object3D is (scale, then rotate, then move), then mirrored: one part of og.render.mergeGeometries or an operand of og.render.csgGeometry.
5710
+
5711
+ A desc: every field may be omitted and takes its default; `{}` is valid.
5712
+
5713
+ | Field | Type | Default | Range | Unit | Notes | Doc |
5714
+ |---|---|---|---|---|---|---|
5715
+ | `geometry` | `Geometry` | `0` | — | — | — | Any geometry: made, a primitive or a loaded glTF's. |
5716
+ | `position` | `Vector3` | `{ x: 0, y: 0, z: 0 }` | — | `m` | — | Where it goes. |
5717
+ | `quaternion` | `Quaternion` | `{ x: 0, y: 0, z: 0, w: 1 }` | — | — | — | How it turns. |
5718
+ | `scale` | `Vector3` | `{ x: 1, y: 1, z: 1 }` | — | — | — | Its scale (a negative component mirrors it as `mirror` does). |
5719
+ | `mirror` | `MirrorAxis` | `"none"` | — | — | — | Mirror it along a world axis after placing it: a symmetric prop is one half twice, the second mirrored. |
5720
+
5721
+ ```ogt
5722
+ struct GeometryPart {
5723
+ doc "A geometry placed as an Object3D is (scale, then rotate, then move), then mirrored: one part of og.render.mergeGeometries or an operand of og.render.csgGeometry."
5724
+ desc true
5725
+ field geometry Geometry "Any geometry: made, a primitive or a loaded glTF's."
5726
+ field position Vector3 "Where it goes." {
5727
+ unit m
5728
+ }
5729
+ field quaternion Quaternion "How it turns."
5730
+ field scale Vector3 "Its scale (a negative component mirrors it as `mirror` does)." {
5731
+ default 1 1 1
5732
+ }
5733
+ field mirror MirrorAxis "Mirror it along a world axis after placing it: a symmetric prop is one half twice, the second mirrored."
5734
+ }
5735
+ ```
5736
+
5737
+ <sub>`api.ogt` line 4621</sub>
5738
+
5739
+ <a id="type-CsgOp"></a>
5740
+
5741
+ ### `CsgOp` (enum)
5742
+
5743
+ A boolean operation on two solids.
5744
+
5745
+ A string: one of the variants below. The zero value is `"union"`.
5746
+
5747
+ | Variant | Doc |
5748
+ |---|---|
5749
+ | `"union"` | Everything in either: a + b. |
5750
+ | `"subtract"` | What of a is not in b: a - b (holes, notches, a dice's pips). |
5751
+ | `"intersect"` | What is in both. |
5752
+
5753
+ ```ogt
5754
+ enum CsgOp {
5755
+ doc "A boolean operation on two solids."
5756
+ variant union "Everything in either: a + b."
5757
+ variant subtract "What of a is not in b: a - b (holes, notches, a dice's pips)."
5758
+ variant intersect "What is in both."
5759
+ }
5760
+ ```
5761
+
5762
+ <sub>`api.ogt` line 4635</sub>
5763
+
5764
+ <a id="type-CsgGeometryDesc"></a>
5765
+
5766
+ ### `CsgGeometryDesc` (desc struct)
5767
+
5768
+ Two closed geometries combined by a boolean operation, each placed first: a box with a hole bored through it, a dice, a window cut in a wall. The result is closed when both are (every edge shared by two triangles, wound opposite), every piece keeps its source's normals, uvs and colours (b's turned inside out where it is subtracted). Where a plane side or an edge crossing is decided, the decision is exact (Shewchuk's predicates), so every host makes the same cuts; faces that coincide keep one copy or none, as the operation says.
5769
+
5770
+ A desc: every field may be omitted and takes its default; `{}` is valid.
5771
+
5772
+ | Field | Type | Default | Range | Unit | Notes | Doc |
5773
+ |---|---|---|---|---|---|---|
5774
+ | `op` | `CsgOp` | `"union"` | — | — | — | The operation. |
5775
+ | `a` | `GeometryPart` | `{}` | — | — | — | The first operand. |
5776
+ | `b` | `GeometryPart` | `{}` | — | — | — | The second operand. |
5777
+ | `uvRepeat` | `Vector2` | `{ x: 1, y: 1 }` | — | — | — | How many times a texture repeats across it, along u and v: its UVs scaled by uvRepeat (three.js texture.repeat, here on the geometry; material textures sample with repeat wrapping). |
5778
+ | `physics` | `boolean` | `true` | — | — | — | Register it as a physics mesh too. |
5779
+ | `dynamic` | `boolean` | `false` | — | — | — | Whether og.render.updateGeometry may rewrite it later. |
5780
+
5781
+ ```ogt
5782
+ struct CsgGeometryDesc {
5783
+ doc "Two closed geometries combined by a boolean operation, each placed first: a box with a hole bored through it, a dice, a window cut in a wall. The result is closed when both are (every edge shared by two triangles, wound opposite), every piece keeps its source's normals, uvs and colours (b's turned inside out where it is subtracted). Where a plane side or an edge crossing is decided, the decision is exact (Shewchuk's predicates), so every host makes the same cuts; faces that coincide keep one copy or none, as the operation says."
5784
+ desc true
5785
+ field op CsgOp "The operation."
5786
+ field a GeometryPart "The first operand."
5787
+ field b GeometryPart "The second operand."
5788
+ field uvRepeat Vector2 "How many times a texture repeats across it, along u and v: its UVs scaled by uvRepeat (three.js texture.repeat, here on the geometry; material textures sample with repeat wrapping)." {
5789
+ default 1 1
5790
+ }
5791
+ field physics bool "Register it as a physics mesh too." {
5792
+ default true
5793
+ }
5794
+ field dynamic bool "Whether og.render.updateGeometry may rewrite it later."
5795
+ }
5796
+ ```
5797
+
5798
+ <sub>`api.ogt` line 4642</sub>
5799
+
5800
+ <a id="type-MergeGeometriesDesc"></a>
5801
+
5802
+ ### `MergeGeometriesDesc` (desc struct)
5803
+
5804
+ Geometries placed and merged into one, as three.js BufferGeometryUtils.mergeGeometries after applying each part's matrix: a prop of parts drawn in one draw, a mirrored half, an array (the same part at several placements). Normals follow each placement; a mirrored part turns its triangles so they still face out. Vertex colours are kept when any part has them.
5805
+
5806
+ A desc: every field may be omitted and takes its default; `{}` is valid.
5807
+
5808
+ | Field | Type | Default | Range | Unit | Notes | Doc |
5809
+ |---|---|---|---|---|---|---|
5810
+ | `parts` | `readonly GeometryPart[]` | `[]` | — | — | — | The parts, in order (at least one). |
5811
+ | `uvRepeat` | `Vector2` | `{ x: 1, y: 1 }` | — | — | — | How many times a texture repeats across it, along u and v: its UVs scaled by uvRepeat (three.js texture.repeat, here on the geometry; material textures sample with repeat wrapping). |
5812
+ | `physics` | `boolean` | `true` | — | — | — | Register it as a physics mesh too. |
5813
+ | `dynamic` | `boolean` | `false` | — | — | — | Whether og.render.updateGeometry may rewrite it later. |
5814
+
5815
+ ```ogt
5816
+ struct MergeGeometriesDesc {
5817
+ doc "Geometries placed and merged into one, as three.js BufferGeometryUtils.mergeGeometries after applying each part's matrix: a prop of parts drawn in one draw, a mirrored half, an array (the same part at several placements). Normals follow each placement; a mirrored part turns its triangles so they still face out. Vertex colours are kept when any part has them."
5818
+ desc true
5819
+ field parts List.GeometryPart "The parts, in order (at least one)."
5820
+ field uvRepeat Vector2 "How many times a texture repeats across it, along u and v: its UVs scaled by uvRepeat (three.js texture.repeat, here on the geometry; material textures sample with repeat wrapping)." {
5821
+ default 1 1
5822
+ }
5823
+ field physics bool "Register it as a physics mesh too." {
5824
+ default true
5825
+ }
5826
+ field dynamic bool "Whether og.render.updateGeometry may rewrite it later."
5827
+ }
5828
+ ```
5829
+
5830
+ <sub>`api.ogt` line 4657</sub>
4845
5831
 
4846
5832
  <a id="type-LineMode"></a>
4847
5833
 
@@ -4866,7 +5852,7 @@ enum LineMode {
4866
5852
  }
4867
5853
  ```
4868
5854
 
4869
- <sub>`api.ogt` line 4368</sub>
5855
+ <sub>`api.ogt` line 4747</sub>
4870
5856
 
4871
5857
  <a id="type-LinesDesc"></a>
4872
5858
 
@@ -4932,7 +5918,7 @@ struct LinesDesc {
4932
5918
  }
4933
5919
  ```
4934
5920
 
4935
- <sub>`api.ogt` line 4382</sub>
5921
+ <sub>`api.ogt` line 4761</sub>
4936
5922
 
4937
5923
  <a id="type-PointsDesc"></a>
4938
5924
 
@@ -4983,7 +5969,7 @@ struct PointsDesc {
4983
5969
  }
4984
5970
  ```
4985
5971
 
4986
- <sub>`api.ogt` line 4426</sub>
5972
+ <sub>`api.ogt` line 4805</sub>
4987
5973
 
4988
5974
  <a id="type-RaycastGeometryDesc"></a>
4989
5975
 
@@ -5016,7 +6002,7 @@ struct RaycastGeometryDesc {
5016
6002
  }
5017
6003
  ```
5018
6004
 
5019
- <sub>`api.ogt` line 4529</sub>
6005
+ <sub>`api.ogt` line 4908</sub>
5020
6006
 
5021
6007
  <a id="type-GeometryHit"></a>
5022
6008
 
@@ -5051,7 +6037,7 @@ struct GeometryHit {
5051
6037
  }
5052
6038
  ```
5053
6039
 
5054
- <sub>`api.ogt` line 4543</sub>
6040
+ <sub>`api.ogt` line 4922</sub>
5055
6041
 
5056
6042
  <a id="type-RenderTargetFormat"></a>
5057
6043
 
@@ -5074,7 +6060,7 @@ enum RenderTargetFormat {
5074
6060
  }
5075
6061
  ```
5076
6062
 
5077
- <sub>`api.ogt` line 4568</sub>
6063
+ <sub>`api.ogt` line 4947</sub>
5078
6064
 
5079
6065
  <a id="type-RenderTarget"></a>
5080
6066
 
@@ -5088,7 +6074,7 @@ A generational handle: a number the engine hands out. A dead handle is an error
5088
6074
  handle RenderTarget "A texture a camera draws into (og.render.renderTarget), as three.js WebGLRenderTarget."
5089
6075
  ```
5090
6076
 
5091
- <sub>`api.ogt` line 4581</sub>
6077
+ <sub>`api.ogt` line 4960</sub>
5092
6078
 
5093
6079
  <a id="type-RenderTargetDesc"></a>
5094
6080
 
@@ -5122,7 +6108,7 @@ struct RenderTargetDesc {
5122
6108
  }
5123
6109
  ```
5124
6110
 
5125
- <sub>`api.ogt` line 4590</sub>
6111
+ <sub>`api.ogt` line 4969</sub>
5126
6112
 
5127
6113
  <a id="type-RenderTargetInfo"></a>
5128
6114
 
@@ -5149,7 +6135,7 @@ struct RenderTargetInfo {
5149
6135
  }
5150
6136
  ```
5151
6137
 
5152
- <sub>`api.ogt` line 4605</sub>
6138
+ <sub>`api.ogt` line 4984</sub>
5153
6139
 
5154
6140
  <a id="type-Post"></a>
5155
6141
 
@@ -5163,7 +6149,7 @@ A generational handle: a number the engine hands out. A dead handle is an error
5163
6149
  handle Post "A custom post pass from og.load.post (an `.ogt` of `type post`): a WGSL `post` function over the lit image and the parameters it reads."
5164
6150
  ```
5165
6151
 
5166
- <sub>`api.ogt` line 4717</sub>
6152
+ <sub>`api.ogt` line 5096</sub>
5167
6153
 
5168
6154
  <a id="type-PostError"></a>
5169
6155
 
@@ -5184,7 +6170,7 @@ struct PostError {
5184
6170
  }
5185
6171
  ```
5186
6172
 
5187
- <sub>`api.ogt` line 4735</sub>
6173
+ <sub>`api.ogt` line 5114</sub>
5188
6174
 
5189
6175
  <a id="type-VolumetricFog"></a>
5190
6176
 
@@ -5207,7 +6193,7 @@ enum VolumetricFog {
5207
6193
  }
5208
6194
  ```
5209
6195
 
5210
- <sub>`api.ogt` line 4749</sub>
6196
+ <sub>`api.ogt` line 5128</sub>
5211
6197
 
5212
6198
  <a id="type-BakedScene"></a>
5213
6199
 
@@ -5240,7 +6226,7 @@ struct BakedScene {
5240
6226
  }
5241
6227
  ```
5242
6228
 
5243
- <sub>`api.ogt` line 4797</sub>
6229
+ <sub>`api.ogt` line 5176</sub>
5244
6230
 
5245
6231
  ## Column kinds
5246
6232
 
@@ -5251,6 +6237,7 @@ Each is a factory, `Geometry(value?, options?)`, that makes one field of a compo
5251
6237
  | <a id="column-Geometry"></a>`Geometry` | `Geometry` | `Uint32Array` | 2 | A Geometry handle field. |
5252
6238
  | <a id="column-Material"></a>`Material` | `Material` | `Uint32Array` | 2 | A Material handle field. |
5253
6239
  | <a id="column-ToneMapping"></a>`ToneMapping` | `ToneMapping` | `Uint32Array` | 1 | A ToneMapping field: the variant's index. |
6240
+ | <a id="column-QualityPreset"></a>`QualityPreset` | `QualityPreset` | `Uint32Array` | 1 | A QualityPreset field: the variant's index. |
5254
6241
  | <a id="column-Texture"></a>`Texture` | `Texture` | `Uint32Array` | 2 | A Texture handle field (0 is none). |
5255
6242
  | <a id="column-Lut"></a>`Lut` | `Lut` | `Uint32Array` | 2 | A Lut handle field (0 is none). |
5256
6243
  | <a id="column-EnvironmentMap"></a>`EnvironmentMap` | `EnvironmentMap` | `Uint32Array` | 2 | An EnvironmentMap handle field (0 is none). |
@@ -5277,7 +6264,7 @@ column Geometry {
5277
6264
  }
5278
6265
  ```
5279
6266
 
5280
- <sub>`api.ogt` line 2245</sub>
6267
+ <sub>`api.ogt` line 2251</sub>
5281
6268
 
5282
6269
  ```ogt
5283
6270
  column Material {
@@ -5288,7 +6275,7 @@ column Material {
5288
6275
  }
5289
6276
  ```
5290
6277
 
5291
- <sub>`api.ogt` line 2252</sub>
6278
+ <sub>`api.ogt` line 2258</sub>
5292
6279
 
5293
6280
  ```ogt
5294
6281
  column ToneMapping {
@@ -5299,7 +6286,18 @@ column ToneMapping {
5299
6286
  }
5300
6287
  ```
5301
6288
 
5302
- <sub>`api.ogt` line 2627</sub>
6289
+ <sub>`api.ogt` line 2633</sub>
6290
+
6291
+ ```ogt
6292
+ column QualityPreset {
6293
+ doc "A QualityPreset field: the variant's index."
6294
+ array Uint32Array
6295
+ stride 1
6296
+ value QualityPreset
6297
+ }
6298
+ ```
6299
+
6300
+ <sub>`api.ogt` line 2655</sub>
5303
6301
 
5304
6302
  ```ogt
5305
6303
  column Texture {
@@ -5310,7 +6308,7 @@ column Texture {
5310
6308
  }
5311
6309
  ```
5312
6310
 
5313
- <sub>`api.ogt` line 2698</sub>
6311
+ <sub>`api.ogt` line 2757</sub>
5314
6312
 
5315
6313
  ```ogt
5316
6314
  column Lut {
@@ -5321,7 +6319,7 @@ column Lut {
5321
6319
  }
5322
6320
  ```
5323
6321
 
5324
- <sub>`api.ogt` line 2705</sub>
6322
+ <sub>`api.ogt` line 2764</sub>
5325
6323
 
5326
6324
  ```ogt
5327
6325
  column EnvironmentMap {
@@ -5332,7 +6330,7 @@ column EnvironmentMap {
5332
6330
  }
5333
6331
  ```
5334
6332
 
5335
- <sub>`api.ogt` line 2712</sub>
6333
+ <sub>`api.ogt` line 2771</sub>
5336
6334
 
5337
6335
  ```ogt
5338
6336
  column ParticleEmitter {
@@ -5343,7 +6341,7 @@ column ParticleEmitter {
5343
6341
  }
5344
6342
  ```
5345
6343
 
5346
- <sub>`api.ogt` line 2739</sub>
6344
+ <sub>`api.ogt` line 2798</sub>
5347
6345
 
5348
6346
  ```ogt
5349
6347
  column AoMethod {
@@ -5354,7 +6352,7 @@ column AoMethod {
5354
6352
  }
5355
6353
  ```
5356
6354
 
5357
- <sub>`api.ogt` line 2753</sub>
6355
+ <sub>`api.ogt` line 2812</sub>
5358
6356
 
5359
6357
  ```ogt
5360
6358
  column DofQuality {
@@ -5365,7 +6363,7 @@ column DofQuality {
5365
6363
  }
5366
6364
  ```
5367
6365
 
5368
- <sub>`api.ogt` line 2766</sub>
6366
+ <sub>`api.ogt` line 2825</sub>
5369
6367
 
5370
6368
  ```ogt
5371
6369
  column SpriteBlend {
@@ -5376,7 +6374,7 @@ column SpriteBlend {
5376
6374
  }
5377
6375
  ```
5378
6376
 
5379
- <sub>`api.ogt` line 2779</sub>
6377
+ <sub>`api.ogt` line 2838</sub>
5380
6378
 
5381
6379
  ```ogt
5382
6380
  column StripBlend {
@@ -5387,7 +6385,7 @@ column StripBlend {
5387
6385
  }
5388
6386
  ```
5389
6387
 
5390
- <sub>`api.ogt` line 2792</sub>
6388
+ <sub>`api.ogt` line 2851</sub>
5391
6389
 
5392
6390
  ```ogt
5393
6391
  column Palette {
@@ -5398,7 +6396,7 @@ column Palette {
5398
6396
  }
5399
6397
  ```
5400
6398
 
5401
- <sub>`api.ogt` line 3017</sub>
6399
+ <sub>`api.ogt` line 3069</sub>
5402
6400
 
5403
6401
  ```ogt
5404
6402
  column DitherPattern {
@@ -5409,7 +6407,7 @@ column DitherPattern {
5409
6407
  }
5410
6408
  ```
5411
6409
 
5412
- <sub>`api.ogt` line 3034</sub>
6410
+ <sub>`api.ogt` line 3086</sub>
5413
6411
 
5414
6412
  ```ogt
5415
6413
  column StyliseSpace {
@@ -5420,7 +6418,7 @@ column StyliseSpace {
5420
6418
  }
5421
6419
  ```
5422
6420
 
5423
- <sub>`api.ogt` line 3048</sub>
6421
+ <sub>`api.ogt` line 3100</sub>
5424
6422
 
5425
6423
  ```ogt
5426
6424
  column ReflectionProbeMode {
@@ -5431,7 +6429,7 @@ column ReflectionProbeMode {
5431
6429
  }
5432
6430
  ```
5433
6431
 
5434
- <sub>`api.ogt` line 3971</sub>
6432
+ <sub>`api.ogt` line 4025</sub>
5435
6433
 
5436
6434
  ```ogt
5437
6435
  column LineMode {
@@ -5442,7 +6440,7 @@ column LineMode {
5442
6440
  }
5443
6441
  ```
5444
6442
 
5445
- <sub>`api.ogt` line 4375</sub>
6443
+ <sub>`api.ogt` line 4754</sub>
5446
6444
 
5447
6445
  ```ogt
5448
6446
  column RenderTargetFormat {
@@ -5453,7 +6451,7 @@ column RenderTargetFormat {
5453
6451
  }
5454
6452
  ```
5455
6453
 
5456
- <sub>`api.ogt` line 4574</sub>
6454
+ <sub>`api.ogt` line 4953</sub>
5457
6455
 
5458
6456
  ```ogt
5459
6457
  column RenderTarget {
@@ -5464,7 +6462,7 @@ column RenderTarget {
5464
6462
  }
5465
6463
  ```
5466
6464
 
5467
- <sub>`api.ogt` line 4583</sub>
6465
+ <sub>`api.ogt` line 4962</sub>
5468
6466
 
5469
6467
  ```ogt
5470
6468
  column Post {
@@ -5475,7 +6473,7 @@ column Post {
5475
6473
  }
5476
6474
  ```
5477
6475
 
5478
- <sub>`api.ogt` line 4719</sub>
6476
+ <sub>`api.ogt` line 5098</sub>
5479
6477
 
5480
6478
  ## Constants
5481
6479
 
@@ -5491,28 +6489,28 @@ column Post {
5491
6489
  const PARTICLES_ARMED u32 4294967295 "ParticleSystem.startTick's default: never written. A looping emitter emits as if started at tick 0; a one-shot (`looping false`) emits nothing until its startTick is written, so a burst spawned in `start` waits for its first use. Write it back to re-arm a one-shot without firing it."
5492
6490
  ```
5493
6491
 
5494
- <sub>`api.ogt` line 3393</sub>
6492
+ <sub>`api.ogt` line 3445</sub>
5495
6493
 
5496
6494
  ```ogt
5497
6495
  const MAX_LIGHTS u32 256 "The most point and spot lights one frame draws, among those in view; past it the ones brightest at the camera are kept."
5498
6496
  ```
5499
6497
 
5500
- <sub>`api.ogt` line 3937</sub>
6498
+ <sub>`api.ogt` line 3989</sub>
5501
6499
 
5502
6500
  ```ogt
5503
6501
  const MAX_CLUSTER_LIGHTS u32 64 "The most point and spot lights that shade one screen cluster (a 1/16 by 1/9 tile of the view and one of 24 depth slices); past it the ones brightest at the camera are kept there."
5504
6502
  ```
5505
6503
 
5506
- <sub>`api.ogt` line 3938</sub>
6504
+ <sub>`api.ogt` line 3990</sub>
5507
6505
 
5508
6506
  ```ogt
5509
6507
  const UI_LAYER i32 1000 "The UI's layer among screen sprites and screen text (SpriteDesc and TextDesc with screen): those at or below it draw under every og.ui element, those above it over every one, modals, toasts and the screen transition included (a HUD element made of sprites sitting on a UI panel: draw it only while its screen shows), in their layers' order either way."
5510
6508
  ```
5511
6509
 
5512
- <sub>`api.ogt` line 3939</sub>
6510
+ <sub>`api.ogt` line 3991</sub>
5513
6511
 
5514
6512
  ```ogt
5515
6513
  const MAX_REFLECTION_PROBES u32 8 "The most og.ReflectionProbe components one frame samples, nearest the camera first; the rest are skipped."
5516
6514
  ```
5517
6515
 
5518
- <sub>`api.ogt` line 3963</sub>
6516
+ <sub>`api.ogt` line 4017</sub>