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,180 @@
1
+ import { GETID } from "../ID.js";
2
+ import Style from "../Style/index.js";
3
+ //#region src/scripts/Geometry/Geo.ts
4
+ /** CPU 几何及其单一版本;样式订阅只响应影响几何生成的字段。 */
5
+ var Geo = class {
6
+ /** 全局几何 ID。 */
7
+ id = GETID();
8
+ /** 对象类型。 */
9
+ type = "Geo";
10
+ _version = 0;
11
+ _generatedVersion = -1;
12
+ _style;
13
+ _disposed = false;
14
+ _subscribers = /* @__PURE__ */ new Set();
15
+ /** 合并三角面坐标。 */
16
+ _geometry;
17
+ /** 逐顶点二维轮廓法线。 */
18
+ normal;
19
+ /** 逐顶点 UV。 */
20
+ uv;
21
+ /** 合并三角面索引。 */
22
+ index;
23
+ /** 独立 line-list 几何。 */
24
+ linePoints;
25
+ /** 顶点用途:0 实体面、0.5 边框、1 关键点。 */
26
+ vertexType;
27
+ /** 关键点中心,其他顶点填零。 */
28
+ position;
29
+ /** 边框连接倍率,其他顶点填一。 */
30
+ miterScale;
31
+ /** 宽高、圆角和实体边框宽度。 */
32
+ uniformData = /* @__PURE__ */ new Float32Array(4);
33
+ /** @param style 共享样式,默认四个分区全部关闭 */
34
+ constructor(style = new Style()) {
35
+ this._style = style;
36
+ style.add(this);
37
+ }
38
+ /** 当前共享样式,分区 enabled 决定生成内容。 */
39
+ get style() {
40
+ return this._style;
41
+ }
42
+ /** @param value 新样式,先解绑旧样式并使全部几何缓存失效 */
43
+ set style(value) {
44
+ if (this._disposed) throw new Error("Disposed geometry cannot be reused.");
45
+ if (this._style === value) return;
46
+ this._style.delete(this);
47
+ this._style = value;
48
+ value.add(this);
49
+ this.updateVersion();
50
+ }
51
+ /**
52
+ * 只让几何依赖的字段触发重建,颜色和透明度不影响顶点。
53
+ * @param change 样式通知
54
+ */
55
+ onStyleChange(change) {
56
+ if (this._disposed || change.source !== this._style) return;
57
+ if (change.field === "enabled" || change.area === "join" && this.type === "Poly2D" || change.area === "edge" && [
58
+ "width",
59
+ "borderAlign",
60
+ "uvRepeat"
61
+ ].includes(change.field) || change.area === "points" && [
62
+ "vertices",
63
+ "midpoints",
64
+ "radius",
65
+ "segments",
66
+ "minPointsLength",
67
+ "minEdgePointsLength"
68
+ ].includes(change.field)) this.updateVersion();
69
+ }
70
+ /** 最终停止使用时解绑 Style;不等于从 Scene 移除,不销毁 Render 缓存。 */
71
+ dispose() {
72
+ this._style.delete(this);
73
+ this._subscribers.clear();
74
+ this._disposed = true;
75
+ }
76
+ /**
77
+ * 关联使用当前几何的消费者,重复关联不会重复通知。
78
+ * @param subscriber Mesh 或其他几何消费者
79
+ */
80
+ add(subscriber) {
81
+ if (this._disposed) throw new Error("Disposed geometry cannot be reused.");
82
+ this._subscribers.add(subscriber);
83
+ }
84
+ /**
85
+ * 解绑消费者,不销毁共享几何或 GPU 缓存。
86
+ * @param subscriber 需要解绑的消费者
87
+ */
88
+ delete(subscriber) {
89
+ this._subscribers.delete(subscriber);
90
+ }
91
+ /**
92
+ * 获取合并三角面的二维顶点数组。
93
+ * @returns 顶点数组,未生成三角面时为 undefined
94
+ */
95
+ get geometry() {
96
+ return this._geometry;
97
+ }
98
+ /**
99
+ * 替换合并三角面顶点数组并通知 GPU 缓存更新。
100
+ * 已生成的 CPU 数据直接提交;尚未生成的参数变化仍由 ensureGeometry 处理。
101
+ * @param geometry 新顶点数组
102
+ */
103
+ set geometry(geometry) {
104
+ if (this._geometry === geometry) return;
105
+ const generatedVersion = this._generatedVersion;
106
+ const previousVersion = this._version;
107
+ this._geometry = geometry;
108
+ this.updateVersion();
109
+ if (generatedVersion === previousVersion) this._generatedVersion = this._version;
110
+ }
111
+ /**
112
+ * 按实体面、宽边框、关键点顺序合并全部三角面并补齐顶点属性。
113
+ * 索引按顶点偏移重新定位,顶点数量超过 Uint16 范围时自动升级位宽。
114
+ * @param parts 本次启用的几何分区
115
+ * @returns 无返回值
116
+ */
117
+ mergeGeometry(parts) {
118
+ const vertexCount = parts.reduce((sum, part) => sum + part.data.geometry.length / 2, 0);
119
+ const indexCount = parts.reduce((sum, part) => sum + part.data.index.length, 0);
120
+ if (indexCount === 0) {
121
+ this._geometry = void 0;
122
+ this.normal = void 0;
123
+ this.uv = void 0;
124
+ this.index = void 0;
125
+ this.vertexType = void 0;
126
+ this.position = void 0;
127
+ this.miterScale = void 0;
128
+ return;
129
+ }
130
+ this._geometry = new Float32Array(vertexCount * 2);
131
+ this.normal = new Float32Array(vertexCount * 2);
132
+ this.uv = new Float32Array(vertexCount * 2);
133
+ this.position = new Float32Array(vertexCount * 2);
134
+ this.vertexType = new Float32Array(vertexCount);
135
+ this.miterScale = new Float32Array(vertexCount).fill(1);
136
+ this.index = vertexCount > 65536 ? new Uint32Array(indexCount) : new Uint16Array(indexCount);
137
+ let vertexOffset = 0;
138
+ let indexOffset = 0;
139
+ for (const part of parts) {
140
+ const data = part.data;
141
+ const count = data.geometry.length / 2;
142
+ this._geometry.set(data.geometry, vertexOffset * 2);
143
+ this.normal.set(data.normal, vertexOffset * 2);
144
+ this.uv.set(data.uv, vertexOffset * 2);
145
+ this.vertexType.fill(part.vertexType, vertexOffset, vertexOffset + count);
146
+ if (data.position !== void 0) this.position.set(data.position, vertexOffset * 2);
147
+ if (data.miterScale !== void 0) this.miterScale.set(data.miterScale, vertexOffset);
148
+ for (const index of data.index) {
149
+ this.index[indexOffset] = index + vertexOffset;
150
+ indexOffset += 1;
151
+ }
152
+ vertexOffset += count;
153
+ }
154
+ }
155
+ /** 当前几何版本。 */
156
+ get version() {
157
+ return this._version;
158
+ }
159
+ /** 通知 CPU 生成器及每个 Render 更新缓存。 */
160
+ updateVersion() {
161
+ this._version++;
162
+ for (const subscriber of [...this._subscribers]) subscriber.onGeometryChange(this);
163
+ }
164
+ /** 参数变化后延迟生成,一帧内多次改值只生成一次。 */
165
+ ensureGeometry() {
166
+ if (this._disposed) throw new Error("Disposed geometry cannot be rendered.");
167
+ if (this._generatedVersion !== this._version) this.updateGeometry();
168
+ return this;
169
+ }
170
+ /** 提交生成的数据;手动调用也会递增版本,通知每个 Render。 */
171
+ updateGeometry() {
172
+ this.updateVersion();
173
+ this._generatedVersion = this._version;
174
+ return this;
175
+ }
176
+ };
177
+ //#endregion
178
+ export { Geo as default };
179
+
180
+ //# sourceMappingURL=Geo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Geo.js","names":[],"sources":["../../src/scripts/Geometry/Geo.ts"],"sourcesContent":["import { GETID } from \"../ID\";\nimport Style from \"../Style\";\nimport type { StyleChange, StyleSubscriber } from \"../Style\";\n\n/** 边框对齐类型沿用 Style 定义。 */\nimport type { BorderAlign } from \"../Style\";\ninterface GeoBuffersLike {\n vertex?: number;\n normal?: number;\n uv?: number;\n index?: number;\n}\n/** 单个几何分区的顶点属性。 */\ninterface GeoPartDataLike {\n geometry: Float32Array;\n normal: Float32Array;\n uv: Float32Array;\n index: Uint16Array | Uint32Array;\n /** 点型逐顶点中心坐标,长度与 geometry 相同。 */\n position?: Float32Array;\n /** 每个顶点的用途:0 为实体面,0.5 为宽边框,1 为关键点。 */\n vertexType?: Float32Array;\n miterScale?: Float32Array;\n}\n\n\n/** 几何消费者;通知只标记后续工作,不在回调中生成几何或操作 GPU。 */\ninterface GeometrySubscriber {\n onGeometryChange(geometry: GeoData): void;\n}\n\ninterface GeoData extends StyleSubscriber {\n readonly id: number;\n readonly type: string;\n readonly version: number;\n style: Style;\n geometry: Float32Array | undefined;\n normal: Float32Array | undefined;\n uv: Float32Array | undefined;\n index: Uint16Array | Uint32Array | undefined;\n linePoints: GeoPartDataLike | undefined;\n vertexType: Float32Array | undefined;\n position: Float32Array | undefined;\n miterScale: Float32Array | undefined;\n readonly uniformData: Float32Array<ArrayBuffer>;\n add(subscriber: GeometrySubscriber): void;\n delete(subscriber: GeometrySubscriber): void;\n updateVersion(): void;\n ensureGeometry(): this;\n updateGeometry(): this;\n dispose(): void;\n}\n\n/** CPU 几何及其单一版本;样式订阅只响应影响几何生成的字段。 */\nclass Geo implements GeoData {\n /** 全局几何 ID。 */\n public readonly id: number = GETID();\n /** 对象类型。 */\n public readonly type: string = \"Geo\";\n private _version: number = 0;\n private _generatedVersion: number = -1;\n private _style: Style;\n private _disposed: boolean = false;\n private readonly _subscribers = new Set<GeometrySubscriber>();\n /** 合并三角面坐标。 */\n protected _geometry: Float32Array | undefined;\n /** 逐顶点二维轮廓法线。 */\n public normal: Float32Array | undefined;\n /** 逐顶点 UV。 */\n public uv: Float32Array | undefined;\n /** 合并三角面索引。 */\n public index: Uint16Array | Uint32Array | undefined;\n /** 独立 line-list 几何。 */\n public linePoints: GeoPartDataLike | undefined;\n /** 顶点用途:0 实体面、0.5 边框、1 关键点。 */\n public vertexType: Float32Array | undefined;\n /** 关键点中心,其他顶点填零。 */\n public position: Float32Array | undefined;\n /** 边框连接倍率,其他顶点填一。 */\n public miterScale: Float32Array | undefined;\n /** 宽高、圆角和实体边框宽度。 */\n public readonly uniformData: Float32Array<ArrayBuffer> = new Float32Array(4);\n\n /** @param style 共享样式,默认四个分区全部关闭 */\n public constructor(style: Style = new Style()) {\n this._style = style;\n style.add(this);\n }\n /** 当前共享样式,分区 enabled 决定生成内容。 */\n public get style(): Style { return this._style; }\n /** @param value 新样式,先解绑旧样式并使全部几何缓存失效 */\n public set style(value: Style) {\n if (this._disposed) throw new Error(\"Disposed geometry cannot be reused.\");\n if (this._style === value) return;\n this._style.delete(this);\n this._style = value;\n value.add(this);\n this.updateVersion();\n }\n /**\n * 只让几何依赖的字段触发重建,颜色和透明度不影响顶点。\n * @param change 样式通知\n */\n public onStyleChange(change: StyleChange): void {\n if (this._disposed || change.source !== this._style) return;\n if (change.field === \"enabled\"\n || (change.area === \"join\" && this.type === \"Poly2D\")\n || (change.area === \"edge\" && [\"width\", \"borderAlign\", \"uvRepeat\"].includes(change.field))\n || (change.area === \"points\" && [\"vertices\", \"midpoints\", \"radius\", \"segments\", \"minPointsLength\", \"minEdgePointsLength\"].includes(change.field))) {\n this.updateVersion();\n }\n }\n /** 最终停止使用时解绑 Style;不等于从 Scene 移除,不销毁 Render 缓存。 */\n public dispose(): void {\n this._style.delete(this);\n this._subscribers.clear();\n this._disposed = true;\n }\n\n /**\n * 关联使用当前几何的消费者,重复关联不会重复通知。\n * @param subscriber Mesh 或其他几何消费者\n */\n public add(subscriber: GeometrySubscriber): void {\n if (this._disposed) throw new Error(\"Disposed geometry cannot be reused.\");\n this._subscribers.add(subscriber);\n }\n\n /**\n * 解绑消费者,不销毁共享几何或 GPU 缓存。\n * @param subscriber 需要解绑的消费者\n */\n public delete(subscriber: GeometrySubscriber): void {\n this._subscribers.delete(subscriber);\n }\n\n /**\n * 获取合并三角面的二维顶点数组。\n * @returns 顶点数组,未生成三角面时为 undefined\n */\n public get geometry(): Float32Array | undefined {\n return this._geometry;\n }\n\n /**\n * 替换合并三角面顶点数组并通知 GPU 缓存更新。\n * 已生成的 CPU 数据直接提交;尚未生成的参数变化仍由 ensureGeometry 处理。\n * @param geometry 新顶点数组\n */\n public set geometry(geometry: Float32Array | undefined) {\n if (this._geometry === geometry) {\n return;\n }\n\n const generatedVersion: number = this._generatedVersion;\n const previousVersion: number = this._version;\n this._geometry = geometry;\n this.updateVersion();\n if (generatedVersion === previousVersion) {\n this._generatedVersion = this._version;\n }\n }\n\n\n /**\n * 按实体面、宽边框、关键点顺序合并全部三角面并补齐顶点属性。\n * 索引按顶点偏移重新定位,顶点数量超过 Uint16 范围时自动升级位宽。\n * @param parts 本次启用的几何分区\n * @returns 无返回值\n */\n protected mergeGeometry(parts: { data: GeoPartDataLike; vertexType: number }[]): void {\n const vertexCount: number = parts.reduce((sum, part): number => sum + part.data.geometry.length / 2, 0);\n const indexCount: number = parts.reduce((sum, part): number => sum + part.data.index.length, 0);\n if (indexCount === 0) {\n this._geometry = undefined;\n this.normal = undefined;\n this.uv = undefined;\n this.index = undefined;\n this.vertexType = undefined;\n this.position = undefined;\n this.miterScale = undefined;\n return;\n }\n this._geometry = new Float32Array(vertexCount * 2);\n this.normal = new Float32Array(vertexCount * 2);\n this.uv = new Float32Array(vertexCount * 2);\n this.position = new Float32Array(vertexCount * 2);\n this.vertexType = new Float32Array(vertexCount);\n this.miterScale = new Float32Array(vertexCount).fill(1);\n this.index = vertexCount > 65536 ? new Uint32Array(indexCount) : new Uint16Array(indexCount);\n\n let vertexOffset: number = 0;\n let indexOffset: number = 0;\n for (const part of parts) {\n const data = part.data;\n const count: number = data.geometry.length / 2;\n this._geometry.set(data.geometry, vertexOffset * 2);\n this.normal.set(data.normal, vertexOffset * 2);\n this.uv.set(data.uv, vertexOffset * 2);\n this.vertexType.fill(part.vertexType, vertexOffset, vertexOffset + count);\n if (data.position !== undefined) this.position.set(data.position, vertexOffset * 2);\n if (data.miterScale !== undefined) this.miterScale.set(data.miterScale, vertexOffset);\n for (const index of data.index) {\n this.index[indexOffset] = index + vertexOffset;\n indexOffset += 1;\n }\n vertexOffset += count;\n }\n }\n\n /** 当前几何版本。 */\n public get version(): number { return this._version; }\n /** 通知 CPU 生成器及每个 Render 更新缓存。 */\n public updateVersion(): void {\n this._version++;\n for (const subscriber of [...this._subscribers]) subscriber.onGeometryChange(this);\n }\n /** 参数变化后延迟生成,一帧内多次改值只生成一次。 */\n public ensureGeometry(): this {\n if (this._disposed) throw new Error(\"Disposed geometry cannot be rendered.\");\n if (this._generatedVersion !== this._version) this.updateGeometry();\n return this;\n }\n /** 提交生成的数据;手动调用也会递增版本,通知每个 Render。 */\n public updateGeometry(): this {\n this.updateVersion();\n this._generatedVersion = this._version;\n return this;\n }\n}\nexport default Geo;\nexport type { BorderAlign, GeoBuffersLike, GeoData, GeoPartDataLike, GeometrySubscriber };\n"],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import Geo from "./Geo";
2
+ import type { GeoData } from "./Geo";
3
+ import type Style from "../Style";
4
+ interface Poly2DOptions {
5
+ /** 默认闭合;开放路径不能启用 style.solid.enabled。 */
6
+ closed?: boolean;
7
+ }
8
+ interface Poly2DLike extends GeoData {
9
+ points: Float32Array;
10
+ closed: boolean;
11
+ readonly width: number;
12
+ readonly height: number;
13
+ readonly perimeter: number;
14
+ }
15
+ /** 单轮廓多边形/开放折线,使用通用三角面填充和实体边框,不使用矩形 SDF。 */
16
+ declare class Poly2D extends Geo implements Poly2DLike {
17
+ /** 对象及管线选择类型。 */
18
+ readonly type: string;
19
+ private _points;
20
+ private _closed;
21
+ private _width;
22
+ private _height;
23
+ private _perimeter;
24
+ /**
25
+ * 创建多边形,不平移输入坐标。
26
+ * @param points 有序平面坐标 [x,y,...],默认空数组;点数不足暂不生成,输入会复制
27
+ * @param style 可省略或传 null,此时创建全部分区关闭的 Style
28
+ * @param options 可选闭合设置,默认 true;开放路径使用 closed:false
29
+ */
30
+ constructor(points?: Float32Array, style?: Style | null, options?: Poly2DOptions);
31
+ /** 当前自有节点数组;直接改元素后须调用 updateVersion() 或 updateGeometry()。 */
32
+ get points(): Float32Array<ArrayBuffer>;
33
+ /** @param value 新坐标,复制并触发下一帧重建 */
34
+ set points(value: Float32Array);
35
+ /** 是否连接末点和首点。 */
36
+ get closed(): boolean;
37
+ /** @param value 闭合开关;开放时需要关闭 solid */
38
+ set closed(value: boolean);
39
+ /** 当前轮廓包围盒宽度。 */
40
+ get width(): number;
41
+ /** 当前轮廓包围盒高度。 */
42
+ get height(): number;
43
+ /** 中心线长度;开放路径不计算末点到首点,圆接不增加原始路径长度。 */
44
+ get perimeter(): number;
45
+ /**
46
+ * 按当前 Style 全量生成填充、实体边框、辅助点和 line-list,并提交单一版本。
47
+ * join 只改变边框连接,solid 和辅助点仍使用原始节点。
48
+ * @returns 当前几何体
49
+ */
50
+ updateGeometry(): this;
51
+ }
52
+ export default Poly2D;
53
+ export type { Poly2DLike, Poly2DOptions };
@@ -0,0 +1,133 @@
1
+ import Geo from "./Geo.js";
2
+ import Poly from "bpmatrixjs/Geometry/Poly";
3
+ //#region src/scripts/Geometry/Poly2D.ts
4
+ /**
5
+ * 验证并复制 [x,y,x,y,...] 输入,防止调用方修改原数组后静默改变几何。
6
+ * @param points 有序单轮廓坐标,只接收 Float32Array
7
+ * @returns 自有数组
8
+ */
9
+ var CopyPoints = (points) => {
10
+ if (!(points instanceof Float32Array)) throw new TypeError("Poly2D points must be a Float32Array.");
11
+ if (points.length % 2 !== 0) throw new RangeError("Poly2D needs complete x/y pairs.");
12
+ for (const value of points) if (!Number.isFinite(value)) throw new RangeError("Poly2D coordinates must be finite.");
13
+ return new Float32Array(points);
14
+ };
15
+ /** 单轮廓多边形/开放折线,使用通用三角面填充和实体边框,不使用矩形 SDF。 */
16
+ var Poly2D = class extends Geo {
17
+ /** 对象及管线选择类型。 */
18
+ type = "Poly2D";
19
+ _points;
20
+ _closed;
21
+ _width = 0;
22
+ _height = 0;
23
+ _perimeter = 0;
24
+ /**
25
+ * 创建多边形,不平移输入坐标。
26
+ * @param points 有序平面坐标 [x,y,...],默认空数组;点数不足暂不生成,输入会复制
27
+ * @param style 可省略或传 null,此时创建全部分区关闭的 Style
28
+ * @param options 可选闭合设置,默认 true;开放路径使用 closed:false
29
+ */
30
+ constructor(points = /* @__PURE__ */ new Float32Array(0), style, options = {}) {
31
+ const copied = CopyPoints(points);
32
+ super(style ?? void 0);
33
+ this._points = copied;
34
+ this._closed = options.closed ?? true;
35
+ try {
36
+ this.updateGeometry();
37
+ } catch (error) {
38
+ this.dispose();
39
+ throw error;
40
+ }
41
+ }
42
+ /** 当前自有节点数组;直接改元素后须调用 updateVersion() 或 updateGeometry()。 */
43
+ get points() {
44
+ return this._points;
45
+ }
46
+ /** @param value 新坐标,复制并触发下一帧重建 */
47
+ set points(value) {
48
+ const copied = CopyPoints(value);
49
+ this._points = copied;
50
+ this.updateVersion();
51
+ }
52
+ /** 是否连接末点和首点。 */
53
+ get closed() {
54
+ return this._closed;
55
+ }
56
+ /** @param value 闭合开关;开放时需要关闭 solid */
57
+ set closed(value) {
58
+ if (this._closed === value) return;
59
+ if (!value && this.style.solid.enabled) throw new Error("Disable solid before opening Poly2D.");
60
+ this._closed = value;
61
+ this.updateVersion();
62
+ }
63
+ /** 当前轮廓包围盒宽度。 */
64
+ get width() {
65
+ this.ensureGeometry();
66
+ return this._width;
67
+ }
68
+ /** 当前轮廓包围盒高度。 */
69
+ get height() {
70
+ this.ensureGeometry();
71
+ return this._height;
72
+ }
73
+ /** 中心线长度;开放路径不计算末点到首点,圆接不增加原始路径长度。 */
74
+ get perimeter() {
75
+ this.ensureGeometry();
76
+ return this._perimeter;
77
+ }
78
+ /**
79
+ * 按当前 Style 全量生成填充、实体边框、辅助点和 line-list,并提交单一版本。
80
+ * join 只改变边框连接,solid 和辅助点仍使用原始节点。
81
+ * @returns 当前几何体
82
+ */
83
+ updateGeometry() {
84
+ const join = this.style.join;
85
+ const nodes = [];
86
+ for (let i = 0; i < this._points.length; i += 2) nodes.push({
87
+ x: this._points[i],
88
+ y: this._points[i + 1],
89
+ round: join.type !== "miter",
90
+ segments: join.type === "bevel" ? 1 : join.seg
91
+ });
92
+ const poly = new Poly(nodes, {
93
+ closed: this._closed,
94
+ solid: this.style.solid.enabled
95
+ });
96
+ const geometry = this.style.solid.enabled ? poly.data : void 0;
97
+ const line = this.style.wireframe.enabled ? poly.createLineGeometry() : void 0;
98
+ const edge = this.style.edge;
99
+ const border = edge.enabled && edge.width > 0 ? poly.createBorderGeometry(edge.width, edge.uvRepeat, edge.borderAlign) : void 0;
100
+ const point = this.style.points;
101
+ const points = point.enabled && (point.vertices || point.midpoints) ? poly.createPointGeometry(point.radius, point.segments, point.vertices, point.midpoints, point.minPointsLength, point.minEdgePointsLength) : void 0;
102
+ const parts = [];
103
+ if (geometry !== void 0) parts.push({
104
+ data: geometry,
105
+ vertexType: 0
106
+ });
107
+ if (border !== void 0) parts.push({
108
+ data: border,
109
+ vertexType: .5
110
+ });
111
+ if (points !== void 0) parts.push({
112
+ data: points,
113
+ vertexType: 1
114
+ });
115
+ this.mergeGeometry(parts);
116
+ this.linePoints = line;
117
+ this._width = poly.width;
118
+ this._height = poly.height;
119
+ this._perimeter = poly.getPerimeter();
120
+ this.uniformData.set([
121
+ poly.width,
122
+ poly.height,
123
+ 0,
124
+ edge.width
125
+ ]);
126
+ super.updateGeometry();
127
+ return this;
128
+ }
129
+ };
130
+ //#endregion
131
+ export { Poly2D as default };
132
+
133
+ //# sourceMappingURL=Poly2D.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Poly2D.js","names":[],"sources":["../../src/scripts/Geometry/Poly2D.ts"],"sourcesContent":["import Poly from \"bpmatrixjs/Geometry/Poly\";\nimport type { PolyNode } from \"bpmatrixjs/Geometry/Poly\";\nimport Geo from \"./Geo\";\nimport type { GeoData, GeoPartDataLike } from \"./Geo\";\nimport type Style from \"../Style\";\n\ninterface Poly2DOptions {\n /** 默认闭合;开放路径不能启用 style.solid.enabled。 */\n closed?: boolean;\n}\n\ninterface Poly2DLike extends GeoData {\n points: Float32Array;\n closed: boolean;\n readonly width: number;\n readonly height: number;\n readonly perimeter: number;\n}\n\n/**\n * 验证并复制 [x,y,x,y,...] 输入,防止调用方修改原数组后静默改变几何。\n * @param points 有序单轮廓坐标,只接收 Float32Array\n * @returns 自有数组\n */\nconst CopyPoints = (points: Float32Array): Float32Array<ArrayBuffer> => {\n if (!(points instanceof Float32Array)) throw new TypeError(\"Poly2D points must be a Float32Array.\");\n if (points.length % 2 !== 0) throw new RangeError(\"Poly2D needs complete x/y pairs.\");\n for (const value of points) if (!Number.isFinite(value)) throw new RangeError(\"Poly2D coordinates must be finite.\");\n return new Float32Array(points);\n};\n\n/** 单轮廓多边形/开放折线,使用通用三角面填充和实体边框,不使用矩形 SDF。 */\nclass Poly2D extends Geo implements Poly2DLike {\n /** 对象及管线选择类型。 */\n public readonly type: string = \"Poly2D\";\n private _points: Float32Array<ArrayBuffer>;\n private _closed: boolean;\n private _width: number = 0;\n private _height: number = 0;\n private _perimeter: number = 0;\n\n /**\n * 创建多边形,不平移输入坐标。\n * @param points 有序平面坐标 [x,y,...],默认空数组;点数不足暂不生成,输入会复制\n * @param style 可省略或传 null,此时创建全部分区关闭的 Style\n * @param options 可选闭合设置,默认 true;开放路径使用 closed:false\n */\n public constructor(points: Float32Array = new Float32Array(0), style?: Style | null, options: Poly2DOptions = {}) {\n const copied = CopyPoints(points);\n super(style ?? undefined);\n this._points = copied;\n this._closed = options.closed ?? true;\n try {\n this.updateGeometry();\n } catch (error) {\n this.dispose();\n throw error;\n }\n }\n\n /** 当前自有节点数组;直接改元素后须调用 updateVersion() 或 updateGeometry()。 */\n public get points(): Float32Array<ArrayBuffer> { return this._points; }\n /** @param value 新坐标,复制并触发下一帧重建 */\n public set points(value: Float32Array) {\n const copied = CopyPoints(value);\n this._points = copied;\n this.updateVersion();\n }\n /** 是否连接末点和首点。 */\n public get closed(): boolean { return this._closed; }\n /** @param value 闭合开关;开放时需要关闭 solid */\n public set closed(value: boolean) {\n if (this._closed === value) return;\n if (!value && this.style.solid.enabled) throw new Error(\"Disable solid before opening Poly2D.\");\n this._closed = value;\n this.updateVersion();\n }\n /** 当前轮廓包围盒宽度。 */\n public get width(): number { this.ensureGeometry(); return this._width; }\n /** 当前轮廓包围盒高度。 */\n public get height(): number { this.ensureGeometry(); return this._height; }\n /** 中心线长度;开放路径不计算末点到首点,圆接不增加原始路径长度。 */\n public get perimeter(): number { this.ensureGeometry(); return this._perimeter; }\n\n /**\n * 按当前 Style 全量生成填充、实体边框、辅助点和 line-list,并提交单一版本。\n * join 只改变边框连接,solid 和辅助点仍使用原始节点。\n * @returns 当前几何体\n */\n public updateGeometry(): this {\n const join = this.style.join;\n const nodes: PolyNode[] = [];\n for (let i = 0; i < this._points.length; i += 2) {\n nodes.push({ x: this._points[i], y: this._points[i + 1], round: join.type !== \"miter\", segments: join.type === \"bevel\" ? 1 : join.seg });\n }\n const poly = new Poly(nodes, { closed: this._closed, solid: this.style.solid.enabled });\n const geometry = this.style.solid.enabled ? poly.data : undefined;\n const line = this.style.wireframe.enabled ? poly.createLineGeometry() : undefined;\n const edge = this.style.edge;\n const border = edge.enabled && edge.width > 0 ? poly.createBorderGeometry(edge.width, edge.uvRepeat, edge.borderAlign) : undefined;\n const point = this.style.points;\n const points = point.enabled && (point.vertices || point.midpoints)\n ? poly.createPointGeometry(point.radius, point.segments, point.vertices, point.midpoints, point.minPointsLength, point.minEdgePointsLength)\n : undefined;\n const parts: { data: GeoPartDataLike; vertexType: number }[] = [];\n if (geometry !== undefined) parts.push({ data: geometry, vertexType: 0 });\n if (border !== undefined) parts.push({ data: border, vertexType: 0.5 });\n if (points !== undefined) parts.push({ data: points, vertexType: 1 });\n this.mergeGeometry(parts);\n this.linePoints = line;\n this._width = poly.width;\n this._height = poly.height;\n this._perimeter = poly.getPerimeter();\n // 沿用四个 f32 的几何 Uniform,第三项不用于多边形,UV 已由生成器给出。\n this.uniformData.set([poly.width, poly.height, 0, edge.width]);\n super.updateGeometry();\n return this;\n }\n}\n\nexport default Poly2D;\nexport type { Poly2DLike, Poly2DOptions };\n"],"mappings":";;;;;;;;AAwBA,IAAM,cAAc,WAAoD;CACpE,IAAI,EAAE,kBAAkB,eAAe,MAAM,IAAI,UAAU,uCAAuC;CAClG,IAAI,OAAO,SAAS,MAAM,GAAG,MAAM,IAAI,WAAW,kCAAkC;CACpF,KAAK,MAAM,SAAS,QAAQ,IAAI,CAAC,OAAO,SAAS,KAAK,GAAG,MAAM,IAAI,WAAW,oCAAoC;CAClH,OAAO,IAAI,aAAa,MAAM;AAClC;;AAGA,IAAM,SAAN,cAAqB,IAA0B;;CAE3C,OAA+B;CAC/B;CACA;CACA,SAAyB;CACzB,UAA0B;CAC1B,aAA6B;;;;;;;CAQ7B,YAAmB,yBAAuB,IAAI,aAAa,CAAC,GAAG,OAAsB,UAAyB,CAAC,GAAG;EAC9G,MAAM,SAAS,WAAW,MAAM;EAChC,MAAM,SAAS,KAAA,CAAS;EACxB,KAAK,UAAU;EACf,KAAK,UAAU,QAAQ,UAAU;EACjC,IAAI;GACA,KAAK,eAAe;EACxB,SAAS,OAAO;GACZ,KAAK,QAAQ;GACb,MAAM;EACV;CACJ;;CAGA,IAAW,SAAoC;EAAE,OAAO,KAAK;CAAS;;CAEtE,IAAW,OAAO,OAAqB;EACnC,MAAM,SAAS,WAAW,KAAK;EAC/B,KAAK,UAAU;EACf,KAAK,cAAc;CACvB;;CAEA,IAAW,SAAkB;EAAE,OAAO,KAAK;CAAS;;CAEpD,IAAW,OAAO,OAAgB;EAC9B,IAAI,KAAK,YAAY,OAAO;EAC5B,IAAI,CAAC,SAAS,KAAK,MAAM,MAAM,SAAS,MAAM,IAAI,MAAM,sCAAsC;EAC9F,KAAK,UAAU;EACf,KAAK,cAAc;CACvB;;CAEA,IAAW,QAAgB;EAAE,KAAK,eAAe;EAAG,OAAO,KAAK;CAAQ;;CAExE,IAAW,SAAiB;EAAE,KAAK,eAAe;EAAG,OAAO,KAAK;CAAS;;CAE1E,IAAW,YAAoB;EAAE,KAAK,eAAe;EAAG,OAAO,KAAK;CAAY;;;;;;CAOhF,iBAA8B;EAC1B,MAAM,OAAO,KAAK,MAAM;EACxB,MAAM,QAAoB,CAAC;EAC3B,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,QAAQ,KAAK,GAC1C,MAAM,KAAK;GAAE,GAAG,KAAK,QAAQ;GAAI,GAAG,KAAK,QAAQ,IAAI;GAAI,OAAO,KAAK,SAAS;GAAS,UAAU,KAAK,SAAS,UAAU,IAAI,KAAK;EAAI,CAAC;EAE3I,MAAM,OAAO,IAAI,KAAK,OAAO;GAAE,QAAQ,KAAK;GAAS,OAAO,KAAK,MAAM,MAAM;EAAQ,CAAC;EACtF,MAAM,WAAW,KAAK,MAAM,MAAM,UAAU,KAAK,OAAO,KAAA;EACxD,MAAM,OAAO,KAAK,MAAM,UAAU,UAAU,KAAK,mBAAmB,IAAI,KAAA;EACxE,MAAM,OAAO,KAAK,MAAM;EACxB,MAAM,SAAS,KAAK,WAAW,KAAK,QAAQ,IAAI,KAAK,qBAAqB,KAAK,OAAO,KAAK,UAAU,KAAK,WAAW,IAAI,KAAA;EACzH,MAAM,QAAQ,KAAK,MAAM;EACzB,MAAM,SAAS,MAAM,YAAY,MAAM,YAAY,MAAM,aACnD,KAAK,oBAAoB,MAAM,QAAQ,MAAM,UAAU,MAAM,UAAU,MAAM,WAAW,MAAM,iBAAiB,MAAM,mBAAmB,IACxI,KAAA;EACN,MAAM,QAAyD,CAAC;EAChE,IAAI,aAAa,KAAA,GAAW,MAAM,KAAK;GAAE,MAAM;GAAU,YAAY;EAAE,CAAC;EACxE,IAAI,WAAW,KAAA,GAAW,MAAM,KAAK;GAAE,MAAM;GAAQ,YAAY;EAAI,CAAC;EACtE,IAAI,WAAW,KAAA,GAAW,MAAM,KAAK;GAAE,MAAM;GAAQ,YAAY;EAAE,CAAC;EACpE,KAAK,cAAc,KAAK;EACxB,KAAK,aAAa;EAClB,KAAK,SAAS,KAAK;EACnB,KAAK,UAAU,KAAK;EACpB,KAAK,aAAa,KAAK,aAAa;EAEpC,KAAK,YAAY,IAAI;GAAC,KAAK;GAAO,KAAK;GAAQ;GAAG,KAAK;EAAK,CAAC;EAC7D,MAAM,eAAe;EACrB,OAAO;CACX;AACJ"}
@@ -0,0 +1,89 @@
1
+ import Geo from "./Geo";
2
+ import type Style from "../Style";
3
+ import type { GeoData } from "./Geo";
4
+ /**
5
+ * 矩形初始化选项;所有生成开关均默认关闭,辅助点型独立于面与边框。
6
+ */
7
+ interface Rect2dOptions {
8
+ /** 矩形宽度,默认 1,允许为 0。 */
9
+ width?: number;
10
+ /** 矩形高度,默认 1,允许为 0。 */
11
+ height?: number;
12
+ /** 圆角半径,默认 1,生成时限制到半宽和半高的较小值。 */
13
+ radius?: number;
14
+ /** 共享样式;未传入时全部生成分区关闭。 */
15
+ style?: Style;
16
+ }
17
+ interface Rect2dLike extends GeoData {
18
+ width: number;
19
+ height: number;
20
+ radius: number;
21
+ readonly perimeter: number;
22
+ }
23
+ declare class Rect2d extends Geo implements Rect2dLike {
24
+ /**
25
+ * 对象类型
26
+ */
27
+ readonly type: string;
28
+ /**
29
+ * 矩形宽度。
30
+ */
31
+ private _width;
32
+ /**
33
+ * 矩形高度。
34
+ */
35
+ private _height;
36
+ /**
37
+ * 矩形圆角半径。
38
+ */
39
+ private _radius;
40
+ /**
41
+ * 创建矩形几何体并生成首个 CPU 数据版本。
42
+ * @param options 宽高、圆角、几何生成开关与辅助点型参数
43
+ */
44
+ constructor(options?: Rect2dOptions);
45
+ /**
46
+ * 重新生成矩形三角面、UV、索引与 Shader 参数。
47
+ * 完成后提交 CPU 数据版本,通知所有 Render 更新缓存。
48
+ * @returns 当前矩形几何体
49
+ */
50
+ updateGeometry(): this;
51
+ /**
52
+ * 设置矩形宽度并递增几何体版本。
53
+ * @param width 矩形宽度
54
+ */
55
+ set width(width: number);
56
+ /**
57
+ * 获取矩形宽度。
58
+ * @returns 矩形宽度
59
+ */
60
+ get width(): number;
61
+ /**
62
+ * 设置矩形高度并递增几何体版本。
63
+ * @param height 矩形高度
64
+ */
65
+ set height(height: number);
66
+ /**
67
+ * 获取矩形高度。
68
+ * @returns 矩形高度
69
+ */
70
+ get height(): number;
71
+ /**
72
+ * 设置圆角半径并递增几何体版本。
73
+ * @param radius 圆角半径
74
+ */
75
+ set radius(radius: number);
76
+ /**
77
+ * 获取圆角半径。
78
+ * @returns 圆角半径
79
+ */
80
+ get radius(): number;
81
+ /**
82
+ * 获取矩形实际离散轮廓的只读周长。
83
+ * 结果使用与矩形几何体相同的圆角限制和分段规则。
84
+ * @returns 矩形轮廓周长
85
+ */
86
+ get perimeter(): number;
87
+ }
88
+ export default Rect2d;
89
+ export type { Rect2dLike, Rect2dOptions };
@@ -0,0 +1,128 @@
1
+ import Geo from "./Geo.js";
2
+ import { CreateRectBorderGeometry, CreateRectGeometry, CreateRectLineGeometry, CreateRectPointGeometry, GetRectPerimeter } from "bpmatrixjs/Geometry/Rect";
3
+ //#region src/scripts/Geometry/Rect2d.ts
4
+ var Rect2d = class extends Geo {
5
+ /**
6
+ * 对象类型
7
+ */
8
+ type = "Rect2d";
9
+ /**
10
+ * 矩形宽度。
11
+ */
12
+ _width;
13
+ /**
14
+ * 矩形高度。
15
+ */
16
+ _height;
17
+ /**
18
+ * 矩形圆角半径。
19
+ */
20
+ _radius;
21
+ /**
22
+ * 创建矩形几何体并生成首个 CPU 数据版本。
23
+ * @param options 宽高、圆角、几何生成开关与辅助点型参数
24
+ */
25
+ constructor(options = {}) {
26
+ super(options.style);
27
+ this._width = options.width ?? 1;
28
+ this._height = options.height ?? 1;
29
+ this._radius = options.radius ?? 1;
30
+ this.updateGeometry();
31
+ }
32
+ /**
33
+ * 重新生成矩形三角面、UV、索引与 Shader 参数。
34
+ * 完成后提交 CPU 数据版本,通知所有 Render 更新缓存。
35
+ * @returns 当前矩形几何体
36
+ */
37
+ updateGeometry() {
38
+ this._width = Number.isFinite(this._width) ? Math.max(0, this._width) : 0;
39
+ this._height = Number.isFinite(this._height) ? Math.max(0, this._height) : 0;
40
+ this._radius = Number.isFinite(this._radius) ? Math.max(0, Math.min(this._radius, this._width * .5, this._height * .5)) : 0;
41
+ const geometry = this.style.solid.enabled ? CreateRectGeometry(this._width, this._height, this._radius) : void 0;
42
+ this.linePoints = this.style.wireframe.enabled ? CreateRectLineGeometry(this._width, this._height, this._radius, 1) : void 0;
43
+ const border = this.style.edge.enabled && this.style.edge.width > 0 ? CreateRectBorderGeometry(this._width, this._height, this._radius, this.style.edge.width, this.style.edge.uvRepeat, this.style.edge.borderAlign) : void 0;
44
+ const points = this.style.points.enabled && (this.style.points.vertices || this.style.points.midpoints) ? CreateRectPointGeometry(this._width, this._height, this._radius, this.style.points.radius, this.style.points.segments, this.style.points.vertices, this.style.points.midpoints, this.style.points.minPointsLength, this.style.points.minEdgePointsLength) : void 0;
45
+ const parts = [];
46
+ if (geometry !== void 0) parts.push({
47
+ data: geometry,
48
+ vertexType: 0
49
+ });
50
+ if (border !== void 0) parts.push({
51
+ data: border,
52
+ vertexType: .5
53
+ });
54
+ if (points !== void 0) parts.push({
55
+ data: points,
56
+ vertexType: 1
57
+ });
58
+ this.mergeGeometry(parts);
59
+ this.uniformData.set([
60
+ this._width,
61
+ this._height,
62
+ this._radius,
63
+ this.style.edge.width
64
+ ]);
65
+ super.updateGeometry();
66
+ return this;
67
+ }
68
+ /**
69
+ * 设置矩形宽度并递增几何体版本。
70
+ * @param width 矩形宽度
71
+ */
72
+ set width(width) {
73
+ if (this._width === width) return;
74
+ this._width = width;
75
+ this.updateVersion();
76
+ }
77
+ /**
78
+ * 获取矩形宽度。
79
+ * @returns 矩形宽度
80
+ */
81
+ get width() {
82
+ return this._width;
83
+ }
84
+ /**
85
+ * 设置矩形高度并递增几何体版本。
86
+ * @param height 矩形高度
87
+ */
88
+ set height(height) {
89
+ if (this._height === height) return;
90
+ this._height = height;
91
+ this.updateVersion();
92
+ }
93
+ /**
94
+ * 获取矩形高度。
95
+ * @returns 矩形高度
96
+ */
97
+ get height() {
98
+ return this._height;
99
+ }
100
+ /**
101
+ * 设置圆角半径并递增几何体版本。
102
+ * @param radius 圆角半径
103
+ */
104
+ set radius(radius) {
105
+ if (this._radius === radius) return;
106
+ this._radius = radius;
107
+ this.updateVersion();
108
+ }
109
+ /**
110
+ * 获取圆角半径。
111
+ * @returns 圆角半径
112
+ */
113
+ get radius() {
114
+ return this._radius;
115
+ }
116
+ /**
117
+ * 获取矩形实际离散轮廓的只读周长。
118
+ * 结果使用与矩形几何体相同的圆角限制和分段规则。
119
+ * @returns 矩形轮廓周长
120
+ */
121
+ get perimeter() {
122
+ return GetRectPerimeter(this._width, this._height, this._radius);
123
+ }
124
+ };
125
+ //#endregion
126
+ export { Rect2d as default };
127
+
128
+ //# sourceMappingURL=Rect2d.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Rect2d.js","names":[],"sources":["../../src/scripts/Geometry/Rect2d.ts"],"sourcesContent":["\nimport {\n CreateRectBorderGeometry,\n CreateRectGeometry,\n CreateRectLineGeometry,\n CreateRectPointGeometry,\n GetRectPerimeter,\n} from \"bpmatrixjs/Geometry/Rect\";\nimport Geo from \"./Geo\";\nimport type Style from \"../Style\";\nimport type { GeoData, GeoPartDataLike } from \"./Geo\";\n\n/**\n * 矩形初始化选项;所有生成开关均默认关闭,辅助点型独立于面与边框。\n */\ninterface Rect2dOptions {\n /** 矩形宽度,默认 1,允许为 0。 */\n width?: number;\n /** 矩形高度,默认 1,允许为 0。 */\n height?: number;\n /** 圆角半径,默认 1,生成时限制到半宽和半高的较小值。 */\n radius?: number;\n /** 共享样式;未传入时全部生成分区关闭。 */\n style?: Style;\n}\n\ninterface Rect2dLike extends GeoData {\n width: number;\n height: number;\n radius: number;\n readonly perimeter: number;\n}\n\n\nclass Rect2d extends Geo implements Rect2dLike {\n /**\n * 对象类型\n */\n public readonly type: string = \"Rect2d\";\n\n /**\n * 矩形宽度。\n */\n private _width: number;\n\n /**\n * 矩形高度。\n */\n private _height: number;\n\n /**\n * 矩形圆角半径。\n */\n private _radius: number;\n\n /**\n * 创建矩形几何体并生成首个 CPU 数据版本。\n * @param options 宽高、圆角、几何生成开关与辅助点型参数\n */\n public constructor(options: Rect2dOptions = {}) {\n super(options.style);\n this._width = options.width ?? 1;\n this._height = options.height ?? 1;\n this._radius = options.radius ?? 1;\n this.updateGeometry();\n }\n\n /**\n * 重新生成矩形三角面、UV、索引与 Shader 参数。\n * 完成后提交 CPU 数据版本,通知所有 Render 更新缓存。\n * @returns 当前矩形几何体\n */\n public updateGeometry(): this {\n // 参数规范化不依赖填充面,边框独立生成时也使用相同的合法尺寸。\n this._width = Number.isFinite(this._width) ? Math.max(0, this._width) : 0;\n this._height = Number.isFinite(this._height) ? Math.max(0, this._height) : 0;\n this._radius = Number.isFinite(this._radius)\n ? Math.max(0, Math.min(this._radius, this._width * 0.5, this._height * 0.5))\n : 0;\n const geometry = this.style.solid.enabled\n ? CreateRectGeometry(this._width, this._height, this._radius)\n : undefined;\n\n this.linePoints = this.style.wireframe.enabled\n ? CreateRectLineGeometry(this._width, this._height, this._radius, 1)\n : undefined;\n const border = this.style.edge.enabled && this.style.edge.width > 0\n ? CreateRectBorderGeometry(\n this._width,\n this._height,\n this._radius,\n this.style.edge.width,\n this.style.edge.uvRepeat,\n this.style.edge.borderAlign,\n )\n : undefined;\n // 两个点位开关都关闭时不调用生成器,避免触发其参数校验。\n const points = this.style.points.enabled && (this.style.points.vertices || this.style.points.midpoints)\n ? CreateRectPointGeometry(\n this._width, this._height, this._radius,\n this.style.points.radius, this.style.points.segments,\n this.style.points.vertices, this.style.points.midpoints,\n this.style.points.minPointsLength, this.style.points.minEdgePointsLength,\n )\n : undefined;\n const parts: { data: GeoPartDataLike; vertexType: number }[] = [];\n if (geometry !== undefined) parts.push({ data: geometry, vertexType: 0 });\n if (border !== undefined) parts.push({ data: border, vertexType: 0.5 });\n if (points !== undefined) parts.push({ data: points, vertexType: 1 });\n this.mergeGeometry(parts);\n // Rect2d Shader 参数:宽度、高度、圆角半径、wide 三角面边框宽度。\n this.uniformData.set([this._width, this._height, this._radius, this.style.edge.width]);\n super.updateGeometry();\n return this;\n }\n\n /**\n * 设置矩形宽度并递增几何体版本。\n * @param width 矩形宽度\n */\n public set width(width: number) {\n if (this._width === width) {\n return;\n }\n\n this._width = width;\n this.updateVersion();\n }\n\n /**\n * 获取矩形宽度。\n * @returns 矩形宽度\n */\n public get width(): number {\n return this._width;\n }\n\n /**\n * 设置矩形高度并递增几何体版本。\n * @param height 矩形高度\n */\n public set height(height: number) {\n if (this._height === height) {\n return;\n }\n\n this._height = height;\n this.updateVersion();\n }\n\n /**\n * 获取矩形高度。\n * @returns 矩形高度\n */\n public get height(): number {\n return this._height;\n }\n\n /**\n * 设置圆角半径并递增几何体版本。\n * @param radius 圆角半径\n */\n public set radius(radius: number) {\n if (this._radius === radius) {\n return;\n }\n\n this._radius = radius;\n this.updateVersion();\n }\n\n /**\n * 获取圆角半径。\n * @returns 圆角半径\n */\n public get radius(): number {\n return this._radius;\n }\n\n /**\n * 获取矩形实际离散轮廓的只读周长。\n * 结果使用与矩形几何体相同的圆角限制和分段规则。\n * @returns 矩形轮廓周长\n */\n public get perimeter(): number {\n return GetRectPerimeter(this._width, this._height, this._radius);\n }\n}\nexport default Rect2d;\nexport type { Rect2dLike, Rect2dOptions };\n"],"mappings":";;;AAkCA,IAAM,SAAN,cAAqB,IAA0B;;;;CAI3C,OAA+B;;;;CAK/B;;;;CAKA;;;;CAKA;;;;;CAMA,YAAmB,UAAyB,CAAC,GAAG;EAC5C,MAAM,QAAQ,KAAK;EACnB,KAAK,SAAS,QAAQ,SAAS;EAC/B,KAAK,UAAU,QAAQ,UAAU;EACjC,KAAK,UAAU,QAAQ,UAAU;EACjC,KAAK,eAAe;CACxB;;;;;;CAOA,iBAA8B;EAE1B,KAAK,SAAS,OAAO,SAAS,KAAK,MAAM,IAAI,KAAK,IAAI,GAAG,KAAK,MAAM,IAAI;EACxE,KAAK,UAAU,OAAO,SAAS,KAAK,OAAO,IAAI,KAAK,IAAI,GAAG,KAAK,OAAO,IAAI;EAC3E,KAAK,UAAU,OAAO,SAAS,KAAK,OAAO,IACrC,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,SAAS,KAAK,SAAS,IAAK,KAAK,UAAU,EAAG,CAAC,IACzE;EACN,MAAM,WAAW,KAAK,MAAM,MAAM,UAC5B,mBAAmB,KAAK,QAAQ,KAAK,SAAS,KAAK,OAAO,IAC1D,KAAA;EAEN,KAAK,aAAa,KAAK,MAAM,UAAU,UACjC,uBAAuB,KAAK,QAAQ,KAAK,SAAS,KAAK,SAAS,CAAC,IACjE,KAAA;EACN,MAAM,SAAS,KAAK,MAAM,KAAK,WAAW,KAAK,MAAM,KAAK,QAAQ,IAC5D,yBACE,KAAK,QACL,KAAK,SACL,KAAK,SACL,KAAK,MAAM,KAAK,OAChB,KAAK,MAAM,KAAK,UAChB,KAAK,MAAM,KAAK,WACpB,IACE,KAAA;EAEN,MAAM,SAAS,KAAK,MAAM,OAAO,YAAY,KAAK,MAAM,OAAO,YAAY,KAAK,MAAM,OAAO,aACvF,wBACE,KAAK,QAAQ,KAAK,SAAS,KAAK,SAChC,KAAK,MAAM,OAAO,QAAQ,KAAK,MAAM,OAAO,UAC5C,KAAK,MAAM,OAAO,UAAU,KAAK,MAAM,OAAO,WAC9C,KAAK,MAAM,OAAO,iBAAiB,KAAK,MAAM,OAAO,mBACzD,IACE,KAAA;EACN,MAAM,QAAyD,CAAC;EAChE,IAAI,aAAa,KAAA,GAAW,MAAM,KAAK;GAAE,MAAM;GAAU,YAAY;EAAE,CAAC;EACxE,IAAI,WAAW,KAAA,GAAW,MAAM,KAAK;GAAE,MAAM;GAAQ,YAAY;EAAI,CAAC;EACtE,IAAI,WAAW,KAAA,GAAW,MAAM,KAAK;GAAE,MAAM;GAAQ,YAAY;EAAE,CAAC;EACpE,KAAK,cAAc,KAAK;EAExB,KAAK,YAAY,IAAI;GAAC,KAAK;GAAQ,KAAK;GAAS,KAAK;GAAS,KAAK,MAAM,KAAK;EAAK,CAAC;EACrF,MAAM,eAAe;EACrB,OAAO;CACX;;;;;CAMA,IAAW,MAAM,OAAe;EAC5B,IAAI,KAAK,WAAW,OAChB;EAGJ,KAAK,SAAS;EACd,KAAK,cAAc;CACvB;;;;;CAMA,IAAW,QAAgB;EACvB,OAAO,KAAK;CAChB;;;;;CAMA,IAAW,OAAO,QAAgB;EAC9B,IAAI,KAAK,YAAY,QACjB;EAGJ,KAAK,UAAU;EACf,KAAK,cAAc;CACvB;;;;;CAMA,IAAW,SAAiB;EACxB,OAAO,KAAK;CAChB;;;;;CAMA,IAAW,OAAO,QAAgB;EAC9B,IAAI,KAAK,YAAY,QACjB;EAGJ,KAAK,UAAU;EACf,KAAK,cAAc;CACvB;;;;;CAMA,IAAW,SAAiB;EACxB,OAAO,KAAK;CAChB;;;;;;CAOA,IAAW,YAAoB;EAC3B,OAAO,iBAAiB,KAAK,QAAQ,KAAK,SAAS,KAAK,OAAO;CACnE;AACJ"}
@@ -0,0 +1,6 @@
1
+ export { default as Geo } from "./Geo";
2
+ export { default as Rect2d } from "./Rect2d";
3
+ export { default as Poly2D } from "./Poly2D";
4
+ export type { Poly2DLike, Poly2DOptions } from "./Poly2D";
5
+ export type { BorderAlign, GeoBuffersLike, GeoData, GeoPartDataLike, GeometrySubscriber } from "./Geo";
6
+ export type { Rect2dLike, Rect2dOptions } from "./Rect2d";
@@ -0,0 +1,4 @@
1
+ import Geo from "./Geo.js";
2
+ import Rect2d from "./Rect2d.js";
3
+ import Poly2D from "./Poly2D.js";
4
+ export { Geo, Poly2D, Rect2d };