three-base 2.0.193 → 2.0.195
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/MktMesh/MktMesh.d.ts +25 -66
- package/MktMesh/MktMesh.js +29 -150
- package/MktMesh/MktMesh.ts +28 -155
- package/MktMesh/panoTileStitcher.d.ts +36 -11
- package/MktMesh/panoTileStitcher.js +89 -47
- package/MktMesh/panoTileStitcher.ts +94 -42
- package/MktMesh/types.d.ts +0 -6
- package/MktMesh/types.ts +0 -6
- package/package.json +1 -6
- package/MktMesh/glassPane.d.ts +0 -43
- package/MktMesh/glassPane.js +0 -97
- package/MktMesh/glassPane.ts +0 -116
package/MktMesh/glassPane.js
DELETED
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* @Description: 正方形玻璃面 —— 2026-10-28 需求「mkteditor 还需要增加一个 正方的面的 功能, 要双面显示,
|
|
3
|
-
* 环境贴图就用第一个全景, 效果用 three.js 的 webgl_materials_physical_transmission 案例, 并且要写入 json 数据和回显」。
|
|
4
|
-
*
|
|
5
|
-
* 定位:与「图片平面」(`./imagePlane.ts`)同为挂在 `MktMesh` 子树下的独立 Mesh,但材质完全不同:
|
|
6
|
-
* - 图片平面 = MeshBasicMaterial + FrontSide + 自带内容瓦片(单面可见是 2026-10-22 单独点名的,⛔ 不适用于本类);
|
|
7
|
-
* - 玻璃面 = MeshPhysicalMaterial + DoubleSide + transmission(本次点名「要双面显示」⇒ 正反两面都画、都折射)。
|
|
8
|
-
* 它自己没有内容纹理:画面 = 背后的东西被折射 + 一层反射,反射来自 `MktMesh` 给的**第一个全景**(`setEnvironmentTexture`)。
|
|
9
|
-
*
|
|
10
|
-
* 材质参数逐字对齐官方示例 `webgl_materials_physical_transmission` 的默认档
|
|
11
|
-
* (transmission 1 / ior 1.5 / thickness 0.01 / roughness 0 / metalness 0 / specularIntensity 1 /
|
|
12
|
-
* specularColor 白 / envMapIntensity 1 / color 白 / opacity 1 / transparent true / side DoubleSide)。
|
|
13
|
-
* ⛔ 示例 GUI 里那颗 `transmissionResolutionScale` 在 three 0.167 的构建里不存在(属主渲染器且该版本无此属性),
|
|
14
|
-
* 写了会直接把类型检查打红 ⇒ 本文件与宿主都不设它,折射全屏缓冲用引擎默认分辨率。
|
|
15
|
-
* ⛔ 不设 `alphaMap`:示例把它挂在那颗圆环上(切面形状用),玻璃面就是一块方板,没有alpha 轮廓要描。
|
|
16
|
-
*
|
|
17
|
-
* 形状:正方形 ⇒ 存档只有**一个**边长 `size`(米),宽恒等于高。几何仍是 PlaneGeometry(size, size),
|
|
18
|
-
* 原点在板中心,落地/贴墙那两种落点由调用者摆(与图片平面同一条口径,见编辑器 `addGlassPaneAt`)。
|
|
19
|
-
*/
|
|
20
|
-
import { Color, DoubleSide, Mesh, MeshPhysicalMaterial, PlaneGeometry } from "three";
|
|
21
|
-
const DEFAULT_SIZE = 1.5;
|
|
22
|
-
/** 选中高亮色:与图片平面/模型槽同一档(同族观感一致,只换颜色不换形态) */
|
|
23
|
-
const HIGHLIGHT_COLOR = "#ffd24a";
|
|
24
|
-
export class GlassPane extends Mesh {
|
|
25
|
-
_originalColor = "#ffffff";
|
|
26
|
-
/** 反射环境纹理的身份(由 `MktMesh` 注入,本类只持有引用、⛔ 从不 dispose 它 —— 那张按地址缓存在库里) */
|
|
27
|
-
_envTex = null;
|
|
28
|
-
constructor(name) {
|
|
29
|
-
const geo = new PlaneGeometry(DEFAULT_SIZE, DEFAULT_SIZE);
|
|
30
|
-
const mat = new MeshPhysicalMaterial({
|
|
31
|
-
color: new Color("#ffffff"),
|
|
32
|
-
// 双面(本次点名「要双面显示」):正面反面都画,也都能被射线打中
|
|
33
|
-
//(three 的射线拾取按材质 side 剔背面,见 `node_modules/three/src/objects/Mesh.js`)。
|
|
34
|
-
side: DoubleSide,
|
|
35
|
-
transparent: true,
|
|
36
|
-
opacity: 1,
|
|
37
|
-
// ↓ 以下六档 + 上面两档 = 官方示例的默认 GUI 值,一字未改
|
|
38
|
-
transmission: 1,
|
|
39
|
-
ior: 1.5,
|
|
40
|
-
thickness: 0.01,
|
|
41
|
-
roughness: 0,
|
|
42
|
-
metalness: 0,
|
|
43
|
-
specularIntensity: 1,
|
|
44
|
-
specularColor: new Color("#ffffff"),
|
|
45
|
-
envMapIntensity: 1,
|
|
46
|
-
});
|
|
47
|
-
super(geo, mat);
|
|
48
|
-
this.name = name || "玻璃面";
|
|
49
|
-
}
|
|
50
|
-
get paneSize() { return this.geometry.parameters.width; }
|
|
51
|
-
/** 换正方形边长(宽高等比跟着走:几何只有这一把尺) */
|
|
52
|
-
setPaneSize(size) {
|
|
53
|
-
this.geometry.dispose();
|
|
54
|
-
this.geometry = new PlaneGeometry(size, size);
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* 绑/摘反射环境纹理(`null` = 还没有可用的环境源)。
|
|
58
|
-
* ⚠️ 判等在前:`material.needsUpdate = true` 会涨材质版本 ⇒ 程序要重编译。库里给同一批玻璃面注入的是
|
|
59
|
-
* **同一个 Texture 对象**(反射源只下载一次),逐颗重复赋同一张时必须早退,不然就是 N 次无谓重编译。
|
|
60
|
-
* ⚠️ 传进来的纹理必须已标 `EquirectangularReflectionMapping`:three 的 `WebGLCubeUVMaps` 只认那个标记才会
|
|
61
|
-
* 自动把它卷积成立方 UV(PMREM);直接给一张普通 UV 纹理(例如全景拼合槽的那两张 RT)采出来是花屏。
|
|
62
|
-
*/
|
|
63
|
-
setEnvironmentTexture(tex) {
|
|
64
|
-
if (this._envTex === tex)
|
|
65
|
-
return;
|
|
66
|
-
this._envTex = tex;
|
|
67
|
-
this.material.envMap = tex;
|
|
68
|
-
this.material.needsUpdate = true;
|
|
69
|
-
}
|
|
70
|
-
highlight() {
|
|
71
|
-
this.material.color.set(HIGHLIGHT_COLOR);
|
|
72
|
-
}
|
|
73
|
-
restoreColor() {
|
|
74
|
-
this.material.color.set(this._originalColor);
|
|
75
|
-
}
|
|
76
|
-
toData() {
|
|
77
|
-
return {
|
|
78
|
-
name: this.name || undefined,
|
|
79
|
-
position: { x: this.position.x, y: this.position.y, z: this.position.z },
|
|
80
|
-
rotation: { x: this.rotation.x, y: this.rotation.y, z: this.rotation.z },
|
|
81
|
-
size: this.paneSize,
|
|
82
|
-
};
|
|
83
|
-
}
|
|
84
|
-
applyData(d) {
|
|
85
|
-
if (d.name)
|
|
86
|
-
this.name = d.name;
|
|
87
|
-
this.position.set(d.position.x, d.position.y, d.position.z);
|
|
88
|
-
this.rotation.set(d.rotation.x, d.rotation.y, d.rotation.z);
|
|
89
|
-
this.setPaneSize(d.size);
|
|
90
|
-
}
|
|
91
|
-
/** 只释放自己的几何与材质;反射纹理归 `MktMesh` 管(多颗共用一张)。 */
|
|
92
|
-
dispose() {
|
|
93
|
-
this.geometry.dispose();
|
|
94
|
-
this.material.dispose();
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
export const GLASS_PANE_DEFAULTS = { size: DEFAULT_SIZE };
|
package/MktMesh/glassPane.ts
DELETED
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* @Description: 正方形玻璃面 —— 2026-10-28 需求「mkteditor 还需要增加一个 正方的面的 功能, 要双面显示,
|
|
3
|
-
* 环境贴图就用第一个全景, 效果用 three.js 的 webgl_materials_physical_transmission 案例, 并且要写入 json 数据和回显」。
|
|
4
|
-
*
|
|
5
|
-
* 定位:与「图片平面」(`./imagePlane.ts`)同为挂在 `MktMesh` 子树下的独立 Mesh,但材质完全不同:
|
|
6
|
-
* - 图片平面 = MeshBasicMaterial + FrontSide + 自带内容瓦片(单面可见是 2026-10-22 单独点名的,⛔ 不适用于本类);
|
|
7
|
-
* - 玻璃面 = MeshPhysicalMaterial + DoubleSide + transmission(本次点名「要双面显示」⇒ 正反两面都画、都折射)。
|
|
8
|
-
* 它自己没有内容纹理:画面 = 背后的东西被折射 + 一层反射,反射来自 `MktMesh` 给的**第一个全景**(`setEnvironmentTexture`)。
|
|
9
|
-
*
|
|
10
|
-
* 材质参数逐字对齐官方示例 `webgl_materials_physical_transmission` 的默认档
|
|
11
|
-
* (transmission 1 / ior 1.5 / thickness 0.01 / roughness 0 / metalness 0 / specularIntensity 1 /
|
|
12
|
-
* specularColor 白 / envMapIntensity 1 / color 白 / opacity 1 / transparent true / side DoubleSide)。
|
|
13
|
-
* ⛔ 示例 GUI 里那颗 `transmissionResolutionScale` 在 three 0.167 的构建里不存在(属主渲染器且该版本无此属性),
|
|
14
|
-
* 写了会直接把类型检查打红 ⇒ 本文件与宿主都不设它,折射全屏缓冲用引擎默认分辨率。
|
|
15
|
-
* ⛔ 不设 `alphaMap`:示例把它挂在那颗圆环上(切面形状用),玻璃面就是一块方板,没有alpha 轮廓要描。
|
|
16
|
-
*
|
|
17
|
-
* 形状:正方形 ⇒ 存档只有**一个**边长 `size`(米),宽恒等于高。几何仍是 PlaneGeometry(size, size),
|
|
18
|
-
* 原点在板中心,落地/贴墙那两种落点由调用者摆(与图片平面同一条口径,见编辑器 `addGlassPaneAt`)。
|
|
19
|
-
*/
|
|
20
|
-
import { Color, DoubleSide, Mesh, MeshPhysicalMaterial, PlaneGeometry, Texture } from "three";
|
|
21
|
-
|
|
22
|
-
/** 玻璃面的持久化数据(进 `MktMesh.exportData` 的 `glass` 键 / `importData` 还原) */
|
|
23
|
-
export interface GlassPaneData {
|
|
24
|
-
name?: string;
|
|
25
|
-
position: { x: number; y: number; z: number };
|
|
26
|
-
rotation: { x: number; y: number; z: number };
|
|
27
|
-
/** 正方形边长(米):宽 = 高 = 本值,⛔ 不拆成两档 */
|
|
28
|
-
size: number;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
const DEFAULT_SIZE = 1.5;
|
|
32
|
-
/** 选中高亮色:与图片平面/模型槽同一档(同族观感一致,只换颜色不换形态) */
|
|
33
|
-
const HIGHLIGHT_COLOR = "#ffd24a";
|
|
34
|
-
|
|
35
|
-
export class GlassPane extends Mesh<PlaneGeometry, MeshPhysicalMaterial> {
|
|
36
|
-
private _originalColor: string = "#ffffff";
|
|
37
|
-
/** 反射环境纹理的身份(由 `MktMesh` 注入,本类只持有引用、⛔ 从不 dispose 它 —— 那张按地址缓存在库里) */
|
|
38
|
-
private _envTex: Texture | null = null;
|
|
39
|
-
|
|
40
|
-
constructor(name?: string) {
|
|
41
|
-
const geo = new PlaneGeometry(DEFAULT_SIZE, DEFAULT_SIZE);
|
|
42
|
-
const mat = new MeshPhysicalMaterial({
|
|
43
|
-
color: new Color("#ffffff"),
|
|
44
|
-
// 双面(本次点名「要双面显示」):正面反面都画,也都能被射线打中
|
|
45
|
-
//(three 的射线拾取按材质 side 剔背面,见 `node_modules/three/src/objects/Mesh.js`)。
|
|
46
|
-
side: DoubleSide,
|
|
47
|
-
transparent: true,
|
|
48
|
-
opacity: 1,
|
|
49
|
-
// ↓ 以下六档 + 上面两档 = 官方示例的默认 GUI 值,一字未改
|
|
50
|
-
transmission: 1,
|
|
51
|
-
ior: 1.5,
|
|
52
|
-
thickness: 0.01,
|
|
53
|
-
roughness: 0,
|
|
54
|
-
metalness: 0,
|
|
55
|
-
specularIntensity: 1,
|
|
56
|
-
specularColor: new Color("#ffffff"),
|
|
57
|
-
envMapIntensity: 1,
|
|
58
|
-
});
|
|
59
|
-
super(geo, mat);
|
|
60
|
-
this.name = name || "玻璃面";
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
get paneSize(): number { return (this.geometry as PlaneGeometry).parameters.width; }
|
|
64
|
-
|
|
65
|
-
/** 换正方形边长(宽高等比跟着走:几何只有这一把尺) */
|
|
66
|
-
setPaneSize(size: number): void {
|
|
67
|
-
this.geometry.dispose();
|
|
68
|
-
this.geometry = new PlaneGeometry(size, size);
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
/**
|
|
72
|
-
* 绑/摘反射环境纹理(`null` = 还没有可用的环境源)。
|
|
73
|
-
* ⚠️ 判等在前:`material.needsUpdate = true` 会涨材质版本 ⇒ 程序要重编译。库里给同一批玻璃面注入的是
|
|
74
|
-
* **同一个 Texture 对象**(反射源只下载一次),逐颗重复赋同一张时必须早退,不然就是 N 次无谓重编译。
|
|
75
|
-
* ⚠️ 传进来的纹理必须已标 `EquirectangularReflectionMapping`:three 的 `WebGLCubeUVMaps` 只认那个标记才会
|
|
76
|
-
* 自动把它卷积成立方 UV(PMREM);直接给一张普通 UV 纹理(例如全景拼合槽的那两张 RT)采出来是花屏。
|
|
77
|
-
*/
|
|
78
|
-
setEnvironmentTexture(tex: Texture | null): void {
|
|
79
|
-
if (this._envTex === tex) return;
|
|
80
|
-
this._envTex = tex;
|
|
81
|
-
this.material.envMap = tex;
|
|
82
|
-
this.material.needsUpdate = true;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
highlight(): void {
|
|
86
|
-
this.material.color.set(HIGHLIGHT_COLOR);
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
restoreColor(): void {
|
|
90
|
-
this.material.color.set(this._originalColor);
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
toData(): GlassPaneData {
|
|
94
|
-
return {
|
|
95
|
-
name: this.name || undefined,
|
|
96
|
-
position: { x: this.position.x, y: this.position.y, z: this.position.z },
|
|
97
|
-
rotation: { x: this.rotation.x, y: this.rotation.y, z: this.rotation.z },
|
|
98
|
-
size: this.paneSize,
|
|
99
|
-
};
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
applyData(d: GlassPaneData): void {
|
|
103
|
-
if (d.name) this.name = d.name;
|
|
104
|
-
this.position.set(d.position.x, d.position.y, d.position.z);
|
|
105
|
-
this.rotation.set(d.rotation.x, d.rotation.y, d.rotation.z);
|
|
106
|
-
this.setPaneSize(d.size);
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
/** 只释放自己的几何与材质;反射纹理归 `MktMesh` 管(多颗共用一张)。 */
|
|
110
|
-
dispose(): void {
|
|
111
|
-
this.geometry.dispose();
|
|
112
|
-
this.material.dispose();
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
export const GLASS_PANE_DEFAULTS = { size: DEFAULT_SIZE };
|