@2112-lab/central-plant 0.1.6 → 0.1.7

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.
@@ -21807,6 +21807,801 @@ var SceneHelper = /*#__PURE__*/function () {
21807
21807
  }]);
21808
21808
  }();
21809
21809
 
21810
+ var SceneViewer = /*#__PURE__*/function () {
21811
+ /**
21812
+ * Initialize the SceneViewer
21813
+ * @param {HTMLElement} container - DOM element to render the scene
21814
+ * @param {Object} options - Configuration options
21815
+ * @param {Object} centralPlant - CentralPlant instance for managers
21816
+ */
21817
+ function SceneViewer(container) {
21818
+ var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
21819
+ var centralPlant = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
21820
+ _classCallCheck(this, SceneViewer);
21821
+ // Core properties
21822
+ this.container = container;
21823
+ this.centralPlant = centralPlant;
21824
+ this.options = _objectSpread2({
21825
+ enableAutoRotation: false,
21826
+ enableShadows: true,
21827
+ enableBloom: true,
21828
+ enableSSAO: false,
21829
+ antialias: true,
21830
+ pixelRatio: Math.min(window.devicePixelRatio, 2)
21831
+ }, options);
21832
+
21833
+ // Instance tracking for hot-reload handling
21834
+ this.instanceId = Date.now() + Math.random();
21835
+
21836
+ // Core Three.js objects
21837
+ this.scene = null;
21838
+ this.camera = null;
21839
+ this.renderer = null;
21840
+ this.controls = null;
21841
+ this.composer = null;
21842
+ this.bloomPass = null;
21843
+ this.ssaoPass = null;
21844
+
21845
+ // Utilities
21846
+ this.textureLoader = null;
21847
+ this.gltfLoader = null;
21848
+ this.envMap = null;
21849
+ this.performanceMonitor = null;
21850
+ this.resizeObserver = null;
21851
+
21852
+ // Scene data
21853
+ this.currentSceneData = null;
21854
+
21855
+ // State flags
21856
+ this.isDestroyed = false;
21857
+ this.isInitialized = false;
21858
+
21859
+ // Transform controls
21860
+ this.transformManager = null;
21861
+ this.selectedObjectForTransform = null;
21862
+ this.transformMode = 'translate';
21863
+ this.transformSpace = 'world';
21864
+ this.transformHistory = [];
21865
+ this.previousTransformValues = null;
21866
+
21867
+ // Manager instances (will be attached from centralPlant)
21868
+ this.managers = {};
21869
+
21870
+ // Event system for communication with external systems
21871
+ this.eventCallbacks = new Map();
21872
+
21873
+ // Drag and drop state
21874
+ this.isDragOver = false;
21875
+ this.dragDropManager = null;
21876
+
21877
+ // Scene helper utility
21878
+ this.sceneHelper = null;
21879
+
21880
+ // Pathfinder version cache
21881
+ this.pathfinderVersionInfo = null;
21882
+
21883
+ // Transform settings
21884
+ this.shouldUpdatePaths = true;
21885
+
21886
+ // Initialize the scene viewer
21887
+ this.init();
21888
+ }
21889
+
21890
+ /**
21891
+ * Initialize the Three.js scene and all components
21892
+ */
21893
+ return _createClass(SceneViewer, [{
21894
+ key: "init",
21895
+ value: (function () {
21896
+ var _init = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
21897
+ var _t;
21898
+ return _regenerator().w(function (_context) {
21899
+ while (1) switch (_context.n) {
21900
+ case 0:
21901
+ _context.p = 0;
21902
+ console.log('🚀 Initializing SceneViewer...', {
21903
+ instanceId: this.instanceId,
21904
+ containerSize: {
21905
+ width: this.container.clientWidth,
21906
+ height: this.container.clientHeight
21907
+ }
21908
+ });
21909
+
21910
+ // Attach managers from centralPlant if available
21911
+ if (this.centralPlant) {
21912
+ this.attachManagers();
21913
+ }
21914
+
21915
+ // Initialize Three.js components
21916
+ this.initScene();
21917
+ this.initCamera();
21918
+ this.initRenderer();
21919
+ this.initLights();
21920
+ this.initControls();
21921
+ this.initPostProcessing();
21922
+ this.initEventListeners();
21923
+
21924
+ // Initialize managers that require scene to be ready
21925
+ _context.n = 1;
21926
+ return this.initializeSceneManagers();
21927
+ case 1:
21928
+ // Start the animation loop
21929
+ this.animate();
21930
+ this.isInitialized = true;
21931
+ this.emit('initialized', {
21932
+ sceneViewer: this
21933
+ });
21934
+ console.log('✅ SceneViewer initialization completed');
21935
+ _context.n = 3;
21936
+ break;
21937
+ case 2:
21938
+ _context.p = 2;
21939
+ _t = _context.v;
21940
+ console.error('❌ Error initializing SceneViewer:', _t);
21941
+ this.emit('error', {
21942
+ error: _t,
21943
+ phase: 'initialization'
21944
+ });
21945
+ case 3:
21946
+ return _context.a(2);
21947
+ }
21948
+ }, _callee, this, [[0, 2]]);
21949
+ }));
21950
+ function init() {
21951
+ return _init.apply(this, arguments);
21952
+ }
21953
+ return init;
21954
+ }()
21955
+ /**
21956
+ * Attach managers from centralPlant
21957
+ */
21958
+ )
21959
+ }, {
21960
+ key: "attachManagers",
21961
+ value: function attachManagers() {
21962
+ var _this = this;
21963
+ if (!this.centralPlant) return;
21964
+
21965
+ // Get all managers from centralPlant
21966
+ var managers = this.centralPlant.getAllManagers();
21967
+
21968
+ // Attach each manager to this instance
21969
+ Object.entries(managers).forEach(function (_ref) {
21970
+ var _ref2 = _slicedToArray(_ref, 2),
21971
+ key = _ref2[0],
21972
+ manager = _ref2[1];
21973
+ _this[key] = manager;
21974
+ _this.managers[key] = manager;
21975
+ });
21976
+
21977
+ // Also attach utilities
21978
+ var utilities = this.centralPlant.getAllUtilities();
21979
+ Object.entries(utilities).forEach(function (_ref3) {
21980
+ var _ref4 = _slicedToArray(_ref3, 2),
21981
+ key = _ref4[0],
21982
+ utility = _ref4[1];
21983
+ _this[key] = utility;
21984
+ });
21985
+ console.log('📦 Managers attached to SceneViewer:', Object.keys(managers));
21986
+ }
21987
+
21988
+ /**
21989
+ * Initialize Three.js scene
21990
+ */
21991
+ }, {
21992
+ key: "initScene",
21993
+ value: function initScene() {
21994
+ this.scene = new THREE__namespace.Scene();
21995
+ this.scene.name = 'MainScene';
21996
+
21997
+ // Set background
21998
+ this.scene.background = new THREE__namespace.Color(0x87CEEB); // Sky blue
21999
+
22000
+ console.log('🌍 Scene initialized');
22001
+ }
22002
+
22003
+ /**
22004
+ * Initialize camera
22005
+ */
22006
+ }, {
22007
+ key: "initCamera",
22008
+ value: function initCamera() {
22009
+ var aspect = this.container.clientWidth / this.container.clientHeight;
22010
+ this.camera = new THREE__namespace.PerspectiveCamera(75, aspect, 0.1, 1000);
22011
+ this.camera.position.set(5, 5, 5);
22012
+ this.camera.lookAt(0, 0, 0);
22013
+ console.log('📷 Camera initialized');
22014
+ }
22015
+
22016
+ /**
22017
+ * Initialize renderer
22018
+ */
22019
+ }, {
22020
+ key: "initRenderer",
22021
+ value: function initRenderer() {
22022
+ this.renderer = new THREE__namespace.WebGLRenderer({
22023
+ antialias: this.options.antialias,
22024
+ powerPreference: 'high-performance'
22025
+ });
22026
+ this.renderer.setSize(this.container.clientWidth, this.container.clientHeight);
22027
+ this.renderer.setPixelRatio(this.options.pixelRatio);
22028
+ this.renderer.shadowMap.enabled = this.options.enableShadows;
22029
+ this.renderer.shadowMap.type = THREE__namespace.PCFSoftShadowMap;
22030
+ this.renderer.outputColorSpace = THREE__namespace.SRGBColorSpace;
22031
+ this.renderer.toneMapping = THREE__namespace.ACESFilmicToneMapping;
22032
+ this.renderer.toneMappingExposure = 1;
22033
+
22034
+ // Append renderer to container
22035
+ this.container.appendChild(this.renderer.domElement);
22036
+ console.log('🎨 Renderer initialized');
22037
+ }
22038
+
22039
+ /**
22040
+ * Initialize lighting
22041
+ */
22042
+ }, {
22043
+ key: "initLights",
22044
+ value: function initLights() {
22045
+ // Ambient light
22046
+ var ambientLight = new THREE__namespace.AmbientLight(0x404040, 0.4);
22047
+ this.scene.add(ambientLight);
22048
+
22049
+ // Directional light
22050
+ var directionalLight = new THREE__namespace.DirectionalLight(0xffffff, 1);
22051
+ directionalLight.position.set(10, 10, 5);
22052
+ directionalLight.castShadow = this.options.enableShadows;
22053
+ if (this.options.enableShadows) {
22054
+ directionalLight.shadow.mapSize.width = 2048;
22055
+ directionalLight.shadow.mapSize.height = 2048;
22056
+ directionalLight.shadow.camera.near = 0.5;
22057
+ directionalLight.shadow.camera.far = 500;
22058
+ }
22059
+ this.scene.add(directionalLight);
22060
+ console.log('💡 Lights initialized');
22061
+ }
22062
+
22063
+ /**
22064
+ * Initialize controls (if available)
22065
+ */
22066
+ }, {
22067
+ key: "initControls",
22068
+ value: function initControls() {
22069
+ // Controls will be initialized by the camera controls manager
22070
+ // This is just a placeholder for the base setup
22071
+ console.log('🎮 Controls setup ready');
22072
+ }
22073
+
22074
+ /**
22075
+ * Initialize post-processing effects
22076
+ */
22077
+ }, {
22078
+ key: "initPostProcessing",
22079
+ value: function initPostProcessing() {
22080
+ // Post-processing will be handled by managers
22081
+ // This is just a placeholder
22082
+ console.log('✨ Post-processing setup ready');
22083
+ }
22084
+
22085
+ /**
22086
+ * Initialize event listeners
22087
+ */
22088
+ }, {
22089
+ key: "initEventListeners",
22090
+ value: function initEventListeners() {
22091
+ var _this2 = this;
22092
+ // Resize observer
22093
+ this.resizeObserver = new ResizeObserver(function (entries) {
22094
+ var _iterator = _createForOfIteratorHelper(entries),
22095
+ _step;
22096
+ try {
22097
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
22098
+ var entry = _step.value;
22099
+ _this2.handleResize();
22100
+ }
22101
+ } catch (err) {
22102
+ _iterator.e(err);
22103
+ } finally {
22104
+ _iterator.f();
22105
+ }
22106
+ });
22107
+ this.resizeObserver.observe(this.container);
22108
+
22109
+ // Mouse events for selection
22110
+ this.container.addEventListener('click', this.handleClick.bind(this));
22111
+ this.container.addEventListener('dblclick', this.handleDoubleClick.bind(this));
22112
+
22113
+ // Drag and drop events
22114
+ this.container.addEventListener('dragover', this.handleDragOver.bind(this));
22115
+ this.container.addEventListener('drop', this.handleDrop.bind(this));
22116
+ this.container.addEventListener('dragenter', this.handleDragEnter.bind(this));
22117
+ this.container.addEventListener('dragleave', this.handleDragLeave.bind(this));
22118
+ console.log('👂 Event listeners initialized');
22119
+ }
22120
+
22121
+ /**
22122
+ * Initialize scene managers that require the scene to be ready
22123
+ */
22124
+ }, {
22125
+ key: "initializeSceneManagers",
22126
+ value: (function () {
22127
+ var _initializeSceneManagers = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2() {
22128
+ var _t2;
22129
+ return _regenerator().w(function (_context2) {
22130
+ while (1) switch (_context2.n) {
22131
+ case 0:
22132
+ _context2.p = 0;
22133
+ if (!this.sceneInitializationManager) {
22134
+ _context2.n = 1;
22135
+ break;
22136
+ }
22137
+ _context2.n = 1;
22138
+ return this.sceneInitializationManager.initializeScene();
22139
+ case 1:
22140
+ if (!this.environmentManager) {
22141
+ _context2.n = 2;
22142
+ break;
22143
+ }
22144
+ _context2.n = 2;
22145
+ return this.environmentManager.initializeEnvironment();
22146
+ case 2:
22147
+ // Initialize other managers as needed
22148
+ console.log('🏗️ Scene managers initialized');
22149
+ _context2.n = 4;
22150
+ break;
22151
+ case 3:
22152
+ _context2.p = 3;
22153
+ _t2 = _context2.v;
22154
+ console.error('❌ Error initializing scene managers:', _t2);
22155
+ case 4:
22156
+ return _context2.a(2);
22157
+ }
22158
+ }, _callee2, this, [[0, 3]]);
22159
+ }));
22160
+ function initializeSceneManagers() {
22161
+ return _initializeSceneManagers.apply(this, arguments);
22162
+ }
22163
+ return initializeSceneManagers;
22164
+ }()
22165
+ /**
22166
+ * Main animation loop
22167
+ */
22168
+ )
22169
+ }, {
22170
+ key: "animate",
22171
+ value: function animate() {
22172
+ var _this3 = this;
22173
+ if (this.isDestroyed) return;
22174
+ requestAnimationFrame(function () {
22175
+ return _this3.animate();
22176
+ });
22177
+ try {
22178
+ // Update controls
22179
+ if (this.controls && this.controls.update) {
22180
+ this.controls.update();
22181
+ }
22182
+
22183
+ // Update camera controls manager
22184
+ if (this.cameraControlsManager) {
22185
+ this.cameraControlsManager.update();
22186
+ }
22187
+
22188
+ // Update animation manager
22189
+ if (this.animationManager) {
22190
+ this.animationManager.update();
22191
+ }
22192
+
22193
+ // Update performance monitor
22194
+ if (this.performanceMonitor) {
22195
+ this.performanceMonitor.begin();
22196
+ }
22197
+
22198
+ // Render the scene
22199
+ if (this.composer) {
22200
+ this.composer.render();
22201
+ } else {
22202
+ this.renderer.render(this.scene, this.camera);
22203
+ }
22204
+
22205
+ // End performance monitoring
22206
+ if (this.performanceMonitor) {
22207
+ this.performanceMonitor.end();
22208
+ }
22209
+ } catch (error) {
22210
+ console.error('❌ Error in animation loop:', error);
22211
+ }
22212
+ }
22213
+
22214
+ /**
22215
+ * Handle window/container resize
22216
+ */
22217
+ }, {
22218
+ key: "handleResize",
22219
+ value: function handleResize() {
22220
+ if (!this.camera || !this.renderer) return;
22221
+ var width = this.container.clientWidth;
22222
+ var height = this.container.clientHeight;
22223
+
22224
+ // Update camera
22225
+ this.camera.aspect = width / height;
22226
+ this.camera.updateProjectionMatrix();
22227
+
22228
+ // Update renderer
22229
+ this.renderer.setSize(width, height);
22230
+
22231
+ // Update composer if available
22232
+ if (this.composer) {
22233
+ this.composer.setSize(width, height);
22234
+ }
22235
+ this.emit('resize', {
22236
+ width: width,
22237
+ height: height
22238
+ });
22239
+ }
22240
+
22241
+ /**
22242
+ * Handle click events
22243
+ */
22244
+ }, {
22245
+ key: "handleClick",
22246
+ value: function handleClick(event) {
22247
+ if (!this.camera || !this.scene) return;
22248
+ var rect = this.container.getBoundingClientRect();
22249
+ var mouse = new THREE__namespace.Vector2();
22250
+ mouse.x = (event.clientX - rect.left) / rect.width * 2 - 1;
22251
+ mouse.y = -((event.clientY - rect.top) / rect.height) * 2 + 1;
22252
+ var raycaster = new THREE__namespace.Raycaster();
22253
+ raycaster.setFromCamera(mouse, this.camera);
22254
+ var intersects = raycaster.intersectObjects(this.scene.children, true);
22255
+ if (intersects.length > 0) {
22256
+ var object = intersects[0].object;
22257
+ this.selectObject(object);
22258
+ } else {
22259
+ this.selectObject(null);
22260
+ }
22261
+ }
22262
+
22263
+ /**
22264
+ * Handle double click events
22265
+ */
22266
+ }, {
22267
+ key: "handleDoubleClick",
22268
+ value: function handleDoubleClick(event) {
22269
+ // Handle double click actions
22270
+ this.emit('doubleClick', {
22271
+ event: event
22272
+ });
22273
+ }
22274
+
22275
+ /**
22276
+ * Handle drag over events
22277
+ */
22278
+ }, {
22279
+ key: "handleDragOver",
22280
+ value: function handleDragOver(event) {
22281
+ event.preventDefault();
22282
+ this.isDragOver = true;
22283
+ this.emit('dragOver', {
22284
+ event: event
22285
+ });
22286
+ }
22287
+
22288
+ /**
22289
+ * Handle drop events
22290
+ */
22291
+ }, {
22292
+ key: "handleDrop",
22293
+ value: function handleDrop(event) {
22294
+ event.preventDefault();
22295
+ this.isDragOver = false;
22296
+ try {
22297
+ var dataTransfer = event.dataTransfer.getData('text/plain');
22298
+ if (dataTransfer) {
22299
+ var componentData = JSON.parse(dataTransfer);
22300
+
22301
+ // Calculate drop position
22302
+ var rect = this.container.getBoundingClientRect();
22303
+ var mouse = new THREE__namespace.Vector2();
22304
+ mouse.x = (event.clientX - rect.left) / rect.width * 2 - 1;
22305
+ mouse.y = -((event.clientY - rect.top) / rect.height) * 2 + 1;
22306
+ var raycaster = new THREE__namespace.Raycaster();
22307
+ raycaster.setFromCamera(mouse, this.camera);
22308
+
22309
+ // Cast ray to ground plane (y = 0)
22310
+ var groundPlane = new THREE__namespace.Plane(new THREE__namespace.Vector3(0, 1, 0), 0);
22311
+ var dropPosition = new THREE__namespace.Vector3();
22312
+ raycaster.ray.intersectPlane(groundPlane, dropPosition);
22313
+ this.emit('componentDropped', {
22314
+ componentData: componentData,
22315
+ position: dropPosition,
22316
+ event: event
22317
+ });
22318
+ }
22319
+ } catch (error) {
22320
+ console.error('❌ Error handling drop:', error);
22321
+ this.emit('dropError', {
22322
+ error: error,
22323
+ event: event
22324
+ });
22325
+ }
22326
+ }
22327
+
22328
+ /**
22329
+ * Handle drag enter events
22330
+ */
22331
+ }, {
22332
+ key: "handleDragEnter",
22333
+ value: function handleDragEnter(event) {
22334
+ event.preventDefault();
22335
+ this.emit('dragEnter', {
22336
+ event: event
22337
+ });
22338
+ }
22339
+
22340
+ /**
22341
+ * Handle drag leave events
22342
+ */
22343
+ }, {
22344
+ key: "handleDragLeave",
22345
+ value: function handleDragLeave(event) {
22346
+ this.isDragOver = false;
22347
+ this.emit('dragLeave', {
22348
+ event: event
22349
+ });
22350
+ }
22351
+
22352
+ /**
22353
+ * Select an object in the scene
22354
+ */
22355
+ }, {
22356
+ key: "selectObject",
22357
+ value: function selectObject(object) {
22358
+ // Clear previous selection
22359
+ if (this.selectedObjectForTransform) {
22360
+ // Remove selection indicators
22361
+ this.clearObjectSelection(this.selectedObjectForTransform);
22362
+ }
22363
+ this.selectedObjectForTransform = object;
22364
+ if (object) {
22365
+ // Add selection indicators
22366
+ this.highlightSelectedObject(object);
22367
+
22368
+ // Initialize transform controls if available
22369
+ if (this.transformManager) {
22370
+ this.transformManager.attachToObject(object);
22371
+ }
22372
+ } else {
22373
+ // Clear transform controls
22374
+ if (this.transformManager) {
22375
+ this.transformManager.detach();
22376
+ }
22377
+ }
22378
+ this.emit('objectSelected', {
22379
+ object: object
22380
+ });
22381
+ }
22382
+
22383
+ /**
22384
+ * Clear object selection visual indicators
22385
+ */
22386
+ }, {
22387
+ key: "clearObjectSelection",
22388
+ value: function clearObjectSelection(object) {
22389
+ // Remove selection outline or other indicators
22390
+ // This would depend on your specific selection visualization
22391
+ }
22392
+
22393
+ /**
22394
+ * Highlight selected object
22395
+ */
22396
+ }, {
22397
+ key: "highlightSelectedObject",
22398
+ value: function highlightSelectedObject(object) {
22399
+ // Add selection outline or other indicators
22400
+ // This would depend on your specific selection visualization
22401
+ }
22402
+
22403
+ /**
22404
+ * Load a scene from data
22405
+ */
22406
+ }, {
22407
+ key: "loadScene",
22408
+ value: (function () {
22409
+ var _loadScene = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(sceneData) {
22410
+ var _t3;
22411
+ return _regenerator().w(function (_context3) {
22412
+ while (1) switch (_context3.n) {
22413
+ case 0:
22414
+ _context3.p = 0;
22415
+ this.currentSceneData = sceneData;
22416
+ if (!this.componentManager) {
22417
+ _context3.n = 1;
22418
+ break;
22419
+ }
22420
+ _context3.n = 1;
22421
+ return this.componentManager.loadSceneFromData(sceneData);
22422
+ case 1:
22423
+ this.emit('sceneLoaded', {
22424
+ sceneData: sceneData
22425
+ });
22426
+ _context3.n = 3;
22427
+ break;
22428
+ case 2:
22429
+ _context3.p = 2;
22430
+ _t3 = _context3.v;
22431
+ console.error('❌ Error loading scene:', _t3);
22432
+ this.emit('sceneLoadError', {
22433
+ error: _t3,
22434
+ sceneData: sceneData
22435
+ });
22436
+ case 3:
22437
+ return _context3.a(2);
22438
+ }
22439
+ }, _callee3, this, [[0, 2]]);
22440
+ }));
22441
+ function loadScene(_x) {
22442
+ return _loadScene.apply(this, arguments);
22443
+ }
22444
+ return loadScene;
22445
+ }()
22446
+ /**
22447
+ * Add a component to the scene
22448
+ */
22449
+ )
22450
+ }, {
22451
+ key: "addComponentToScene",
22452
+ value: function addComponentToScene(componentData) {
22453
+ var position = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new THREE__namespace.Vector3();
22454
+ try {
22455
+ if (this.componentManager) {
22456
+ return this.componentManager.addComponent(componentData, position);
22457
+ }
22458
+ return false;
22459
+ } catch (error) {
22460
+ console.error('❌ Error adding component:', error);
22461
+ return false;
22462
+ }
22463
+ }
22464
+
22465
+ /**
22466
+ * Export scene data
22467
+ */
22468
+ }, {
22469
+ key: "exportScene",
22470
+ value: function exportScene() {
22471
+ try {
22472
+ if (this.sceneExportManager) {
22473
+ return this.sceneExportManager.exportScene();
22474
+ }
22475
+ return null;
22476
+ } catch (error) {
22477
+ console.error('❌ Error exporting scene:', error);
22478
+ return null;
22479
+ }
22480
+ }
22481
+
22482
+ /**
22483
+ * Toggle camera auto rotation
22484
+ */
22485
+ }, {
22486
+ key: "toggleCameraRotation",
22487
+ value: function toggleCameraRotation() {
22488
+ if (this.cameraControlsManager) {
22489
+ return this.cameraControlsManager.toggleCameraRotation();
22490
+ }
22491
+ return false;
22492
+ }
22493
+
22494
+ /**
22495
+ * Get selected transform data
22496
+ */
22497
+ }, {
22498
+ key: "getSelectedTransform",
22499
+ value: function getSelectedTransform() {
22500
+ if (this.transformManager && this.selectedObjectForTransform) {
22501
+ return this.transformManager.getTransformData(this.selectedObjectForTransform);
22502
+ }
22503
+ return null;
22504
+ }
22505
+
22506
+ /**
22507
+ * Event system methods
22508
+ */
22509
+ }, {
22510
+ key: "on",
22511
+ value: function on(eventName, callback) {
22512
+ if (!this.eventCallbacks.has(eventName)) {
22513
+ this.eventCallbacks.set(eventName, []);
22514
+ }
22515
+ this.eventCallbacks.get(eventName).push(callback);
22516
+ }
22517
+ }, {
22518
+ key: "off",
22519
+ value: function off(eventName, callback) {
22520
+ if (this.eventCallbacks.has(eventName)) {
22521
+ var callbacks = this.eventCallbacks.get(eventName);
22522
+ var index = callbacks.indexOf(callback);
22523
+ if (index > -1) {
22524
+ callbacks.splice(index, 1);
22525
+ }
22526
+ }
22527
+ }
22528
+ }, {
22529
+ key: "emit",
22530
+ value: function emit(eventName) {
22531
+ var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
22532
+ if (this.eventCallbacks.has(eventName)) {
22533
+ this.eventCallbacks.get(eventName).forEach(function (callback) {
22534
+ try {
22535
+ callback(data);
22536
+ } catch (error) {
22537
+ console.error("\u274C Error in event callback for ".concat(eventName, ":"), error);
22538
+ }
22539
+ });
22540
+ }
22541
+ }
22542
+
22543
+ /**
22544
+ * Dispose of the scene viewer and clean up resources
22545
+ */
22546
+ }, {
22547
+ key: "dispose",
22548
+ value: function dispose() {
22549
+ console.log('🧹 Disposing SceneViewer...');
22550
+ this.isDestroyed = true;
22551
+ try {
22552
+ // Clean up event listeners
22553
+ this.eventCallbacks.clear();
22554
+
22555
+ // Clean up resize observer
22556
+ if (this.resizeObserver) {
22557
+ this.resizeObserver.disconnect();
22558
+ this.resizeObserver = null;
22559
+ }
22560
+
22561
+ // Clean up DOM event listeners
22562
+ if (this.container) {
22563
+ this.container.removeEventListener('click', this.handleClick);
22564
+ this.container.removeEventListener('dblclick', this.handleDoubleClick);
22565
+ this.container.removeEventListener('dragover', this.handleDragOver);
22566
+ this.container.removeEventListener('drop', this.handleDrop);
22567
+ this.container.removeEventListener('dragenter', this.handleDragEnter);
22568
+ this.container.removeEventListener('dragleave', this.handleDragLeave);
22569
+ }
22570
+
22571
+ // Dispose of managers using disposal manager
22572
+ if (this.disposalManager) {
22573
+ this.disposalManager.cleanupEventListeners();
22574
+ this.disposalManager.cleanupPerformanceMonitoring();
22575
+ this.disposalManager.cleanupControls();
22576
+ this.disposalManager.cleanupScene();
22577
+ this.disposalManager.cleanupRenderer();
22578
+ }
22579
+
22580
+ // Remove renderer from DOM
22581
+ if (this.renderer && this.renderer.domElement && this.container) {
22582
+ this.container.removeChild(this.renderer.domElement);
22583
+ }
22584
+
22585
+ // Dispose of renderer
22586
+ if (this.renderer) {
22587
+ this.renderer.dispose();
22588
+ this.renderer = null;
22589
+ }
22590
+
22591
+ // Clear references
22592
+ this.scene = null;
22593
+ this.camera = null;
22594
+ this.controls = null;
22595
+ this.currentSceneData = null;
22596
+ this.selectedObjectForTransform = null;
22597
+ console.log('✅ SceneViewer disposed successfully');
22598
+ } catch (error) {
22599
+ console.error('❌ Error during SceneViewer disposal:', error);
22600
+ }
22601
+ }
22602
+ }]);
22603
+ }();
22604
+
21810
22605
  /**
21811
22606
  * CentralPlant class that manages all scene utility instances
21812
22607
  */
