@polygonjs/polygonjs
Version:
node-based WebGL 3D engine https://polygonjs.com
93 lines (87 loc) • 3.32 kB
text/typescript
/**
* Creates a LineBasic Material, which can be extended with GL nodes.
*
* @remarks
* This node can create children, which will be GL nodes. The GLSL code generated by the nodes will extend the Material.
*
*/
import {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';
import {
UniformsTransparencyParamConfig,
UniformsTransparencyController,
UniformsTransparencyControllers,
} from './utils/UniformsTransparencyController';
import {
AdvancedCommonController,
AdvancedCommonControllers,
AdvancedCommonParamConfig,
} from './utils/AdvancedCommonController';
import {ShaderAssemblerLine} from '../gl/code/assemblers/materials/Line';
import {TypedBuilderMatNode, BaseBuilderParamConfig} from './_BaseBuilder';
import {AssemblerName} from '../../poly/registers/assemblers/_BaseRegister';
import {Poly} from '../../Poly';
import {DefaultFolderParamConfig} from './utils/DefaultFolder';
import {AdvancedFolderParamConfig} from './utils/AdvancedFolder';
import {LineBasicMaterial} from 'three';
import {CustomMaterialName} from '../../../core/geometry/Material';
import {Material} from 'three';
import {GlAssemblerController} from '../gl/code/Controller';
import {MatType} from '../../poly/registers/nodes/types/Mat';
import {
CustomMaterialLineParamConfig,
materialLineAssemblerCustomMaterialRequested,
} from './utils/customMaterials/CustomMaterialLine';
interface LineBasicBuilderControllers extends AdvancedCommonControllers, UniformsTransparencyControllers {}
interface LineBasicBuilderMaterial extends LineBasicMaterial {
vertexShader: string;
fragmentShader: string;
customMaterials: {
[key in CustomMaterialName]?: Material;
};
}
class LineBasicBuilderMatParamsConfig extends CustomMaterialLineParamConfig(
AdvancedCommonParamConfig(
BaseBuilderParamConfig(
/* advanced */ AdvancedFolderParamConfig(
UniformsTransparencyParamConfig(DefaultFolderParamConfig(NodeParamsConfig))
)
)
)
) {
linewidth = ParamConfig.FLOAT(1, {
range: [0, 10],
rangeLocked: [true, false],
});
}
const ParamsConfig = new LineBasicBuilderMatParamsConfig();
export class LineBasicBuilderMatNode extends TypedBuilderMatNode<
LineBasicBuilderMaterial,
ShaderAssemblerLine,
LineBasicBuilderMatParamsConfig
> {
override paramsConfig = ParamsConfig;
static override type() {
return MatType.LINE_BASIC_BUILDER;
}
public override usedAssembler(): Readonly<AssemblerName.GL_LINE> {
return AssemblerName.GL_LINE;
}
protected _createAssemblerController(): GlAssemblerController<ShaderAssemblerLine> | undefined {
return Poly.assemblersRegister.assembler(this, this.usedAssembler());
}
public override customMaterialRequested(customName: CustomMaterialName): boolean {
return materialLineAssemblerCustomMaterialRequested(this, customName);
}
readonly controllers: LineBasicBuilderControllers = {
advancedCommon: new AdvancedCommonController(this),
uniformTransparency: new UniformsTransparencyController(this),
};
protected override controllersList = Object.values(this.controllers);
override async cook() {
this._material = this._material || this.createMaterial();
await Promise.all(this.controllersPromises(this._material));
this.compileIfRequired(this._material);
this._material.linewidth = this.pv.linewidth;
this.setMaterial(this._material);
}
}