@polygonjs/polygonjs
Version:
node-based WebGL 3D engine https://polygonjs.com
88 lines (87 loc) • 2.6 kB
JavaScript
;
import { isBooleanTrue } from "../../../../../core/Type";
import { FrontSide, BackSide, DoubleSide } from "three";
export function updateMaterialSide(mat, params) {
const singleSide = isBooleanTrue(params.front) ? FrontSide : BackSide;
const newSide = isBooleanTrue(params.doubleSided) ? DoubleSide : singleSide;
if (newSide != mat.side) {
mat.side = newSide;
mat.forceSinglePass = !isBooleanTrue(params.doubleSided);
mat.needsUpdate = true;
}
}
function updateNodeSide(mat, params) {
switch (mat.side) {
case FrontSide: {
params.doubleSided.set(false);
params.front.set(true);
return;
}
case BackSide: {
params.doubleSided.set(false);
params.front.set(false);
return;
}
case DoubleSide: {
params.doubleSided.set(true);
params.front.set(true);
return;
}
}
}
export function updateMaterialSideWithShadow(mat, params) {
updateMaterialSide(mat, params);
if (isBooleanTrue(params.overrideShadowSide)) {
const singleSide = isBooleanTrue(params.shadowFront) ? FrontSide : BackSide;
const newSide = isBooleanTrue(params.shadowDoubleSided) ? DoubleSide : singleSide;
if (newSide != mat.shadowSide) {
mat.shadowSide = newSide;
mat.needsUpdate = true;
}
} else {
mat.shadowSide = null;
}
const customMaterials = mat.customMaterials;
if (customMaterials) {
const customNames = Object.keys(customMaterials);
for (const customName of customNames) {
const customMaterial = customMaterials[customName];
if (customMaterial) {
updateMaterialSideWithShadow(customMaterial, params);
}
}
}
}
export function updateNodeSideWithShadow(mat, params) {
updateNodeSide(mat, params);
if (mat.shadowSide != null) {
params.overrideShadowSide.set(true);
switch (mat.shadowSide) {
case FrontSide: {
params.shadowDoubleSided.set(false);
params.shadowFront.set(true);
return;
}
case BackSide: {
params.shadowDoubleSided.set(false);
params.shadowFront.set(false);
return;
}
case DoubleSide: {
params.shadowDoubleSided.set(true);
params.shadowFront.set(true);
return;
}
}
}
const customMaterials = mat.customMaterials;
if (customMaterials) {
const customNames = Object.keys(customMaterials);
for (const customName of customNames) {
const customMaterial = customMaterials[customName];
if (customMaterial) {
updateNodeSideWithShadow(customMaterial, params);
}
}
}
}