import {TypedSopNode} from "./_Base";
import {ObjectPropertiesSopOperation} from "../../../core/operations/sop/ObjectProperties";
import {NodeParamsConfig, ParamConfig} from "../utils/params/ParamsConfig";
const DEFAULT = ObjectPropertiesSopOperation.DEFAULT_PARAMS;
class ObjectPropertiesSopParamsConfig extends NodeParamsConfig {
  constructor() {
    super(...arguments);
    this.applyToChildren = ParamConfig.BOOLEAN(DEFAULT.applyToChildren);
    this.separatorApplyToChildren = ParamConfig.SEPARATOR();
    this.tname = ParamConfig.BOOLEAN(DEFAULT.tname);
    this.name = ParamConfig.STRING(DEFAULT.name, {visibleIf: {tname: true}});
    this.separatorName = ParamConfig.SEPARATOR(null, {visibleIf: {tname: true}});
    this.trenderOrder = ParamConfig.BOOLEAN(DEFAULT.trenderOrder);
    this.renderOrder = ParamConfig.INTEGER(DEFAULT.renderOrder, {
      visibleIf: {trenderOrder: true},
      range: [0, 10],
      rangeLocked: [false, false]
    });
    this.separatorRenderOrder = ParamConfig.SEPARATOR(null, {visibleIf: {trenderOrder: true}});
    this.tfrustumCulled = ParamConfig.BOOLEAN(DEFAULT.tfrustumCulled);
    this.frustumCulled = ParamConfig.BOOLEAN(DEFAULT.frustumCulled, {visibleIf: {tfrustumCulled: true}});
    this.separatorFrustumCulled = ParamConfig.SEPARATOR(null, {visibleIf: {tfrustumCulled: true}});
    this.tmatrixAutoUpdate = ParamConfig.BOOLEAN(DEFAULT.tmatrixAutoUpdate);
    this.matrixAutoUpdate = ParamConfig.BOOLEAN(DEFAULT.matrixAutoUpdate, {visibleIf: {tmatrixAutoUpdate: true}});
    this.separatorMatrixAutoUpdate = ParamConfig.SEPARATOR(null, {visibleIf: {tmatrixAutoUpdate: true}});
    this.tvisible = ParamConfig.BOOLEAN(DEFAULT.tvisible);
    this.visible = ParamConfig.BOOLEAN(DEFAULT.visible, {visibleIf: {tvisible: true}});
    this.separatorVisible = ParamConfig.SEPARATOR(null, {visibleIf: {tvisible: true}});
    this.tcastShadow = ParamConfig.BOOLEAN(DEFAULT.tcastShadow);
    this.castShadow = ParamConfig.BOOLEAN(DEFAULT.castShadow, {visibleIf: {tcastShadow: true}});
    this.separatorCastShadow = ParamConfig.SEPARATOR(null, {visibleIf: {tcastShadow: true}});
    this.treceiveShadow = ParamConfig.BOOLEAN(DEFAULT.treceiveShadow);
    this.receiveShadow = ParamConfig.BOOLEAN(DEFAULT.receiveShadow, {visibleIf: {treceiveShadow: true}});
  }
}
const ParamsConfig2 = new ObjectPropertiesSopParamsConfig();
export class ObjectPropertiesSopNode extends TypedSopNode {
  constructor() {
    super(...arguments);
    this.params_config = ParamsConfig2;
  }
  static type() {
    return "objectProperties";
  }
  static displayedInputNames() {
    return ["objects to change properties of"];
  }
  initializeNode() {
    this.io.inputs.setCount(1);
    this.io.inputs.initInputsClonedState(ObjectPropertiesSopOperation.INPUT_CLONED_STATE);
  }
  async cook(input_contents) {
    this._operation = this._operation || new ObjectPropertiesSopOperation(this.scene(), this.states);
    const core_group = this._operation.cook(input_contents, this.pv);
    this.setCoreGroup(core_group);
  }
}
