@call-me-sensei/toonlab 0.1.1

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 (146) hide show
  1. package/ATTRIBUTION.md +40 -0
  2. package/LICENSE +21 -0
  3. package/README.md +125 -0
  4. package/package.json +97 -0
  5. package/src/character/characterRig.js +353 -0
  6. package/src/character/freestyleSwimClip.js +541 -0
  7. package/src/character/index.js +4 -0
  8. package/src/character/modelLoader.js +433 -0
  9. package/src/core/materialRoles.js +438 -0
  10. package/src/core/presetDocuments.js +110 -0
  11. package/src/core/shaderBackend.js +24 -0
  12. package/src/debrisgen/debrisFields.js +544 -0
  13. package/src/debrisgen/debrisGenerator.js +1929 -0
  14. package/src/debrisgen/debrisPalettes.js +71 -0
  15. package/src/debrisgen/debrisPhysics.js +198 -0
  16. package/src/debrisgen/debrisPresets.js +155 -0
  17. package/src/debrisgen/debrisSettings.js +333 -0
  18. package/src/debrisgen/debrisTextures.js +380 -0
  19. package/src/debrisgen/index.js +5 -0
  20. package/src/debug/fieldValues.js +95 -0
  21. package/src/debug/index.js +7 -0
  22. package/src/debug/settingsPanel.js +170 -0
  23. package/src/environment/environmentAmbientProbe.js +160 -0
  24. package/src/environment/environmentMaterialAdapter.js +336 -0
  25. package/src/environment/environmentMaterialClassifier.js +178 -0
  26. package/src/environment/environmentPlanarReflection.js +201 -0
  27. package/src/environment/environmentPresets.js +443 -0
  28. package/src/environment/environmentRigs.js +684 -0
  29. package/src/environment/environmentSettings.js +504 -0
  30. package/src/environment/environmentShaderMaterials.js +318 -0
  31. package/src/environment/environmentSunShadowPass.js +268 -0
  32. package/src/environment/environmentTextureResolver.js +161 -0
  33. package/src/environment/environmentTimeOfDay.js +167 -0
  34. package/src/environment/environmentVertexAo.js +188 -0
  35. package/src/environment/index.js +8 -0
  36. package/src/environment/scanAssetStylize.js +103 -0
  37. package/src/index.js +21 -0
  38. package/src/loaders/index.js +1 -0
  39. package/src/post/index.js +2 -0
  40. package/src/post/postProcessing.js +1087 -0
  41. package/src/rockgen/export/glbExport.js +177 -0
  42. package/src/rockgen/heightfield/heightfieldErosion.js +7 -0
  43. package/src/rockgen/heightfield/heightfieldPatch.js +183 -0
  44. package/src/rockgen/heightfield/stylizedErosionSim.js +356 -0
  45. package/src/rockgen/index.js +14 -0
  46. package/src/rockgen/mesh/meshAttributes.js +374 -0
  47. package/src/rockgen/mesh/meshDocument.js +158 -0
  48. package/src/rockgen/mesh/surfaceNets.js +329 -0
  49. package/src/rockgen/noise/cellularNoise3.js +92 -0
  50. package/src/rockgen/noise/prng.js +62 -0
  51. package/src/rockgen/noise/simplexNoise3.js +89 -0
  52. package/src/rockgen/noise/valueNoise3.js +87 -0
  53. package/src/rockgen/rockDocument.js +255 -0
  54. package/src/rockgen/rockHelpers.js +8 -0
  55. package/src/rockgen/rockgenPresets.js +559 -0
  56. package/src/rockgen/rockgenSettings.js +756 -0
  57. package/src/rockgen/sdf/fieldCompiler.js +544 -0
  58. package/src/rockgen/sdf/sculptEdits.js +66 -0
  59. package/src/rockgen/sdf/sdfModifiers.js +45 -0
  60. package/src/rockgen/sdf/sdfOps.js +37 -0
  61. package/src/rockgen/sdf/sdfPrimitives.js +88 -0
  62. package/src/shaders-tsl/anime.js +963 -0
  63. package/src/shaders-tsl/chunks/character-color.js +64 -0
  64. package/src/shaders-tsl/chunks/character-highlights.js +174 -0
  65. package/src/shaders-tsl/chunks/character-lighting.js +309 -0
  66. package/src/shaders-tsl/chunks/character-material-maps.js +146 -0
  67. package/src/shaders-tsl/chunks/character-roles.js +52 -0
  68. package/src/shaders-tsl/chunks/character-scene-lights.js +270 -0
  69. package/src/shaders-tsl/chunks/character-shadow-color.js +61 -0
  70. package/src/shaders-tsl/chunks/character-skinning.js +140 -0
  71. package/src/shaders-tsl/chunks/environment-color.js +47 -0
  72. package/src/shaders-tsl/chunks/environment-debug.js +79 -0
  73. package/src/shaders-tsl/chunks/environment-lighting.js +260 -0
  74. package/src/shaders-tsl/chunks/environment-sun-shadow.js +87 -0
  75. package/src/shaders-tsl/chunks/foliage-fog.js +60 -0
  76. package/src/shaders-tsl/chunks/pass-depth-color.js +89 -0
  77. package/src/shaders-tsl/chunks/stylized-cloud-shadow.js +70 -0
  78. package/src/shaders-tsl/chunks/water-color.js +190 -0
  79. package/src/shaders-tsl/chunks/water-common.js +124 -0
  80. package/src/shaders-tsl/chunks/water-foam.js +93 -0
  81. package/src/shaders-tsl/chunks/water-lighting.js +116 -0
  82. package/src/shaders-tsl/chunks/water-ripple.js +64 -0
  83. package/src/shaders-tsl/chunks/water-waves.js +100 -0
  84. package/src/shaders-tsl/environment-ao-overlay.js +60 -0
  85. package/src/shaders-tsl/environment.js +680 -0
  86. package/src/shaders-tsl/flower.js +267 -0
  87. package/src/shaders-tsl/grass.js +193 -0
  88. package/src/shaders-tsl/post-composite.js +461 -0
  89. package/src/shaders-tsl/sky.js +175 -0
  90. package/src/shaders-tsl/tree-leaf.js +264 -0
  91. package/src/shaders-tsl/water-breaker.js +423 -0
  92. package/src/shaders-tsl/water-kelp.js +171 -0
  93. package/src/shaders-tsl/water-rain.js +107 -0
  94. package/src/shaders-tsl/water-simulation.js +140 -0
  95. package/src/shaders-tsl/water-splash.js +298 -0
  96. package/src/shaders-tsl/water.js +509 -0
  97. package/src/sky/index.js +2 -0
  98. package/src/sky/stylizedSky.js +341 -0
  99. package/src/toon/characterRenderPasses.js +646 -0
  100. package/src/toon/index.js +4 -0
  101. package/src/toon/settings/alphaSettings.js +170 -0
  102. package/src/toon/settings/averageShadowSettings.js +181 -0
  103. package/src/toon/settings/baseTextureSettings.js +133 -0
  104. package/src/toon/settings/celShadeSettings.js +96 -0
  105. package/src/toon/settings/contactShadowSettings.js +114 -0
  106. package/src/toon/settings/eyeHighlightSettings.js +187 -0
  107. package/src/toon/settings/faceLightingSettings.js +135 -0
  108. package/src/toon/settings/furSettings.js +112 -0
  109. package/src/toon/settings/glitterSettings.js +102 -0
  110. package/src/toon/settings/hairHighlightSettings.js +325 -0
  111. package/src/toon/settings/indirectLightSettings.js +244 -0
  112. package/src/toon/settings/localLightSettings.js +176 -0
  113. package/src/toon/settings/materialMapSettings.js +299 -0
  114. package/src/toon/settings/outlineSettings.js +263 -0
  115. package/src/toon/settings/perspectiveRemovalSettings.js +60 -0
  116. package/src/toon/settings/rimLightSettings.js +268 -0
  117. package/src/toon/settings/sceneShadowSettings.js +147 -0
  118. package/src/toon/settings/selfShadowSettings.js +221 -0
  119. package/src/toon/settings/shadowColorSettings.js +238 -0
  120. package/src/toon/settings/skinToneSettings.js +150 -0
  121. package/src/toon/settings/specularSettings.js +314 -0
  122. package/src/toon/settings/stickerSettings.js +102 -0
  123. package/src/toon/toonMaterialAdapter.js +2235 -0
  124. package/src/toon/toonSettings.js +860 -0
  125. package/src/vegetation/flowerSpecies.js +260 -0
  126. package/src/vegetation/index.js +10 -0
  127. package/src/vegetation/stylizedBush.js +136 -0
  128. package/src/vegetation/stylizedFlower.js +213 -0
  129. package/src/vegetation/stylizedFlowers.js +297 -0
  130. package/src/vegetation/stylizedGrass.js +491 -0
  131. package/src/vegetation/stylizedTree.js +2449 -0
  132. package/src/vegetation/stylizedTreeFoliage.js +691 -0
  133. package/src/vegetation/treeExport.js +300 -0
  134. package/src/vegetation/treeRecipe.js +647 -0
  135. package/src/water/index.js +2 -0
  136. package/src/water/water.js +20 -0
  137. package/src/water/waterBreakerSystem.js +591 -0
  138. package/src/water/waterInteraction.js +193 -0
  139. package/src/water/waterMaterial.js +263 -0
  140. package/src/water/waterRain.js +136 -0
  141. package/src/water/waterRippleSimulation.js +227 -0
  142. package/src/water/waterScenePasses.js +415 -0
  143. package/src/water/waterSettings.js +1138 -0
  144. package/src/water/waterSplashSystem.js +251 -0
  145. package/src/water/waterSurface.js +475 -0
  146. package/src/water/waterVegetation.js +83 -0
