@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,661 @@
|
|
|
1
|
-
import{createClass as i,toConsumableArray as t,objectSpread2 as e,classCallCheck as n,defineProperty as o}from"../../_virtual/_rollupPluginBabelHelpers.js";import*as r from"three";import{logger as s}from"../core/debugLogger.js";var a=function(){return i(function i(){var s=this,a=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};n(this,i),o(this,"lighting",{addAmbient:function(){var i,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:4210752,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:.4,n=new r.AmbientLight(t,e);return null===(i=s.scene)||void 0===i||i.add(n),n},addDirectional:function(){var i,e,n,o,a=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},d=a.color,v=void 0===d?16777215:d,h=a.intensity,l=void 0===h?1:h,u=a.position,c=void 0===u?[10,10,5]:u,f=a.target,p=void 0===f?[0,0,0]:f,m=a.castShadow,w=void 0===m||m,g=a.shadowMapSize,y=void 0===g?2048:g,S=a.shadowCameraNear,M=void 0===S?.5:S,x=a.shadowCameraFar,k=void 0===x?50:x,C=a.shadowCameraLeft,P=void 0===C?-10:C,D=a.shadowCameraRight,b=void 0===D?10:D,R=a.shadowCameraTop,_=void 0===R?10:R,B=a.shadowCameraBottom,j=void 0===B?-10:B,z=new r.DirectionalLight(v,l);return(i=z.position).set.apply(i,t(c)),(e=z.target.position).set.apply(e,t(p)),w&&(z.castShadow=!0,z.shadow.mapSize.width=y,z.shadow.mapSize.height=y,z.shadow.camera.near=M,z.shadow.camera.far=k,z.shadow.camera.left=P,z.shadow.camera.right=b,z.shadow.camera.top=_,z.shadow.camera.bottom=j),null===(n=s.scene)||void 0===n||n.add(z),null===(o=s.scene)||void 0===o||o.add(z.target),z},addPoint:function(){var i,e,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},o=n.color,a=void 0===o?16777215:o,d=n.intensity,v=void 0===d?1:d,h=n.distance,l=void 0===h?0:h,u=n.decay,c=void 0===u?2:u,f=n.position,p=void 0===f?[0,10,0]:f,m=n.castShadow,w=void 0!==m&&m,g=n.shadowMapSize,y=void 0===g?1024:g,S=new r.PointLight(a,v,l,c);return(i=S.position).set.apply(i,t(p)),w&&(S.castShadow=!0,S.shadow.mapSize.width=y,S.shadow.mapSize.height=y,S.shadow.camera.near=.1,S.shadow.camera.far=25),null===(e=s.scene)||void 0===e||e.add(S),S},addSpot:function(){var i,e,n,o,a=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},d=a.color,v=void 0===d?16777215:d,h=a.intensity,l=void 0===h?1:h,u=a.distance,c=void 0===u?0:u,f=a.angle,p=void 0===f?Math.PI/3:f,m=a.penumbra,w=void 0===m?0:m,g=a.decay,y=void 0===g?2:g,S=a.position,M=void 0===S?[0,10,0]:S,x=a.target,k=void 0===x?[0,0,0]:x,C=a.castShadow,P=void 0===C||C,D=a.shadowMapSize,b=void 0===D?1024:D,R=new r.SpotLight(v,l,c,p,w,y);return(i=R.position).set.apply(i,t(M)),(e=R.target.position).set.apply(e,t(k)),P&&(R.castShadow=!0,R.shadow.mapSize.width=b,R.shadow.mapSize.height=b,R.shadow.camera.near=.5,R.shadow.camera.far=50),null===(n=s.scene)||void 0===n||n.add(R),null===(o=s.scene)||void 0===o||o.add(R.target),R}}),o(this,"materials",{createStandard:function(){var i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return new r.MeshStandardMaterial(e({color:16777215,metalness:0,roughness:.5},i))},createPhysical:function(){var i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return new r.MeshPhysicalMaterial(e({color:16777215,metalness:0,roughness:.5,clearcoat:0,clearcoatRoughness:0},i))},createBasic:function(){var i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return new r.MeshBasicMaterial(e({color:16777215},i))},createShader:function(){var i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return new r.ShaderMaterial({vertexShader:i.vertexShader||"\n void main() {\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }\n ",fragmentShader:i.fragmentShader||"\n void main() {\n gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);\n }\n ",uniforms:i.uniforms||{}})}}),o(this,"geometry",{createBox:function(){var i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1,e=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1;return new r.BoxGeometry(i,t,e)},createSphere:function(){var i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:32,e=arguments.length>2&&void 0!==arguments[2]?arguments[2]:16;return new r.SphereGeometry(i,t,e)},createCylinder:function(){var i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1,e=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1,n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:32;return new r.CylinderGeometry(i,t,e,n)},createPlane:function(){var i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;return new r.PlaneGeometry(i,t)}}),o(this,"renderTargets",{create:function(i,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=new r.WebGLRenderTarget(i,t,e({minFilter:r.LinearFilter,magFilter:r.LinearFilter,format:r.RGBAFormat,type:r.UnsignedByteType},n)),a="rt_".concat(Date.now(),"_").concat(Math.random().toString(36).substr(2,9));return s.renderTargets.set(a,o),{id:a,renderTarget:o}},get:function(i){return s.renderTargets.get(i)},remove:function(i){var t=s.renderTargets.get(i);t&&(t.dispose(),s.renderTargets.delete(i))}}),o(this,"animation",{createMixer:function(i){return s.animationMixer=new r.AnimationMixer(i),s.animationMixer},addClip:function(i){if(!s.animationMixer)throw new Error("Animation mixer not created");return s.animationMixer.clipAction(i)},update:function(i){s.animationMixer&&s.animationMixer.update(i)}}),o(this,"screenshot",{toDataURL:function(){var i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"image/png",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;return s.renderer?s.renderer.domElement.toDataURL(i,t):""},toBlob:function(){var i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"image/png",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;return s.renderer?new Promise(function(e){s.renderer.domElement.toBlob(e,i,t)}):Promise.resolve(null)}}),this.options=e({antialias:!0,alpha:!0,shadowMapEnabled:!0,shadowMapType:r.PCFSoftShadowMap,toneMapping:r.ACESFilmicToneMapping,toneMappingExposure:1,outputColorSpace:r.SRGBColorSpace},a),this.renderer=null,this.scene=null,this.camera=null,this.controls=null,this.renderTargets=new Map,this.postProcessing={composer:null,passes:[]},this.stats={triangles:0,geometries:0,textures:0,calls:0,frameTime:0},this.animationMixer=null,this.clock=new r.Clock},[{key:"initializeRenderer",value:function(i){this.renderer&&this.dispose();try{return this.renderer=new r.WebGLRenderer({antialias:this.options.antialias,alpha:this.options.alpha,preserveDrawingBuffer:!1,powerPreference:"high-performance"}),this.renderer.setPixelRatio(Math.min(window.devicePixelRatio,2)),this.renderer.setSize(i.clientWidth,i.clientHeight),this.renderer.setClearColor(0,0),this.options.shadowMapEnabled&&(this.renderer.shadowMap.enabled=!0,this.renderer.shadowMap.type=this.options.shadowMapType),this.renderer.toneMapping=this.options.toneMapping,this.renderer.toneMappingExposure=this.options.toneMappingExposure,this.renderer.outputColorSpace=this.options.outputColorSpace,this.renderer.useLegacyLights=!1,i.appendChild(this.renderer.domElement),s.info("✅ 3D Renderer initialized"),this.renderer}catch(i){throw s.error("❌ Failed to initialize 3D renderer:",i),i}}},{key:"createScene",value:function(){var i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=i.background,e=void 0===t?null:t,n=i.environment,o=void 0===n?null:n,a=i.fog,d=void 0===a?null:a;return this.scene=new r.Scene,e&&("string"==typeof e?this.scene.background=new r.Color(e):e.isTexture&&(this.scene.background=e)),o&&o.isTexture&&(this.scene.environment=o),d&&("linear"===d.type?this.scene.fog=new r.Fog(d.color,d.near,d.far):"exponential"===d.type&&(this.scene.fog=new r.FogExp2(d.color,d.density))),s.info("✅ 3D Scene created"),this.scene}},{key:"createCamera",value:function(){var i,e,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"perspective",o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},a=null===(i=this.renderer)||void 0===i||null===(i=i.domElement)||void 0===i?void 0:i.parentElement,d=a?a.clientWidth/a.clientHeight:1;if("perspective"===n){var v=o.fov,h=void 0===v?75:v,l=o.near,u=void 0===l?.1:l,c=o.far,f=void 0===c?1e3:c;o.position,this.camera=new r.PerspectiveCamera(h,d,u,f)}else if("orthographic"===n){var p=o.left,m=void 0===p?-10:p,w=o.right,g=void 0===w?10:w,y=o.top,S=void 0===y?10:y,M=o.bottom,x=void 0===M?-10:M,k=o.near,C=void 0===k?.1:k,P=o.far,D=void 0===P?1e3:P;o.position,this.camera=new r.OrthographicCamera(m,g,S,x,C,D)}this.camera&&((e=this.camera.position).set.apply(e,t(position)),s.info("✅ ".concat(n," camera created")));return this.camera}},{key:"render",value:function(){var i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,e=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;if(this.renderer){var n=i||this.scene,o=t||this.camera;if(n&&o){var r=performance.now(),s=this.clock.getDelta();this.animation.update(s),this.renderer.render(n,o,e),this.stats.frameTime=performance.now()-r,this.updateRenderStats()}}}},{key:"updateRenderStats",value:function(){if(this.renderer){var i=this.renderer.info;this.stats.triangles=i.render.triangles,this.stats.geometries=i.memory.geometries,this.stats.textures=i.memory.textures,this.stats.calls=i.render.calls}}},{key:"getRenderStats",value:function(){return e({},this.stats)}},{key:"resize",value:function(i,t){if(this.renderer){if(this.renderer.setSize(i,t),this.camera){if(this.camera.isPerspectiveCamera)this.camera.aspect=i/t;else if(this.camera.isOrthographicCamera){var e=i/t;this.camera.left=-10*e,this.camera.right=10*e,this.camera.top=10,this.camera.bottom=-10}this.camera.updateProjectionMatrix()}this.renderTargets.forEach(function(e){e.setSize(i,t)})}}},{key:"dispose",value:function(){this.renderTargets.forEach(function(i){i.dispose()}),this.renderTargets.clear(),this.animationMixer&&(this.animationMixer.stopAllAction(),this.animationMixer=null),this.renderer&&(this.renderer.dispose(),this.renderer.forceContextLoss(),this.renderer.domElement.parentElement&&this.renderer.domElement.parentElement.removeChild(this.renderer.domElement),this.renderer=null),this.scene=null,this.camera=null,this.controls=null,s.info("✅ 3D Rendering disposed")}}])}();export{a as Rendering3D};
|
|
1
|
+
import { createClass as _createClass, toConsumableArray as _toConsumableArray, objectSpread2 as _objectSpread2, classCallCheck as _classCallCheck, defineProperty as _defineProperty } from '../../_virtual/_rollupPluginBabelHelpers.js';
|
|
2
|
+
import * as THREE from 'three';
|
|
3
|
+
import { logger } from '../core/debugLogger.js';
|
|
4
|
+
|
|
5
|
+
var Rendering3D = /*#__PURE__*/function () {
|
|
6
|
+
function Rendering3D() {
|
|
7
|
+
var _this = this;
|
|
8
|
+
var _options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
9
|
+
_classCallCheck(this, Rendering3D);
|
|
10
|
+
/**
|
|
11
|
+
* Lighting utilities
|
|
12
|
+
*/
|
|
13
|
+
_defineProperty(this, "lighting", {
|
|
14
|
+
/**
|
|
15
|
+
* Add ambient light
|
|
16
|
+
* @param {number|string} color - Light color
|
|
17
|
+
* @param {number} intensity - Light intensity
|
|
18
|
+
* @returns {THREE.AmbientLight} Ambient light
|
|
19
|
+
*/
|
|
20
|
+
addAmbient: function addAmbient() {
|
|
21
|
+
var _this$scene;
|
|
22
|
+
var color = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0x404040;
|
|
23
|
+
var intensity = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0.4;
|
|
24
|
+
var light = new THREE.AmbientLight(color, intensity);
|
|
25
|
+
(_this$scene = _this.scene) === null || _this$scene === void 0 || _this$scene.add(light);
|
|
26
|
+
return light;
|
|
27
|
+
},
|
|
28
|
+
/**
|
|
29
|
+
* Add directional light
|
|
30
|
+
* @param {Object} options - Light options
|
|
31
|
+
* @returns {THREE.DirectionalLight} Directional light
|
|
32
|
+
*/
|
|
33
|
+
addDirectional: function addDirectional() {
|
|
34
|
+
var _light$position, _light$target$positio, _this$scene2, _this$scene3;
|
|
35
|
+
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
36
|
+
var _options$color = options.color,
|
|
37
|
+
color = _options$color === void 0 ? 0xffffff : _options$color,
|
|
38
|
+
_options$intensity = options.intensity,
|
|
39
|
+
intensity = _options$intensity === void 0 ? 1 : _options$intensity,
|
|
40
|
+
_options$position = options.position,
|
|
41
|
+
position = _options$position === void 0 ? [10, 10, 5] : _options$position,
|
|
42
|
+
_options$target = options.target,
|
|
43
|
+
target = _options$target === void 0 ? [0, 0, 0] : _options$target,
|
|
44
|
+
_options$castShadow = options.castShadow,
|
|
45
|
+
castShadow = _options$castShadow === void 0 ? true : _options$castShadow,
|
|
46
|
+
_options$shadowMapSiz = options.shadowMapSize,
|
|
47
|
+
shadowMapSize = _options$shadowMapSiz === void 0 ? 2048 : _options$shadowMapSiz,
|
|
48
|
+
_options$shadowCamera = options.shadowCameraNear,
|
|
49
|
+
shadowCameraNear = _options$shadowCamera === void 0 ? 0.5 : _options$shadowCamera,
|
|
50
|
+
_options$shadowCamera2 = options.shadowCameraFar,
|
|
51
|
+
shadowCameraFar = _options$shadowCamera2 === void 0 ? 50 : _options$shadowCamera2,
|
|
52
|
+
_options$shadowCamera3 = options.shadowCameraLeft,
|
|
53
|
+
shadowCameraLeft = _options$shadowCamera3 === void 0 ? -10 : _options$shadowCamera3,
|
|
54
|
+
_options$shadowCamera4 = options.shadowCameraRight,
|
|
55
|
+
shadowCameraRight = _options$shadowCamera4 === void 0 ? 10 : _options$shadowCamera4,
|
|
56
|
+
_options$shadowCamera5 = options.shadowCameraTop,
|
|
57
|
+
shadowCameraTop = _options$shadowCamera5 === void 0 ? 10 : _options$shadowCamera5,
|
|
58
|
+
_options$shadowCamera6 = options.shadowCameraBottom,
|
|
59
|
+
shadowCameraBottom = _options$shadowCamera6 === void 0 ? -10 : _options$shadowCamera6;
|
|
60
|
+
var light = new THREE.DirectionalLight(color, intensity);
|
|
61
|
+
(_light$position = light.position).set.apply(_light$position, _toConsumableArray(position));
|
|
62
|
+
(_light$target$positio = light.target.position).set.apply(_light$target$positio, _toConsumableArray(target));
|
|
63
|
+
if (castShadow) {
|
|
64
|
+
light.castShadow = true;
|
|
65
|
+
light.shadow.mapSize.width = shadowMapSize;
|
|
66
|
+
light.shadow.mapSize.height = shadowMapSize;
|
|
67
|
+
light.shadow.camera.near = shadowCameraNear;
|
|
68
|
+
light.shadow.camera.far = shadowCameraFar;
|
|
69
|
+
light.shadow.camera.left = shadowCameraLeft;
|
|
70
|
+
light.shadow.camera.right = shadowCameraRight;
|
|
71
|
+
light.shadow.camera.top = shadowCameraTop;
|
|
72
|
+
light.shadow.camera.bottom = shadowCameraBottom;
|
|
73
|
+
}
|
|
74
|
+
(_this$scene2 = _this.scene) === null || _this$scene2 === void 0 || _this$scene2.add(light);
|
|
75
|
+
(_this$scene3 = _this.scene) === null || _this$scene3 === void 0 || _this$scene3.add(light.target);
|
|
76
|
+
return light;
|
|
77
|
+
},
|
|
78
|
+
/**
|
|
79
|
+
* Add point light
|
|
80
|
+
* @param {Object} options - Light options
|
|
81
|
+
* @returns {THREE.PointLight} Point light
|
|
82
|
+
*/
|
|
83
|
+
addPoint: function addPoint() {
|
|
84
|
+
var _light$position2, _this$scene4;
|
|
85
|
+
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
86
|
+
var _options$color2 = options.color,
|
|
87
|
+
color = _options$color2 === void 0 ? 0xffffff : _options$color2,
|
|
88
|
+
_options$intensity2 = options.intensity,
|
|
89
|
+
intensity = _options$intensity2 === void 0 ? 1 : _options$intensity2,
|
|
90
|
+
_options$distance = options.distance,
|
|
91
|
+
distance = _options$distance === void 0 ? 0 : _options$distance,
|
|
92
|
+
_options$decay = options.decay,
|
|
93
|
+
decay = _options$decay === void 0 ? 2 : _options$decay,
|
|
94
|
+
_options$position2 = options.position,
|
|
95
|
+
position = _options$position2 === void 0 ? [0, 10, 0] : _options$position2,
|
|
96
|
+
_options$castShadow2 = options.castShadow,
|
|
97
|
+
castShadow = _options$castShadow2 === void 0 ? false : _options$castShadow2,
|
|
98
|
+
_options$shadowMapSiz2 = options.shadowMapSize,
|
|
99
|
+
shadowMapSize = _options$shadowMapSiz2 === void 0 ? 1024 : _options$shadowMapSiz2;
|
|
100
|
+
var light = new THREE.PointLight(color, intensity, distance, decay);
|
|
101
|
+
(_light$position2 = light.position).set.apply(_light$position2, _toConsumableArray(position));
|
|
102
|
+
if (castShadow) {
|
|
103
|
+
light.castShadow = true;
|
|
104
|
+
light.shadow.mapSize.width = shadowMapSize;
|
|
105
|
+
light.shadow.mapSize.height = shadowMapSize;
|
|
106
|
+
light.shadow.camera.near = 0.1;
|
|
107
|
+
light.shadow.camera.far = 25;
|
|
108
|
+
}
|
|
109
|
+
(_this$scene4 = _this.scene) === null || _this$scene4 === void 0 || _this$scene4.add(light);
|
|
110
|
+
return light;
|
|
111
|
+
},
|
|
112
|
+
/**
|
|
113
|
+
* Add spotlight
|
|
114
|
+
* @param {Object} options - Light options
|
|
115
|
+
* @returns {THREE.SpotLight} Spotlight
|
|
116
|
+
*/
|
|
117
|
+
addSpot: function addSpot() {
|
|
118
|
+
var _light$position3, _light$target$positio2, _this$scene5, _this$scene6;
|
|
119
|
+
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
120
|
+
var _options$color3 = options.color,
|
|
121
|
+
color = _options$color3 === void 0 ? 0xffffff : _options$color3,
|
|
122
|
+
_options$intensity3 = options.intensity,
|
|
123
|
+
intensity = _options$intensity3 === void 0 ? 1 : _options$intensity3,
|
|
124
|
+
_options$distance2 = options.distance,
|
|
125
|
+
distance = _options$distance2 === void 0 ? 0 : _options$distance2,
|
|
126
|
+
_options$angle = options.angle,
|
|
127
|
+
angle = _options$angle === void 0 ? Math.PI / 3 : _options$angle,
|
|
128
|
+
_options$penumbra = options.penumbra,
|
|
129
|
+
penumbra = _options$penumbra === void 0 ? 0 : _options$penumbra,
|
|
130
|
+
_options$decay2 = options.decay,
|
|
131
|
+
decay = _options$decay2 === void 0 ? 2 : _options$decay2,
|
|
132
|
+
_options$position3 = options.position,
|
|
133
|
+
position = _options$position3 === void 0 ? [0, 10, 0] : _options$position3,
|
|
134
|
+
_options$target2 = options.target,
|
|
135
|
+
target = _options$target2 === void 0 ? [0, 0, 0] : _options$target2,
|
|
136
|
+
_options$castShadow3 = options.castShadow,
|
|
137
|
+
castShadow = _options$castShadow3 === void 0 ? true : _options$castShadow3,
|
|
138
|
+
_options$shadowMapSiz3 = options.shadowMapSize,
|
|
139
|
+
shadowMapSize = _options$shadowMapSiz3 === void 0 ? 1024 : _options$shadowMapSiz3;
|
|
140
|
+
var light = new THREE.SpotLight(color, intensity, distance, angle, penumbra, decay);
|
|
141
|
+
(_light$position3 = light.position).set.apply(_light$position3, _toConsumableArray(position));
|
|
142
|
+
(_light$target$positio2 = light.target.position).set.apply(_light$target$positio2, _toConsumableArray(target));
|
|
143
|
+
if (castShadow) {
|
|
144
|
+
light.castShadow = true;
|
|
145
|
+
light.shadow.mapSize.width = shadowMapSize;
|
|
146
|
+
light.shadow.mapSize.height = shadowMapSize;
|
|
147
|
+
light.shadow.camera.near = 0.5;
|
|
148
|
+
light.shadow.camera.far = 50;
|
|
149
|
+
}
|
|
150
|
+
(_this$scene5 = _this.scene) === null || _this$scene5 === void 0 || _this$scene5.add(light);
|
|
151
|
+
(_this$scene6 = _this.scene) === null || _this$scene6 === void 0 || _this$scene6.add(light.target);
|
|
152
|
+
return light;
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
/**
|
|
156
|
+
* Material utilities
|
|
157
|
+
*/
|
|
158
|
+
_defineProperty(this, "materials", {
|
|
159
|
+
/**
|
|
160
|
+
* Create standard material
|
|
161
|
+
* @param {Object} options - Material options
|
|
162
|
+
* @returns {THREE.MeshStandardMaterial} Standard material
|
|
163
|
+
*/
|
|
164
|
+
createStandard: function createStandard() {
|
|
165
|
+
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
166
|
+
return new THREE.MeshStandardMaterial(_objectSpread2({
|
|
167
|
+
color: 0xffffff,
|
|
168
|
+
metalness: 0.0,
|
|
169
|
+
roughness: 0.5
|
|
170
|
+
}, options));
|
|
171
|
+
},
|
|
172
|
+
/**
|
|
173
|
+
* Create physical material
|
|
174
|
+
* @param {Object} options - Material options
|
|
175
|
+
* @returns {THREE.MeshPhysicalMaterial} Physical material
|
|
176
|
+
*/
|
|
177
|
+
createPhysical: function createPhysical() {
|
|
178
|
+
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
179
|
+
return new THREE.MeshPhysicalMaterial(_objectSpread2({
|
|
180
|
+
color: 0xffffff,
|
|
181
|
+
metalness: 0.0,
|
|
182
|
+
roughness: 0.5,
|
|
183
|
+
clearcoat: 0.0,
|
|
184
|
+
clearcoatRoughness: 0.0
|
|
185
|
+
}, options));
|
|
186
|
+
},
|
|
187
|
+
/**
|
|
188
|
+
* Create basic material
|
|
189
|
+
* @param {Object} options - Material options
|
|
190
|
+
* @returns {THREE.MeshBasicMaterial} Basic material
|
|
191
|
+
*/
|
|
192
|
+
createBasic: function createBasic() {
|
|
193
|
+
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
194
|
+
return new THREE.MeshBasicMaterial(_objectSpread2({
|
|
195
|
+
color: 0xffffff
|
|
196
|
+
}, options));
|
|
197
|
+
},
|
|
198
|
+
/**
|
|
199
|
+
* Create shader material
|
|
200
|
+
* @param {Object} options - Material options
|
|
201
|
+
* @returns {THREE.ShaderMaterial} Shader material
|
|
202
|
+
*/
|
|
203
|
+
createShader: function createShader() {
|
|
204
|
+
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
205
|
+
return new THREE.ShaderMaterial({
|
|
206
|
+
vertexShader: options.vertexShader || "\n void main() {\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }\n ",
|
|
207
|
+
fragmentShader: options.fragmentShader || "\n void main() {\n gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);\n }\n ",
|
|
208
|
+
uniforms: options.uniforms || {}
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
});
|
|
212
|
+
/**
|
|
213
|
+
* Geometry utilities
|
|
214
|
+
*/
|
|
215
|
+
_defineProperty(this, "geometry", {
|
|
216
|
+
/**
|
|
217
|
+
* Create box geometry
|
|
218
|
+
* @param {number} width - Width
|
|
219
|
+
* @param {number} height - Height
|
|
220
|
+
* @param {number} depth - Depth
|
|
221
|
+
* @returns {THREE.BoxGeometry} Box geometry
|
|
222
|
+
*/
|
|
223
|
+
createBox: function createBox() {
|
|
224
|
+
var width = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;
|
|
225
|
+
var height = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
|
|
226
|
+
var depth = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;
|
|
227
|
+
return new THREE.BoxGeometry(width, height, depth);
|
|
228
|
+
},
|
|
229
|
+
/**
|
|
230
|
+
* Create sphere geometry
|
|
231
|
+
* @param {number} radius - Radius
|
|
232
|
+
* @param {number} widthSegments - Width segments
|
|
233
|
+
* @param {number} heightSegments - Height segments
|
|
234
|
+
* @returns {THREE.SphereGeometry} Sphere geometry
|
|
235
|
+
*/
|
|
236
|
+
createSphere: function createSphere() {
|
|
237
|
+
var radius = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;
|
|
238
|
+
var widthSegments = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 32;
|
|
239
|
+
var heightSegments = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 16;
|
|
240
|
+
return new THREE.SphereGeometry(radius, widthSegments, heightSegments);
|
|
241
|
+
},
|
|
242
|
+
/**
|
|
243
|
+
* Create cylinder geometry
|
|
244
|
+
* @param {number} radiusTop - Top radius
|
|
245
|
+
* @param {number} radiusBottom - Bottom radius
|
|
246
|
+
* @param {number} height - Height
|
|
247
|
+
* @param {number} radialSegments - Radial segments
|
|
248
|
+
* @returns {THREE.CylinderGeometry} Cylinder geometry
|
|
249
|
+
*/
|
|
250
|
+
createCylinder: function createCylinder() {
|
|
251
|
+
var radiusTop = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;
|
|
252
|
+
var radiusBottom = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
|
|
253
|
+
var height = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;
|
|
254
|
+
var radialSegments = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 32;
|
|
255
|
+
return new THREE.CylinderGeometry(radiusTop, radiusBottom, height, radialSegments);
|
|
256
|
+
},
|
|
257
|
+
/**
|
|
258
|
+
* Create plane geometry
|
|
259
|
+
* @param {number} width - Width
|
|
260
|
+
* @param {number} height - Height
|
|
261
|
+
* @returns {THREE.PlaneGeometry} Plane geometry
|
|
262
|
+
*/
|
|
263
|
+
createPlane: function createPlane() {
|
|
264
|
+
var width = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;
|
|
265
|
+
var height = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
|
|
266
|
+
return new THREE.PlaneGeometry(width, height);
|
|
267
|
+
}
|
|
268
|
+
});
|
|
269
|
+
/**
|
|
270
|
+
* Render target utilities
|
|
271
|
+
*/
|
|
272
|
+
_defineProperty(this, "renderTargets", {
|
|
273
|
+
/**
|
|
274
|
+
* Create render target
|
|
275
|
+
* @param {number} width - Width
|
|
276
|
+
* @param {number} height - Height
|
|
277
|
+
* @param {Object} options - Render target options
|
|
278
|
+
* @returns {THREE.WebGLRenderTarget} Render target
|
|
279
|
+
*/
|
|
280
|
+
create: function create(width, height) {
|
|
281
|
+
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
282
|
+
var renderTarget = new THREE.WebGLRenderTarget(width, height, _objectSpread2({
|
|
283
|
+
minFilter: THREE.LinearFilter,
|
|
284
|
+
magFilter: THREE.LinearFilter,
|
|
285
|
+
format: THREE.RGBAFormat,
|
|
286
|
+
type: THREE.UnsignedByteType
|
|
287
|
+
}, options));
|
|
288
|
+
var id = "rt_".concat(Date.now(), "_").concat(Math.random().toString(36).substr(2, 9));
|
|
289
|
+
_this.renderTargets.set(id, renderTarget);
|
|
290
|
+
return {
|
|
291
|
+
id: id,
|
|
292
|
+
renderTarget: renderTarget
|
|
293
|
+
};
|
|
294
|
+
},
|
|
295
|
+
/**
|
|
296
|
+
* Get render target by ID
|
|
297
|
+
* @param {string} id - Render target ID
|
|
298
|
+
* @returns {THREE.WebGLRenderTarget} Render target
|
|
299
|
+
*/
|
|
300
|
+
get: function get(id) {
|
|
301
|
+
return _this.renderTargets.get(id);
|
|
302
|
+
},
|
|
303
|
+
/**
|
|
304
|
+
* Remove render target
|
|
305
|
+
* @param {string} id - Render target ID
|
|
306
|
+
*/
|
|
307
|
+
remove: function remove(id) {
|
|
308
|
+
var renderTarget = _this.renderTargets.get(id);
|
|
309
|
+
if (renderTarget) {
|
|
310
|
+
renderTarget.dispose();
|
|
311
|
+
_this.renderTargets.delete(id);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
});
|
|
315
|
+
/**
|
|
316
|
+
* Animation utilities
|
|
317
|
+
*/
|
|
318
|
+
_defineProperty(this, "animation", {
|
|
319
|
+
/**
|
|
320
|
+
* Create animation mixer
|
|
321
|
+
* @param {THREE.Object3D} object - Object to animate
|
|
322
|
+
* @returns {THREE.AnimationMixer} Animation mixer
|
|
323
|
+
*/
|
|
324
|
+
createMixer: function createMixer(object) {
|
|
325
|
+
_this.animationMixer = new THREE.AnimationMixer(object);
|
|
326
|
+
return _this.animationMixer;
|
|
327
|
+
},
|
|
328
|
+
/**
|
|
329
|
+
* Add animation clip
|
|
330
|
+
* @param {THREE.AnimationClip} clip - Animation clip
|
|
331
|
+
* @returns {THREE.AnimationAction} Animation action
|
|
332
|
+
*/
|
|
333
|
+
addClip: function addClip(clip) {
|
|
334
|
+
if (!_this.animationMixer) {
|
|
335
|
+
throw new Error('Animation mixer not created');
|
|
336
|
+
}
|
|
337
|
+
return _this.animationMixer.clipAction(clip);
|
|
338
|
+
},
|
|
339
|
+
/**
|
|
340
|
+
* Update animations
|
|
341
|
+
* @param {number} deltaTime - Delta time
|
|
342
|
+
*/
|
|
343
|
+
update: function update(deltaTime) {
|
|
344
|
+
if (_this.animationMixer) {
|
|
345
|
+
_this.animationMixer.update(deltaTime);
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
});
|
|
349
|
+
/**
|
|
350
|
+
* Screenshot utilities
|
|
351
|
+
*/
|
|
352
|
+
_defineProperty(this, "screenshot", {
|
|
353
|
+
/**
|
|
354
|
+
* Capture screenshot as data URL
|
|
355
|
+
* @param {string} format - Image format
|
|
356
|
+
* @param {number} quality - Image quality (0-1)
|
|
357
|
+
* @returns {string} Data URL
|
|
358
|
+
*/
|
|
359
|
+
toDataURL: function toDataURL() {
|
|
360
|
+
var format = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'image/png';
|
|
361
|
+
var quality = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1.0;
|
|
362
|
+
if (!_this.renderer) return '';
|
|
363
|
+
return _this.renderer.domElement.toDataURL(format, quality);
|
|
364
|
+
},
|
|
365
|
+
/**
|
|
366
|
+
* Capture screenshot as blob
|
|
367
|
+
* @param {string} format - Image format
|
|
368
|
+
* @param {number} quality - Image quality (0-1)
|
|
369
|
+
* @returns {Promise<Blob>} Image blob
|
|
370
|
+
*/
|
|
371
|
+
toBlob: function toBlob() {
|
|
372
|
+
var format = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'image/png';
|
|
373
|
+
var quality = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1.0;
|
|
374
|
+
if (!_this.renderer) return Promise.resolve(null);
|
|
375
|
+
return new Promise(function (resolve) {
|
|
376
|
+
_this.renderer.domElement.toBlob(resolve, format, quality);
|
|
377
|
+
});
|
|
378
|
+
}
|
|
379
|
+
});
|
|
380
|
+
this.options = _objectSpread2({
|
|
381
|
+
antialias: true,
|
|
382
|
+
alpha: true,
|
|
383
|
+
shadowMapEnabled: true,
|
|
384
|
+
shadowMapType: THREE.PCFSoftShadowMap,
|
|
385
|
+
toneMapping: THREE.ACESFilmicToneMapping,
|
|
386
|
+
toneMappingExposure: 1.0,
|
|
387
|
+
outputColorSpace: THREE.SRGBColorSpace
|
|
388
|
+
}, _options);
|
|
389
|
+
this.renderer = null;
|
|
390
|
+
this.scene = null;
|
|
391
|
+
this.camera = null;
|
|
392
|
+
this.controls = null;
|
|
393
|
+
this.renderTargets = new Map();
|
|
394
|
+
this.postProcessing = {
|
|
395
|
+
composer: null,
|
|
396
|
+
passes: []
|
|
397
|
+
};
|
|
398
|
+
this.stats = {
|
|
399
|
+
triangles: 0,
|
|
400
|
+
geometries: 0,
|
|
401
|
+
textures: 0,
|
|
402
|
+
calls: 0,
|
|
403
|
+
frameTime: 0
|
|
404
|
+
};
|
|
405
|
+
this.animationMixer = null;
|
|
406
|
+
this.clock = new THREE.Clock();
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
/**
|
|
410
|
+
* Initialize renderer
|
|
411
|
+
* @param {HTMLElement} container - Container element
|
|
412
|
+
* @returns {THREE.WebGLRenderer} Renderer instance
|
|
413
|
+
*/
|
|
414
|
+
return _createClass(Rendering3D, [{
|
|
415
|
+
key: "initializeRenderer",
|
|
416
|
+
value: function initializeRenderer(container) {
|
|
417
|
+
if (this.renderer) {
|
|
418
|
+
this.dispose();
|
|
419
|
+
}
|
|
420
|
+
try {
|
|
421
|
+
this.renderer = new THREE.WebGLRenderer({
|
|
422
|
+
antialias: this.options.antialias,
|
|
423
|
+
alpha: this.options.alpha,
|
|
424
|
+
preserveDrawingBuffer: false,
|
|
425
|
+
powerPreference: 'high-performance'
|
|
426
|
+
});
|
|
427
|
+
|
|
428
|
+
// Configure renderer
|
|
429
|
+
this.renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));
|
|
430
|
+
this.renderer.setSize(container.clientWidth, container.clientHeight);
|
|
431
|
+
this.renderer.setClearColor(0x000000, 0);
|
|
432
|
+
|
|
433
|
+
// Shadow mapping
|
|
434
|
+
if (this.options.shadowMapEnabled) {
|
|
435
|
+
this.renderer.shadowMap.enabled = true;
|
|
436
|
+
this.renderer.shadowMap.type = this.options.shadowMapType;
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
// Tone mapping
|
|
440
|
+
this.renderer.toneMapping = this.options.toneMapping;
|
|
441
|
+
this.renderer.toneMappingExposure = this.options.toneMappingExposure;
|
|
442
|
+
this.renderer.outputColorSpace = this.options.outputColorSpace;
|
|
443
|
+
|
|
444
|
+
// Physical lights
|
|
445
|
+
this.renderer.useLegacyLights = false;
|
|
446
|
+
container.appendChild(this.renderer.domElement);
|
|
447
|
+
logger.info('✅ 3D Renderer initialized');
|
|
448
|
+
return this.renderer;
|
|
449
|
+
} catch (error) {
|
|
450
|
+
logger.error('❌ Failed to initialize 3D renderer:', error);
|
|
451
|
+
throw error;
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
/**
|
|
456
|
+
* Create and configure scene
|
|
457
|
+
* @param {Object} options - Scene options
|
|
458
|
+
* @returns {THREE.Scene} Scene instance
|
|
459
|
+
*/
|
|
460
|
+
}, {
|
|
461
|
+
key: "createScene",
|
|
462
|
+
value: function createScene() {
|
|
463
|
+
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
464
|
+
var _options$background = options.background,
|
|
465
|
+
background = _options$background === void 0 ? null : _options$background,
|
|
466
|
+
_options$environment = options.environment,
|
|
467
|
+
environment = _options$environment === void 0 ? null : _options$environment,
|
|
468
|
+
_options$fog = options.fog,
|
|
469
|
+
fog = _options$fog === void 0 ? null : _options$fog;
|
|
470
|
+
this.scene = new THREE.Scene();
|
|
471
|
+
if (background) {
|
|
472
|
+
if (typeof background === 'string') {
|
|
473
|
+
this.scene.background = new THREE.Color(background);
|
|
474
|
+
} else if (background.isTexture) {
|
|
475
|
+
this.scene.background = background;
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
if (environment && environment.isTexture) {
|
|
479
|
+
this.scene.environment = environment;
|
|
480
|
+
}
|
|
481
|
+
if (fog) {
|
|
482
|
+
if (fog.type === 'linear') {
|
|
483
|
+
this.scene.fog = new THREE.Fog(fog.color, fog.near, fog.far);
|
|
484
|
+
} else if (fog.type === 'exponential') {
|
|
485
|
+
this.scene.fog = new THREE.FogExp2(fog.color, fog.density);
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
logger.info('✅ 3D Scene created');
|
|
489
|
+
return this.scene;
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
/**
|
|
493
|
+
* Create camera
|
|
494
|
+
* @param {string} type - Camera type ('perspective' or 'orthographic')
|
|
495
|
+
* @param {Object} options - Camera options
|
|
496
|
+
* @returns {THREE.Camera} Camera instance
|
|
497
|
+
*/
|
|
498
|
+
}, {
|
|
499
|
+
key: "createCamera",
|
|
500
|
+
value: function createCamera() {
|
|
501
|
+
var _this$renderer;
|
|
502
|
+
var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'perspective';
|
|
503
|
+
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
504
|
+
var container = (_this$renderer = this.renderer) === null || _this$renderer === void 0 || (_this$renderer = _this$renderer.domElement) === null || _this$renderer === void 0 ? void 0 : _this$renderer.parentElement;
|
|
505
|
+
var aspect = container ? container.clientWidth / container.clientHeight : 1;
|
|
506
|
+
if (type === 'perspective') {
|
|
507
|
+
var _options$fov = options.fov,
|
|
508
|
+
fov = _options$fov === void 0 ? 75 : _options$fov,
|
|
509
|
+
_options$near = options.near,
|
|
510
|
+
near = _options$near === void 0 ? 0.1 : _options$near,
|
|
511
|
+
_options$far = options.far,
|
|
512
|
+
far = _options$far === void 0 ? 1000 : _options$far;
|
|
513
|
+
options.position;
|
|
514
|
+
this.camera = new THREE.PerspectiveCamera(fov, aspect, near, far);
|
|
515
|
+
} else if (type === 'orthographic') {
|
|
516
|
+
var _options$left = options.left,
|
|
517
|
+
left = _options$left === void 0 ? -10 : _options$left,
|
|
518
|
+
_options$right = options.right,
|
|
519
|
+
right = _options$right === void 0 ? 10 : _options$right,
|
|
520
|
+
_options$top = options.top,
|
|
521
|
+
top = _options$top === void 0 ? 10 : _options$top,
|
|
522
|
+
_options$bottom = options.bottom,
|
|
523
|
+
bottom = _options$bottom === void 0 ? -10 : _options$bottom,
|
|
524
|
+
_options$near2 = options.near,
|
|
525
|
+
_near = _options$near2 === void 0 ? 0.1 : _options$near2,
|
|
526
|
+
_options$far2 = options.far,
|
|
527
|
+
_far = _options$far2 === void 0 ? 1000 : _options$far2;
|
|
528
|
+
options.position;
|
|
529
|
+
this.camera = new THREE.OrthographicCamera(left, right, top, bottom, _near, _far);
|
|
530
|
+
}
|
|
531
|
+
if (this.camera) {
|
|
532
|
+
var _this$camera$position;
|
|
533
|
+
(_this$camera$position = this.camera.position).set.apply(_this$camera$position, _toConsumableArray(position));
|
|
534
|
+
logger.info("\u2705 ".concat(type, " camera created"));
|
|
535
|
+
}
|
|
536
|
+
return this.camera;
|
|
537
|
+
}
|
|
538
|
+
}, {
|
|
539
|
+
key: "render",
|
|
540
|
+
value:
|
|
541
|
+
/**
|
|
542
|
+
* Render scene
|
|
543
|
+
* @param {THREE.Scene} scene - Scene to render (optional)
|
|
544
|
+
* @param {THREE.Camera} camera - Camera to use (optional)
|
|
545
|
+
* @param {THREE.WebGLRenderTarget} renderTarget - Render target (optional)
|
|
546
|
+
*/
|
|
547
|
+
function render() {
|
|
548
|
+
var scene = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
|
|
549
|
+
var camera = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
|
|
550
|
+
var renderTarget = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
|
|
551
|
+
if (!this.renderer) return;
|
|
552
|
+
var renderScene = scene || this.scene;
|
|
553
|
+
var renderCamera = camera || this.camera;
|
|
554
|
+
if (!renderScene || !renderCamera) return;
|
|
555
|
+
|
|
556
|
+
// Update stats
|
|
557
|
+
var startTime = performance.now();
|
|
558
|
+
|
|
559
|
+
// Update animations
|
|
560
|
+
var deltaTime = this.clock.getDelta();
|
|
561
|
+
this.animation.update(deltaTime);
|
|
562
|
+
|
|
563
|
+
// Render
|
|
564
|
+
this.renderer.render(renderScene, renderCamera, renderTarget);
|
|
565
|
+
|
|
566
|
+
// Update stats
|
|
567
|
+
this.stats.frameTime = performance.now() - startTime;
|
|
568
|
+
this.updateRenderStats();
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
/**
|
|
572
|
+
* Update render statistics
|
|
573
|
+
*/
|
|
574
|
+
}, {
|
|
575
|
+
key: "updateRenderStats",
|
|
576
|
+
value: function updateRenderStats() {
|
|
577
|
+
if (!this.renderer) return;
|
|
578
|
+
var info = this.renderer.info;
|
|
579
|
+
this.stats.triangles = info.render.triangles;
|
|
580
|
+
this.stats.geometries = info.memory.geometries;
|
|
581
|
+
this.stats.textures = info.memory.textures;
|
|
582
|
+
this.stats.calls = info.render.calls;
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
/**
|
|
586
|
+
* Get render statistics
|
|
587
|
+
* @returns {Object} Render stats
|
|
588
|
+
*/
|
|
589
|
+
}, {
|
|
590
|
+
key: "getRenderStats",
|
|
591
|
+
value: function getRenderStats() {
|
|
592
|
+
return _objectSpread2({}, this.stats);
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
/**
|
|
596
|
+
* Resize renderer
|
|
597
|
+
* @param {number} width - New width
|
|
598
|
+
* @param {number} height - New height
|
|
599
|
+
*/
|
|
600
|
+
}, {
|
|
601
|
+
key: "resize",
|
|
602
|
+
value: function resize(width, height) {
|
|
603
|
+
if (!this.renderer) return;
|
|
604
|
+
this.renderer.setSize(width, height);
|
|
605
|
+
if (this.camera) {
|
|
606
|
+
if (this.camera.isPerspectiveCamera) {
|
|
607
|
+
this.camera.aspect = width / height;
|
|
608
|
+
} else if (this.camera.isOrthographicCamera) {
|
|
609
|
+
var aspect = width / height;
|
|
610
|
+
this.camera.left = -10 * aspect;
|
|
611
|
+
this.camera.right = 10 * aspect;
|
|
612
|
+
this.camera.top = 10;
|
|
613
|
+
this.camera.bottom = -10;
|
|
614
|
+
}
|
|
615
|
+
this.camera.updateProjectionMatrix();
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
// Update render targets
|
|
619
|
+
this.renderTargets.forEach(function (renderTarget) {
|
|
620
|
+
renderTarget.setSize(width, height);
|
|
621
|
+
});
|
|
622
|
+
}
|
|
623
|
+
}, {
|
|
624
|
+
key: "dispose",
|
|
625
|
+
value:
|
|
626
|
+
/**
|
|
627
|
+
* Dispose of all resources
|
|
628
|
+
*/
|
|
629
|
+
function dispose() {
|
|
630
|
+
// Dispose render targets
|
|
631
|
+
this.renderTargets.forEach(function (renderTarget) {
|
|
632
|
+
renderTarget.dispose();
|
|
633
|
+
});
|
|
634
|
+
this.renderTargets.clear();
|
|
635
|
+
|
|
636
|
+
// Dispose animation mixer
|
|
637
|
+
if (this.animationMixer) {
|
|
638
|
+
this.animationMixer.stopAllAction();
|
|
639
|
+
this.animationMixer = null;
|
|
640
|
+
}
|
|
641
|
+
|
|
642
|
+
// Dispose renderer
|
|
643
|
+
if (this.renderer) {
|
|
644
|
+
this.renderer.dispose();
|
|
645
|
+
this.renderer.forceContextLoss();
|
|
646
|
+
if (this.renderer.domElement.parentElement) {
|
|
647
|
+
this.renderer.domElement.parentElement.removeChild(this.renderer.domElement);
|
|
648
|
+
}
|
|
649
|
+
this.renderer = null;
|
|
650
|
+
}
|
|
651
|
+
|
|
652
|
+
// Clear references
|
|
653
|
+
this.scene = null;
|
|
654
|
+
this.camera = null;
|
|
655
|
+
this.controls = null;
|
|
656
|
+
logger.info('✅ 3D Rendering disposed');
|
|
657
|
+
}
|
|
658
|
+
}]);
|
|
659
|
+
}();
|
|
660
|
+
|
|
661
|
+
export { Rendering3D };
|