@@ -22927,6 +23722,36 @@ var CentralPlant = /*#__PURE__*/function () {
22927
23722
  });
22928
23723
  return found;
22929
23724
  }
23725
+
23726
+ /**
23727
+ * Get the SceneViewer class for creating new instances
23728
+ * @returns {Function} The SceneViewer class constructor
23729
+ */
23730
+ }, {
23731
+ key: "getSceneViewerClass",
23732
+ value: function getSceneViewerClass() {
23733
+ return SceneViewer;
23734
+ }
23735
+
23736
+ /**
23737
+ * Get all managers for external access
23738
+ * @returns {Object} All manager instances
23739
+ */
23740
+ }, {
23741
+ key: "getAllManagers",
23742
+ value: function getAllManagers() {
23743
+ return _objectSpread2({}, this.managers);
23744
+ }
23745
+
23746
+ /**
23747
+ * Get all utilities for external access
23748
+ * @returns {Object} All utility instances
23749
+ */
23750
+ }, {
23751
+ key: "getAllUtilities",
23752
+ value: function getAllUtilities() {
23753
+ return _objectSpread2({}, this.utilities);
23754
+ }
22930
23755
  }]);
22931
23756
  }();
22932
23757
 
@@ -30444,29 +31269,41 @@ var Export = /*#__PURE__*/function () {
30444
31269
  includeCustomExtensions: false
30445
31270
  }, options);
