three-base 2.0.137 → 2.0.142
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/DirectionalLight.ts +70 -0
- package/EventMap.d.ts +103 -0
- package/EventMap.js +17 -0
- package/EventMap.ts +139 -0
- package/EventMesh.d.ts +18 -18
- package/EventMesh.js +59 -59
- package/EventMesh.ts +60 -0
- package/ExtrudeMesh.d.ts +112 -112
- package/ExtrudeMesh.js +342 -366
- package/ExtrudeMesh.ts +553 -0
- package/FPScontrol.d.ts +511 -78
- package/FPScontrol.js +1799 -617
- package/FPScontrol.ts +1855 -0
- package/Fire/Fire.d.ts +28 -28
- package/Fire/Fire.js +80 -79
- package/Fire/Fire.ts +89 -0
- package/Fire/{FireGromtry.d.ts → FireGeometry.d.ts} +9 -9
- package/Fire/{FireGromtry.js → FireGeometry.js} +40 -40
- package/Fire/FireGeometry.ts +40 -0
- package/Fire/FireMaterial.d.ts +28 -28
- package/Fire/FireMaterial.js +32 -32
- package/Fire/FireMaterial.ts +89 -0
- package/Fire/index.d.ts +2 -1
- package/Fire/index.js +2 -1
- package/Fire/index.ts +2 -0
- package/GLTFDracoLoader.d.ts +71 -0
- package/GLTFDracoLoader.js +266 -0
- package/GLTFDracoLoader.ts +430 -0
- package/Grass/Grass.d.ts +8 -8
- package/Grass/Grass.js +38 -38
- package/Grass/Grass.ts +38 -0
- package/Grass/index.d.ts +2 -1
- package/Grass/index.js +2 -1
- package/Grass/index.ts +2 -0
- package/Ground1/Ground1.d.ts +10 -11
- package/Ground1/Ground1.js +95 -91
- package/Ground1/Ground1.ts +114 -0
- package/Ground1/index.d.ts +1 -1
- package/Ground1/index.js +1 -1
- package/Ground1/index.ts +1 -0
- package/MeshBase.d.ts +36 -35
- package/MeshBase.js +247 -223
- package/MeshBase.ts +253 -0
- package/Mirror.d.ts +25 -25
- package/Mirror.js +143 -139
- package/Mirror.ts +203 -0
- package/MktMesh/MktMesh.d.ts +291 -0
- package/MktMesh/MktMesh.js +1045 -0
- package/MktMesh/MktMesh.ts +1075 -0
- package/MktMesh/assetUrl.d.ts +35 -0
- package/MktMesh/assetUrl.js +69 -0
- package/MktMesh/assetUrl.ts +69 -0
- package/MktMesh/mktMappingShader.d.ts +12 -0
- package/MktMesh/mktMappingShader.js +139 -0
- package/MktMesh/mktMappingShader.ts +139 -0
- package/MktMesh/mktShader.d.ts +263 -0
- package/MktMesh/mktShader.js +1248 -0
- package/MktMesh/mktShader.ts +1344 -0
- package/MktMesh/panoBitmapTexture.d.ts +25 -0
- package/MktMesh/panoBitmapTexture.js +52 -0
- package/MktMesh/panoBitmapTexture.ts +54 -0
- package/MktMesh/panoSlotBind.d.ts +29 -0
- package/MktMesh/panoSlotBind.js +106 -0
- package/MktMesh/panoSlotBind.ts +153 -0
- package/MktMesh/panoSlotRoster.d.ts +22 -0
- package/MktMesh/panoSlotRoster.js +169 -0
- package/MktMesh/panoSlotRoster.ts +168 -0
- package/MktMesh/panoTileStitcher.d.ts +119 -0
- package/MktMesh/panoTileStitcher.js +533 -0
- package/MktMesh/panoTileStitcher.ts +616 -0
- package/MktMesh/types.d.ts +75 -0
- package/MktMesh/types.js +1 -0
- package/MktMesh/types.ts +87 -0
- package/MktMesh/wallCapTessellate.d.ts +33 -0
- package/MktMesh/wallCapTessellate.js +97 -0
- package/MktMesh/wallCapTessellate.ts +68 -0
- package/PipeMesh/PathGeometry.d.ts +44 -44
- package/PipeMesh/PathGeometry.js +307 -300
- package/PipeMesh/PathGeometry.ts +343 -0
- package/PipeMesh/PathPoint.d.ts +17 -17
- package/PipeMesh/PathPoint.js +31 -31
- package/PipeMesh/PathPoint.ts +36 -0
- package/PipeMesh/PathPointList.d.ts +31 -31
- package/PipeMesh/PathPointList.js +209 -208
- package/PipeMesh/PathPointList.ts +227 -0
- package/PipeMesh/PathTubeGeometry.d.ts +25 -25
- package/PipeMesh/PathTubeGeometry.js +130 -130
- package/PipeMesh/PathTubeGeometry.ts +146 -0
- package/PipeMesh/PipeMesh.d.ts +25 -25
- package/PipeMesh/PipeMesh.js +63 -63
- package/PipeMesh/PipeMesh.ts +76 -0
- package/PipeMesh/index.d.ts +1 -1
- package/PipeMesh/index.js +1 -1
- package/PipeMesh/index.ts +1 -0
- package/PlaneModal1/PlaneModal1.d.ts +34 -31
- package/PlaneModal1/PlaneModal1.js +109 -105
- package/PlaneModal1/PlaneModal1.ts +138 -0
- package/PlaneModal1/index.d.ts +1 -1
- package/PlaneModal1/index.js +1 -1
- package/PlaneModal1/index.ts +1 -0
- package/PlaneText.d.ts +27 -39
- package/PlaneText.js +35 -30
- package/PlaneText.ts +55 -0
- package/PlaneWithHtml.d.ts +13 -11
- package/PlaneWithHtml.js +64 -63
- package/PlaneWithHtml.ts +70 -0
- package/PointLight/PointLight.d.ts +13 -14
- package/PointLight/PointLight.js +64 -70
- package/PointLight/PointLight.ts +67 -0
- package/PointLight/index.d.ts +1 -1
- package/PointLight/index.js +1 -1
- package/PointLight/index.ts +1 -0
- package/README.md +110 -79
- package/Sky/Sky.d.ts +9 -9
- package/Sky/Sky.js +22 -22
- package/Sky/Sky.ts +22 -0
- package/Sky/index.d.ts +1 -1
- package/Sky/index.js +1 -1
- package/Sky/index.ts +1 -0
- package/SpotLight.d.ts +6 -6
- package/SpotLight.js +72 -72
- package/SpotLight.ts +74 -0
- package/SpriteModal1/SpriteModal1.d.ts +33 -30
- package/SpriteModal1/SpriteModal1.js +116 -110
- package/SpriteModal1/SpriteModal1.ts +146 -0
- package/SpriteModal1/index.d.ts +1 -1
- package/SpriteModal1/index.js +1 -1
- package/SpriteModal1/index.ts +1 -0
- package/SpriteText.d.ts +46 -45
- package/SpriteText.js +176 -163
- package/SpriteText.ts +205 -0
- package/SpriteText2.d.ts +48 -47
- package/SpriteText2.js +223 -198
- package/SpriteText2.ts +258 -0
- package/SpriteText3.d.ts +86 -0
- package/SpriteText3.js +519 -0
- package/SpriteText3.ts +599 -0
- package/SpriteWithHtml.d.ts +9 -7
- package/SpriteWithHtml.js +44 -44
- package/SpriteWithHtml.ts +50 -0
- package/Text3D/Text3D.d.ts +20 -20
- package/Text3D/Text3D.js +58 -62
- package/Text3D/Text3D.ts +77 -0
- package/Text3D/fontController.d.ts +60 -59
- package/Text3D/fontController.js +166 -199
- package/Text3D/fontController.ts +209 -0
- package/Text3D/index.d.ts +1 -1
- package/Text3D/index.js +1 -1
- package/Text3D/index.ts +1 -0
- package/ThreeBase.d.ts +248 -111
- package/ThreeBase.js +1202 -656
- package/ThreeBase.ts +1314 -0
- package/ThreeMouse.d.ts +54 -40
- package/ThreeMouse.js +453 -407
- package/ThreeMouse.ts +472 -0
- package/Transition.d.ts +45 -40
- package/Transition.js +209 -210
- package/Transition.ts +242 -0
- package/Water/Water.d.ts +5 -5
- package/Water/Water.js +44 -26
- package/Water/Water.ts +45 -0
- package/Water/index.d.ts +2 -0
- package/Water/index.js +2 -0
- package/Water/index.ts +2 -0
- package/WaterFlow/FloatingDuck.d.ts +88 -0
- package/WaterFlow/FloatingDuck.js +307 -0
- package/WaterFlow/FloatingDuck.ts +445 -0
- package/WaterFlow/GPUFluidSimulation.d.ts +56 -0
- package/WaterFlow/GPUFluidSimulation.js +785 -0
- package/WaterFlow/GPUFluidSimulation.ts +827 -0
- package/WaterFlow/ReservoirSystem.d.ts +106 -0
- package/WaterFlow/ReservoirSystem.js +621 -0
- package/WaterFlow/ReservoirSystem.ts +754 -0
- package/WaterFlow/SPHField.d.ts +35 -0
- package/WaterFlow/SPHField.js +204 -0
- package/WaterFlow/SPHField.ts +228 -0
- package/WaterFlow/ScreenSpaceFluidPass.d.ts +69 -0
- package/WaterFlow/ScreenSpaceFluidPass.js +736 -0
- package/WaterFlow/ScreenSpaceFluidPass.ts +789 -0
- package/WaterFlow/ShallowWaterSurface.d.ts +45 -0
- package/WaterFlow/ShallowWaterSurface.js +441 -0
- package/WaterFlow/ShallowWaterSurface.ts +510 -0
- package/WaterFlow/WaterFlow.d.ts +87 -0
- package/WaterFlow/WaterFlow.js +171 -0
- package/WaterFlow/WaterFlow.ts +219 -0
- package/WaterFlow/types.d.ts +161 -0
- package/WaterFlow/types.js +1 -0
- package/WaterFlow/types.ts +189 -0
- package/WaterFlow/waterFlowPass.d.ts +3 -0
- package/WaterFlow/waterFlowPass.js +20 -0
- package/WaterFlow/waterFlowPass.ts +40 -0
- package/collisionOBB.d.ts +42 -0
- package/collisionOBB.js +112 -0
- package/collisionOBB.ts +108 -0
- package/declare.d.ts +23 -165
- package/index.d.ts +1 -1
- package/index.js +1 -2
- package/index.ts +1 -0
- package/instanced/InstancedBatch.d.ts +57 -0
- package/instanced/InstancedBatch.js +348 -0
- package/instanced/InstancedBatch.ts +406 -0
- package/instanced/InstancedChild.d.ts +174 -0
- package/instanced/InstancedChild.js +264 -0
- package/instanced/InstancedChild.ts +327 -0
- package/instanced/InstancedGroup.d.ts +43 -0
- package/instanced/InstancedGroup.js +126 -0
- package/instanced/InstancedGroup.ts +137 -0
- package/{InstancedMeshBase.d.ts → instanced/InstancedMeshBase.d.ts} +38 -39
- package/{InstancedMeshBase.js → instanced/InstancedMeshBase.js} +282 -293
- package/instanced/InstancedMeshBase.ts +292 -0
- package/instanced/InstancedTemplate.d.ts +46 -0
- package/instanced/InstancedTemplate.js +125 -0
- package/instanced/InstancedTemplate.ts +188 -0
- package/keyControls.d.ts +30 -0
- package/{keyContorls.js → keyControls.js} +101 -98
- package/keyControls.ts +107 -0
- package/lensflare/LensFlare.d.ts +39 -0
- package/lensflare/LensFlare.js +373 -0
- package/lensflare/LensFlare.ts +448 -0
- package/lensflare/lensflare0.png +0 -0
- package/lensflare/lensflare3.png +0 -0
- package/lensflare/lensflare_custom.png +0 -0
- package/lensflare/lensflare_hex_ghost.png +0 -0
- package/lensflare/lensflare_hex_main.png +0 -0
- package/package.json +99 -25
- package/pass/bloom_pass.d.ts +2 -2
- package/pass/bloom_pass.js +188 -101
- package/pass/bloom_pass.ts +243 -0
- package/pass/cover_pass.d.ts +2 -2
- package/pass/cover_pass.js +122 -99
- package/pass/cover_pass.ts +182 -0
- package/pass/debugDepthState.d.ts +20 -0
- package/pass/debugDepthState.js +9 -0
- package/pass/debugDepthState.ts +22 -0
- package/pass/depthTestBias.d.ts +12 -0
- package/pass/depthTestBias.js +12 -0
- package/pass/depthTestBias.ts +12 -0
- package/pass/effectUserData.d.ts +27 -0
- package/pass/effectUserData.js +1 -0
- package/pass/effectUserData.ts +46 -0
- package/pass/frosted_glass_pass.d.ts +2 -2
- package/pass/frosted_glass_pass.js +167 -186
- package/pass/frosted_glass_pass.ts +288 -0
- package/pass/fsQuad.d.ts +9 -9
- package/pass/fsQuad.js +28 -28
- package/pass/fsQuad.ts +34 -0
- package/pass/glow_pass.d.ts +2 -2
- package/pass/glow_pass.js +449 -233
- package/pass/glow_pass.ts +654 -0
- package/pass/screen_bloom_pass.d.ts +11 -0
- package/pass/screen_bloom_pass.js +235 -0
- package/pass/screen_bloom_pass.ts +263 -0
- package/pass/ssao_pass.d.ts +88 -13
- package/pass/ssao_pass.js +802 -366
- package/pass/ssao_pass.ts +918 -0
- package/pass/stroke_pass.d.ts +2 -2
- package/pass/stroke_pass.js +329 -258
- package/pass/stroke_pass.ts +638 -0
- package/shaders/FXAAShaderMaterial.d.ts +3 -3
- package/shaders/FXAAShaderMaterial.js +23 -66
- package/shaders/FXAAShaderMaterial.ts +201 -0
- package/shaders/baseDepthVisShader.d.ts +11 -0
- package/shaders/baseDepthVisShader.js +36 -0
- package/shaders/baseDepthVisShader.ts +36 -0
- package/shaders/baseTextureToRenderShader.d.ts +2 -2
- package/shaders/baseTextureToRenderShader.js +55 -60
- package/shaders/baseTextureToRenderShader.ts +232 -0
- package/shaders/copyShader.d.ts +3 -3
- package/shaders/copyShader.js +13 -14
- package/shaders/copyShader.ts +32 -0
- package/shaders/debugDepthCompareShader.d.ts +14 -0
- package/shaders/debugDepthCompareShader.js +49 -0
- package/shaders/debugDepthCompareShader.ts +50 -0
- package/shaders/debugDepthJudgeShader.d.ts +18 -0
- package/shaders/debugDepthJudgeShader.js +52 -0
- package/shaders/debugDepthJudgeShader.ts +54 -0
- package/shaders/debugExcludedShader.d.ts +13 -0
- package/shaders/debugExcludedShader.js +46 -0
- package/shaders/debugExcludedShader.ts +48 -0
- package/spriteTextBg.d.ts +1 -0
- package/spriteTextBg.js +20 -0
- package/spriteTextBg.ts +20 -0
- package/threeLoader.d.ts +35 -34
- package/threeLoader.js +518 -527
- package/threeLoader.ts +525 -0
- package/threeUtils.d.ts +53 -52
- package/threeUtils.js +329 -330
- package/threeUtils.ts +373 -0
- package/types.d.ts +2 -0
- package/types.js +6 -0
- package/types.ts +8 -0
- package/ApngTexture.d.ts +0 -13
- package/ApngTexture.js +0 -61
- package/ApngTextureManage.d.ts +0 -18
- package/ApngTextureManage.js +0 -87
- package/KeyFrameAnimation.d.ts +0 -25
- package/KeyFrameAnimation.js +0 -78
- package/keyContorls.d.ts +0 -25
- package/lib/draco/draco_decoder.js +0 -34
- package/lib/draco/draco_decoder.wasm +0 -0
- package/lib/draco/draco_wasm_wrapper.js +0 -117
- package/pass/emissive_ao_pass.d.ts +0 -13
- package/pass/emissive_ao_pass.js +0 -370
- package/shaders.d.ts +0 -5
- package/shaders.js +0 -93
package/Mirror.ts
ADDED
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* @Author: xiaosihan
|
|
3
|
+
* @Date: 2023-08-04 17:17:15
|
|
4
|
+
* @Last Modified by: xiaosihan
|
|
5
|
+
* @Last Modified time: 2024-01-20 05:33:51
|
|
6
|
+
*/
|
|
7
|
+
import { Color, DoubleSide, HalfFloatType, Matrix4, Mesh, PerspectiveCamera, Plane, PlaneGeometry, ShaderMaterial, Vector3, Vector4, WebGLRenderTarget, WebGLRenderer, Scene, Camera, BufferGeometry, Material, Group, Texture } from "three";
|
|
8
|
+
|
|
9
|
+
// 镜子模型
|
|
10
|
+
export default class Mirror extends Mesh {
|
|
11
|
+
constructor(geometry: BufferGeometry = Mirror.geometry) {
|
|
12
|
+
super(geometry);
|
|
13
|
+
// 镜子虽标了 transparent:true(为渲染顺序),但 fragment shader 实际输出 alpha=1.0,
|
|
14
|
+
// 是实心反射面、并非可透视表面 → 必须参与 AO 与描边/辉光的深度遮挡。
|
|
15
|
+
// SSAO 的 AO 数据准备会排除所有 transparent 物体,故此处显式声明保留。
|
|
16
|
+
this.userData.aoOpaque = true;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// 正方形网格
|
|
20
|
+
static geometry: PlaneGeometry = (() => {
|
|
21
|
+
const geometry = new PlaneGeometry(10, 10, 1, 1);
|
|
22
|
+
return geometry;
|
|
23
|
+
})();
|
|
24
|
+
|
|
25
|
+
isReflector: boolean = true;
|
|
26
|
+
type: string = 'Reflector';
|
|
27
|
+
camera: PerspectiveCamera = new PerspectiveCamera();
|
|
28
|
+
reflectorPlane: Plane = new Plane();
|
|
29
|
+
normal: Vector3 = new Vector3();
|
|
30
|
+
reflectorWorldPosition: Vector3 = new Vector3();
|
|
31
|
+
cameraWorldPosition: Vector3 = new Vector3();
|
|
32
|
+
rotationMatrix: Matrix4 = new Matrix4();
|
|
33
|
+
lookAtPosition: Vector3 = new Vector3(0, 0, -1);
|
|
34
|
+
clipPlane: Vector4 = new Vector4();
|
|
35
|
+
view: Vector3 = new Vector3();
|
|
36
|
+
target: Vector3 = new Vector3();
|
|
37
|
+
q: Vector4 = new Vector4();
|
|
38
|
+
textureMatrix: Matrix4 = new Matrix4();
|
|
39
|
+
virtualCamera: PerspectiveCamera = this.camera;
|
|
40
|
+
renderTarget: WebGLRenderTarget<Texture> = new WebGLRenderTarget(2048, 2048, { type: HalfFloatType });
|
|
41
|
+
material: ShaderMaterial = new ShaderMaterial({
|
|
42
|
+
uniforms: {
|
|
43
|
+
'color': {
|
|
44
|
+
value: new Color("#b6b6b6")
|
|
45
|
+
},
|
|
46
|
+
'tDiffuse': {
|
|
47
|
+
value: this.renderTarget.texture
|
|
48
|
+
},
|
|
49
|
+
'textureMatrix': {
|
|
50
|
+
value: this.textureMatrix
|
|
51
|
+
},
|
|
52
|
+
blurAmount: {
|
|
53
|
+
value: 0.5
|
|
54
|
+
} // 模糊程度,可以根据需求调整
|
|
55
|
+
},
|
|
56
|
+
vertexShader: /* glsl */ `
|
|
57
|
+
uniform mat4 textureMatrix;
|
|
58
|
+
varying vec4 vUv;
|
|
59
|
+
|
|
60
|
+
#include <common>
|
|
61
|
+
#include <logdepthbuf_pars_vertex>
|
|
62
|
+
|
|
63
|
+
void main() {
|
|
64
|
+
|
|
65
|
+
vUv = textureMatrix * vec4( position, 1.0 );
|
|
66
|
+
|
|
67
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
|
|
68
|
+
|
|
69
|
+
#include <logdepthbuf_vertex>
|
|
70
|
+
|
|
71
|
+
}`,
|
|
72
|
+
fragmentShader: /* glsl */ `
|
|
73
|
+
uniform vec3 color;
|
|
74
|
+
uniform sampler2D tDiffuse;
|
|
75
|
+
varying vec4 vUv;
|
|
76
|
+
uniform float blurAmount;
|
|
77
|
+
|
|
78
|
+
#include <logdepthbuf_pars_fragment>
|
|
79
|
+
|
|
80
|
+
float blendOverlay( float base, float blend ) {
|
|
81
|
+
|
|
82
|
+
return( base < 0.5 ? ( 2.0 * base * blend ) : ( 1.0 - 2.0 * ( 1.0 - base ) * ( 1.0 - blend ) ) );
|
|
83
|
+
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
vec3 blendOverlay( vec3 base, vec3 blend ) {
|
|
87
|
+
|
|
88
|
+
return vec3( blendOverlay( base.r, blend.r ), blendOverlay( base.g, blend.g ), blendOverlay( base.b, blend.b ) );
|
|
89
|
+
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
void main() {
|
|
93
|
+
|
|
94
|
+
#include <logdepthbuf_fragment>
|
|
95
|
+
|
|
96
|
+
vec2 texelSize = 1.0 / vec2(1024,1024);
|
|
97
|
+
vec4 fragColor = vec4(0.0);
|
|
98
|
+
|
|
99
|
+
for (float offsetX = -blurAmount; offsetX <= blurAmount; offsetX += texelSize.x) {
|
|
100
|
+
for (float offsetY = -blurAmount; offsetY <= blurAmount; offsetY += texelSize.y) {
|
|
101
|
+
// fragColor += texture2DProj(tDiffuse, vUv + vec4(offsetX, offsetY, 0.0, 0.0) * texelSize);
|
|
102
|
+
fragColor += texture2DProj(tDiffuse, vUv + vec4(offsetX * texelSize.x, offsetY * texelSize.y, 0.0, 0.0) );
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// fragColor /= pow(2.0 * blurAmount + 1.0, 2.0);
|
|
107
|
+
// gl_FragColor = color;
|
|
108
|
+
|
|
109
|
+
fragColor = texture2DProj( tDiffuse, vUv );
|
|
110
|
+
gl_FragColor = vec4( blendOverlay( fragColor.rgb, color ), 1.0 );
|
|
111
|
+
|
|
112
|
+
#include <tonemapping_fragment>
|
|
113
|
+
#include <colorspace_fragment>
|
|
114
|
+
}`,
|
|
115
|
+
depthTest: true,
|
|
116
|
+
depthWrite: true,
|
|
117
|
+
transparent: true,
|
|
118
|
+
side: DoubleSide
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
onBeforeRender = (renderer: WebGLRenderer, scene: Scene, camera: Camera, geometry: BufferGeometry, material: Material, group: Group): void => {
|
|
122
|
+
this.reflectorWorldPosition.setFromMatrixPosition(this.matrixWorld);
|
|
123
|
+
this.cameraWorldPosition.setFromMatrixPosition(camera.matrixWorld);
|
|
124
|
+
this.rotationMatrix.extractRotation(this.matrixWorld);
|
|
125
|
+
this.normal.set(0, 0, 1);
|
|
126
|
+
this.normal.applyMatrix4(this.rotationMatrix);
|
|
127
|
+
this.view.subVectors(this.reflectorWorldPosition, this.cameraWorldPosition);
|
|
128
|
+
// Avoid rendering when reflector is facing away
|
|
129
|
+
if (this.view.dot(this.normal) > 0) {
|
|
130
|
+
this.normal.set(0, 0, -1);
|
|
131
|
+
};
|
|
132
|
+
this.view.reflect(this.normal).negate();
|
|
133
|
+
this.view.add(this.reflectorWorldPosition);
|
|
134
|
+
this.rotationMatrix.extractRotation(camera.matrixWorld);
|
|
135
|
+
this.lookAtPosition.set(0, 0, -1);
|
|
136
|
+
this.lookAtPosition.applyMatrix4(this.rotationMatrix);
|
|
137
|
+
this.lookAtPosition.add(this.cameraWorldPosition);
|
|
138
|
+
this.target.subVectors(this.reflectorWorldPosition, this.lookAtPosition);
|
|
139
|
+
this.target.reflect(this.normal).negate();
|
|
140
|
+
this.target.add(this.reflectorWorldPosition);
|
|
141
|
+
this.virtualCamera.position.copy(this.view);
|
|
142
|
+
this.virtualCamera.up.set(0, 1, 0);
|
|
143
|
+
this.virtualCamera.up.applyMatrix4(this.rotationMatrix);
|
|
144
|
+
this.virtualCamera.up.reflect(this.normal);
|
|
145
|
+
this.virtualCamera.lookAt(this.target);
|
|
146
|
+
this.virtualCamera.far = this.camera.far; // Used in WebGLBackground
|
|
147
|
+
this.virtualCamera.updateMatrixWorld();
|
|
148
|
+
this.virtualCamera.projectionMatrix.copy(camera.projectionMatrix);
|
|
149
|
+
// Update the texture matrix
|
|
150
|
+
this.textureMatrix.set(0.5, 0.0, 0.0, 0.5, 0.0, 0.5, 0.0, 0.5, 0.0, 0.0, 0.5, 0.5, 0.0, 0.0, 0.0, 1.0);
|
|
151
|
+
this.textureMatrix.multiply(this.virtualCamera.projectionMatrix);
|
|
152
|
+
this.textureMatrix.multiply(this.virtualCamera.matrixWorldInverse);
|
|
153
|
+
this.textureMatrix.multiply(this.matrixWorld);
|
|
154
|
+
// Now update projection matrix with new clip plane, implementing code from: http://www.terathon.com/code/oblique.html
|
|
155
|
+
// Paper explaining this technique: http://www.terathon.com/lengyel/Lengyel-Oblique.pdf
|
|
156
|
+
this.reflectorPlane.setFromNormalAndCoplanarPoint(this.normal, this.reflectorWorldPosition);
|
|
157
|
+
this.reflectorPlane.applyMatrix4(this.virtualCamera.matrixWorldInverse);
|
|
158
|
+
this.clipPlane.set(this.reflectorPlane.normal.x, this.reflectorPlane.normal.y, this.reflectorPlane.normal.z, this.reflectorPlane.constant);
|
|
159
|
+
const projectionMatrix = this.virtualCamera.projectionMatrix;
|
|
160
|
+
this.q.x = (Math.sign(this.clipPlane.x) + projectionMatrix.elements[8]) / projectionMatrix.elements[0];
|
|
161
|
+
this.q.y = (Math.sign(this.clipPlane.y) + projectionMatrix.elements[9]) / projectionMatrix.elements[5];
|
|
162
|
+
this.q.z = -1.0;
|
|
163
|
+
this.q.w = (1.0 + projectionMatrix.elements[10]) / projectionMatrix.elements[14];
|
|
164
|
+
// Calculate the scaled plane vector
|
|
165
|
+
this.clipPlane.multiplyScalar(2.0 / this.clipPlane.dot(this.q));
|
|
166
|
+
// Replacing the third row of the projection matrix
|
|
167
|
+
projectionMatrix.elements[2] = this.clipPlane.x;
|
|
168
|
+
projectionMatrix.elements[6] = this.clipPlane.y;
|
|
169
|
+
projectionMatrix.elements[10] = this.clipPlane.z + 1.0 - 0.003;
|
|
170
|
+
projectionMatrix.elements[14] = this.clipPlane.w;
|
|
171
|
+
// Render
|
|
172
|
+
this.visible = false;
|
|
173
|
+
const currentRenderTarget = renderer.getRenderTarget();
|
|
174
|
+
const currentXrEnabled = renderer.xr.enabled;
|
|
175
|
+
const currentShadowAutoUpdate = renderer.shadowMap.autoUpdate;
|
|
176
|
+
renderer.xr.enabled = false; // Avoid camera modification
|
|
177
|
+
renderer.shadowMap.autoUpdate = false; // Avoid re-computing shadows
|
|
178
|
+
renderer.setRenderTarget(this.renderTarget);
|
|
179
|
+
renderer.state.buffers.depth.setMask(true); // make sure the depth buffer is writable so it can be properly cleared, see #18897
|
|
180
|
+
if (renderer.autoClear === false)
|
|
181
|
+
renderer.clear();
|
|
182
|
+
renderer.render(scene, this.virtualCamera);
|
|
183
|
+
renderer.xr.enabled = currentXrEnabled;
|
|
184
|
+
renderer.shadowMap.autoUpdate = currentShadowAutoUpdate;
|
|
185
|
+
renderer.setRenderTarget(currentRenderTarget);
|
|
186
|
+
// Restore viewport
|
|
187
|
+
const cameraWithViewport = this.camera as PerspectiveCamera & { viewport?: { x: number; y: number; width: number; height: number } };
|
|
188
|
+
const viewport = cameraWithViewport.viewport;
|
|
189
|
+
if (viewport !== undefined) {
|
|
190
|
+
renderer.state.viewport(viewport);
|
|
191
|
+
}
|
|
192
|
+
this.visible = true;
|
|
193
|
+
};
|
|
194
|
+
|
|
195
|
+
getRenderTarget(): WebGLRenderTarget<Texture> {
|
|
196
|
+
return this.renderTarget;
|
|
197
|
+
};
|
|
198
|
+
|
|
199
|
+
dispose(): void {
|
|
200
|
+
this.renderTarget.dispose();
|
|
201
|
+
// this.material.dispose();
|
|
202
|
+
};
|
|
203
|
+
}
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
import { BufferGeometry, Camera, Matrix4, Mesh, ShaderMaterial, Texture, Vector3 } from "three";
|
|
2
|
+
import { type PanoTexMode } from "./mktShader";
|
|
3
|
+
import { type PanoStitcher } from "./panoTileStitcher";
|
|
4
|
+
import type { MktMeshData, MktTextureInfo, WallPoint, WallSide } from "./types";
|
|
5
|
+
export default class MktMesh extends Mesh<BufferGeometry, ShaderMaterial> {
|
|
6
|
+
/** 纹理列表(每个纹理的 url + 世界矩阵) */
|
|
7
|
+
textures: MktTextureInfo[];
|
|
8
|
+
/** 当前激活(正在绘制)的纹理索引,-1 表示尚未激活。⭐ 10-03 起该值 = 槽位名册的**中心**(`_slotPanos[0]`),不是「每帧纯最近那张」 */
|
|
9
|
+
activeIndex: number;
|
|
10
|
+
/** 墙体地面折线点位(XZ 平面,世界坐标) */
|
|
11
|
+
wallPoints: WallPoint[];
|
|
12
|
+
/** 墙体高度(沿 +Y 挤出) */
|
|
13
|
+
wallHeight: number;
|
|
14
|
+
/** 墙体折线是否闭合(首尾相连成环) */
|
|
15
|
+
wallClosed: boolean;
|
|
16
|
+
/** 墙体正反面显示(字段保留兼容存档;09-29 晚旨后无论何值材质一律 BackSide,见 _wallSideToThree) */
|
|
17
|
+
wallSide: WallSide;
|
|
18
|
+
/** 是否跳过墙体上/下多边形封盖(true = 只留侧面幕墙)。⚠️ 2026-09-26 核实:本库与编辑态**都取默认 false**
|
|
19
|
+
* (旧注释写「编辑态 MktDevMesh 设为 true」是错的 —— MktDevMesh 明确保留封盖,与发布态一致,
|
|
20
|
+
* 见其类头注释)。封盖与侧面**同一份几何、同一份材质** ⇒ 正反面(material.side)天然同步,
|
|
21
|
+
* 没有「封盖不跟墙体正反面」的第二套口径(这正是皇上 09-26 第①条要查的点)。 */
|
|
22
|
+
skipWallCaps: boolean;
|
|
23
|
+
/**
|
|
24
|
+
* ⭐ 皇上旨 2026-10-07「上下封口的三角面能不能不要那么长 / 三角面再细分一下,不要那么大」:
|
|
25
|
+
* 上/下封盖在耳切三角化之后,再按**最长边二分**切到每条边都 ≤ 本值(米)。粒度越细 ⇒
|
|
26
|
+
* 封盖上「一个三角面 = 一张全景」的区块越小,序号映射 / 取图在天花板和地面上分得越准
|
|
27
|
+
* (原先一个耳切大三角能横跨整个房间 ⇒ 整片天花板只能是同一张全景)。
|
|
28
|
+
* ⛔ 0 / 负数 = 不细分(= 10-07 之前的形状)。
|
|
29
|
+
* ⚠️ 改这个值会**改变面数** ⇒ 存档里的逐面序号按「块」继承(见 `importData` 那句 warn)。
|
|
30
|
+
*/
|
|
31
|
+
wallCapMaxEdgeM: number;
|
|
32
|
+
/**
|
|
33
|
+
* 全景「序号直接取」映射:每个三角面(faceIndex)→ 被指派的「全景全局序号」(-1=未设)。
|
|
34
|
+
* 序号直接取由着色器读取 geometry 的 aPanoIndex;与 panoIndices 槽数组配合取对应全景纹理。
|
|
35
|
+
* 长度 = 几何三角面数,随 rebuildWallGeometry 按位置重算(保留旧映射,见下方注释)。
|
|
36
|
+
* 该数据随工程存档持久化(MktMeshData.panoFaceMapping),编辑器/预览/发布三端同源。
|
|
37
|
+
*/
|
|
38
|
+
panoFaceMapping: number[];
|
|
39
|
+
/**
|
|
40
|
+
* 全景点坐标数组(每全景 3 个数 = 中心点 xyz,世界坐标)。
|
|
41
|
+
* ⭐ 2026-09-30 旨:全景点数据是**独立的纯几何数据**,与纹理图片是否加载/解码无关;
|
|
42
|
+
* 智能序号只认这份,不认 textures。由 setTextures/addTexture/removeTexture/setTexture(矩阵变更) 派生(_syncPanoCenters)。
|
|
43
|
+
* 本数组是「每全景 xyz」的**源**;序号映射最终烘焙成几何属性 `aPanoCenter`(每三角面9数,与 position 对齐),见 _syncPanoCenterAttr。
|
|
44
|
+
* ⚠️⚠️ 2026-10-01 血案修复:本字段改为**读取时实时派生**(getter),不再依赖「谁记得调 _syncPanoCenters」。
|
|
45
|
+
* 起因:`MktDevMesh.setTextures` 覆写了基类(编辑态不激活单全景),直接 `this.textures = textures` 而**不调
|
|
46
|
+
* super** ⇒ 派生点整条被绕过,`panoCenters` 恒为空 ⇒ 映射模式下点「智能序号」在 centerCount===0 处静默 return,
|
|
47
|
+
* 墙上全空且无任何提示。派生点式缓存在有子类覆写时就必然漏,**改为实时派生才是根治**(读一次 O(全景数),
|
|
48
|
+
* 调用方只有智能序号与 _syncPanoCenterAttr,都不是每帧路径)。
|
|
49
|
+
*/
|
|
50
|
+
get panoCenters(): number[];
|
|
51
|
+
/** 派生结果的落点(勿直接读写,统一走 panoCenters getter / _syncPanoCenters) */
|
|
52
|
+
private _panoCentersCache;
|
|
53
|
+
/** 旧几何的「面中心 XZ→{y, 序号}」索引,用于改墙/改高后按位置保留全景序号映射(皇上旨 2026-09-28 决策②)。 */
|
|
54
|
+
private _panoXZMap;
|
|
55
|
+
/**
|
|
56
|
+
* ⭐ 槽位名册(皇上旨 2026-10-03「库侧也一并改成中心 ± 邻居」):每帧由 `updateTexture` 走
|
|
57
|
+
* `panoSlotRosterStep` 算出,**0 号槽 = 中心**(⭐ 10-07 第二十一道旨:离**控制器中心点** XZ 最近那张,
|
|
58
|
+
* 带 `PANO_SLOT_SWAP_MARGIN_M` 死区;锚点见 `_rosterCenter`),
|
|
59
|
+
* 1..7 = 中心在全景列表里的序号一层层往外扩的邻居(⭐ 10-07 旨「尽可能填满 8 个全景位置」⇒ 越界的序号不占格、
|
|
60
|
+
* 继续往有货那侧扩 ⇒ 填几格 = min(项目全景总数, 8),只有全景总数不够时才有空格)。
|
|
61
|
+
* ⇒ 与编辑态 `mktMeshEditRenderer._slotPanos` **同一份算法、同一个常数**(预览看到的那几张 = 编辑器里的那几张,均为 8 个全景槽)。
|
|
62
|
+
* 存**对象引用**不存下标(删点会让下标整体前移,引用不会认错人)。
|
|
63
|
+
* 消费方 = `feedFaceMapping`(墙 8 格);⭐ 10-03 旨② 后预览立方体与墙**共用同一份材质**,
|
|
64
|
+
* 立方体几何无 `aPanoIndex` ⇒ `vPanoIndex ≡ 0` ⇒ 它显示的就是 0 号槽那张(墙与立方体天然同源,
|
|
65
|
+
* 原来那条「把中心那几张抄给立方体单全景材质」的 `currentTiles` 旁路已整条删除)。
|
|
66
|
+
*/
|
|
67
|
+
private _slotPanos;
|
|
68
|
+
/**
|
|
69
|
+
* ⭐ 名册那把尺子的**锚点**(皇上旨 2026-10-07 第二十一道旨:「判断使用哪些全景球的判断条件,
|
|
70
|
+
* 从距离相机的距离改成判断距离控制器的中心点的距离」)。这里存外部控制器的中心点
|
|
71
|
+
* (轨道控制器 = `controls.target`,也就是画面正中央那个注视点),由消费方经 `setRosterCenter()` 注入。
|
|
72
|
+
* · 只读 XZ ⇒ 与名册历代那把「水平距离」尺同一把(09-28 旨),高度差不进尺子。
|
|
73
|
+
* · `null` ⇒ 回落 `camera.position`(老口径):发布页那一路没有控制器引用,不注入就一切照旧。
|
|
74
|
+
* · 存的是**引用**(OrbitControls 原地改它那个 Vector3)⇒ 消费方设一次即可,不必每帧重设。
|
|
75
|
+
* · ⚠️ 全景点矩阵本就是**世界矩阵**,锚点也取世界坐标;⛔ 别再乘一遍 `matrixWorld`(同 `updateTexture` 里那句提醒)。
|
|
76
|
+
*/
|
|
77
|
+
private _rosterCenter;
|
|
78
|
+
/**
|
|
79
|
+
* ⭐ 皇上旨 2026-10-03「整套搬进库(彻底同源)」:库侧不再自养「按全景序号取整槽、齐活才写」那一路,
|
|
80
|
+
* 改成与编辑态**同一份换绑策略**(`./panoSlotBind`)+ 同一口径的三张表:
|
|
81
|
+
* 地址→纹理缓存、已上传 GPU 集合、待上传排队集合。治的两个病:
|
|
82
|
+
* ① 换景点闪一帧灰(库侧原先没有「未就绪整槽沿用上一批」这层兜底);
|
|
83
|
+
* ② 图与投影矩阵来自**不同批**(原先矩阵无条件 copy,纹理却可能还在路上)。
|
|
84
|
+
* 地址 → 已解码纹理;值为 `null` = 该地址正在加载(占位 ⇒ 同一地址不会被问两次就下两遍)。
|
|
85
|
+
* ⚠️ 皇上旨 2026-10-02:运行中**不淘汰**任何一张,只在 `dispose()` 整批释放。
|
|
86
|
+
*/
|
|
87
|
+
private _texCache;
|
|
88
|
+
/** 已上传 GPU 的纹理:没进这张表的**不许**绑进 shader(首绑现场 `texImage2D` 就是那一下卡顿,皇上旨 09-29「两个大头别在同一帧」) */
|
|
89
|
+
private _texUploaded;
|
|
90
|
+
/** 已排进全局队列、等着「只干上传那一句」的纹理(`addWork` 按闭包判重判不出来 ⇒ 必须自备集合) */
|
|
91
|
+
private _uploadQueued;
|
|
92
|
+
/** 加载地址真的拼了 ossSize 缩放参数的条目 ⇒ 换档只重载这些(真瓦片一律原图,不进此集) */
|
|
93
|
+
private _ossSizeDepKeys;
|
|
94
|
+
/** 渲染器:由 `onBeforeRender` 每帧捕获,预上传走它的 `initTexture`;没捕获到就退回 three 的自绑路径(不报错) */
|
|
95
|
+
private _glRenderer;
|
|
96
|
+
/** ⭐ 32 瓦片(横 8 × 竖 4 切片)离屏拼合器:左右 2 槽纹理由它逐格拼出(每帧一张新纹理进 GPU + 已进 GPU 的逐格画)。
|
|
97
|
+
* 编辑器渲染器经 `panoStitcher` 复用同一实例(同一份槽纹理缓存,⛔ 不另建第二份显存)。
|
|
98
|
+
* 皇上旨 2026-10-06「不用 canvas 2D 的 drawImage 拼合, 用一个 shader 一个一个渲染到 RT 上面去」
|
|
99
|
+
* +「canvas 是什么意思, 按照我的想法, 不应该有 canvas 才对啊」⇒ **只此一份实现**:旧的 canvas 2D
|
|
100
|
+
* 那一份连同 `?panoStitch=canvas` 对照开关整条删除。⚠️ RT 是 GL 上下文私有资源 ⇒ 见拼合器 `_switchRenderer`。 */
|
|
101
|
+
private _stitcher;
|
|
102
|
+
/** 拼合器只读访问(编辑器渲染器共用;⛔ 不另建第二实例) */
|
|
103
|
+
get panoStitcher(): PanoStitcher;
|
|
104
|
+
/** 融合材质未绑纹理时的占位(避免空纹理采样报错;深灰兜底由着色器 uFaceMissingColor 负责) */
|
|
105
|
+
protected _placeholder: Texture;
|
|
106
|
+
/** 纹理 OSS 缩放尺寸(1024 / 2048 / 空=原图),由外部 setOssSize 注入;默认 1024 保持旧行为。
|
|
107
|
+
* 编辑器渲染器与预览渲染器各自把 store.ossSize 推下来,使全景球/预览按该尺寸加载。 */
|
|
108
|
+
private _ossSize;
|
|
109
|
+
/** 全景纹理形态:tiled=左右 2 槽各装一张**拼合槽纹理**(该点 32 片 横 8 × 竖 4 → 2 张 4096×4096,10-06 晚旨)
|
|
110
|
+
* / whole=2 槽同为一张完整等距柱状原图。
|
|
111
|
+
* 由外部 setPanoTexMode 注入(与 _ossSize 同一套注入路径),默认 tiled 保持改造前行为。 */
|
|
112
|
+
private _panoTexMode;
|
|
113
|
+
/** 当前全景纹理形态(只读)。消费方(预览立方体等自持材质的路径)据此算 `mktPanoTiledFlag`,
|
|
114
|
+
* 必须与基类喂纹理处用同一个值,否则标记与地址不同源 ⇒ 整图被按 1/2 横向铺满球面(10-06 晚起纵向不分块,四槽时代是 1/4)。 */
|
|
115
|
+
get panoTexMode(): PanoTexMode;
|
|
116
|
+
private _tmpV3;
|
|
117
|
+
constructor(opts?: {
|
|
118
|
+
wallHeight?: number;
|
|
119
|
+
wallClosed?: boolean;
|
|
120
|
+
});
|
|
121
|
+
/**
|
|
122
|
+
* 设置墙体地面折线点位,并重建墙体几何。
|
|
123
|
+
* @param points 地面折线点位(XZ 平面,世界坐标),至少 2 个点才能生成墙体
|
|
124
|
+
* @param opts.closed 是否闭合(首尾相连成环),默认沿用当前 wallClosed
|
|
125
|
+
* @param opts.height 墙高(沿 +Y 挤出),默认沿用当前 wallHeight
|
|
126
|
+
*/
|
|
127
|
+
setWallPoints(points: WallPoint[], opts?: {
|
|
128
|
+
closed?: boolean;
|
|
129
|
+
height?: number;
|
|
130
|
+
}): void;
|
|
131
|
+
/** 读取墙点位(副本,含 y,调用方可自行修改再回设) */
|
|
132
|
+
getWallPoints(): WallPoint[];
|
|
133
|
+
/**
|
|
134
|
+
* 墙正面/反面枚举 → three.js Side 常量。
|
|
135
|
+
* ⭐ 2026-09-29 晚旨「shader 设反面显示、不要双面」:三档**全部**落到 BackSide(对应历史上
|
|
136
|
+
* 的 wallSide="back" 档 —— 零厚度幕墙只画**朝房间内的那一面**,从房间外看穿过去、看不到内部全景)。
|
|
137
|
+
* API 形参与 wallSide 字段保留(存档/调用方兼容)。⚠️ 地板/立方体**不由这里控制**:编辑态地板恒走「仅显示选中」工厂(DoubleSide);
|
|
138
|
+
* 立方体在 mapping 档与墙**共用同一份材质实例**(皇上旨 2026-10-02),⇒ 朝向跟着墙 = BackSide,
|
|
139
|
+
* 另两档(blend / selected)另建一份 mapping 并显式拉回 DoubleSide(见渲染器 `_applyDisplayMode`;预览自 10-07 旨起与编辑态同口径)。
|
|
140
|
+
* ⚠️ 若实测房间内反而看不到墙(几何法线朝向与预期相反),把这里的 BackSide 换成 FrontSide 即可(一行)。
|
|
141
|
+
*/
|
|
142
|
+
private _wallSideToThree;
|
|
143
|
+
/** 设置墙体正反面显示(**材质 side 的唯一写入口**;参数保留兼容,当前无论传什么都渲染**反面**,见 _wallSideToThree) */
|
|
144
|
+
setWallSide(side: WallSide): void;
|
|
145
|
+
/** 由 wallPoints / wallHeight / wallClosed 重建墙体几何:侧面(ExtrudeMesh) + 上下封盖(ShapeGeometry) */
|
|
146
|
+
private rebuildWallGeometry;
|
|
147
|
+
/**
|
|
148
|
+
* 设置某个三角面(faceIndex)归属的全景全局序号;-1=清除(序号模式下显示深灰兜底色)。
|
|
149
|
+
* 更新映射数组 + 几何 aPanoIndex 属性(仅该面 3 顶点),并同步 XZ 索引供后续改墙保留。
|
|
150
|
+
*/
|
|
151
|
+
setFacePanoIndex(faceIndex: number, globalIndex: number): void;
|
|
152
|
+
/** 重建 XZ 索引(映射变化后调用,保证下次改墙按位置保留) */
|
|
153
|
+
private _rebuildXZMap;
|
|
154
|
+
/** 三角面总数(= 几何顶点数 / 3,因非索引三角形汤) */
|
|
155
|
+
getFaceCount(): number;
|
|
156
|
+
/**
|
|
157
|
+
* 返回被三角面引用的全景全局序号集合(去重),按引用面数降序、最多 maxSlots 个。
|
|
158
|
+
* ⚠️ 2026-10-03 起**不在喂料路上**(墙那 8 格改由槽位名册决定,见 `feedFaceMapping`);保留为公共查询 API
|
|
159
|
+
* (外部若要按「哪几张全景被指派得最多」统计仍可用),⛔ 不许再拿它决定 shader 装哪几张。
|
|
160
|
+
*/
|
|
161
|
+
getReferencedPanoIndices(maxSlots: number): number[];
|
|
162
|
+
/** 仅重建 aPanoIndex 几何属性(映射数据变化、几何未变时调用,避免整面重建) */
|
|
163
|
+
rebuildPanoIndexAttribute(): void;
|
|
164
|
+
/** 从 textures 各矩阵平移分量(elements[12,13,14],即墨卡托投影中心)派生 panoCenters(每全景 xyz)。
|
|
165
|
+
* 全景点位置与纹理图片加载解耦,纯几何;智能序号只依赖这份数据。 */
|
|
166
|
+
protected _syncPanoCenters(): void;
|
|
167
|
+
/**
|
|
168
|
+
* 写 aPanoCenter 几何属性:每三角面 9 数(该面归属全景的中心 xyz,复制到 3 顶点),
|
|
169
|
+
* itemSize=3、count = position.count,与 position **完全对齐**
|
|
170
|
+
* (皇上旨 2026-09-30 第③点:「每个三角面 9 个数一组,全景也按 9 数一组、和顶点数组长度对齐」)。
|
|
171
|
+
* 源 = panoCenters(每全景 xyz);面未映射(gi<0 或越界)填 0。
|
|
172
|
+
* rebuildWallGeometry / rebuildPanoIndexAttribute / setFacePanoIndex 都会调它保持同步。
|
|
173
|
+
*/
|
|
174
|
+
private _syncPanoCenterAttr;
|
|
175
|
+
/** 设置纹理列表并激活第一个(或最近的)纹理 */
|
|
176
|
+
setTextures(textures: MktTextureInfo[]): void;
|
|
177
|
+
/** 追加一个纹理 */
|
|
178
|
+
addTexture(info: MktTextureInfo): void;
|
|
179
|
+
/** 删除一个纹理;若删除的是当前激活纹理则回退,索引随之前移 */
|
|
180
|
+
removeTexture(index: number): void;
|
|
181
|
+
/**
|
|
182
|
+
* 更新单个纹理的 url / 名称 / 矩阵;若改的是「当前激活纹理」则同步生效。
|
|
183
|
+
*
|
|
184
|
+
* ⚠️ 需求铁律(防止回归):墙面绘制的是「当前激活纹理」,其朝向由 shader 的 textureMatrix uniform 决定。
|
|
185
|
+
* 所以只要激活纹理的位置/旋转变了,必须**立即**把新矩阵 copy 进 textureMatrix uniform——
|
|
186
|
+
* 否则用户旋转/移动全景球时,平面纹理不会跟着一起转。
|
|
187
|
+
* 另:改旋转不要触发纹理网络 reload,只有 url 真正变化才重载。
|
|
188
|
+
*/
|
|
189
|
+
setTexture(index: number, opts: {
|
|
190
|
+
url?: string;
|
|
191
|
+
name?: string;
|
|
192
|
+
matrix?: Matrix4;
|
|
193
|
+
tiles?: string[];
|
|
194
|
+
}): void;
|
|
195
|
+
/**
|
|
196
|
+
* 把 inverse(matrixWorld) 写进当前材质的 uProjInvMatrix(每帧一次)—— 「投影与自身变换解耦」的唯一写入点。
|
|
197
|
+
*
|
|
198
|
+
* ⚠️ 需求铁律(皇上旨 2026-09-19):「墙的矩阵和全景的矩阵是相对的,无论 MktMesh 模型整体
|
|
199
|
+
* 怎么移动/旋转/缩放,墙上的纹理都保持不变」。
|
|
200
|
+
* 达成条件是「取样方向的两个操作数都对 MktMesh 的整体变换免疫」:
|
|
201
|
+
* · 全景点矩阵(textureMatrix)是**世界矩阵**、属独立于 MktMesh 的外部数据 → 本就不随它动;
|
|
202
|
+
* · 墙顶点经 modelMatrix 升到世界坐标 → **会**随它动 → 一个动一个不动,方向即变,纹理在墙上滑动。
|
|
203
|
+
* 故此处把 inverse(matrixWorld) 交给着色器,把墙顶点也拉回「与整体变换无关的几何局部坐标」,
|
|
204
|
+
* 两个操作数双双免疫,方向恒定,纹理稳稳贴在墙上。
|
|
205
|
+
* ⚠️ M ≠ I 时 vProjPos(局部)与 textureMatrix(世界)并不在同一空间 —— 这是**刻意**的:
|
|
206
|
+
* 皇上要的是「纹理贴在墙上不动」,条件是「两个操作数都不随 M 变」,而非「同处一个空间」。
|
|
207
|
+
* 千万别"好心"再去把 textureMatrix 也乘一遍 inverse(matrixWorld),那会让纹理重新动起来。
|
|
208
|
+
*
|
|
209
|
+
* 每帧无条件重算(一次 4x4 求逆,代价可忽略):用户拖预览变换面板时 matrixWorld 每帧都在变,
|
|
210
|
+
* 靠「变更时通知」容易漏,无条件同步最稳。材质被替换(如编辑态 blend↔single 重建)时按当前材质重新取
|
|
211
|
+
* uniform,故 **MktDevMesh 也必须每帧调用本方法**(它同样会重建材质,见该类 onBeforeRender 注释)。
|
|
212
|
+
* 材质没有该 uniform(旧材质/第三方材质)时静默跳过 —— 退化为「世界坐标」的旧行为。
|
|
213
|
+
*/
|
|
214
|
+
syncProjInvMatrix(): void;
|
|
215
|
+
/** 每帧算「离**名册锚点**最近」的水平距离(XZ)⇒ 走**槽位名册**(中心 ± 邻居)⇒ 名册中心变化时切换激活纹理。
|
|
216
|
+
* ⭐ 皇上旨 2026-10-07 第二十一道旨:锚点 = 外部控制器的中心点(`setRosterCenter` 注入的轨道注视点);
|
|
217
|
+
* 没注入(如发布页那一路)才回落相机位置。 */
|
|
218
|
+
updateTexture(camera: Camera): void;
|
|
219
|
+
/** 给纹理地址追加 OSS 图片缩放参数(1024 / 2048 / 空=不缩放)。
|
|
220
|
+
* 尺寸由外部 setOssSize 控制(默认 1024,与编辑器渲染器 resolveOssUrl 语义一致);
|
|
221
|
+
* 预览/发布库经 setOssSize 注入,使全景球按所选尺寸加载。
|
|
222
|
+
* ⚠️ `original=true`(这一槽喂的是**真瓦片地址**,即 rt 虚拟键那一路)时**一律走原图**、不拼尺寸参数
|
|
223
|
+
* (皇上旨 2026-09-23「切换到4片瓦片的时候, 就不需要设置oss 尺寸参数了, 默认使用原图」)。
|
|
224
|
+
* 判据与喂地址、写 `uPanoTiled` 同源(`mktPanoTiledFlag`),别另算一套。 */
|
|
225
|
+
private resolveOssUrl;
|
|
226
|
+
/** ⭐ 皇上旨 2026-10-07 第二十一道旨:把「用哪些全景球」那把尺子的锚点从相机位置换成**控制器中心点**。
|
|
227
|
+
* 消费方(预览弹窗)把轨道控制器的 `target` 交进来即可;传 `null` = 回落相机位置(老口径,发布页照旧)。
|
|
228
|
+
* 存引用不存副本 ⇒ 轨道控制器原地改那个 Vector3,设一次就一直跟着走。 */
|
|
229
|
+
setRosterCenter(center: Vector3 | null): void;
|
|
230
|
+
/** 设置纹理 OSS 缩放尺寸(1024 / 2048 / 空=原图);变化即按新尺寸重载当前激活纹理。
|
|
231
|
+
* 编辑器 MktDevMesh 关闭了 activateTexture(activeIndex=-1),此处为 no-op;预览/发布库用基类激活,会真正按新尺寸重载。 */
|
|
232
|
+
setOssSize(size: "1024" | "2048" | ""): void;
|
|
233
|
+
/** ossSize 换档后重载「加载地址拼了尺寸参数」的那批条目(与编辑态 `_reloadFloorTextures` 同口径:
|
|
234
|
+
* dispose + 删条目,下一帧 `_peekTileAt` 自然按新档重拉)。
|
|
235
|
+
* ⚠️ 真瓦片(现行 32 片/全景)一律走原图 ⇒ 不在重载范围;整图档才受尺寸档影响(皇上旨 09-23)。 */
|
|
236
|
+
private _reloadActiveTexture;
|
|
237
|
+
/** 换绑一个点槽的左右 2 张拼合槽纹理:策略全在 `./panoSlotBind`(皇上旨 10-03「整套搬进库」⇒ 编辑器与库**同一份**),
|
|
238
|
+
* 这里只把本类的取图口与占位纹理注入进去。返回 true = 图与点位配好了(调用方才写投影矩阵)。 */
|
|
239
|
+
private _bindSlotTiles;
|
|
240
|
+
/** 本材质「panoramas[i] 这一格认的是哪张瓦片地址」——逐张换绑的账本(⚠️ 账本实体在 `./panoSlotBind`,
|
|
241
|
+
* 与编辑态共一本,按材质实例分键 ⇒ 两处材质不同实例、天然不串味)。 */
|
|
242
|
+
private _tileKeys;
|
|
243
|
+
/** 按缓存键要一张**已经设进 shader** 的纹理:没有就当场发起下载(异步代码一律不进全局队列 —— 皇上旨 2026-09-25),
|
|
244
|
+
* 解码完还没上传的排一个「只干上传那一句」的队列项;两关都过了才返回给它去绑。
|
|
245
|
+
* ⭐ `rt:` 虚拟键(32 瓦片拼合槽)走拼合器 peek;⛔ 不在这里 pump(每帧驱动点唯一,见 `updateTexture`,
|
|
246
|
+
* 否则一帧画好几格 = 把「每帧只载入一张新纹理」那道闸从后门拆了)。 */
|
|
247
|
+
private _peekTileAt;
|
|
248
|
+
/** 真正发起一张瓦片纹理的加载(`key` = 原始地址;rt 虚拟键由 `_peekTileAt` 上半段拦走,不会到这里)。
|
|
249
|
+
* ⚠️ 皇上旨 2026-09-28「加载瓦片的时候, 瓦片纹理不需要添加 oss 的参数」⇒ 真瓦片(`original=true`,现行 32 片/全景)走原图,
|
|
250
|
+
* 整图档才按 ossSize 档缩(`resolveOssUrl`)。 */
|
|
251
|
+
private ensureTileTexture;
|
|
252
|
+
/** ⭐ 把一张「已经加载解码好」的纹理排进全局队列,排到的那个 tick 只做一件事:把它上传到 GPU。
|
|
253
|
+
* 皇上旨 2026-09-25 原文:「队列里面的代码就是 把加载好的纹理 设置给 shader 的 这一句代码」——
|
|
254
|
+
* 所以下载、淘汰、绑定判断统统不许出现在回调里。
|
|
255
|
+
* ⚠️ 去重闸门必须是自己的 `_uploadQueued`:`addWork` 用 `workList.includes(work)` 判重,而每次都是新闭包 ⇒ 判不出来。
|
|
256
|
+
* ⭐ 皇上旨 2026-10-05:「你在调用 addWork 的时候,再调一次 addWork 传入一个空函数,这样真正需要执行的方法就会隔一帧执行」
|
|
257
|
+
* ⇒ 真活前面先垫一个空函数占一格(全局队列每 tick 只跑一项 ⇒ 多一格 = 晚一帧),与编辑态 `_commitTileToShader` 同一口径。
|
|
258
|
+
* ⚠️ 空函数**必须内联每次现造**:`addWork` 按引用判重,共用一个常量引用时第二张起空格进不了队列 ⇒ 改动静默失效。 */
|
|
259
|
+
private _commitTileToShader;
|
|
260
|
+
/** 队列回调的全部内容:把这一张纹理上传到 GPU(`texImage2D` + mipmap 才是那一下贵的),每 tick 一张。 */
|
|
261
|
+
private _uploadTileTexture;
|
|
262
|
+
/**
|
|
263
|
+
* 序号直接取模式喂食(皇上旨 2026-09-28 决策③:MktMesh 基类只有这一种模式)。
|
|
264
|
+
* ⭐ 皇上旨 2026-10-03「1.可以」:shader 各槽装的是**槽位名册**那 `MKT_PANO_MAX_SLOTS` 张(`_slotPanos`,
|
|
265
|
+
* 中心 ± 邻居,与编辑态 `mktMeshEditRenderer.feedFaceMapping` 同一份算法、同一个死区常数)
|
|
266
|
+
* ⇒ 预览/发布与编辑器同一屏装同一批全景。⛔ 不再按「被引用面数取前 4」(那是 09-28 的静态名单,
|
|
267
|
+
* 与相机无关 ⇒ 走近的景点进不了槽,正是他这次报「预览里 shader 不对」的根因)。
|
|
268
|
+
* 片元按 aPanoIndex 在 panoIndices 里找对应 slot 取纹理;指派的那张不在当前名册里 ⇒ 该面回落 `uFaceMissingColor` 深灰,
|
|
269
|
+
* 把**名册锚点**挪近那张景点后自动出图(⭐ 10-07 第二十一道旨:预览轨道模式 = 控制器中心点,第一人称/未注入 = 相机位置;与编辑态同一份已知代价)。
|
|
270
|
+
*/
|
|
271
|
+
feedFaceMapping(): void;
|
|
272
|
+
/** 设置全景纹理形态(tiled=8×4 三十二片走拼合器 / whole=一整片原图);非法值回落 tiled。
|
|
273
|
+
* ⭐ 10-03 旨⑤:这里**不再**手工重载纹理 —— 形态一变目标地址就变了(瓦片 URL ↔ 整图 URL),
|
|
274
|
+
* 下一帧 `feedFaceMapping` 里共用的那份 binder 见「槽内现有形态 ≠ 目标形态」自动走整档判齐、一次换绑并同帧翻标记。
|
|
275
|
+
* 编辑器 MktDevMesh 走的是自己那路(同一个 binder、同一份策略),本方法对它只是记下形态。 */
|
|
276
|
+
setPanoTexMode(mode: PanoTexMode): void;
|
|
277
|
+
/**
|
|
278
|
+
* 记下「当前激活(名册 0 号槽 = 中心)是第几个全景」。
|
|
279
|
+
* ⭐ 皇上旨 2026-10-03 旨②:预览立方体已与墙**共用同一份材质**,原来那句「把中心那几张抄给立方体单全景材质」
|
|
280
|
+
* 的 `currentTiles` 旁路整条删除 ⇒ 本方法不再加载瓦片、不再写 `uPanoTiled`(形态标记归 binder 逐槽写,
|
|
281
|
+
* 地址/标记/分辨率三者同源的判据在 `feedFaceMapping`)。留着它是因为 `updateTexture` 用它做「中心换人」的闩锁,
|
|
282
|
+
* 且它是发布态的公共 API(外部只读 `activeIndex` 靠这里维护)。
|
|
283
|
+
*/
|
|
284
|
+
activateTexture(index: number): void;
|
|
285
|
+
/** 导出数据:墙点位 + 墙高 + 是否闭合 + 纹理数组(url + 矩阵) */
|
|
286
|
+
exportData(): MktMeshData;
|
|
287
|
+
/** 导入数据:重建墙体几何与纹理列表,并激活第一个纹理 */
|
|
288
|
+
importData(data: MktMeshData): void;
|
|
289
|
+
/** 释放 GPU 资源:瓦片缓存(**只有这里**清,皇上旨 2026-10-02)、拼合器、几何、材质 */
|
|
290
|
+
dispose(): this;
|
|
291
|
+
}
|