polygonjs-engine
Version:
node-based webgl 3D engine https://polygonjs.com
125 lines (113 loc) • 3.88 kB
text/typescript
import {Vector4} from 'three/src/math/Vector4';
import {Vector3} from 'three/src/math/Vector3';
import {Vector2} from 'three/src/math/Vector2';
import {Color} from 'three/src/math/Color';
import {ParamType} from '../../../../poly/ParamType';
import {ParamInitValuesTypeMap} from '../../../../params/types/ParamInitValuesTypeMap';
import {BaseNodeType} from '../../../_Base';
import {BaseParamType} from '../../../../params/_Base';
import {TypeAssert} from '../../../../poly/Assert';
import {IUniform} from 'three/src/renderers/shaders/UniformsLib';
import {RampParam} from '../../../../params/Ramp';
import {OperatorPathParam} from '../../../../params/OperatorPath';
import {ParamConfig} from '../../../utils/code/configs/ParamConfig';
export class GlParamConfig<T extends ParamType> extends ParamConfig<T> {
private _uniform: IUniform | undefined;
constructor(_type: T, _name: string, _default_value: ParamInitValuesTypeMap[T], private _uniform_name: string) {
super(_type, _name, _default_value);
}
get uniform_name() {
return this._uniform_name;
}
get uniform() {
return (this._uniform = this._uniform || this._create_uniform());
}
private _create_uniform() {
return GlParamConfig.uniform_by_type(this._type);
}
execute_callback(node: BaseNodeType, param: BaseParamType) {
this._callback(node, param);
}
protected _callback(node: BaseNodeType, param: BaseParamType) {
GlParamConfig.callback(param, this.uniform);
// switch (param.type) {
// case ParamType.RAMP:
// this.uniform.value = (param as RampParam).ramp_texture();
// return;
// case ParamType.OPERATOR_PATH:
// GlParamConfig.set_uniform_value_from_texture(param as OperatorPathParam, this.uniform);
// return;
// default:
// this.uniform.value = param.value;
// }
}
static callback(param: BaseParamType, uniform: IUniform) {
switch (param.type()) {
case ParamType.RAMP:
uniform.value = (param as RampParam).ramp_texture();
return;
case ParamType.OPERATOR_PATH:
GlParamConfig.set_uniform_value_from_texture(param as OperatorPathParam, uniform);
return;
default:
uniform.value = param.value;
}
}
// TODO: refactor that to use the default values map?
static uniform_by_type(type: ParamType): IUniform {
switch (type) {
case ParamType.BOOLEAN:
return {value: 0};
case ParamType.BUTTON:
return {value: 0};
case ParamType.COLOR:
return {value: new Color(0, 0, 0)};
case ParamType.FLOAT:
return {value: 0};
case ParamType.FOLDER:
return {value: 0};
case ParamType.INTEGER:
return {value: 0};
case ParamType.OPERATOR_PATH:
return {value: 0};
case ParamType.NODE_PATH:
return {value: 0};
case ParamType.PARAM_PATH:
return {value: 0};
// case ParamType.STRING: return {type: 't', value: null} // new Texture()}
case ParamType.RAMP:
return {value: null}; // new Texture()}
case ParamType.SEPARATOR:
return {value: 0};
case ParamType.STRING:
return {value: null};
case ParamType.VECTOR2:
return {value: new Vector2(0, 0)};
case ParamType.VECTOR3:
return {value: new Vector3(0, 0, 0)};
case ParamType.VECTOR4:
return {value: new Vector4(0, 0, 0, 0)};
}
TypeAssert.unreachable(type);
}
static set_uniform_value_from_texture(param: OperatorPathParam, uniform: IUniform) {
const found_node = param.found_node();
if (found_node) {
if (found_node.isDirty()) {
found_node.requestContainer().then((container) => {
const texture = container.texture();
uniform.value = texture;
});
} else {
const container = found_node.container_controller.container;
const texture = container.texture();
uniform.value = texture;
}
} else {
uniform.value = null;
}
}
set_uniform_value_from_ramp(param: RampParam, uniform: IUniform) {
uniform.value = param.ramp_texture();
}
}