30446
31271
  _t = format.toLowerCase();
30447
- _context.n = _t === 'gltf' ? 2 : _t === 'glb' ? 2 : _t === 'obj' ? 4 : _t === 'stl' ? 6 : 8;
31272
+ _context.n = _t === 'gltf' ? 2 : _t === 'glb' ? 2 : _t === 'obj' ? 4 : _t === 'stl' ? 6 : _t === 'ply' ? 8 : _t === 'dae' ? 10 : 12;
30448
31273
  break;
30449
31274
  case 2:
30450
31275
  _context.n = 3;
30451
31276
  return this.exportGLTF(object, exportOptions);
30452
31277
  case 3:
30453
31278
  result = _context.v;
30454
- return _context.a(3, 9);
31279
+ return _context.a(3, 13);
30455
31280
  case 4:
30456
31281
  _context.n = 5;
30457
31282
  return this.exportOBJ(object, exportOptions);
30458
31283
  case 5:
30459
31284
  result = _context.v;
30460
- return _context.a(3, 9);
31285
+ return _context.a(3, 13);
30461
31286
  case 6:
30462
31287
  _context.n = 7;
30463
31288
  return this.exportSTL(object, exportOptions);
30464
31289
  case 7:
30465
31290
  result = _context.v;
30466
- return _context.a(3, 9);
31291
+ return _context.a(3, 13);
30467
31292
  case 8:
