babylon-mmd
Version:
babylon.js mmd loader and runtime
134 lines (133 loc) • 4.11 kB
JavaScript
import { Material } from "@babylonjs/core/Materials/material";
/**
* Standard material proxy
*
* Used to apply MMD material morphs to standard materials
*/
export class StandardMaterialProxy {
/**
* Diffuse color
*/
diffuse;
/**
* Specular color
*/
specular;
/**
* Shininess
*/
shininess;
/**
* Ambient color
*/
ambient;
/**
* Edge color
*/
edgeColor;
/**
* Edge size
*/
edgeSize;
/**
* Texture multiplicative color
*/
textureMultiplicativeColor;
/**
* Texture additive color
*/
textureAdditiveColor;
/**
* Sphere texture multiplicative color
*/
sphereTextureMultiplicativeColor;
/**
* Sphere texture additive color
*/
sphereTextureAdditiveColor;
/**
* Toon texture multiplicative color
*/
toonTextureMultiplicativeColor;
/**
* Toon texture additive color
*/
toonTextureAdditiveColor;
_material;
_referencedMeshes;
_initialDiffuse;
_initialSpecular;
_initialShininess;
_initialAmbient;
_initialTransparencyMode;
/**
* Create standard material proxy
* @param material standard material
*/
constructor(material, referencedMeshes) {
this._material = material;
this._referencedMeshes = referencedMeshes;
const materialDiffuseColor = material.diffuseColor;
this.diffuse = [materialDiffuseColor.r, materialDiffuseColor.g, materialDiffuseColor.b, material.alpha];
const materialSpecularColor = material.specularColor;
this.specular = [materialSpecularColor.r, materialSpecularColor.g, materialSpecularColor.b];
this.shininess = material.specularPower;
const materialAmbientColor = material.ambientColor;
this.ambient = [materialAmbientColor.r, materialAmbientColor.g, materialAmbientColor.b];
this.edgeColor = [0, 0, 0, 0];
this.edgeSize = 0;
this.textureMultiplicativeColor = [1, 1, 1, 1];
this.textureAdditiveColor = [0, 0, 0, 0];
this.sphereTextureMultiplicativeColor = [1, 1, 1, 1];
this.sphereTextureAdditiveColor = [0, 0, 0, 0];
this.toonTextureMultiplicativeColor = [1, 1, 1, 1];
this.toonTextureAdditiveColor = [0, 0, 0, 0];
this._initialDiffuse = [...this.diffuse];
this._initialSpecular = [...this.specular];
this._initialShininess = this.shininess;
this._initialAmbient = [...this.ambient];
this._initialTransparencyMode = material.transparencyMode;
}
/**
* Reset material properties to initial state
*/
reset() {
for (let i = 0; i < 4; ++i) {
this.diffuse[i] = this._initialDiffuse[i];
}
for (let i = 0; i < 3; ++i) {
this.specular[i] = this._initialSpecular[i];
this.ambient[i] = this._initialAmbient[i];
}
this.shininess = this._initialShininess;
}
/**
* Apply changes to the material
*/
applyChanges() {
const material = this._material;
material.diffuseColor.set(this.diffuse[0], this.diffuse[1], this.diffuse[2]);
material.alpha = this.diffuse[3];
if (this.diffuse[3] === 1) {
material.transparencyMode = this._initialTransparencyMode;
}
else {
material.transparencyMode = Material.MATERIAL_ALPHABLEND;
}
const referencedMeshes = this._referencedMeshes;
if (this.diffuse[3] <= 0) {
for (let i = 0; i < referencedMeshes.length; ++i) {
referencedMeshes[i].isVisible = false;
}
}
else {
for (let i = 0; i < referencedMeshes.length; ++i) {
referencedMeshes[i].isVisible = true;
}
}
material.specularColor.set(this.specular[0], this.specular[1], this.specular[2]);
material.specularPower = this.shininess;
material.ambientColor.set(this.ambient[0], this.ambient[1], this.ambient[2]);
}
}
StandardMaterialProxy;