bg2e-js 2.3.11 → 2.3.13

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 (148) hide show
  1. package/dist/bg2e-js.js +356 -326
  2. package/dist/bg2e-js.js.map +1 -1
  3. package/package.json +56 -56
  4. package/src/app/AppController.ts +39 -39
  5. package/src/app/Bg2KeyboardEvent.ts +54 -54
  6. package/src/app/Bg2MouseEvent.ts +82 -82
  7. package/src/app/Bg2TouchEvent.ts +18 -18
  8. package/src/app/Canvas.ts +108 -108
  9. package/src/app/EventBase.ts +10 -10
  10. package/src/app/MainLoop.ts +273 -273
  11. package/src/app/index.ts +24 -24
  12. package/src/base/Color.ts +134 -134
  13. package/src/base/Environment.ts +183 -183
  14. package/src/base/Light.ts +192 -192
  15. package/src/base/Material.ts +620 -620
  16. package/src/base/PolyList.ts +365 -365
  17. package/src/base/Texture.ts +620 -620
  18. package/src/base/index.ts +81 -81
  19. package/src/db/Bg2LoaderPlugin.ts +143 -143
  20. package/src/db/DBPluginApi.ts +48 -48
  21. package/src/db/Loader.ts +116 -116
  22. package/src/db/LoaderPlugin.ts +34 -34
  23. package/src/db/MtlParser.ts +7 -7
  24. package/src/db/ObjLoaderPlugin.ts +54 -54
  25. package/src/db/ObjParser.ts +252 -252
  26. package/src/db/ObjWriterPlugin.ts +18 -18
  27. package/src/db/VitscnjLoaderPlugin.ts +112 -112
  28. package/src/db/Writer.ts +52 -52
  29. package/src/db/WriterPlugin.ts +22 -22
  30. package/src/db/index.ts +44 -44
  31. package/src/debug/DebugRenderer.ts +173 -173
  32. package/src/debug/WebGLTextureViewer.ts +75 -75
  33. package/src/debug/index.ts +6 -6
  34. package/src/index.html +11 -11
  35. package/src/index.ts +33 -33
  36. package/src/manipulation/SelectionBuffer.ts +81 -81
  37. package/src/manipulation/SelectionHighlight.ts +105 -84
  38. package/src/manipulation/SelectionIdAssignVisitor.ts +96 -96
  39. package/src/manipulation/SelectionManager.ts +196 -188
  40. package/src/manipulation/SelectionMode.ts +6 -6
  41. package/src/math/Mat3.ts +259 -259
  42. package/src/math/Mat4.ts +710 -710
  43. package/src/math/MatrixStrategy.ts +25 -25
  44. package/src/math/Quat.ts +65 -65
  45. package/src/math/Vec.ts +753 -753
  46. package/src/math/constants.ts +46 -46
  47. package/src/math/functions.ts +103 -103
  48. package/src/math/index.ts +74 -74
  49. package/src/phsics/joint.ts +137 -137
  50. package/src/primitives/arrow.ts +57 -57
  51. package/src/primitives/cone.ts +138 -138
  52. package/src/primitives/cube.ts +60 -60
  53. package/src/primitives/cylinder.ts +216 -216
  54. package/src/primitives/index.ts +13 -13
  55. package/src/primitives/plane.ts +31 -31
  56. package/src/primitives/sphere.ts +809 -809
  57. package/src/react/useBg2e.ts +69 -69
  58. package/src/render/BRDFIntegrationMap.ts +4 -4
  59. package/src/render/Environment.ts +135 -135
  60. package/src/render/FrameBuffer.ts +35 -35
  61. package/src/render/MaterialRenderer.ts +34 -34
  62. package/src/render/Pipeline.ts +108 -108
  63. package/src/render/PolyListRenderer.ts +47 -47
  64. package/src/render/RenderBuffer.ts +197 -197
  65. package/src/render/RenderQueue.ts +198 -198
  66. package/src/render/RenderState.ts +116 -116
  67. package/src/render/Renderer.ts +248 -248
  68. package/src/render/SceneAppController.ts +250 -250
  69. package/src/render/SceneRenderer.ts +387 -387
  70. package/src/render/Shader.ts +32 -32
  71. package/src/render/ShadowRenderer.ts +176 -176
  72. package/src/render/SkyCube.ts +105 -105
  73. package/src/render/SkySphere.ts +117 -117
  74. package/src/render/TextureMergerRenderer.ts +70 -70
  75. package/src/render/TextureRenderer.ts +34 -34
  76. package/src/render/index.ts +67 -67
  77. package/src/render/webgl/FrameBuffer.ts +9 -9
  78. package/src/render/webgl/MaterialRenderer.ts +112 -112
  79. package/src/render/webgl/Pipeline.ts +88 -88
  80. package/src/render/webgl/PolyListRenderer.ts +260 -260
  81. package/src/render/webgl/RenderBuffer.ts +226 -226
  82. package/src/render/webgl/Renderer.ts +262 -262
  83. package/src/render/webgl/SceneRenderer.ts +67 -67
  84. package/src/render/webgl/ShaderProgram.ts +424 -424
  85. package/src/render/webgl/ShadowRenderer.ts +6 -6
  86. package/src/render/webgl/SkyCube.ts +15 -15
  87. package/src/render/webgl/SkySphere.ts +15 -15
  88. package/src/render/webgl/State.ts +152 -152
  89. package/src/render/webgl/TextureRenderer.ts +167 -167
  90. package/src/render/webgl/VertexBuffer.ts +137 -137
  91. package/src/render/webgl/index.ts +35 -35
  92. package/src/scene/Camera.ts +458 -458
  93. package/src/scene/Chain.ts +44 -44
  94. package/src/scene/ChainJoint.ts +58 -58
  95. package/src/scene/Component.ts +177 -177
  96. package/src/scene/ComponentMap.ts +106 -106
  97. package/src/scene/Drawable.ts +154 -154
  98. package/src/scene/EnvironmentComponent.ts +141 -141
  99. package/src/scene/FindNodeVisitor.ts +59 -59
  100. package/src/scene/LightComponent.ts +154 -154
  101. package/src/scene/MatrixState.ts +46 -46
  102. package/src/scene/Node.ts +328 -328
  103. package/src/scene/NodeVisitor.ts +15 -15
  104. package/src/scene/OrbitCameraController.ts +450 -450
  105. package/src/scene/SmoothOrbitCameraController.ts +99 -99
  106. package/src/scene/Transform.ts +73 -73
  107. package/src/scene/index.ts +60 -60
  108. package/src/shaders/BasicDiffuseColorShader.ts +111 -111
  109. package/src/shaders/BasicPBRLightShader.ts +276 -276
  110. package/src/shaders/DebugRenderShader.ts +97 -97
  111. package/src/shaders/DepthRenderShader.ts +127 -127
  112. package/src/shaders/IrradianceMapCubeShader.ts +115 -115
  113. package/src/shaders/PBRLightIBLShader.ts +486 -486
  114. package/src/shaders/PickSelectionShader.ts +101 -101
  115. package/src/shaders/PresentDebugFramebufferShader.ts +118 -118
  116. package/src/shaders/PresentTextureShader.ts +99 -99
  117. package/src/shaders/SelectionHighlightShader.ts +143 -127
  118. package/src/shaders/ShaderFunction.ts +318 -318
  119. package/src/shaders/SkyCubeShader.ts +93 -93
  120. package/src/shaders/SkySphereShader.ts +102 -102
  121. package/src/shaders/SpecularMapCubeShader.ts +164 -164
  122. package/src/shaders/TextureMergerShader.ts +171 -171
  123. package/src/shaders/index.ts +36 -36
  124. package/src/shaders/webgl/color_correction.glsl +47 -47
  125. package/src/shaders/webgl/constants.glsl +6 -6
  126. package/src/shaders/webgl/index.ts +70 -70
  127. package/src/shaders/webgl/normal_map.glsl +9 -9
  128. package/src/shaders/webgl/pbr.glsl +173 -173
  129. package/src/shaders/webgl/uniforms.glsl +91 -91
  130. package/src/shaders/webgl_shader_lib.ts +213 -213
  131. package/src/tools/BinaryResourceProvider.ts +14 -14
  132. package/src/tools/ImageResourceProvider.ts +66 -66
  133. package/src/tools/MaterialModifier.ts +446 -446
  134. package/src/tools/Resource.ts +203 -203
  135. package/src/tools/ResourceProvider.ts +69 -69
  136. package/src/tools/TextResourceProvider.ts +24 -24
  137. package/src/tools/TextureCache.ts +51 -51
  138. package/src/tools/TextureResourceDatabase.ts +100 -100
  139. package/src/tools/UserAgent.ts +362 -362
  140. package/src/tools/VideoResourceProvider.ts +50 -50
  141. package/src/tools/WriteStrategy.ts +22 -22
  142. package/src/tools/base64.ts +11 -11
  143. package/src/tools/crypto.ts +19 -19
  144. package/src/tools/endiantess.ts +13 -13
  145. package/src/tools/image.ts +18 -18
  146. package/src/tools/index.ts +41 -41
  147. package/src/tools/processType.ts +39 -39
  148. package/src/vite-env.d.ts +12 -12