30468
- throw new Error("Unsupported format: ".concat(format));
31293
+ _context.n = 9;
31294
+ return this.exportPLY(object, exportOptions);
30469
31295
  case 9:
31296
+ result = _context.v;
31297
+ return _context.a(3, 13);
31298
+ case 10:
31299
+ _context.n = 11;
31300
+ return this.exportCollada(object, exportOptions);
31301
+ case 11:
31302
+ result = _context.v;
31303
+ return _context.a(3, 13);
31304
+ case 12:
31305
+ throw new Error("Unsupported format: ".concat(format));
31306
+ case 13:
30470
31307
  exportTime = performance.now() - startTime;
30471
31308
  exportRecord = {
30472
31309
  timestamp: new Date().toISOString(),
@@ -30484,8 +31321,8 @@ var Export = /*#__PURE__*/function () {
30484
31321
  exportTime: exportTime,
30485
31322
  filename: this.generateFilename(object.name || 'model', format)
30486
31323
  });
30487
- case 10:
30488
- _context.p = 10;
31324
+ case 14:
31325
+ _context.p = 14;
30489
31326
  _t2 = _context.v;
30490
31327
  _exportTime = performance.now() - startTime;
30491
31328
  _exportRecord = {
@@ -30500,10 +31337,10 @@ var Export = /*#__PURE__*/function () {
30500
31337
  this.exportHistory.push(_exportRecord);
30501
31338
  logger.error("\u274C Failed to export model to ".concat(format.toUpperCase(), ":"), _t2);
30502
31339
  throw _t2;
30503
- case 11:
31340
+ case 15:
30504
31341
  return _context.a(2);
30505
31342
  }
30506
- }, _callee, this, [[1, 10]]);
31343
+ }, _callee, this, [[1, 14]]);
30507
31344
  }));
