@2112-lab/central-plant 0.1.0
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/README.md +0 -0
- package/dist/bundle/index.js +14259 -0
- package/dist/cjs/_virtual/_rollupPluginBabelHelpers.js +353 -0
- package/dist/cjs/node_modules/three/examples/jsm/controls/OrbitControls.js +1292 -0
- package/dist/cjs/node_modules/three/examples/jsm/controls/TransformControls.js +1543 -0
- package/dist/cjs/node_modules/three/examples/jsm/loaders/GLTFLoader.js +4374 -0
- package/dist/cjs/node_modules/three/examples/jsm/loaders/RGBELoader.js +465 -0
- package/dist/cjs/node_modules/three/examples/jsm/utils/BufferGeometryUtils.js +117 -0
- package/dist/cjs/src/ConnectionManager.js +114 -0
- package/dist/cjs/src/Pathfinder.js +88 -0
- package/dist/cjs/src/animationManager.js +121 -0
- package/dist/cjs/src/componentManager.js +151 -0
- package/dist/cjs/src/debugLogger.js +176 -0
- package/dist/cjs/src/disposalManager.js +185 -0
- package/dist/cjs/src/environmentManager.js +1015 -0
- package/dist/cjs/src/hotReloadManager.js +252 -0
- package/dist/cjs/src/index.js +126 -0
- package/dist/cjs/src/keyboardControlsManager.js +206 -0
- package/dist/cjs/src/modelPreloader.js +360 -0
- package/dist/cjs/src/nameUtils.js +106 -0
- package/dist/cjs/src/pathfindingManager.js +321 -0
- package/dist/cjs/src/performanceMonitor.js +718 -0
- package/dist/cjs/src/sceneExportManager.js +292 -0
- package/dist/cjs/src/sceneInitializationManager.js +540 -0
- package/dist/cjs/src/sceneOperationsManager.js +560 -0
- package/dist/cjs/src/textureConfig.js +195 -0
- package/dist/cjs/src/transformControlsManager.js +851 -0
- package/dist/esm/_virtual/_rollupPluginBabelHelpers.js +328 -0
- package/dist/esm/node_modules/three/examples/jsm/controls/OrbitControls.js +1287 -0
- package/dist/esm/node_modules/three/examples/jsm/controls/TransformControls.js +1537 -0
- package/dist/esm/node_modules/three/examples/jsm/loaders/GLTFLoader.js +4370 -0
- package/dist/esm/node_modules/three/examples/jsm/loaders/RGBELoader.js +461 -0
- package/dist/esm/node_modules/three/examples/jsm/utils/BufferGeometryUtils.js +113 -0
- package/dist/esm/src/ConnectionManager.js +110 -0
- package/dist/esm/src/Pathfinder.js +84 -0
- package/dist/esm/src/animationManager.js +112 -0
- package/dist/esm/src/componentManager.js +123 -0
- package/dist/esm/src/debugLogger.js +167 -0
- package/dist/esm/src/disposalManager.js +155 -0
- package/dist/esm/src/environmentManager.js +989 -0
- package/dist/esm/src/hotReloadManager.js +244 -0
- package/dist/esm/src/index.js +117 -0
- package/dist/esm/src/keyboardControlsManager.js +196 -0
- package/dist/esm/src/modelPreloader.js +337 -0
- package/dist/esm/src/nameUtils.js +99 -0
- package/dist/esm/src/pathfindingManager.js +295 -0
- package/dist/esm/src/performanceMonitor.js +712 -0
- package/dist/esm/src/sceneExportManager.js +286 -0
- package/dist/esm/src/sceneInitializationManager.js +513 -0
- package/dist/esm/src/sceneOperationsManager.js +536 -0
- package/dist/esm/src/textureConfig.js +168 -0
- package/dist/esm/src/transformControlsManager.js +827 -0
- package/dist/index.d.ts +259 -0
- package/package.json +53 -0
|
@@ -0,0 +1,465 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var THREE = require('three');
|
|
6
|
+
|
|
7
|
+
// https://github.com/mrdoob/three.js/issues/5552
|
|
8
|
+
// http://en.wikipedia.org/wiki/RGBE_image_format
|
|
9
|
+
|
|
10
|
+
class RGBELoader extends THREE.DataTextureLoader {
|
|
11
|
+
|
|
12
|
+
constructor( manager ) {
|
|
13
|
+
|
|
14
|
+
super( manager );
|
|
15
|
+
|
|
16
|
+
this.type = THREE.HalfFloatType;
|
|
17
|
+
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// adapted from http://www.graphics.cornell.edu/~bjw/rgbe.html
|
|
21
|
+
|
|
22
|
+
parse( buffer ) {
|
|
23
|
+
|
|
24
|
+
const
|
|
25
|
+
/* return codes for rgbe routines */
|
|
26
|
+
//RGBE_RETURN_SUCCESS = 0,
|
|
27
|
+
RGBE_RETURN_FAILURE = - 1,
|
|
28
|
+
|
|
29
|
+
/* default error routine. change this to change error handling */
|
|
30
|
+
rgbe_read_error = 1,
|
|
31
|
+
rgbe_write_error = 2,
|
|
32
|
+
rgbe_format_error = 3,
|
|
33
|
+
rgbe_memory_error = 4,
|
|
34
|
+
rgbe_error = function ( rgbe_error_code, msg ) {
|
|
35
|
+
|
|
36
|
+
switch ( rgbe_error_code ) {
|
|
37
|
+
|
|
38
|
+
case rgbe_read_error: console.error( 'THREE.RGBELoader Read Error: ' + ( msg || '' ) );
|
|
39
|
+
break;
|
|
40
|
+
case rgbe_write_error: console.error( 'THREE.RGBELoader Write Error: ' + ( msg || '' ) );
|
|
41
|
+
break;
|
|
42
|
+
case rgbe_format_error: console.error( 'THREE.RGBELoader Bad File Format: ' + ( msg || '' ) );
|
|
43
|
+
break;
|
|
44
|
+
default:
|
|
45
|
+
case rgbe_memory_error: console.error( 'THREE.RGBELoader: Error: ' + ( msg || '' ) );
|
|
46
|
+
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return RGBE_RETURN_FAILURE;
|
|
50
|
+
|
|
51
|
+
},
|
|
52
|
+
|
|
53
|
+
/* offsets to red, green, and blue components in a data (float) pixel */
|
|
54
|
+
//RGBE_DATA_RED = 0,
|
|
55
|
+
//RGBE_DATA_GREEN = 1,
|
|
56
|
+
//RGBE_DATA_BLUE = 2,
|
|
57
|
+
|
|
58
|
+
/* number of floats per pixel, use 4 since stored in rgba image format */
|
|
59
|
+
//RGBE_DATA_SIZE = 4,
|
|
60
|
+
|
|
61
|
+
/* flags indicating which fields in an rgbe_header_info are valid */
|
|
62
|
+
RGBE_VALID_PROGRAMTYPE = 1,
|
|
63
|
+
RGBE_VALID_FORMAT = 2,
|
|
64
|
+
RGBE_VALID_DIMENSIONS = 4,
|
|
65
|
+
|
|
66
|
+
NEWLINE = '\n',
|
|
67
|
+
|
|
68
|
+
fgets = function ( buffer, lineLimit, consume ) {
|
|
69
|
+
|
|
70
|
+
const chunkSize = 128;
|
|
71
|
+
|
|
72
|
+
lineLimit = ! lineLimit ? 1024 : lineLimit;
|
|
73
|
+
let p = buffer.pos,
|
|
74
|
+
i = - 1, len = 0, s = '',
|
|
75
|
+
chunk = String.fromCharCode.apply( null, new Uint16Array( buffer.subarray( p, p + chunkSize ) ) );
|
|
76
|
+
|
|
77
|
+
while ( ( 0 > ( i = chunk.indexOf( NEWLINE ) ) ) && ( len < lineLimit ) && ( p < buffer.byteLength ) ) {
|
|
78
|
+
|
|
79
|
+
s += chunk; len += chunk.length;
|
|
80
|
+
p += chunkSize;
|
|
81
|
+
chunk += String.fromCharCode.apply( null, new Uint16Array( buffer.subarray( p, p + chunkSize ) ) );
|
|
82
|
+
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
if ( - 1 < i ) {
|
|
86
|
+
|
|
87
|
+
/*for (i=l-1; i>=0; i--) {
|
|
88
|
+
byteCode = m.charCodeAt(i);
|
|
89
|
+
if (byteCode > 0x7f && byteCode <= 0x7ff) byteLen++;
|
|
90
|
+
else if (byteCode > 0x7ff && byteCode <= 0xffff) byteLen += 2;
|
|
91
|
+
if (byteCode >= 0xDC00 && byteCode <= 0xDFFF) i--; //trail surrogate
|
|
92
|
+
}*/
|
|
93
|
+
if ( false !== consume ) buffer.pos += len + i + 1;
|
|
94
|
+
return s + chunk.slice( 0, i );
|
|
95
|
+
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
return false;
|
|
99
|
+
|
|
100
|
+
},
|
|
101
|
+
|
|
102
|
+
/* minimal header reading. modify if you want to parse more information */
|
|
103
|
+
RGBE_ReadHeader = function ( buffer ) {
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
// regexes to parse header info fields
|
|
107
|
+
const magic_token_re = /^#\?(\S+)/,
|
|
108
|
+
gamma_re = /^\s*GAMMA\s*=\s*(\d+(\.\d+)?)\s*$/,
|
|
109
|
+
exposure_re = /^\s*EXPOSURE\s*=\s*(\d+(\.\d+)?)\s*$/,
|
|
110
|
+
format_re = /^\s*FORMAT=(\S+)\s*$/,
|
|
111
|
+
dimensions_re = /^\s*\-Y\s+(\d+)\s+\+X\s+(\d+)\s*$/,
|
|
112
|
+
|
|
113
|
+
// RGBE format header struct
|
|
114
|
+
header = {
|
|
115
|
+
|
|
116
|
+
valid: 0, /* indicate which fields are valid */
|
|
117
|
+
|
|
118
|
+
string: '', /* the actual header string */
|
|
119
|
+
|
|
120
|
+
comments: '', /* comments found in header */
|
|
121
|
+
|
|
122
|
+
programtype: 'RGBE', /* listed at beginning of file to identify it after "#?". defaults to "RGBE" */
|
|
123
|
+
|
|
124
|
+
format: '', /* RGBE format, default 32-bit_rle_rgbe */
|
|
125
|
+
|
|
126
|
+
gamma: 1.0, /* image has already been gamma corrected with given gamma. defaults to 1.0 (no correction) */
|
|
127
|
+
|
|
128
|
+
exposure: 1.0, /* a value of 1.0 in an image corresponds to <exposure> watts/steradian/m^2. defaults to 1.0 */
|
|
129
|
+
|
|
130
|
+
width: 0, height: 0 /* image dimensions, width/height */
|
|
131
|
+
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
let line, match;
|
|
135
|
+
|
|
136
|
+
if ( buffer.pos >= buffer.byteLength || ! ( line = fgets( buffer ) ) ) {
|
|
137
|
+
|
|
138
|
+
return rgbe_error( rgbe_read_error, 'no header found' );
|
|
139
|
+
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/* if you want to require the magic token then uncomment the next line */
|
|
143
|
+
if ( ! ( match = line.match( magic_token_re ) ) ) {
|
|
144
|
+
|
|
145
|
+
return rgbe_error( rgbe_format_error, 'bad initial token' );
|
|
146
|
+
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
header.valid |= RGBE_VALID_PROGRAMTYPE;
|
|
150
|
+
header.programtype = match[ 1 ];
|
|
151
|
+
header.string += line + '\n';
|
|
152
|
+
|
|
153
|
+
while ( true ) {
|
|
154
|
+
|
|
155
|
+
line = fgets( buffer );
|
|
156
|
+
if ( false === line ) break;
|
|
157
|
+
header.string += line + '\n';
|
|
158
|
+
|
|
159
|
+
if ( '#' === line.charAt( 0 ) ) {
|
|
160
|
+
|
|
161
|
+
header.comments += line + '\n';
|
|
162
|
+
continue; // comment line
|
|
163
|
+
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
if ( match = line.match( gamma_re ) ) {
|
|
167
|
+
|
|
168
|
+
header.gamma = parseFloat( match[ 1 ] );
|
|
169
|
+
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
if ( match = line.match( exposure_re ) ) {
|
|
173
|
+
|
|
174
|
+
header.exposure = parseFloat( match[ 1 ] );
|
|
175
|
+
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
if ( match = line.match( format_re ) ) {
|
|
179
|
+
|
|
180
|
+
header.valid |= RGBE_VALID_FORMAT;
|
|
181
|
+
header.format = match[ 1 ];//'32-bit_rle_rgbe';
|
|
182
|
+
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
if ( match = line.match( dimensions_re ) ) {
|
|
186
|
+
|
|
187
|
+
header.valid |= RGBE_VALID_DIMENSIONS;
|
|
188
|
+
header.height = parseInt( match[ 1 ], 10 );
|
|
189
|
+
header.width = parseInt( match[ 2 ], 10 );
|
|
190
|
+
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
if ( ( header.valid & RGBE_VALID_FORMAT ) && ( header.valid & RGBE_VALID_DIMENSIONS ) ) break;
|
|
194
|
+
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
if ( ! ( header.valid & RGBE_VALID_FORMAT ) ) {
|
|
198
|
+
|
|
199
|
+
return rgbe_error( rgbe_format_error, 'missing format specifier' );
|
|
200
|
+
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
if ( ! ( header.valid & RGBE_VALID_DIMENSIONS ) ) {
|
|
204
|
+
|
|
205
|
+
return rgbe_error( rgbe_format_error, 'missing image size specifier' );
|
|
206
|
+
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
return header;
|
|
210
|
+
|
|
211
|
+
},
|
|
212
|
+
|
|
213
|
+
RGBE_ReadPixels_RLE = function ( buffer, w, h ) {
|
|
214
|
+
|
|
215
|
+
const scanline_width = w;
|
|
216
|
+
|
|
217
|
+
if (
|
|
218
|
+
// run length encoding is not allowed so read flat
|
|
219
|
+
( ( scanline_width < 8 ) || ( scanline_width > 0x7fff ) ) ||
|
|
220
|
+
// this file is not run length encoded
|
|
221
|
+
( ( 2 !== buffer[ 0 ] ) || ( 2 !== buffer[ 1 ] ) || ( buffer[ 2 ] & 0x80 ) )
|
|
222
|
+
) {
|
|
223
|
+
|
|
224
|
+
// return the flat buffer
|
|
225
|
+
return new Uint8Array( buffer );
|
|
226
|
+
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
if ( scanline_width !== ( ( buffer[ 2 ] << 8 ) | buffer[ 3 ] ) ) {
|
|
230
|
+
|
|
231
|
+
return rgbe_error( rgbe_format_error, 'wrong scanline width' );
|
|
232
|
+
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
const data_rgba = new Uint8Array( 4 * w * h );
|
|
236
|
+
|
|
237
|
+
if ( ! data_rgba.length ) {
|
|
238
|
+
|
|
239
|
+
return rgbe_error( rgbe_memory_error, 'unable to allocate buffer space' );
|
|
240
|
+
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
let offset = 0, pos = 0;
|
|
244
|
+
|
|
245
|
+
const ptr_end = 4 * scanline_width;
|
|
246
|
+
const rgbeStart = new Uint8Array( 4 );
|
|
247
|
+
const scanline_buffer = new Uint8Array( ptr_end );
|
|
248
|
+
let num_scanlines = h;
|
|
249
|
+
|
|
250
|
+
// read in each successive scanline
|
|
251
|
+
while ( ( num_scanlines > 0 ) && ( pos < buffer.byteLength ) ) {
|
|
252
|
+
|
|
253
|
+
if ( pos + 4 > buffer.byteLength ) {
|
|
254
|
+
|
|
255
|
+
return rgbe_error( rgbe_read_error );
|
|
256
|
+
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
rgbeStart[ 0 ] = buffer[ pos ++ ];
|
|
260
|
+
rgbeStart[ 1 ] = buffer[ pos ++ ];
|
|
261
|
+
rgbeStart[ 2 ] = buffer[ pos ++ ];
|
|
262
|
+
rgbeStart[ 3 ] = buffer[ pos ++ ];
|
|
263
|
+
|
|
264
|
+
if ( ( 2 != rgbeStart[ 0 ] ) || ( 2 != rgbeStart[ 1 ] ) || ( ( ( rgbeStart[ 2 ] << 8 ) | rgbeStart[ 3 ] ) != scanline_width ) ) {
|
|
265
|
+
|
|
266
|
+
return rgbe_error( rgbe_format_error, 'bad rgbe scanline format' );
|
|
267
|
+
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
// read each of the four channels for the scanline into the buffer
|
|
271
|
+
// first red, then green, then blue, then exponent
|
|
272
|
+
let ptr = 0, count;
|
|
273
|
+
|
|
274
|
+
while ( ( ptr < ptr_end ) && ( pos < buffer.byteLength ) ) {
|
|
275
|
+
|
|
276
|
+
count = buffer[ pos ++ ];
|
|
277
|
+
const isEncodedRun = count > 128;
|
|
278
|
+
if ( isEncodedRun ) count -= 128;
|
|
279
|
+
|
|
280
|
+
if ( ( 0 === count ) || ( ptr + count > ptr_end ) ) {
|
|
281
|
+
|
|
282
|
+
return rgbe_error( rgbe_format_error, 'bad scanline data' );
|
|
283
|
+
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
if ( isEncodedRun ) {
|
|
287
|
+
|
|
288
|
+
// a (encoded) run of the same value
|
|
289
|
+
const byteValue = buffer[ pos ++ ];
|
|
290
|
+
for ( let i = 0; i < count; i ++ ) {
|
|
291
|
+
|
|
292
|
+
scanline_buffer[ ptr ++ ] = byteValue;
|
|
293
|
+
|
|
294
|
+
}
|
|
295
|
+
//ptr += count;
|
|
296
|
+
|
|
297
|
+
} else {
|
|
298
|
+
|
|
299
|
+
// a literal-run
|
|
300
|
+
scanline_buffer.set( buffer.subarray( pos, pos + count ), ptr );
|
|
301
|
+
ptr += count; pos += count;
|
|
302
|
+
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
|
|
308
|
+
// now convert data from buffer into rgba
|
|
309
|
+
// first red, then green, then blue, then exponent (alpha)
|
|
310
|
+
const l = scanline_width; //scanline_buffer.byteLength;
|
|
311
|
+
for ( let i = 0; i < l; i ++ ) {
|
|
312
|
+
|
|
313
|
+
let off = 0;
|
|
314
|
+
data_rgba[ offset ] = scanline_buffer[ i + off ];
|
|
315
|
+
off += scanline_width; //1;
|
|
316
|
+
data_rgba[ offset + 1 ] = scanline_buffer[ i + off ];
|
|
317
|
+
off += scanline_width; //1;
|
|
318
|
+
data_rgba[ offset + 2 ] = scanline_buffer[ i + off ];
|
|
319
|
+
off += scanline_width; //1;
|
|
320
|
+
data_rgba[ offset + 3 ] = scanline_buffer[ i + off ];
|
|
321
|
+
offset += 4;
|
|
322
|
+
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
num_scanlines --;
|
|
326
|
+
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
return data_rgba;
|
|
330
|
+
|
|
331
|
+
};
|
|
332
|
+
|
|
333
|
+
const RGBEByteToRGBFloat = function ( sourceArray, sourceOffset, destArray, destOffset ) {
|
|
334
|
+
|
|
335
|
+
const e = sourceArray[ sourceOffset + 3 ];
|
|
336
|
+
const scale = Math.pow( 2.0, e - 128.0 ) / 255.0;
|
|
337
|
+
|
|
338
|
+
destArray[ destOffset + 0 ] = sourceArray[ sourceOffset + 0 ] * scale;
|
|
339
|
+
destArray[ destOffset + 1 ] = sourceArray[ sourceOffset + 1 ] * scale;
|
|
340
|
+
destArray[ destOffset + 2 ] = sourceArray[ sourceOffset + 2 ] * scale;
|
|
341
|
+
destArray[ destOffset + 3 ] = 1;
|
|
342
|
+
|
|
343
|
+
};
|
|
344
|
+
|
|
345
|
+
const RGBEByteToRGBHalf = function ( sourceArray, sourceOffset, destArray, destOffset ) {
|
|
346
|
+
|
|
347
|
+
const e = sourceArray[ sourceOffset + 3 ];
|
|
348
|
+
const scale = Math.pow( 2.0, e - 128.0 ) / 255.0;
|
|
349
|
+
|
|
350
|
+
// clamping to 65504, the maximum representable value in float16
|
|
351
|
+
destArray[ destOffset + 0 ] = THREE.DataUtils.toHalfFloat( Math.min( sourceArray[ sourceOffset + 0 ] * scale, 65504 ) );
|
|
352
|
+
destArray[ destOffset + 1 ] = THREE.DataUtils.toHalfFloat( Math.min( sourceArray[ sourceOffset + 1 ] * scale, 65504 ) );
|
|
353
|
+
destArray[ destOffset + 2 ] = THREE.DataUtils.toHalfFloat( Math.min( sourceArray[ sourceOffset + 2 ] * scale, 65504 ) );
|
|
354
|
+
destArray[ destOffset + 3 ] = THREE.DataUtils.toHalfFloat( 1 );
|
|
355
|
+
|
|
356
|
+
};
|
|
357
|
+
|
|
358
|
+
const byteArray = new Uint8Array( buffer );
|
|
359
|
+
byteArray.pos = 0;
|
|
360
|
+
const rgbe_header_info = RGBE_ReadHeader( byteArray );
|
|
361
|
+
|
|
362
|
+
if ( RGBE_RETURN_FAILURE !== rgbe_header_info ) {
|
|
363
|
+
|
|
364
|
+
const w = rgbe_header_info.width,
|
|
365
|
+
h = rgbe_header_info.height,
|
|
366
|
+
image_rgba_data = RGBE_ReadPixels_RLE( byteArray.subarray( byteArray.pos ), w, h );
|
|
367
|
+
|
|
368
|
+
if ( RGBE_RETURN_FAILURE !== image_rgba_data ) {
|
|
369
|
+
|
|
370
|
+
let data, type;
|
|
371
|
+
let numElements;
|
|
372
|
+
|
|
373
|
+
switch ( this.type ) {
|
|
374
|
+
|
|
375
|
+
case THREE.FloatType:
|
|
376
|
+
|
|
377
|
+
numElements = image_rgba_data.length / 4;
|
|
378
|
+
const floatArray = new Float32Array( numElements * 4 );
|
|
379
|
+
|
|
380
|
+
for ( let j = 0; j < numElements; j ++ ) {
|
|
381
|
+
|
|
382
|
+
RGBEByteToRGBFloat( image_rgba_data, j * 4, floatArray, j * 4 );
|
|
383
|
+
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
data = floatArray;
|
|
387
|
+
type = THREE.FloatType;
|
|
388
|
+
break;
|
|
389
|
+
|
|
390
|
+
case THREE.HalfFloatType:
|
|
391
|
+
|
|
392
|
+
numElements = image_rgba_data.length / 4;
|
|
393
|
+
const halfArray = new Uint16Array( numElements * 4 );
|
|
394
|
+
|
|
395
|
+
for ( let j = 0; j < numElements; j ++ ) {
|
|
396
|
+
|
|
397
|
+
RGBEByteToRGBHalf( image_rgba_data, j * 4, halfArray, j * 4 );
|
|
398
|
+
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
data = halfArray;
|
|
402
|
+
type = THREE.HalfFloatType;
|
|
403
|
+
break;
|
|
404
|
+
|
|
405
|
+
default:
|
|
406
|
+
|
|
407
|
+
console.error( 'THREE.RGBELoader: unsupported type: ', this.type );
|
|
408
|
+
break;
|
|
409
|
+
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
return {
|
|
413
|
+
width: w, height: h,
|
|
414
|
+
data: data,
|
|
415
|
+
header: rgbe_header_info.string,
|
|
416
|
+
gamma: rgbe_header_info.gamma,
|
|
417
|
+
exposure: rgbe_header_info.exposure,
|
|
418
|
+
type: type
|
|
419
|
+
};
|
|
420
|
+
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
return null;
|
|
426
|
+
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
setDataType( value ) {
|
|
430
|
+
|
|
431
|
+
this.type = value;
|
|
432
|
+
return this;
|
|
433
|
+
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
load( url, onLoad, onProgress, onError ) {
|
|
437
|
+
|
|
438
|
+
function onLoadCallback( texture, texData ) {
|
|
439
|
+
|
|
440
|
+
switch ( texture.type ) {
|
|
441
|
+
|
|
442
|
+
case THREE.FloatType:
|
|
443
|
+
case THREE.HalfFloatType:
|
|
444
|
+
|
|
445
|
+
texture.encoding = THREE.LinearEncoding;
|
|
446
|
+
texture.minFilter = THREE.LinearFilter;
|
|
447
|
+
texture.magFilter = THREE.LinearFilter;
|
|
448
|
+
texture.generateMipmaps = false;
|
|
449
|
+
texture.flipY = true;
|
|
450
|
+
|
|
451
|
+
break;
|
|
452
|
+
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
if ( onLoad ) onLoad( texture, texData );
|
|
456
|
+
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
return super.load( url, onLoadCallback, onProgress, onError );
|
|
460
|
+
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
exports.RGBELoader = RGBELoader;
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var THREE = require('three');
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* @param {BufferGeometry} geometry
|
|
9
|
+
* @param {number} drawMode
|
|
10
|
+
* @return {BufferGeometry}
|
|
11
|
+
*/
|
|
12
|
+
function toTrianglesDrawMode( geometry, drawMode ) {
|
|
13
|
+
|
|
14
|
+
if ( drawMode === THREE.TrianglesDrawMode ) {
|
|
15
|
+
|
|
16
|
+
console.warn( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Geometry already defined as triangles.' );
|
|
17
|
+
return geometry;
|
|
18
|
+
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
if ( drawMode === THREE.TriangleFanDrawMode || drawMode === THREE.TriangleStripDrawMode ) {
|
|
22
|
+
|
|
23
|
+
let index = geometry.getIndex();
|
|
24
|
+
|
|
25
|
+
// generate index if not present
|
|
26
|
+
|
|
27
|
+
if ( index === null ) {
|
|
28
|
+
|
|
29
|
+
const indices = [];
|
|
30
|
+
|
|
31
|
+
const position = geometry.getAttribute( 'position' );
|
|
32
|
+
|
|
33
|
+
if ( position !== undefined ) {
|
|
34
|
+
|
|
35
|
+
for ( let i = 0; i < position.count; i ++ ) {
|
|
36
|
+
|
|
37
|
+
indices.push( i );
|
|
38
|
+
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
geometry.setIndex( indices );
|
|
42
|
+
index = geometry.getIndex();
|
|
43
|
+
|
|
44
|
+
} else {
|
|
45
|
+
|
|
46
|
+
console.error( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Undefined position attribute. Processing not possible.' );
|
|
47
|
+
return geometry;
|
|
48
|
+
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
//
|
|
54
|
+
|
|
55
|
+
const numberOfTriangles = index.count - 2;
|
|
56
|
+
const newIndices = [];
|
|
57
|
+
|
|
58
|
+
if ( drawMode === THREE.TriangleFanDrawMode ) {
|
|
59
|
+
|
|
60
|
+
// gl.TRIANGLE_FAN
|
|
61
|
+
|
|
62
|
+
for ( let i = 1; i <= numberOfTriangles; i ++ ) {
|
|
63
|
+
|
|
64
|
+
newIndices.push( index.getX( 0 ) );
|
|
65
|
+
newIndices.push( index.getX( i ) );
|
|
66
|
+
newIndices.push( index.getX( i + 1 ) );
|
|
67
|
+
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
} else {
|
|
71
|
+
|
|
72
|
+
// gl.TRIANGLE_STRIP
|
|
73
|
+
|
|
74
|
+
for ( let i = 0; i < numberOfTriangles; i ++ ) {
|
|
75
|
+
|
|
76
|
+
if ( i % 2 === 0 ) {
|
|
77
|
+
|
|
78
|
+
newIndices.push( index.getX( i ) );
|
|
79
|
+
newIndices.push( index.getX( i + 1 ) );
|
|
80
|
+
newIndices.push( index.getX( i + 2 ) );
|
|
81
|
+
|
|
82
|
+
} else {
|
|
83
|
+
|
|
84
|
+
newIndices.push( index.getX( i + 2 ) );
|
|
85
|
+
newIndices.push( index.getX( i + 1 ) );
|
|
86
|
+
newIndices.push( index.getX( i ) );
|
|
87
|
+
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
if ( ( newIndices.length / 3 ) !== numberOfTriangles ) {
|
|
95
|
+
|
|
96
|
+
console.error( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unable to generate correct amount of triangles.' );
|
|
97
|
+
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// build final geometry
|
|
101
|
+
|
|
102
|
+
const newGeometry = geometry.clone();
|
|
103
|
+
newGeometry.setIndex( newIndices );
|
|
104
|
+
newGeometry.clearGroups();
|
|
105
|
+
|
|
106
|
+
return newGeometry;
|
|
107
|
+
|
|
108
|
+
} else {
|
|
109
|
+
|
|
110
|
+
console.error( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unknown draw mode:', drawMode );
|
|
111
|
+
return geometry;
|
|
112
|
+
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
exports.toTrianglesDrawMode = toTrianglesDrawMode;
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var _rollupPluginBabelHelpers = require('../_virtual/_rollupPluginBabelHelpers.js');
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* ConnectionManager class
|
|
9
|
+
* Handles object connections in the pathfinding system with improved safety for missing data
|
|
10
|
+
*/
|
|
11
|
+
var ConnectionManager = /*#__PURE__*/function () {
|
|
12
|
+
function ConnectionManager(sceneManager) {
|
|
13
|
+
_rollupPluginBabelHelpers.classCallCheck(this, ConnectionManager);
|
|
14
|
+
this.sceneManager = sceneManager;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Safely cluster connections by shared objects
|
|
19
|
+
* @param {Array<Object>} connections - Array of connections between objects (or null/undefined)
|
|
20
|
+
* @returns {Array<Object>} Array of clusters
|
|
21
|
+
*/
|
|
22
|
+
return _rollupPluginBabelHelpers.createClass(ConnectionManager, [{
|
|
23
|
+
key: "clusterConnections",
|
|
24
|
+
value: function clusterConnections(connections) {
|
|
25
|
+
// Safety check for undefined or non-array connections
|
|
26
|
+
if (!connections || !Array.isArray(connections)) {
|
|
27
|
+
console.warn('ConnectionManager: No valid connections provided');
|
|
28
|
+
return [];
|
|
29
|
+
}
|
|
30
|
+
var clusters = new Map(); // Map of object UUID to its cluster
|
|
31
|
+
var clusterMap = new Map(); // Map of cluster ID to set of object UUIDs
|
|
32
|
+
var nextClusterId = 0;
|
|
33
|
+
|
|
34
|
+
// Process each connection
|
|
35
|
+
connections.forEach(function (conn) {
|
|
36
|
+
// Safety check for invalid connection format
|
|
37
|
+
if (!conn || _rollupPluginBabelHelpers["typeof"](conn) !== 'object' || !conn.from || !conn.to) {
|
|
38
|
+
console.warn('ConnectionManager: Invalid connection format', conn);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
var from = conn.from,
|
|
42
|
+
to = conn.to;
|
|
43
|
+
|
|
44
|
+
// If neither object is in a cluster, create new cluster
|
|
45
|
+
if (!clusters.has(from) && !clusters.has(to)) {
|
|
46
|
+
var clusterId = nextClusterId++;
|
|
47
|
+
clusters.set(from, clusterId);
|
|
48
|
+
clusters.set(to, clusterId);
|
|
49
|
+
clusterMap.set(clusterId, new Set([from, to]));
|
|
50
|
+
}
|
|
51
|
+
// If only 'from' is in a cluster, add 'to' to that cluster
|
|
52
|
+
else if (clusters.has(from) && !clusters.has(to)) {
|
|
53
|
+
var _clusterId = clusters.get(from);
|
|
54
|
+
clusters.set(to, _clusterId);
|
|
55
|
+
clusterMap.get(_clusterId).add(to);
|
|
56
|
+
}
|
|
57
|
+
// If only 'to' is in a cluster, add 'from' to that cluster
|
|
58
|
+
else if (!clusters.has(from) && clusters.has(to)) {
|
|
59
|
+
var _clusterId2 = clusters.get(to);
|
|
60
|
+
clusters.set(from, _clusterId2);
|
|
61
|
+
clusterMap.get(_clusterId2).add(from);
|
|
62
|
+
}
|
|
63
|
+
// If both are in different clusters, merge the clusters
|
|
64
|
+
else if (clusters.has(from) && clusters.has(to) && clusters.get(from) !== clusters.get(to)) {
|
|
65
|
+
var fromCluster = clusters.get(from);
|
|
66
|
+
var toCluster = clusters.get(to);
|
|
67
|
+
var fromObjects = clusterMap.get(fromCluster);
|
|
68
|
+
var toObjects = clusterMap.get(toCluster);
|
|
69
|
+
|
|
70
|
+
// Merge all objects from 'to' cluster into 'from' cluster
|
|
71
|
+
var _iterator = _rollupPluginBabelHelpers.createForOfIteratorHelper(toObjects),
|
|
72
|
+
_step;
|
|
73
|
+
try {
|
|
74
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
75
|
+
var obj = _step.value;
|
|
76
|
+
clusters.set(obj, fromCluster);
|
|
77
|
+
fromObjects.add(obj);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// Delete the now-empty 'to' cluster
|
|
81
|
+
} catch (err) {
|
|
82
|
+
_iterator.e(err);
|
|
83
|
+
} finally {
|
|
84
|
+
_iterator.f();
|
|
85
|
+
}
|
|
86
|
+
clusterMap.delete(toCluster);
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
// Convert clusters to array format
|
|
91
|
+
var result = [];
|
|
92
|
+
var _iterator2 = _rollupPluginBabelHelpers.createForOfIteratorHelper(clusterMap.entries()),
|
|
93
|
+
_step2;
|
|
94
|
+
try {
|
|
95
|
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
96
|
+
var _step2$value = _rollupPluginBabelHelpers.slicedToArray(_step2.value, 2),
|
|
97
|
+
clusterId = _step2$value[0],
|
|
98
|
+
objectSet = _step2$value[1];
|
|
99
|
+
result.push({
|
|
100
|
+
id: clusterId,
|
|
101
|
+
objects: Array.from(objectSet)
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
} catch (err) {
|
|
105
|
+
_iterator2.e(err);
|
|
106
|
+
} finally {
|
|
107
|
+
_iterator2.f();
|
|
108
|
+
}
|
|
109
|
+
return result;
|
|
110
|
+
}
|
|
111
|
+
}]);
|
|
112
|
+
}();
|
|
113
|
+
|
|
114
|
+
exports["default"] = ConnectionManager;
|