polygonjs-engine
Version:
node-based webgl 3D engine https://polygonjs.com
51 lines (45 loc) • 1.5 kB
text/typescript
import {Constructor} from '../../../../types/GlobalTypes';
import {BaseController} from './_BaseController';
import {TypedMatNode} from '../_Base';
import {Material} from 'three/src/materials/Material';
import {NodeParamsConfig, ParamConfig} from '../../utils/params/ParamsConfig';
import {IUniforms} from '../../../../core/geometry/Material';
export function ColorParamConfig<TBase extends Constructor>(Base: TBase) {
return class Mixin extends Base {
// color = ParamConfig.COLOR([1, 1, 1]);
transparent = ParamConfig.BOOLEAN(0);
opacity = ParamConfig.FLOAT(1);
alphaTest = ParamConfig.FLOAT(0);
useFog = ParamConfig.BOOLEAN(0);
};
}
class ColoredMaterial extends Material {
vertexColors!: boolean;
transparent!: boolean;
depthTest!: boolean;
alphaTest!: number;
fog!: boolean;
uniforms!: IUniforms;
}
class ColorParamsConfig extends ColorParamConfig(NodeParamsConfig) {}
class ColoredMatNode extends TypedMatNode<ColoredMaterial, ColorParamsConfig> {
create_material() {
return new ColoredMaterial();
}
}
export class ColorsController extends BaseController {
constructor(protected node: ColoredMatNode) {
super(node);
}
static update(node: ColoredMatNode) {
const material = node.material;
const pv = node.pv;
if (material.uniforms.opacity) {
material.uniforms.opacity.value = pv.opacity;
}
material.transparent = pv.transparent || pv.opacity < 1;
material.depthTest = true;
material.alphaTest = pv.alphaTest;
material.fog = pv.useFog;
}
}