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.
- package/dist/bg2e-js.js +356 -326
- package/dist/bg2e-js.js.map +1 -1
- package/package.json +56 -56
- package/src/app/AppController.ts +39 -39
- package/src/app/Bg2KeyboardEvent.ts +54 -54
- package/src/app/Bg2MouseEvent.ts +82 -82
- package/src/app/Bg2TouchEvent.ts +18 -18
- package/src/app/Canvas.ts +108 -108
- package/src/app/EventBase.ts +10 -10
- package/src/app/MainLoop.ts +273 -273
- package/src/app/index.ts +24 -24
- package/src/base/Color.ts +134 -134
- package/src/base/Environment.ts +183 -183
- package/src/base/Light.ts +192 -192
- package/src/base/Material.ts +620 -620
- package/src/base/PolyList.ts +365 -365
- package/src/base/Texture.ts +620 -620
- package/src/base/index.ts +81 -81
- package/src/db/Bg2LoaderPlugin.ts +143 -143
- package/src/db/DBPluginApi.ts +48 -48
- package/src/db/Loader.ts +116 -116
- package/src/db/LoaderPlugin.ts +34 -34
- package/src/db/MtlParser.ts +7 -7
- package/src/db/ObjLoaderPlugin.ts +54 -54
- package/src/db/ObjParser.ts +252 -252
- package/src/db/ObjWriterPlugin.ts +18 -18
- package/src/db/VitscnjLoaderPlugin.ts +112 -112
- package/src/db/Writer.ts +52 -52
- package/src/db/WriterPlugin.ts +22 -22
- package/src/db/index.ts +44 -44
- package/src/debug/DebugRenderer.ts +173 -173
- package/src/debug/WebGLTextureViewer.ts +75 -75
- package/src/debug/index.ts +6 -6
- package/src/index.html +11 -11
- package/src/index.ts +33 -33
- package/src/manipulation/SelectionBuffer.ts +81 -81
- package/src/manipulation/SelectionHighlight.ts +105 -84
- package/src/manipulation/SelectionIdAssignVisitor.ts +96 -96
- package/src/manipulation/SelectionManager.ts +196 -188
- package/src/manipulation/SelectionMode.ts +6 -6
- package/src/math/Mat3.ts +259 -259
- package/src/math/Mat4.ts +710 -710
- package/src/math/MatrixStrategy.ts +25 -25
- package/src/math/Quat.ts +65 -65
- package/src/math/Vec.ts +753 -753
- package/src/math/constants.ts +46 -46
- package/src/math/functions.ts +103 -103
- package/src/math/index.ts +74 -74
- package/src/phsics/joint.ts +137 -137
- package/src/primitives/arrow.ts +57 -57
- package/src/primitives/cone.ts +138 -138
- package/src/primitives/cube.ts +60 -60
- package/src/primitives/cylinder.ts +216 -216
- package/src/primitives/index.ts +13 -13
- package/src/primitives/plane.ts +31 -31
- package/src/primitives/sphere.ts +809 -809
- package/src/react/useBg2e.ts +69 -69
- package/src/render/BRDFIntegrationMap.ts +4 -4
- package/src/render/Environment.ts +135 -135
- package/src/render/FrameBuffer.ts +35 -35
- package/src/render/MaterialRenderer.ts +34 -34
- package/src/render/Pipeline.ts +108 -108
- package/src/render/PolyListRenderer.ts +47 -47
- package/src/render/RenderBuffer.ts +197 -197
- package/src/render/RenderQueue.ts +198 -198
- package/src/render/RenderState.ts +116 -116
- package/src/render/Renderer.ts +248 -248
- package/src/render/SceneAppController.ts +250 -250
- package/src/render/SceneRenderer.ts +387 -387
- package/src/render/Shader.ts +32 -32
- package/src/render/ShadowRenderer.ts +176 -176
- package/src/render/SkyCube.ts +105 -105
- package/src/render/SkySphere.ts +117 -117
- package/src/render/TextureMergerRenderer.ts +70 -70
- package/src/render/TextureRenderer.ts +34 -34
- package/src/render/index.ts +67 -67
- package/src/render/webgl/FrameBuffer.ts +9 -9
- package/src/render/webgl/MaterialRenderer.ts +112 -112
- package/src/render/webgl/Pipeline.ts +88 -88
- package/src/render/webgl/PolyListRenderer.ts +260 -260
- package/src/render/webgl/RenderBuffer.ts +226 -226
- package/src/render/webgl/Renderer.ts +262 -262
- package/src/render/webgl/SceneRenderer.ts +67 -67
- package/src/render/webgl/ShaderProgram.ts +424 -424
- package/src/render/webgl/ShadowRenderer.ts +6 -6
- package/src/render/webgl/SkyCube.ts +15 -15
- package/src/render/webgl/SkySphere.ts +15 -15
- package/src/render/webgl/State.ts +152 -152
- package/src/render/webgl/TextureRenderer.ts +167 -167
- package/src/render/webgl/VertexBuffer.ts +137 -137
- package/src/render/webgl/index.ts +35 -35
- package/src/scene/Camera.ts +458 -458
- package/src/scene/Chain.ts +44 -44
- package/src/scene/ChainJoint.ts +58 -58
- package/src/scene/Component.ts +177 -177
- package/src/scene/ComponentMap.ts +106 -106
- package/src/scene/Drawable.ts +154 -154
- package/src/scene/EnvironmentComponent.ts +141 -141
- package/src/scene/FindNodeVisitor.ts +59 -59
- package/src/scene/LightComponent.ts +154 -154
- package/src/scene/MatrixState.ts +46 -46
- package/src/scene/Node.ts +328 -328
- package/src/scene/NodeVisitor.ts +15 -15
- package/src/scene/OrbitCameraController.ts +450 -450
- package/src/scene/SmoothOrbitCameraController.ts +99 -99
- package/src/scene/Transform.ts +73 -73
- package/src/scene/index.ts +60 -60
- package/src/shaders/BasicDiffuseColorShader.ts +111 -111
- package/src/shaders/BasicPBRLightShader.ts +276 -276
- package/src/shaders/DebugRenderShader.ts +97 -97
- package/src/shaders/DepthRenderShader.ts +127 -127
- package/src/shaders/IrradianceMapCubeShader.ts +115 -115
- package/src/shaders/PBRLightIBLShader.ts +486 -486
- package/src/shaders/PickSelectionShader.ts +101 -101
- package/src/shaders/PresentDebugFramebufferShader.ts +118 -118
- package/src/shaders/PresentTextureShader.ts +99 -99
- package/src/shaders/SelectionHighlightShader.ts +143 -127
- package/src/shaders/ShaderFunction.ts +318 -318
- package/src/shaders/SkyCubeShader.ts +93 -93
- package/src/shaders/SkySphereShader.ts +102 -102
- package/src/shaders/SpecularMapCubeShader.ts +164 -164
- package/src/shaders/TextureMergerShader.ts +171 -171
- package/src/shaders/index.ts +36 -36
- package/src/shaders/webgl/color_correction.glsl +47 -47
- package/src/shaders/webgl/constants.glsl +6 -6
- package/src/shaders/webgl/index.ts +70 -70
- package/src/shaders/webgl/normal_map.glsl +9 -9
- package/src/shaders/webgl/pbr.glsl +173 -173
- package/src/shaders/webgl/uniforms.glsl +91 -91
- package/src/shaders/webgl_shader_lib.ts +213 -213
- package/src/tools/BinaryResourceProvider.ts +14 -14
- package/src/tools/ImageResourceProvider.ts +66 -66
- package/src/tools/MaterialModifier.ts +446 -446
- package/src/tools/Resource.ts +203 -203
- package/src/tools/ResourceProvider.ts +69 -69
- package/src/tools/TextResourceProvider.ts +24 -24
- package/src/tools/TextureCache.ts +51 -51
- package/src/tools/TextureResourceDatabase.ts +100 -100
- package/src/tools/UserAgent.ts +362 -362
- package/src/tools/VideoResourceProvider.ts +50 -50
- package/src/tools/WriteStrategy.ts +22 -22
- package/src/tools/base64.ts +11 -11
- package/src/tools/crypto.ts +19 -19
- package/src/tools/endiantess.ts +13 -13
- package/src/tools/image.ts +18 -18
- package/src/tools/index.ts +41 -41
- package/src/tools/processType.ts +39 -39
- package/src/vite-env.d.ts +12 -12
package/src/base/PolyList.ts
CHANGED
|
@@ -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
|
+
}
|