30508
31345
  function exportModel(_x, _x2) {
30509
31346
  return _exportModel.apply(this, arguments);
@@ -30628,6 +31465,36 @@ var Export = /*#__PURE__*/function () {
30628
31465
  }
30629
31466
  return exportPLY;
30630
31467
  }()
31468
+ /**
31469
+ * Export to Collada (DAE) format
31470
+ * @param {THREE.Object3D} object - Object to export
31471
+ * @param {Object} options - Export options
31472
+ * @returns {Promise<string>} Collada XML string
31473
+ */
31474
+ )
31475
+ }, {
31476
+ key: "exportCollada",
31477
+ value: (function () {
31478
+ var _exportCollada = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee6(object) {
31479
+ var _this5 = this;
31480
+ var options,
31481
+ _args6 = arguments;
31482
+ return _regenerator().w(function (_context6) {
31483
+ while (1) switch (_context6.n) {
31484
+ case 0:
31485
+ options = _args6.length > 1 && _args6[1] !== undefined ? _args6[1] : {};
31486
+ return _context6.a(2, new Promise(function (resolve) {
31487
+ var result = _this5.exporters.collada.parse(object, options);
31488
+ resolve(result.data);
31489
+ }));
31490
+ }
31491
+ }, _callee6);
31492
+ }));
31493
+ function exportCollada(_x7) {
31494
+ return _exportCollada.apply(this, arguments);
31495
+ }
31496
+ return exportCollada;
31497
+ }()
30631
31498
  /**
30632
31499
  * Export scene configuration to JSON
30633
31500
  * @param {THREE.Scene} scene - Scene to export
@@ -30670,7 +31537,7 @@ var Export = /*#__PURE__*/function () {
30670
31537
  }, {
30671
31538
  key: "serializeObject",
30672
31539
  value: function serializeObject(object) {
30673
- var _this5 = this;
31540
+ var _this6 = this;
30674
31541
  var serialized = {
30675
31542
  uuid: object.uuid,
30676
31543
  name: object.name,
@@ -30701,7 +31568,7 @@ var Export = /*#__PURE__*/function () {
30701
31568
 
30702
31569
  // Recursively serialize children
30703
31570
  object.children.forEach(function (child) {
30704
- serialized.children.push(_this5.serializeObject(child));
31571
+ serialized.children.push(_this6.serializeObject(child));
30705
31572
  });
30706
31573
  return serialized;
30707
31574
  }
@@ -30874,7 +31741,7 @@ var Export = /*#__PURE__*/function () {
30874
31741
  }, {
30875
31742
  key: "exportToXML",
30876
31743
  value: function exportToXML(data) {
30877
- var _this6 = this;
31744
+ var _this7 = this;
30878
31745
  var rootElement = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'root';
30879
31746
  var xmlHeader = '<?xml version="1.0" encoding="UTF-8"?>\n';
30880
31747
  var _objectToXML = function objectToXML(obj) {
@@ -30893,12 +31760,12 @@ var Export = /*#__PURE__*/function () {
30893
31760
  if (_typeof(item) === 'object') {
30894
31761
  xml += '\n' + _objectToXML(item, indent + 1) + spaces;
30895
31762
  } else {
30896
- xml += _this6.escapeXML(item);
31763
+ xml += _this7.escapeXML(item);
30897
31764
  }
30898
31765
  xml += "</".concat(key, ">\n");
30899
31766
  });
30900
31767
  } else {
30901
- xml += "".concat(spaces, "<").concat(key, ">").concat(_this6.escapeXML(value), "</").concat(key, ">\n");
31768
+ xml += "".concat(spaces, "<").concat(key, ">").concat(_this7.escapeXML(value), "</").concat(key, ">\n");
30902
31769
  }
30903
31770
  });
30904
31771
  return xml;
@@ -30950,63 +31817,63 @@ var Export = /*#__PURE__*/function () {
30950
31817
  }, {
30951
31818
  key: "exportBatch",
30952
31819
  value: (function () {
30953
- var _exportBatch = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee6(objects) {
31820
+ var _exportBatch = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee7(objects) {
30954
31821
  var results, errors, _iterator, _step, item, result, _t3, _t4;
30955
- return _regenerator().w(function (_context6) {
30956
- while (1) switch (_context6.n) {
31822
+ return _regenerator().w(function (_context7) {
31823
+ while (1) switch (_context7.n) {
30957
31824
  case 0:
30958
31825
  logger.info("\uD83D\uDD04 Starting batch export of ".concat(objects.length, " objects..."));
30959
31826
  results = [];
30960
31827
  errors = [];
30961
31828
  _iterator = _createForOfIteratorHelper(objects);
30962
- _context6.p = 1;
31829
+ _context7.p = 1;
30963
31830
  _iterator.s();
30964
31831
  case 2:
30965
31832
  if ((_step = _iterator.n()).done) {
30966
- _context6.n = 7;
31833
+ _context7.n = 7;
30967
31834
  break;
30968
31835
  }
30969
31836
  item = _step.value;
30970
- _context6.p = 3;
30971
- _context6.n = 4;
31837
+ _context7.p = 3;
31838
+ _context7.n = 4;
30972
31839
  return this.exportModel(item.object, item.format, item.options);
30973
31840
  case 4:
30974
- result = _context6.v;
31841
+ result = _context7.v;
30975
31842
  results.push(result);
30976
- _context6.n = 6;
31843
+ _context7.n = 6;
30977
31844
  break;
30978
31845
  case 5:
30979
- _context6.p = 5;
30980
- _t3 = _context6.v;
31846
+ _context7.p = 5;
31847
+ _t3 = _context7.v;
30981
31848
  errors.push({
30982
31849
  object: item.object.name || 'Unnamed Object',
30983
31850
  format: item.format,
30984
31851
  error: _t3.message
30985
31852
  });
30986
31853
  case 6:
30987
- _context6.n = 2;
31854
+ _context7.n = 2;
30988
31855
  break;
30989
31856
  case 7:
30990
- _context6.n = 9;
31857
+ _context7.n = 9;
30991
31858
  break;
30992
31859
  case 8:
30993
- _context6.p = 8;
30994
- _t4 = _context6.v;
31860
+ _context7.p = 8;
31861
+ _t4 = _context7.v;
30995
31862
  _iterator.e(_t4);
30996
31863
  case 9:
30997
- _context6.p = 9;
31864
+ _context7.p = 9;
30998
31865
  _iterator.f();
30999
- return _context6.f(9);
31866
+ return _context7.f(9);
31000
31867
  case 10:
31001
31868
  logger.info("\u2705 Batch export complete: ".concat(results.length, " successful, ").concat(errors.length, " failed"));
31002
- return _context6.a(2, {
31869
+ return _context7.a(2, {
31003
31870
  results: results,
31004
31871
  errors: errors
31005
31872
  });
31006
31873
  }
31007
- }, _callee6, this, [[3, 5], [1, 8, 9, 10]]);
31874
+ }, _callee7, this, [[3, 5], [1, 8, 9, 10]]);
31008
31875
  }));
31009
- function exportBatch(_x7) {
31876
+ function exportBatch(_x8) {
31010
31877
  return _exportBatch.apply(this, arguments);
31011
31878
  }
31012
31879
  return exportBatch;
@@ -33133,6 +34000,7 @@ exports.SceneExportManager = SceneExportManager;
33133
34000
  exports.SceneInitializationManager = SceneInitializationManager;
33134
34001
  exports.SceneOperationsManager = SceneOperationsManager;
33135
34002
  exports.SceneTooltipsManager = SceneTooltipsManager;
34003
+ exports.SceneViewer = SceneViewer;
33136
34004
  exports.Testing = testing;
33137
34005
  exports.createTransformControls = createTransformControls;
33138
34006
  exports.findObjectByHardcodedUuid = findObjectByHardcodedUuid;