three-base 2.0.142 → 2.0.166

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 (231) hide show
  1. package/DirectionalLight.d.ts +6 -6
  2. package/DirectionalLight.js +68 -68
  3. package/EventMap.d.ts +103 -103
  4. package/EventMap.js +17 -17
  5. package/EventMesh.d.ts +18 -18
  6. package/EventMesh.js +59 -59
  7. package/ExtrudeMesh.d.ts +112 -112
  8. package/ExtrudeMesh.js +342 -342
  9. package/FPScontrol.d.ts +531 -511
  10. package/FPScontrol.js +1866 -1799
  11. package/FPScontrol.ts +1922 -1855
  12. package/Fire/Fire.d.ts +28 -28
  13. package/Fire/Fire.js +80 -80
  14. package/Fire/FireGeometry.d.ts +9 -9
  15. package/Fire/FireGeometry.js +40 -40
  16. package/Fire/FireMaterial.d.ts +28 -28
  17. package/Fire/FireMaterial.js +32 -32
  18. package/Fire/index.d.ts +2 -2
  19. package/Fire/index.js +2 -2
  20. package/GLTFDracoLoader.d.ts +71 -71
  21. package/GLTFDracoLoader.js +266 -266
  22. package/GLTFDracoLoader.ts +1 -1
  23. package/Grass/Grass.d.ts +8 -8
  24. package/Grass/Grass.js +38 -38
  25. package/Grass/index.d.ts +2 -2
  26. package/Grass/index.js +2 -2
  27. package/Ground1/Ground1.d.ts +10 -10
  28. package/Ground1/Ground1.js +71 -71
  29. package/Ground1/index.d.ts +1 -1
  30. package/Ground1/index.js +1 -1
  31. package/MeshBase.d.ts +36 -36
  32. package/MeshBase.js +251 -247
  33. package/MeshBase.ts +6 -2
  34. package/Mirror.d.ts +25 -25
  35. package/Mirror.js +143 -143
  36. package/MktMesh/MktMesh.d.ts +301 -291
  37. package/MktMesh/MktMesh.js +1064 -1045
  38. package/MktMesh/MktMesh.ts +32 -11
  39. package/MktMesh/assetUrl.d.ts +59 -35
  40. package/MktMesh/assetUrl.js +165 -69
  41. package/MktMesh/assetUrl.ts +164 -69
  42. package/MktMesh/mktMappingShader.d.ts +12 -12
  43. package/MktMesh/mktMappingShader.js +138 -138
  44. package/MktMesh/mktMappingShader.ts +139 -139
  45. package/MktMesh/mktShader.d.ts +263 -263
  46. package/MktMesh/mktShader.js +1236 -1236
  47. package/MktMesh/mktShader.ts +1344 -1344
  48. package/MktMesh/panoBitmapTexture.d.ts +25 -25
  49. package/MktMesh/panoBitmapTexture.js +52 -52
  50. package/MktMesh/panoBitmapTexture.ts +54 -54
  51. package/MktMesh/panoSlotBind.d.ts +29 -29
  52. package/MktMesh/panoSlotBind.js +106 -106
  53. package/MktMesh/panoSlotBind.ts +153 -153
  54. package/MktMesh/panoSlotRoster.d.ts +22 -22
  55. package/MktMesh/panoSlotRoster.js +169 -169
  56. package/MktMesh/panoSlotRoster.ts +168 -168
  57. package/MktMesh/panoTileStitcher.d.ts +119 -119
  58. package/MktMesh/panoTileStitcher.js +529 -529
  59. package/MktMesh/panoTileStitcher.ts +616 -616
  60. package/MktMesh/types.d.ts +75 -75
  61. package/MktMesh/types.js +1 -1
  62. package/MktMesh/wallCapTessellate.d.ts +33 -33
  63. package/MktMesh/wallCapTessellate.js +97 -97
  64. package/MktMesh/wallCapTessellate.ts +68 -68
  65. package/PipeMesh/PathGeometry.d.ts +44 -44
  66. package/PipeMesh/PathGeometry.js +307 -307
  67. package/PipeMesh/PathPoint.d.ts +17 -17
  68. package/PipeMesh/PathPoint.js +31 -31
  69. package/PipeMesh/PathPointList.d.ts +31 -31
  70. package/PipeMesh/PathPointList.js +209 -209
  71. package/PipeMesh/PathTubeGeometry.d.ts +25 -25
  72. package/PipeMesh/PathTubeGeometry.js +130 -130
  73. package/PipeMesh/PipeMesh.d.ts +25 -25
  74. package/PipeMesh/PipeMesh.js +63 -63
  75. package/PipeMesh/index.d.ts +1 -1
  76. package/PipeMesh/index.js +1 -1
  77. package/PlaneModal1/PlaneModal1.d.ts +34 -34
  78. package/PlaneModal1/PlaneModal1.js +109 -109
  79. package/PlaneModal1/index.d.ts +1 -1
  80. package/PlaneModal1/index.js +1 -1
  81. package/PlaneText.d.ts +27 -27
  82. package/PlaneText.js +35 -35
  83. package/PlaneWithHtml.d.ts +13 -13
  84. package/PlaneWithHtml.js +66 -64
  85. package/PlaneWithHtml.ts +3 -1
  86. package/PointLight/PointLight.d.ts +13 -13
  87. package/PointLight/PointLight.js +64 -64
  88. package/PointLight/index.d.ts +1 -1
  89. package/PointLight/index.js +1 -1
  90. package/Sky/Sky.d.ts +9 -9
  91. package/Sky/Sky.js +22 -22
  92. package/Sky/index.d.ts +1 -1
  93. package/Sky/index.js +1 -1
  94. package/SpotLight.d.ts +6 -6
  95. package/SpotLight.js +72 -72
  96. package/SpriteModal1/SpriteModal1.d.ts +33 -33
  97. package/SpriteModal1/SpriteModal1.js +116 -116
  98. package/SpriteModal1/index.d.ts +1 -1
  99. package/SpriteModal1/index.js +1 -1
  100. package/SpriteText.d.ts +46 -46
  101. package/SpriteText.js +176 -176
  102. package/SpriteText2.d.ts +48 -48
  103. package/SpriteText2.js +223 -223
  104. package/SpriteText3.d.ts +86 -86
  105. package/SpriteText3.js +517 -517
  106. package/SpriteText3.ts +599 -599
  107. package/SpriteWithHtml.d.ts +9 -9
  108. package/SpriteWithHtml.js +46 -44
  109. package/SpriteWithHtml.ts +3 -1
  110. package/Text3D/Text3D.d.ts +20 -20
  111. package/Text3D/Text3D.js +58 -58
  112. package/Text3D/fontController.d.ts +60 -60
  113. package/Text3D/fontController.js +166 -166
  114. package/Text3D/index.d.ts +1 -1
  115. package/Text3D/index.js +1 -1
  116. package/ThreeBase.d.ts +248 -248
  117. package/ThreeBase.js +1202 -1202
  118. package/ThreeBase.ts +1314 -1314
  119. package/ThreeMouse.d.ts +53 -54
  120. package/ThreeMouse.js +453 -453
  121. package/Transition.d.ts +45 -45
  122. package/Transition.js +209 -209
  123. package/Water/Water.d.ts +5 -5
  124. package/Water/Water.js +44 -44
  125. package/Water/index.d.ts +2 -2
  126. package/Water/index.js +2 -2
  127. package/WaterFlow/FloatingDuck.d.ts +88 -88
  128. package/WaterFlow/FloatingDuck.js +307 -307
  129. package/WaterFlow/FloatingDuck.ts +445 -445
  130. package/WaterFlow/GPUFluidSimulation.d.ts +56 -56
  131. package/WaterFlow/GPUFluidSimulation.js +781 -781
  132. package/WaterFlow/GPUFluidSimulation.ts +827 -827
  133. package/WaterFlow/ReservoirSystem.d.ts +106 -106
  134. package/WaterFlow/ReservoirSystem.js +611 -611
  135. package/WaterFlow/ReservoirSystem.ts +754 -754
  136. package/WaterFlow/SPHField.d.ts +35 -35
  137. package/WaterFlow/SPHField.js +203 -203
  138. package/WaterFlow/SPHField.ts +228 -228
  139. package/WaterFlow/ScreenSpaceFluidPass.d.ts +69 -69
  140. package/WaterFlow/ScreenSpaceFluidPass.js +728 -728
  141. package/WaterFlow/ScreenSpaceFluidPass.ts +789 -789
  142. package/WaterFlow/ShallowWaterSurface.d.ts +45 -45
  143. package/WaterFlow/ShallowWaterSurface.js +438 -438
  144. package/WaterFlow/ShallowWaterSurface.ts +510 -510
  145. package/WaterFlow/WaterFlow.d.ts +87 -87
  146. package/WaterFlow/WaterFlow.js +171 -171
  147. package/WaterFlow/WaterFlow.ts +219 -219
  148. package/WaterFlow/types.d.ts +161 -161
  149. package/WaterFlow/types.js +1 -1
  150. package/WaterFlow/types.ts +189 -189
  151. package/WaterFlow/waterFlowPass.d.ts +3 -3
  152. package/WaterFlow/waterFlowPass.js +20 -20
  153. package/WaterFlow/waterFlowPass.ts +40 -40
  154. package/collisionOBB.d.ts +42 -42
  155. package/collisionOBB.js +112 -112
  156. package/collisionOBB.ts +108 -108
  157. package/declare.d.ts +25 -25
  158. package/index.d.ts +1 -1
  159. package/index.js +1 -1
  160. package/instanced/InstancedBatch.d.ts +57 -57
  161. package/instanced/InstancedBatch.js +348 -348
  162. package/instanced/InstancedBatch.ts +406 -406
  163. package/instanced/InstancedChild.d.ts +174 -174
  164. package/instanced/InstancedChild.js +264 -264
  165. package/instanced/InstancedChild.ts +327 -327
  166. package/instanced/InstancedGroup.d.ts +43 -43
  167. package/instanced/InstancedGroup.js +126 -126
  168. package/instanced/InstancedGroup.ts +137 -137
  169. package/instanced/InstancedMeshBase.d.ts +38 -38
  170. package/instanced/InstancedMeshBase.js +282 -282
  171. package/instanced/InstancedTemplate.d.ts +46 -46
  172. package/instanced/InstancedTemplate.js +125 -125
  173. package/keyControls.d.ts +29 -30
  174. package/keyControls.js +101 -101
  175. package/lensflare/LensFlare.d.ts +39 -39
  176. package/lensflare/LensFlare.js +284 -284
  177. package/package.json +6 -1
  178. package/pass/bloom_pass.d.ts +2 -2
  179. package/pass/bloom_pass.js +174 -174
  180. package/pass/cover_pass.d.ts +2 -2
  181. package/pass/cover_pass.js +108 -108
  182. package/pass/debugDepthState.d.ts +20 -20
  183. package/pass/debugDepthState.js +9 -9
  184. package/pass/debugDepthState.ts +22 -22
  185. package/pass/depthTestBias.d.ts +12 -12
  186. package/pass/depthTestBias.js +12 -12
  187. package/pass/depthTestBias.ts +12 -12
  188. package/pass/effectUserData.d.ts +27 -27
  189. package/pass/effectUserData.js +1 -1
  190. package/pass/effectUserData.ts +46 -46
  191. package/pass/frosted_glass_pass.d.ts +2 -2
  192. package/pass/frosted_glass_pass.js +150 -150
  193. package/pass/fsQuad.d.ts +9 -9
  194. package/pass/fsQuad.js +28 -28
  195. package/pass/glow_pass.d.ts +2 -2
  196. package/pass/glow_pass.js +350 -350
  197. package/pass/screen_bloom_pass.d.ts +11 -11
  198. package/pass/screen_bloom_pass.js +136 -136
  199. package/pass/ssao_pass.d.ts +88 -88
  200. package/pass/ssao_pass.js +799 -799
  201. package/pass/ssao_pass.ts +918 -918
  202. package/pass/stroke_pass.d.ts +2 -2
  203. package/pass/stroke_pass.js +267 -267
  204. package/shaders/FXAAShaderMaterial.d.ts +3 -3
  205. package/shaders/FXAAShaderMaterial.js +20 -20
  206. package/shaders/baseDepthVisShader.d.ts +11 -11
  207. package/shaders/baseDepthVisShader.js +36 -36
  208. package/shaders/baseDepthVisShader.ts +36 -36
  209. package/shaders/baseTextureToRenderShader.d.ts +2 -2
  210. package/shaders/baseTextureToRenderShader.js +19 -19
  211. package/shaders/copyShader.d.ts +3 -3
  212. package/shaders/copyShader.js +13 -13
  213. package/shaders/debugDepthCompareShader.d.ts +14 -14
  214. package/shaders/debugDepthCompareShader.js +49 -49
  215. package/shaders/debugDepthCompareShader.ts +50 -50
  216. package/shaders/debugDepthJudgeShader.d.ts +18 -18
  217. package/shaders/debugDepthJudgeShader.js +52 -52
  218. package/shaders/debugDepthJudgeShader.ts +54 -54
  219. package/shaders/debugExcludedShader.d.ts +13 -13
  220. package/shaders/debugExcludedShader.js +46 -46
  221. package/shaders/debugExcludedShader.ts +48 -48
  222. package/spriteTextBg.d.ts +1 -1
  223. package/spriteTextBg.js +20 -20
  224. package/spriteTextBg.ts +20 -20
  225. package/threeLoader.d.ts +35 -35
  226. package/threeLoader.js +518 -518
  227. package/threeUtils.d.ts +71 -53
  228. package/threeUtils.js +363 -329
  229. package/threeUtils.ts +35 -0
  230. package/types.d.ts +2 -2
  231. package/types.js +6 -6
