# GeometryPipeline

#### GeometryPipeline()
Core/GeometryPipeline.js 65

  Content pipeline functions for geometries.

  ##### See:

  - Geometry

### Methods

#### staticCesium.GeometryPipeline.compressVertices(geometry) → Geometry
Core/GeometryPipeline.js 1354

  Compresses and packs geometry normal attribute values to save memory.

  Name | Type | Description
  --- | --- | ---
  `geometry` | Geometry | The geometry to modify.

  ##### Returns:

  The modified `geometry` argument, with its normals compressed and packed.

  ##### Example:

      geometry = Cesium.GeometryPipeline.compressVertices(geometry);

#### staticCesium.GeometryPipeline.computeBinormalAndTangent(geometry) → Geometry
Core/GeometryPipeline.js 1216

  Computes per-vertex binormals and tangents for a geometry containing `TRIANGLES`. The result is new `binormal` and `tangent` attributes added to the geometry. This assumes a counter-clockwise winding order.

  Based on Computing Tangent Space Basis Vectors for an Arbitrary Mesh by Eric Lengyel.

  Name | Type | Description
  --- | --- | ---
  `geometry` | Geometry | The geometry to modify.

  ##### Returns:

  The modified `geometry` argument with the computed `binormal` and `tangent` attributes.

  ##### Throws:

  - DeveloperError : geometry.indices length must be greater than 0 and be a multiple of 3.
  - DeveloperError : geometry.primitiveType must be `PrimitiveType.TRIANGLES`.

  ##### Example:

      Cesium.GeometryPipeline.computeBinormalAndTangent(geometry);

#### staticCesium.GeometryPipeline.computeNormal(geometry) → Geometry
Core/GeometryPipeline.js 1073

  Computes per-vertex normals for a geometry containing `TRIANGLES` by averaging the normals of all triangles incident to the vertex. The result is a new `normal` attribute added to the geometry. This assumes a counter-clockwise winding order.

  Name | Type | Description
  --- | --- | ---
  `geometry` | Geometry | The geometry to modify.

  ##### Returns:

  The modified `geometry` argument with the computed `normal` attribute.

  ##### Throws:

  - DeveloperError : geometry.indices length must be greater than 0 and be a multiple of 3.
  - DeveloperError : geometry.primitiveType must be `PrimitiveType.TRIANGLES`.

  ##### Example:

      Cesium.GeometryPipeline.computeNormal(geometry);

#### staticCesium.GeometryPipeline.createAttributeLocations(geometry) → Object
Core/GeometryPipeline.js 256

  Creates an object that maps attribute names to unique locations (indices) for matching vertex attributes and shader programs.

  Name | Type | Description
  --- | --- | ---
  `geometry` | Geometry | The geometry, which is not modified, to create the object for.

  ##### Returns:

  An object with attribute name / index pairs.

  ##### Example:

      var attributeLocations = Cesium.GeometryPipeline.createAttributeLocations(geometry);
      // Example output
      // {
      //   'position' : 0,
      //   'normal' : 1
      // }

#### staticCesium.GeometryPipeline.createLineSegmentsForVectors(geometry, attributeName, length) → Geometry
Core/GeometryPipeline.js 188

  Creates a new `Geometry` with `LINES` representing the provided attribute (`attributeName`) for the provided geometry. This is used to visualize vector attributes like normals, binormals, and tangents.

  Name | Type | Default | Description
  --- | --- | --- | ---
  `geometry` | Geometry |  | The `Geometry` instance with the attribute.
  `attributeName` | String | `'normal'` | optional The name of the attribute.
  `length` | Number | `10000.0` | optional The length of each line segment in meters. This can be negative to point the vector in the opposite direction.

  ##### Returns:

  A new `Geometry` instance with line segments for the vector.

  ##### Throws:

  - DeveloperError : geometry.attributes must have an attribute with the same name as the attributeName parameter.

  ##### Example:

      var geometry = Cesium.GeometryPipeline.createLineSegmentsForVectors(instance.geometry, 'binormal', 100000.0);

#### staticCesium.GeometryPipeline.encodeAttribute(geometry, attributeName, attributeHighName, attributeLowName) → Geometry
Core/GeometryPipeline.js 687

  Encodes floating-point geometry attribute values as two separate attributes to improve rendering precision.

  This is commonly used to create high-precision position vertex attributes.

  Name | Type | Description
  --- | --- | ---
  `geometry` | Geometry | The geometry to modify.
  `attributeName` | String | The name of the attribute.
  `attributeHighName` | String | The name of the attribute for the encoded high bits.
  `attributeLowName` | String | The name of the attribute for the encoded low bits.

  ##### Returns:

  The modified `geometry` argument, with its encoded attribute.

  ##### Throws:

  - DeveloperError : geometry must have attribute matching the attributeName argument.
  - DeveloperError : The attribute componentDatatype must be ComponentDatatype.DOUBLE.

  ##### Example:

      geometry = Cesium.GeometryPipeline.encodeAttribute(geometry, 'position3D', 'position3DHigh', 'position3DLow');

