polygonjs-engine
Version:
node-based webgl 3D engine https://polygonjs.com
81 lines (80 loc) • 3.71 kB
JavaScript
import {JsonExportDispatcher} from "../../../io/json/export/Dispatcher";
import {ArrayUtils as ArrayUtils2} from "../../../../core/ArrayUtils";
import {ObjectUtils as ObjectUtils2} from "../../../../core/ObjectUtils";
export class JsAssemblerNodeSpareParamsController {
constructor(_controller, _node) {
this._controller = _controller;
this._node = _node;
this._deleted_params_data = new Map();
this._created_spare_param_names = [];
this._raw_input_serialized_by_param_name = new Map();
this._init_value_serialized_by_param_name = new Map();
}
get assembler() {
return this._controller.assembler;
}
create_spare_parameters() {
const params_update_options = {};
const param_configs = this.assembler.param_configs();
const assembler_param_names = param_configs.map((c) => c.name());
const spare_param_names_to_add = ObjectUtils2.clone(assembler_param_names);
const validation_result = this._validate_names(spare_param_names_to_add);
if (validation_result == false) {
return;
}
const spare_param_names_to_remove = ObjectUtils2.clone(this._created_spare_param_names).concat(spare_param_names_to_add);
spare_param_names_to_remove.forEach((param_name) => {
const param = this._node.params.get(param_name);
if (param) {
this._raw_input_serialized_by_param_name.set(param.name(), param.raw_input_serialized);
this._init_value_serialized_by_param_name.set(param.name(), param.default_value_serialized);
const param_exporter = JsonExportDispatcher.dispatch_param(param);
if (param_exporter.required()) {
const params_data = param_exporter.data();
this._deleted_params_data.set(param.name(), params_data);
}
}
params_update_options.names_to_delete = params_update_options.names_to_delete || [];
params_update_options.names_to_delete.push(param_name);
});
for (let param_config of param_configs) {
if (spare_param_names_to_add.indexOf(param_config.name()) >= 0) {
const config_options = ObjectUtils2.clone(param_config.param_options);
const default_options = {
spare: true,
computeOnDirty: true,
cook: false
};
const options = ObjectUtils2.merge(config_options, default_options);
let init_value = this._init_value_serialized_by_param_name.get(param_config.name());
if (init_value == null) {
init_value = param_config.default_value;
}
let raw_input = this._raw_input_serialized_by_param_name.get(param_config.name());
if (raw_input == null) {
raw_input = param_config.default_value;
}
params_update_options.to_add = params_update_options.to_add || [];
params_update_options.to_add.push({
name: param_config.name(),
type: param_config.type(),
init_value,
raw_input,
options
});
}
}
this._node.params.update_params(params_update_options);
this._created_spare_param_names = params_update_options.to_add?.map((o) => o.name) || [];
}
_validate_names(spare_param_names_to_add) {
const current_param_names = ObjectUtils2.clone(this._node.params.non_spare_names);
const spare_params_with_same_name_as_params = ArrayUtils2.intersection(spare_param_names_to_add, current_param_names);
if (spare_params_with_same_name_as_params.length > 0) {
const error_message = `${this._node.fullPath()} attempts to create spare params called '${spare_params_with_same_name_as_params.join(", ")}' with same name as params`;
this._node.states.error.set(error_message);
return false;
}
return true;
}
}