/** * Material Superset - The apiMaterial properties get moved into the Material object itself, and then the instance is * created * @param graphics GameLib.D3.Graphics * @param apiMaterial GameLib.D3.API.Material * @constructor * @returns {GameLib.D3.Material | GameLib.D3.API.Material} */ GameLib.D3.Material = function( graphics, apiMaterial ) { this.graphics = graphics; this.graphics.isNotThreeThrow(); if (GameLib.Utils.UndefinedOrNull(apiMaterial)) { apiMaterial = {}; } if (apiMaterial instanceof GameLib.D3.Material) { return apiMaterial; } GameLib.D3.API.Material.call( this, apiMaterial.id, apiMaterial.materialType, apiMaterial.name, apiMaterial.opacity, apiMaterial.side, apiMaterial.transparent, apiMaterial.specular, apiMaterial.lightMapIntensity, apiMaterial.aoMapIntensity, apiMaterial.color, apiMaterial.emissive, apiMaterial.emissiveIntensity, apiMaterial.combine, apiMaterial.shininess, apiMaterial.reflectivity, apiMaterial.refractionRatio, apiMaterial.fog, apiMaterial.wireframe, apiMaterial.wireframeLineWidth, apiMaterial.wireframeLineCap, apiMaterial.wireframeLineJoin, apiMaterial.vertexColors, apiMaterial.skinning, apiMaterial.morphTargets, apiMaterial.morphNormals, apiMaterial.lineWidth, apiMaterial.lineCap, apiMaterial.lineJoin, apiMaterial.dashSize, apiMaterial.gapWidth, apiMaterial.blending, apiMaterial.blendSrc, apiMaterial.blendDst, apiMaterial.blendEquation, apiMaterial.depthTest, apiMaterial.depthFunc, apiMaterial.depthWrite, apiMaterial.polygonOffset, apiMaterial.polygonOffsetFactor, apiMaterial.polygonOffsetUnits, apiMaterial.alphaTest, apiMaterial.clippingPlanes, apiMaterial.clipShadows, apiMaterial.visible, apiMaterial.overdraw, apiMaterial.shading, apiMaterial.bumpScale, apiMaterial.normalScale, apiMaterial.displacementScale, apiMaterial.displacementBias, apiMaterial.roughness, apiMaterial.metalness, apiMaterial.pointSize, apiMaterial.pointSizeAttenuation, apiMaterial.spriteRotation, apiMaterial.envMapIntensity, apiMaterial.alphaMap, apiMaterial.aoMap, apiMaterial.bumpMap, apiMaterial.diffuseMap, apiMaterial.displacementMap, apiMaterial.emissiveMap, apiMaterial.environmentMap, apiMaterial.lightMap, apiMaterial.metalnessMap, apiMaterial.normalMap, apiMaterial.roughnessMap, apiMaterial.specularMap, apiMaterial.parentEntity ); this.specular = new GameLib.Color( graphics, this.specular, this ); this.color = new GameLib.Color( graphics, this.color, this ); this.emissive = new GameLib.Color( graphics, this.emissive, this ); if (this.alphaMap) { if (this.alphaMap instanceof GameLib.D3.API.Texture) { this.alphaMap = new GameLib.D3.Texture( this.graphics, this.alphaMap ); } } if (this.aoMap) { if (this.aoMap instanceof GameLib.D3.API.Texture) { this.aoMap = new GameLib.D3.Texture( this.graphics, this.aoMap ); } } if (this.bumpMap) { if (this.bumpMap instanceof GameLib.D3.API.Texture) { this.bumpMap = new GameLib.D3.Texture( this.graphics, this.bumpMap ); } } if (this.diffuseMap) { if (this.diffuseMap instanceof GameLib.D3.API.Texture) { this.diffuseMap = new GameLib.D3.Texture( this.graphics, this.diffuseMap ); } } if (this.displacementMap) { if (this.displacementMap instanceof GameLib.D3.API.Texture) { this.displacementMap = new GameLib.D3.Texture( this.graphics, this.displacementMap ); } } if (this.emissiveMap) { if (this.emissiveMap instanceof GameLib.D3.API.Texture) { this.emissiveMap = new GameLib.D3.Texture( this.graphics, this.emissiveMap ); } } if (this.environmentMap) { if (this.environmentMap instanceof GameLib.D3.API.Texture) { this.environmentMap = new GameLib.D3.Texture( this.graphics, this.environmentMap ); } } if (this.lightMap) { if (this.lightMap instanceof GameLib.D3.API.Texture) { this.lightMap = new GameLib.D3.Texture( this.graphics, this.lightMap ); } } if (this.metalnessMap) { if (this.metalnessMap instanceof GameLib.D3.API.Texture) { this.metalnessMap = new GameLib.D3.Texture( this.graphics, this.metalnessMap ); } } if (this.normalMap) { if (this.normalMap instanceof GameLib.D3.API.Texture) { this.normalMap = new GameLib.D3.Texture( this.graphics, this.normalMap ); } } if (this.roughnessMap) { if (this.roughnessMap instanceof GameLib.D3.API.Texture) { this.roughnessMap = new GameLib.D3.Texture( this.graphics, this.roughnessMap ); } } if (this.specularMap) { if (this.specularMap instanceof GameLib.D3.API.Texture) { this.specularMap = new GameLib.D3.Texture( this.graphics, this.specularMap ); } } this.buildIdToObject(); this.instance = this.createInstance(); this.updateTextures(); }; GameLib.D3.Material.prototype = Object.create(GameLib.D3.API.Material.prototype); GameLib.D3.Material.prototype.constructor = GameLib.D3.Material; /** * Combine Method * @type {number} */ GameLib.D3.Material.TYPE_MULTIPLY_OPERATION = 0; GameLib.D3.Material.TYPE_MIX_OPERATION = 1; GameLib.D3.Material.TYPE_ADD_OPERATION = 2; /** * Vertex Color Mode * @type {number} */ GameLib.D3.Material.TYPE_NO_COLORS = 0; GameLib.D3.Material.TYPE_FACE_COLORS = 1; GameLib.D3.Material.TYPE_VERTEX_COLORS = 2; /** * Blending Mode * @type {number} */ GameLib.D3.Material.TYPE_NORMAL_BLENDING = 1; GameLib.D3.Material.TYPE_ADDITIVE_BLENDING = 2; GameLib.D3.Material.TYPE_SUBTRACTIVE_BLENDING = 3; GameLib.D3.Material.TYPE_MULTIPLY_BLENDING = 4; GameLib.D3.Material.TYPE_CUSTOM_BLENDING = 5; /** * Blend Source and Destination * @type {number} */ GameLib.D3.Material.TYPE_ZERO_FACTOR = 200; GameLib.D3.Material.TYPE_ONE_FACTOR = 201; GameLib.D3.Material.TYPE_SRC_COLOR_FACTOR = 202; GameLib.D3.Material.TYPE_ONE_MINUS_SRC_COLOR_FACTOR = 203; GameLib.D3.Material.TYPE_SRC_ALPHA_FACTOR = 204; GameLib.D3.Material.TYPE_ONE_MINUS_SRC_ALPHA_FACTOR = 205; GameLib.D3.Material.TYPE_DST_ALPHA_FACTOR = 206; GameLib.D3.Material.TYPE_ONE_MINUS_DST_ALPHA_FACTOR = 207; GameLib.D3.Material.TYPE_DST_COLOR_FACTOR = 208; GameLib.D3.Material.TYPE_ONE_MINUS_DST_COLOR_FACTOR = 209; GameLib.D3.Material.TYPE_SRC_ALPHA_SATURATE_FACTOR = 210; /** * Blend Operation * @type {number} */ GameLib.D3.Material.TYPE_ADD_EQUATION = 100; GameLib.D3.Material.TYPE_SUBTRACT_EQUATION = 101; GameLib.D3.Material.TYPE_REVERSE_SUBTRACT_EQUATION = 102; GameLib.D3.Material.TYPE_MIN_EQUATION = 103; GameLib.D3.Material.TYPE_MAX_EQUATION = 104; /** * Depth Function * @type {number} */ GameLib.D3.Material.TYPE_NEVER_DEPTH = 0; GameLib.D3.Material.TYPE_ALWAYS_DEPTH = 1; GameLib.D3.Material.TYPE_LESS_DEPTH = 2; GameLib.D3.Material.TYPE_LESS_EQUAL_DEPTH = 3; GameLib.D3.Material.TYPE_EQUAL_DEPTH = 4; GameLib.D3.Material.TYPE_GREATER_EQUAL_DEPTH = 5; GameLib.D3.Material.TYPE_GREATER_DEPTH = 6; GameLib.D3.Material.TYPE_NOT_EQUAL_DEPTH = 7; /** * Culling Mode * @type {number} */ GameLib.D3.Material.TYPE_FRONT_SIDE = 0; GameLib.D3.Material.TYPE_BACK_SIDE = 1; GameLib.D3.Material.TYPE_DOUBLE_SIDE = 2; /** * Shading Type * @type {number} */ GameLib.D3.Material.TYPE_FLAT_SHADING = 1; GameLib.D3.Material.TYPE_SMOOTH_SHADING = 2; /** * Material Type * @type {string} */ GameLib.D3.Material.MATERIAL_TYPE_LINE_BASIC = 0x1; GameLib.D3.Material.MATERIAL_TYPE_LINE_DASHED = 0x2; GameLib.D3.Material.MATERIAL_TYPE_BASIC = 0x3; GameLib.D3.Material.MATERIAL_TYPE_DEPTH = 0x4; GameLib.D3.Material.MATERIAL_TYPE_LAMBERT = 0x5; GameLib.D3.Material.MATERIAL_TYPE_NORMAL = 0x6; GameLib.D3.Material.MATERIAL_TYPE_PHONG = 0x7; GameLib.D3.Material.MATERIAL_TYPE_STANDARD = 0x8; GameLib.D3.Material.MATERIAL_TYPE_POINTS = 0x9; GameLib.D3.Material.MATERIAL_TYPE_SPRITE = 0xa; GameLib.D3.Material.prototype.createStandardMaterialInstance = function() { return new THREE.MeshStandardMaterial({ name: this.name, opacity: this.opacity, transparent: this.transparent, blending: this.blending, blendSrc: this.blendSrc, blendDst: this.blendDst, blendEquation: this.blendEquation, depthTest: this.depthTest, depthFunc: this.depthFunc, depthWrite: this.depthWrite, polygonOffset: this.polygonOffset, polygonOffsetFactor: this.polygonOffsetFactor, polygonOffsetUnits: this.polygonOffsetUnits, alphaTest: this.alphaTest, clippingPlanes: this.clippingPlanes, clipShadows: this.clipShadows, overdraw: this.overdraw, visible: this.visible, side: this.side, color: this.color.instance, roughness: this.roughness, metalness: this.metalness, lightMapIntensity: this.lightMapIntensity, aoMapIntensity: this.aoMapIntensity, emissive: this.emissive.instance, emissiveIntensity: this.emissiveIntensity, bumpScale: this.bumpScale, normalScale: this.normalScale, displacementScale: this.displacementScale, refractionRatio: this.refractionRatio, fog: this.fog, shading: this.shading, wireframe: this.wireframe, wireframeLinewidth: this.wireframeLineWidth, wireframeLinecap: this.wireframeLineCap, wireframeLinejoin: this.wireframeLineJoin, vertexColors: this.vertexColors, skinning: this.skinning, morphTargets: this.morphTargets, morphNormals: this.morphNormals }); }; GameLib.D3.Material.prototype.createPointsMaterialInstance = function() { return new THREE.PointsMaterial({ name: this.name, opacity: this.opacity, transparent: this.transparent, blending: this.blending, blendSrc: this.blendSrc, blendDst: this.blendDst, blendEquation: this.blendEquation, depthTest: this.depthTest, depthFunc: this.depthFunc, depthWrite: this.depthWrite, polygonOffset: this.polygonOffset, polygonOffsetFactor: this.polygonOffsetFactor, polygonOffsetUnits: this.polygonOffsetUnits, alphaTest: this.alphaTest, clippingPlanes: this.clippingPlanes, clipShadows: this.clipShadows, overdraw: this.overdraw, visible: this.visible, side: this.side, color: this.color.instance, size: this.pointSize, sizeAttenuation: this.pointSizeAttenuation, vertexColors: GameLib.D3.Material.TYPE_NO_COLORS, fog: this.fog }); }; GameLib.D3.Material.prototype.createPhongMaterialInstance = function() { return new THREE.MeshPhongMaterial({ name: this.name, opacity: this.opacity, transparent: this.transparent, blending: this.blending, blendSrc: this.blendSrc, blendDst: this.blendDst, blendEquation: this.blendEquation, depthTest: this.depthTest, depthFunc: this.depthFunc, depthWrite: this.depthWrite, polygonOffset: this.polygonOffset, polygonOffsetFactor: this.polygonOffsetFactor, polygonOffsetUnits: this.polygonOffsetUnits, alphaTest: this.alphaTest, clippingPlanes: this.clippingPlanes, clipShadows: this.clipShadows, overdraw: this.overdraw, visible: this.visible, side: this.side, color: this.color.instance, specular: this.specular.instance, shininess: this.shininess, lightMapIntensity: this.lightMapIntensity, aoMapIntensity: this.aoMapIntensity, emissive: this.emissive.instance, emissiveIntensity: this.emissiveIntensity, bumpScale: this.bumpScale, normalScale: this.normalScale, displacementScale: this.displacementScale, combine: this.combine, refractionRatio: this.refractionRatio, fog: this.fog, shading: this.shading, wireframe: this.wireframe, wireframeLinewidth: this.wireframeLineWidth, wireframeLinecap: this.wireframeLineCap, wireframeLinejoin: this.wireframeLineJoin, vertexColors: this.vertexColors, skinning: this.skinning, morphTargets: this.morphTargets, morphNormals: this.morphNormals }); }; GameLib.D3.Material.prototype.createMeshBasicMaterialInstance = function() { return new THREE.MeshBasicMaterial({ name: this.name, opacity: this.opacity, transparent: this.transparent, blending: this.blending, blendSrc: this.blendSrc, blendDst: this.blendDst, blendEquation: this.blendEquation, depthTest: this.depthTest, depthFunc: this.depthFunc, depthWrite: this.depthWrite, polygonOffset: this.polygonOffset, polygonOffsetFactor: this.polygonOffsetFactor, polygonOffsetUnits: this.polygonOffsetUnits, alphaTest: this.alphaTest, clippingPlanes: this.clippingPlanes, clipShadows: this.clipShadows, overdraw: this.overdraw, visible: this.visible, side: this.side, color: this.color.instance, vertexColors: GameLib.D3.Material.TYPE_NO_COLORS, fog: this.fog }); }; /** * updates textures */ GameLib.D3.Material.prototype.updateTextures = function() { if (this.alphaMap && this.alphaMap.instance) { this.instance.alphaMap = this.alphaMap.instance; } else { this.instance.alphaMap = null; } if (this.aoMap && this.aoMap.instance) { this.instance.aoMap = this.aoMap.instance; } else { this.instance.aoMap = null; } if (this.bumpMap && this.bumpMap.instance) { this.instance.bumpMap = this.bumpMap.instance; } else { this.instance.bumpMap = null; } if (this.diffuseMap && this.diffuseMap.instance) { this.instance.map = this.diffuseMap.instance; } else { this.instance.map = null; } if (this.displacementMap && this.displacementMap.instance) { this.instance.displacementMap = this.displacementMap.instance; } else { this.instance.displacementMap = null; } if (this.emissiveMap && this.emissiveMap.instance) { this.instance.emissiveMap = this.emissiveMap.instance; } else { this.instance.emissiveMap = null; } if (this.environmentMap && this.environmentMap.instance) { this.instance.envMap = this.environmentMap.instance; } else { this.instance.envMap = null; } if (this.lightMap && this.lightMap.instance) { this.instance.lightMap = this.lightMap.instance; } else { this.instance.lightMap = null; } if (this.metalnessMap && this.metalnessMap.instance) { this.instance.metalnessMap = this.metalnessMap.instance; } else { this.instance.metalnessMap = null; } if (this.normalMap && this.normalMap.instance) { this.instance.normalMap = this.normalMap.instance; } else { this.instance.normalMap = null; } if (this.roughnessMap && this.roughnessMap.instance) { this.instance.roughnessMap = this.roughnessMap.instance; } else { this.instance.roughnessMap = null; } if (this.specularMap && this.specularMap.instance) { this.instance.specularMap = this.specularMap.instance; } else { this.instance.specularMap = null; } }; GameLib.D3.Material.prototype.updateStandardMaterialInstance = function() { this.instance.name = this.name; this.instance.opacity = this.opacity; this.instance.transparent = this.transparent; this.instance.blending = this.blending; this.instance.blendSrc = this.blendSrc; this.instance.blendDst = this.blendDst; this.instance.blendEquation = this.blendEquation; this.instance.depthTest = this.depthTest; this.instance.depthFunc = this.depthFunc; this.instance.depthWrite = this.depthWrite; this.instance.polygonOffset = this.polygonOffset; this.instance.polygonOffsetFactor = this.polygonOffsetFactor; this.instance.polygonOffsetUnits = this.polygonOffsetUnits; this.instance.alphaTest = this.alphaTest; this.instance.clippingPlanes = this.clippingPlanes; this.instance.clipShadows = this.clipShadows; this.instance.overdraw = this.overdraw; this.instance.visible = this.visible; this.instance.side = this.side; this.instance.color = this.color.instance; this.instance.envMapIntensity = this.envMapIntensity; //standard material doesnt have specular color this.instance.roughness = this.roughness; this.instance.metalness = this.metalness; this.instance.lightMapIntensity = this.lightMapIntensity; this.instance.aoMapIntensity = this.aoMapIntensity; this.instance.emissive = this.emissive.instance; this.instance.emissiveIntensity = this.emissiveIntensity; this.instance.bumpScale = this.bumpScale; this.instance.normalScale = this.normalScale; this.instance.displacementScale = this.displacementScale; this.instance.refractionRatio = this.refractionRatio; this.instance.fog = this.fog; this.instance.shading = this.shading; this.instance.wireframe = this.wireframe; this.instance.wireframeLinewidth = this.wireframeLineWidth; this.instance.wireframeLinecap = this.wireframeLineCap; this.instance.wireframeLinejoin = this.wireframeLineJoin; this.instance.vertexColors = this.vertexColors; this.instance.skinning = this.skinning; this.instance.morphTargets = this.morphTargets; this.instance.morphNormals = this.morphNormals; }; GameLib.D3.Material.prototype.updatePointsMaterialInstance = function() { this.instance.name = this.name; this.instance.opacity = this.opacity; this.instance.transparent = this.transparent; this.instance.blending = this.blending; this.instance.blendSrc = this.blendSrc; this.instance.blendDst = this.blendDst; this.instance.blendEquation = this.blendEquation; this.instance.depthTest = this.depthTest; this.instance.depthFunc = this.depthFunc; this.instance.depthWrite = this.depthWrite; this.instance.polygonOffset = this.polygonOffset; this.instance.polygonOffsetFactor = this.polygonOffsetFactor; this.instance.polygonOffsetUnits = this.polygonOffsetUnits; this.instance.alphaTest = this.alphaTest; this.instance.clippingPlanes = this.clippingPlanes; this.instance.clipShadows = this.clipShadows; this.instance.overdraw = this.overdraw; this.instance.visible = this.visible; this.instance.side = this.side; this.instance.color = this.color.instance; this.instance.size = this.pointSize; this.instance.sizeAttenuation = this.pointSizeAttenuation; this.instance.vertexColors = GameLib.D3.Material.TYPE_NO_COLORS; this.instance.fog = this.fog; }; GameLib.D3.Material.prototype.updatePhongMaterialInstance = function() { this.instance.name = this.name; this.instance.opacity = this.opacity; this.instance.transparent = this.transparent; this.instance.blending = this.blending; this.instance.blendSrc = this.blendSrc; this.instance.blendDst = this.blendDst; this.instance.blendEquation = this.blendEquation; this.instance.depthTest = this.depthTest; this.instance.depthFunc = this.depthFunc; this.instance.depthWrite = this.depthWrite; this.instance.polygonOffset = this.polygonOffset; this.instance.polygonOffsetFactor = this.polygonOffsetFactor; this.instance.polygonOffsetUnits = this.polygonOffsetUnits; this.instance.alphaTest = this.alphaTest; this.instance.clippingPlanes = this.clippingPlanes; this.instance.clipShadows = this.clipShadows; this.instance.overdraw = this.overdraw; this.instance.visible = this.visible; this.instance.side = this.side; this.instance.color = this.color.instance; this.instance.specular = this.specular.instance; this.instance.shininess = this.shininess; this.instance.lightMapIntensity = this.lightMapIntensity; this.instance.aoMapIntensity = this.aoMapIntensity; this.instance.emissive = this.emissive.instance; this.instance.emissiveIntensity = this.emissiveIntensity; this.instance.envMapIntensity = this.envMapIntensity; this.instance.bumpScale = this.bumpScale; this.instance.normalScale = this.normalScale; this.instance.displacementScale = this.displacementScale; this.instance.combine = this.combine; this.instance.refractionRatio = this.refractionRatio; this.instance.fog = this.fog; this.instance.shading = this.shading; this.instance.wireframe = this.wireframe; this.instance.wireframeLinewidth = this.wireframeLineWidth; this.instance.wireframeLinecap = this.wireframeLineCap; this.instance.wireframeLinejoin = this.wireframeLineJoin; this.instance.vertexColors = this.vertexColors; this.instance.skinning = this.skinning; this.instance.morphTargets = this.morphTargets; this.instance.morphNormals = this.morphNormals; }; GameLib.D3.Material.prototype.updateMeshBasicMaterialInstance = function() { this.instance.name = this.name; this.instance.opacity = this.opacity; this.instance.transparent = this.transparent; this.instance.blending = this.blending; this.instance.blendSrc = this.blendSrc; this.instance.blendDst = this.blendDst; this.instance.blendEquation = this.blendEquation; this.instance.depthTest = this.depthTest; this.instance.depthFunc = this.depthFunc; this.instance.depthWrite = this.depthWrite; this.instance.polygonOffset = this.polygonOffset; this.instance.polygonOffsetFactor = this.polygonOffsetFactor; this.instance.polygonOffsetUnits = this.polygonOffsetUnits; this.instance.alphaTest = this.alphaTest; this.instance.clippingPlanes = this.clippingPlanes; this.instance.clipShadows = this.clipShadows; this.instance.overdraw = this.overdraw; this.instance.visible = this.visible; this.instance.side = this.side; this.instance.color = this.color.instance; this.instance.vertexColors = GameLib.D3.Material.TYPE_NO_COLORS; this.instance.fog = this.fog; }; /** * Material instance * @returns {*} */ GameLib.D3.Material.prototype.createInstance = function(update) { if (update) { var typeChange = false; if (this.materialType === GameLib.D3.Material.MATERIAL_TYPE_STANDARD) { if (!(this.instance instanceof THREE.MeshStandardMaterial)) { this.instance = this.createStandardMaterialInstance(); typeChange = true; } else { this.updateStandardMaterialInstance(); } } else if (this.materialType === GameLib.D3.Material.MATERIAL_TYPE_POINTS) { if (!(this.instance instanceof THREE.PointsMaterial)) { this.instance = this.createPointsMaterialInstance(); typeChange = true; } else { this.updatePointsMaterialInstance(); } } else if (this.materialType === GameLib.D3.Material.MATERIAL_TYPE_PHONG) { if (!(this.instance instanceof THREE.MeshPhongMaterial)) { this.instance = this.createPhongMaterialInstance(); typeChange = true; } else { this.updatePhongMaterialInstance(); } } else if (this.materialType === GameLib.D3.Material.MATERIAL_TYPE_BASIC) { if (!(this.instance instanceof THREE.MeshBasicMaterial)) { this.instance = this.createMeshBasicMaterialInstance(); typeChange = true; } else { this.updateMeshBasicMaterialInstance(); } } else { console.warn('not yet implemented (material type = ' + this.materialType + ')'); } this.updateTextures(); if (typeChange) { this.publish( GameLib.Event.MATERIAL_TYPE_CHANGED, { material: this } ); } this.instance.needsUpdate = true; } else { var instance = null; if (this.materialType === GameLib.D3.Material.MATERIAL_TYPE_STANDARD) { instance = this.createStandardMaterialInstance(); } else if (this.materialType === GameLib.D3.Material.MATERIAL_TYPE_POINTS) { instance = this.createPointsMaterialInstance(); } else if (this.materialType === GameLib.D3.Material.MATERIAL_TYPE_PHONG) { instance = this.createPhongMaterialInstance(); } else if (this.materialType === GameLib.D3.Material.MATERIAL_TYPE_BASIC) { instance = this.createMeshBasicMaterialInstance(); } else { console.warn("material type is not implemented yet: " + this.materialType); } instance.needsUpdate = true; this.subscribe( GameLib.Event.TEXTURE_LOADED, function (data) { var modified = false; /** * We also need to check if the image of the texture is assigned - * if not we should disable the map */ if (this.alphaMap === data.texture) { if (data.texture.image) { this.instance.alphaMap = data.texture.instance; } else { this.instance.alphaMap = null; } modified = true; } if (this.aoMap === data.texture) { if (data.texture.image) { this.instance.aoMap = data.texture.instance; } else { this.instance.aoMap = null; } modified = true; } if (this.bumpMap === data.texture) { if (data.texture.image) { this.instance.bumpMap = data.texture.instance; } else { this.instance.bumpMap = null; } modified = true; } if (this.diffuseMap === data.texture) { if (data.texture.image) { this.instance.map = data.texture.instance; } else { this.instance.map = null; } modified = true; } if (this.displacementMap === data.texture) { if (data.texture.image) { this.instance.displacementMap = data.texture.instance; } else { this.instance.displacementMap = null; } modified = true; } if (this.emissiveMap === data.texture) { if (data.texture.image) { this.instance.emissiveMap = data.texture.instance; } else { this.instance.emissiveMap = null; } modified = true; } if (this.environmentMap === data.texture) { if (data.texture.image) { this.instance.envMap = data.texture.instance; } else { this.instance.envMap = null; } modified = true; } if (this.lightMap === data.texture) { if (data.texture.image) { this.instance.lightMap = data.texture.instance; } else { this.instance.lightMap = null; } modified = true; } if (this.metalnessMap === data.texture) { if (data.texture.image) { this.instance.metalnessMap = data.texture.instance; } else { this.instance.metalnessMap = null; } modified = true; } if (this.normalMap === data.texture) { if (data.texture.image) { this.instance.normalMap = data.texture.instance; } else { this.instance.normalMap = null; } modified = true; } if (this.roughnessMap === data.texture) { if (data.texture.image) { this.instance.roughnessMap = data.texture.instance; } else { this.instance.roughnessMap = null; } modified = true; } if (this.specularMap === data.texture) { if (data.texture.image) { this.instance.specularMap = data.texture.instance; } else { this.instance.specularMap = null; } modified = true; } if (modified) { this.publish( GameLib.Event.MATERIAL_LOADED, { material: this } ); this.instance.needsUpdate = true; } } ); return instance; } }; /** * Updates the instance with the current state */ GameLib.D3.Material.prototype.updateInstance = function() { this.createInstance(true); }; /** * Converts a GameLib.D3.Material to a GameLib.D3.API.Material * @returns {GameLib.D3.API.Material} */ GameLib.D3.Material.prototype.toApiObject = function() { var apiAlphaMap = null; if (this.alphaMap) { apiAlphaMap = this.alphaMap.toApiObject(); } var apiAoMap = null; if (this.aoMap) { apiAoMap = this.aoMap.toApiObject(); } var apiBumpMap = null; if (this.bumpMap) { apiBumpMap = this.bumpMap.toApiObject(); } var apiDiffuseMap = null; if (this.diffuseMap) { apiDiffuseMap = this.diffuseMap.toApiObject(); } var apiDisplacementMap = null; if (this.displacementMap) { apiDisplacementMap = this.displacementMap.toApiObject(); } var apiEmissiveMap = null; if (this.emissiveMap) { apiEmissiveMap = this.emissiveMap.toApiObject(); } var apiEnvironmentMap = null; if (this.environmentMap) { apiEnvironmentMap = this.environmentMap.toApiObject(); } var apiLightMap = null; if (this.lightMap) { apiLightMap = this.lightMap.toApiObject(); } var apiMetalnessMap = null; if (this.metalnessMap) { apiMetalnessMap = this.metalnessMap.toApiObject(); } var apiNormalMap = null; if (this.normalMap) { apiNormalMap = this.normalMap.toApiObject(); } var apiRoughnessMap = null; if (this.roughnessMap) { apiRoughnessMap = this.roughnessMap.toApiObject(); } var apiSpecularMap = null; if (this.specularMap) { apiSpecularMap = this.specularMap.toApiObject(); } return new GameLib.D3.API.Material( this.id, this.materialType, this.name, this.opacity, this.side, this.transparent, this.specular.toApiObject(), this.lightMapIntensity, this.aoMapIntensity, this.color.toApiObject(), this.emissive.toApiObject(), this.emissiveIntensity, this.combine, this.shininess, this.reflectivity, this.refractionRatio, this.fog, this.wireframe, this.wireframeLineWidth, this.wireframeLineCap, this.wireframeLineJoin, this.vertexColors, this.skinning, this.morphTargets, this.morphNormals, this.lineWidth, this.lineCap, this.lineJoin, this.dashSize, this.gapWidth, this.blending, this.blendSrc, this.blendDst, this.blendEquation, this.depthTest, this.depthFunc, this.depthWrite, this.polygonOffset, this.polygonOffsetFactor, this.polygonOffsetUnits, this.alphaTest, this.clippingPlanes, this.clipShadows, this.visible, this.overdraw, this.shading, this.bumpScale, this.normalScale, this.displacementScale, this.displacementBias, this.roughness, this.metalness, this.pointSize, this.pointSizeAttenuation, this.spriteRotation, this.envMapIntensity, apiAlphaMap, apiAoMap, apiBumpMap, apiDiffuseMap, apiDisplacementMap, apiEmissiveMap, apiEnvironmentMap, apiLightMap, apiMetalnessMap, apiNormalMap, apiRoughnessMap, apiSpecularMap, GameLib.Utils.IdOrNull(this.parentEntity) ); }; /** * Creates a GameLib.D3.Material from a material Object * @param graphics GameLib.D3.Graphics * @param objectMaterial Object * @constructor */ GameLib.D3.Material.FromObjectMaterial = function(graphics, objectMaterial) { var gameLibMaterial = new GameLib.D3.Material( graphics, GameLib.D3.API.Material.FromObjectMaterial(objectMaterial) ); return gameLibMaterial; };