harfang3d/doc/doc/man.GeneratedTexturedCube.md

153 lines
4.9 KiB
Markdown
Raw Normal View History

2021-10-13 12:40:31 +00:00
.title Generated textured cube
The [Geometry] class contains the functions needed to generate meshes.
## Generated textured cube
To generate a textured cube using [Geometry] API, you need the following functions:
### Vertices
* [Geometry_AllocateVertex] : Set the number of vertices.
* [Geometry_SetVertex] : Set vertex coordinates.
### Polygons
* [Geometry_AllocatePolygon] : Set number of polygons.
* [Geometry_SetPolygon] : Set the number of vertices and the polygon material.
* [Geometry_AllocatePolygonBinding] : Allocate memory to store the geometry polygon binding table.
* [Geometry_SetPolygonBinding] : Set the polygon binding table.
### Normals
* [Geometry_AllocateVertexNormal] : Set the number of normals.
* [Geometry_SetVertexNormal] : Set normal coordinates.
### UVs
* [Geometry_AllocateUVChannels] : Set number of UVs.
* [Geometry_SetUV] : Set UV coordinates.
### Materials
* [Geometry_AllocateMaterialTable] : Set number of materials.
* [Geometry_SetMaterial] : Set material definition file path.
## Code example
### Vertices and polygons
```python
cube = hg.Geometry()
# Create vertex
s = hg.Vector3(1,1,1) # dimensions
cube.AllocateVertex(8)
ube.SetVertex(0, hg.Vector3(-s.x, -s.y, -s.z))
cube.SetVertex(1, hg.Vector3(-s.x, -s.y, s.z))
cube.SetVertex(2, hg.Vector3(-s.x, s.y, -s.z))
cube.SetVertex(3, hg.Vector3(-s.x, s.y, s.z))
cube.SetVertex(4, hg.Vector3(s.x, -s.y, -s.z))
cube.SetVertex(5, hg.Vector3(s.x, -s.y, s.z))
cube.SetVertex(6, hg.Vector3(s.x, s.y, -s.z))
cube.SetVertex(7, hg.Vector3(s.x, s.y, s.z))
# Create polygons
cube.AllocatePolygon(6)
cube.SetPolygon(0, 4, 0)
cube.SetPolygon(1, 4, 1)
cube.SetPolygon(2, 4, 2)
cube.SetPolygon(3, 4, 3)
cube.SetPolygon(4, 4, 4)
cube.SetPolygon(5, 4, 5)
# Polygons bindings
cube.AllocatePolygonBinding()
cube.SetPolygonBinding(0, hg.IntList([0, 2, 6, 4]))
cube.SetPolygonBinding(1, hg.IntList([4, 6, 7, 5]))
cube.SetPolygonBinding(2, hg.IntList([5, 7, 3, 1]))
cube.SetPolygonBinding(3, hg.IntList([1, 3, 2, 0]))
cube.SetPolygonBinding(4, hg.IntList([2, 3, 7, 6]))
cube.SetPolygonBinding(5, hg.IntList([4, 5, 1, 0]))
```
### Normals. Each vertex for each polygon has a normal. So, 6 polygons X 4 vertices = 24 normals
```python
# Normals
cube.AllocateVertexNormal(24)
cube.SetVertexNormal(0, hg.Vector3(0, 0, -1))
cube.SetVertexNormal(1, hg.Vector3(0, 0, -1))
cube.SetVertexNormal(2, hg.Vector3(0, 0, -1))
cube.SetVertexNormal(3, hg.Vector3(0, 0, -1))
cube.SetVertexNormal(4, hg.Vector3(1, 0, 0))
cube.SetVertexNormal(5, hg.Vector3(1, 0, 0))
cube.SetVertexNormal(6, hg.Vector3(1, 0, 0))
cube.SetVertexNormal(7, hg.Vector3(1, 0, 0))
cube.SetVertexNormal(8, hg.Vector3(0, 0, 1))
cube.SetVertexNormal(9, hg.Vector3(0, 0, 1))
cube.SetVertexNormal(10, hg.Vector3(0, 0, 1))
cube.SetVertexNormal(11, hg.Vector3(0, 0, 1))
cube.SetVertexNormal(12, hg.Vector3(-1, 0, 0))
cube.SetVertexNormal(13, hg.Vector3(-1, 0, 0))
cube.SetVertexNormal(14, hg.Vector3(-1, 0, 0))
cube.SetVertexNormal(15, hg.Vector3(-1, 0, 0))
cube.SetVertexNormal(16, hg.Vector3(0, 1, 0))
cube.SetVertexNormal(17, hg.Vector3(0, 1, 0))
cube.SetVertexNormal(18, hg.Vector3(0, 1, 0))
cube.SetVertexNormal(19, hg.Vector3(0, 1, 0))
cube.SetVertexNormal(20, hg.Vector3(0, -1, 0))
cube.SetVertexNormal(21, hg.Vector3(0, -1, 0))
cube.SetVertexNormal(22, hg.Vector3(0, -1, 0))
cube.SetVertexNormal(23, hg.Vector3(0, -1, 0))
```
### UVs and materials
```python
# Create UVs
cube.AllocateUVChannels(1, 24)
cube.SetUV(0, 0, hg.Vector2List([hg.Vector2(0, 0), hg.Vector2(0, 1), hg.Vector2(1, 1), hg.Vector2(1, 0)]))
cube.SetUV(0, 1, hg.Vector2List([hg.Vector2(0, 0), hg.Vector2(0, 1), hg.Vector2(1, 1), hg.Vector2(1, 0)]))
cube.SetUV(0, 2, hg.Vector2List([hg.Vector2(0, 0), hg.Vector2(0, 1), hg.Vector2(1, 1), hg.Vector2(1, 0)]))
cube.SetUV(0, 3, hg.Vector2List([hg.Vector2(0, 0), hg.Vector2(0, 1), hg.Vector2(1, 1), hg.Vector2(1, 0)]))
cube.SetUV(0, 4, hg.Vector2List([hg.Vector2(0, 0), hg.Vector2(0, 1), hg.Vector2(1, 1), hg.Vector2(1, 0)]))
cube.SetUV(0, 5, hg.Vector2List([hg.Vector2(0, 0), hg.Vector2(0, 1), hg.Vector2(1, 1), hg.Vector2(1, 0)]))
# Create materials
cube.AllocateMaterialTable(6)
cube.SetMaterial(0, "assets/materials/face1.mat")
cube.SetMaterial(1, "assets/materials/face2.mat")
cube.SetMaterial(2, "assets/materials/face3.mat")
cube.SetMaterial(3, "assets/materials/face4.mat")
cube.SetMaterial(4, "assets/materials/face5.mat")
cube.SetMaterial(5, "assets/materials/face6.mat")
```
### Validate Geometry and create Node
After having determined the geometry, it's possible to validate your structure. If all is ok, you can create [Object] and [Node].
```python
if cube.Validate():
geo = plus.GetRenderSystem().CreateGeometry(cube,False)
obj = hg.Object()
obj.SetGeometry(geo)
node = hg.Node()
node.SetName("generated_cube")
transform = hg.Transform(hg.Vector3(0,3,0))
node.AddComponent(transform)
node.AddComponent(obj)
scene.AddNode(node)
return node
```