bplinejs 0.0.101-beta.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/README.md +215 -0
  2. package/docs/API.md +471 -0
  3. package/lib/Camera/index.d.ts +88 -0
  4. package/lib/Camera/index.js +178 -0
  5. package/lib/Camera/index.js.map +1 -0
  6. package/lib/Color/index.d.ts +99 -0
  7. package/lib/Color/index.js +178 -0
  8. package/lib/Color/index.js.map +1 -0
  9. package/lib/Geometry/Geo.d.ts +131 -0
  10. package/lib/Geometry/Geo.js +180 -0
  11. package/lib/Geometry/Geo.js.map +1 -0
  12. package/lib/Geometry/Poly2D.d.ts +53 -0
  13. package/lib/Geometry/Poly2D.js +133 -0
  14. package/lib/Geometry/Poly2D.js.map +1 -0
  15. package/lib/Geometry/Rect2d.d.ts +89 -0
  16. package/lib/Geometry/Rect2d.js +128 -0
  17. package/lib/Geometry/Rect2d.js.map +1 -0
  18. package/lib/Geometry/index.d.ts +6 -0
  19. package/lib/Geometry/index.js +4 -0
  20. package/lib/Group/index.d.ts +70 -0
  21. package/lib/Group/index.js +110 -0
  22. package/lib/Group/index.js.map +1 -0
  23. package/lib/ID.d.ts +6 -0
  24. package/lib/ID.js +15 -0
  25. package/lib/ID.js.map +1 -0
  26. package/lib/IMesh/index.d.ts +104 -0
  27. package/lib/IMesh/index.js +333 -0
  28. package/lib/IMesh/index.js.map +1 -0
  29. package/lib/Material/Material.d.ts +158 -0
  30. package/lib/Material/Material.js +229 -0
  31. package/lib/Material/Material.js.map +1 -0
  32. package/lib/Material/baseMaterial.d.ts +15 -0
  33. package/lib/Material/baseMaterial.js +24 -0
  34. package/lib/Material/baseMaterial.js.map +1 -0
  35. package/lib/Material/index.d.ts +4 -0
  36. package/lib/Material/index.js +3 -0
  37. package/lib/Material/shaders/base/poly/fragment.js +6 -0
  38. package/lib/Material/shaders/base/poly/fragment.js.map +1 -0
  39. package/lib/Material/shaders/base/poly/vertex.js +6 -0
  40. package/lib/Material/shaders/base/poly/vertex.js.map +1 -0
  41. package/lib/Material/shaders/base/rect/fragment.js +6 -0
  42. package/lib/Material/shaders/base/rect/fragment.js.map +1 -0
  43. package/lib/Material/shaders/base/rect/vertex.js +6 -0
  44. package/lib/Material/shaders/base/rect/vertex.js.map +1 -0
  45. package/lib/Material/shaders/line/fragment.js +6 -0
  46. package/lib/Material/shaders/line/fragment.js.map +1 -0
  47. package/lib/Material/shaders/line/vertex.js +6 -0
  48. package/lib/Material/shaders/line/vertex.js.map +1 -0
  49. package/lib/Mesh/index.d.ts +154 -0
  50. package/lib/Mesh/index.js +254 -0
  51. package/lib/Mesh/index.js.map +1 -0
  52. package/lib/Object/index.d.ts +95 -0
  53. package/lib/Object/index.js +212 -0
  54. package/lib/Object/index.js.map +1 -0
  55. package/lib/Raws/index.d.ts +87 -0
  56. package/lib/Raws/index.js +164 -0
  57. package/lib/Raws/index.js.map +1 -0
  58. package/lib/Render/BufferManager.d.ts +93 -0
  59. package/lib/Render/BufferManager.js +281 -0
  60. package/lib/Render/BufferManager.js.map +1 -0
  61. package/lib/Render/DepthManager.d.ts +22 -0
  62. package/lib/Render/DepthManager.js +95 -0
  63. package/lib/Render/DepthManager.js.map +1 -0
  64. package/lib/Render/DestroyManager.d.ts +74 -0
  65. package/lib/Render/DestroyManager.js +221 -0
  66. package/lib/Render/DestroyManager.js.map +1 -0
  67. package/lib/Render/DevelopmentValidator.d.ts +73 -0
  68. package/lib/Render/DevelopmentValidator.js +188 -0
  69. package/lib/Render/DevelopmentValidator.js.map +1 -0
  70. package/lib/Render/DrawCallManager.d.ts +58 -0
  71. package/lib/Render/DrawCallManager.js +267 -0
  72. package/lib/Render/DrawCallManager.js.map +1 -0
  73. package/lib/Render/PipelineManager.d.ts +46 -0
  74. package/lib/Render/PipelineManager.js +254 -0
  75. package/lib/Render/PipelineManager.js.map +1 -0
  76. package/lib/Render/SamplerManager.d.ts +26 -0
  77. package/lib/Render/SamplerManager.js +42 -0
  78. package/lib/Render/SamplerManager.js.map +1 -0
  79. package/lib/Render/SceneUpdate.d.ts +9 -0
  80. package/lib/Render/SceneUpdate.js +18 -0
  81. package/lib/Render/SceneUpdate.js.map +1 -0
  82. package/lib/Render/TextureManager.d.ts +33 -0
  83. package/lib/Render/TextureManager.js +152 -0
  84. package/lib/Render/TextureManager.js.map +1 -0
  85. package/lib/Render/index.d.ts +212 -0
  86. package/lib/Render/index.js +347 -0
  87. package/lib/Render/index.js.map +1 -0
  88. package/lib/Render/types.d.ts +191 -0
  89. package/lib/Scene/index.d.ts +124 -0
  90. package/lib/Scene/index.js +225 -0
  91. package/lib/Scene/index.js.map +1 -0
  92. package/lib/Style/EdgeStyle.d.ts +28 -0
  93. package/lib/Style/EdgeStyle.js +67 -0
  94. package/lib/Style/EdgeStyle.js.map +1 -0
  95. package/lib/Style/JoinStyle.d.ts +27 -0
  96. package/lib/Style/JoinStyle.js +53 -0
  97. package/lib/Style/JoinStyle.js.map +1 -0
  98. package/lib/Style/PartStyle.d.ts +50 -0
  99. package/lib/Style/PartStyle.js +92 -0
  100. package/lib/Style/PartStyle.js.map +1 -0
  101. package/lib/Style/PointsStyle.d.ts +43 -0
  102. package/lib/Style/PointsStyle.js +98 -0
  103. package/lib/Style/PointsStyle.js.map +1 -0
  104. package/lib/Style/SolidStyle.d.ts +37 -0
  105. package/lib/Style/SolidStyle.js +83 -0
  106. package/lib/Style/SolidStyle.js.map +1 -0
  107. package/lib/Style/TexturedStyle.d.ts +29 -0
  108. package/lib/Style/TexturedStyle.js +66 -0
  109. package/lib/Style/TexturedStyle.js.map +1 -0
  110. package/lib/Style/WireframeStyle.d.ts +7 -0
  111. package/lib/Style/WireframeStyle.js +13 -0
  112. package/lib/Style/WireframeStyle.js.map +1 -0
  113. package/lib/Style/WriteStyleData.d.ts +10 -0
  114. package/lib/Style/WriteStyleData.js +59 -0
  115. package/lib/Style/WriteStyleData.js.map +1 -0
  116. package/lib/Style/index.d.ts +50 -0
  117. package/lib/Style/index.js +92 -0
  118. package/lib/Style/index.js.map +1 -0
  119. package/lib/Style/types.d.ts +21 -0
  120. package/lib/Texture/Layers.d.ts +26 -0
  121. package/lib/Texture/Layers.js +42 -0
  122. package/lib/Texture/Layers.js.map +1 -0
  123. package/lib/Texture/index.d.ts +116 -0
  124. package/lib/Texture/index.js +198 -0
  125. package/lib/Texture/index.js.map +1 -0
  126. package/lib/global-types.d.ts +8 -0
  127. package/lib/index.d.ts +43 -0
  128. package/lib/index.js +34 -0
  129. package/package.json +130 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fragment.js","names":[],"sources":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ //#region src/scripts/Material/shaders/line/vertex.shader?raw
