UNPKG

@arcgis/core

Version:

ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API

177 lines (174 loc) 7.85 kB
import type MeshMaterial from "./MeshMaterial.js"; import type MeshMaterialMetallicRoughness from "./MeshMaterialMetallicRoughness.js"; import type { ClonableMixin } from "../../core/Clonable.js"; import type { JSONSupport } from "../../core/JSONSupport.js"; import type { MeshMaterialProperties } from "./MeshMaterial.js"; import type { MeshMaterialMetallicRoughnessProperties } from "./MeshMaterialMetallicRoughness.js"; export interface MeshComponentProperties extends Partial<Pick<MeshComponent, "name" | "shading">> { /** * A flat array of indices that refer to vertices in the * [Mesh.vertexAttributes](https://developers.arcgis.com/javascript/latest/references/core/geometry/Mesh/#vertexAttributes) of the * mesh to which the component belongs. Each triple of indices defines a triangle * to render (i.e. the faces array must always have a length that is a multiple of 3). * Note that the indices refer to **vertices** and not to the index of the first coordinate * of a vertex in the [vertexAttributes.position](https://developers.arcgis.com/javascript/latest/references/core/geometry/Mesh/#vertexAttributes) * array. * * If faces is `null`, then all the vertices in the mesh will be rendered * as triangles for this component. * * @example * let mesh = new Mesh({ * vertexAttributes: { * position: [ * 2.336006, 48.860818, 0, * 2.336172, 48.861114, 0, * 2.335724, 48.861229, 0, * 2.335563, 48.860922, 0 * ] * }, * // Create two components so we can have separate materials * // for the two triangles that we want to render. * components: [ * { * faces: [0, 1, 2], * material: { * color: "red" * } * }, * { * faces: [0, 2, 3], * material: { * color: "green" * } * } * ] * }); */ faces?: Uint16Array | Uint32Array | null; /** The material determines how the component is visualized. */ material?: MeshMaterialProperties | MeshMaterialMetallicRoughnessProperties | null; } /** * The MeshComponent class is used to apply one or more materials to * a single [Mesh](https://developers.arcgis.com/javascript/latest/references/core/geometry/Mesh/). The [faces](https://developers.arcgis.com/javascript/latest/references/core/geometry/support/MeshComponent/#faces) property * is a flat array of indices in the mesh * [Mesh.vertexAttributes](https://developers.arcgis.com/javascript/latest/references/core/geometry/Mesh/#vertexAttributes) and defines the region * of vertices in the mesh on which to apply the material. * Each triple of values in the flat array of indices specifies a triangle to be rendered. * * To define the material for the whole mesh, [faces](https://developers.arcgis.com/javascript/latest/references/core/geometry/support/MeshComponent/#faces) may be set to `null`, * which indicates that all the vertices defined for the mesh should be rendered * as consecutive triangles. * * A mesh component defines a [material](https://developers.arcgis.com/javascript/latest/references/core/geometry/support/MeshComponent/#material) that determines how the region * of triangles is colored. This mesh color can either be a single value or * an image that is mapped to the vertices by means of the uv coordinates specified * in the mesh [Mesh.vertexAttributes](https://developers.arcgis.com/javascript/latest/references/core/geometry/Mesh/#vertexAttributes). * The [shading](https://developers.arcgis.com/javascript/latest/references/core/geometry/support/MeshComponent/#shading) specifies the type of normals that are used to calculate how * lighting affects mesh coloring. * * Mesh components can be added to the [Mesh.components[]](https://developers.arcgis.com/javascript/latest/references/core/geometry/Mesh/#components) * array. * * ```js * let component1 = new MeshComponent({ * // Indices refer to vertices specified in the mesh vertexAttributes. * // Here we refer to 2 triangles composed of the first 6 vertices of the mesh. * faces: [0, 1, 2, 3, 4, 5], * * material: { * color: "green" * } * }); * * let component2 = new MeshComponent({ * faces: [6, 7, 8, 9, 10, 11], * * material: { * color: "red" * }, * * shading: "smooth" * }); * * let mesh = new Mesh({ * // ... specify vertex attributes * * components: [component1, component2] * }); * ``` * * @since 4.7 * @see [Mesh](https://developers.arcgis.com/javascript/latest/references/core/geometry/Mesh/) */ export default class MeshComponent extends MeshComponentSuperclass { constructor(properties?: MeshComponentProperties); /** * A flat array of indices that refer to vertices in the * [Mesh.vertexAttributes](https://developers.arcgis.com/javascript/latest/references/core/geometry/Mesh/#vertexAttributes) of the * mesh to which the component belongs. Each triple of indices defines a triangle * to render (i.e. the faces array must always have a length that is a multiple of 3). * Note that the indices refer to **vertices** and not to the index of the first coordinate * of a vertex in the [vertexAttributes.position](https://developers.arcgis.com/javascript/latest/references/core/geometry/Mesh/#vertexAttributes) * array. * * If faces is `null`, then all the vertices in the mesh will be rendered * as triangles for this component. * * @example * let mesh = new Mesh({ * vertexAttributes: { * position: [ * 2.336006, 48.860818, 0, * 2.336172, 48.861114, 0, * 2.335724, 48.861229, 0, * 2.335563, 48.860922, 0 * ] * }, * // Create two components so we can have separate materials * // for the two triangles that we want to render. * components: [ * { * faces: [0, 1, 2], * material: { * color: "red" * } * }, * { * faces: [0, 2, 3], * material: { * color: "green" * } * } * ] * }); */ get faces(): Uint32Array<ArrayBuffer> | null | undefined; set faces(value: Uint16Array | Uint32Array | null | undefined); /** The material determines how the component is visualized. */ get material(): MeshMaterial | MeshMaterialMetallicRoughness | null | undefined; set material(value: MeshMaterialProperties | MeshMaterialMetallicRoughnessProperties | null | undefined); /** * Specifies a name of the component. The component name can be used to identify the component. Meshes created from * glTF will have components with names that correspond to mesh names from the glTF. * * @see [Mesh.createFromGLTF()](https://developers.arcgis.com/javascript/latest/references/core/geometry/Mesh/#createFromGLTF) */ accessor name: string | null | undefined; /** * Specifies the type of normals used for lighting. This determines whether the object * has a smooth or an angular appearance. The following shading types are supported: * * | Type | Description | * |------|-------------| * | source | Shading uses the normals as defined in the vertex attributes. If no normals are defined, then shading defaults back to `flat` | * | flat | Shading uses normals created per triangle face. This type of shading is good for objects with sharp edges such as boxes. | * | smooth | Shading uses per-vertex normals that average the normals of all the faces a vertex is a part of. This type of shading is good for meshes that approximate curved surfaces such as spheres. | * * @default "source" */ accessor shading: MeshComponentShading; } declare const MeshComponentSuperclass: typeof JSONSupport & typeof ClonableMixin export type MeshComponentShading = "source" | "flat" | "smooth";