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.
- package/DirectionalLight.d.ts +6 -6
- package/DirectionalLight.js +68 -68
- package/EventMap.d.ts +103 -103
- package/EventMap.js +17 -17
- package/EventMesh.d.ts +18 -18
- package/EventMesh.js +59 -59
- package/ExtrudeMesh.d.ts +112 -112
- package/ExtrudeMesh.js +342 -342
- package/FPScontrol.d.ts +531 -511
- package/FPScontrol.js +1866 -1799
- package/FPScontrol.ts +1922 -1855
- package/Fire/Fire.d.ts +28 -28
- package/Fire/Fire.js +80 -80
- package/Fire/FireGeometry.d.ts +9 -9
- package/Fire/FireGeometry.js +40 -40
- package/Fire/FireMaterial.d.ts +28 -28
- package/Fire/FireMaterial.js +32 -32
- package/Fire/index.d.ts +2 -2
- package/Fire/index.js +2 -2
- package/GLTFDracoLoader.d.ts +71 -71
- package/GLTFDracoLoader.js +266 -266
- package/GLTFDracoLoader.ts +1 -1
- package/Grass/Grass.d.ts +8 -8
- package/Grass/Grass.js +38 -38
- package/Grass/index.d.ts +2 -2
- package/Grass/index.js +2 -2
- package/Ground1/Ground1.d.ts +10 -10
- package/Ground1/Ground1.js +71 -71
- package/Ground1/index.d.ts +1 -1
- package/Ground1/index.js +1 -1
- package/MeshBase.d.ts +36 -36
- package/MeshBase.js +251 -247
- package/MeshBase.ts +6 -2
- package/Mirror.d.ts +25 -25
- package/Mirror.js +143 -143
- package/MktMesh/MktMesh.d.ts +301 -291
- package/MktMesh/MktMesh.js +1064 -1045
- package/MktMesh/MktMesh.ts +32 -11
- package/MktMesh/assetUrl.d.ts +59 -35
- package/MktMesh/assetUrl.js +165 -69
- package/MktMesh/assetUrl.ts +164 -69
- package/MktMesh/mktMappingShader.d.ts +12 -12
- package/MktMesh/mktMappingShader.js +138 -138
- package/MktMesh/mktMappingShader.ts +139 -139
- package/MktMesh/mktShader.d.ts +263 -263
- package/MktMesh/mktShader.js +1236 -1236
- package/MktMesh/mktShader.ts +1344 -1344
- package/MktMesh/panoBitmapTexture.d.ts +25 -25
- package/MktMesh/panoBitmapTexture.js +52 -52
- package/MktMesh/panoBitmapTexture.ts +54 -54
- package/MktMesh/panoSlotBind.d.ts +29 -29
- package/MktMesh/panoSlotBind.js +106 -106
- package/MktMesh/panoSlotBind.ts +153 -153
- package/MktMesh/panoSlotRoster.d.ts +22 -22
- package/MktMesh/panoSlotRoster.js +169 -169
- package/MktMesh/panoSlotRoster.ts +168 -168
- package/MktMesh/panoTileStitcher.d.ts +119 -119
- package/MktMesh/panoTileStitcher.js +529 -529
- package/MktMesh/panoTileStitcher.ts +616 -616
- package/MktMesh/types.d.ts +75 -75
- package/MktMesh/types.js +1 -1
- package/MktMesh/wallCapTessellate.d.ts +33 -33
- package/MktMesh/wallCapTessellate.js +97 -97
- package/MktMesh/wallCapTessellate.ts +68 -68
- package/PipeMesh/PathGeometry.d.ts +44 -44
- package/PipeMesh/PathGeometry.js +307 -307
- package/PipeMesh/PathPoint.d.ts +17 -17
- package/PipeMesh/PathPoint.js +31 -31
- package/PipeMesh/PathPointList.d.ts +31 -31
- package/PipeMesh/PathPointList.js +209 -209
- package/PipeMesh/PathTubeGeometry.d.ts +25 -25
- package/PipeMesh/PathTubeGeometry.js +130 -130
- package/PipeMesh/PipeMesh.d.ts +25 -25
- package/PipeMesh/PipeMesh.js +63 -63
- package/PipeMesh/index.d.ts +1 -1
- package/PipeMesh/index.js +1 -1
- package/PlaneModal1/PlaneModal1.d.ts +34 -34
- package/PlaneModal1/PlaneModal1.js +109 -109
- package/PlaneModal1/index.d.ts +1 -1
- package/PlaneModal1/index.js +1 -1
- package/PlaneText.d.ts +27 -27
- package/PlaneText.js +35 -35
- package/PlaneWithHtml.d.ts +13 -13
- package/PlaneWithHtml.js +66 -64
- package/PlaneWithHtml.ts +3 -1
- package/PointLight/PointLight.d.ts +13 -13
- package/PointLight/PointLight.js +64 -64
- package/PointLight/index.d.ts +1 -1
- package/PointLight/index.js +1 -1
- package/Sky/Sky.d.ts +9 -9
- package/Sky/Sky.js +22 -22
- package/Sky/index.d.ts +1 -1
- package/Sky/index.js +1 -1
- package/SpotLight.d.ts +6 -6
- package/SpotLight.js +72 -72
- package/SpriteModal1/SpriteModal1.d.ts +33 -33
- package/SpriteModal1/SpriteModal1.js +116 -116
- package/SpriteModal1/index.d.ts +1 -1
- package/SpriteModal1/index.js +1 -1
- package/SpriteText.d.ts +46 -46
- package/SpriteText.js +176 -176
- package/SpriteText2.d.ts +48 -48
- package/SpriteText2.js +223 -223
- package/SpriteText3.d.ts +86 -86
- package/SpriteText3.js +517 -517
- package/SpriteText3.ts +599 -599
- package/SpriteWithHtml.d.ts +9 -9
- package/SpriteWithHtml.js +46 -44
- package/SpriteWithHtml.ts +3 -1
- package/Text3D/Text3D.d.ts +20 -20
- package/Text3D/Text3D.js +58 -58
- package/Text3D/fontController.d.ts +60 -60
- package/Text3D/fontController.js +166 -166
- package/Text3D/index.d.ts +1 -1
- package/Text3D/index.js +1 -1
- package/ThreeBase.d.ts +248 -248
- package/ThreeBase.js +1202 -1202
- package/ThreeBase.ts +1314 -1314
- package/ThreeMouse.d.ts +53 -54
- package/ThreeMouse.js +453 -453
- package/Transition.d.ts +45 -45
- package/Transition.js +209 -209
- package/Water/Water.d.ts +5 -5
- package/Water/Water.js +44 -44
- package/Water/index.d.ts +2 -2
- package/Water/index.js +2 -2
- package/WaterFlow/FloatingDuck.d.ts +88 -88
- package/WaterFlow/FloatingDuck.js +307 -307
- package/WaterFlow/FloatingDuck.ts +445 -445
- package/WaterFlow/GPUFluidSimulation.d.ts +56 -56
- package/WaterFlow/GPUFluidSimulation.js +781 -781
- package/WaterFlow/GPUFluidSimulation.ts +827 -827
- package/WaterFlow/ReservoirSystem.d.ts +106 -106
- package/WaterFlow/ReservoirSystem.js +611 -611
- package/WaterFlow/ReservoirSystem.ts +754 -754
- package/WaterFlow/SPHField.d.ts +35 -35
- package/WaterFlow/SPHField.js +203 -203
- package/WaterFlow/SPHField.ts +228 -228
- package/WaterFlow/ScreenSpaceFluidPass.d.ts +69 -69
- package/WaterFlow/ScreenSpaceFluidPass.js +728 -728
- package/WaterFlow/ScreenSpaceFluidPass.ts +789 -789
- package/WaterFlow/ShallowWaterSurface.d.ts +45 -45
- package/WaterFlow/ShallowWaterSurface.js +438 -438
- package/WaterFlow/ShallowWaterSurface.ts +510 -510
- package/WaterFlow/WaterFlow.d.ts +87 -87
- package/WaterFlow/WaterFlow.js +171 -171
- package/WaterFlow/WaterFlow.ts +219 -219
- package/WaterFlow/types.d.ts +161 -161
- package/WaterFlow/types.js +1 -1
- package/WaterFlow/types.ts +189 -189
- package/WaterFlow/waterFlowPass.d.ts +3 -3
- package/WaterFlow/waterFlowPass.js +20 -20
- package/WaterFlow/waterFlowPass.ts +40 -40
- package/collisionOBB.d.ts +42 -42
- package/collisionOBB.js +112 -112
- package/collisionOBB.ts +108 -108
- package/declare.d.ts +25 -25
- package/index.d.ts +1 -1
- package/index.js +1 -1
- package/instanced/InstancedBatch.d.ts +57 -57
- package/instanced/InstancedBatch.js +348 -348
- package/instanced/InstancedBatch.ts +406 -406
- package/instanced/InstancedChild.d.ts +174 -174
- package/instanced/InstancedChild.js +264 -264
- package/instanced/InstancedChild.ts +327 -327
- package/instanced/InstancedGroup.d.ts +43 -43
- package/instanced/InstancedGroup.js +126 -126
- package/instanced/InstancedGroup.ts +137 -137
- package/instanced/InstancedMeshBase.d.ts +38 -38
- package/instanced/InstancedMeshBase.js +282 -282
- package/instanced/InstancedTemplate.d.ts +46 -46
- package/instanced/InstancedTemplate.js +125 -125
- package/keyControls.d.ts +29 -30
- package/keyControls.js +101 -101
- package/lensflare/LensFlare.d.ts +39 -39
- package/lensflare/LensFlare.js +284 -284
- package/package.json +6 -1
- package/pass/bloom_pass.d.ts +2 -2
- package/pass/bloom_pass.js +174 -174
- package/pass/cover_pass.d.ts +2 -2
- package/pass/cover_pass.js +108 -108
- package/pass/debugDepthState.d.ts +20 -20
- package/pass/debugDepthState.js +9 -9
- package/pass/debugDepthState.ts +22 -22
- package/pass/depthTestBias.d.ts +12 -12
- package/pass/depthTestBias.js +12 -12
- package/pass/depthTestBias.ts +12 -12
- package/pass/effectUserData.d.ts +27 -27
- package/pass/effectUserData.js +1 -1
- package/pass/effectUserData.ts +46 -46
- package/pass/frosted_glass_pass.d.ts +2 -2
- package/pass/frosted_glass_pass.js +150 -150
- package/pass/fsQuad.d.ts +9 -9
- package/pass/fsQuad.js +28 -28
- package/pass/glow_pass.d.ts +2 -2
- package/pass/glow_pass.js +350 -350
- package/pass/screen_bloom_pass.d.ts +11 -11
- package/pass/screen_bloom_pass.js +136 -136
- package/pass/ssao_pass.d.ts +88 -88
- package/pass/ssao_pass.js +799 -799
- package/pass/ssao_pass.ts +918 -918
- package/pass/stroke_pass.d.ts +2 -2
- package/pass/stroke_pass.js +267 -267
- package/shaders/FXAAShaderMaterial.d.ts +3 -3
- package/shaders/FXAAShaderMaterial.js +20 -20
- package/shaders/baseDepthVisShader.d.ts +11 -11
- package/shaders/baseDepthVisShader.js +36 -36
- package/shaders/baseDepthVisShader.ts +36 -36
- package/shaders/baseTextureToRenderShader.d.ts +2 -2
- package/shaders/baseTextureToRenderShader.js +19 -19
- package/shaders/copyShader.d.ts +3 -3
- package/shaders/copyShader.js +13 -13
- package/shaders/debugDepthCompareShader.d.ts +14 -14
- package/shaders/debugDepthCompareShader.js +49 -49
- package/shaders/debugDepthCompareShader.ts +50 -50
- package/shaders/debugDepthJudgeShader.d.ts +18 -18
- package/shaders/debugDepthJudgeShader.js +52 -52
- package/shaders/debugDepthJudgeShader.ts +54 -54
- package/shaders/debugExcludedShader.d.ts +13 -13
- package/shaders/debugExcludedShader.js +46 -46
- package/shaders/debugExcludedShader.ts +48 -48
- package/spriteTextBg.d.ts +1 -1
- package/spriteTextBg.js +20 -20
- package/spriteTextBg.ts +20 -20
- package/threeLoader.d.ts +35 -35
- package/threeLoader.js +518 -518
- package/threeUtils.d.ts +71 -53
- package/threeUtils.js +363 -329
- package/threeUtils.ts +35 -0
- package/types.d.ts +2 -2
- 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
|
+
}
|