UNPKG

babylon-mmd

Version:
134 lines (133 loc) 4.11 kB
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;