@driftengine/core 4.4.2 → 4.6.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.
- package/CHANGELOG.json +97 -0
- package/README.md +1 -1
- package/dist/geometry/boxCsg.d.ts +28 -0
- package/dist/geometry/boxCsg.js +139 -0
- package/dist/geometry/csg.d.ts +36 -0
- package/dist/geometry/csg.js +329 -0
- package/dist/geometry/meshBuilder.js +13 -0
- package/dist/geometry/meshConcat.js +1 -0
- package/dist/geometry/pixelFont.js +2 -0
- package/dist/geometry/solid.d.ts +61 -0
- package/dist/geometry/solid.js +152 -0
- package/dist/geometry/solidFlat.d.ts +35 -0
- package/dist/geometry/solidFlat.js +428 -0
- package/dist/geometry/solidHarness.d.ts +19 -0
- package/dist/geometry/solidHarness.js +66 -0
- package/dist/geometry/solidNormals.d.ts +17 -0
- package/dist/geometry/solidNormals.js +86 -0
- package/dist/geometry/solidRound.d.ts +41 -0
- package/dist/geometry/solidRound.js +323 -0
- package/dist/geometry/solidWriter.d.ts +16 -0
- package/dist/geometry/solidWriter.js +42 -0
- package/dist/index.d.ts +28 -3
- package/dist/index.js +20 -1
- package/dist/render/backend/api.d.ts +34 -14
- package/dist/render/backend/drawFog.d.ts +26 -0
- package/dist/render/backend/drawFog.js +30 -0
- package/dist/render/backend/materialChanges.d.ts +2 -1
- package/dist/render/backend/materialChanges.js +6 -1
- package/dist/render/backend/webgl2/glassTintPrograms.d.ts +13 -0
- package/dist/render/backend/webgl2/glassTintPrograms.js +38 -0
- package/dist/render/backend/webgl2/instanced.d.ts +24 -5
- package/dist/render/backend/webgl2/instanced.js +72 -15
- package/dist/render/backend/webgl2/renderer.d.ts +201 -16
- package/dist/render/backend/webgl2/renderer.js +596 -224
- package/dist/render/backend/webgpu/buffers.d.ts +29 -1
- package/dist/render/backend/webgpu/buffers.js +61 -4
- package/dist/render/backend/webgpu/depthPass.d.ts +1 -1
- package/dist/render/backend/webgpu/depthPass.js +7 -2
- package/dist/render/backend/webgpu/drawCommand.d.ts +5 -0
- package/dist/render/backend/webgpu/drawCommand.js +1 -0
- package/dist/render/backend/webgpu/flatPass.d.ts +6 -1
- package/dist/render/backend/webgpu/flatPass.js +57 -9
- package/dist/render/backend/webgpu/glassTintPass.d.ts +28 -0
- package/dist/render/backend/webgpu/glassTintPass.js +206 -0
- package/dist/render/backend/webgpu/gpuDrivenPass.d.ts +60 -1
- package/dist/render/backend/webgpu/gpuDrivenPass.js +305 -5
- package/dist/render/backend/webgpu/instanceCullPass.d.ts +34 -0
- package/dist/render/backend/webgpu/instanceCullPass.js +144 -0
- package/dist/render/backend/webgpu/instanced.d.ts +23 -2
- package/dist/render/backend/webgpu/instanced.js +41 -4
- package/dist/render/backend/webgpu/latePass.d.ts +30 -0
- package/dist/render/backend/webgpu/latePass.js +140 -0
- package/dist/render/backend/webgpu/lightVolumePass.js +5 -1
- package/dist/render/backend/webgpu/motionPass.d.ts +95 -0
- package/dist/render/backend/webgpu/motionPass.js +491 -0
- package/dist/render/backend/webgpu/pipelineCache.d.ts +10 -1
- package/dist/render/backend/webgpu/pipelineCache.js +11 -1
- package/dist/render/backend/webgpu/pointGlassTintPass.d.ts +32 -0
- package/dist/render/backend/webgpu/pointGlassTintPass.js +193 -0
- package/dist/render/backend/webgpu/pointShadowPass.d.ts +35 -6
- package/dist/render/backend/webgpu/pointShadowPass.js +105 -20
- package/dist/render/backend/webgpu/postPass.d.ts +3 -13
- package/dist/render/backend/webgpu/renderer.d.ts +271 -64
- package/dist/render/backend/webgpu/renderer.js +1395 -580
- package/dist/render/backend/webgpu/scatterPass.js +2 -1
- package/dist/render/backend/webgpu/sdfTextPass.js +6 -1
- package/dist/render/backend/webgpu/shaders/instanceCull.wgsl.d.ts +18 -0
- package/dist/render/backend/webgpu/shaders/instanceCull.wgsl.js +59 -0
- package/dist/render/backend/webgpu/skinPaletteRing.d.ts +4 -0
- package/dist/render/backend/webgpu/skinPaletteRing.js +4 -0
- package/dist/render/backend/webgpu/snapshotMips.d.ts +29 -0
- package/dist/render/backend/webgpu/snapshotMips.js +52 -0
- package/dist/render/backend/webgpu/surfaceTexturePass.d.ts +22 -3
- package/dist/render/backend/webgpu/surfaceTexturePass.js +78 -39
- package/dist/render/driftLight/bake.d.ts +7 -0
- package/dist/render/driftLight/bake.js +61 -56
- package/dist/render/driftLight/denseField.d.ts +46 -0
- package/dist/render/driftLight/denseField.js +109 -0
- package/dist/render/driftLight/lightField.d.ts +10 -5
- package/dist/render/driftLight/lightField.js +25 -19
- package/dist/render/driftLight/presence.d.ts +50 -0
- package/dist/render/driftLight/presence.js +43 -0
- package/dist/render/driftLight/uniforms.d.ts +3 -3
- package/dist/render/driftLight/uniforms.js +5 -6
- package/dist/render/driftLight/worldLightField.d.ts +41 -0
- package/dist/render/driftLight/worldLightField.js +66 -0
- package/dist/render/fixtureAtlas.d.ts +20 -0
- package/dist/render/fixtureAtlas.js +49 -0
- package/dist/render/glass.d.ts +45 -0
- package/dist/render/glass.js +39 -0
- package/dist/render/glassCasters.d.ts +40 -0
- package/dist/render/glassCasters.js +84 -0
- package/dist/render/glassShadow.d.ts +78 -0
- package/dist/render/glassShadow.js +125 -0
- package/dist/render/globalMediumPass.d.ts +2 -3
- package/dist/render/globalMediumPass.js +2 -8
- package/dist/render/gpudriven/lit.d.ts +12 -0
- package/dist/render/gpudriven/lit.js +23 -0
- package/dist/render/gpudriven/materialTable.d.ts +15 -5
- package/dist/render/gpudriven/materialTable.js +26 -6
- package/dist/render/gpudriven/pipeline.d.ts +1 -1
- package/dist/render/gpudriven/pipeline.js +4 -3
- package/dist/render/gpudriven/sunGlass.d.ts +35 -0
- package/dist/render/gpudriven/sunGlass.js +89 -0
- package/dist/render/instanceCull.d.ts +63 -0
- package/dist/render/instanceCull.js +160 -0
- package/dist/render/instances.d.ts +15 -0
- package/dist/render/lightBudget.d.ts +36 -35
- package/dist/render/lightBudget.js +38 -37
- package/dist/render/lightGrid.d.ts +42 -0
- package/dist/render/lightGrid.js +87 -0
- package/dist/render/mesh.d.ts +18 -24
- package/dist/render/mesh.js +51 -68
- package/dist/render/occlusion.d.ts +10 -0
- package/dist/render/occlusion.js +36 -7
- package/dist/render/pointGlassTint.d.ts +59 -0
- package/dist/render/pointGlassTint.js +198 -0
- package/dist/render/pointLightSelection.d.ts +7 -0
- package/dist/render/pointLightSelection.js +29 -4
- package/dist/render/pointShadowArray.d.ts +56 -3
- package/dist/render/pointShadowArray.js +127 -16
- package/dist/render/pointShadowMap.d.ts +23 -1
- package/dist/render/pointShadowMap.js +27 -1
- package/dist/render/rainField.d.ts +13 -0
- package/dist/render/rainField.js +27 -5
- package/dist/render/recon/changeFrames.d.ts +15 -0
- package/dist/render/recon/changeFrames.js +21 -0
- package/dist/render/recon/lateDepth.d.ts +11 -0
- package/dist/render/recon/lateDepth.js +70 -0
- package/dist/render/recon/lateRouting.d.ts +14 -0
- package/dist/render/recon/lateRouting.js +18 -0
- package/dist/render/recon/mover.d.ts +57 -0
- package/dist/render/recon/mover.js +86 -0
- package/dist/render/recon/resolve.d.ts +34 -4
- package/dist/render/recon/resolve.js +161 -20
- package/dist/render/renderQuality.d.ts +35 -0
- package/dist/render/renderQuality.js +7 -0
- package/dist/render/rendererHarness.js +16 -0
- package/dist/render/sceneTarget.d.ts +9 -1
- package/dist/render/sceneTarget.js +60 -12
- package/dist/render/shaders/depth.d.ts +16 -1
- package/dist/render/shaders/depth.js +94 -15
- package/dist/render/shaders/flat/directionalShadow.js +91 -6
- package/dist/render/shaders/flat/driftLight.d.ts +1 -1
- package/dist/render/shaders/flat/driftLight.js +32 -7
- package/dist/render/shaders/flat/glassTint.d.ts +6 -0
- package/dist/render/shaders/flat/glassTint.js +25 -0
- package/dist/render/shaders/flat/index.d.ts +13 -0
- package/dist/render/shaders/flat/index.js +9 -3
- package/dist/render/shaders/flat/lampGlass.d.ts +1 -0
- package/dist/render/shaders/flat/lampGlass.js +183 -0
- package/dist/render/shaders/flat/main.d.ts +1 -1
- package/dist/render/shaders/flat/main.js +190 -38
- package/dist/render/shaders/flat/pointShadow.d.ts +1 -1
- package/dist/render/shaders/flat/pointShadow.js +2 -0
- package/dist/render/shaders/flat/preamble.js +96 -26
- package/dist/render/shaders/flat/surfaceEffects.d.ts +29 -0
- package/dist/render/shaders/flat/surfaceEffects.js +152 -0
- package/dist/render/shaders/generated/depth.wgsl.d.ts +230 -7
- package/dist/render/shaders/generated/depth.wgsl.js +230 -7
- package/dist/render/shaders/generated/flat.wgsl.d.ts +1644 -1596
- package/dist/render/shaders/generated/flat.wgsl.js +1683 -1621
- package/dist/render/shaders/generated/globalMedium.wgsl.d.ts +3 -13
- package/dist/render/shaders/generated/globalMedium.wgsl.js +3 -13
- package/dist/render/shaders/generated/lightVolume.wgsl.d.ts +3 -13
- package/dist/render/shaders/generated/lightVolume.wgsl.js +21 -17
- package/dist/render/shaders/generated/octahedralResolve.wgsl.d.ts +29 -0
- package/dist/render/shaders/generated/octahedralResolve.wgsl.js +29 -0
- package/dist/render/shaders/generated/rush.wgsl.d.ts +21 -16
- package/dist/render/shaders/generated/rush.wgsl.js +21 -16
- package/dist/render/shaders/generated/sdfText.wgsl.d.ts +2 -2
- package/dist/render/shaders/generated/sdfText.wgsl.js +2 -2
- package/dist/render/shaders/generated/text.wgsl.d.ts +1 -1
- package/dist/render/shaders/generated/text.wgsl.js +1 -1
- package/dist/render/shaders/gi/driftLight.wgsl.d.ts +1 -1
- package/dist/render/shaders/gi/driftLight.wgsl.js +27 -4
- package/dist/render/shaders/globalMedium.js +6 -6
- package/dist/render/shaders/gpudriven/blendRaster.wgsl.d.ts +7 -0
- package/dist/render/shaders/gpudriven/blendRaster.wgsl.js +86 -1
- package/dist/render/shaders/gpudriven/cull.wgsl.d.ts +1 -1
- package/dist/render/shaders/gpudriven/cull.wgsl.js +11 -2
- package/dist/render/shaders/gpudriven/materialTable.wgsl.d.ts +1 -1
- package/dist/render/shaders/gpudriven/materialTable.wgsl.js +3 -1
- package/dist/render/shaders/gpudriven/shade.wgsl.js +50 -1
- package/dist/render/shaders/gpudriven/sunGlass.wgsl.d.ts +9 -0
- package/dist/render/shaders/gpudriven/sunGlass.wgsl.js +133 -0
- package/dist/render/shaders/lightVolume.js +6 -6
- package/dist/render/shaders/octahedralResolve.d.ts +8 -0
- package/dist/render/shaders/octahedralResolve.js +48 -17
- package/dist/render/shaders/recon/lateDepth.wgsl.d.ts +1 -0
- package/dist/render/shaders/recon/lateDepth.wgsl.js +69 -0
- package/dist/render/shaders/recon/motion.wgsl.d.ts +1 -1
- package/dist/render/shaders/recon/motion.wgsl.js +84 -0
- package/dist/render/shaders/recon/resolve.wgsl.d.ts +8 -7
- package/dist/render/shaders/recon/resolve.wgsl.js +161 -27
- package/dist/render/shaders/rush.js +11 -1
- package/dist/render/shaders/sdfText.d.ts +1 -1
- package/dist/render/shaders/sdfText.js +3 -2
- package/dist/render/shaders/text.d.ts +1 -1
- package/dist/render/shaders/text.js +18 -9
- package/dist/render/shadowCasters.d.ts +20 -1
- package/dist/render/shadowCasters.js +15 -1
- package/dist/render/shadowMap.d.ts +54 -5
- package/dist/render/shadowMap.js +190 -36
- package/dist/render/sunGlassTint.d.ts +25 -0
- package/dist/render/sunGlassTint.js +79 -0
- package/dist/render/surfaceEffects.d.ts +83 -0
- package/dist/render/surfaceEffects.js +75 -0
- package/dist/render/surfaceScene.d.ts +8 -0
- package/dist/render/surfaceScene.js +8 -0
- package/dist/render/surfaceTexture.d.ts +18 -2
- package/dist/render/surfaceTexture.js +68 -15
- package/dist/render/temporalAa.d.ts +25 -6
- package/dist/render/temporalAa.js +45 -15
- package/dist/render/textureSource.d.ts +30 -0
- package/dist/render/textureSource.js +53 -0
- package/dist/render/translucentQueue.d.ts +6 -0
- package/dist/render/translucentQueue.js +15 -1
- package/dist/render/vertexDefaults.js +2 -0
- package/dist/world/hlod.d.ts +104 -0
- package/dist/world/hlod.js +214 -0
- package/package.json +6 -6
- package/src/geometry/boxCsg.ts +186 -0
- package/src/geometry/csg.ts +384 -0
- package/src/geometry/meshBuilder.ts +15 -0
- package/src/geometry/meshConcat.ts +1 -0
- package/src/geometry/pixelFont.ts +2 -0
- package/src/geometry/solid.ts +189 -0
- package/src/geometry/solidFlat.ts +522 -0
- package/src/geometry/solidHarness.ts +83 -0
- package/src/geometry/solidNormals.ts +103 -0
- package/src/geometry/solidRound.ts +443 -0
- package/src/geometry/solidWriter.ts +58 -0
- package/src/index.ts +61 -1
- package/src/render/backend/api.ts +36 -11
- package/src/render/backend/drawFog.ts +31 -0
- package/src/render/backend/materialChanges.ts +9 -2
- package/src/render/backend/webgl2/glassTintPrograms.ts +58 -0
- package/src/render/backend/webgl2/instanced.ts +80 -14
- package/src/render/backend/webgl2/renderer.ts +700 -250
- package/src/render/backend/webgpu/buffers.ts +92 -5
- package/src/render/backend/webgpu/depthPass.ts +7 -2
- package/src/render/backend/webgpu/drawCommand.ts +6 -0
- package/src/render/backend/webgpu/flatPass.ts +62 -11
- package/src/render/backend/webgpu/glassTintPass.ts +245 -0
- package/src/render/backend/webgpu/gpuDrivenPass.ts +349 -5
- package/src/render/backend/webgpu/instanceCullPass.ts +165 -0
- package/src/render/backend/webgpu/instanced.ts +42 -4
- package/src/render/backend/webgpu/latePass.ts +161 -0
- package/src/render/backend/webgpu/lightVolumePass.ts +5 -1
- package/src/render/backend/webgpu/motionPass.ts +535 -0
- package/src/render/backend/webgpu/pipelineCache.ts +12 -1
- package/src/render/backend/webgpu/pointGlassTintPass.ts +233 -0
- package/src/render/backend/webgpu/pointShadowPass.ts +158 -26
- package/src/render/backend/webgpu/renderer.ts +1671 -670
- package/src/render/backend/webgpu/scatterPass.ts +2 -1
- package/src/render/backend/webgpu/sdfTextPass.ts +6 -1
- package/src/render/backend/webgpu/shaders/instanceCull.wgsl.ts +61 -0
- package/src/render/backend/webgpu/skinPaletteRing.ts +4 -0
- package/src/render/backend/webgpu/snapshotMips.ts +80 -0
- package/src/render/backend/webgpu/surfaceTexturePass.ts +91 -51
- package/src/render/driftLight/bake.ts +85 -62
- package/src/render/driftLight/denseField.ts +149 -0
- package/src/render/driftLight/lightField.ts +33 -18
- package/src/render/driftLight/presence.ts +69 -0
- package/src/render/driftLight/uniforms.ts +8 -9
- package/src/render/driftLight/worldLightField.ts +83 -0
- package/src/render/fixtureAtlas.ts +63 -0
- package/src/render/glass.ts +74 -0
- package/src/render/glassCasters.ts +164 -0
- package/src/render/glassShadow.ts +153 -0
- package/src/render/globalMediumPass.ts +4 -11
- package/src/render/gpudriven/lit.ts +31 -0
- package/src/render/gpudriven/materialTable.ts +28 -6
- package/src/render/gpudriven/pipeline.ts +4 -3
- package/src/render/gpudriven/sunGlass.ts +117 -0
- package/src/render/instanceCull.ts +205 -0
- package/src/render/instances.ts +16 -0
- package/src/render/lightBudget.ts +41 -38
- package/src/render/lightGrid.ts +130 -0
- package/src/render/mesh.ts +59 -72
- package/src/render/occlusion.ts +51 -7
- package/src/render/pointGlassTint.ts +250 -0
- package/src/render/pointLightSelection.ts +72 -4
- package/src/render/pointShadowArray.ts +188 -22
- package/src/render/pointShadowMap.ts +41 -0
- package/src/render/rainField.ts +39 -5
- package/src/render/recon/changeFrames.ts +24 -0
- package/src/render/recon/lateDepth.ts +83 -0
- package/src/render/recon/lateRouting.ts +29 -0
- package/src/render/recon/mover.ts +118 -0
- package/src/render/recon/resolve.ts +206 -20
- package/src/render/renderQuality.ts +47 -0
- package/src/render/rendererHarness.ts +16 -0
- package/src/render/sceneTarget.ts +62 -11
- package/src/render/shaders/depth.ts +118 -15
- package/src/render/shaders/flat/directionalShadow.ts +97 -6
- package/src/render/shaders/flat/driftLight.ts +32 -7
- package/src/render/shaders/flat/glassTint.ts +25 -0
- package/src/render/shaders/flat/index.ts +22 -3
- package/src/render/shaders/flat/lampGlass.ts +185 -0
- package/src/render/shaders/flat/main.ts +190 -38
- package/src/render/shaders/flat/pointShadow.ts +2 -0
- package/src/render/shaders/flat/preamble.ts +96 -26
- package/src/render/shaders/flat/surfaceEffects.ts +152 -0
- package/src/render/shaders/generated/depth.wgsl.ts +237 -7
- package/src/render/shaders/generated/flat.wgsl.ts +1685 -1621
- package/src/render/shaders/generated/globalMedium.wgsl.ts +3 -13
- package/src/render/shaders/generated/lightVolume.wgsl.ts +23 -17
- package/src/render/shaders/generated/octahedralResolve.wgsl.ts +30 -0
- package/src/render/shaders/generated/rush.wgsl.ts +21 -16
- package/src/render/shaders/generated/sdfText.wgsl.ts +2 -2
- package/src/render/shaders/generated/text.wgsl.ts +1 -1
- package/src/render/shaders/gi/driftLight.wgsl.ts +27 -4
- package/src/render/shaders/globalMedium.ts +6 -6
- package/src/render/shaders/gpudriven/blendRaster.wgsl.ts +88 -1
- package/src/render/shaders/gpudriven/cull.wgsl.ts +11 -2
- package/src/render/shaders/gpudriven/materialTable.wgsl.ts +3 -1
- package/src/render/shaders/gpudriven/shade.wgsl.ts +50 -1
- package/src/render/shaders/gpudriven/sunGlass.wgsl.ts +139 -0
- package/src/render/shaders/lightVolume.ts +6 -6
- package/src/render/shaders/octahedralResolve.ts +50 -17
- package/src/render/shaders/recon/lateDepth.wgsl.ts +72 -0
- package/src/render/shaders/recon/motion.wgsl.ts +84 -0
- package/src/render/shaders/recon/resolve.wgsl.ts +161 -27
- package/src/render/shaders/rush.ts +11 -1
- package/src/render/shaders/sdfText.ts +3 -2
- package/src/render/shaders/text.ts +18 -9
- package/src/render/shadowCasters.ts +28 -1
- package/src/render/shadowMap.ts +231 -37
- package/src/render/sunGlassTint.ts +86 -0
- package/src/render/surfaceEffects.ts +132 -0
- package/src/render/surfaceScene.ts +16 -0
- package/src/render/surfaceTexture.ts +110 -19
- package/src/render/temporalAa.ts +78 -14
- package/src/render/textureSource.ts +72 -0
- package/src/render/translucentQueue.ts +20 -1
- package/src/render/vertexDefaults.ts +2 -0
- package/src/world/hlod.ts +290 -0
|
@@ -109,6 +109,7 @@ export class MeshBuilder {
|
|
|
109
109
|
* inverse transpose, and nothing here has wanted that yet.
|
|
110
110
|
*/
|
|
111
111
|
addMesh(mesh, x, y, z, scale = 1) {
|
|
112
|
+
refuseLayers(mesh);
|
|
112
113
|
const base = this.vertexCount;
|
|
113
114
|
const count = mesh.positions.length / 3;
|
|
114
115
|
for (let i = 0; i < count; i++) {
|
|
@@ -157,6 +158,7 @@ export class MeshBuilder {
|
|
|
157
158
|
* @param scale uniform, applied in the local frame before the basis.
|
|
158
159
|
*/
|
|
159
160
|
addOrientedMesh(mesh, origin, right, up, forward, scale = 1) {
|
|
161
|
+
refuseLayers(mesh);
|
|
160
162
|
assertOrthonormal(right, up, forward);
|
|
161
163
|
const base = this.vertexCount;
|
|
162
164
|
const count = mesh.positions.length / 3;
|
|
@@ -1186,3 +1188,14 @@ const CORNERS = [
|
|
|
1186
1188
|
[1, 1],
|
|
1187
1189
|
[-1, 1],
|
|
1188
1190
|
];
|
|
1191
|
+
/**
|
|
1192
|
+
* A builder has no layer channel, so merging a layered mesh would keep its texture coordinates and
|
|
1193
|
+
* silently put every face on layer 0 — the first image of the array, which reads as the wrong
|
|
1194
|
+
* facade everywhere rather than as an error. Refused instead; `concatMeshes` joins layered meshes.
|
|
1195
|
+
*/
|
|
1196
|
+
function refuseLayers(mesh) {
|
|
1197
|
+
if (mesh.layers === undefined)
|
|
1198
|
+
return;
|
|
1199
|
+
throw new Error('MeshBuilder: this mesh names texture-array layers, which a builder does not carry — merging ' +
|
|
1200
|
+
'it here would put every face on layer 0. Join layered meshes with concatMeshes instead.');
|
|
1201
|
+
}
|
|
@@ -66,6 +66,8 @@ const GLYPHS = {
|
|
|
66
66
|
"'": [0b00100, 0b00100, 0, 0, 0, 0, 0],
|
|
67
67
|
'(': [0b00010, 0b00100, 0b01000, 0b01000, 0b01000, 0b00100, 0b00010],
|
|
68
68
|
')': [0b01000, 0b00100, 0b00010, 0b00010, 0b00010, 0b00100, 0b01000],
|
|
69
|
+
'[': [0b01110, 0b01000, 0b01000, 0b01000, 0b01000, 0b01000, 0b01110],
|
|
70
|
+
']': [0b01110, 0b00010, 0b00010, 0b00010, 0b00010, 0b00010, 0b01110],
|
|
69
71
|
'%': [0b11001, 0b11010, 0b00010, 0b00100, 0b01000, 0b01011, 0b10011],
|
|
70
72
|
'·': [0, 0, 0, 0b01100, 0b01100, 0, 0],
|
|
71
73
|
'×': [0, 0b10001, 0b01010, 0b00100, 0b01010, 0b10001, 0],
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A solid: an indexed triangle surface with normals and texture coordinates, and the operations
|
|
3
|
+
* every procedural builder needs on one — place it, join several, measure it, and hand it to the
|
|
4
|
+
* renderer as a mesh.
|
|
5
|
+
*
|
|
6
|
+
* **Why a type of its own rather than `MeshData`.** A mesh carries a dozen per-vertex channels a
|
|
7
|
+
* renderer reads (colour, emissive, roughness, grain, joints…) and a solid is what exists before any
|
|
8
|
+
* of them are decided: shape alone. Booleans, smoothing and transforms are defined on shape, and
|
|
9
|
+
* dragging eleven channels through a boolean would mean deciding how each one interpolates across a
|
|
10
|
+
* cut. The caller paints a finished solid once, with `solidToMesh` or its own writer.
|
|
11
|
+
*
|
|
12
|
+
* **Named `Solid` because `*Shape` is taken**: the physics colliders the core barrel re-exports are
|
|
13
|
+
* `boxShape`, `cylinderShape` and the rest, and a second meaning for the word would read as the
|
|
14
|
+
* same thing. Every primitive here is closed except `solidQuad`, a single-sided plane.
|
|
15
|
+
*
|
|
16
|
+
* Built at load or bake time, never per frame, so these functions allocate their results.
|
|
17
|
+
*/
|
|
18
|
+
import type { MeshData } from '../render/mesh.ts';
|
|
19
|
+
import type { Vec3 } from '../math/color.ts';
|
|
20
|
+
export interface Solid {
|
|
21
|
+
/** Three floats a vertex. */
|
|
22
|
+
readonly positions: Float32Array;
|
|
23
|
+
/** Three floats a vertex, unit length, outward. */
|
|
24
|
+
readonly normals: Float32Array;
|
|
25
|
+
/**
|
|
26
|
+
* Two floats a vertex, parametric: 0..1 across each face of a box, around and along a round
|
|
27
|
+
* primitive. Tiling in metres is the caller's, who knows the sizes.
|
|
28
|
+
*/
|
|
29
|
+
readonly uvs: Float32Array;
|
|
30
|
+
/** Counter-clockwise triangles seen from outside. */
|
|
31
|
+
readonly indices: Uint32Array;
|
|
32
|
+
}
|
|
33
|
+
export declare function emptySolid(): Solid;
|
|
34
|
+
/**
|
|
35
|
+
* `solid` moved by a column-major 4×4 model matrix.
|
|
36
|
+
*
|
|
37
|
+
* **Normals go through the inverse transpose of the upper 3×3**, then are renormalised. Rotating
|
|
38
|
+
* them by the matrix itself is right only for rotations and uniform scales; under a non-uniform one
|
|
39
|
+
* — a unit cylinder scaled to a post, a sphere to an ellipsoid — it leaves every normal leaning
|
|
40
|
+
* toward the stretched axis, and the surface is lit as if it faced somewhere else, which reads as a
|
|
41
|
+
* shading bug rather than a maths one.
|
|
42
|
+
*
|
|
43
|
+
* **A mirror reverses the winding**, because a negative determinant turns every triangle inside
|
|
44
|
+
* out; without the reversal a mirrored solid is culled from outside and its volume goes negative.
|
|
45
|
+
*/
|
|
46
|
+
export declare function transformSolid(solid: Solid, model: ArrayLike<number>): Solid;
|
|
47
|
+
/** Several solids as one, each one's indices offset past the vertices before it. */
|
|
48
|
+
export declare function mergeSolids(solids: readonly Solid[]): Solid;
|
|
49
|
+
/**
|
|
50
|
+
* The enclosed volume by the divergence theorem: the sum of each triangle's signed tetrahedron
|
|
51
|
+
* with the origin. Positive for a closed, outward-wound solid; meaningless for an open one.
|
|
52
|
+
*
|
|
53
|
+
* Exact for any closed surface, T-junctions included, which is why the CSG tests can use it on a
|
|
54
|
+
* boolean's output where an edge-pairing check cannot.
|
|
55
|
+
*/
|
|
56
|
+
export declare function solidVolume(solid: Solid): number;
|
|
57
|
+
/**
|
|
58
|
+
* A solid painted one colour, as a mesh the renderer draws. `emissive` is the usual scalar: the
|
|
59
|
+
* surface's own colour scaled, gated by the environment's night factor like every emissive.
|
|
60
|
+
*/
|
|
61
|
+
export declare function solidToMesh(solid: Solid, color: Vec3, emissive?: number): MeshData;
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
export function emptySolid() {
|
|
2
|
+
return {
|
|
3
|
+
positions: new Float32Array(0),
|
|
4
|
+
normals: new Float32Array(0),
|
|
5
|
+
uvs: new Float32Array(0),
|
|
6
|
+
indices: new Uint32Array(0),
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* `solid` moved by a column-major 4×4 model matrix.
|
|
11
|
+
*
|
|
12
|
+
* **Normals go through the inverse transpose of the upper 3×3**, then are renormalised. Rotating
|
|
13
|
+
* them by the matrix itself is right only for rotations and uniform scales; under a non-uniform one
|
|
14
|
+
* — a unit cylinder scaled to a post, a sphere to an ellipsoid — it leaves every normal leaning
|
|
15
|
+
* toward the stretched axis, and the surface is lit as if it faced somewhere else, which reads as a
|
|
16
|
+
* shading bug rather than a maths one.
|
|
17
|
+
*
|
|
18
|
+
* **A mirror reverses the winding**, because a negative determinant turns every triangle inside
|
|
19
|
+
* out; without the reversal a mirrored solid is culled from outside and its volume goes negative.
|
|
20
|
+
*/
|
|
21
|
+
export function transformSolid(solid, model) {
|
|
22
|
+
const m = (i) => model[i] ?? 0;
|
|
23
|
+
const a = m(0);
|
|
24
|
+
const b = m(4);
|
|
25
|
+
const c = m(8);
|
|
26
|
+
const d = m(1);
|
|
27
|
+
const e = m(5);
|
|
28
|
+
const f = m(9);
|
|
29
|
+
const g = m(2);
|
|
30
|
+
const h = m(6);
|
|
31
|
+
const k = m(10);
|
|
32
|
+
/* Cofactors of the upper 3×3 in row-major (a b c / d e f / g h k): the inverse transpose up to
|
|
33
|
+
the determinant's scale, which renormalising removes — except its sign, kept below. */
|
|
34
|
+
const c00 = e * k - f * h;
|
|
35
|
+
const c01 = f * g - d * k;
|
|
36
|
+
const c02 = d * h - e * g;
|
|
37
|
+
const c10 = c * h - b * k;
|
|
38
|
+
const c11 = a * k - c * g;
|
|
39
|
+
const c12 = b * g - a * h;
|
|
40
|
+
const c20 = b * f - c * e;
|
|
41
|
+
const c21 = c * d - a * f;
|
|
42
|
+
const c22 = a * e - b * d;
|
|
43
|
+
const det = a * c00 + b * c01 + c * c02;
|
|
44
|
+
const sign = det < 0 ? -1 : 1;
|
|
45
|
+
const count = solid.positions.length / 3;
|
|
46
|
+
const positions = new Float32Array(count * 3);
|
|
47
|
+
const normals = new Float32Array(count * 3);
|
|
48
|
+
for (let v = 0; v < count; v++) {
|
|
49
|
+
const x = solid.positions[v * 3] ?? 0;
|
|
50
|
+
const y = solid.positions[v * 3 + 1] ?? 0;
|
|
51
|
+
const z = solid.positions[v * 3 + 2] ?? 0;
|
|
52
|
+
positions[v * 3] = a * x + b * y + c * z + m(12);
|
|
53
|
+
positions[v * 3 + 1] = d * x + e * y + f * z + m(13);
|
|
54
|
+
positions[v * 3 + 2] = g * x + h * y + k * z + m(14);
|
|
55
|
+
const nx = solid.normals[v * 3] ?? 0;
|
|
56
|
+
const ny = solid.normals[v * 3 + 1] ?? 0;
|
|
57
|
+
const nz = solid.normals[v * 3 + 2] ?? 0;
|
|
58
|
+
const tx = (c00 * nx + c01 * ny + c02 * nz) * sign;
|
|
59
|
+
const ty = (c10 * nx + c11 * ny + c12 * nz) * sign;
|
|
60
|
+
const tz = (c20 * nx + c21 * ny + c22 * nz) * sign;
|
|
61
|
+
const len = Math.hypot(tx, ty, tz) || 1;
|
|
62
|
+
normals[v * 3] = tx / len;
|
|
63
|
+
normals[v * 3 + 1] = ty / len;
|
|
64
|
+
normals[v * 3 + 2] = tz / len;
|
|
65
|
+
}
|
|
66
|
+
let indices = solid.indices;
|
|
67
|
+
if (det < 0) {
|
|
68
|
+
indices = new Uint32Array(solid.indices.length);
|
|
69
|
+
for (let t = 0; t < indices.length; t += 3) {
|
|
70
|
+
indices[t] = solid.indices[t] ?? 0;
|
|
71
|
+
indices[t + 1] = solid.indices[t + 2] ?? 0;
|
|
72
|
+
indices[t + 2] = solid.indices[t + 1] ?? 0;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return { positions, normals, uvs: solid.uvs, indices };
|
|
76
|
+
}
|
|
77
|
+
/** Several solids as one, each one's indices offset past the vertices before it. */
|
|
78
|
+
export function mergeSolids(solids) {
|
|
79
|
+
if (solids.length === 1 && solids[0] !== undefined)
|
|
80
|
+
return solids[0];
|
|
81
|
+
let vertices = 0;
|
|
82
|
+
let triangles = 0;
|
|
83
|
+
for (const s of solids) {
|
|
84
|
+
vertices += s.positions.length / 3;
|
|
85
|
+
triangles += s.indices.length;
|
|
86
|
+
}
|
|
87
|
+
const positions = new Float32Array(vertices * 3);
|
|
88
|
+
const normals = new Float32Array(vertices * 3);
|
|
89
|
+
const uvs = new Float32Array(vertices * 2);
|
|
90
|
+
const indices = new Uint32Array(triangles);
|
|
91
|
+
let v = 0;
|
|
92
|
+
let t = 0;
|
|
93
|
+
for (const s of solids) {
|
|
94
|
+
positions.set(s.positions, v * 3);
|
|
95
|
+
normals.set(s.normals, v * 3);
|
|
96
|
+
uvs.set(s.uvs, v * 2);
|
|
97
|
+
for (let i = 0; i < s.indices.length; i++)
|
|
98
|
+
indices[t + i] = (s.indices[i] ?? 0) + v;
|
|
99
|
+
v += s.positions.length / 3;
|
|
100
|
+
t += s.indices.length;
|
|
101
|
+
}
|
|
102
|
+
return { positions, normals, uvs, indices };
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* The enclosed volume by the divergence theorem: the sum of each triangle's signed tetrahedron
|
|
106
|
+
* with the origin. Positive for a closed, outward-wound solid; meaningless for an open one.
|
|
107
|
+
*
|
|
108
|
+
* Exact for any closed surface, T-junctions included, which is why the CSG tests can use it on a
|
|
109
|
+
* boolean's output where an edge-pairing check cannot.
|
|
110
|
+
*/
|
|
111
|
+
export function solidVolume(solid) {
|
|
112
|
+
const p = solid.positions;
|
|
113
|
+
const idx = solid.indices;
|
|
114
|
+
let sum = 0;
|
|
115
|
+
for (let t = 0; t < idx.length; t += 3) {
|
|
116
|
+
const a = (idx[t] ?? 0) * 3;
|
|
117
|
+
const b = (idx[t + 1] ?? 0) * 3;
|
|
118
|
+
const c = (idx[t + 2] ?? 0) * 3;
|
|
119
|
+
const ax = p[a] ?? 0;
|
|
120
|
+
const ay = p[a + 1] ?? 0;
|
|
121
|
+
const az = p[a + 2] ?? 0;
|
|
122
|
+
const bx = p[b] ?? 0;
|
|
123
|
+
const by = p[b + 1] ?? 0;
|
|
124
|
+
const bz = p[b + 2] ?? 0;
|
|
125
|
+
const cx = p[c] ?? 0;
|
|
126
|
+
const cy = p[c + 1] ?? 0;
|
|
127
|
+
const cz = p[c + 2] ?? 0;
|
|
128
|
+
sum += ax * (by * cz - bz * cy) - ay * (bx * cz - bz * cx) + az * (bx * cy - by * cx);
|
|
129
|
+
}
|
|
130
|
+
return sum / 6;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* A solid painted one colour, as a mesh the renderer draws. `emissive` is the usual scalar: the
|
|
134
|
+
* surface's own colour scaled, gated by the environment's night factor like every emissive.
|
|
135
|
+
*/
|
|
136
|
+
export function solidToMesh(solid, color, emissive = 0) {
|
|
137
|
+
const count = solid.positions.length / 3;
|
|
138
|
+
const colors = new Float32Array(count * 3);
|
|
139
|
+
for (let v = 0; v < count; v++) {
|
|
140
|
+
colors[v * 3] = color[0];
|
|
141
|
+
colors[v * 3 + 1] = color[1];
|
|
142
|
+
colors[v * 3 + 2] = color[2];
|
|
143
|
+
}
|
|
144
|
+
return {
|
|
145
|
+
positions: solid.positions,
|
|
146
|
+
normals: solid.normals,
|
|
147
|
+
colors,
|
|
148
|
+
emissive: new Float32Array(count).fill(emissive),
|
|
149
|
+
uvs: solid.uvs,
|
|
150
|
+
indices: solid.indices,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { Solid } from './solid.ts';
|
|
2
|
+
import type { Vec3 } from '../math/color.ts';
|
|
3
|
+
/** A box of full extents `x, y, z`, faceted: four vertices a face, texture 0..1 across each. */
|
|
4
|
+
export declare function solidBox(x: number, y: number, z: number): Solid;
|
|
5
|
+
/** A single-sided plane of `x` by `y` in XY, facing +Z. The one open solid. */
|
|
6
|
+
export declare function solidQuad(x: number, y: number): Solid;
|
|
7
|
+
/**
|
|
8
|
+
* A box of full extents with every edge rounded to `radius`, `segments` steps per rounded band.
|
|
9
|
+
*
|
|
10
|
+
* Built as a Minkowski sum: each face is a grid whose points are pushed out from the inner box —
|
|
11
|
+
* the box shrunk by the radius — along the direction from their clamped inner point. Grid lines
|
|
12
|
+
* fall on the inner box's edges exactly, so the flat middle of each face is one quad and adjacent
|
|
13
|
+
* faces meet on identical seams.
|
|
14
|
+
*/
|
|
15
|
+
export declare function solidRoundedBox(x: number, y: number, z: number, radius: number, segments: number): Solid;
|
|
16
|
+
/**
|
|
17
|
+
* A triangular prism: the section in XY — base `x` wide at −y/2, apex at +y/2 — extruded `z` along
|
|
18
|
+
* Z, centred. `right` puts the apex over the base's left end, a right angle there.
|
|
19
|
+
*/
|
|
20
|
+
export declare function solidPrism(x: number, y: number, z: number, right?: boolean): Solid;
|
|
21
|
+
/**
|
|
22
|
+
* A polygon in XZ (`x, z` pairs, either winding, convex or not) extruded along +Y from 0 to
|
|
23
|
+
* `height`, or centred on the origin when `centre` is set.
|
|
24
|
+
*/
|
|
25
|
+
export declare function solidExtrude(profile: ArrayLike<number>, height: number, centre?: boolean): Solid;
|
|
26
|
+
/**
|
|
27
|
+
* A profile (`x, y` pairs in the plane across the path) swept along a polyline path (`x, y, z`
|
|
28
|
+
* triples). At each point the frame is right = up × tangent, up' = tangent × right, so profile x
|
|
29
|
+
* runs right and profile y runs up; `up` defaults to +Y. Sides are faceted; `capEnds` closes both
|
|
30
|
+
* ends. Texture u runs around the profile and v along the path, both 0..1.
|
|
31
|
+
*
|
|
32
|
+
* Corners are not mitred: a sharp turn pinches the section. A path that turns sharply wants more
|
|
33
|
+
* points.
|
|
34
|
+
*/
|
|
35
|
+
export declare function solidSweep(profile: ArrayLike<number>, path: ArrayLike<number>, capEnds: boolean, up?: Vec3): Solid;
|