# Geometry basics

# What is Geometry?

Geometry defines shape of a mesh. To render a mesh, Grimoire require `Geometry`

and `Material`

for each meshes.

All vertices in a geometry have `vertex attribute variables`

for each.

For example, if there was 3 vertices and constructing a triangle, 3 position parameters should be available for renderer.`vertex attribute variable`

is not only limited position. Each vertices can have different `normal`

or `texture coordinate`

(A coordinate used for attaching texture).

`Vertex attribute variables`

are not only element of a geometry. Geometry also should have index buffer.

Index buffer is defining how to connect each vertices.

The easist example is `wireframe`

of a mesh. Renderer should connect 3 points and create a surface when render a mesh as a solid. But, renderer should connect 2 points and create lines for rendering `wireframe`

.

(If you are really good graphics engineer, you might think that ‘it is not index buffer, just a topology’. Yes, it is correct.

But, in grimoire, “index buffer” is a buffer containing indices defining how to connect each vertices and topology.)

# Let’s use geometry.

`<MeshRenderer>`

component which is typically contained in `<mesh>`

node have `geometry`

attribute.

1 | <mesh geometry="cube" color="red"/> |

You can change shape of meshes by changing `geometry`

attribute.`geometry`

attribute can accept this 2 types of variable.

- name of geometry
- geometry instance (from javascript only)

## Understanding name of geometry

In tutorial, we didn’t care about what geometry is available and how to register a geometry.

Let’s register some geometries in this section.

1 | <goml> |

This example is defining a geometry named `sphere2`

. `sphere2`

is divided 10 by 10.And `mesh`

node refer the geometry.

`<geometry>`

node is register a geometry from construction script. In the example, `sphere2`

is generated by `sphere`

construction script with arguments `divVertical`

and `divHorizontal`

.

In grimoire, there are several geometry construction script already and some of them can accept some arguments to generate various shapes. All arguments should have default values.

This is a list of geometry construction scripts initially implemented.

### quad

A simple quad. Only have single surface. If you see this geometry from backward, this object is invisible(If and only culling are enabled).

This construction script is not receiving any arguments.

### cube

A simple cube.

This construction script is not receiving any arguments.

### sphere

A sphere.

**Arguments**

- divHorizontal(Number) ・・・ How many times should the sphere be divided in horizontal direction.(default:50)
- divVertical(Number) ・・・ How many times should the sphere be divided in vertical direction.(default:50)

### cylinder

A cylinder.

**Arguments**

- divide(Number)・・・How many times should the cylinder be divided in horizontal direction.(default:50)

### cone

A cone.

**Arguments**

- divide(Number)・・・How many times should the cylinder be divided in horizontal direction.(default:50)

### plane

A plane same as unity.

**Arguments**

- divide(Number)・・・Division count of plane(default:10)

## Default registered geometries

Several geometries are already instanciated and registered. Therefore, you didn’t need to use `geometry`

tag to use cube.

This is a list of geometries registered initially.

- quad
- cube
- sphere

If you need the geometries above, you don’t need to regieter. These are always registered in first initialization timing.

If you need to rewrite default sphere division parameters, you just need to add geometry tag to register a geometry named `sphere`

. If there was a geometry have same name, grimoire would just simply overwrite last one.

## Custom geometries

If you need to create a custom geometries. The easist way is using model file. Model file should contain geometry data and material data. Several file format are supported by grimoire plugins.

But, if you need to create construction script for geometry, grimoire also have great feature to support this needs.

To create your own geometry from program, please see `Custom geometry(WIP)`

for more details.