# Geometry

#### new Cesium.Geometry(options)
Core/Geometry.js 67

A geometry representation with attributes forming vertices and optional index data defining primitives. Geometries and an `Appearance`, which describes the shading, can be assigned to a `Primitive` for visualization. A `Primitive` can be created from many heterogeneous - in many cases - geometries for performance.

Geometries can be transformed and optimized using functions in `GeometryPipeline`.

Name | Type | Description
--- | --- | ---
`options` | Object | Object with the following properties:
Name | Type | Default | Description
--- | --- | --- | ---
`attributes` | GeometryAttributes |  | Attributes, which make up the geometry's vertices.
`primitiveType` | PrimitiveType | `PrimitiveType.TRIANGLES` | optional The type of primitives in the geometry.
`indices` | Uint16Array | Uint32Array |  | optional Optional index data that determines the primitives in the geometry.
`boundingSphere` | BoundingSphere |  | optional An optional bounding sphere that fully enclosed the geometry.

##### Example:

    // Create geometry with a position attribute and indexed lines.
    var positions = new Float64Array([
      0.0, 0.0, 0.0,
      7500000.0, 0.0, 0.0,
      0.0, 7500000.0, 0.0
    ]);

    var geometry = new Cesium.Geometry({
      attributes : {
        position : new Cesium.GeometryAttribute({
          componentDatatype : Cesium.ComponentDatatype.DOUBLE,
          componentsPerAttribute : 3,
          values : positions
        })
      },
      indices : new Uint16Array([0, 1, 1, 2, 2, 0]),
      primitiveType : Cesium.PrimitiveType.LINES,
      boundingSphere : Cesium.BoundingSphere.fromVertices(positions)
    });

##### Demo:

- Geometry and Appearances Demo

##### See:

- PolygonGeometry
- RectangleGeometry
- EllipseGeometry
- CircleGeometry
- WallGeometry
- SimplePolylineGeometry
- BoxGeometry
- EllipsoidGeometry

### Members

#### attributes : GeometryAttributes
Core/Geometry.js 120

Attributes, which make up the geometry's vertices. Each property in this object corresponds to a `GeometryAttribute` containing the attribute's data.

Attributes are always stored non-interleaved in a Geometry.

There are reserved attribute names with well-known semantics. The following attributes are created by a Geometry (depending on the provided `VertexFormat`.

- `position` - 3D vertex position. 64-bit floating-point (for precision). 3 components per attribute. See `VertexFormat#position`.
- `normal` - Normal (normalized), commonly used for lighting. 32-bit floating-point. 3 components per attribute. See `VertexFormat#normal`.
- `st` - 2D texture coordinate. 32-bit floating-point. 2 components per attribute. See `VertexFormat#st`.
- `bitangent` - Bitangent (normalized), used for tangent-space effects like bump mapping. 32-bit floating-point. 3 components per attribute. See `VertexFormat#bitangent`.
- `tangent` - Tangent (normalized), used for tangent-space effects like bump mapping. 32-bit floating-point. 3 components per attribute. See `VertexFormat#tangent`.

The following attribute names are generally not created by a Geometry, but are added to a Geometry by a `Primitive` or `GeometryPipeline` functions to prepare the geometry for rendering.

- `position3DHigh` - High 32 bits for encoded 64-bit position computed with `GeometryPipeline.encodeAttribute`. 32-bit floating-point. 4 components per attribute.
- `position3DLow` - Low 32 bits for encoded 64-bit position computed with `GeometryPipeline.encodeAttribute`. 32-bit floating-point. 4 components per attribute.
- `position3DHigh` - High 32 bits for encoded 64-bit 2D (Columbus view) position computed with `GeometryPipeline.encodeAttribute`. 32-bit floating-point. 4 components per attribute.
- `position2DLow` - Low 32 bits for encoded 64-bit 2D (Columbus view) position computed with `GeometryPipeline.encodeAttribute`. 32-bit floating-point. 4 components per attribute.
- `color` - RGBA color (normalized) usually from `GeometryInstance#color`. 32-bit floating-point. 4 components per attribute.
- `pickColor` - RGBA color used for picking. 32-bit floating-point. 4 components per attribute.

Default Value: `undefined`

##### Example:

    geometry.attributes.position = new Cesium.GeometryAttribute({
      componentDatatype : Cesium.ComponentDatatype.FLOAT,
      componentsPerAttribute : 3,
      values : new Float32Array(0)
    });

##### See:

- GeometryAttribute
- VertexFormat

#### boundingSphere : BoundingSphere
Core/Geometry.js 150

An optional bounding sphere that fully encloses the geometry. This is commonly used for culling.

Default Value: `undefined`

#### indices : Array
Core/Geometry.js 130

Optional index data that - along with `Geometry#primitiveType` - determines the primitives in the geometry.

Default Value: `undefined`

#### primitiveType : PrimitiveType
Core/Geometry.js 140

The type of primitives in the geometry. This is most often `PrimitiveType.TRIANGLES`, but can varying based on the specific geometry.

Default Value: `undefined`

### Methods

#### static Cesium.Geometry.computeNumberOfVertices(geometry) → Number
Core/Geometry.js 179

Computes the number of vertices in a geometry. The runtime is linear with respect to the number of attributes in a vertex, not the number of vertices.

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

##### Returns:

The number of vertices in the geometry.

##### Example:

    var numVertices = Cesium.Geometry.computeNumberOfVertices(geometry);