/**
 * Updates points with JS nodes
 *
 *
 */
import { TypedSopNode } from './_Base';
import { CoreGroup } from '../../../core/geometry/Group';
import { NodeParamsConfig } from '../utils/params/ParamsConfig';
import { EntityBuilderFunctionData } from '../js/code/assemblers/entityBuilder/_BaseEntityBuilderPersistedConfig';
import { AssemblerName } from '../../poly/registers/assemblers/_BaseRegister';
import { JsAssemblerController } from '../js/code/Controller';
import type { JsAssemblerEntityBuilder } from '../js/code/assemblers/entityBuilder/EntityBuilderAssembler';
import { EntityContainer } from '../js/code/assemblers/entityBuilder/EntityBuilderAssemblerCommon';
import { NodeContext } from '../../poly/NodeContext';
import { JsNodeChildrenMap } from '../../poly/registers/nodes/Js';
import { NodeCreateOptions } from '../utils/hierarchy/ChildrenController';
import { Constructor, valueof } from '../../../types/GlobalTypes';
import { BaseJsNodeType } from '../js/_Base';
import { ParamType } from '../../poly/ParamType';
import { RegisterableVariable } from '../js/code/assemblers/_BaseJsPersistedConfigUtils';
import { BufferAttribute, Color, InterleavedBufferAttribute, Vector2, Vector3, Vector4 } from 'three';
import { JsConnectionPointType } from '../utils/io/connections/Js';
import { EntityBuilderEvaluator } from '../js/code/assemblers/entityBuilder/EntityBuilderEvaluator';
import { CoreObjectType, ObjectContent } from '../../../core/geometry/ObjectContent';
import { AttribClass } from '../../../core/geometry/Constant';
import { BaseVertexAttribute } from '../../../core/geometry/entities/vertex/VertexAttribute';
import { BasePrimitiveAttribute } from '../../../core/geometry/entities/primitive/PrimitiveAttribute';
import { CorePoint } from '../../../core/geometry/entities/point/CorePoint';
import { CorePrimitive } from '../../../core/geometry/entities/primitive/CorePrimitive';
import { CoreVertex } from '../../../core/geometry/entities/vertex/CoreVertex';
type AttributeItem = boolean | number | string | Color | Vector2 | Vector3 | Vector4;
type AttributesDict = Map<string, AttributeItem>;
type AvailableEntity = AttribClass.POINT | AttribClass.VERTEX | AttribClass.PRIMITIVE;
export declare const AVAILABLE_ENTITIES: AvailableEntity[];
type EntityAttribute = BufferAttribute | InterleavedBufferAttribute | BaseVertexAttribute | BasePrimitiveAttribute;
export declare class BaseEntityBuilderSopParamsConfig extends NodeParamsConfig {
    /** @param group to assign the material to */
    group: import("../utils/params/ParamsConfig").ParamTemplate<ParamType.STRING>;
    entity: import("../utils/params/ParamsConfig").ParamTemplate<ParamType.INTEGER>;
}
export declare abstract class BaseEntityBuilderSopNode<P extends BaseEntityBuilderSopParamsConfig> extends TypedSopNode<P> {
    assemblerController(): JsAssemblerController<JsAssemblerEntityBuilder> | undefined;
    usedAssembler(): Readonly<AssemblerName.JS_ENTITY_BUILDER>;
    protected _assemblerController: JsAssemblerController<JsAssemblerEntityBuilder> | undefined;
    private _createAssemblerController;
    protected _childrenControllerContext: NodeContext;
    createNode<S extends keyof JsNodeChildrenMap>(node_class: S, options?: NodeCreateOptions): JsNodeChildrenMap[S];
    createNode<K extends valueof<JsNodeChildrenMap>>(node_class: Constructor<K>, options?: NodeCreateOptions): K;
    children(): BaseJsNodeType[];
    nodesByType<K extends keyof JsNodeChildrenMap>(type: K): JsNodeChildrenMap[K][];
    childrenAllowed(): boolean;
    sceneReadonly(): boolean;
    initializeNode(): void;
    cook(inputCoreGroups: CoreGroup[]): Promise<void>;
    protected abstract _processObject<T extends CoreObjectType>(object: ObjectContent<T>, objnum: number, evaluator: EntityBuilderEvaluator): void;
    protected _resetRequiredAttributes(): void;
    protected _checkRequiredReadAttributes<T extends CoreObjectType>(object: ObjectContent<T>): {
        attribNames: string[];
        attributeByName: Map<string, BufferAttribute>;
        attribTypeByName: Map<string, JsConnectionPointType>;
    } | undefined;
    protected _checkRequiredWriteAttributes<T extends CoreObjectType>(object: ObjectContent<T>): {
        attribNames: string[];
        attributeByName: Map<string, EntityAttribute>;
        attribTypeByName: Map<string, JsConnectionPointType>;
    } | undefined;
    protected _readRequiredAttributes(index: number, attribNames: string[], attributeByName: Map<string, BufferAttribute>, attribTypeByName: Map<string, JsConnectionPointType>): void;
    protected _writeRequiredAttributes(index: number, attribNames: string[], attributeByName: Map<string, BufferAttribute>): void;
    compileIfRequired(): void;
    protected abstract _entityContainer: EntityContainer;
    private _paramConfigs;
    private _functionData;
    private _functionCreationArgs;
    private _functionEvalArgs;
    private _function;
    private _attributesDict;
    functionData(): EntityBuilderFunctionData | undefined;
    compile(): void;
    updateFromFunctionData(functionData: EntityBuilderFunctionData): void;
    functionEvalArgsWithParamConfigs(): (number | boolean | Function | RegisterableVariable | EntityContainer | AttributesDict)[];
    setEntity(attribClass: AvailableEntity): void;
    entity(): AvailableEntity;
    entitiesCount(object: ObjectContent<CoreObjectType>): number;
    entityClass(object: ObjectContent<CoreObjectType>): typeof CorePoint<CoreObjectType> | typeof CoreVertex<CoreObjectType> | typeof CorePrimitive<CoreObjectType>;
    private _createAttribute;
}
export {};