@@ -1,365 +1,365 @@
1
- import Vec from "../math/Vec";
2
- import Mat4 from "../math/Mat4";
3
- import Color from "./Color";
4
- import Material from "./Material";
5
-
6
-
7
- export enum BufferType {
8
- VERTEX = 1 << 0,
9
- NORMAL = 1 << 1,
10
- TEX_COORD_0 = 1 << 2,
11
- TEX_COORD_1 = 1 << 3,
12
- TEX_COORD_2 = 1 << 4,
13
- COLOR = 1 << 5,
14
- TANGENT = 1 << 6,
15
- INDEX = 1 << 7
16
- }
17
-
18
- export enum DrawMode {
19
- POINTS = 0,
20
- TRIANGLES = 1,
21
- TRIANGLE_FAN = 2,
22
- TRIANGLE_STRIP = 3,
23
- LINES = 4,
24
- LINE_STRIP = 5
25
- }
26
-
27
- export enum RenderLayer {
28
- LAYER_0 = 0x1 << 0,
29
- OPAQUE_DEFAULT = 0x1 << 0, // layer 0 is the default layer for opaque objects
30
- LAYER_1 = 0x1 << 1,
31
- LAYER_2 = 0x1 << 2,
32
- LAYER_3 = 0x1 << 3,
33
- LAYER_4 = 0x1 << 4,
34
- LAYER_5 = 0x1 << 5,
35
- LAYER_6 = 0x1 << 6,
36
- LAYER_7 = 0x1 << 7,
37
- LAYER_8 = 0x1 << 8,
38
- LAYER_9 = 0x1 << 9,
39
- LAYER_10 = 0x1 << 10,
40
- LAYER_11 = 0x1 << 11,
41
- LAYER_12 = 0x1 << 12,
42
- LAYER_13 = 0x1 << 13,
43
- LAYER_14 = 0x1 << 14,
44
- LAYER_15 = 0x1 << 15,
45
- TRANSPARENT_DEFAULT = 0x1 << 15, // Layer 15 is the default layer for transparent objects
46
- LAYER_16 = 0x1 << 16,
47
- LAYER_17 = 0x1 << 17,
48
- LAYER_18 = 0x1 << 18,
49
- LAYER_19 = 0x1 << 19,
50
- LAYER_20 = 0x1 << 20,
51
- LAYER_21 = 0x1 << 21,
52
- LAYER_22 = 0x1 << 22,
53
- LAYER_23 = 0x1 << 23,
54
- LAYER_24 = 0x1 << 24,
55
- LAYER_25 = 0x1 << 25,
56
- LAYER_26 = 0x1 << 26,
57
- LAYER_27 = 0x1 << 27,
58
- LAYER_28 = 0x1 << 28,
59
- LAYER_29 = 0x1 << 29,
60
- LAYER_30 = 0x1 << 30,
61
- LAYER_31 = 0x1 << 31,
62
- SELECTION_DEFAULT = 0x1 << 31, // Layer 31 is the default layer for mouse pick selection
63
-
64
- ALL = 0xFFFFFFFF,
65
-
66
- AUTO = 0
67
- }
68
-
69
- // Process the default layer if RenderLayer is set to AUTO. To do it, you need
70
- // the object material to know if the layer must be set to transparent or opaque
71
- export const getLayers = (polyList: PolyList, material: Material): number => {
72
- return polyList.renderLayers === RenderLayer.AUTO ?
73
- (material.isTransparent ? RenderLayer.TRANSPARENT_DEFAULT : RenderLayer.OPAQUE_DEFAULT) | RenderLayer.SELECTION_DEFAULT :
74
- (polyList.renderLayers);
75
- }
76
-
77
- export enum PolyListFrontFace {
78
- CW = 0,
79
- CCW = 1
80
- }
81
-
82
- export enum PolyListCullFace {
83
- FRONT = 0,
84
- BACK = 1,
85
- FRONT_AND_BACK = 2
86
- }
87
-
88
- interface Vertex {
89
- pos: Vec;
90
- uv: Vec;
91
- }
92
-
93
- function buildTangents(plist: PolyList): void {
94
- const result: number[] = [];
95
-
96
- const createVertex = (index: number): Vertex => {
97
- return {
98
- pos: new Vec(plist.vertex[index] * 3, plist.vertex[index + 1] * 3, plist.vertex[index + 2] * 3 ),
99
- uv: new Vec(plist.texCoord0[index] * 2, plist.texCoord0[index + 1] * 2 )
100
- }
101
- }
102
-
103
- const createUV = (v1: Vertex, v2: Vertex): Vec => Vec.Sub(v1.uv, v2.uv);
104
-
105
- const calcR = (uv1: Vec, uv2: Vec): number => 1.0 / (uv1.x * uv2.y - uv1.y * uv2.x);
106
-
107
- if (plist.index.length % 3 === 0) {
108
- for (let i = 0; i < plist.index.length - 2; i += 3) {
109
- let v0 = createVertex(plist.index[i]);
110
- let v1 = createVertex(plist.index[i + 1]);
111
- let v2 = createVertex(plist.index[i + 2]);
112
-
113
- let edge1 = Vec.Sub(v1.pos, v0.pos);
114
- let edge2 = Vec.Sub(v2.pos, v1.pos);
115
-
116
- let uv1 = createUV(v1, v0);
117
- let uv2 = createUV(v2, v0);
118
- let r = calcR(uv1, uv2);
119
-
120
- if (!isFinite(r)) {
121
- v0.uv.x = v0.uv.x * 1.1;
122
- v0.uv.y = v0.uv.y * 0.94;
123
- uv1 = createUV(v1, v0);
124
- uv2 = createUV(v2, v0);
125
- r = calcR(uv1, uv2);
126
- }
127
-
128
- if (!isFinite(r)) {
129
- v2.uv.x = v2.uv.x * 1.3;
130
- v2.uv.y = v2.uv.y * 1.82;
131
- uv1 = createUV(v1, v0);
132
- uv2 = createUV(v2, v0);
133
- r = calcR(uv1, uv2);
134
- }
135
-
136
- const tangent = new Vec(
137
- ((edge1.x * uv2.y) - (edge2.x * uv1.y)) * r,
138
- ((edge1.y * uv2.y) - (edge2.y * uv1.y)) * r,
139
- ((edge1.z * uv2.y) - (edge2.z * uv1.y)) * r
140
- );
141
- tangent.normalize();
142
-
143
- result.push(tangent.x);
144
- result.push(tangent.y);
145
- result.push(tangent.z);
146
-
147
- result.push(tangent.x);
148
- result.push(tangent.y);
149
- result.push(tangent.z);
150
-
151
- result.push(tangent.x);
152
- result.push(tangent.y);
153
- result.push(tangent.z);
154
- }
155
- }
156
- else {
157
- for (let i=0; i<plist.vertex.length; i+=3) {
158
- result.push(0,0,1);
159
- }
160
-
161
- console.warn("Could not generate tangents: invalid type of faces found.");
162
- }
163
-
164
- (plist as any)._tangent = result;
165
- }
166
-
167
- export default class PolyList {
168
- private _renderLayers: number;
169
- private _drawMode: DrawMode;
170
- private _lineWidth: number;
171
- private _name: string;
172
- private _groupName: string;
173
- private _visible: boolean;
174
- private _visibleToShadows: boolean;
175
- private _cullFace: PolyListCullFace;
176
- private _frontFace: PolyListFrontFace;
177
- private _enableCullFace: boolean;
178
- private _vertex: number[];
179
- private _normal: number[];
180
- private _texCoord0: number[];
181
- private _texCoord1: number[];
182
- private _texCoord2: number[];
183
- private _color: number[];
184
- private _index: number[];
185
- private _tangent?: number[];
186
- private _colorCode: Color;
187
- private _selected: boolean;
188
- private _selectable: boolean;
189
- private _renderer?: any;
190
-
191
- constructor() {
192
- // The object will be rendered in the default layer for
193
- // transparent or opaque objects
194
- this._renderLayers = RenderLayer.AUTO;
195
-
196
- this._drawMode = DrawMode.TRIANGLES;
197
- this._lineWidth = 1.0;
198
-
199
- this._name = "";
200
- this._groupName = "";
201
- this._visible = true;
202
- this._visibleToShadows = true;
203
-
204
- this._cullFace = PolyListCullFace.BACK;
205
- this._frontFace = PolyListFrontFace.CCW;
206
- this._enableCullFace = true;
207
-
208
- this._vertex = [];
209
- this._normal = [];
210
- this._texCoord0 = [];
211
- this._texCoord1 = [];
212
- this._texCoord2 = [];
213
- this._color = [];
214
- this._index = [];
215
-
216
- // Internal use: the following properties will not be serialized
217
- this._colorCode = Color.Black();
218
- this._selected = false;
219
- this._selectable = true;
220
- }
221
-
222
- clone(): PolyList {
223
- const result = new PolyList();
224
- result.assign(this);
225
- result.name = this.name + " clone";
226
- return result;
227
- }
228
-
229
- assign(other: PolyList): void {
230
- this.drawMode = other.drawMode;
231
- this.lineWidth = other.lineWidth;
232
- this.name = other.name;
233
- this.groupName = other.groupName;
234
- this.visible = other.visible;
235
- this.visibleToShadows = other.visibleToShadows;
236
- this.vertex = [...other.vertex];
237
- this.normal = [...other.normal];
238
- this.texCoord0 = [...other.texCoord0];
239
- this.texCoord1 = [...other.texCoord1];
240
- this.texCoord2 = [...other.texCoord2];
241
- this.color = [...other.color];
242
- this.index = [...other.index];
243
- this.rebuildTangents();
244
- }
245
-
246
- // render layers aren't serialized/deserialized, they are used only by the graphics engine
247
- get renderLayers(): number { return this._renderLayers; }
248
- set renderLayers(layers: number) { this._renderLayers = layers; }
249
- enableLayer(layer: number): void { this._renderLayers = this._renderLayers | layer; }
250
- disableLayer(layer: number): void { this._renderLayers = this._renderLayers & ~layer; }
251
-
252
- set cullFace(v: PolyListCullFace) { this._cullFace = v; }
253
- get cullFace(): PolyListCullFace { return this._cullFace; }
254
- set frontFace(v: PolyListFrontFace) { this._frontFace = v; }
255
- get frontFace(): PolyListFrontFace { return this._frontFace; }
256
- set enableCullFace(v: boolean) { this._enableCullFace = v; }
257
- get enableCullFace(): boolean { return this._enableCullFace; }
258
-
259
- get drawMode(): DrawMode { return this._drawMode; }
260
- set drawMode(m: DrawMode) { this._drawMode = m; }
261
- get lineWidth(): number { return this._lineWidth; }
262
- set lineWidth(w: number) { this._lineWidth = w; }
263
-
264
- get name(): string { return this._name; }
265
- set name(v: string) { this._name = v; }
266
- get groupName(): string { return this._groupName; }
267
- set groupName(v: string) { this._groupName = v; }
268
- get visible(): boolean { return this._visible; }
269
- set visible(v: boolean) { this._visible = v; }
270
- get visibleToShadows(): boolean { return this._visibleToShadows; }
271
- set visibleToShadows(v: boolean) { this._visibleToShadows = v; }
272
-
273
- get vertex(): number[] { return this._vertex; }
274
- set vertex(v: number[]) { this._vertex = v; }
275
- get normal(): number[] { return this._normal; }
276
- set normal(v: number[]) { this._normal = v; }
277
- get texCoord0(): number[] { return this._texCoord0; }
278
- set texCoord0(v: number[]) { this._texCoord0 = v; }
279
- get texCoord1(): number[] { return this._texCoord1; }
280
- set texCoord1(v: number[]) { this._texCoord1 = v; }
281
- get texCoord2(): number[] { return this._texCoord2; }
282
- set texCoord2(v: number[]) { this._texCoord2 = v; }
283
- get color(): number[] { return this._color; }
284
- set color(v: number[]) { this._color = v; }
285
- get index(): number[] { return this._index; }
286
- set index(v: number[]) { this._index = v; }
287
-
288
- // Internal use: non serializable properties
289
- set colorCode(c: Color) {
290
- this._colorCode = c;
291
- }
292
-
293
- get colorCode(): Color {
294
- return this._colorCode;
295
- }
296
-
297
- set selected(s: boolean) {
298
- this._selected = s;
299
- }
300
-
301
- get isSelected(): boolean {
302
- return this._selected;
303
- }
304
-
305
- get isSelectable(): boolean {
306
- return this._selectable;
307
- }
308
-
309
- set selectable(s: boolean) {
310
- this._selectable = s;
311
- }
312
-
313
- // The this._renderer variable is initialized by the polyListRenderer factory
314
- get renderer(): any {
315
- return this._renderer
316
- }
317
-
318
- rebuildTangents(): void {
319
- buildTangents(this);
320
- }
321
-
322
- get tangent(): number[] | undefined {
323
- if (!this.validTangents) {
324
- buildTangents(this);
325
- }
326
- return this._tangent;
327
- }
328
-
329
- get validTangents(): boolean {
330
- return this._tangent !== undefined &&
331
- this._tangent.length === this._vertex.length &&
332
- this._tangent.length / 3 === this._texCoord0.length / 2;
333
- }
334
-
335
- destroy(): void {
336
- if (this.renderer) {
337
- this.renderer.destroy();
338
- }
339
- }
340
-
341
- static ApplyTransform(plist: PolyList, trx: Mat4): void {
342
- const transform = new Mat4(trx);
343
- const rotation = new Mat4(trx.mat3);
344
-
345
- if (plist.normal.length > 0 && plist.normal.length != plist.vertex.length) {
346
- throw new Error(`Unexpected number of normal coordinates found in polyList '${ plist.name }'`);
347
- }
348
-
349
- for (let i = 0; i < plist.vertex.length - 2; i += 3) {
350
- let vertex = new Vec(plist.vertex[i], plist.vertex[i+1], plist.vertex[i+2], 1.0);
351
- vertex = transform.multVector(vertex);
352
- plist.vertex[i] = vertex.x;
353
- plist.vertex[i + 1] = vertex.y;
354
- plist.vertex[i + 2] = vertex.z;
355
-
356
- if (plist.normal.length) {
357
- let normal = new Vec(plist.normal[i], plist.normal[i+1], plist.normal[i+2], 1.0);
358
- normal = rotation.multVector(normal);
359
- plist.normal[i] = normal.x;
360
- plist.normal[i + 1] = normal.y;
361
- plist.normal[i + 2] = normal.z;
362
- }
363
- }
364
- }
365
- }
1
+ import Vec from "../math/Vec";
2
+ import Mat4 from "../math/Mat4";
3
+ import Color from "./Color";
4
+ import Material from "./Material";
5
+
6
+
7
+ export enum BufferType {
8
+ VERTEX = 1 << 0,
9
+ NORMAL = 1 << 1,
10
+ TEX_COORD_0 = 1 << 2,
11
+ TEX_COORD_1 = 1 << 3,
12
+ TEX_COORD_2 = 1 << 4,
13
+ COLOR = 1 << 5,
14
+ TANGENT = 1 << 6,
15
+ INDEX = 1 << 7
16
+ }
17
+
18
+ export enum DrawMode {
19
+ POINTS = 0,
20
+ TRIANGLES = 1,
21
+ TRIANGLE_FAN = 2,
22
+ TRIANGLE_STRIP = 3,
23
+ LINES = 4,
24
+ LINE_STRIP = 5
25
+ }
26
+
27
+ export enum RenderLayer {
28
+ LAYER_0 = 0x1 << 0,
29
+ OPAQUE_DEFAULT = 0x1 << 0, // layer 0 is the default layer for opaque objects
30
+ LAYER_1 = 0x1 << 1,
31
+ LAYER_2 = 0x1 << 2,
32
+ LAYER_3 = 0x1 << 3,
33
+ LAYER_4 = 0x1 << 4,
34
+ LAYER_5 = 0x1 << 5,
35
+ LAYER_6 = 0x1 << 6,
36
+ LAYER_7 = 0x1 << 7,
37
+ LAYER_8 = 0x1 << 8,
38
+ LAYER_9 = 0x1 << 9,
39
+ LAYER_10 = 0x1 << 10,
40
+ LAYER_11 = 0x1 << 11,
41
+ LAYER_12 = 0x1 << 12,
42
+ LAYER_13 = 0x1 << 13,
43
+ LAYER_14 = 0x1 << 14,
44
+ LAYER_15 = 0x1 << 15,
45
+ TRANSPARENT_DEFAULT = 0x1 << 15, // Layer 15 is the default layer for transparent objects
46
+ LAYER_16 = 0x1 << 16,
47
+ LAYER_17 = 0x1 << 17,
48
+ LAYER_18 = 0x1 << 18,
49
+ LAYER_19 = 0x1 << 19,
50
+ LAYER_20 = 0x1 << 20,
51
+ LAYER_21 = 0x1 << 21,
52
+ LAYER_22 = 0x1 << 22,
53
+ LAYER_23 = 0x1 << 23,
54
+ LAYER_24 = 0x1 << 24,
55
+ LAYER_25 = 0x1 << 25,
56
+ LAYER_26 = 0x1 << 26,
57
+ LAYER_27 = 0x1 << 27,
58
+ LAYER_28 = 0x1 << 28,
59
+ LAYER_29 = 0x1 << 29,
60
+ LAYER_30 = 0x1 << 30,
61
+ LAYER_31 = 0x1 << 31,
62
+ SELECTION_DEFAULT = 0x1 << 31, // Layer 31 is the default layer for mouse pick selection
63
+
64
+ ALL = 0xFFFFFFFF,
65
+
66
+ AUTO = 0
67
+ }
68
+
69
+ // Process the default layer if RenderLayer is set to AUTO. To do it, you need
70
+ // the object material to know if the layer must be set to transparent or opaque
71
+ export const getLayers = (polyList: PolyList, material: Material): number => {
72
+ return polyList.renderLayers === RenderLayer.AUTO ?
73
+ (material.isTransparent ? RenderLayer.TRANSPARENT_DEFAULT : RenderLayer.OPAQUE_DEFAULT) | RenderLayer.SELECTION_DEFAULT :
74
+ (polyList.renderLayers);
75
+ }
76
+
77
+ export enum PolyListFrontFace {
78
+ CW = 0,
79
+ CCW = 1
80
+ }
81
+
82
+ export enum PolyListCullFace {
83
+ FRONT = 0,
84
+ BACK = 1,
85
+ FRONT_AND_BACK = 2
86
+ }
87
+
88
+ interface Vertex {
89
+ pos: Vec;
90
+ uv: Vec;
91
+ }
92
+
93
+ function buildTangents(plist: PolyList): void {
94
+ const result: number[] = [];
95
+
96
+ const createVertex = (index: number): Vertex => {
97
+ return {
98
+ pos: new Vec(plist.vertex[index] * 3, plist.vertex[index + 1] * 3, plist.vertex[index + 2] * 3 ),
99
+ uv: new Vec(plist.texCoord0[index] * 2, plist.texCoord0[index + 1] * 2 )
100
+ }
101
+ }
102
+
103
+ const createUV = (v1: Vertex, v2: Vertex): Vec => Vec.Sub(v1.uv, v2.uv);
104
+
105
+ const calcR = (uv1: Vec, uv2: Vec): number => 1.0 / (uv1.x * uv2.y - uv1.y * uv2.x);
106
+
107
+ if (plist.index.length % 3 === 0) {
108
+ for (let i = 0; i < plist.index.length - 2; i += 3) {
109
+ let v0 = createVertex(plist.index[i]);
110
+ let v1 = createVertex(plist.index[i + 1]);
111
+ let v2 = createVertex(plist.index[i + 2]);
112
+
113
+ let edge1 = Vec.Sub(v1.pos, v0.pos);
114
+ let edge2 = Vec.Sub(v2.pos, v1.pos);
115
+
116
+ let uv1 = createUV(v1, v0);
117
+ let uv2 = createUV(v2, v0);
118
+ let r = calcR(uv1, uv2);
119
+
120
+ if (!isFinite(r)) {
121
+ v0.uv.x = v0.uv.x * 1.1;
122
+ v0.uv.y = v0.uv.y * 0.94;
123
+ uv1 = createUV(v1, v0);
124
+ uv2 = createUV(v2, v0);
125
+ r = calcR(uv1, uv2);
126
+ }
127
+
128
+ if (!isFinite(r)) {
129
+ v2.uv.x = v2.uv.x * 1.3;
130
+ v2.uv.y = v2.uv.y * 1.82;
131
+ uv1 = createUV(v1, v0);
132
+ uv2 = createUV(v2, v0);
133
+ r = calcR(uv1, uv2);
134
+ }
135
+
136
+ const tangent = new Vec(
137
+ ((edge1.x * uv2.y) - (edge2.x * uv1.y)) * r,
138
+ ((edge1.y * uv2.y) - (edge2.y * uv1.y)) * r,
139
+ ((edge1.z * uv2.y) - (edge2.z * uv1.y)) * r
140
+ );
141
+ tangent.normalize();
142
+
143
+ result.push(tangent.x);
144
+ result.push(tangent.y);
145
+ result.push(tangent.z);
146
+
147
+ result.push(tangent.x);
148
+ result.push(tangent.y);
149
+ result.push(tangent.z);
150
+
151
+ result.push(tangent.x);
152
+ result.push(tangent.y);
153
+ result.push(tangent.z);
154
+ }
155
+ }
156
+ else {
157
+ for (let i=0; i<plist.vertex.length; i+=3) {
158
+ result.push(0,0,1);
159
+ }
160
+
161
+ console.warn("Could not generate tangents: invalid type of faces found.");
162
+ }
163
+
164
+ (plist as any)._tangent = result;
165
+ }
166
+
167
+ export default class PolyList {
168
+ private _renderLayers: number;
169
+ private _drawMode: DrawMode;
170
+ private _lineWidth: number;
171
+ private _name: string;
172
+ private _groupName: string;
173
+ private _visible: boolean;
174
+ private _visibleToShadows: boolean;
175
+ private _cullFace: PolyListCullFace;
176
+ private _frontFace: PolyListFrontFace;
177
+ private _enableCullFace: boolean;
178
+ private _vertex: number[];
179
+ private _normal: number[];
180
+ private _texCoord0: number[];
181
+ private _texCoord1: number[];
182
+ private _texCoord2: number[];
183
+ private _color: number[];
184
+ private _index: number[];
185
+ private _tangent?: number[];
186
+ private _colorCode: Color;
187
+ private _selected: boolean;
188
+ private _selectable: boolean;
189
+ private _renderer?: any;
190
+
191
+ constructor() {
192
+ // The object will be rendered in the default layer for
193
+ // transparent or opaque objects
194
+ this._renderLayers = RenderLayer.AUTO;
195
+
196
+ this._drawMode = DrawMode.TRIANGLES;
197
+ this._lineWidth = 1.0;
198
+
199
+ this._name = "";
200
+ this._groupName = "";
201
+ this._visible = true;
202
+ this._visibleToShadows = true;
203
+
204
+ this._cullFace = PolyListCullFace.BACK;
205
+ this._frontFace = PolyListFrontFace.CCW;
206
+ this._enableCullFace = true;
207
+
208
+ this._vertex = [];
209
+ this._normal = [];
210
+ this._texCoord0 = [];
211
+ this._texCoord1 = [];
212
+ this._texCoord2 = [];
213
+ this._color = [];
214
+ this._index = [];
215
+
216
+ // Internal use: the following properties will not be serialized
217
+ this._colorCode = Color.Black();
218
+ this._selected = false;
219
+ this._selectable = true;
220
+ }
221
+
222
+ clone(): PolyList {
223
+ const result = new PolyList();
224
+ result.assign(this);
225
+ result.name = this.name + " clone";
226
+ return result;
227
+ }
228
+
229
+ assign(other: PolyList): void {
230
+ this.drawMode = other.drawMode;
231
+ this.lineWidth = other.lineWidth;
232
+ this.name = other.name;
233
+ this.groupName = other.groupName;
234
+ this.visible = other.visible;
235
+ this.visibleToShadows = other.visibleToShadows;
236
+ this.vertex = [...other.vertex];
237
+ this.normal = [...other.normal];
238
+ this.texCoord0 = [...other.texCoord0];
239
+ this.texCoord1 = [...other.texCoord1];
240
+ this.texCoord2 = [...other.texCoord2];
241
+ this.color = [...other.color];
242
+ this.index = [...other.index];
243
+ this.rebuildTangents();
244
+ }
245
+
246
+ // render layers aren't serialized/deserialized, they are used only by the graphics engine
247
+ get renderLayers(): number { return this._renderLayers; }
248
+ set renderLayers(layers: number) { this._renderLayers = layers; }
249
+ enableLayer(layer: number): void { this._renderLayers = this._renderLayers | layer; }
250
+ disableLayer(layer: number): void { this._renderLayers = this._renderLayers & ~layer; }
251
+
252
+ set cullFace(v: PolyListCullFace) { this._cullFace = v; }
253
+ get cullFace(): PolyListCullFace { return this._cullFace; }
254
+ set frontFace(v: PolyListFrontFace) { this._frontFace = v; }
255
+ get frontFace(): PolyListFrontFace { return this._frontFace; }
256
+ set enableCullFace(v: boolean) { this._enableCullFace = v; }
257
+ get enableCullFace(): boolean { return this._enableCullFace; }
258
+
259
+ get drawMode(): DrawMode { return this._drawMode; }
260
+ set drawMode(m: DrawMode) { this._drawMode = m; }
261
+ get lineWidth(): number { return this._lineWidth; }
262
+ set lineWidth(w: number) { this._lineWidth = w; }
263
+
264
+ get name(): string { return this._name; }
265
+ set name(v: string) { this._name = v; }
266
+ get groupName(): string { return this._groupName; }
267
+ set groupName(v: string) { this._groupName = v; }
268
+ get visible(): boolean { return this._visible; }
269
+ set visible(v: boolean) { this._visible = v; }
270
+ get visibleToShadows(): boolean { return this._visibleToShadows; }
271
+ set visibleToShadows(v: boolean) { this._visibleToShadows = v; }
272
+
273
+ get vertex(): number[] { return this._vertex; }
274
+ set vertex(v: number[]) { this._vertex = v; }
275
+ get normal(): number[] { return this._normal; }
276
+ set normal(v: number[]) { this._normal = v; }
277
+ get texCoord0(): number[] { return this._texCoord0; }
278
+ set texCoord0(v: number[]) { this._texCoord0 = v; }
279
+ get texCoord1(): number[] { return this._texCoord1; }
280
+ set texCoord1(v: number[]) { this._texCoord1 = v; }
281
+ get texCoord2(): number[] { return this._texCoord2; }
282
+ set texCoord2(v: number[]) { this._texCoord2 = v; }
283
+ get color(): number[] { return this._color; }
284
+ set color(v: number[]) { this._color = v; }
285
+ get index(): number[] { return this._index; }
286
+ set index(v: number[]) { this._index = v; }
287
+
288
+ // Internal use: non serializable properties
289
+ set colorCode(c: Color) {
290
+ this._colorCode = c;
291
+ }
292
+
293
+ get colorCode(): Color {
294
+ return this._colorCode;
295
+ }
296
+
297
+ set selected(s: boolean) {
298
+ this._selected = s;
299
+ }
300
+
301
+ get isSelected(): boolean {
302
+ return this._selected;
303
+ }
304
+
305
+ get isSelectable(): boolean {
306
+ return this._selectable;
307
+ }
308
+
309
+ set selectable(s: boolean) {
310
+ this._selectable = s;
311
+ }
312
+
313
+ // The this._renderer variable is initialized by the polyListRenderer factory
314
+ get renderer(): any {
315
+ return this._renderer
316
+ }
317
+
318
+ rebuildTangents(): void {
319
+ buildTangents(this);
320
+ }
321
+
322
+ get tangent(): number[] | undefined {
323
+ if (!this.validTangents) {
324
+ buildTangents(this);
325
+ }
326
+ return this._tangent;
327
+ }
328
+
329
+ get validTangents(): boolean {
330
+ return this._tangent !== undefined &&
331
+ this._tangent.length === this._vertex.length &&
332
+ this._tangent.length / 3 === this._texCoord0.length / 2;
333
+ }
334
+
335
+ destroy(): void {
336
+ if (this.renderer) {
337
+ this.renderer.destroy();
338
+ }
339
+ }
340
+
341
+ static ApplyTransform(plist: PolyList, trx: Mat4): void {
342
+ const transform = new Mat4(trx);
343
+ const rotation = new Mat4(trx.mat3);
344
+
345
+ if (plist.normal.length > 0 && plist.normal.length != plist.vertex.length) {
346
+ throw new Error(`Unexpected number of normal coordinates found in polyList '${ plist.name }'`);
347
+ }
348
+
349
+ for (let i = 0; i < plist.vertex.length - 2; i += 3) {
350
+ let vertex = new Vec(plist.vertex[i], plist.vertex[i+1], plist.vertex[i+2], 1.0);
351
+ vertex = transform.multVector(vertex);
352
+ plist.vertex[i] = vertex.x;
353
+ plist.vertex[i + 1] = vertex.y;
354
+ plist.vertex[i + 2] = vertex.z;
355
+
356
+ if (plist.normal.length) {
357
+ let normal = new Vec(plist.normal[i], plist.normal[i+1], plist.normal[i+2], 1.0);
358
+ normal = rotation.multVector(normal);
359
+ plist.normal[i] = normal.x;
360
+ plist.normal[i + 1] = normal.y;
361
+ plist.normal[i + 2] = normal.z;
362
+ }
363
+ }
364
+ }
365
+ }