@2112-lab/central-plant 0.1.4 → 0.1.6
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/bundle/index.js +33146 -1
- package/dist/cjs/_virtual/_rollupPluginBabelHelpers.js +432 -1
- package/dist/cjs/node_modules/@2112-lab/pathfinder/dist/index.esm.js +1448 -1
- package/dist/cjs/node_modules/three/examples/jsm/controls/OrbitControls.js +1853 -1
- package/dist/cjs/node_modules/three/examples/jsm/exporters/GLTFExporter.js +3537 -1
- package/dist/cjs/node_modules/three/examples/jsm/exporters/OBJExporter.js +305 -1
- package/dist/cjs/node_modules/three/examples/jsm/exporters/PLYExporter.js +542 -1
- package/dist/cjs/node_modules/three/examples/jsm/exporters/STLExporter.js +218 -1
- package/dist/cjs/node_modules/three/examples/jsm/loaders/DRACOLoader.js +683 -1
- package/dist/cjs/node_modules/three/examples/jsm/loaders/GLTFLoader.js +4811 -1
- package/dist/cjs/node_modules/three/examples/jsm/loaders/RGBELoader.js +480 -1
- package/dist/cjs/node_modules/three/examples/jsm/renderers/CSS2DRenderer.js +309 -1
- package/dist/cjs/node_modules/three/examples/jsm/utils/BufferGeometryUtils.js +120 -1
- package/dist/cjs/src/analysis/analysis.js +560 -1
- package/dist/cjs/src/analysis/testing.js +958 -1
- package/dist/cjs/src/core/centralPlant.js +1149 -1
- package/dist/cjs/src/core/debugLogger.js +175 -1
- package/dist/cjs/src/core/mathUtils.js +574 -1
- package/dist/cjs/src/core/nameUtils.js +93 -1
- package/dist/cjs/src/data/export.js +716 -1
- package/dist/cjs/src/data/import.js +380 -1
- package/dist/cjs/src/data/numerics.js +522 -1
- package/dist/cjs/src/helpers/sceneHelper.js +572 -1
- package/dist/cjs/src/index.js +69 -1
- package/dist/cjs/src/managers/components/animationManager.js +123 -1
- package/dist/cjs/src/managers/components/componentManager.js +332 -1
- package/dist/cjs/src/managers/components/pathfindingManager.js +1441 -1
- package/dist/cjs/src/managers/controls/TransformControls.js +1063 -1
- package/dist/cjs/src/managers/controls/cameraControlsManager.js +79 -1
- package/dist/cjs/src/managers/controls/dragDropManager.js +1026 -1
- package/dist/cjs/src/managers/controls/keyboardControlsManager.js +395 -1
- package/dist/cjs/src/managers/controls/transformControlsManager.js +1807 -1
- package/dist/cjs/src/managers/environment/environmentManager.js +714 -1
- package/dist/cjs/src/managers/environment/textureConfig.js +229 -1
- package/dist/cjs/src/managers/scene/sceneExportManager.js +264 -1
- package/dist/cjs/src/managers/scene/sceneInitializationManager.js +346 -1
- package/dist/cjs/src/managers/scene/sceneOperationsManager.js +1509 -1
- package/dist/cjs/src/managers/scene/sceneTooltipsManager.js +661 -1
- package/dist/cjs/src/managers/system/disposalManager.js +444 -1
- package/dist/cjs/src/managers/system/hotReloadManager.js +291 -1
- package/dist/cjs/src/managers/system/performanceMonitor.js +863 -1
- package/dist/cjs/src/rendering/modelPreloader.js +369 -1
- package/dist/cjs/src/rendering/rendering2D.js +631 -1
- package/dist/cjs/src/rendering/rendering3D.js +685 -1
- package/dist/esm/_virtual/_rollupPluginBabelHelpers.js +396 -1
- package/dist/esm/node_modules/@2112-lab/pathfinder/dist/index.esm.js +1444 -1
- package/dist/esm/node_modules/three/examples/jsm/controls/OrbitControls.js +1849 -1
- package/dist/esm/node_modules/three/examples/jsm/exporters/GLTFExporter.js +3533 -1
- package/dist/esm/node_modules/three/examples/jsm/exporters/OBJExporter.js +301 -1
- package/dist/esm/node_modules/three/examples/jsm/exporters/PLYExporter.js +538 -1
- package/dist/esm/node_modules/three/examples/jsm/exporters/STLExporter.js +214 -1
- package/dist/esm/node_modules/three/examples/jsm/loaders/DRACOLoader.js +679 -1
- package/dist/esm/node_modules/three/examples/jsm/loaders/GLTFLoader.js +4807 -1
- package/dist/esm/node_modules/three/examples/jsm/loaders/RGBELoader.js +476 -1
- package/dist/esm/node_modules/three/examples/jsm/renderers/CSS2DRenderer.js +304 -1
- package/dist/esm/node_modules/three/examples/jsm/utils/BufferGeometryUtils.js +116 -1
- package/dist/esm/src/analysis/analysis.js +536 -1
- package/dist/esm/src/analysis/testing.js +954 -1
- package/dist/esm/src/core/centralPlant.js +1144 -1
- package/dist/esm/src/core/debugLogger.js +167 -1
- package/dist/esm/src/core/mathUtils.js +570 -1
- package/dist/esm/src/core/nameUtils.js +87 -1
- package/dist/esm/src/data/export.js +712 -1
- package/dist/esm/src/data/import.js +356 -1
- package/dist/esm/src/data/numerics.js +518 -1
- package/dist/esm/src/helpers/sceneHelper.js +547 -1
- package/dist/esm/src/index.js +35 -1
- package/dist/esm/src/managers/components/animationManager.js +119 -1
- package/dist/esm/src/managers/components/componentManager.js +328 -1
- package/dist/esm/src/managers/components/pathfindingManager.js +1417 -1
- package/dist/esm/src/managers/controls/TransformControls.js +1057 -1
- package/dist/esm/src/managers/controls/cameraControlsManager.js +75 -1
- package/dist/esm/src/managers/controls/dragDropManager.js +1002 -1
- package/dist/esm/src/managers/controls/keyboardControlsManager.js +371 -1
- package/dist/esm/src/managers/controls/transformControlsManager.js +1782 -1
- package/dist/esm/src/managers/environment/environmentManager.js +690 -1
- package/dist/esm/src/managers/environment/textureConfig.js +202 -1
- package/dist/esm/src/managers/scene/sceneExportManager.js +260 -1
- package/dist/esm/src/managers/scene/sceneInitializationManager.js +322 -1
- package/dist/esm/src/managers/scene/sceneOperationsManager.js +1485 -1
- package/dist/esm/src/managers/scene/sceneTooltipsManager.js +637 -1
- package/dist/esm/src/managers/system/disposalManager.js +440 -1
- package/dist/esm/src/managers/system/hotReloadManager.js +287 -1
- package/dist/esm/src/managers/system/performanceMonitor.js +858 -1
- package/dist/esm/src/rendering/modelPreloader.js +364 -1
- package/dist/esm/src/rendering/rendering2D.js +627 -1
- package/dist/esm/src/rendering/rendering3D.js +661 -1
- package/package.json +1 -1
|
@@ -1 +1,690 @@
|
|
|
1
|
-
import{createClass as
|
|
1
|
+
import { createClass as _createClass, classCallCheck as _classCallCheck, asyncToGenerator as _asyncToGenerator, regenerator as _regenerator, regeneratorValues as _regeneratorValues, createForOfIteratorHelper as _createForOfIteratorHelper } from '../../../_virtual/_rollupPluginBabelHelpers.js';
|
|
2
|
+
import * as THREE from 'three';
|
|
3
|
+
import { RGBELoader } from '../../../node_modules/three/examples/jsm/loaders/RGBELoader.js';
|
|
4
|
+
import { loadTextureSetAndCreateMaterial } from './textureConfig.js';
|
|
5
|
+
import { logger } from '../../core/debugLogger.js';
|
|
6
|
+
|
|
7
|
+
var EnvironmentManager = /*#__PURE__*/function () {
|
|
8
|
+
function EnvironmentManager(sceneViewer) {
|
|
9
|
+
_classCallCheck(this, EnvironmentManager);
|
|
10
|
+
this.sceneViewer = sceneViewer;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Create skybox with HDR environment mapping
|
|
15
|
+
*/
|
|
16
|
+
return _createClass(EnvironmentManager, [{
|
|
17
|
+
key: "createSkybox",
|
|
18
|
+
value: (function () {
|
|
19
|
+
var _createSkybox = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
|
|
20
|
+
var component, pmremGenerator, loaders, applyEnvironmentMap, _loop, _ret, _i, _loaders, ambientLight, skyScene;
|
|
21
|
+
return _regenerator().w(function (_context3) {
|
|
22
|
+
while (1) switch (_context3.n) {
|
|
23
|
+
case 0:
|
|
24
|
+
component = this.sceneViewer;
|
|
25
|
+
pmremGenerator = new THREE.PMREMGenerator(component.renderer);
|
|
26
|
+
pmremGenerator.compileEquirectangularShader();
|
|
27
|
+
loaders = [{
|
|
28
|
+
type: 'hdr',
|
|
29
|
+
loader: new RGBELoader(),
|
|
30
|
+
paths: ['/skyboxes/kloofendal_48d_partly_cloudy_puresky_2k.hdr', '/skyboxes/kloofendal_48d_partly_cloudy_puresky_1k.hdr']
|
|
31
|
+
}, {
|
|
32
|
+
type: 'jpeg',
|
|
33
|
+
loader: component.textureLoader,
|
|
34
|
+
paths: ['/skyboxes/sky_fallback.jpg']
|
|
35
|
+
}];
|
|
36
|
+
applyEnvironmentMap = function applyEnvironmentMap(envTexture, type) {
|
|
37
|
+
try {
|
|
38
|
+
var _component$scene$envi, _component$scene$back;
|
|
39
|
+
envTexture.mapping = THREE.EquirectangularReflectionMapping;
|
|
40
|
+
var processedEnvMap = pmremGenerator.fromEquirectangular(envTexture).texture;
|
|
41
|
+
if ((_component$scene$envi = component.scene.environment) !== null && _component$scene$envi !== void 0 && _component$scene$envi.dispose) component.scene.environment.dispose();
|
|
42
|
+
if ((_component$scene$back = component.scene.background) !== null && _component$scene$back !== void 0 && _component$scene$back.dispose) component.scene.background.dispose();
|
|
43
|
+
component.scene.environment = processedEnvMap;
|
|
44
|
+
component.scene.background = processedEnvMap;
|
|
45
|
+
envTexture.dispose();
|
|
46
|
+
console.log("\u2705 ".concat(type.toUpperCase(), " environment map applied successfully"));
|
|
47
|
+
return true;
|
|
48
|
+
} catch (error) {
|
|
49
|
+
console.warn("\u274C Failed to apply ".concat(type, " environment map:"), error);
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
_loop = /*#__PURE__*/_regenerator().m(function _loop() {
|
|
54
|
+
var _loaders$_i, type, loader, paths, _iterator, _step, _loop2, _ret2, _t2;
|
|
55
|
+
return _regenerator().w(function (_context2) {
|
|
56
|
+
while (1) switch (_context2.n) {
|
|
57
|
+
case 0:
|
|
58
|
+
_loaders$_i = _loaders[_i], type = _loaders$_i.type, loader = _loaders$_i.loader, paths = _loaders$_i.paths;
|
|
59
|
+
_iterator = _createForOfIteratorHelper(paths);
|
|
60
|
+
_context2.p = 1;
|
|
61
|
+
_loop2 = /*#__PURE__*/_regenerator().m(function _loop2() {
|
|
62
|
+
var path, texture, _t;
|
|
63
|
+
return _regenerator().w(function (_context) {
|
|
64
|
+
while (1) switch (_context.n) {
|
|
65
|
+
case 0:
|
|
66
|
+
path = _step.value;
|
|
67
|
+
_context.p = 1;
|
|
68
|
+
console.log("\uD83D\uDD04 Attempting to load ".concat(type.toUpperCase(), ": ").concat(path));
|
|
69
|
+
_context.n = 2;
|
|
70
|
+
return new Promise(function (resolve, reject) {
|
|
71
|
+
var timeout = setTimeout(function () {
|
|
72
|
+
return reject(new Error('Timeout'));
|
|
73
|
+
}, 10000);
|
|
74
|
+
loader.load(path, function (tex) {
|
|
75
|
+
clearTimeout(timeout);
|
|
76
|
+
resolve(tex);
|
|
77
|
+
}, undefined, function (err) {
|
|
78
|
+
clearTimeout(timeout);
|
|
79
|
+
reject(err);
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
case 2:
|
|
83
|
+
texture = _context.v;
|
|
84
|
+
if (!applyEnvironmentMap(texture, type)) {
|
|
85
|
+
_context.n = 3;
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
pmremGenerator.dispose();
|
|
89
|
+
return _context.a(2, {
|
|
90
|
+
v: {
|
|
91
|
+
v: void 0
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
case 3:
|
|
95
|
+
_context.n = 5;
|
|
96
|
+
break;
|
|
97
|
+
case 4:
|
|
98
|
+
_context.p = 4;
|
|
99
|
+
_t = _context.v;
|
|
100
|
+
console.warn("\u26A0\uFE0F Failed to load ".concat(path, ":"), _t.message);
|
|
101
|
+
case 5:
|
|
102
|
+
return _context.a(2);
|
|
103
|
+
}
|
|
104
|
+
}, _loop2, null, [[1, 4]]);
|
|
105
|
+
});
|
|
106
|
+
_iterator.s();
|
|
107
|
+
case 2:
|
|
108
|
+
if ((_step = _iterator.n()).done) {
|
|
109
|
+
_context2.n = 5;
|
|
110
|
+
break;
|
|
111
|
+
}
|
|
112
|
+
return _context2.d(_regeneratorValues(_loop2()), 3);
|
|
113
|
+
case 3:
|
|
114
|
+
_ret2 = _context2.v;
|
|
115
|
+
if (!_ret2) {
|
|
116
|
+
_context2.n = 4;
|
|
117
|
+
break;
|
|
118
|
+
}
|
|
119
|
+
return _context2.a(2, _ret2.v);
|
|
120
|
+
case 4:
|
|
121
|
+
_context2.n = 2;
|
|
122
|
+
break;
|
|
123
|
+
case 5:
|
|
124
|
+
_context2.n = 7;
|
|
125
|
+
break;
|
|
126
|
+
case 6:
|
|
127
|
+
_context2.p = 6;
|
|
128
|
+
_t2 = _context2.v;
|
|
129
|
+
_iterator.e(_t2);
|
|
130
|
+
case 7:
|
|
131
|
+
_context2.p = 7;
|
|
132
|
+
_iterator.f();
|
|
133
|
+
return _context2.f(7);
|
|
134
|
+
case 8:
|
|
135
|
+
return _context2.a(2);
|
|
136
|
+
}
|
|
137
|
+
}, _loop, null, [[1, 6, 7, 8]]);
|
|
138
|
+
});
|
|
139
|
+
_i = 0, _loaders = loaders;
|
|
140
|
+
case 1:
|
|
141
|
+
if (!(_i < _loaders.length)) {
|
|
142
|
+
_context3.n = 4;
|
|
143
|
+
break;
|
|
144
|
+
}
|
|
145
|
+
return _context3.d(_regeneratorValues(_loop()), 2);
|
|
146
|
+
case 2:
|
|
147
|
+
_ret = _context3.v;
|
|
148
|
+
if (!_ret) {
|
|
149
|
+
_context3.n = 3;
|
|
150
|
+
break;
|
|
151
|
+
}
|
|
152
|
+
return _context3.a(2, _ret.v);
|
|
153
|
+
case 3:
|
|
154
|
+
_i++;
|
|
155
|
+
_context3.n = 1;
|
|
156
|
+
break;
|
|
157
|
+
case 4:
|
|
158
|
+
console.log('🎨 Using procedural sky fallback');
|
|
159
|
+
ambientLight = new THREE.AmbientLight(0xffffff, 0.6);
|
|
160
|
+
component.scene.add(ambientLight);
|
|
161
|
+
skyScene = new THREE.Scene();
|
|
162
|
+
skyScene.add(new THREE.HemisphereLight(0x87CEEB, 0x444477, 1));
|
|
163
|
+
component.scene.environment = pmremGenerator.fromScene(skyScene).texture;
|
|
164
|
+
component.scene.background = new THREE.Color(0x87CEEB);
|
|
165
|
+
pmremGenerator.dispose();
|
|
166
|
+
case 5:
|
|
167
|
+
return _context3.a(2);
|
|
168
|
+
}
|
|
169
|
+
}, _callee, this);
|
|
170
|
+
}));
|
|
171
|
+
function createSkybox() {
|
|
172
|
+
return _createSkybox.apply(this, arguments);
|
|
173
|
+
}
|
|
174
|
+
return createSkybox;
|
|
175
|
+
}()
|
|
176
|
+
/**
|
|
177
|
+
* Setup scene lighting
|
|
178
|
+
*/
|
|
179
|
+
)
|
|
180
|
+
}, {
|
|
181
|
+
key: "setupLighting",
|
|
182
|
+
value: function setupLighting() {
|
|
183
|
+
var component = this.sceneViewer;
|
|
184
|
+
|
|
185
|
+
// Remove existing lights
|
|
186
|
+
component.scene.children = component.scene.children.filter(function (child) {
|
|
187
|
+
return !(child instanceof THREE.Light);
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
// Sun light (main directional light)
|
|
191
|
+
var sunLight = new THREE.DirectionalLight(0xffffeb, 5);
|
|
192
|
+
sunLight.position.set(15, 30, -10);
|
|
193
|
+
sunLight.castShadow = true;
|
|
194
|
+
sunLight.shadow.camera.near = 0.1;
|
|
195
|
+
sunLight.shadow.camera.far = 100;
|
|
196
|
+
sunLight.shadow.camera.left = -50;
|
|
197
|
+
sunLight.shadow.camera.right = 50;
|
|
198
|
+
sunLight.shadow.camera.top = 50;
|
|
199
|
+
sunLight.shadow.camera.bottom = -50;
|
|
200
|
+
sunLight.shadow.mapSize.width = 2048;
|
|
201
|
+
sunLight.shadow.mapSize.height = 2048;
|
|
202
|
+
component.scene.add(sunLight);
|
|
203
|
+
// component.scene.add(sunLight.target)
|
|
204
|
+
|
|
205
|
+
// // Ambient hemispheric light
|
|
206
|
+
// const ambientLight = new THREE.HemisphereLight(0xffffff, 0x444466, 0.35)
|
|
207
|
+
// component.scene.add(ambientLight)
|
|
208
|
+
|
|
209
|
+
// Fill light (secondary directional light)
|
|
210
|
+
var fillLight = new THREE.DirectionalLight(0xffffcc, 0.4);
|
|
211
|
+
fillLight.position.set(-10, 10, -10);
|
|
212
|
+
component.scene.add(fillLight);
|
|
213
|
+
|
|
214
|
+
// // Rim light (for edge definition)
|
|
215
|
+
// const rimLight = new THREE.DirectionalLight(0xffffff, 0.9)
|
|
216
|
+
// rimLight.position.set(0, 0, -20)
|
|
217
|
+
// component.scene.add(rimLight)
|
|
218
|
+
|
|
219
|
+
// // Spot light (for focused illumination)
|
|
220
|
+
// const spotLight = new THREE.SpotLight(0xffffff, 0.5)
|
|
221
|
+
// spotLight.position.set(5, 15, 5)
|
|
222
|
+
// spotLight.angle = Math.PI / 6
|
|
223
|
+
// spotLight.penumbra = 0.3
|
|
224
|
+
// spotLight.decay = 1.5
|
|
225
|
+
// spotLight.distance = 50
|
|
226
|
+
// spotLight.castShadow = true
|
|
227
|
+
// spotLight.shadow.bias = -0.0003
|
|
228
|
+
// spotLight.shadow.mapSize.width = 2048
|
|
229
|
+
// spotLight.shadow.mapSize.height = 2048
|
|
230
|
+
// component.scene.add(spotLight)
|
|
231
|
+
|
|
232
|
+
logger.info('Scene lighting setup completed');
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/**
|
|
236
|
+
* Add textured ground plane
|
|
237
|
+
*/
|
|
238
|
+
}, {
|
|
239
|
+
key: "addTexturedGround",
|
|
240
|
+
value: (function () {
|
|
241
|
+
var _addTexturedGround = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2() {
|
|
242
|
+
var component, groundSize, groundGeometry, groundMaterial, ground, texturedMaterial, _t3;
|
|
243
|
+
return _regenerator().w(function (_context4) {
|
|
244
|
+
while (1) switch (_context4.n) {
|
|
245
|
+
case 0:
|
|
246
|
+
component = this.sceneViewer;
|
|
247
|
+
logger.debug('Starting addTexturedGround...');
|
|
248
|
+
groundSize = 30;
|
|
249
|
+
groundGeometry = new THREE.PlaneGeometry(groundSize, groundSize);
|
|
250
|
+
groundMaterial = new THREE.MeshStandardMaterial({
|
|
251
|
+
color: 0x777777,
|
|
252
|
+
metalness: 0.2,
|
|
253
|
+
roughness: 0.9
|
|
254
|
+
});
|
|
255
|
+
ground = new THREE.Mesh(groundGeometry, groundMaterial);
|
|
256
|
+
ground.rotation.x = -Math.PI / 2;
|
|
257
|
+
ground.position.y = 0;
|
|
258
|
+
ground.receiveShadow = true;
|
|
259
|
+
ground.name = 'Ground';
|
|
260
|
+
ground.userData.isBaseGround = true;
|
|
261
|
+
component.scene.add(ground);
|
|
262
|
+
_context4.p = 1;
|
|
263
|
+
logger.debug('Loading concrete texture set...');
|
|
264
|
+
_context4.n = 2;
|
|
265
|
+
return loadTextureSetAndCreateMaterial('gravel_embedded_concrete', component.textureLoader);
|
|
266
|
+
case 2:
|
|
267
|
+
texturedMaterial = _context4.v;
|
|
268
|
+
ground.material = texturedMaterial;
|
|
269
|
+
ground.material.needsUpdate = true;
|
|
270
|
+
logger.success('Ground material updated with textures');
|
|
271
|
+
_context4.n = 4;
|
|
272
|
+
break;
|
|
273
|
+
case 3:
|
|
274
|
+
_context4.p = 3;
|
|
275
|
+
_t3 = _context4.v;
|
|
276
|
+
logger.warn('Error loading ground textures:', _t3);
|
|
277
|
+
case 4:
|
|
278
|
+
return _context4.a(2);
|
|
279
|
+
}
|
|
280
|
+
}, _callee2, this, [[1, 3]]);
|
|
281
|
+
}));
|
|
282
|
+
function addTexturedGround() {
|
|
283
|
+
return _addTexturedGround.apply(this, arguments);
|
|
284
|
+
}
|
|
285
|
+
return addTexturedGround;
|
|
286
|
+
}()
|
|
287
|
+
/**
|
|
288
|
+
* Add brick walls around the scene
|
|
289
|
+
*/
|
|
290
|
+
)
|
|
291
|
+
}, {
|
|
292
|
+
key: "addBrickWalls",
|
|
293
|
+
value: (function () {
|
|
294
|
+
var _addBrickWalls = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3() {
|
|
295
|
+
var component, wallHeight, wallThickness, groundSize, halfGroundSize, brickMaterial, createWalls, texturedBrickMaterial, _t4;
|
|
296
|
+
return _regenerator().w(function (_context5) {
|
|
297
|
+
while (1) switch (_context5.n) {
|
|
298
|
+
case 0:
|
|
299
|
+
component = this.sceneViewer;
|
|
300
|
+
logger.debug('Starting addBrickWalls...');
|
|
301
|
+
wallHeight = 2.5;
|
|
302
|
+
wallThickness = 0.5;
|
|
303
|
+
groundSize = 30;
|
|
304
|
+
halfGroundSize = groundSize / 2;
|
|
305
|
+
brickMaterial = new THREE.MeshPhysicalMaterial({
|
|
306
|
+
color: 0x776362,
|
|
307
|
+
roughness: 0.9,
|
|
308
|
+
metalness: 0.1,
|
|
309
|
+
clearcoat: 0.05,
|
|
310
|
+
clearcoatRoughness: 0.4
|
|
311
|
+
});
|
|
312
|
+
createWalls = function createWalls(material) {
|
|
313
|
+
var createWall = function createWall(width, height, depth, x, y, z) {
|
|
314
|
+
var rotation = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : 0;
|
|
315
|
+
var textureScaleY = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : 1;
|
|
316
|
+
var geometry = new THREE.BoxGeometry(width, height, depth);
|
|
317
|
+
if (textureScaleY !== 1) {
|
|
318
|
+
var uvAttribute = geometry.attributes.uv;
|
|
319
|
+
var uvArray = uvAttribute.array;
|
|
320
|
+
for (var i = 0; i < uvArray.length; i += 2) {
|
|
321
|
+
uvArray[i + 1] *= textureScaleY;
|
|
322
|
+
}
|
|
323
|
+
uvAttribute.needsUpdate = true;
|
|
324
|
+
}
|
|
325
|
+
var wall = new THREE.Mesh(geometry, material);
|
|
326
|
+
wall.position.set(x, y - 0.56, z);
|
|
327
|
+
if (rotation !== 0) {
|
|
328
|
+
wall.rotateY(rotation);
|
|
329
|
+
}
|
|
330
|
+
wall.userData.isBrickWall = true;
|
|
331
|
+
wall.castShadow = true;
|
|
332
|
+
wall.receiveShadow = true;
|
|
333
|
+
wall.name = "Wall";
|
|
334
|
+
component.scene.add(wall);
|
|
335
|
+
return wall;
|
|
336
|
+
};
|
|
337
|
+
|
|
338
|
+
// Create walls with optimized direct values
|
|
339
|
+
createWall(groundSize, wallHeight, wallThickness, 0, wallHeight / 2, halfGroundSize - wallThickness / 2, 0, 1.0);
|
|
340
|
+
createWall(groundSize, wallHeight, wallThickness, 0, wallHeight / 2, -halfGroundSize + wallThickness / 2, 0, 1.0);
|
|
341
|
+
createWall(wallThickness, wallHeight + 6.0, groundSize - wallThickness * 2, halfGroundSize - wallThickness / 2, (wallHeight + 6.0) / 2, 0, 0, (wallHeight + 6.0) / wallHeight);
|
|
342
|
+
createWall(wallThickness, wallHeight, groundSize - wallThickness * 2, -halfGroundSize + wallThickness / 2, wallHeight / 2, 0, 0, 1.0);
|
|
343
|
+
};
|
|
344
|
+
createWalls(brickMaterial);
|
|
345
|
+
logger.debug('Basic brick walls created');
|
|
346
|
+
_context5.p = 1;
|
|
347
|
+
logger.debug('Loading brick texture set...');
|
|
348
|
+
_context5.n = 2;
|
|
349
|
+
return loadTextureSetAndCreateMaterial('brick', component.textureLoader);
|
|
350
|
+
case 2:
|
|
351
|
+
texturedBrickMaterial = _context5.v;
|
|
352
|
+
component.scene.traverse(function (object) {
|
|
353
|
+
if (object.isMesh && object.userData.isBrickWall) {
|
|
354
|
+
object.material = texturedBrickMaterial;
|
|
355
|
+
object.material.needsUpdate = true;
|
|
356
|
+
}
|
|
357
|
+
});
|
|
358
|
+
logger.success('Brick walls updated with textures');
|
|
359
|
+
_context5.n = 4;
|
|
360
|
+
break;
|
|
361
|
+
case 3:
|
|
362
|
+
_context5.p = 3;
|
|
363
|
+
_t4 = _context5.v;
|
|
364
|
+
logger.warn('Error loading brick textures:', _t4);
|
|
365
|
+
case 4:
|
|
366
|
+
return _context5.a(2);
|
|
367
|
+
}
|
|
368
|
+
}, _callee3, this, [[1, 3]]);
|
|
369
|
+
}));
|
|
370
|
+
function addBrickWalls() {
|
|
371
|
+
return _addBrickWalls.apply(this, arguments);
|
|
372
|
+
}
|
|
373
|
+
return addBrickWalls;
|
|
374
|
+
}()
|
|
375
|
+
/**
|
|
376
|
+
* Add horizon fog effect
|
|
377
|
+
*/
|
|
378
|
+
)
|
|
379
|
+
}, {
|
|
380
|
+
key: "addHorizonFog",
|
|
381
|
+
value: function addHorizonFog() {
|
|
382
|
+
var component = this.sceneViewer;
|
|
383
|
+
var groundSize = 30;
|
|
384
|
+
var fogSize = groundSize * 10;
|
|
385
|
+
var fogMaterial = new THREE.ShaderMaterial({
|
|
386
|
+
transparent: true,
|
|
387
|
+
uniforms: {
|
|
388
|
+
fogColor: {
|
|
389
|
+
value: new THREE.Color(0x546E7A)
|
|
390
|
+
},
|
|
391
|
+
fogDensity: {
|
|
392
|
+
value: 1
|
|
393
|
+
}
|
|
394
|
+
},
|
|
395
|
+
vertexShader: "\n varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }\n ",
|
|
396
|
+
fragmentShader: "\n uniform vec3 fogColor;\n uniform float fogDensity;\n varying vec2 vUv;\n \n void main() {\n vec2 center = vec2(0.5, 0.5);\n float dist = distance(vUv, center);\n float opacity = (1.0 - smoothstep(0.0, 0.5, dist)) * fogDensity;\n gl_FragColor = vec4(fogColor, opacity);\n }\n ",
|
|
397
|
+
side: THREE.DoubleSide
|
|
398
|
+
});
|
|
399
|
+
var fogGeometry = new THREE.PlaneGeometry(fogSize, fogSize);
|
|
400
|
+
var fogPlane = new THREE.Mesh(fogGeometry, fogMaterial);
|
|
401
|
+
fogPlane.rotation.x = -Math.PI / 2;
|
|
402
|
+
fogPlane.position.y = -3.0;
|
|
403
|
+
fogPlane.name = "fogPlane";
|
|
404
|
+
component.scene.add(fogPlane);
|
|
405
|
+
return fogPlane;
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
/**
|
|
409
|
+
* Initialize complete environment
|
|
410
|
+
*/
|
|
411
|
+
}, {
|
|
412
|
+
key: "initializeEnvironment",
|
|
413
|
+
value: (function () {
|
|
414
|
+
var _initializeEnvironment = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4() {
|
|
415
|
+
return _regenerator().w(function (_context6) {
|
|
416
|
+
while (1) switch (_context6.n) {
|
|
417
|
+
case 0:
|
|
418
|
+
_context6.n = 1;
|
|
419
|
+
return this.createSkybox();
|
|
420
|
+
case 1:
|
|
421
|
+
this.setupLighting();
|
|
422
|
+
_context6.n = 2;
|
|
423
|
+
return this.addTexturedGround();
|
|
424
|
+
case 2:
|
|
425
|
+
_context6.n = 3;
|
|
426
|
+
return this.addBrickWalls();
|
|
427
|
+
case 3:
|
|
428
|
+
this.addHorizonFog();
|
|
429
|
+
logger.info('Environment initialization completed');
|
|
430
|
+
case 4:
|
|
431
|
+
return _context6.a(2);
|
|
432
|
+
}
|
|
433
|
+
}, _callee4, this);
|
|
434
|
+
}));
|
|
435
|
+
function initializeEnvironment() {
|
|
436
|
+
return _initializeEnvironment.apply(this, arguments);
|
|
437
|
+
}
|
|
438
|
+
return initializeEnvironment;
|
|
439
|
+
}()
|
|
440
|
+
/**
|
|
441
|
+
* Remove the current skybox and reset to a plain background
|
|
442
|
+
*/
|
|
443
|
+
)
|
|
444
|
+
}, {
|
|
445
|
+
key: "removeSkybox",
|
|
446
|
+
value: function removeSkybox() {
|
|
447
|
+
var component = this.sceneViewer;
|
|
448
|
+
try {
|
|
449
|
+
var _component$scene$envi2, _component$scene$back2;
|
|
450
|
+
// Dispose of current environment and background textures
|
|
451
|
+
if ((_component$scene$envi2 = component.scene.environment) !== null && _component$scene$envi2 !== void 0 && _component$scene$envi2.dispose) {
|
|
452
|
+
component.scene.environment.dispose();
|
|
453
|
+
}
|
|
454
|
+
if ((_component$scene$back2 = component.scene.background) !== null && _component$scene$back2 !== void 0 && _component$scene$back2.dispose) {
|
|
455
|
+
component.scene.background.dispose();
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
// Set to null/plain background
|
|
459
|
+
component.scene.environment = null;
|
|
460
|
+
component.scene.background = new THREE.Color(0xffffff); // White background
|
|
461
|
+
|
|
462
|
+
logger.info('Skybox removed successfully');
|
|
463
|
+
return true;
|
|
464
|
+
} catch (error) {
|
|
465
|
+
console.error('❌ Error removing skybox:', error);
|
|
466
|
+
return false;
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
/**
|
|
471
|
+
* Set the skybox type dynamically
|
|
472
|
+
* @param {string} skyboxType - 'HDR', 'Fallback', or 'Color'
|
|
473
|
+
*/
|
|
474
|
+
}, {
|
|
475
|
+
key: "setSkyboxType",
|
|
476
|
+
value: (function () {
|
|
477
|
+
var _setSkyboxType = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee5(skyboxType) {
|
|
478
|
+
var component, _component$scene$envi3, _component$scene$back3, _pmremGenerator, _t5, _t6;
|
|
479
|
+
return _regenerator().w(function (_context7) {
|
|
480
|
+
while (1) switch (_context7.n) {
|
|
481
|
+
case 0:
|
|
482
|
+
component = this.sceneViewer;
|
|
483
|
+
_context7.p = 1;
|
|
484
|
+
console.log("\uD83C\uDF0C Changing skybox type to: ".concat(skyboxType));
|
|
485
|
+
|
|
486
|
+
// Dispose of current environment textures
|
|
487
|
+
if ((_component$scene$envi3 = component.scene.environment) !== null && _component$scene$envi3 !== void 0 && _component$scene$envi3.dispose) {
|
|
488
|
+
component.scene.environment.dispose();
|
|
489
|
+
}
|
|
490
|
+
if ((_component$scene$back3 = component.scene.background) !== null && _component$scene$back3 !== void 0 && _component$scene$back3.dispose) {
|
|
491
|
+
component.scene.background.dispose();
|
|
492
|
+
}
|
|
493
|
+
_pmremGenerator = new THREE.PMREMGenerator(component.renderer);
|
|
494
|
+
_pmremGenerator.compileEquirectangularShader();
|
|
495
|
+
_t5 = skyboxType;
|
|
496
|
+
_context7.n = _t5 === 'HDR' ? 2 : _t5 === 'Fallback' ? 4 : _t5 === 'Color' ? 6 : 7;
|
|
497
|
+
break;
|
|
498
|
+
case 2:
|
|
499
|
+
_context7.n = 3;
|
|
500
|
+
return this.loadHDRSkybox(_pmremGenerator);
|
|
501
|
+
case 3:
|
|
502
|
+
return _context7.a(3, 8);
|
|
503
|
+
case 4:
|
|
504
|
+
_context7.n = 5;
|
|
505
|
+
return this.loadFallbackSkybox(_pmremGenerator);
|
|
506
|
+
case 5:
|
|
507
|
+
return _context7.a(3, 8);
|
|
508
|
+
case 6:
|
|
509
|
+
this.setColorBackground();
|
|
510
|
+
return _context7.a(3, 8);
|
|
511
|
+
case 7:
|
|
512
|
+
console.warn("Unknown skybox type: ".concat(skyboxType, ", falling back to HDR"));
|
|
513
|
+
_context7.n = 8;
|
|
514
|
+
return this.loadHDRSkybox(_pmremGenerator);
|
|
515
|
+
case 8:
|
|
516
|
+
_pmremGenerator.dispose();
|
|
517
|
+
logger.info("Skybox type changed to: ".concat(skyboxType));
|
|
518
|
+
return _context7.a(2, true);
|
|
519
|
+
case 9:
|
|
520
|
+
_context7.p = 9;
|
|
521
|
+
_t6 = _context7.v;
|
|
522
|
+
console.error('❌ Error setting skybox type:', _t6);
|
|
523
|
+
return _context7.a(2, false);
|
|
524
|
+
}
|
|
525
|
+
}, _callee5, this, [[1, 9]]);
|
|
526
|
+
}));
|
|
527
|
+
function setSkyboxType(_x) {
|
|
528
|
+
return _setSkyboxType.apply(this, arguments);
|
|
529
|
+
}
|
|
530
|
+
return setSkyboxType;
|
|
531
|
+
}()
|
|
532
|
+
/**
|
|
533
|
+
* Load HDR skybox specifically
|
|
534
|
+
*/
|
|
535
|
+
)
|
|
536
|
+
}, {
|
|
537
|
+
key: "loadHDRSkybox",
|
|
538
|
+
value: (function () {
|
|
539
|
+
var _loadHDRSkybox = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee6(pmremGenerator) {
|
|
540
|
+
var component, rgbeLoader, hdrPaths, _loop3, _ret3, _i2, _hdrPaths;
|
|
541
|
+
return _regenerator().w(function (_context9) {
|
|
542
|
+
while (1) switch (_context9.n) {
|
|
543
|
+
case 0:
|
|
544
|
+
component = this.sceneViewer;
|
|
545
|
+
rgbeLoader = new RGBELoader();
|
|
546
|
+
hdrPaths = ['/skyboxes/kloofendal_48d_partly_cloudy_puresky_2k.hdr', '/skyboxes/kloofendal_48d_partly_cloudy_puresky_1k.hdr'];
|
|
547
|
+
_loop3 = /*#__PURE__*/_regenerator().m(function _loop3() {
|
|
548
|
+
var path, texture, processedEnvMap, _t7;
|
|
549
|
+
return _regenerator().w(function (_context8) {
|
|
550
|
+
while (1) switch (_context8.n) {
|
|
551
|
+
case 0:
|
|
552
|
+
path = _hdrPaths[_i2];
|
|
553
|
+
_context8.p = 1;
|
|
554
|
+
console.log("\uD83D\uDD04 Loading HDR: ".concat(path));
|
|
555
|
+
_context8.n = 2;
|
|
556
|
+
return new Promise(function (resolve, reject) {
|
|
557
|
+
var timeout = setTimeout(function () {
|
|
558
|
+
return reject(new Error('Timeout'));
|
|
559
|
+
}, 10000);
|
|
560
|
+
rgbeLoader.load(path, function (tex) {
|
|
561
|
+
clearTimeout(timeout);
|
|
562
|
+
resolve(tex);
|
|
563
|
+
}, undefined, function (err) {
|
|
564
|
+
clearTimeout(timeout);
|
|
565
|
+
reject(err);
|
|
566
|
+
});
|
|
567
|
+
});
|
|
568
|
+
case 2:
|
|
569
|
+
texture = _context8.v;
|
|
570
|
+
texture.mapping = THREE.EquirectangularReflectionMapping;
|
|
571
|
+
processedEnvMap = pmremGenerator.fromEquirectangular(texture).texture;
|
|
572
|
+
component.scene.environment = processedEnvMap;
|
|
573
|
+
component.scene.background = processedEnvMap;
|
|
574
|
+
texture.dispose();
|
|
575
|
+
console.log('✅ HDR skybox loaded successfully');
|
|
576
|
+
return _context8.a(2, {
|
|
577
|
+
v: void 0
|
|
578
|
+
});
|
|
579
|
+
case 3:
|
|
580
|
+
_context8.p = 3;
|
|
581
|
+
_t7 = _context8.v;
|
|
582
|
+
console.warn("\u26A0\uFE0F Failed to load HDR skybox ".concat(path, ":"), _t7.message);
|
|
583
|
+
case 4:
|
|
584
|
+
return _context8.a(2);
|
|
585
|
+
}
|
|
586
|
+
}, _loop3, null, [[1, 3]]);
|
|
587
|
+
});
|
|
588
|
+
_i2 = 0, _hdrPaths = hdrPaths;
|
|
589
|
+
case 1:
|
|
590
|
+
if (!(_i2 < _hdrPaths.length)) {
|
|
591
|
+
_context9.n = 4;
|
|
592
|
+
break;
|
|
593
|
+
}
|
|
594
|
+
return _context9.d(_regeneratorValues(_loop3()), 2);
|
|
595
|
+
case 2:
|
|
596
|
+
_ret3 = _context9.v;
|
|
597
|
+
if (!_ret3) {
|
|
598
|
+
_context9.n = 3;
|
|
599
|
+
break;
|
|
600
|
+
}
|
|
601
|
+
return _context9.a(2, _ret3.v);
|
|
602
|
+
case 3:
|
|
603
|
+
_i2++;
|
|
604
|
+
_context9.n = 1;
|
|
605
|
+
break;
|
|
606
|
+
case 4:
|
|
607
|
+
throw new Error('Failed to load any HDR skybox');
|
|
608
|
+
case 5:
|
|
609
|
+
return _context9.a(2);
|
|
610
|
+
}
|
|
611
|
+
}, _callee6, this);
|
|
612
|
+
}));
|
|
613
|
+
function loadHDRSkybox(_x2) {
|
|
614
|
+
return _loadHDRSkybox.apply(this, arguments);
|
|
615
|
+
}
|
|
616
|
+
return loadHDRSkybox;
|
|
617
|
+
}()
|
|
618
|
+
/**
|
|
619
|
+
* Load fallback JPEG skybox
|
|
620
|
+
*/
|
|
621
|
+
)
|
|
622
|
+
}, {
|
|
623
|
+
key: "loadFallbackSkybox",
|
|
624
|
+
value: (function () {
|
|
625
|
+
var _loadFallbackSkybox = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee7(pmremGenerator) {
|
|
626
|
+
var component, texture, processedEnvMap, _t8;
|
|
627
|
+
return _regenerator().w(function (_context0) {
|
|
628
|
+
while (1) switch (_context0.n) {
|
|
629
|
+
case 0:
|
|
630
|
+
component = this.sceneViewer;
|
|
631
|
+
_context0.p = 1;
|
|
632
|
+
console.log('🔄 Loading fallback skybox');
|
|
633
|
+
_context0.n = 2;
|
|
634
|
+
return new Promise(function (resolve, reject) {
|
|
635
|
+
var timeout = setTimeout(function () {
|
|
636
|
+
return reject(new Error('Timeout'));
|
|
637
|
+
}, 10000);
|
|
638
|
+
component.textureLoader.load('/skyboxes/sky_fallback.jpg', function (tex) {
|
|
639
|
+
clearTimeout(timeout);
|
|
640
|
+
resolve(tex);
|
|
641
|
+
}, undefined, function (err) {
|
|
642
|
+
clearTimeout(timeout);
|
|
643
|
+
reject(err);
|
|
644
|
+
});
|
|
645
|
+
});
|
|
646
|
+
case 2:
|
|
647
|
+
texture = _context0.v;
|
|
648
|
+
texture.mapping = THREE.EquirectangularReflectionMapping;
|
|
649
|
+
processedEnvMap = pmremGenerator.fromEquirectangular(texture).texture;
|
|
650
|
+
component.scene.environment = processedEnvMap;
|
|
651
|
+
component.scene.background = processedEnvMap;
|
|
652
|
+
texture.dispose();
|
|
653
|
+
console.log('✅ Fallback skybox loaded successfully');
|
|
654
|
+
_context0.n = 4;
|
|
655
|
+
break;
|
|
656
|
+
case 3:
|
|
657
|
+
_context0.p = 3;
|
|
658
|
+
_t8 = _context0.v;
|
|
659
|
+
console.warn('⚠️ Failed to load fallback skybox:', _t8.message);
|
|
660
|
+
throw _t8;
|
|
661
|
+
case 4:
|
|
662
|
+
return _context0.a(2);
|
|
663
|
+
}
|
|
664
|
+
}, _callee7, this, [[1, 3]]);
|
|
665
|
+
}));
|
|
666
|
+
function loadFallbackSkybox(_x3) {
|
|
667
|
+
return _loadFallbackSkybox.apply(this, arguments);
|
|
668
|
+
}
|
|
669
|
+
return loadFallbackSkybox;
|
|
670
|
+
}()
|
|
671
|
+
/**
|
|
672
|
+
* Set solid color background
|
|
673
|
+
*/
|
|
674
|
+
)
|
|
675
|
+
}, {
|
|
676
|
+
key: "setColorBackground",
|
|
677
|
+
value: function setColorBackground() {
|
|
678
|
+
var component = this.sceneViewer;
|
|
679
|
+
component.scene.environment = null;
|
|
680
|
+
component.scene.background = new THREE.Color(0xffffff); // White background
|
|
681
|
+
|
|
682
|
+
// Add basic ambient lighting since we don't have environment lighting
|
|
683
|
+
var ambientLight = new THREE.AmbientLight(0xffffff, 0.6);
|
|
684
|
+
component.scene.add(ambientLight);
|
|
685
|
+
console.log('✅ Color background set successfully');
|
|
686
|
+
}
|
|
687
|
+
}]);
|
|
688
|
+
}();
|
|
689
|
+
|
|
690
|
+
export { EnvironmentManager };
|