@animech-public/playcanvas
Version:
PlayCanvas WebGL game engine
2 lines (1 loc) • 11.6 kB
JavaScript
import{LAYERID_WORLD as e,RENDERSTYLE_SOLID as s}from"../../../scene/constants.js";import{BatchGroup as t}from"../../../scene/batching/batch-group.js";import{MeshInstance as i}from"../../../scene/mesh-instance.js";import{MorphInstance as a}from"../../../scene/morph-instance.js";import{getShapePrimitive as n}from"../../graphics/primitive-cache.js";import{GraphNode as h}from"../../../scene/graph-node.js";import{SkinInstanceCache as r}from"../../../scene/skin-instance-cache.js";import{Asset as o}from"../../asset/asset.js";import{AssetReference as l}from"../../asset/asset-reference.js";import{Component as d}from"../component.js";class c extends d{constructor(t,i){super(t,i),this._type="asset",this._castShadows=!0,this._receiveShadows=!0,this._castShadowsLightmap=!0,this._lightmapped=!1,this._lightmapSizeMultiplier=1,this.isStatic=!1,this._batchGroupId=-1,this._layers=[e],this._renderStyle=s,this._meshInstances=[],this._customAabb=null,this._area=null,this._assetReference=void 0,this._materialReferences=[],this._material=void 0,this._rootBone=null,this._evtLayersChanged=null,this._evtLayerAdded=null,this._evtLayerRemoved=null,this._evtSetMeshes=null,this._assetReference=new l("asset",this,t.app.assets,{add:this._onRenderAssetAdded,load:this._onRenderAssetLoad,remove:this._onRenderAssetRemove,unload:this._onRenderAssetUnload},this),this._material=t.defaultMaterial,i.on("remove",this.onRemoveChild,this),i.on("removehierarchy",this.onRemoveChild,this),i.on("insert",this.onInsertChild,this),i.on("inserthierarchy",this.onInsertChild,this)}set renderStyle(e){this._renderStyle!==e&&(this._renderStyle=e,i._prepareRenderStyleForArray(this._meshInstances,e))}get renderStyle(){return this._renderStyle}set customAabb(e){this._customAabb=e;const s=this._meshInstances;if(s)for(let e=0;e<s.length;e++)s[e].setCustomAabb(this._customAabb)}get customAabb(){return this._customAabb}set type(e){if(this._type!==e&&(this._area=null,this._type=e,this.destroyMeshInstances(),"asset"!==e)){let s=this._material;s&&s!==this.system.defaultMaterial||(s=this._materialReferences[0]&&this._materialReferences[0].asset&&this._materialReferences[0].asset.resource);const t=n(this.system.app.graphicsDevice,e);this._area=t.area,this.meshInstances=[new i(t.mesh,s||this.system.defaultMaterial,this.entity)]}}get type(){return this._type}set meshInstances(e){if(this.destroyMeshInstances(),this._meshInstances=e,this._meshInstances){const e=this._meshInstances;for(let s=0;s<e.length;s++)e[s].node||(e[s].node=this.entity),e[s].castShadow=this._castShadows,e[s].receiveShadow=this._receiveShadows,e[s].renderStyle=this._renderStyle,e[s].setLightmapped(this._lightmapped),e[s].setCustomAabb(this._customAabb);this.enabled&&this.entity.enabled&&this.addToLayers()}}get meshInstances(){return this._meshInstances}set lightmapped(e){if(e!==this._lightmapped){this._lightmapped=e;const s=this._meshInstances;if(s)for(let t=0;t<s.length;t++)s[t].setLightmapped(e)}}get lightmapped(){return this._lightmapped}set castShadows(e){if(this._castShadows!==e){const s=this._meshInstances;if(s){const t=this.layers,i=this.system.app.scene;if(this._castShadows&&!e)for(let e=0;e<t.length;e++){const t=i.layers.getLayerById(this.layers[e]);t&&t.removeShadowCasters(s)}for(let t=0;t<s.length;t++)s[t].castShadow=e;if(!this._castShadows&&e)for(let e=0;e<t.length;e++){const a=i.layers.getLayerById(t[e]);a&&a.addShadowCasters(s)}}this._castShadows=e}}get castShadows(){return this._castShadows}set receiveShadows(e){if(this._receiveShadows!==e){this._receiveShadows=e;const s=this._meshInstances;if(s)for(let t=0;t<s.length;t++)s[t].receiveShadow=e}}get receiveShadows(){return this._receiveShadows}set castShadowsLightmap(e){this._castShadowsLightmap=e}get castShadowsLightmap(){return this._castShadowsLightmap}set lightmapSizeMultiplier(e){this._lightmapSizeMultiplier=e}get lightmapSizeMultiplier(){return this._lightmapSizeMultiplier}set layers(e){const s=this.system.app.scene.layers;let t;if(this._meshInstances)for(let e=0;e<this._layers.length;e++)t=s.getLayerById(this._layers[e]),t&&t.removeMeshInstances(this._meshInstances);this._layers.length=0;for(let s=0;s<e.length;s++)this._layers[s]=e[s];if(this.enabled&&this.entity.enabled&&this._meshInstances)for(let e=0;e<this._layers.length;e++)t=s.getLayerById(this._layers[e]),t&&t.addMeshInstances(this._meshInstances)}get layers(){return this._layers}set batchGroupId(e){if(this._batchGroupId!==e){var s,i;if(this.entity.enabled&&this._batchGroupId>=0)null==(s=this.system.app.batcher)||s.remove(t.RENDER,this.batchGroupId,this.entity);if(this.entity.enabled&&e>=0)null==(i=this.system.app.batcher)||i.insert(t.RENDER,e,this.entity);e<0&&this._batchGroupId>=0&&this.enabled&&this.entity.enabled&&this.addToLayers(),this._batchGroupId=e}}get batchGroupId(){return this._batchGroupId}set material(e){if(this._material!==e&&(this._material=e,this._meshInstances&&"asset"!==this._type))for(let s=0;s<this._meshInstances.length;s++)this._meshInstances[s].material=e}get material(){return this._material}set materialAssets(e=[]){if(this._materialReferences.length>e.length){for(let s=e.length;s<this._materialReferences.length;s++)this._materialReferences[s].id=null;this._materialReferences.length=e.length}for(let s=0;s<e.length;s++)if(this._materialReferences[s]||this._materialReferences.push(new l(s,this,this.system.app.assets,{add:this._onMaterialAdded,load:this._onMaterialLoad,remove:this._onMaterialRemove,unload:this._onMaterialUnload},this)),e[s]){const t=e[s]instanceof o?e[s].id:e[s];this._materialReferences[s].id!==t&&(this._materialReferences[s].id=t),this._materialReferences[s].asset&&this._onMaterialAdded(s,this,this._materialReferences[s].asset)}else this._materialReferences[s].id=null,this._meshInstances[s]&&(this._meshInstances[s].material=this.system.defaultMaterial)}get materialAssets(){return this._materialReferences.map((e=>e.id))}set asset(e){const s=e instanceof o?e.id:e;this._assetReference.id!==s&&(this._assetReference.asset&&this._assetReference.asset.resource&&this._onRenderAssetRemove(),this._assetReference.id=s,this._assetReference.asset&&this._onRenderAssetAdded())}get asset(){return this._assetReference.id}assignAsset(e){const s=e instanceof o?e.id:e;this._assetReference.id=s}set rootBone(e){if(this._rootBone!==e){const s="string"==typeof e;if(this._rootBone&&s&&this._rootBone.getGuid()===e)return;this._rootBone&&this._clearSkinInstances(),e instanceof h?this._rootBone=e:s?(this._rootBone=this.system.app.getEntityFromIndex(e)||null,this._rootBone):this._rootBone=null,this._rootBone&&this._cloneSkinInstances()}}get rootBone(){return this._rootBone}destroyMeshInstances(){const e=this._meshInstances;if(e){this.removeFromLayers(),this._clearSkinInstances();for(let s=0;s<e.length;s++)e[s].destroy();this._meshInstances.length=0}}addToLayers(){const e=this.system.app.scene.layers;for(let s=0;s<this._layers.length;s++){const t=e.getLayerById(this._layers[s]);t&&t.addMeshInstances(this._meshInstances)}}removeFromLayers(){if(this._meshInstances&&this._meshInstances.length){const e=this.system.app.scene.layers;for(let s=0;s<this._layers.length;s++){const t=e.getLayerById(this._layers[s]);t&&t.removeMeshInstances(this._meshInstances)}}}onRemoveChild(){this.removeFromLayers()}onInsertChild(){this._meshInstances&&this.enabled&&this.entity.enabled&&this.addToLayers()}onRemove(){this.destroyMeshInstances(),this.asset=null,this.materialAsset=null,this._assetReference.id=null;for(let e=0;e<this._materialReferences.length;e++)this._materialReferences[e].id=null;this.entity.off("remove",this.onRemoveChild,this),this.entity.off("insert",this.onInsertChild,this)}onLayersChanged(e,s){this.addToLayers(),e.off("add",this.onLayerAdded,this),e.off("remove",this.onLayerRemoved,this),s.on("add",this.onLayerAdded,this),s.on("remove",this.onLayerRemoved,this)}onLayerAdded(e){this.layers.indexOf(e.id)<0||e.addMeshInstances(this._meshInstances)}onLayerRemoved(e){this.layers.indexOf(e.id)<0||e.removeMeshInstances(this._meshInstances)}onEnable(){const e=this.system.app,s=e.scene,i=s.layers;this._rootBone&&this._cloneSkinInstances(),this._evtLayersChanged=s.on("set:layers",this.onLayersChanged,this),i&&(this._evtLayerAdded=i.on("add",this.onLayerAdded,this),this._evtLayerRemoved=i.on("remove",this.onLayerRemoved,this));const a="asset"===this._type;this._meshInstances&&this._meshInstances.length?this.addToLayers():a&&this.asset&&this._onRenderAssetAdded();for(let e=0;e<this._materialReferences.length;e++)this._materialReferences[e].asset&&this.system.app.assets.load(this._materialReferences[e].asset);var n;this._batchGroupId>=0&&(null==(n=e.batcher)||n.insert(t.RENDER,this.batchGroupId,this.entity))}onDisable(){var e;const s=this.system.app,i=s.scene.layers;var a,n,h;(null==(e=this._evtLayersChanged)||e.off(),this._evtLayersChanged=null,this._rootBone&&this._clearSkinInstances(),i)&&(null==(a=this._evtLayerAdded)||a.off(),this._evtLayerAdded=null,null==(n=this._evtLayerRemoved)||n.off(),this._evtLayerRemoved=null);this._batchGroupId>=0&&(null==(h=s.batcher)||h.remove(t.RENDER,this.batchGroupId,this.entity));this.removeFromLayers()}hide(){if(this._meshInstances)for(let e=0;e<this._meshInstances.length;e++)this._meshInstances[e].visible=!1}show(){if(this._meshInstances)for(let e=0;e<this._meshInstances.length;e++)this._meshInstances[e].visible=!0}_onRenderAssetAdded(){this._assetReference.asset&&(this._assetReference.asset.resource?this._onRenderAssetLoad():this.enabled&&this.entity.enabled&&this.system.app.assets.load(this._assetReference.asset))}_onRenderAssetLoad(){if(this.destroyMeshInstances(),this._assetReference.asset){var e;const s=this._assetReference.asset.resource;null==(e=this._evtSetMeshes)||e.off(),this._evtSetMeshes=s.on("set:meshes",this._onSetMeshes,this),s.meshes&&this._onSetMeshes(s.meshes)}}_onSetMeshes(e){this._cloneMeshes(e)}_clearSkinInstances(){for(let e=0;e<this._meshInstances.length;e++){const s=this._meshInstances[e];r.removeCachedSkinInstance(s.skinInstance),s.skinInstance=null}}_cloneSkinInstances(){if(this._meshInstances.length&&this._rootBone instanceof h)for(let e=0;e<this._meshInstances.length;e++){const s=this._meshInstances[e],t=s.mesh;t.skin&&!s.skinInstance&&(s.skinInstance=r.createCachedSkinInstance(t.skin,this._rootBone,this.entity))}}_cloneMeshes(e){if(e&&e.length){const s=[];for(let t=0;t<e.length;t++){const n=e[t],h=this._materialReferences[t]&&this._materialReferences[t].asset&&this._materialReferences[t].asset.resource,r=new i(n,h||this.system.defaultMaterial,this.entity);s.push(r),n.morph&&(r.morphInstance=new a(n.morph))}this.meshInstances=s,this._cloneSkinInstances()}}_onRenderAssetUnload(){"asset"===this._type&&this.destroyMeshInstances()}_onRenderAssetRemove(){var e;null==(e=this._evtSetMeshes)||e.off(),this._evtSetMeshes=null,this._onRenderAssetUnload()}_onMaterialAdded(e,s,t){t.resource?this._onMaterialLoad(e,s,t):this.enabled&&this.entity.enabled&&this.system.app.assets.load(t)}_updateMainMaterial(e,s){0===e&&(this.material=s)}_onMaterialLoad(e,s,t){this._meshInstances[e]&&(this._meshInstances[e].material=t.resource),this._updateMainMaterial(e,t.resource)}_onMaterialRemove(e,s,t){this._meshInstances[e]&&(this._meshInstances[e].material=this.system.defaultMaterial),this._updateMainMaterial(e,this.system.defaultMaterial)}_onMaterialUnload(e,s,t){this._meshInstances[e]&&(this._meshInstances[e].material=this.system.defaultMaterial),this._updateMainMaterial(e,this.system.defaultMaterial)}resolveDuplicatedEntityReferenceProperties(e,s){e.rootBone&&(this.rootBone=s[e.rootBone.getGuid()])}}export{c as RenderComponent};