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,174 +1,174 @@
|
|
|
1
|
-
import { BufferGeometry, Color, Group, Material, Object3D } from "three";
|
|
2
|
-
import type { InstancedTemplate } from "./InstancedTemplate";
|
|
3
|
-
/** 选择代理可叠加的后处理效果开关;默认只开描边(保持向后兼容),可被 glow / bloom / cover 任意叠加。 */
|
|
4
|
-
export interface SelectProxyOptions {
|
|
5
|
-
stroke?: boolean;
|
|
6
|
-
glow?: boolean;
|
|
7
|
-
bloom?: boolean;
|
|
8
|
-
cover?: boolean;
|
|
9
|
-
/** 描边粗细(像素级,越大越粗);不传则沿用 stroke_pass 默认 1 */
|
|
10
|
-
stroke_width?: number;
|
|
11
|
-
stroke_color?: string;
|
|
12
|
-
glow_color?: string;
|
|
13
|
-
glow_width?: number;
|
|
14
|
-
glow_opacity?: number;
|
|
15
|
-
bloom_strength?: number;
|
|
16
|
-
bloom_radius?: number;
|
|
17
|
-
cover_color?: string;
|
|
18
|
-
cover_opacity?: number;
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* 所有活着的 InstancedChild 实例集合,供 InstancedGroup 每帧收集。
|
|
22
|
-
* 用全局注册表而非遍历整棵 scene,避免大场景每帧 traverse 全树的性能开销。
|
|
23
|
-
*
|
|
24
|
-
* ⚠️ 多 InstancedGroup 共存时的归属(owner):见 `instancedChildOwner` 与 `getOwner()`。
|
|
25
|
-
* 同一个进程里可能并存多个 InstancedGroup(如主编辑器的 ThreeBase 与预览弹窗各自一套),
|
|
26
|
-
* 若不隔离,双方会互相把对方的实例收进自己的 batch,导致「A 场景的立方体出现在 B 场景」。
|
|
27
|
-
*/
|
|
28
|
-
export declare const instancedChildRegistry: Set<InstancedChild>;
|
|
29
|
-
/**
|
|
30
|
-
* 实例归属(owner tag)注册表:child -> owner 字符串。
|
|
31
|
-
* InstancedGroup 构造时可声明自己的 owner,每帧只收集 `owner` 匹配(或未声明 owner)的实例。
|
|
32
|
-
* 未在表中登记的实例视为「无归属」,会被**声明了 owner 的组**忽略、
|
|
33
|
-
* 被**未声明 owner 的组**(如 ThreeBase 的默认组)收集 —— 保持对既有代码零影响。
|
|
34
|
-
*/
|
|
35
|
-
export declare const instancedChildOwner: Map<InstancedChild, string>;
|
|
36
|
-
/**
|
|
37
|
-
* 用户继承的「逻辑实例」基类。自身不参与渲染,只描述"一个实例"的位置 / 颜色 / 事件。
|
|
38
|
-
*
|
|
39
|
-
* 用法:
|
|
40
|
-
* ```ts
|
|
41
|
-
* class Cube extends InstancedChild {
|
|
42
|
-
* static geometry = new BoxGeometry(1, 1, 1);
|
|
43
|
-
* static material = new MeshStandardMaterial({ color: 0xffffff });
|
|
44
|
-
* constructor() {
|
|
45
|
-
* super();
|
|
46
|
-
* this.addEventListener("click", () => {
|
|
47
|
-
* this.setColor("#ff0000");
|
|
48
|
-
* this.position.set(0, 0, 0);
|
|
49
|
-
* });
|
|
50
|
-
* }
|
|
51
|
-
* }
|
|
52
|
-
* const cube = new Cube();
|
|
53
|
-
* cube.position.set(1, 2, 3);
|
|
54
|
-
* threeBase.scene.add(cube); // 加进任意层级即可
|
|
55
|
-
* ```
|
|
56
|
-
*
|
|
57
|
-
* ThreeBase 里固定的 InstancedGroup 会自动把「同 geometry+material」(或「同 instanceUrl+animation」)
|
|
58
|
-
* 的 InstancedChild 合并进同一个 InstancedMesh 批量渲染,无需用户管理实例缓冲。
|
|
59
|
-
*/
|
|
60
|
-
export default class InstancedChild extends Object3D {
|
|
61
|
-
/** 内置几何模式:子类覆盖这两个静态字段 */
|
|
62
|
-
static geometry?: BufferGeometry;
|
|
63
|
-
/** 内置几何模式材质 */
|
|
64
|
-
static material?: Material;
|
|
65
|
-
/** GLB 模式:模型地址(与 geometry/material 互斥,优先于内置) */
|
|
66
|
-
static instanceUrl?: string;
|
|
67
|
-
/** GLB 模式:要播放的动画剪辑名;不同动画 = 不同 batch(彼此独立) */
|
|
68
|
-
static animation?: string;
|
|
69
|
-
/** GLB 模式:模板(含材质)加载完成后回调,用于按需修正材质(如瓷器瓶 metalness=1 改 0) */
|
|
70
|
-
static prepareTemplate?: (template: InstancedTemplate) => void;
|
|
71
|
-
/** 实例颜色,写入 InstancedMesh.instanceColor */
|
|
72
|
-
color: Color;
|
|
73
|
-
/**
|
|
74
|
-
* 脏标记:true 时本帧由 InstancedGroup 把本实例的 matrix/color 写回实例缓冲,
|
|
75
|
-
* 写完后立即置 false —— 避免没有改动时重复写入真正参与渲染的 InstancedMesh。
|
|
76
|
-
*/
|
|
77
|
-
needUpdate: boolean;
|
|
78
|
-
/** 模板是否就绪(GLB 异步加载完成后置 true) */
|
|
79
|
-
templateReady: boolean;
|
|
80
|
-
/**
|
|
81
|
-
* 第一人称碰撞检测标记:为 true 时,本实例所属 batch 的 InstancedMesh 会被打上
|
|
82
|
-
* `userData.fpsCollision = true`,从而被 FPScontrol 的碰撞射线命中(实例自身的世界矩阵即碰撞体位置)。
|
|
83
|
-
* 需配合 three-base 的 FPScontrol 使用(详见 FPSDemo 示例页)。
|
|
84
|
-
*
|
|
85
|
-
* ⚠️ 语义约束:真实几何合并在同一个 InstancedMesh 里,故碰撞以「整个 batch
|
|
86
|
-
* (相同 geometry+material / 相同 instanceUrl+animation 的所有实例)」为单位开关——
|
|
87
|
-
* 同一 batch 内的所有实例要么都参与碰撞、要么都不参与。若只想让部分实例参与碰撞,
|
|
88
|
-
* 请把它们拆成不同的 InstancedChild 子类(不同 geometry 或不同 batchKey)。
|
|
89
|
-
*/
|
|
90
|
-
fpsCollision: boolean;
|
|
91
|
-
/**
|
|
92
|
-
* 自动脏检测开关(实验用,默认开):
|
|
93
|
-
* - true:markDirtyIfWorldChanged 每帧比对 matrixWorld,变化则自动置 needUpdate(位置/旋转/缩放变化无需手动置位);
|
|
94
|
-
* - false:关闭自动检测,仅手动置 needUpdate(如 setColor)的实例才会写回实例缓冲。
|
|
95
|
-
* 关闭后,静态布置的实例渲染不变,但「运动」(旋转/移动/缩放)将不再反映到画面(因为 matrixWorld 变了却没写回)。
|
|
96
|
-
* 可在运行时于控制台切换:InstancedChild.AUTO_MARK_DIRTY = true / false。
|
|
97
|
-
*/
|
|
98
|
-
static AUTO_MARK_DIRTY: boolean;
|
|
99
|
-
/**
|
|
100
|
-
* 请求切换到的动画剪辑名(由所属 batch 每帧应用)。
|
|
101
|
-
* 实例化是"整批共享一个 mixer",动画是 batch 级而非实例级;
|
|
102
|
-
* 默认 null 表示不主动切换,沿用 batch 构造时的 static animation。
|
|
103
|
-
*/
|
|
104
|
-
private _pendingClip;
|
|
105
|
-
private _cachedWorld;
|
|
106
|
-
constructor(fpsCollision?: boolean);
|
|
107
|
-
/** 该实例归属哪个 batch 的 key:相同 geometry+material 或相同 instanceUrl+当前生效动画 合并为一类。
|
|
108
|
-
* 因 key 含「当前生效动画」,切换动画 = 实例在「glb+旧动画」与「glb+新动画」两个常驻 batch 间迁移,而非 batch 内切 mixer。 */
|
|
109
|
-
getBatchKey(): string;
|
|
110
|
-
/** 本实例当前生效的动画名:优先 playClip 请求,否则类声明的 static animation;用于分桶 key 与 batch mixer 构建 */
|
|
111
|
-
getEffectiveAnimation(): string | undefined;
|
|
112
|
-
/**
|
|
113
|
-
* 为一组 InstancedChild 构建"选择代理"(select proxy):
|
|
114
|
-
* 用每个实例的世界矩阵 matrixWorld + 同款 geometry/material 重建独立网格,
|
|
115
|
-
* 供 stroke_pass 单独渲染其深度 / 灰度,从而得到这组实例"专属"的描边。
|
|
116
|
-
*
|
|
117
|
-
* 为什么需要它:InstancedChild 是纯逻辑节点(无几何),真实几何在 InstancedGroup 合并出的
|
|
118
|
-
* InstancedMesh 里,且一个 InstancedMesh 通常包含很多实例。要单独描边"某一个 / 某一组"实例,
|
|
119
|
-
* 无法靠直接渲染该 InstancedChild(空)或整个 InstancedMesh(会描到所有实例)。
|
|
120
|
-
* 本方法把目标实例重新"画"成一份独立几何,就能像普通 Mesh 一样单独取深度、单独描边。
|
|
121
|
-
*
|
|
122
|
-
* 关键点:
|
|
123
|
-
* - 用 instance.matrixWorld 直接作为代理网格的 local matrix(代理本身不在 scene 内、无父变换),
|
|
124
|
-
* 因此代理在屏幕上的位置 / 深度与真实实例严格一致,描边轮廓正好贴合,且能被同一张 baseDepthTexture 正确遮挡;
|
|
125
|
-
* - 代理对象通常注册到 ThreeBase.addStrokeObject(不在 scene 内),由渲染管线在效果阶段描边,
|
|
126
|
-
* 不会被正常 base pass 重复绘制。
|
|
127
|
-
*
|
|
128
|
-
* 仅支持内置几何模式(static geometry + static material);GLB 模式的几何由 batch 解析,
|
|
129
|
-
* 需从对应 InstancedBatch 取几何,此处暂跳过(无 static geometry 的实例不进代理)。
|
|
130
|
-
*
|
|
131
|
-
* @param children 要描边的一组实例(如某个 Group 的全部 InstancedChild)
|
|
132
|
-
* @returns 代理 Group(含顺序与 children 一一对应的代理网格);若没有任何可重建的实例则返回 null
|
|
133
|
-
*/
|
|
134
|
-
static buildSelectProxy(children: InstancedChild[], options?: SelectProxyOptions): {
|
|
135
|
-
proxy: Group;
|
|
136
|
-
sources: InstancedChild[];
|
|
137
|
-
} | null;
|
|
138
|
-
/** 把代理网格的矩阵同步到各源实例最新的 matrixWorld(组旋转 / 实例移动时描边跟着动)。
|
|
139
|
-
* 代理网格与 sources 一一对应(顺序由 buildSelectProxy 保证)。 */
|
|
140
|
-
static syncSelectProxy(proxy: Group): void;
|
|
141
|
-
/** 设置实例颜色(自动置 needUpdate) */
|
|
142
|
-
setColor(c: Color | number | string): this;
|
|
143
|
-
/**
|
|
144
|
-
* 请求切换本实例的动画剪辑。batch 按「glb + 当前生效动画」分桶(每个动画一个常驻 InstancedBatch),
|
|
145
|
-
* 调用 playClip 只改变本实例的生效动画,下一帧 getBatchKey 随之变化,实例便自动从旧动画 batch
|
|
146
|
-
* 迁移到新动画 batch(两 batch 常驻、不销毁)。传 null 恢复为 static animation。
|
|
147
|
-
* 例:soldier.playClip("Walk") / soldier.playClip("Idle")
|
|
148
|
-
*/
|
|
149
|
-
playClip(name: string | null): this;
|
|
150
|
-
/** 供 InstancedBatch 每帧读取当前请求的动画剪辑 */
|
|
151
|
-
get pendingClip(): string | null;
|
|
152
|
-
/**
|
|
153
|
-
* 位置 / 缩放 / 旋转直接用 three 原生写法即可(position.set / scale.setScalar / rotation.set),
|
|
154
|
-
* 无需任何自定义 setter;任一变换变化都会由 InstancedGroup 每帧的 matrixWorld 比对自动置 needUpdate。
|
|
155
|
-
* 注:Vector3 在 three 0.167 没有 onChange 回调;Euler/Quaternion 虽有 onChange,但 three 内部已用它
|
|
156
|
-
* 同步 rotation↔quaternion,不能覆盖,故统一用 matrixWorld 比对兜底,最贴合 three 的变换检测机制。
|
|
157
|
-
*/
|
|
158
|
-
/** 设置鼠标手势(悬停时光标样式):pointer / grab / move / text / crosshair ... */
|
|
159
|
-
setCursor(c: string): this;
|
|
160
|
-
/** 由 InstancedGroup 每帧调用:世界矩阵变化则置 needUpdate(setPosition 等已置过,这里双保险) */
|
|
161
|
-
markDirtyIfWorldChanged(): void;
|
|
162
|
-
/** 从注册表移除(对象销毁时调用,避免内存泄漏) */
|
|
163
|
-
dispose(): void;
|
|
164
|
-
/**
|
|
165
|
-
* 声明本实例归属哪个 InstancedGroup(owner tag)。多组共存时用于隔离,
|
|
166
|
-
* 只有 owner 相同的 InstancedGroup 会收集本实例。
|
|
167
|
-
*
|
|
168
|
-
* 用法:`new Cube().setOwner("preview")`,配合 `new InstancedGroup("preview")`。
|
|
169
|
-
* 不调用则归属为空 —— 会被「未声明 owner 的组」(如 ThreeBase 默认组)收集,保持旧行为。
|
|
170
|
-
*/
|
|
171
|
-
setOwner(tag: string): this;
|
|
172
|
-
/** 读取本实例的归属 tag(未声明返回 undefined) */
|
|
173
|
-
getOwner(): string | undefined;
|
|
174
|
-
}
|
|
1
|
+
import { BufferGeometry, Color, Group, Material, Object3D } from "three";
|
|
2
|
+
import type { InstancedTemplate } from "./InstancedTemplate";
|
|
3
|
+
/** 选择代理可叠加的后处理效果开关;默认只开描边(保持向后兼容),可被 glow / bloom / cover 任意叠加。 */
|
|
4
|
+
export interface SelectProxyOptions {
|
|
5
|
+
stroke?: boolean;
|
|
6
|
+
glow?: boolean;
|
|
7
|
+
bloom?: boolean;
|
|
8
|
+
cover?: boolean;
|
|
9
|
+
/** 描边粗细(像素级,越大越粗);不传则沿用 stroke_pass 默认 1 */
|
|
10
|
+
stroke_width?: number;
|
|
11
|
+
stroke_color?: string;
|
|
12
|
+
glow_color?: string;
|
|
13
|
+
glow_width?: number;
|
|
14
|
+
glow_opacity?: number;
|
|
15
|
+
bloom_strength?: number;
|
|
16
|
+
bloom_radius?: number;
|
|
17
|
+
cover_color?: string;
|
|
18
|
+
cover_opacity?: number;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* 所有活着的 InstancedChild 实例集合,供 InstancedGroup 每帧收集。
|
|
22
|
+
* 用全局注册表而非遍历整棵 scene,避免大场景每帧 traverse 全树的性能开销。
|
|
23
|
+
*
|
|
24
|
+
* ⚠️ 多 InstancedGroup 共存时的归属(owner):见 `instancedChildOwner` 与 `getOwner()`。
|
|
25
|
+
* 同一个进程里可能并存多个 InstancedGroup(如主编辑器的 ThreeBase 与预览弹窗各自一套),
|
|
26
|
+
* 若不隔离,双方会互相把对方的实例收进自己的 batch,导致「A 场景的立方体出现在 B 场景」。
|
|
27
|
+
*/
|
|
28
|
+
export declare const instancedChildRegistry: Set<InstancedChild>;
|
|
29
|
+
/**
|
|
30
|
+
* 实例归属(owner tag)注册表:child -> owner 字符串。
|
|
31
|
+
* InstancedGroup 构造时可声明自己的 owner,每帧只收集 `owner` 匹配(或未声明 owner)的实例。
|
|
32
|
+
* 未在表中登记的实例视为「无归属」,会被**声明了 owner 的组**忽略、
|
|
33
|
+
* 被**未声明 owner 的组**(如 ThreeBase 的默认组)收集 —— 保持对既有代码零影响。
|
|
34
|
+
*/
|
|
35
|
+
export declare const instancedChildOwner: Map<InstancedChild, string>;
|
|
36
|
+
/**
|
|
37
|
+
* 用户继承的「逻辑实例」基类。自身不参与渲染,只描述"一个实例"的位置 / 颜色 / 事件。
|
|
38
|
+
*
|
|
39
|
+
* 用法:
|
|
40
|
+
* ```ts
|
|
41
|
+
* class Cube extends InstancedChild {
|
|
42
|
+
* static geometry = new BoxGeometry(1, 1, 1);
|
|
43
|
+
* static material = new MeshStandardMaterial({ color: 0xffffff });
|
|
44
|
+
* constructor() {
|
|
45
|
+
* super();
|
|
46
|
+
* this.addEventListener("click", () => {
|
|
47
|
+
* this.setColor("#ff0000");
|
|
48
|
+
* this.position.set(0, 0, 0);
|
|
49
|
+
* });
|
|
50
|
+
* }
|
|
51
|
+
* }
|
|
52
|
+
* const cube = new Cube();
|
|
53
|
+
* cube.position.set(1, 2, 3);
|
|
54
|
+
* threeBase.scene.add(cube); // 加进任意层级即可
|
|
55
|
+
* ```
|
|
56
|
+
*
|
|
57
|
+
* ThreeBase 里固定的 InstancedGroup 会自动把「同 geometry+material」(或「同 instanceUrl+animation」)
|
|
58
|
+
* 的 InstancedChild 合并进同一个 InstancedMesh 批量渲染,无需用户管理实例缓冲。
|
|
59
|
+
*/
|
|
60
|
+
export default class InstancedChild extends Object3D {
|
|
61
|
+
/** 内置几何模式:子类覆盖这两个静态字段 */
|
|
62
|
+
static geometry?: BufferGeometry;
|
|
63
|
+
/** 内置几何模式材质 */
|
|
64
|
+
static material?: Material;
|
|
65
|
+
/** GLB 模式:模型地址(与 geometry/material 互斥,优先于内置) */
|
|
66
|
+
static instanceUrl?: string;
|
|
67
|
+
/** GLB 模式:要播放的动画剪辑名;不同动画 = 不同 batch(彼此独立) */
|
|
68
|
+
static animation?: string;
|
|
69
|
+
/** GLB 模式:模板(含材质)加载完成后回调,用于按需修正材质(如瓷器瓶 metalness=1 改 0) */
|
|
70
|
+
static prepareTemplate?: (template: InstancedTemplate) => void;
|
|
71
|
+
/** 实例颜色,写入 InstancedMesh.instanceColor */
|
|
72
|
+
color: Color;
|
|
73
|
+
/**
|
|
74
|
+
* 脏标记:true 时本帧由 InstancedGroup 把本实例的 matrix/color 写回实例缓冲,
|
|
75
|
+
* 写完后立即置 false —— 避免没有改动时重复写入真正参与渲染的 InstancedMesh。
|
|
76
|
+
*/
|
|
77
|
+
needUpdate: boolean;
|
|
78
|
+
/** 模板是否就绪(GLB 异步加载完成后置 true) */
|
|
79
|
+
templateReady: boolean;
|
|
80
|
+
/**
|
|
81
|
+
* 第一人称碰撞检测标记:为 true 时,本实例所属 batch 的 InstancedMesh 会被打上
|
|
82
|
+
* `userData.fpsCollision = true`,从而被 FPScontrol 的碰撞射线命中(实例自身的世界矩阵即碰撞体位置)。
|
|
83
|
+
* 需配合 three-base 的 FPScontrol 使用(详见 FPSDemo 示例页)。
|
|
84
|
+
*
|
|
85
|
+
* ⚠️ 语义约束:真实几何合并在同一个 InstancedMesh 里,故碰撞以「整个 batch
|
|
86
|
+
* (相同 geometry+material / 相同 instanceUrl+animation 的所有实例)」为单位开关——
|
|
87
|
+
* 同一 batch 内的所有实例要么都参与碰撞、要么都不参与。若只想让部分实例参与碰撞,
|
|
88
|
+
* 请把它们拆成不同的 InstancedChild 子类(不同 geometry 或不同 batchKey)。
|
|
89
|
+
*/
|
|
90
|
+
fpsCollision: boolean;
|
|
91
|
+
/**
|
|
92
|
+
* 自动脏检测开关(实验用,默认开):
|
|
93
|
+
* - true:markDirtyIfWorldChanged 每帧比对 matrixWorld,变化则自动置 needUpdate(位置/旋转/缩放变化无需手动置位);
|
|
94
|
+
* - false:关闭自动检测,仅手动置 needUpdate(如 setColor)的实例才会写回实例缓冲。
|
|
95
|
+
* 关闭后,静态布置的实例渲染不变,但「运动」(旋转/移动/缩放)将不再反映到画面(因为 matrixWorld 变了却没写回)。
|
|
96
|
+
* 可在运行时于控制台切换:InstancedChild.AUTO_MARK_DIRTY = true / false。
|
|
97
|
+
*/
|
|
98
|
+
static AUTO_MARK_DIRTY: boolean;
|
|
99
|
+
/**
|
|
100
|
+
* 请求切换到的动画剪辑名(由所属 batch 每帧应用)。
|
|
101
|
+
* 实例化是"整批共享一个 mixer",动画是 batch 级而非实例级;
|
|
102
|
+
* 默认 null 表示不主动切换,沿用 batch 构造时的 static animation。
|
|
103
|
+
*/
|
|
104
|
+
private _pendingClip;
|
|
105
|
+
private _cachedWorld;
|
|
106
|
+
constructor(fpsCollision?: boolean);
|
|
107
|
+
/** 该实例归属哪个 batch 的 key:相同 geometry+material 或相同 instanceUrl+当前生效动画 合并为一类。
|
|
108
|
+
* 因 key 含「当前生效动画」,切换动画 = 实例在「glb+旧动画」与「glb+新动画」两个常驻 batch 间迁移,而非 batch 内切 mixer。 */
|
|
109
|
+
getBatchKey(): string;
|
|
110
|
+
/** 本实例当前生效的动画名:优先 playClip 请求,否则类声明的 static animation;用于分桶 key 与 batch mixer 构建 */
|
|
111
|
+
getEffectiveAnimation(): string | undefined;
|
|
112
|
+
/**
|
|
113
|
+
* 为一组 InstancedChild 构建"选择代理"(select proxy):
|
|
114
|
+
* 用每个实例的世界矩阵 matrixWorld + 同款 geometry/material 重建独立网格,
|
|
115
|
+
* 供 stroke_pass 单独渲染其深度 / 灰度,从而得到这组实例"专属"的描边。
|
|
116
|
+
*
|
|
117
|
+
* 为什么需要它:InstancedChild 是纯逻辑节点(无几何),真实几何在 InstancedGroup 合并出的
|
|
118
|
+
* InstancedMesh 里,且一个 InstancedMesh 通常包含很多实例。要单独描边"某一个 / 某一组"实例,
|
|
119
|
+
* 无法靠直接渲染该 InstancedChild(空)或整个 InstancedMesh(会描到所有实例)。
|
|
120
|
+
* 本方法把目标实例重新"画"成一份独立几何,就能像普通 Mesh 一样单独取深度、单独描边。
|
|
121
|
+
*
|
|
122
|
+
* 关键点:
|
|
123
|
+
* - 用 instance.matrixWorld 直接作为代理网格的 local matrix(代理本身不在 scene 内、无父变换),
|
|
124
|
+
* 因此代理在屏幕上的位置 / 深度与真实实例严格一致,描边轮廓正好贴合,且能被同一张 baseDepthTexture 正确遮挡;
|
|
125
|
+
* - 代理对象通常注册到 ThreeBase.addStrokeObject(不在 scene 内),由渲染管线在效果阶段描边,
|
|
126
|
+
* 不会被正常 base pass 重复绘制。
|
|
127
|
+
*
|
|
128
|
+
* 仅支持内置几何模式(static geometry + static material);GLB 模式的几何由 batch 解析,
|
|
129
|
+
* 需从对应 InstancedBatch 取几何,此处暂跳过(无 static geometry 的实例不进代理)。
|
|
130
|
+
*
|
|
131
|
+
* @param children 要描边的一组实例(如某个 Group 的全部 InstancedChild)
|
|
132
|
+
* @returns 代理 Group(含顺序与 children 一一对应的代理网格);若没有任何可重建的实例则返回 null
|
|
133
|
+
*/
|
|
134
|
+
static buildSelectProxy(children: InstancedChild[], options?: SelectProxyOptions): {
|
|
135
|
+
proxy: Group;
|
|
136
|
+
sources: InstancedChild[];
|
|
137
|
+
} | null;
|
|
138
|
+
/** 把代理网格的矩阵同步到各源实例最新的 matrixWorld(组旋转 / 实例移动时描边跟着动)。
|
|
139
|
+
* 代理网格与 sources 一一对应(顺序由 buildSelectProxy 保证)。 */
|
|
140
|
+
static syncSelectProxy(proxy: Group): void;
|
|
141
|
+
/** 设置实例颜色(自动置 needUpdate) */
|
|
142
|
+
setColor(c: Color | number | string): this;
|
|
143
|
+
/**
|
|
144
|
+
* 请求切换本实例的动画剪辑。batch 按「glb + 当前生效动画」分桶(每个动画一个常驻 InstancedBatch),
|
|
145
|
+
* 调用 playClip 只改变本实例的生效动画,下一帧 getBatchKey 随之变化,实例便自动从旧动画 batch
|
|
146
|
+
* 迁移到新动画 batch(两 batch 常驻、不销毁)。传 null 恢复为 static animation。
|
|
147
|
+
* 例:soldier.playClip("Walk") / soldier.playClip("Idle")
|
|
148
|
+
*/
|
|
149
|
+
playClip(name: string | null): this;
|
|
150
|
+
/** 供 InstancedBatch 每帧读取当前请求的动画剪辑 */
|
|
151
|
+
get pendingClip(): string | null;
|
|
152
|
+
/**
|
|
153
|
+
* 位置 / 缩放 / 旋转直接用 three 原生写法即可(position.set / scale.setScalar / rotation.set),
|
|
154
|
+
* 无需任何自定义 setter;任一变换变化都会由 InstancedGroup 每帧的 matrixWorld 比对自动置 needUpdate。
|
|
155
|
+
* 注:Vector3 在 three 0.167 没有 onChange 回调;Euler/Quaternion 虽有 onChange,但 three 内部已用它
|
|
156
|
+
* 同步 rotation↔quaternion,不能覆盖,故统一用 matrixWorld 比对兜底,最贴合 three 的变换检测机制。
|
|
157
|
+
*/
|
|
158
|
+
/** 设置鼠标手势(悬停时光标样式):pointer / grab / move / text / crosshair ... */
|
|
159
|
+
setCursor(c: string): this;
|
|
160
|
+
/** 由 InstancedGroup 每帧调用:世界矩阵变化则置 needUpdate(setPosition 等已置过,这里双保险) */
|
|
161
|
+
markDirtyIfWorldChanged(): void;
|
|
162
|
+
/** 从注册表移除(对象销毁时调用,避免内存泄漏) */
|
|
163
|
+
dispose(): void;
|
|
164
|
+
/**
|
|
165
|
+
* 声明本实例归属哪个 InstancedGroup(owner tag)。多组共存时用于隔离,
|
|
166
|
+
* 只有 owner 相同的 InstancedGroup 会收集本实例。
|
|
167
|
+
*
|
|
168
|
+
* 用法:`new Cube().setOwner("preview")`,配合 `new InstancedGroup("preview")`。
|
|
169
|
+
* 不调用则归属为空 —— 会被「未声明 owner 的组」(如 ThreeBase 默认组)收集,保持旧行为。
|
|
170
|
+
*/
|
|
171
|
+
setOwner(tag: string): this;
|
|
172
|
+
/** 读取本实例的归属 tag(未声明返回 undefined) */
|
|
173
|
+
getOwner(): string | undefined;
|
|
174
|
+
}
|