lingo3d
Version:
Lingo3D is a React/Vue 3d game development framework that ships with a complete visual editor
115 lines • 6 kB
JavaScript
import { filter } from "@lincode/utils";
import { MeshStandardMaterial, DoubleSide, Vector2 } from "three";
import filterNotDefault from "../display/core/mixins/utils/filterNotDefault";
import createSharedPool from "./utils/createSharedPool";
import { uuidMaterialMap } from "../collections/idCollections";
import { equalsDefaultValue } from "../interface/utils/getDefaultValue";
import { materialDefaultsMap } from "../collections/materialDefaultsMap";
import { castBlending } from "../display/utils/castBlending";
import { releaseTexture, requestTexture } from "./texturePool";
const setMaterial = (material, key, value, defaults) => {
if (value == undefined)
return;
if (equalsDefaultValue(value, defaults, key))
return;
const current = material[key];
if (current == value)
return;
if (current && typeof current === "object" && "set" in current) {
if ("x" in current) {
current.set(value.x ?? value, value.y ?? value);
return;
}
current.set(value);
return;
}
material[key] = value;
};
const createMap = (texture, textureRepeat, textureFlipY, textureRotation) => texture
? requestTexture([
texture,
textureRepeat,
textureFlipY,
textureRotation
])
: undefined;
export const [requestMaterial, releaseMaterial] = createSharedPool((params) => {
const referenceUUID = params[29];
if (referenceUUID) {
const referenceMaterial = uuidMaterialMap.get(referenceUUID);
const defaults = materialDefaultsMap.get(referenceMaterial);
const material = referenceMaterial.clone();
setMaterial(material, "color", params[0], defaults);
setMaterial(material, "opacity", params[1], defaults);
setMaterial(material, "transparent", referenceMaterial.transparent ||
(params[1] !== undefined && params[1] < 1), defaults);
setMaterial(material, "map", createMap(params[2], params[4], params[5], params[6]), defaults);
setMaterial(material, "alphaMap", createMap(params[3], params[4], params[5], params[6]), defaults);
setMaterial(material, "wireframe", params[7], defaults);
setMaterial(material, "envMap", createMap(params[8], params[4], params[5], params[6]), defaults);
setMaterial(material, "envMapIntensity", params[9], defaults);
setMaterial(material, "aoMap", createMap(params[10], params[4], params[5], params[6]), defaults);
setMaterial(material, "aoMapIntensity", params[11], defaults);
setMaterial(material, "bumpMap", createMap(params[12], params[4], params[5], params[6]), defaults);
setMaterial(material, "bumpScale", params[13], defaults);
setMaterial(material, "displacementMap", createMap(params[14], params[4], params[5], params[6]), defaults);
setMaterial(material, "displacementScale", params[15], defaults);
setMaterial(material, "displacementBias", params[16], defaults);
setMaterial(material, "emissive", params[17] ? params[0] : undefined, defaults);
setMaterial(material, "emissiveIntensity", params[18], defaults);
setMaterial(material, "lightMap", createMap(params[19], params[4], params[5], params[6]), defaults);
setMaterial(material, "lightMapIntensity", params[20], defaults);
setMaterial(material, "metalnessMap", createMap(params[21], params[4], params[5], params[6]), defaults);
setMaterial(material, "metalness", params[22], defaults);
setMaterial(material, "roughnessMap", createMap(params[23], params[4], params[5], params[6]), defaults);
setMaterial(material, "roughness", params[24], defaults);
setMaterial(material, "normalMap", createMap(params[25], params[4], params[5], params[6]), defaults);
setMaterial(material, "normalScale", params[26], defaults);
setMaterial(material, "depthTest", params[27], defaults);
setMaterial(material, "blending", params[28], defaults);
return material;
}
return new MeshStandardMaterial(filter({
side: DoubleSide,
color: params[0],
opacity: params[1],
transparent: params[1] !== undefined && params[1] < 1,
map: createMap(params[2], params[4], params[5], params[6]),
alphaMap: createMap(params[3], params[4], params[5], params[6]),
wireframe: params[7],
envMap: createMap(params[8], params[4], params[5], params[6]),
envMapIntensity: params[9],
aoMap: createMap(params[10], params[4], params[5], params[6]),
aoMapIntensity: params[11],
bumpMap: createMap(params[12], params[4], params[5], params[6]),
bumpScale: params[13],
displacementMap: createMap(params[14], params[4], params[5], params[6]),
displacementScale: params[15],
displacementBias: params[16],
emissive: params[17] ? params[0] : undefined,
emissiveIntensity: params[18],
lightMap: createMap(params[19], params[4], params[5], params[6]),
lightMapIntensity: params[20],
metalnessMap: createMap(params[21], params[4], params[5], params[6]),
metalness: params[22],
roughnessMap: createMap(params[23], params[4], params[5], params[6]),
roughness: params[24],
normalMap: createMap(params[25], params[4], params[5], params[6]),
normalScale: new Vector2(params[26], params[26]),
depthTest: params[27],
blending: castBlending(params[28])
}, filterNotDefault));
}, (material) => {
releaseTexture(material.map);
releaseTexture(material.alphaMap);
releaseTexture(material.envMap);
releaseTexture(material.aoMap);
releaseTexture(material.bumpMap);
releaseTexture(material.displacementMap);
releaseTexture(material.lightMap);
releaseTexture(material.metalnessMap);
releaseTexture(material.roughnessMap);
releaseTexture(material.normalMap);
material.dispose();
});
//# sourceMappingURL=materialPool.js.map