polygonjs-engine
Version:
node-based webgl 3D engine https://polygonjs.com
215 lines (214 loc) • 6.03 kB
JavaScript
import {CoreWalker} from "../../core/Walker";
import {CoreGraphNode as CoreGraphNode2} from "../../core/graph/CoreGraphNode";
import {OptionsController as OptionsController2} from "./utils/OptionsController";
import {EmitController as EmitController2} from "./utils/EmitController";
import {ParamSerializer} from "./utils/Serializer";
import {StatesController as StatesController2} from "./utils/StatesController";
import {ParamType as ParamType2} from "../poly/ParamType";
import {ParamEvent as ParamEvent2} from "../poly/ParamEvent";
import {MethodDependency as MethodDependency2} from "../expressions/MethodDependency";
const TYPED_PARAM_DEFAULT_COMPONENT_NAMES = [];
export class TypedParam extends CoreGraphNode2 {
constructor(scene, node) {
super(scene, "BaseParam");
this._options = new OptionsController2(this);
this._emit_controller = new EmitController2(this);
this._is_computing = false;
this._node = node;
this.initialize_param();
}
get options() {
return this._options = this._options || new OptionsController2(this);
}
get emitController() {
return this._emit_controller = this._emit_controller || new EmitController2(this);
}
get expression_controller() {
return this._expression_controller;
}
get serializer() {
return this._serializer = this._serializer || new ParamSerializer(this);
}
get states() {
return this._states = this._states || new StatesController2(this);
}
dispose() {
const predecessors = this.graphPredecessors();
for (let predecessor of predecessors) {
if (predecessor instanceof MethodDependency2) {
predecessor.dispose();
}
}
this._expression_controller?.dispose();
super.dispose();
this._options?.dispose();
}
initialize_param() {
}
static type() {
return ParamType2.FLOAT;
}
type() {
return this.constructor.type();
}
get is_numeric() {
return false;
}
setName(name) {
super.setName(name);
}
get value() {
return this._value;
}
copy_value(param) {
if (param.type() == this.type()) {
this._copy_value(param);
} else {
console.warn(`cannot copy value from ${param.type()} to ${this.type()}`);
}
}
_copy_value(param) {
throw "abstract method param._copy_value";
}
get value_pre_conversion_serialized() {
return void 0;
}
convert(raw_val) {
return null;
}
static are_raw_input_equal(val1, val2) {
return false;
}
is_raw_input_equal(other_raw_input) {
return this.constructor.are_raw_input_equal(this._raw_input, other_raw_input);
}
static are_values_equal(val1, val2) {
return false;
}
is_value_equal(other_val) {
return this.constructor.are_values_equal(this.value, other_val);
}
_clone_raw_input(raw_input) {
return raw_input;
}
set(raw_input) {
this._raw_input = this._clone_raw_input(this._prefilter_invalid_raw_input(raw_input));
this.emitController.emit(ParamEvent2.RAW_INPUT_UPDATED);
this.process_raw_input();
}
_prefilter_invalid_raw_input(raw_input) {
return raw_input;
}
get default_value() {
return this._default_value;
}
get is_default() {
return this._raw_input == this.default_value;
}
get raw_input() {
return this._raw_input;
}
process_raw_input() {
}
async compute() {
if (this.scene().loadingController.isLoading()) {
console.warn(`param attempt to compute ${this.fullPath()}`);
}
if (this.isDirty()) {
if (!this._is_computing) {
this._is_computing = true;
await this.process_computation();
this._is_computing = false;
if (this._compute_resolves) {
let callback;
while (callback = this._compute_resolves.pop()) {
callback();
}
}
} else {
return new Promise((resolve, reject) => {
this._compute_resolves = this._compute_resolves || [];
this._compute_resolves.push(resolve);
});
}
}
}
async process_computation() {
}
set_init_value(init_value) {
this._default_value = this._clone_raw_input(this._prefilter_invalid_raw_input(init_value));
}
_setup_node_dependencies(node) {
if (!node) {
if (this._node) {
this._node.params.params_node?.removeGraphInput(this);
}
} else {
this.options.allowCallback();
if (this.options.makes_node_dirty_when_dirty() && !this.parent_param) {
node.params.params_node?.addGraphInput(this, false);
}
}
if (this.components) {
for (let c of this.components) {
c._setup_node_dependencies(node);
}
}
}
get node() {
return this._node;
}
parent() {
return this.node;
}
set_parent_param(param) {
param.addGraphInput(this, false);
this._parent_param = param;
}
get parent_param() {
return this._parent_param;
}
has_parent_param() {
return this._parent_param != null;
}
fullPath() {
return this.node?.fullPath() + "/" + this.name();
}
path_relative_to(node) {
return CoreWalker.relative_path(node, this);
}
emit(event_name) {
if (this.emitController.emitAllowed()) {
this.emitController.incrementCount(event_name);
this.scene().dispatchController.dispatch(this, event_name);
}
}
get components() {
return this._components;
}
get component_names() {
return TYPED_PARAM_DEFAULT_COMPONENT_NAMES;
}
get is_multiple() {
return this.component_names.length > 0;
}
init_components() {
}
has_expression() {
return this.expression_controller != null && this.expression_controller.active();
}
toJSON() {
return this.serializer.toJSON();
}
}
export class BaseParamClass extends TypedParam {
get default_value_serialized() {
return "BaseParamClass.default_value_serialized overriden";
}
get raw_input_serialized() {
return "BaseParamClass.raw_input_serialized overriden";
}
get value_serialized() {
return "BaseParamClass.value_serialized overriden";
}
}