2
+ var vertex_default = "\n// 深度来自队列层级,而不是提交顺序。矩阵和样式数组不因倒序绘制而搬动。\nstruct DrawDepth {\n base: u32,\n count: u32,\n reverse: u32,\n _padding: u32,\n};\n@group(0) @binding(5) var<uniform> drawDepth: DrawDepth;\n\nfn ResolveIndex(index: u32) -> u32 {\n return select(index, drawDepth.count - 1u - index, drawDepth.reverse != 0u);\n}\n\nfn GetDepth(index: u32) -> f32 {\n // 24 位整数除以 2^24,depth32float 可以精确表示;实际深度避开清空值 1。\n return 1.0 - f32(drawDepth.base + index + 1u) / 16777216.0;\n}\n\nstruct VertexInput {\n @location(0) position: vec2f,\n @builtin(instance_index) instanceIndex: u32,\n // 当前 basic line 暂不使用法线,保留给后续线条效果。\n @location(2) normal: vec2f,\n};\n\n// linePoints 与标准三角面共用 Mesh 和 Camera 矩阵缓冲。\n@group(0) @binding(0) var<storage, read> modelMatrices: array<mat3x3<f32>>;\n@group(0) @binding(1) var<uniform> viewMatrix: mat3x3<f32>;\n@group(0) @binding(2) var<uniform> orthogonalMatrix: mat3x3<f32>;\n\nstruct VertexOutput {\n @builtin(position) position: vec4f,\n @location(0) @interpolate(flat) instanceIndex: u32,\n};\n\n@vertex\nfn main(input: VertexInput) -> VertexOutput {\n // 保留入口 builtin 原值;用独立编号读取矩阵、样式并传给片段阶段。\n let resolvedIndex = ResolveIndex(input.instanceIndex);\n let modelMatrix = modelMatrices[resolvedIndex];\n let worldPosition = modelMatrix * vec3f(input.position, 1.0);\n let viewPosition = viewMatrix * worldPosition;\n let clipPosition = orthogonalMatrix * viewPosition;\n\n var output: VertexOutput;\n output.position = vec4f(clipPosition.xy, GetDepth(resolvedIndex), 1.0);\n output.instanceIndex = resolvedIndex;\n return output;\n}\n";
3
+ //#endregion
4
+ export { vertex_default as default };
5
+
6
+ //# sourceMappingURL=vertex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vertex.js","names":[],"sources":[],"mappings":""}
@@ -0,0 +1,154 @@
1
+ import Group from "../Group";
2
+ import Style from "../Style";
3
+ import type { Geometry2d, Material2d } from "../global-types.ts";
4
+ import type { GroupLike } from "../Group";
5
+ import type { GeoData, GeometrySubscriber } from "../Geometry/Geo";
6
+ import type { MaterialChange, MaterialSubscriber } from "../Material/Material";
7
+ import type { TextureResource } from "../Texture/Layers";
8
+ import type { VersionedMath } from "bpmatrixjs/Math";
9
+ interface MeshLike extends GroupLike, GeometrySubscriber, MaterialSubscriber {
10
+ data: Geometry2d | undefined;
11
+ material: Material2d | undefined;
12
+ order: number;
13
+ style: Style | undefined;
14
+ readonly count: number;
15
+ readonly capacity: number;
16
+ readonly textures: readonly (TextureResource | undefined)[];
17
+ readonly matrixData: Float32Array<ArrayBuffer>;
18
+ readonly styleData: Float32Array<ArrayBuffer>;
19
+ readonly matrixVersion: number;
20
+ readonly styleVersion: number;
21
+ readonly geometryPending: boolean;
22
+ readonly materialPending: boolean;
23
+ updateInstanceData(): void;
24
+ dispose(): void;
25
+ init(data: Geometry2d, material: Material2d): this;
26
+ }
27
+ /**
28
+ * 网格对象
29
+ * 在组对象基础上增加几何数据和材质数据
30
+ * @class
31
+ */
32
+ declare class Mesh extends Group implements MeshLike {
33
+ /**
34
+ * 对象类型
35
+ */
36
+ readonly type: string;
37
+ /**
38
+ * 几何数据
39
+ */
40
+ private _data;
41
+ /**
42
+ * 材质数据
43
+ */
44
+ private _material;
45
+ private _style;
46
+ protected _matrixVersion: number;
47
+ protected _styleVersion: number;
48
+ protected _stylePending: boolean;
49
+ protected _geometryPending: boolean;
50
+ protected _materialPending: boolean;
51
+ protected _disposed: boolean;
52
+ protected _matrixPending: boolean;
53
+ /** 普通 Mesh 只有一个实例,后续 IMesh 扩展时仍按实际数量绘制。 */
54
+ protected _count: number;
55
+ /** 当前有效绘制条数。 */
56
+ get count(): number;
57
+ /** 当前实例容量,普通 Mesh 不提前分配大量空槽。 */
58
+ protected _capacity: number;
59
+ /** 已分配槽数,不是扩容倍率。 */
60
+ get capacity(): number;
61
+ /** 连续实例矩阵,每实例 12 个 float(含 Mat3 对齐补位),由 updateInstanceData 写入。 */
62
+ protected _matrixData: Float32Array<ArrayBuffer>;
63
+ /** 连续世界矩阵数组,调用 updateInstanceData 后读取,不直接修改。 */
64
+ get matrixData(): Float32Array<ArrayBuffer>;
65
+ /** 连续实例样式,每实例 44 个 float,由 updateInstanceData 写入,不直接修改。 */
66
+ protected _styleData: Float32Array<ArrayBuffer>;
67
+ /** 连续样式数组,最后四个 float 保存三种贴图层号与补位。 */
68
+ get styleData(): Float32Array<ArrayBuffer>;
69
+ /** 普通 Mesh 每个分区只绑定一张图片,Shader 层号始终为 0。 */
70
+ get textures(): readonly (TextureResource | undefined)[];
71
+ /** Mesh 管理的样式;undefined 表示不接管 Geometry / Material 的样式。 */
72
+ get style(): Style | undefined;
73
+ /**
74
+ * 更换 Mesh 样式,并同步到当前几何和材质。
75
+ * undefined 仅停止接管,不清除它们已有的样式,也不销毁共享 Style。
76
+ * @param value 新样式引用
77
+ */
78
+ set style(value: Style | undefined);
79
+ /** 连续矩阵数据版本,各 Render 独立记录上传快照。 */
80
+ get matrixVersion(): number;
81
+ /** 连续样式数据版本,各 Render 独立记录上传快照。 */
82
+ get styleVersion(): number;
83
+ /** 几何通知待处理;生成和 GPU 上传仍归 geometryList,不在 Mesh 回调里执行。 */
84
+ get geometryPending(): boolean;
85
+ /** 材质通知待处理,用于下帧校验和更新 Mesh 自己的样式数组。 */
86
+ get materialPending(): boolean;
87
+ /**
88
+ * 几何发生变化,只标记本 Mesh 的绑定需要检查。
89
+ * @param geometry 通知来源;旧几何解绑后不再影响本 Mesh
90
+ */
91
+ onGeometryChange(geometry: GeoData): void;
92
+ /**
93
+ * 材质变化只安排下帧工作,不在通知链内上传 GPU 或递归改写 Style。
94
+ * @param change 样式数据和资源引用的影响范围
95
+ */
96
+ onMaterialChange(change: MaterialChange): void;
97
+ /** 最终停用 Mesh 时解绑资源;从 Scene 移除不会自动调用,也不销毁共享资源。 */
98
+ dispose(): void;
99
+ /** 将 Mesh 主动指定的样式同步给新绑定的几何及材质。 */
100
+ private syncStyle;
101
+ /**
102
+ * 世界矩阵计算完成后,将单实例数据打包到预分配数组。
103
+ * 数组不每帧分配;矩阵与样式分别更新版本,静止或只移动时不重复上传样式。
104
+ */
105
+ updateInstanceData(): void;
106
+ /**
107
+ * 世界矩阵完成修改后标记连续数组需要重打包,不再逐帧比较 12 个 float。
108
+ * @param source 数学对象
109
+ * @param field 关联字段
110
+ */
111
+ onMathChange(source: VersionedMath, field: string): void;
112
+ /**
113
+ * 获取当前几何体。
114
+ * @returns Geometry,未设置时为 undefined
115
+ */
116
+ get data(): Geometry2d | undefined;
117
+ /**
118
+ * 替换几何体,追加材质类型标记并刷新所在场景的资源引用。
119
+ * @param data 新几何体,undefined 表示暂不绘制
120
+ */
121
+ set data(data: Geometry2d | undefined);
122
+ /**
123
+ * 获取当前材质。
124
+ * @returns Material,未设置时为 undefined
125
+ */
126
+ get material(): Material2d | undefined;
127
+ /**
128
+ * 替换材质,追加当前几何类型标记并刷新场景引用。
129
+ * @param material 新材质,undefined 表示暂不绘制
130
+ */
131
+ set material(material: Material2d | undefined);
132
+ /**
133
+ * 同步材质几何类型与场景引用,不修改共享材质的着色器选择。
134
+ * @returns 无返回值
135
+ */
136
+ private updateResources;
137
+ /**
138
+ * 创建网格对象
139
+ * @param data 几何数据
140
+ * @param material 材质数据
141
+ * @param style true 创建全新 Style;false 保留资源各自样式;Style 指定共享样式
142
+ */
143
+ constructor(data: Geometry2d, material: Material2d, style?: Style | boolean);
144
+ /**
145
+ * 设置当前 Mesh 使用的 Geometry 与 Material。
146
+ * Mesh 已加入 Scene 时会标记场景结构变化,下次初始化将重建四个资源列表。
147
+ * @param data 几何数据
148
+ * @param material 材质数据
149
+ * @returns 当前 Mesh
150
+ */
151
+ init(data: Geometry2d, material: Material2d): this;
152
+ }
153
+ export default Mesh;
154
+ export type { MeshLike };
@@ -0,0 +1,254 @@
1
+ import { WriteStyleData } from "../Style/WriteStyleData.js";
2
+ import Style from "../Style/index.js";
3
+ import Group from "../Group/index.js";
4
+ //#region src/scripts/Mesh/index.ts
5
+ /**
6
+ * 网格对象
7
+ * 在组对象基础上增加几何数据和材质数据
8
+ * @class
9
+ */
10
+ var Mesh = class extends Group {
11
+ /**
12
+ * 对象类型
13
+ */
14
+ type = "Mesh";
15
+ /**
16
+ * 几何数据
17
+ */
18
+ _data;
19
+ /**
20
+ * 材质数据
21
+ */
22
+ _material;
23
+ _style;
24
+ _matrixVersion = 0;
25
+ _styleVersion = 0;
26
+ _stylePending = true;
27
+ _geometryPending = true;
28
+ _materialPending = true;
29
+ _disposed = false;
30
+ _matrixPending = true;
31
+ /** 普通 Mesh 只有一个实例,后续 IMesh 扩展时仍按实际数量绘制。 */
32
+ _count = 1;
33
+ /** 当前有效绘制条数。 */
34
+ get count() {
35
+ return this._count;
36
+ }
37
+ /** 当前实例容量,普通 Mesh 不提前分配大量空槽。 */
38
+ _capacity = 1;
39
+ /** 已分配槽数,不是扩容倍率。 */
40
+ get capacity() {
41
+ return this._capacity;
42
+ }
43
+ /** 连续实例矩阵,每实例 12 个 float(含 Mat3 对齐补位),由 updateInstanceData 写入。 */
44
+ _matrixData = /* @__PURE__ */ new Float32Array(12);
45
+ /** 连续世界矩阵数组,调用 updateInstanceData 后读取,不直接修改。 */
46
+ get matrixData() {
47
+ return this._matrixData;
48
+ }
49
+ /** 连续实例样式,每实例 44 个 float,由 updateInstanceData 写入,不直接修改。 */
50
+ _styleData = /* @__PURE__ */ new Float32Array(44);
51
+ /** 连续样式数组,最后四个 float 保存三种贴图层号与补位。 */
52
+ get styleData() {
53
+ return this._styleData;
54
+ }
55
+ /** 普通 Mesh 每个分区只绑定一张图片,Shader 层号始终为 0。 */
56
+ get textures() {
57
+ const style = this.material?.style;
58
+ return [
59
+ style?.solid.texture,
60
+ style?.edge.texture,
61
+ style?.points.texture
62
+ ];
63
+ }
64
+ /** Mesh 管理的样式;undefined 表示不接管 Geometry / Material 的样式。 */
65
+ get style() {
66
+ return this._style;
67
+ }
68
+ /**
69
+ * 更换 Mesh 样式,并同步到当前几何和材质。
70
+ * undefined 仅停止接管,不清除它们已有的样式,也不销毁共享 Style。
71
+ * @param value 新样式引用
72
+ */
73
+ set style(value) {
74
+ if (this._disposed) throw new Error("Disposed mesh cannot be reused.");
75
+ if (this._style === value && (value === void 0 || (this._data === void 0 || this._data.style === value) && (this._material === void 0 || this._material.style === value))) return;
76
+ this._style = value;
77
+ this.syncStyle();
78
+ this.updateResources();
79
+ }
80
+ /** 连续矩阵数据版本,各 Render 独立记录上传快照。 */
81
+ get matrixVersion() {
82
+ return this._matrixVersion;
83
+ }
84
+ /** 连续样式数据版本,各 Render 独立记录上传快照。 */
85
+ get styleVersion() {
86
+ return this._styleVersion;
87
+ }
88
+ /** 几何通知待处理;生成和 GPU 上传仍归 geometryList,不在 Mesh 回调里执行。 */
89
+ get geometryPending() {
90
+ return this._geometryPending;
91
+ }
92
+ /** 材质通知待处理,用于下帧校验和更新 Mesh 自己的样式数组。 */
93
+ get materialPending() {
94
+ return this._materialPending;
95
+ }
96
+ /**
97
+ * 几何发生变化,只标记本 Mesh 的绑定需要检查。
98
+ * @param geometry 通知来源;旧几何解绑后不再影响本 Mesh
99
+ */
100
+ onGeometryChange(geometry) {
101
+ if (!this._disposed && geometry === this._data) this._geometryPending = true;
102
+ }
103
+ /**
104
+ * 材质变化只安排下帧工作,不在通知链内上传 GPU 或递归改写 Style。
105
+ * @param change 样式数据和资源引用的影响范围
106
+ */
107
+ onMaterialChange(change) {
108
+ if (this._disposed || change.source !== this._material) return;
109
+ this._materialPending = true;
110
+ this._stylePending ||= change.style;
111
+ if (change.resources) this.getScene(this)?.updateVersion();
112
+ }
113
+ /** 最终停用 Mesh 时解绑资源;从 Scene 移除不会自动调用,也不销毁共享资源。 */
114
+ dispose() {
115
+ super.dispose();
116
+ this._data?.delete(this);
117
+ this._material?.delete(this);
118
+ this._disposed = true;
119
+ }
120
+ /** 将 Mesh 主动指定的样式同步给新绑定的几何及材质。 */
121
+ syncStyle() {
122
+ if (this._style === void 0) return;
123
+ if (this._data !== void 0) this._data.style = this._style;
124
+ if (this._material !== void 0) this._material.style = this._style;
125
+ }
126
+ /**
127
+ * 世界矩阵计算完成后,将单实例数据打包到预分配数组。
128
+ * 数组不每帧分配;矩阵与样式分别更新版本,静止或只移动时不重复上传样式。
129
+ */
130
+ updateInstanceData() {
131
+ if (this._disposed) throw new Error("Disposed mesh cannot be rendered.");
132
+ if (this._geometryPending && this._data !== void 0) this._material?.addGeometryType(this._data.type);
133
+ const matrix = this.worldMatrix.GPUData;
134
+ if (this._matrixPending) {
135
+ this.matrixData.set(matrix, 0);
136
+ this._matrixVersion++;
137
+ this._matrixPending = false;
138
+ }
139
+ if (this._stylePending) {
140
+ const style = this._material?.style;
141
+ if (style === void 0) this.styleData.fill(0);
142
+ else WriteStyleData(style, this.styleData, 0);
143
+ this._styleVersion++;
144
+ this._stylePending = false;
145
+ }
146
+ this._geometryPending = false;
147
+ this._materialPending = false;
148
+ }
149
+ /**
150
+ * 世界矩阵完成修改后标记连续数组需要重打包,不再逐帧比较 12 个 float。
151
+ * @param source 数学对象
152
+ * @param field 关联字段
153
+ */
154
+ onMathChange(source, field) {
155
+ super.onMathChange(source, field);
156
+ if (!this._nodeDisposed && field === "worldMatrix" && source === this.worldMatrix) this._matrixPending = true;
157
+ }
158
+ /**
159
+ * 获取当前几何体。
160
+ * @returns Geometry,未设置时为 undefined
161
+ */
162
+ get data() {
163
+ return this._data;
164
+ }
165
+ /**
166
+ * 替换几何体,追加材质类型标记并刷新所在场景的资源引用。
167
+ * @param data 新几何体,undefined 表示暂不绘制
168
+ */
169
+ set data(data) {
170
+ if (this._disposed) throw new Error("Disposed mesh cannot be reused.");
171
+ if (this._data === data) return;
172
+ data?.add(this);
173
+ this._data?.delete(this);
174
+ this._data = data;
175
+ this._geometryPending = true;
176
+ this.syncStyle();
177
+ this.updateResources();
178
+ }
179
+ /**
180
+ * 获取当前材质。
181
+ * @returns Material,未设置时为 undefined
182
+ */
183
+ get material() {
184
+ return this._material;
185
+ }
186
+ /**
187
+ * 替换材质,追加当前几何类型标记并刷新场景引用。
188
+ * @param material 新材质,undefined 表示暂不绘制
189
+ */
190
+ set material(material) {
191
+ if (this._disposed) throw new Error("Disposed mesh cannot be reused.");
192
+ if (this._material === material) return;
193
+ material?.add(this);
194
+ this._material?.delete(this);
195
+ this._material = material;
196
+ this._materialPending = true;
197
+ this._stylePending = true;
198
+ this.syncStyle();
199
+ this.updateResources();
200
+ }
201
+ /**
202
+ * 同步材质几何类型与场景引用,不修改共享材质的着色器选择。
203
+ * @returns 无返回值
204
+ */
205
+ updateResources() {
206
+ if (this._data !== void 0) this._material?.addGeometryType(this._data.type);
207
+ const scene = this.getScene(this);
208
+ if (scene !== void 0) {
209
+ scene.updateLists();
210
+ scene.updateVersion();
211
+ }
212
+ }
213
+ /**
214
+ * 创建网格对象
215
+ * @param data 几何数据
216
+ * @param material 材质数据
217
+ * @param style true 创建全新 Style;false 保留资源各自样式;Style 指定共享样式
218
+ */
219
+ constructor(data, material, style = true) {
220
+ super(0, 0);
221
+ this._style = style === true ? new Style() : style === false ? void 0 : style;
222
+ this.init(data, material);
223
+ }
224
+ /**
225
+ * 设置当前 Mesh 使用的 Geometry 与 Material。
226
+ * Mesh 已加入 Scene 时会标记场景结构变化,下次初始化将重建四个资源列表。
227
+ * @param data 几何数据
228
+ * @param material 材质数据
229
+ * @returns 当前 Mesh
230
+ */
231
+ init(data, material) {
232
+ if (this._disposed) throw new Error("Disposed mesh cannot be reused.");
233
+ if (data !== this._data) {
234
+ data.add(this);
235
+ this._data?.delete(this);
236
+ }
237
+ if (material !== this._material) {
238
+ material.add(this);
239
+ this._material?.delete(this);
240
+ }
241
+ this._data = data;
242
+ this._material = material;
243
+ this._geometryPending = true;
244
+ this._materialPending = true;
245
+ this._stylePending = true;
246
+ this.syncStyle();
247
+ this.updateResources();
248
+ return this;
249
+ }
250
+ };
251
+ //#endregion
252
+ export { Mesh as default };
253
+
254
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/scripts/Mesh/index.ts"],"sourcesContent":["\nimport Group from \"../Group\";\nimport Style from \"../Style\";\nimport { STYLE_STRIDE, WriteStyleData } from \"../Style/WriteStyleData\";\nimport type { Geometry2d, Material2d } from \"../global-types.ts\";\nimport type { GroupLike } from \"../Group\";\nimport type { GeoData, GeometrySubscriber } from \"../Geometry/Geo\";\nimport type { MaterialChange, MaterialSubscriber } from \"../Material/Material\";\nimport type { TextureResource } from \"../Texture/Layers\";\nimport type { VersionedMath } from \"bpmatrixjs/Math\";\n\n\ninterface MeshLike extends GroupLike, GeometrySubscriber, MaterialSubscriber {\n data: Geometry2d | undefined;\n material: Material2d | undefined;\n order: number;\n style: Style | undefined;\n readonly count: number;\n readonly capacity: number;\n readonly textures: readonly (TextureResource | undefined)[];\n readonly matrixData: Float32Array<ArrayBuffer>;\n readonly styleData: Float32Array<ArrayBuffer>;\n readonly matrixVersion: number;\n readonly styleVersion: number;\n readonly geometryPending: boolean;\n readonly materialPending: boolean;\n updateInstanceData(): void;\n dispose(): void;\n init(data: Geometry2d, material: Material2d): this;\n}\n\n/**\n * 网格对象\n * 在组对象基础上增加几何数据和材质数据\n * @class\n */\nclass Mesh extends Group implements MeshLike {\n /**\n * 对象类型\n */\n public readonly type: string = \"Mesh\";\n /**\n * 几何数据\n */\n private _data: Geometry2d | undefined;\n\n /**\n * 材质数据\n */\n private _material: Material2d | undefined;\n private _style: Style | undefined;\n protected _matrixVersion: number = 0;\n protected _styleVersion: number = 0;\n protected _stylePending: boolean = true;\n protected _geometryPending: boolean = true;\n protected _materialPending: boolean = true;\n protected _disposed: boolean = false;\n protected _matrixPending: boolean = true;\n\n /** 普通 Mesh 只有一个实例,后续 IMesh 扩展时仍按实际数量绘制。 */\n protected _count: number = 1;\n /** 当前有效绘制条数。 */\n public get count(): number { return this._count; }\n /** 当前实例容量,普通 Mesh 不提前分配大量空槽。 */\n protected _capacity: number = 1;\n /** 已分配槽数,不是扩容倍率。 */\n public get capacity(): number { return this._capacity; }\n /** 连续实例矩阵,每实例 12 个 float(含 Mat3 对齐补位),由 updateInstanceData 写入。 */\n protected _matrixData: Float32Array<ArrayBuffer> = new Float32Array(12);\n /** 连续世界矩阵数组,调用 updateInstanceData 后读取,不直接修改。 */\n public get matrixData(): Float32Array<ArrayBuffer> { return this._matrixData; }\n /** 连续实例样式,每实例 44 个 float,由 updateInstanceData 写入,不直接修改。 */\n protected _styleData: Float32Array<ArrayBuffer> = new Float32Array(STYLE_STRIDE);\n /** 连续样式数组,最后四个 float 保存三种贴图层号与补位。 */\n public get styleData(): Float32Array<ArrayBuffer> { return this._styleData; }\n /** 普通 Mesh 每个分区只绑定一张图片,Shader 层号始终为 0。 */\n public get textures(): readonly (TextureResource | undefined)[] {\n const style = this.material?.style;\n return [style?.solid.texture, style?.edge.texture, style?.points.texture];\n }\n\n /** Mesh 管理的样式;undefined 表示不接管 Geometry / Material 的样式。 */\n public get style(): Style | undefined { return this._style; }\n\n /**\n * 更换 Mesh 样式,并同步到当前几何和材质。\n * undefined 仅停止接管,不清除它们已有的样式,也不销毁共享 Style。\n * @param value 新样式引用\n */\n public set style(value: Style | undefined) {\n if (this._disposed) throw new Error(\"Disposed mesh cannot be reused.\");\n if (this._style === value && (value === undefined\n || ((this._data === undefined || this._data.style === value)\n && (this._material === undefined || this._material.style === value)))) return;\n this._style = value;\n this.syncStyle();\n this.updateResources();\n }\n\n /** 连续矩阵数据版本,各 Render 独立记录上传快照。 */\n public get matrixVersion(): number { return this._matrixVersion; }\n /** 连续样式数据版本,各 Render 独立记录上传快照。 */\n public get styleVersion(): number { return this._styleVersion; }\n /** 几何通知待处理;生成和 GPU 上传仍归 geometryList,不在 Mesh 回调里执行。 */\n public get geometryPending(): boolean { return this._geometryPending; }\n /** 材质通知待处理,用于下帧校验和更新 Mesh 自己的样式数组。 */\n public get materialPending(): boolean { return this._materialPending; }\n\n /**\n * 几何发生变化,只标记本 Mesh 的绑定需要检查。\n * @param geometry 通知来源;旧几何解绑后不再影响本 Mesh\n */\n public onGeometryChange(geometry: GeoData): void {\n if (!this._disposed && geometry === this._data) this._geometryPending = true;\n }\n\n /**\n * 材质变化只安排下帧工作,不在通知链内上传 GPU 或递归改写 Style。\n * @param change 样式数据和资源引用的影响范围\n */\n public onMaterialChange(change: MaterialChange): void {\n if (this._disposed || change.source !== this._material) return;\n this._materialPending = true;\n this._stylePending ||= change.style;\n if (change.resources) this.getScene(this)?.updateVersion();\n }\n\n /** 最终停用 Mesh 时解绑资源;从 Scene 移除不会自动调用,也不销毁共享资源。 */\n public dispose(): void {\n super.dispose();\n this._data?.delete(this);\n this._material?.delete(this);\n this._disposed = true;\n }\n\n /** 将 Mesh 主动指定的样式同步给新绑定的几何及材质。 */\n private syncStyle(): void {\n if (this._style === undefined) return;\n if (this._data !== undefined) this._data.style = this._style;\n if (this._material !== undefined) this._material.style = this._style;\n }\n\n /**\n * 世界矩阵计算完成后,将单实例数据打包到预分配数组。\n * 数组不每帧分配;矩阵与样式分别更新版本,静止或只移动时不重复上传样式。\n */\n public updateInstanceData(): void {\n if (this._disposed) throw new Error(\"Disposed mesh cannot be rendered.\");\n if (this._geometryPending && this._data !== undefined) {\n this._material?.addGeometryType(this._data.type);\n }\n const matrix = this.worldMatrix.GPUData;\n if (this._matrixPending) {\n this.matrixData.set(matrix, 0);\n this._matrixVersion++;\n this._matrixPending = false;\n }\n // 材质通过 add 通知所有 Mesh;不再每帧探测 Style 引用及版本。\n if (this._stylePending) {\n const style = this._material?.style;\n if (style === undefined) this.styleData.fill(0);\n else WriteStyleData(style, this.styleData, 0);\n this._styleVersion++;\n this._stylePending = false;\n }\n this._geometryPending = false;\n this._materialPending = false;\n }\n\n /**\n * 世界矩阵完成修改后标记连续数组需要重打包,不再逐帧比较 12 个 float。\n * @param source 数学对象\n * @param field 关联字段\n */\n public override onMathChange(source: VersionedMath, field: string): void {\n super.onMathChange(source, field);\n if (!this._nodeDisposed && field === \"worldMatrix\" && source === this.worldMatrix) {\n this._matrixPending = true;\n }\n }\n\n\n /**\n * 获取当前几何体。\n * @returns Geometry,未设置时为 undefined\n */\n public get data(): Geometry2d | undefined {\n return this._data;\n }\n\n /**\n * 替换几何体,追加材质类型标记并刷新所在场景的资源引用。\n * @param data 新几何体,undefined 表示暂不绘制\n */\n public set data(data: Geometry2d | undefined) {\n if (this._disposed) throw new Error(\"Disposed mesh cannot be reused.\");\n if (this._data === data) {\n return;\n }\n data?.add(this);\n this._data?.delete(this);\n this._data = data;\n this._geometryPending = true;\n this.syncStyle();\n this.updateResources();\n }\n\n /**\n * 获取当前材质。\n * @returns Material,未设置时为 undefined\n */\n public get material(): Material2d | undefined {\n return this._material;\n }\n\n /**\n * 替换材质,追加当前几何类型标记并刷新场景引用。\n * @param material 新材质,undefined 表示暂不绘制\n */\n public set material(material: Material2d | undefined) {\n if (this._disposed) throw new Error(\"Disposed mesh cannot be reused.\");\n if (this._material === material) {\n return;\n }\n material?.add(this);\n this._material?.delete(this);\n this._material = material;\n this._materialPending = true;\n this._stylePending = true;\n this.syncStyle();\n this.updateResources();\n }\n\n /**\n * 同步材质几何类型与场景引用,不修改共享材质的着色器选择。\n * @returns 无返回值\n */\n private updateResources(): void {\n if (this._data !== undefined) {\n this._material?.addGeometryType(this._data.type);\n }\n const scene = this.getScene(this);\n if (scene !== undefined) {\n scene.updateLists();\n scene.updateVersion();\n }\n }\n\n /**\n * 创建网格对象\n * @param data 几何数据\n * @param material 材质数据\n * @param style true 创建全新 Style;false 保留资源各自样式;Style 指定共享样式\n */\n public constructor(data: Geometry2d, material: Material2d, style: Style | boolean = true) {\n super(0, 0);\n this._style = style === true ? new Style() : style === false ? undefined : style;\n this.init(data, material);\n }\n\n /**\n * 设置当前 Mesh 使用的 Geometry 与 Material。\n * Mesh 已加入 Scene 时会标记场景结构变化,下次初始化将重建四个资源列表。\n * @param data 几何数据\n * @param material 材质数据\n * @returns 当前 Mesh\n */\n public init(data: Geometry2d, material: Material2d): this {\n if (this._disposed) throw new Error(\"Disposed mesh cannot be reused.\");\n if (data !== this._data) {\n data.add(this);\n this._data?.delete(this);\n }\n if (material !== this._material) {\n material.add(this);\n this._material?.delete(this);\n }\n this._data = data;\n this._material = material;\n this._geometryPending = true;\n this._materialPending = true;\n this._stylePending = true;\n this.syncStyle();\n this.updateResources();\n\n return this;\n }\n}\nexport default Mesh;\nexport type { MeshLike };\n"],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ import { Vec2 } from "bpmatrixjs/Math/Vec2";
2
+ import { Mat3 } from "bpmatrixjs/Math/Mat3";
3
+ import type { MathSubscriber, VersionedMath } from "bpmatrixjs/Math";
4
+ import type { AddObject } from "../global-types";
5
+ interface ObjectNodeLike extends MathSubscriber {
6
+ readonly id: number;
7
+ readonly type: string;
8
+ readonly version: number;
9
+ parent: AddObject | null;
10
+ position: Vec2;
11
+ rotation: number;
12
+ scale: Vec2;
13
+ matrix: Mat3;
14
+ worldMatrix: Mat3;
15
+ order: number;
16
+ updateVersion(): void;
17
+ ensureMatrix(): Mat3;
18
+ ensureWorldMatrix(): Mat3;
19
+ updateMatrix(): Mat3;
20
+ updateWorldMatrix(): Mat3;
21
+ dispose(): void;
22
+ }
23
+ /** 场景节点变换基类:参数持有一个版本,计算结果和每个消费者各存处理快照。 */
24
+ declare class ObjectNode implements ObjectNodeLike {
25
+ /** 全局节点 ID。 */
26
+ readonly id: number;
27
+ /** 节点类型。 */
28
+ readonly type: string;
29
+ private _version;
30
+ private _parent;
31
+ private _position;
32
+ private _rotation;
33
+ private _scale;
34
+ private _matrix;
35
+ private _worldMatrix;
36
+ private _order;
37
+ private _localSnapshot;
38
+ private _worldSnapshot;
39
+ private _parentSnapshot;
40
+ private _parentVersion;
41
+ private _writingMatrices;
42
+ protected _nodeDisposed: boolean;
43
+ /** @param x 初始 X 坐标 @param y 初始 Y 坐标 */
44
+ constructor(x: number, y: number);
45
+ /** 节点输入版本;计算快照不会清除或回退它。 */
46
+ get version(): number;
47
+ /** 手动使变换失效;普通 position/scale/rotation 修改已自动通知。 */
48
+ updateVersion(): void;
49
+ /** 父节点,场景树结构请通过 Group.add/remove 修改。 */
50
+ get parent(): AddObject | null;
51
+ /** @param value 父引用,Group 维护 children 与 Scene 列表 */
52
+ set parent(value: AddObject | null);
53
+ /** 位置向量,内部 set/setX/x 赋值均能通知。 */
54
+ get position(): Vec2;
55
+ /** @param value 新位置向量,替换时解绑旧字段 */
56
+ set position(value: Vec2);
57
+ /** 本地旋转弧度。 */
58
+ get rotation(): number;
59
+ /** @param value 新旋转弧度 */
60
+ set rotation(value: number);
61
+ /** 缩放向量,可与其他节点共享。 */
62
+ get scale(): Vec2;
63
+ /** @param value 新缩放向量 */
64
+ set scale(value: Vec2);
65
+ /** 本地矩阵;直接修改类方法会作为自定义矩阵保留,直到变换参数再次改变。 */
66
+ get matrix(): Mat3;
67
+ /** @param value 新本地矩阵 */
68
+ set matrix(value: Mat3);
69
+ /** 世界矩阵,Mat3 通知用于更新 Mesh 连续矩阵数组。 */
70
+ get worldMatrix(): Mat3;
71
+ /** @param value 新世界矩阵 */
72
+ set worldMatrix(value: Mat3);
73
+ /**
74
+ * 数学对象完成修改后通知节点;内部计算不反向增加输入版本。
75
+ * @param source 数学对象
76
+ * @param field position/scale/matrix/worldMatrix 关联字段
77
+ */
78
+ onMathChange(source: VersionedMath, field: string): void;
79
+ /** 参数版本改变后才生成本地矩阵。 */
80
+ ensureMatrix(): Mat3;
81
+ /** 强制根据 position/rotation/scale 生成本地矩阵;覆盖手动指定的本地矩阵。 */
82
+ updateMatrix(): Mat3;
83
+ /** 先更新祖先,再按自身版本、父矩阵身份和版本更新世界矩阵,不遍历兄弟节点。 */
84
+ ensureWorldMatrix(): Mat3;
85
+ /** 强制重新计算当前世界矩阵,同时保留显式修改的本地矩阵。 */
86
+ updateWorldMatrix(): Mat3;
87
+ /** 绘制排序值。 */
88
+ get order(): number;
89
+ /** @param value 新排序值;所属 Scene 递增版本,下一帧重排列表 */
90
+ set order(value: number);
91
+ /** 最终释放数学对象订阅,不移除场景节点,不销毁共享 Vec2/Mat3。 */
92
+ dispose(): void;
93
+ }
94
+ export default ObjectNode;
95
+ export type { ObjectNodeLike };