@@ -0,0 +1,100 @@
1
+ // TSL port of src/shaders/chunks/water-waves.glsl — the Gerstner wave stack
2
+ // shared by the water vertex and fragment stages (and the breaker shells).
3
+ // Wave parameters are prebuilt on the CPU (buildGerstnerWaveUniforms in
4
+ // waterSettings.js) so the exact same spectrum can be evaluated in JS for
5
+ // buoyancy queries. Keep the math in sync with sampleGerstnerHeight.
6
+ //
7
+ // uWavesA[i] = (direction.x, direction.z, angularFrequency, waveNumber)
8
+ // uWavesB[i] = (amplitude, phaseOffset, steepness, crestWeight)
9
+ //
10
+ // Convention (docs/tsl-conventions.md): the wave count is a compile-time
11
+ // constant (the GLSL WATER_WAVE_COUNT define), so the chunk is a factory of
12
+ // plain JS composition functions whose loops unroll at graph-build time.
13
+ // The GLSL `i < 2 ? 1.0 : chopWeight` slot filter is a JS-side ternary per
14
+ // unrolled iteration — slots 0/1 (the dominant swell / set-beat pair) always
15
+ // pass at full strength, the shorter cross chop fades toward the surf zone.
16
+
17
+ import {
18
+ clamp,
19
+ cross,
20
+ cos,
21
+ dot,
22
+ float,
23
+ normalize,
24
+ sin,
25
+ vec3,
26
+ } from 'three/tsl';
27
+
28
+ export function createWaterWavesChunk({ wavesA, wavesB, waveCount }) {
29
+ const count = Math.max(1, Math.trunc(waveCount));
30
+
31
+ // vec3 displacement of the rest position; chopWeight ∈ [0,1] filters the
32
+ // short cross-running components (1 = full open-water spectrum).
33
+ const gerstnerDisplacementFiltered = (restXZ, time, chopWeight) => {
34
+ const displacement = vec3(0.0).toVar();
35
+ for (let i = 0; i < count; i += 1) {
36
+ const a = wavesA.element(i).toVar();
37
+ const b = wavesB.element(i).toVar();
38
+ const direction = a.xy;
39
+ const omega = a.z;
40
+ const waveNumber = a.w;
41
+ const amplitude = (i < 2 ? b.x : b.x.mul(chopWeight)).toVar();
42
+ const phase = b.y;
43
+ const steepness = b.z;
44
+ const theta = waveNumber.mul(dot(direction, restXZ)).sub(omega.mul(time)).add(phase).toVar();
45
+ const sinTheta = sin(theta);
46
+ const cosTheta = cos(theta);
47
+ displacement.y.addAssign(amplitude.mul(sinTheta));
48
+ displacement.xz.addAssign(direction.mul(steepness.mul(amplitude).mul(cosTheta)));
49
+ }
50
+ return displacement;
51
+ };
52
+
53
+ const gerstnerDisplacement = (restXZ, time) => gerstnerDisplacementFiltered(restXZ, time, float(1.0));
54
+
55
+ // Analytic surface frame at the rest position plus the 0..1 crest factor
56
+ // used for whitecap foam (GLSL `out float crest` → returned alongside).
57
+ const gerstnerNormalFiltered = (restXZ, time, chopWeight) => {
58
+ const tangent = vec3(1.0, 0.0, 0.0).toVar();
59
+ const bitangent = vec3(0.0, 0.0, 1.0).toVar();
60
+ const crestSum = float(0.0).toVar();
61
+ const crestTotal = float(1e-4).toVar();
62
+ for (let i = 0; i < count; i += 1) {
63
+ const a = wavesA.element(i).toVar();
64
+ const b = wavesB.element(i).toVar();
65
+ const direction = a.xy;
66
+ const omega = a.z;
67
+ const waveNumber = a.w;
68
+ const amplitude = (i < 2 ? b.x : b.x.mul(chopWeight)).toVar();
69
+ const phase = b.y;
70
+ const steepness = b.z;
71
+ const crestWeight = b.w;
72
+ const theta = waveNumber.mul(dot(direction, restXZ)).sub(omega.mul(time)).add(phase).toVar();
73
+ const sinTheta = sin(theta).toVar();
74
+ const cosTheta = cos(theta).toVar();
75
+ const waveKA = waveNumber.mul(amplitude).toVar();
76
+ tangent.x.subAssign(steepness.mul(direction.x).mul(direction.x).mul(waveKA).mul(sinTheta));
77
+ tangent.y.addAssign(direction.x.mul(waveKA).mul(cosTheta));
78
+ tangent.z.subAssign(steepness.mul(direction.x).mul(direction.y).mul(waveKA).mul(sinTheta));
79
+ bitangent.x.subAssign(steepness.mul(direction.x).mul(direction.y).mul(waveKA).mul(sinTheta));
80
+ bitangent.y.addAssign(direction.y.mul(waveKA).mul(cosTheta));
81
+ bitangent.z.subAssign(steepness.mul(direction.y).mul(direction.y).mul(waveKA).mul(sinTheta));
82
+ const crestPeak = sinTheta.mul(0.5).add(0.5).toVar();
83
+ crestSum.addAssign(crestWeight.mul(amplitude).mul(crestPeak).mul(crestPeak));
84
+ crestTotal.addAssign(crestWeight.mul(amplitude));
85
+ }
86
+ return {
87
+ crest: clamp(crestSum.div(crestTotal), 0.0, 1.0).toVar(),
88
+ normal: normalize(cross(bitangent, tangent)).toVar(),
89
+ };
90
+ };
91
+
92
+ const gerstnerNormal = (restXZ, time) => gerstnerNormalFiltered(restXZ, time, float(1.0));
93
+
94
+ return {
95
+ gerstnerDisplacement,
96
+ gerstnerDisplacementFiltered,
97
+ gerstnerNormal,
98
+ gerstnerNormalFiltered,
99
+ };
100
+ }
@@ -0,0 +1,60 @@
1
+ // TSL port of src/shaders/environmentAoOverlay.vert.glsl +
2
+ // environmentAoOverlay.frag.glsl — the baked-shadow decal overlay: dark
3
+ // texels of an AO/shadow sheet become a tinted transparent shadow, bright
4
+ // texels dissolve. Consumed by environmentShaderMaterials'
5
+ // createEnvironmentAoMaterial on the TSL backend; exposes `.uniforms` under
6
+ // the exact GLSL uniform names (aoMap/shadowColor/opacity) so the lab's
7
+ // opacity write-throughs work unchanged.
8
+ //
9
+ // The GLSL vertex stage is the plain MVP + vUv passthrough, so the node
10
+ // material keeps its default vertex path and reads uv() in the fragment.
11
+ // GLSL ends with <colorspace_fragment>; the node renderer applies the same
12
+ // output transform automatically.
13
+
14
+ import * as THREE from 'three';
15
+ import {
16
+ Discard,
17
+ dot,
18
+ Fn,
19
+ smoothstep,
20
+ texture,
21
+ uniform,
22
+ uv,
23
+ vec3,
24
+ vec4,
25
+ } from 'three/tsl';
26
+ import { NodeMaterial } from 'three/webgpu';
27
+
28
+ import { fallbackEnvironmentWhiteTexture } from '../environment/environmentTextureResolver.js';
29
+
30
+ export function createEnvironmentAoOverlayNodeMaterial({
31
+ aoMap = null,
32
+ side = THREE.DoubleSide,
33
+ } = {}) {
34
+ const u = {
35
+ aoMap: texture(aoMap ?? fallbackEnvironmentWhiteTexture),
36
+ shadowColor: uniform(new THREE.Color(0.2, 0.14, 0.09)),
37
+ opacity: uniform(0.44),
38
+ };
39
+
40
+ const material = new NodeMaterial();
41
+ material.name = 'ToonEnvironmentAoOverlayNode';
42
+ material.lights = false;
43
+ material.fog = false;
44
+ material.side = side;
45
+ material.transparent = true;
46
+ material.depthWrite = false;
47
+
48
+ material.fragmentNode = Fn(() => {
49
+ const texel = u.aoMap.sample(uv()).toVar();
50
+ const luma = dot(texel.rgb, vec3(0.2126, 0.7152, 0.0722));
51
+ const shadow = smoothstep(0.08, 0.72, luma.oneMinus());
52
+ const alpha = shadow.mul(texel.a).mul(u.opacity).toVar();
53
+ Discard(alpha.lessThan(0.01));
54
+ return vec4(u.shadowColor, alpha);
55
+ })();
56
+
57
+ material.uniforms = u;
58
+ material.userData.isEnvironmentNodeMaterial = true;
59
+ return material;
60
+ }