import type { TypedArray, MeshAttribute, MeshGeometry } from '@loaders.gl/schema';
import type { Draco3D, Decoder, Mesh, PointCloud, PointAttribute, Metadata, MetadataQuerier } from "../draco3d/draco3d-types.js";
import type { DracoMesh, DracoLoaderData, DracoAttribute, DracoMetadataEntry, DracoQuantizationTransform, DracoOctahedronTransform } from "./draco-types.js";
/** Options to control draco parsing */
export type DracoParseOptions = {
    /** How triangle indices should be generated (mesh only) */
    topology?: 'triangle-list' | 'triangle-strip';
    /** Specify which attribute metadata entry stores the attribute name */
    attributeNameEntry?: string;
    /** Names and ids of extra attributes to include in the output */
    extraAttributes?: {
        [uniqueId: string]: number;
    };
    /** Skip transforms specific quantized attributes */
    quantizedAttributes?: ('POSITION' | 'NORMAL' | 'COLOR' | 'TEX_COORD' | 'GENERIC')[];
    /** Skip transforms specific octahedron encoded  attributes */
    octahedronAttributes?: ('POSITION' | 'NORMAL' | 'COLOR' | 'TEX_COORD' | 'GENERIC')[];
};
export default class DracoParser {
    draco: Draco3D;
    decoder: Decoder;
    metadataQuerier: MetadataQuerier;
    constructor(draco: Draco3D);
    /**
     * Destroy draco resources
     */
    destroy(): void;
    /**
     * NOTE: caller must call `destroyGeometry` on the return value after using it
     * @param arrayBuffer
     * @param options
     */
    parseSync(arrayBuffer: ArrayBuffer, options?: DracoParseOptions): DracoMesh;
    /**
     * Extract
     * @param dracoGeometry
     * @param geometry_type
     * @param options
     * @returns
     */
    _getDracoLoaderData(dracoGeometry: Mesh | PointCloud, geometry_type: any, options: DracoParseOptions): DracoLoaderData;
    /**
     * Extract all draco provided information and metadata for each attribute
     * @param dracoGeometry
     * @param options
     * @returns
     */
    _getDracoAttributes(dracoGeometry: Mesh | PointCloud, options: DracoParseOptions): {
        [unique_id: number]: DracoAttribute;
    };
    /**
     * Get standard loaders.gl mesh category data
     * Extracts the geometry from draco
     * @param dracoGeometry
     * @param options
     */
    _getMeshData(dracoGeometry: Mesh | PointCloud, loaderData: DracoLoaderData, options: DracoParseOptions): MeshGeometry;
    _getMeshAttributes(loaderData: DracoLoaderData, dracoGeometry: Mesh | PointCloud, options: DracoParseOptions): {
        [attributeName: string]: MeshAttribute;
    };
    /**
     * For meshes, we need indices to define the faces.
     * @param dracoGeometry
     */
    _getTriangleListIndices(dracoGeometry: Mesh): Uint32Array;
    /**
     * For meshes, we need indices to define the faces.
     * @param dracoGeometry
     */
    _getTriangleStripIndices(dracoGeometry: Mesh): Int32Array;
    /**
     *
     * @param dracoGeometry
     * @param dracoAttribute
     * @param attributeName
     */
    _getAttributeValues(dracoGeometry: Mesh | PointCloud, attribute: DracoAttribute): {
        value: TypedArray;
        size: number;
    } | null;
    /**
     * DRACO does not store attribute names - We need to deduce an attribute name
     * for each attribute
    _getAttributeNames(
      dracoGeometry: Mesh | PointCloud,
      options: DracoParseOptions
    ): {[unique_id: number]: string} {
      const attributeNames: {[unique_id: number]: string} = {};
      for (let attributeId = 0; attributeId < dracoGeometry.num_attributes(); attributeId++) {
        const dracoAttribute = this.decoder.GetAttribute(dracoGeometry, attributeId);
        const attributeName = this._deduceAttributeName(dracoAttribute, options);
        attributeNames[attributeName] = attributeName;
      }
      return attributeNames;
    }
     */
    /**
     * Deduce an attribute name.
     * @note DRACO does not save attribute names, just general type (POSITION, COLOR)
     * to help optimize compression. We generate GLTF compatible names for the Draco-recognized
     * types
     * @param attributeData
     */
    _deduceAttributeName(attribute: DracoAttribute, options: DracoParseOptions): string;
    /** Get top level metadata */
    _getTopLevelMetadata(dracoGeometry: Mesh | PointCloud): {
        [entry: string]: DracoMetadataEntry;
    };
    /** Get per attribute metadata */
    _getAttributeMetadata(dracoGeometry: Mesh | PointCloud, attributeId: number): {
        [entry: string]: DracoMetadataEntry;
    };
    /**
     * Extract metadata field values
     * @param dracoMetadata
     * @returns
     */
    _getDracoMetadata(dracoMetadata: Metadata): {
        [entry: string]: DracoMetadataEntry;
    };
    /**
     * Extracts possible values for one metadata entry by name
     * @param dracoMetadata
     * @param entryName
     */
    _getDracoMetadataField(dracoMetadata: Metadata, entryName: string): DracoMetadataEntry;
    /** Skip transforms for specific attribute types */
    _disableAttributeTransforms(options: DracoParseOptions): void;
    /**
     * Extract (and apply?) Position Transform
     * @todo not used
     */
    _getQuantizationTransform(dracoAttribute: PointAttribute, options: DracoParseOptions): DracoQuantizationTransform | null;
    _getOctahedronTransform(dracoAttribute: PointAttribute, options: DracoParseOptions): DracoOctahedronTransform | null;
}
//# sourceMappingURL=draco-parser.d.ts.map