#### staticCesium.GeometryPipeline.fitToUnsignedShortIndices(geometry) → Array.<Geometry>
Core/GeometryPipeline.js 496

  Splits a geometry into multiple geometries, if necessary, to ensure that indices in the `indices` fit into unsigned shorts. This is used to meet the WebGL requirements when unsigned int indices are not supported.

  If the geometry does not have any `indices`, this function has no effect.

  Name | Type | Description
  --- | --- | ---
  `geometry` | Geometry | The geometry to be split into multiple geometries.

  ##### Returns:

  An array of geometries, each with indices that fit into unsigned shorts.

  ##### Throws:

  - DeveloperError : geometry.primitiveType must equal to PrimitiveType.TRIANGLES, PrimitiveType.LINES, or PrimitiveType.POINTS
  - DeveloperError : All geometry attribute lists must have the same number of attributes.

  ##### Example:

      var geometries = Cesium.GeometryPipeline.fitToUnsignedShortIndices(geometry);

#### staticCesium.GeometryPipeline.projectTo2D(geometry, attributeName, attributeName3D, attributeName2D, projection) → Geometry
Core/GeometryPipeline.js 603

  Projects a geometry's 3D `position` attribute to 2D, replacing the `position` attribute with separate `position3D` and `position2D` attributes.

  If the geometry does not have a `position`, this function has no effect.

  Name | Type | Default | Description
  --- | --- | --- | ---
  `geometry` | Geometry |  | The geometry to modify.
  `attributeName` | String |  | The name of the attribute.
  `attributeName3D` | String |  | The name of the attribute in 3D.
  `attributeName2D` | String |  | The name of the attribute in 2D.
  `projection` | Object | `new GeographicProjection()` | optional The projection to use.

  ##### Returns:

  The modified `geometry` argument with `position3D` and `position2D` attributes.

  ##### Throws:

  - DeveloperError : geometry must have attribute matching the attributeName argument.
  - DeveloperError : The attribute componentDatatype must be ComponentDatatype.DOUBLE.
  - DeveloperError : Could not project a point to 2D.

  ##### Example:

      geometry = Cesium.GeometryPipeline.projectTo2D(geometry, 'position', 'position3D', 'position2D');

#### staticCesium.GeometryPipeline.reorderForPostVertexCache(geometry, cacheCapacity) → Geometry
Core/GeometryPipeline.js 417

  Reorders a geometry's `indices` to achieve better performance from the GPU's post vertex-shader cache by using the Tipsify algorithm. If the geometry `primitiveType` is not `TRIANGLES` or the geometry does not have an `indices`, this function has no effect.

  Name | Type | Default | Description
  --- | --- | --- | ---
  `geometry` | Geometry |  | The geometry to modify.
  `cacheCapacity` | Number | `24` | optional The number of vertices that can be held in the GPU's vertex cache.

  ##### Returns:

  The modified `geometry` argument, with its indices reordered for the post-vertex-shader cache.

  ##### Throws:

  - DeveloperError : cacheCapacity must be greater than two.

  ##### Example:

      geometry = Cesium.GeometryPipeline.reorderForPostVertexCache(geometry);

  ##### See:

  - GeometryPipeline.reorderForPreVertexCache
  - Fast Triangle Reordering for Vertex Locality and Reduced Overdraw by Sander, Nehab, and Barczak

#### staticCesium.GeometryPipeline.reorderForPreVertexCache(geometry) → Geometry
Core/GeometryPipeline.js 328

  Reorders a geometry's attributes and `indices` to achieve better performance from the GPU's pre-vertex-shader cache.

  Name | Type | Description
  --- | --- | ---
  `geometry` | Geometry | The geometry to modify.

  ##### Returns:

  The modified `geometry` argument, with its attributes and indices reordered for the GPU's pre-vertex-shader cache.

  ##### Throws:

  - DeveloperError : Each attribute array in geometry.attributes must have the same number of attributes.

  ##### Example:

      geometry = Cesium.GeometryPipeline.reorderForPreVertexCache(geometry);

  ##### See:

  - GeometryPipeline.reorderForPostVertexCache

#### staticCesium.GeometryPipeline.toWireframe(geometry) → Geometry
Core/GeometryPipeline.js 144

  Converts a geometry's triangle indices to line indices. If the geometry has an `indices` and its `primitiveType` is `TRIANGLES`, `TRIANGLE_STRIP`, `TRIANGLE_FAN`, it is converted to `LINES`; otherwise, the geometry is not changed.

  This is commonly used to create a wireframe geometry for visual debugging.

  Name | Type | Description
  --- | --- | ---
  `geometry` | Geometry | The geometry to modify.

  ##### Returns:

  The modified `geometry` argument, with its triangle indices converted to lines.

  ##### Throws:

  - DeveloperError : geometry.primitiveType must be TRIANGLES, TRIANGLE_STRIP, or TRIANGLE_FAN.

  ##### Example:

      geometry = Cesium.GeometryPipeline.toWireframe(geometry);

#### staticCesium.GeometryPipeline.transformToWorldCoordinates(instance) → GeometryInstance
Core/GeometryPipeline.js 780

  Transforms a geometry instance to world coordinates. This changes the instance's `modelMatrix` to `Matrix4.IDENTITY` and transforms the following attributes if they are present: `position`, `normal`, `binormal`, and `tangent`.

  Name | Type | Description
  --- | --- | ---
  `instance` | GeometryInstance | The geometry instance to modify.

  ##### Returns:

  The modified `instance` argument, with its attributes transforms to world coordinates.

  ##### Example:

      Cesium.GeometryPipeline.transformToWorldCoordinates(instance);