119 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			119 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 
								 | 
							
								package cube
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import (
							 | 
						||
| 
								 | 
							
									"zworld/engine/object"
							 | 
						||
| 
								 | 
							
									"zworld/engine/object/mesh"
							 | 
						||
| 
								 | 
							
									"zworld/engine/renderapi/material"
							 | 
						||
| 
								 | 
							
									"zworld/engine/renderapi/texture"
							 | 
						||
| 
								 | 
							
									"zworld/engine/renderapi/vertex"
							 | 
						||
| 
								 | 
							
									"zworld/plugins/math/vec2"
							 | 
						||
| 
								 | 
							
									"zworld/plugins/math/vec3"
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								type Object struct {
							 | 
						||
| 
								 | 
							
									object.Object
							 | 
						||
| 
								 | 
							
									*Mesh
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func NewObject(args Args) *Object {
							 | 
						||
| 
								 | 
							
									return object.New("Cube", &Object{
							 | 
						||
| 
								 | 
							
										Mesh: New(args),
							 | 
						||
| 
								 | 
							
									})
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Mesh is a vertex colored cube mesh
							 | 
						||
| 
								 | 
							
								type Mesh struct {
							 | 
						||
| 
								 | 
							
									*mesh.Static
							 | 
						||
| 
								 | 
							
									Args
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								type Args struct {
							 | 
						||
| 
								 | 
							
									Mat  *material.Def
							 | 
						||
| 
								 | 
							
									Size float32
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// New creates a vertex colored cube mesh with a given size
							 | 
						||
| 
								 | 
							
								func New(args Args) *Mesh {
							 | 
						||
| 
								 | 
							
									if args.Mat == nil {
							 | 
						||
| 
								 | 
							
										args.Mat = material.ColoredForward()
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									cube := object.NewComponent(&Mesh{
							 | 
						||
| 
								 | 
							
										Static: mesh.New(args.Mat),
							 | 
						||
| 
								 | 
							
										Args:   args,
							 | 
						||
| 
								 | 
							
									})
							 | 
						||
| 
								 | 
							
									cube.SetTexture(texture.Diffuse, texture.Checker)
							 | 
						||
| 
								 | 
							
									cube.generate()
							 | 
						||
| 
								 | 
							
									return cube
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func (c *Mesh) generate() {
							 | 
						||
| 
								 | 
							
									s := c.Size / 2
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									topLeft := vec2.New(0, 0)
							 | 
						||
| 
								 | 
							
									topRight := vec2.New(1, 0)
							 | 
						||
| 
								 | 
							
									bottomLeft := vec2.New(0, 1)
							 | 
						||
| 
								 | 
							
									bottomRight := vec2.New(1, 1)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									vertices := []vertex.T{
							 | 
						||
| 
								 | 
							
										// X+
							 | 
						||
| 
								 | 
							
										{P: vec3.New(s, -s, s), N: vec3.UnitX, T: bottomRight}, // 0
							 | 
						||
| 
								 | 
							
										{P: vec3.New(s, -s, -s), N: vec3.UnitX, T: bottomLeft}, // 1
							 | 
						||
| 
								 | 
							
										{P: vec3.New(s, s, -s), N: vec3.UnitX, T: topLeft},     // 2
							 | 
						||
| 
								 | 
							
										{P: vec3.New(s, s, s), N: vec3.UnitX, T: topRight},     // 3
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										// X-
							 | 
						||
| 
								 | 
							
										{P: vec3.New(-s, -s, -s), N: vec3.UnitXN, T: bottomRight}, // 4
							 | 
						||
| 
								 | 
							
										{P: vec3.New(-s, -s, s), N: vec3.UnitXN, T: bottomLeft},   // 5
							 | 
						||
| 
								 | 
							
										{P: vec3.New(-s, s, s), N: vec3.UnitXN, T: topLeft},       // 6
							 | 
						||
| 
								 | 
							
										{P: vec3.New(-s, s, -s), N: vec3.UnitXN, T: topRight},     // 7
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										// Y+
							 | 
						||
| 
								 | 
							
										{P: vec3.New(s, s, -s), N: vec3.UnitY, T: bottomRight}, // 8
							 | 
						||
| 
								 | 
							
										{P: vec3.New(-s, s, -s), N: vec3.UnitY, T: bottomLeft}, // 9
							 | 
						||
| 
								 | 
							
										{P: vec3.New(-s, s, s), N: vec3.UnitY, T: topLeft},     // 10
							 | 
						||
| 
								 | 
							
										{P: vec3.New(s, s, s), N: vec3.UnitY, T: topRight},     // 11
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										// Y-
							 | 
						||
| 
								 | 
							
										{P: vec3.New(-s, -s, -s), N: vec3.UnitYN, T: bottomRight}, // 12
							 | 
						||
| 
								 | 
							
										{P: vec3.New(s, -s, -s), N: vec3.UnitYN, T: bottomLeft},   // 13
							 | 
						||
| 
								 | 
							
										{P: vec3.New(s, -s, s), N: vec3.UnitYN, T: topLeft},       // 14
							 | 
						||
| 
								 | 
							
										{P: vec3.New(-s, -s, s), N: vec3.UnitYN, T: topRight},     // 15
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										// Z+
							 | 
						||
| 
								 | 
							
										{P: vec3.New(-s, -s, s), N: vec3.UnitZ, T: bottomRight}, // 16
							 | 
						||
| 
								 | 
							
										{P: vec3.New(s, -s, s), N: vec3.UnitZ, T: bottomLeft},   // 17
							 | 
						||
| 
								 | 
							
										{P: vec3.New(s, s, s), N: vec3.UnitZ, T: topLeft},       // 18
							 | 
						||
| 
								 | 
							
										{P: vec3.New(-s, s, s), N: vec3.UnitZ, T: topRight},     // 19
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										// Z-
							 | 
						||
| 
								 | 
							
										{P: vec3.New(s, -s, -s), N: vec3.UnitZN, T: bottomRight}, // 20
							 | 
						||
| 
								 | 
							
										{P: vec3.New(-s, -s, -s), N: vec3.UnitZN, T: bottomLeft}, // 21
							 | 
						||
| 
								 | 
							
										{P: vec3.New(-s, s, -s), N: vec3.UnitZN, T: topLeft},     // 22
							 | 
						||
| 
								 | 
							
										{P: vec3.New(s, s, -s), N: vec3.UnitZN, T: topRight},     // 23
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									indices := []uint16{
							 | 
						||
| 
								 | 
							
										0, 1, 2,
							 | 
						||
| 
								 | 
							
										0, 2, 3,
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										4, 5, 6,
							 | 
						||
| 
								 | 
							
										4, 6, 7,
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										8, 9, 10,
							 | 
						||
| 
								 | 
							
										8, 10, 11,
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										12, 13, 14,
							 | 
						||
| 
								 | 
							
										12, 14, 15,
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										16, 17, 18,
							 | 
						||
| 
								 | 
							
										16, 18, 19,
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										20, 21, 22,
							 | 
						||
| 
								 | 
							
										20, 22, 23,
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									key := object.Key("cube", c)
							 | 
						||
| 
								 | 
							
									mesh := vertex.NewTriangles(key, vertices, indices)
							 | 
						||
| 
								 | 
							
									c.VertexData.Set(mesh)
							 | 
						||
| 
								 | 
							
								}
							 |