@@ -1,139 +1,139 @@
1
- /*
2
- * 全景「序号直取」投射着色器(mapping shader):MktMesh 基类(发布/预览)、
3
- * 编辑器 mapping 档墙体、家具立方体三处共用。
4
- *
5
- * 取图口径:按几何 attribute aPanoIndex 在 panoIndices 槽里对号取图,不看距离、不看夹角。
6
- * 与 blend / selected 共用同一份 floorVertexShader 与同一套采样口径(改采样两处同改)。
7
- */
8
- import { BackSide, Matrix4, ShaderMaterial, Vector3 } from "three";
9
- import { createPlaceholderTexture, floorVertexShader, MKT_PANO_MAX_SLOTS, RT_STITCH_SLOT_COUNT } from "./mktShader";
10
-
11
- /**
12
- * 序号直取片元(皇上旨 2026-09-29「三模式三 shader」之二):
13
- * 按三角面 aPanoIndex 在 panoIndices 槽里找对应全景纹理 —— **不看距离、不看夹角**(blend 那套打分/归约整段没有)。
14
- * 槽内采样段(等距柱状投射 + 左右 2 张拼合槽 + 采样即线性、不再手动 pow 解码)与 blend **逐字同口径**;改采样口径两处同改。
15
- * 未设序号 / 序号不在槽里 / 该槽瓦片没绑好(weights≤0)→ uFaceMissingColor 深灰兜底
16
- * (皇上旨 09-28「装不下就深灰」;weights 闸是 09-29 拆分时补的 —— 原运行时分支没这道闸,
17
- * 槽没绑好但序号命中会采到 vec3(0) 纯黑,深灰才是钦定兜底色)。
18
- */
19
- function buildFloorMappingFragment(maxPano: number): string {
20
- // 每个全景点占 **2** 张拼合槽纹理(32 片每 16 片拼一张:左半幅 / 右半幅)⇒ 8 × 2 = 16 = sampler 硬顶
21
- const tileCount = maxPano * RT_STITCH_SLOT_COUNT;
22
- let slotCalc = ""; // 每槽各自采样出 linK(weights[k]>0 才采;没绑好保持 0,由 facePick 的 weights 闸兜成深灰)
23
- let slotFacePick = ""; // 逐槽展开「panoIndices[k]==vPanoIndex 则取 lin{k}」(ANGLE 禁动态索引 ⇒ JS 常量展开)
24
- for (let k = 0; k < maxPano; k++) {
25
- const base = k * RT_STITCH_SLOT_COUNT; // 本点占 2 个连续纹理槽:base=k*2 .. base+1(顺序 [左半幅, 右半幅])
26
- slotFacePick += `
27
- if (panoIndices[${k}] >= 0.0 && weights[${k}] > 0.0 && abs(panoIndices[${k}] - vPanoIndex) < 0.5) faceCol = lin${k};`;
28
- slotCalc += `
29
- // ── 点槽 ${k}(纹理 ${base}..${base + 1})──
30
- vec3 lin${k} = vec3(0.0);
31
- if (weights[${k}] > 0.0) {
32
- mat4 tm = textureMatrices[${k}];
33
- vec3 texPos = tm[3].xyz; // 投影中心 = 纹理矩阵位置
34
- mat3 texRot = mat3(tm); // 纹理朝向 = 旋转分量
35
- vec3 dir = normalize(vProjPos - texPos);
36
- dir = texRot * dir; // 转到纹理局部方向
37
- float lon = atan(dir.z, dir.x);
38
- float u = lon * 0.15915494309189535 + 0.5; // 经度 -> u
39
- float lat = asin(clamp(dir.y, -1.0, 1.0));
40
- // 等距柱状线性 v(= 全图 UV),与 blend / 单全景分支**逐字同口径**
41
- float v = 0.5 + lat * 0.3183098861837907; // 1/PI
42
- // 左右两半 -> 拼合槽下标 [左半幅=0, 右半幅=1](每槽 = 8×4 网格里 4×4=16 片拼成,见 RT_STITCH_SLOT_TILES)
43
- // ⭐ 10-06 晚旨:竖着不再分块 ⇒ 槽只随 u 走(与 blend / 单全景分支**逐字同口径**)
44
- int tileIdx = (u >= 0.5) ? 1 : 0;
45
- float localU = (u < 0.5) ? (u * 2.0) : (u * 2.0 - 1.0);
46
- // ⛔ 纵向不再减半(槽就是全高)⇒ localV 恒等于 v;写成 2v/2v-1 = 纵向分辨率白丢一半
47
- float localV = v;
48
- // 🧩 该点这 2 槽装的是整图(whole 形态 / 没切过片)⇒ 还原成全图 UV 再采样(与 blend 逐字同口径)
49
- float panoU = (uPanoTiled[${k}] > 0.5) ? localU : u;
50
- float panoV = (uPanoTiled[${k}] > 0.5) ? localV : v;
51
- // ⚠️ ANGLE(D3D) 禁止动态索引 sampler 数组:以下 2 个采样下标均为「base + 字面量」常量表达式,编译安全
52
- // ⭐ 采样即线性(与单全景 / blend / selected 三路同一条口径,10-07 旨「色彩空间统一使用 liner」):纹理都标了
53
- // colorSpace = SRGBColorSpace ⇒ 硬件上传成 SRGB8_ALPHA8、texture2D 已解码一次;
54
- // 这里**不再手动 pow 解码**(那遍是二次解码 = 整体压暗),末端只编码一次 ⇒ 与源图逐字节还原。
55
- if (tileIdx == 0) lin${k} = texture2D(panoramas[${base}], vec2(panoU, panoV)).rgb;
56
- else lin${k} = texture2D(panoramas[${base + 1}], vec2(panoU, panoV)).rgb;
57
- }`;
58
- }
59
- return /* glsl */ `
60
- #include <logdepthbuf_pars_fragment>
61
- uniform sampler2D panoramas[${tileCount}];
62
- uniform mat4 textureMatrices[${maxPano}];
63
- uniform float weights[${maxPano}]; // 该槽瓦片绑好了没(writeSlot 按账本写)
64
- uniform float uPanoTiled[${maxPano}];
65
- // ── 全景序号映射(皇上旨 2026-09-28):本材质**只有这一种取图方式**(原 uFaceMappingMode 运行时分支已按
66
- // 09-29「三模式三 shader」拆出成独立 shader)──
67
- uniform float panoIndices[${maxPano}]; // 每个 slot 对应的「全景全局序号」(-1=空)
68
- uniform vec3 uFaceMissingColor; // 未设序号 / 序号不在槽里 / 槽没绑好 时的深灰兜底色(线性空间)
69
- // 色彩空间只有一条路(10-07 旨「统一使用 liner」):原 uniform float uColorSpace; + 那段 pow 分支已整条撤除(与 blend 同口径)
70
- uniform float uPanoramaVisible;
71
- varying vec3 vProjPos;
72
- varying float vPanoIndex;
73
- #ifdef USE_INSTANCING_COLOR
74
- varying vec3 vInstanceColor;
75
- #endif
76
- void main() {
77
- // ⭐ 先逐槽采样出 linK(weights[k]>0 才采;没绑好保持 vec3(0),由下面 facePick 的 weights 闸兜成深灰)。
78
- // ⛔ 这一段必须先跑:下面 slotFacePick 直接引用 linK —— 漏插本段就是
79
- // 「ERROR: 'lin0' : undeclared identifier」编译失败(2026-10-02 shader error 1282 的根因)。
80
- ${slotCalc}
81
- vec3 faceCol = uFaceMissingColor; // 默认深灰(未设序号 vPanoIndex<0 / 不在 panoIndices 里 / 槽没绑好)
82
- ${slotFacePick}
83
- vec3 col = faceCol;
84
- // 全景投射显隐:关闭时回落中性素色(与 blend 一致)
85
- if (uPanoramaVisible < 0.5) col = vec3(0.78, 0.78, 0.80);
86
- #ifdef USE_INSTANCING_COLOR
87
- col *= vInstanceColor;
88
- #endif
89
- gl_FragColor = vec4(col, 1.0);
90
- // 输出颜色空间编码:渲染到线性 RT(主编辑器后处理链)时 passthrough,渲染到 sRGB 屏幕(预览弹窗)时自动编码 sRGB
91
- #include <colorspace_fragment>
92
- #include <logdepthbuf_fragment>
93
- }
94
- `;
95
- }
96
-
97
- /**
98
- * 创建「全景序号直取」着色器材质(皇上旨 2026-09-29「三模式三 shader」之二):
99
- * 编辑器「映射设置模式」的墙材质 + **基类 MktMesh(发布/预览)的固定墙材质**
100
- * (皇上旨:mktmesh 就只有按照 attribute 配置来显示全景这一种固定的 shader)。
101
- * uniform 形状与 blend 工厂同档(panoramas[16]/textureMatrices[8]/weights[8]/uPanoTiled[8])⇒
102
- * 喂料复用 feedBlendProjection 的槽位指派路(feedFaceMapping),零新喂料路。
103
- * uFloorCoreRadius/uFloorFadeRange/uFloorOpacity 三根本 shader 不读,但喂料统一入口会写 ⇒ JS 侧留着(静默忽略)。
104
- */
105
- export function createMktFloorMappingShaderMaterial(options: { maxPano?: number } = {}): ShaderMaterial {
106
- const maxPano = Math.min(options.maxPano ?? MKT_PANO_MAX_SLOTS, MKT_PANO_MAX_SLOTS);
107
- const tileCount = maxPano * RT_STITCH_SLOT_COUNT; // 8 点 × 左/右 2 槽 = 16 = sampler 硬顶
108
- const panoramas: import("three").Texture[] = [];
109
- const matrices: Matrix4[] = [];
110
- for (let i = 0; i < tileCount; i++) panoramas.push(createPlaceholderTexture());
111
- for (let i = 0; i < maxPano; i++) matrices.push(new Matrix4());
112
- return new ShaderMaterial({
113
- uniforms: {
114
- panoramas: { value: panoramas },
115
- textureMatrices: { value: matrices },
116
- weights: { value: new Float32Array(maxPano) },
117
- uPanoTiled: { value: new Float32Array(maxPano).fill(1) },
118
- panoIndices: { value: new Float32Array(maxPano).fill(-1) },
119
- uFaceMissingColor: { value: new Vector3(0.18, 0.18, 0.18) },
120
- // 喂料统一入口会写(见上注释);本 shader 不读 ⇒ 声明在此只为喂料零分支
121
- uFloorCoreRadius: { value: 4 },
122
- uFloorFadeRange: { value: 4 },
123
- uFloorOpacity: { value: 1 },
124
- uPanoramaVisible: { value: 1 },
125
- // 色彩空间只有一条路(10-07 旨「统一使用 liner」)⇒ 原 `uColorSpace: { value: 0 }` 已随那段 pow 分支整条撤除
126
- // 投影空间逆矩阵:与 blend 同口径(顶点着色器共用 floorVertexShader)
127
- uProjInvMatrix: { value: new Matrix4() },
128
- },
129
- vertexShader: floorVertexShader,
130
- fragmentShader: buildFloorMappingFragment(maxPano),
131
- // ⭐ 墙专用材质(基类 MktMesh = 预览/发布 + 编辑器 mapping 模式墙,**同一座工厂同一份参数**,
132
- // 皇上旨 2026-10-07 明确以此为准):shader 默认**反面显示**(BackSide),零厚度幕墙只画朝房间内的那一面。
133
- // 地板走「仅显示选中」工厂、维持 DoubleSide;立方体 mapping 档与墙共用这份实例 ⇒ 朝向跟着墙(10-02 旨),
134
- // 另两档另建一份并显式拉回 DoubleSide(见渲染器 `_applyDisplayMode`)。
135
- side: BackSide,
136
- transparent: false,
137
- toneMapped: false,
138
- });
139
- }
1
+ /*
2
+ * 全景「序号直取」投射着色器(mapping shader):MktMesh 基类(发布/预览)、
3
+ * 编辑器 mapping 档墙体、家具立方体三处共用。
4
+ *
5
+ * 取图口径:按几何 attribute aPanoIndex 在 panoIndices 槽里对号取图,不看距离、不看夹角。
6
+ * 与 blend / selected 共用同一份 floorVertexShader 与同一套采样口径(改采样两处同改)。
7
+ */
8
+ import { BackSide, Matrix4, ShaderMaterial, Vector3 } from "three";
9
+ import { createPlaceholderTexture, floorVertexShader, MKT_PANO_MAX_SLOTS, RT_STITCH_SLOT_COUNT } from "./mktShader";
10
+
11
+ /**
12
+ * 序号直取片元(皇上旨 2026-09-29「三模式三 shader」之二):
13
+ * 按三角面 aPanoIndex 在 panoIndices 槽里找对应全景纹理 —— **不看距离、不看夹角**(blend 那套打分/归约整段没有)。
14
+ * 槽内采样段(等距柱状投射 + 左右 2 张拼合槽 + 采样即线性、不再手动 pow 解码)与 blend **逐字同口径**;改采样口径两处同改。
15
+ * 未设序号 / 序号不在槽里 / 该槽瓦片没绑好(weights≤0)→ uFaceMissingColor 深灰兜底
16
+ * (皇上旨 09-28「装不下就深灰」;weights 闸是 09-29 拆分时补的 —— 原运行时分支没这道闸,
17
+ * 槽没绑好但序号命中会采到 vec3(0) 纯黑,深灰才是钦定兜底色)。
18
+ */
19
+ function buildFloorMappingFragment(maxPano: number): string {
20
+ // 每个全景点占 **2** 张拼合槽纹理(32 片每 16 片拼一张:左半幅 / 右半幅)⇒ 8 × 2 = 16 = sampler 硬顶
21
+ const tileCount = maxPano * RT_STITCH_SLOT_COUNT;
22
+ let slotCalc = ""; // 每槽各自采样出 linK(weights[k]>0 才采;没绑好保持 0,由 facePick 的 weights 闸兜成深灰)
23
+ let slotFacePick = ""; // 逐槽展开「panoIndices[k]==vPanoIndex 则取 lin{k}」(ANGLE 禁动态索引 ⇒ JS 常量展开)
24
+ for (let k = 0; k < maxPano; k++) {
25
+ const base = k * RT_STITCH_SLOT_COUNT; // 本点占 2 个连续纹理槽:base=k*2 .. base+1(顺序 [左半幅, 右半幅])
26
+ slotFacePick += `
27
+ if (panoIndices[${k}] >= 0.0 && weights[${k}] > 0.0 && abs(panoIndices[${k}] - vPanoIndex) < 0.5) faceCol = lin${k};`;
28
+ slotCalc += `
29
+ // ── 点槽 ${k}(纹理 ${base}..${base + 1})──
30
+ vec3 lin${k} = vec3(0.0);
31
+ if (weights[${k}] > 0.0) {
32
+ mat4 tm = textureMatrices[${k}];
33
+ vec3 texPos = tm[3].xyz; // 投影中心 = 纹理矩阵位置
34
+ mat3 texRot = mat3(tm); // 纹理朝向 = 旋转分量
35
+ vec3 dir = normalize(vProjPos - texPos);
36
+ dir = texRot * dir; // 转到纹理局部方向
37
+ float lon = atan(dir.z, dir.x);
38
+ float u = lon * 0.15915494309189535 + 0.5; // 经度 -> u
39
+ float lat = asin(clamp(dir.y, -1.0, 1.0));
40
+ // 等距柱状线性 v(= 全图 UV),与 blend / 单全景分支**逐字同口径**
41
+ float v = 0.5 + lat * 0.3183098861837907; // 1/PI
42
+ // 左右两半 -> 拼合槽下标 [左半幅=0, 右半幅=1](每槽 = 8×4 网格里 4×4=16 片拼成,见 RT_STITCH_SLOT_TILES)
43
+ // ⭐ 10-06 晚旨:竖着不再分块 ⇒ 槽只随 u 走(与 blend / 单全景分支**逐字同口径**)
44
+ int tileIdx = (u >= 0.5) ? 1 : 0;
45
+ float localU = (u < 0.5) ? (u * 2.0) : (u * 2.0 - 1.0);
46
+ // ⛔ 纵向不再减半(槽就是全高)⇒ localV 恒等于 v;写成 2v/2v-1 = 纵向分辨率白丢一半
47
+ float localV = v;
48
+ // 🧩 该点这 2 槽装的是整图(whole 形态 / 没切过片)⇒ 还原成全图 UV 再采样(与 blend 逐字同口径)
49
+ float panoU = (uPanoTiled[${k}] > 0.5) ? localU : u;
50
+ float panoV = (uPanoTiled[${k}] > 0.5) ? localV : v;
51
+ // ⚠️ ANGLE(D3D) 禁止动态索引 sampler 数组:以下 2 个采样下标均为「base + 字面量」常量表达式,编译安全
52
+ // ⭐ 采样即线性(与单全景 / blend / selected 三路同一条口径,10-07 旨「色彩空间统一使用 liner」):纹理都标了
53
+ // colorSpace = SRGBColorSpace ⇒ 硬件上传成 SRGB8_ALPHA8、texture2D 已解码一次;
54
+ // 这里**不再手动 pow 解码**(那遍是二次解码 = 整体压暗),末端只编码一次 ⇒ 与源图逐字节还原。
55
+ if (tileIdx == 0) lin${k} = texture2D(panoramas[${base}], vec2(panoU, panoV)).rgb;
56
+ else lin${k} = texture2D(panoramas[${base + 1}], vec2(panoU, panoV)).rgb;
57
+ }`;
58
+ }
59
+ return /* glsl */ `
60
+ #include <logdepthbuf_pars_fragment>
61
+ uniform sampler2D panoramas[${tileCount}];
62
+ uniform mat4 textureMatrices[${maxPano}];
63
+ uniform float weights[${maxPano}]; // 该槽瓦片绑好了没(writeSlot 按账本写)
64
+ uniform float uPanoTiled[${maxPano}];
65
+ // ── 全景序号映射(皇上旨 2026-09-28):本材质**只有这一种取图方式**(原 uFaceMappingMode 运行时分支已按
66
+ // 09-29「三模式三 shader」拆出成独立 shader)──
67
+ uniform float panoIndices[${maxPano}]; // 每个 slot 对应的「全景全局序号」(-1=空)
68
+ uniform vec3 uFaceMissingColor; // 未设序号 / 序号不在槽里 / 槽没绑好 时的深灰兜底色(线性空间)
69
+ // 色彩空间只有一条路(10-07 旨「统一使用 liner」):原 uniform float uColorSpace; + 那段 pow 分支已整条撤除(与 blend 同口径)
70
+ uniform float uPanoramaVisible;
71
+ varying vec3 vProjPos;
72
+ varying float vPanoIndex;
73
+ #ifdef USE_INSTANCING_COLOR
74
+ varying vec3 vInstanceColor;
75
+ #endif
76
+ void main() {
77
+ // ⭐ 先逐槽采样出 linK(weights[k]>0 才采;没绑好保持 vec3(0),由下面 facePick 的 weights 闸兜成深灰)。
78
+ // ⛔ 这一段必须先跑:下面 slotFacePick 直接引用 linK —— 漏插本段就是
79
+ // 「ERROR: 'lin0' : undeclared identifier」编译失败(2026-10-02 shader error 1282 的根因)。
80
+ ${slotCalc}
81
+ vec3 faceCol = uFaceMissingColor; // 默认深灰(未设序号 vPanoIndex<0 / 不在 panoIndices 里 / 槽没绑好)
82
+ ${slotFacePick}
83
+ vec3 col = faceCol;
84
+ // 全景投射显隐:关闭时回落中性素色(与 blend 一致)
85
+ if (uPanoramaVisible < 0.5) col = vec3(0.78, 0.78, 0.80);
86
+ #ifdef USE_INSTANCING_COLOR
87
+ col *= vInstanceColor;
88
+ #endif
89
+ gl_FragColor = vec4(col, 1.0);
90
+ // 输出颜色空间编码:渲染到线性 RT(主编辑器后处理链)时 passthrough,渲染到 sRGB 屏幕(预览弹窗)时自动编码 sRGB
91
+ #include <colorspace_fragment>
92
+ #include <logdepthbuf_fragment>
93
+ }
94
+ `;
95
+ }
96
+
97
+ /**
98
+ * 创建「全景序号直取」着色器材质(皇上旨 2026-09-29「三模式三 shader」之二):
99
+ * 编辑器「映射设置模式」的墙材质 + **基类 MktMesh(发布/预览)的固定墙材质**
100
+ * (皇上旨:mktmesh 就只有按照 attribute 配置来显示全景这一种固定的 shader)。
101
+ * uniform 形状与 blend 工厂同档(panoramas[16]/textureMatrices[8]/weights[8]/uPanoTiled[8])⇒
102
+ * 喂料复用 feedBlendProjection 的槽位指派路(feedFaceMapping),零新喂料路。
103
+ * uFloorCoreRadius/uFloorFadeRange/uFloorOpacity 三根本 shader 不读,但喂料统一入口会写 ⇒ JS 侧留着(静默忽略)。
104
+ */
105
+ export function createMktFloorMappingShaderMaterial(options: { maxPano?: number } = {}): ShaderMaterial {
106
+ const maxPano = Math.min(options.maxPano ?? MKT_PANO_MAX_SLOTS, MKT_PANO_MAX_SLOTS);
107
+ const tileCount = maxPano * RT_STITCH_SLOT_COUNT; // 8 点 × 左/右 2 槽 = 16 = sampler 硬顶
108
+ const panoramas: import("three").Texture[] = [];
109
+ const matrices: Matrix4[] = [];
110
+ for (let i = 0; i < tileCount; i++) panoramas.push(createPlaceholderTexture());
111
+ for (let i = 0; i < maxPano; i++) matrices.push(new Matrix4());
112
+ return new ShaderMaterial({
113
+ uniforms: {
114
+ panoramas: { value: panoramas },
115
+ textureMatrices: { value: matrices },
116
+ weights: { value: new Float32Array(maxPano) },
117
+ uPanoTiled: { value: new Float32Array(maxPano).fill(1) },
118
+ panoIndices: { value: new Float32Array(maxPano).fill(-1) },
119
+ uFaceMissingColor: { value: new Vector3(0.18, 0.18, 0.18) },
120
+ // 喂料统一入口会写(见上注释);本 shader 不读 ⇒ 声明在此只为喂料零分支
121
+ uFloorCoreRadius: { value: 4 },
122
+ uFloorFadeRange: { value: 4 },
123
+ uFloorOpacity: { value: 1 },
124
+ uPanoramaVisible: { value: 1 },
125
+ // 色彩空间只有一条路(10-07 旨「统一使用 liner」)⇒ 原 `uColorSpace: { value: 0 }` 已随那段 pow 分支整条撤除
126
+ // 投影空间逆矩阵:与 blend 同口径(顶点着色器共用 floorVertexShader)
127
+ uProjInvMatrix: { value: new Matrix4() },
128
+ },
129
+ vertexShader: floorVertexShader,
130
+ fragmentShader: buildFloorMappingFragment(maxPano),
131
+ // ⭐ 墙专用材质(基类 MktMesh = 预览/发布 + 编辑器 mapping 模式墙,**同一座工厂同一份参数**,
132
+ // 皇上旨 2026-10-07 明确以此为准):shader 默认**反面显示**(BackSide),零厚度幕墙只画朝房间内的那一面。
133
+ // 地板走「仅显示选中」工厂、维持 DoubleSide;立方体 mapping 档与墙共用这份实例 ⇒ 朝向跟着墙(10-02 旨),
134
+ // 另两档另建一份并显式拉回 DoubleSide(见渲染器 `_applyDisplayMode`)。
135
+ side: BackSide,
136
+ transparent: false,
137
+ toneMapped: false,
138
+ });
139
+ }