UNPKG

vicowa-web-components

Version:
2 lines 24.5 kB
import"/third_party/earcut/dist/earcut.dev.js";import"/third_party/babylonjs/babylon.max.js";import"/third_party/babylonjs-loaders/babylonjs.loaders.js";import{WebComponentBaseClass as e}from"/third_party/web-component-base-class/dist/web-component-base-class.js";import"../vicowa-resize-detector/vicowa-resize-detector.js";import{CAMERA_TYPES as t,CAP_TYPES as i}from"./vicowa-webgl-definitions.js";import{intersectRayAndTriangle as a,toDegrees as n,toRadians as s,vectorLength as r}from"../utilities/mathHelpers.js";import o from"../utilities/debug.js";const l=Symbol("meshContainer"),c=Symbol("wrapReference"),d=Symbol("originalDispose");function h(e){return e[l]}const u=window.BABYLON;let p=0;function m(e){return o.assert(!e||!/--/.test(e),"names containing a double dash '--' are reserved for internal use only"),e||"objectID--"+ ++p}function g(e,t,i){return Object.keys(e).filter((e=>i.includes(e))).forEach((i=>{e[i]=(e[i]||0)*t})),e}function f(e,t){return g(e,t,["x","y","z"])}function v(e){return Array.isArray(e)?{x:e[0],y:e[1],z:e[2]}:e}function b(e){return new u.Vector3(e.x,e.y,e.z)}function x(e){return[e].concat(e.getChildMeshes(!1))}function y(e,t){let i=null;return Array.isArray(t)?(i=e.meshes[t[0]]||e.instances[t[0]],t.slice(1).forEach((e=>{i&&(i=i.getChildMeshes(!0,(t=>t.name===e))[0])}))):i="string"==typeof t?e.meshes[t]||e.instances[t]:h(t),i}function C(e,t){let i=y(e,t);for(;i&&e.meshes[i.name]!==i;)i=i.parent;return i}function w(e,t,i){e[t]=i,e.getChildMeshes(!1).forEach((e=>{e[t]=i}))}function D(e){const t=new u.ShadowGenerator(1024,e);return t.getShadowMap().refreshRate=u.RenderTargetTexture.REFRESHRATE_RENDER_ONCE,t.bias=1e-4,t.forceBackFacesOnly=!0,t.normalBias=.02,e.shadowMaxZ=1e3,e.shadowMinZ=-1e3,t.useContactHardeningShadow=!0,t.contactHardeningLightSizeUVRatio=.05,t.setDarkness(.2),t}function M(e,t){Object.keys(e.lights).forEach((i=>{const a=e.lights[i];a.shadowGenerator&&a.shadowGenerator.addShadowCaster(t)}))}function O(e,t,i,a){Object.keys(e).forEach((n=>{t.includes(n)||w(e[n],i,a)}))}function S(e,t,i){Object.assign(e.position,f(t,i))}function j(e,t){e.rotation.x=void 0!==t.x?s(t.x):e.rotation.x,e.rotation.y=void 0!==t.y?s(t.y):e.rotation.y,e.rotation.z=void 0!==t.z?s(t.z):e.rotation.z}function B(e,t){Object.assign(e.scaling,t)}function k(e,t,i){const a=e.materials[t]||new u.StandardMaterial(t,e.scene);return i.diffuse&&Object.assign(a.diffuseColor,i.diffuse),i.specular&&Object.assign(a.specularColor,i.specular),i.emissive&&Object.assign(a.emissiveColor,i.emissive),i.ambient&&Object.assign(a.ambientColor,i.ambient),void 0!==i.alpha&&(a.alpha=i.alpha),i.texture&&i.texture.src&&(a.invertNormalMapY=a.invertNormalMapX=i.texture.invertBump||!1,i.texture.src&&(a.diffuseTexture=new u.Texture(i.texture.src,e.scene),a.diffuseTexture.hasAlpha=i.texture.alpha||!1),i.texture.bumpSrc&&(a.bumpTexture=new u.Texture(i.texture.bumpSrc,e.scene)),i.texture.opacitySrc&&(a.opacityTexture=new u.Texture(i.texture.opacitySrc,e.scene)),i.texture.xScale&&(a.diffuseTexture&&(a.diffuseTexture.uScale=i.texture.xScale),a.bumpTexture&&(a.bumpTexture.uScale=i.texture.xScale),a.opacityTexture&&(a.opacityTexture.uScale=i.texture.xScale)),i.texture.yScale&&(a.diffuseTexture&&(a.diffuseTexture.vScale=i.texture.yScale),a.bumpTexture&&(a.bumpTexture.vScale=i.texture.yScale),a.opacityTexture&&(a.opacityTexture.vScale=i.texture.yScale))),e.materials[t]=a,a}function z(e,t,i){if(t&&i){if(i.position&&S(t,i.position,e.multiplier),i.rotation&&j(t,i.rotation),i.scale&&B(t,i.scale),void 0!==i.visible&&w(t,"isVisible",i.visible),void 0!==i.collisions&&w(t,"checkCollisions",i.collisions),i.material)if("string"==typeof i.material){const a=e.materials[i.material];a&&(t.material=a)}else if(i.material.name){const a=k(e,i.material.name,i.material);a&&(t.material=a)}t.renderingGroupId=void 0===i.renderingGroupId?t.renderingGroupId||1:i.renderingGroupId,t.outline=void 0===i.outline?t.outline:i.outline,void 0!==i.shadows&&i.shadows&&(M(e,t),t.receiveShadows=!0)}return t}function E(e,t){const i=e.createInstance(t);return e.getChildren().forEach((e=>i.addChild(E(e,`${t}-${e.name}`)))),i}function P(e,t,i){return z(e,u.MeshBuilder.CreateSphere(m(i),{segments:t.segments||16,diameter:(t.diameter||1)*e.multiplier,diameterX:(t.diameterX||t.diameter||1)*e.multiplier,diameterY:(t.diameterY||t.diameter||1)*e.multiplier,diameterZ:(t.diameterZ||t.diameter||1)*e.multiplier,arc:t.arc||1,slice:t.slice||1,sideOrientation:t.sideOrientation},e.scene),t)}function T(e,t,i){return z(e,u.MeshBuilder.CreateBox(m(i),{width:(t.width||1)*e.multiplier,height:(t.height||1)*e.multiplier,depth:(t.depth||1)*e.multiplier,sideOrientation:t.sideOrientation},e.scene),t)}function L(e,t,i){return z(e,u.MeshBuilder.CreatePlane(m(i),{width:(t.width||1)*e.multiplier,height:(t.height||1)*e.multiplier,sideOrientation:t.sideOrientation},e.scene),t)}function I(e,t,i){const a=t.points.map((t=>new u.Vector3(t.x*e.multiplier,t.y*e.multiplier,t.z*e.multiplier))),n=a.length>1?u.MeshBuilder.CreateLines(m(i),{points:a},e.scene):null;return n?z(e,n,t):null}function A(e,t,i){const a=(t.outline||[]).map((t=>b(f(v(t),e.multiplier)))),n=(t.holes||[]).map((t=>t.map((t=>b(f(v(t),e.multiplier))))));return a.length?z(e,u.MeshBuilder.ExtrudePolygon(m(i),{shape:a,depth:(t.depth||0)*e.multiplier,holes:n},e.scene),t):null}function R(e,t,i){return z(e,u.MeshBuilder.CreateCylinder(m(i),{height:(t.height||1)*e.multiplier,diameter:void 0===t.diameter?t.diameter:(t.diameter||1)*e.multiplier,diameterTop:(void 0===t.diameterTop?t.diameter||1:t.diameterTop)*e.multiplier,diameterBottom:(void 0===t.diameterBottom?t.diameter||1:t.diameterBottom)*e.multiplier,tessellation:t.segments||16,arc:t.arc||1,enclose:t.enclose||!1},e.scene),t)}const V={};function G(e,t,i){const a=(t.path||[]).map((t=>b(f(v(t),e.multiplier))));return a.length?z(e,u.MeshBuilder.CreateTube(m(i),{path:a,radius:(t.radius||1)*e.multiplier,tessellation:t.segments||16,arc:t.arc||1,cap:V[t.cap]||u.Mesh.NO_CAP},e.scene),t):null}function _(e,t){let i=t?t[c]:null;return!i&&t&&(i={get visible(){return this[l].isVisible},set visible(e){w(this[l],"isVisible",e)},get parent(){return _(e,this[l].parent)},get center(){const t=this[l].getBoundingInfo(),i=t&&t.boundingBox?t.boundingBox.centerWorld:null;return{x:i.x/e.multiplier,y:i.y/e.multiplier,z:i.z/e.multiplier}},get maximum(){const t=this[l].getBoundingInfo(),i=t&&t.boundingBox?t.boundingBox.maximumWorld:null;return{x:i.x/e.multiplier,y:i.y/e.multiplier,z:i.z/e.multiplier}},get minimum(){const t=this[l].getBoundingInfo(),i=t&&t.boundingBox?t.boundingBox.minimumWorld:null;return{x:i.x/e.multiplier,y:i.y/e.multiplier,z:i.z/e.multiplier}},get boundingVectors(){const t=this[l].getBoundingInfo();return t&&t.boundingBox?t.boundingBox.vectorsWorld.map((t=>({x:t.x/e.multiplier,y:t.y/e.multiplier,z:t.z/e.multiplier}))):null},get name(){return this[l].name},get position(){return{x:this[l].position.x/e.multiplier,y:this[l].position.y/e.multiplier,z:this[l].position.z/e.multiplier}},set position(t){S(this[l],t,e.multiplier)},get scale(){return{x:this[l].scaling.x,y:this[l].scaling.y,z:this[l].scaling.z}},set scale(e){B(this[l],e)},get rotation(){return{x:n(this[l].rotation.x),y:n(this[l].rotation.y),z:n(this[l].rotation.z)}},set rotation(e){j(this[l],e)},clone(t){return _(e,this[l].clone(m(t)))},updateCoordinates(){this[l].computeWorldMatrix(!0)},remove(){this[l].dispose()},applySettings(t){z(e,this[l],t)},offset(t){this[l].position.addInPlace({x:t.x*e.multiplier,y:t.y*e.multiplier,z:t.z*e.multiplier})},isRemoved(){return void 0===this[l]}},i[l]=t,t[c]=i,t[d]=t.dispose,t.dispose=function(){this[c].onRemove&&this[c].onRemove(this[c]),delete e.meshes[this.name],delete e.instances[this.name],delete this[c][l],delete this[c],this.dispose=this[d],delete this[d],this.dispose()}),i}function N(e,t){const i=_(e,t);return i.addChild=function(e){this[l].addChild(h(e))},i.removeChild=function(e){this[l].removeChild(h(e))},i.addChildren=function(e){const t=this[l];e.forEach((e=>t.addChild(h(e))))},i.getChildren=function(t,i){return this[l].getChildMeshes(!i,(i=>!t||t(_(e,i)))).map((t=>_(e,t)))},i.clone=function(t){return N(e,this[l].clone(m(t)))},i}function W(e,t){return{event:t.event,hitObject:t.pickInfo.hit?_(e,t.pickInfo.pickedMesh):null}}V[i.NO_CAP]=u.Mesh.NO_CAP,V[i.CAP_START]=u.Mesh.CAP_START,V[i.CAP_END]=u.Mesh.CAP_END,V[i.CAP_ALL]=u.Mesh.CAP_ALL;export class VicowaWebgl extends e{#e;constructor(){super(),this.#e={lights:{},meshes:{},instances:{},materials:{},allObjectCollisions:!0,defaultShadows:!0,multiplier:10,assetsManager:null,scene:null,engine:null,extensions:[]}}static get properties(){return{loadingScreen:{type:Boolean,value:!1,reflectToAttribute:!0,observer:e=>e.#t()},selectionBoundingBox:{type:Boolean,value:!1,reflectToAttribute:!0,observer:e=>e.#i()}}}addExtension(e){const t=this.#e;-1===t.extensions.indexOf(e)&&(t.extensions.push(e),t.scene&&this.#a(e))}async addObjectResource(e,t,i,a){const n=this.#e,s=n.assetsManager.addMeshTask(e,t,`${i.split("/").slice(0,-1).join("/")}/`,i.split("/").slice(-1)[0]);return await new Promise(((t,i)=>{s.onSuccess=i=>{let s=null;if(a.position||(a.position={x:0,y:0,z:0}),1===i.loadedMeshes.length)s=this.#n(z(n,i.loadedMeshes[0],a));else{const t=new u.Mesh(e,n.scene);i.loadedMeshes.forEach((e=>{e.renderingGroupId=1,e.addChild(e)})),s=this.#n(z(n,t,a))}t(_(n,s))},s.onError=(e,t,a)=>{i({message:t,exception:a})},n.assetsManager.load()}))}set unitMultiplier(e){this.#e.multiplier=e}get unitMultiplier(){return this.#e.multiplier}setBackgroundColor(e,t,i){this.#e.scene.clearColor=new u.Color3(e,t,i)}setAmbientColor(e,t,i){this.#e.scene.ambientColor=new u.Color3(e,t,i)}createSkyBox(e){const t=this.#e,i=u.MeshBuilder.CreateBox("skyBox",{size:1e4,sideOrientation:u.Mesh.BACKSIDE},t.scene),a=new u.StandardMaterial("skyBox",t.scene);a.backFaceCulling=!0,a.reflectionTexture=new u.CubeTexture(e,t.scene),a.reflectionTexture.coordinatesMode=u.Texture.SKYBOX_MODE,a.diffuseColor=new u.Color3(0,0,0),a.specularColor=new u.Color3(0,0,0),a.disableLighting=!0,i.material=a,i.infiniteDistance=!0,i.renderingGroupId=0}addSphere(e,t){return _(this.#e,this.#n(P(this.#e,this.#s(e),t)))}addBox(e,t){return _(this.#e,this.#n(T(this.#e,this.#s(e),t)))}addPlane(e,t){return _(this.#e,this.#n(L(this.#e,this.#s(e),t)))}addPolyLine(e,t){return _(this.#e,this.#n(I(this.#e,this.#s(e),t)))}addExtrudedPolygon(e,t){return _(this.#e,this.#n(A(this.#e,this.#s(e),t)))}addCylinder(e,t){return _(this.#e,this.#n(R(this.#e,this.#s(e),t)))}addTube(e,t){return _(this.#e,this.#n(G(this.#e,this.#s(e),t)))}addGround(e,t){return _(this.#e,function(e,t,i){const a=Object.assign({},t,{shadows:!1,collisions:!1}),n=z(e,u.MeshBuilder.CreateGround(m(i),{width:(a.width||1)*e.multiplier,height:(a.height||1)*e.multiplier,subdivisions:a.subdivisions||1},e.scene),a);e.meshes[n.name]=n,n.receiveShadows=!0,n.checkCollisions=e.allObjectCollisions}(this.#e,e,t))}getObjectByNameOrPath(e){return _(this.#e,y(this.#e,e))}createObjectInstance(e,t,i,a){const n=this.#e,s=n.meshes[t];if(s){i=i||1;for(let t=0;t<i;t++){const i=e+t;this.#r(i,E(s.createInstance,i),a)}}return s?_(n,s):null}startRendering(){const e=this.#e;e.engine.runRenderLoop((()=>{e.scene.render()}))}stopRendering(){this.#e.engine.stopRenderLoop()}addEnvironmentalLight(e,t){const i=this.#e,a=new u.HemisphericLight(m(t),new u.Vector3(e.x||0,e.y||0,e.z||0),i.scene);i.lights[a.name]={light:a},this.setEnvironmentalLightColor(e.color.ground,a.name),this.setLightColors(e.color,a.name)}setEnvironmentalLightColor(e,t){const i=this.#e.lights[t];i&&i instanceof u.HemisphericLight&&Object.assign(i.light.groundColor,e)}addDirectionalLight(e,t){const i=this.#e,a=new u.DirectionalLight(m(t),new u.Vector3(e.x||0,e.y||0,e.z||0),i.scene);i.lights[a.name]={light:a},this.setLightColors(e.color,a.name),e.generateShadows&&(i.lights[a.name].shadowGenerator=D(a))}addPointLight(e,t){const i=this.#e,a=new u.PointLight(m(t),new u.Vector3(e.x*this.unitMultiplier||0,e.y*this.unitMultiplier||0,e.z*this.unitMultiplier||0),i.scene);i.lights[a.name]={light:a},this.setLightColors(e.color,a.name),e.generateShadows&&(i.lights[a.name].shadowGenerator=D(a))}addSpotLight(e,t){const i=this.#e,a=new u.SpotLight(m(t),new u.Vector3(e.x*this.unitMultiplier||0,e.y*this.unitMultiplier||0,e.z*this.unitMultiplier||0),new u.Vector3(e.direction.x||0,e.direction.y||0,e.direction.z||0),e.angle||0,(e.reach||100)*this.unitMultiplier,i.scene);i.lights[a.name]={light:a},this.setLightColors(e.color,a.name),e.generateShadows&&(i.lights[a.name].shadowGenerator=D(a))}removeLight(e){const t=this.#e;t.lights[e].light.dispose(),delete t.lights[e]}setLightColors(e,t){const i=this.#e.lights[t];i&&(e.diffuse&&Object.assign(i.light.diffuse,e.diffuse),e.specular&&Object.assign(i.light.specular,e.specular))}setObjectPosition(e,t){const i=y(this.#e,e);i&&S(i,t,this.unitMultiplier)}setObjectRotation(e,t){const i=y(this.#e,e);i&&j(i,t)}setObjectScale(e,t){const i=y(this.#e,e);i&&B(i,t)}setCameraTarget(e){const t=this.#e,i=y(t,e);i&&(t.camera.lockedTarget=i)}addMaterial(e,t){return k(this.#e,e,t)}setObjectMaterial(e,t){const i=this.#e;if("string"==typeof t){(Array.isArray(e)?e:[e]).forEach((e=>{const a=y(i,e),n=i.materials[t];a&&n&&(a.material=n)}))}}setGravity(e){Object.assign(this.#e.scene.gravity,e)}set defaultShadows(e){this.#e.defaultShadows=e}get defaultShadows(){return this.#e.defaultShadows}set cameraGravity(e){this.#e.camera.applyGravity=e}get cameraGravity(){return this.#e.camera.applyGravity}set cameraCollisions(e){this.#e.camera.checkCollisions=e}get cameraCollisions(){return this.#e.camera.checkCollisions}setObjectVisibility(e,t){const i=y(this.#e,e);i&&w(i,"isVisible",t||!1)}isObjectVisible(e){const t=y(this.#e,e);return t?t.isVisible:void 0}setVirtualBody(e){const t=this.#e;if(!t.camera)throw new Error("make sure to set a camera before calling this function");t.camera instanceof u.ArcRotateCamera?Object.assign(t.camera.collisionRadius,f(e.bodySize||{},this.unitMultiplier)):(Object.assign(t.camera.ellipsoid,f(e.bodySize||{},this.unitMultiplier)),Object.assign(t.camera.ellipsoidOffset,f(e.eyeOffset||{},this.unitMultiplier)))}enableAllObjectCollisions(e){const t=this.#e;t.allObjectCollisions=!0,O(t.meshes,e||[],"checkCollisions",!0),O(t.instances,e||[],"checkCollisions",!0)}disableAllObjectCollisions(e){const t=this.#e;t.allObjectCollisions=!1,O(t.meshes,e||[],"checkCollisions",!1),O(t.instances,e||[],"checkCollisions",!1)}setCheckCollisionForObject(e,t){const i=y(this.#e,e);i&&w(i,"checkCollisions",t)}getCheckCollisionForObject(e){const t=y(this.#e,e);return t?t.checkCollisions:void 0}setFog(e,t){const i=this.#e;i.scene.fogEnabled=e,i.scene.fogMode=u.Scene.FOGMODE_EXP,t.density&&(i.scene.fogDensity=t.density),t.color&&(i.scene.fogColor=new u.Color3(t.color.r,t.color.g,t.color.b))}setCamera(e,i){const a=this.#e;switch(a.preventDefault=i.preventDefault,i=i||{},a.camera&&a.camera.dispose(),e){case t.ORBITAL:{const e=Object.assign({},{longitude:0,latitude:45,distance:10},i.position),t=Object.assign({},{x:0,y:0,z:0},i.target||{});a.camera=new u[i.vrEnabled?"VRDeviceOrientationArcRotateCamera":"ArcRotateCamera"]("camera",s(e.longitude),s(e.latitude),e.distance*this.unitMultiplier,new u.Vector3(t.x*this.unitMultiplier,t.y*this.unitMultiplier,t.z*this.unitMultiplier),a.scene),a.camera.attachControl(this.$.canvas,!a.preventDefault),i.minLongitude&&(a.camera.lowerAlphaLimit=s(i.minLongitude)),i.maxLongitude&&(a.camera.upperAlphaLimit=s(i.maxLongitude)),i.minLatitude&&(a.camera.lowerBetaLimit=s(i.minLatitude)),i.maxLatitude&&(a.camera.upperBetaLimit=s(i.maxLatitude)),i.minDistance&&(a.camera.lowerRadiusLimit=i.minDistance*this.unitMultiplier),i.maxDistance&&(a.camera.upperRadiusLimit=i.maxDistance*this.unitMultiplier),i.targetMesh&&(a.camera.lockedTarget=i.targetMesh);break}case t.FREE:{const e=Object.assign({},{x:0,y:0,z:-10},i.position||{}),t=Object.assign({},{x:0,y:0,z:0},i.target||{});a.camera=new u[i.vrEnabled?i.mobile?"VRDeviceOrientationFreeCamera":"WebVRFreeCamera":"UniversalCamera"]("camera",new u.Vector3(e.x*this.unitMultiplier,e.y*this.unitMultiplier,e.z*this.unitMultiplier),a.scene,!1),a.camera.attachControl(this.$.canvas,!a.preventDefault),a.camera.setTarget(new u.Vector3(t.x*this.unitMultiplier,t.y*this.unitMultiplier,t.z*this.unitMultiplier));break}case t.FOLLOW:{const e=Object.assign({},{x:0,y:0,z:-10},i.position||{});a.camera=new u.FollowCamera("camera",new u.Vector3(e.x*this.unitMultiplier,e.y*this.unitMultiplier,e.z*this.unitMultiplier),a.scene),a.camera.attachControl(this.$.canvas,!a.preventDefault),i.targetMesh&&(a.camera.lockedTarget=i.targetMesh);const t=Object.assign({},{radius:a.camera.radius,heightAbove:a.camera.heightOffset,rotation:a.camera.rotationOffset,acceleration:a.camera.cameraAcceleration,maxSpeed:a.camera.maxCameraSpeed},g(i.follow,this.unitMultiplier,["radius","heightAbove"]));a.camera.radius=t.radius,a.camera.heightOffset=t.heightAbove,a.camera.rotationOffset=s(t.rotation),a.camera.cameraAcceleration=t.acceleration,a.camera.maxCameraSpeed=t.maxSpeed;break}default:throw new Error(`Unknown camera type ${e}`)}}removeObject(e){const t=y(this.#e,e);t&&t.dispose()}unGroupObject(e){const t=this.#e,i="string"==typeof e?t.meshes[e]:h(e),a=[];return(i?i.getChildMeshes(!0):[]).forEach((e=>{i.removeChild(e),a.push(e.name),t.meshes[e.name]=e})),a}groupObjects(e,t){const i=this.#e,a=[];let n=null;return e.forEach((e=>{const t=i.meshes[e];t&&a.push(t)})),a.length&&(n=new u.Mesh(t,i.scene),a.forEach((e=>{n.addChild(e),delete i.meshes[e.name]})),i.meshes[t]=n,n.computeWorldMatrix(!0),(e=>{const t=e.getChildren();let i=t[0].getBoundingInfo(),a=i.boundingBox.minimumWorld,n=i.boundingBox.maximumWorld;for(let e=1;e<t.length;e++)i=t[e].getBoundingInfo(),a=u.Vector3.Minimize(a,i.boundingBox.minimumWorld),n=u.Vector3.Maximize(n,i.boundingBox.maximumWorld);e.setBoundingInfo(new u.BoundingInfo(a,n))})(n)),n?n.name:null}selectObject(e){const t=this.#e,i=C(t,e);if(i){x(i).forEach((e=>{e.selected=!0,e.showBoundingBox=this.selectionBoundingBox,e.notSelectMaterial=e.material,e.material&&e.material.hasOwnProperty("diffuseColor")?(e.material=e.material.clone("temp"),e.material.diffuseColor=t.materials.selected.diffuseColor,e.material.alpha=Math.max(.5,e.material.alpha)):e.material=t.materials.selected.clone()}))}}unSelectObject(e){const t=C(this.#e,e);if(t){x(t).forEach((e=>{e.selected&&(e.selected=!1,e.showBoundingBox=!1,e.material.dispose(),e.material=e.notSelectMaterial,delete e.notSelectMaterial)}))}}getSelectedObjects(){const e=this.#e;return Object.keys(e.meshes).filter((t=>y(e,t).selected)).concat(Object.keys(e.instances).filter((t=>y(e,t).selected)))}unSelectAll(){const e=this.#e;Object.keys(e.meshes).forEach((e=>this.unSelectObject(e))),Object.keys(e.instances).forEach((e=>this.unSelectObject(e)))}isObjectSelected(e){const t=y(this.#e,e);return t&&t.selected}set selectColor(e){Object.assign(this.#e.materials.selected.diffuseColor,e)}get selectColor(){const e=(this.#e.materials.selected||{}).diffuseColor;return{r:e.r||1,g:e.g||0,b:e.b||0}}getDataUrl(e,t){return this.$.canvas.toDataURL(e||"image/png",t||void 0)}getBlob(e,t,i){this.$.canvas.toBlob(e,t||"image/png",i||void 0)}attached(){const e=this.#e;e.engine=new u.Engine(this.$.canvas,!0,{preserveDrawingBuffer:!0,stencil:!0});(()=>{e.scene=new u.Scene(e.engine),e.scene.collisionsEnabled=!0,e.scene.workerCollisions=!0,this.addMaterial("selected",{diffuse:{r:1,g:0,b:0}}),e.assetsManager=new u.AssetsManager(e.scene),e.assetsManager.useDefaultLoadingScreen=this.loadingScreen;const t=new u.SceneOptimizerOptions;t.addOptimization(new u.HardwareScalingOptimization(0,1)),this.optimizer=new u.SceneOptimizer(e.scene,t),e.assetsManager.onFinish=()=>{this.stopRendering(),this.startRendering()}})(),e.scene.onPointerObservable.add((e=>{if(e.pickInfo.hit&&this.onObjectClicked){const t=[e.pickInfo.pickedMesh.name];let i=e.pickInfo.pickedMesh.parent;for(;i;)t.unshift(i.name),i=i.parent;this.onObjectClicked({distance:e.pickInfo.distance/this.unitMultiplier,object:e.pickInfo.pickedMesh.name,mainObject:t[0],parent:t[t.length-2]||null,path:t,location:{x:e.pickInfo.pickedPoint.x/this.unitMultiplier,y:e.pickInfo.pickedPoint.y/this.unitMultiplier,z:e.pickInfo.pickedPoint.z/this.unitMultiplier}})}}),u.PointerEventTypes.POINTERPICK);this.$.resizeDetector.addObserver((()=>{e.engine.resize()}),this),e.extensions.forEach((e=>this.#a(e)))}detached(){const e=this.#e;this.stopRendering(),e.scene.dispose(),e.engine.dispose(),e.lights={},e.meshes={},e.instances={},e.materials={},e.assetsManager=null,e.engine=null,e.scene=null,e.extensions=[]}#t(){const e=this.#e;e.assetsManager&&(e.assetsManager.useDefaultLoadingScreen=this.loadingScreen)}#i(){const e=this.#e,t=t=>{const i=y(e,t);i.selected&&(i.showBoundingBox=this.selectionBoundingBox)};Object.keys(e.meshes).forEach(t),Object.keys(e.instances).forEach(t)}#a(e){const t=this.#e;e.attach(this,{getObject:e=>_(t,C(t,e)),createGroup:e=>N(t,new u.Mesh(m(e),t.scene)),createSphere:(e,i)=>_(t,P(t,e,i)),createBox:(e,i)=>_(t,T(t,e,i)),createPlane:(e,i)=>_(t,L(t,e,i)),createPolyLine:(e,i)=>_(t,I(t,e,i)),createExtrudedPolygon:(e,i)=>_(t,A(t,e,i)),createCylinder:(e,i)=>_(t,R(t,e,i)),createTube:(e,i)=>_(t,G(t,e,i)),applySettings(e,i){z(t,h(i),e)},addPointerDownListener(e){!function(e,t){e.scene.onPointerObservable.add((i=>{t(W(e,i))}),u.PointerEventTypes.POINTERDOWN)}(t,e)},addPointerUpListener(e){!function(e,t){e.scene.onPointerObservable.add((i=>{t(W(e,i))}),u.PointerEventTypes.POINTERUP)}(t,e)},addPointerMoveListener(e){!function(e,t){e.scene.onPointerObservable.add((i=>{t(W(e,i))}),u.PointerEventTypes.POINTERMOVE)}(t,e)},addPointerClickListener(e){!function(e,t){e.scene.onPointerObservable.add((i=>{t(W(e,i))}),u.PointerEventTypes.POINTERPICK)}(t,e)},screenToObjectPoint:(e,i)=>function(e,t,i,a){const n=x(i),s=e.scene.pick(t.x,t.y,(e=>n.includes(e)),a||!1);return s.hit?{x:s.pickedPoint.x/e.multiplier,y:s.pickedPoint.y/e.multiplier,z:s.pickedPoint.z/e.multiplier}:null}(t,e,h(i)),pointToScreenPoint(e){const i=function(e,t){return u.Vector3.Project(new u.Vector3(t.x*e.multiplier,t.y*e.multiplier,t.z*e.multiplier),u.Matrix.Identity(),e.scene.getTransformMatrix(),e.camera.viewport.toGlobal(e.engine))}(t,e);return{x:i.x,y:i.y}},screenPointToBoundingProjection:(e,i)=>function(e,t,i){const n=e.scene.createPickingRay(t.x,t.y,u.Matrix.Identity(),e.camera,!1),s=i.getBoundingInfo().boundingBox.vectorsWorld;let o=-1,l=null;return[[0,3,5],[0,5,2],[0,4,6],[0,6,3],[0,2,7],[0,7,4],[1,7,2],[1,2,5],[1,6,3],[1,3,5],[1,6,4],[1,4,7]].forEach((e=>{const t=a(n.origin,n.direction,s[e[0]],s[e[1]],s[e[2]]);if(t){const e=r(t,n.origin);(o<0||o>e)&&(o=e,l=t)}})),l?{start:{x:n.origin.x/e.multiplier,y:n.origin.y/e.multiplier,z:n.origin.z/e.multiplier},intersection:{x:l.x/e.multiplier,y:l.y/e.multiplier,z:l.z/e.multiplier}}:null}(t,e,h(i)),get pointerPos(){return{x:t.scene.pointerX,y:t.scene.pointerY}},detachCameraControl:()=>{t.camera.detachControl(this.$.canvas)},attachCameraControl:()=>{t.camera.attachControl(this.$.canvas,!t.preventDefault)}})}#s(e){const t=this.#e;return Object.assign({collisions:t.allObjectCollisions,shadows:this.defaultShadows},e)}#n(e){if(e){const t=this.#e;t.meshes[e.name]=e,Object.keys(t.lights).forEach((e=>{t.lights[e].shadowGenerator&&t.lights[e].shadowGenerator.recreateShadowMap()}))}return e}#r(e,t,i){const a=this.#e;i=i||{},t&&(i.position&&S(t,i.position,this.unitMultiplier),i.rotation&&j(t,i.rotation),i.scale&&B(t,i.scale),void 0!==i.visible&&(t.isVisible=i.visible),(i.shadows||this.defaultShadows&&void 0===i.shadows)&&M(a,t),w(t,"checkCollisions",void 0===i.collisions?a.allObjectCollisions:i.collisions),a.instances[e]=t)}static get template(){return'\n\t\t\t<script src="/third_party/earcut/dist/earcut.dev.js"><\/script>\n\t\t\t<script src="/third_party/babylonjs/babylon.max.js"><\/script>\n\t\t\t<script src="/third_party/babylonjs-loaders/babylonjs.loaders.js"><\/script>\n\t\t\t<style>\n\t\t\t\t:host {\n\t\t\t\t\tdisplay: block;\n\t\t\t\t\tposition: relative;\n\t\t\t\t}\n\t\t\n\t\t\t\t#main,\n\t\t\t\t\t#canvas {\n\t\t\t\t\tposition: relative;\n\t\t\t\t\twidth: 100%;\n\t\t\t\t\theight: 100%;\n\t\t\t\t}\n\t\t\t</style>\n\t\t\t<div id="main">\n\t\t\t\t<vicowa-resize-detector id="resize-detector"></vicowa-resize-detector>\n\t\t\t\t<canvas id="canvas"></canvas>\n\t\t\t</div>\n\t\t'}}window.customElements.define("vicowa-webgl",VicowaWebgl); //# sourceMappingURL=vicowa-webgl.js.map