-
Notifications
You must be signed in to change notification settings - Fork 0
/
mesh_renderer.go
107 lines (79 loc) · 2.96 KB
/
mesh_renderer.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
package main
import (
"log"
n "github.com/lachee/noodle"
)
type meshRenderer struct {
shader *n.Shader
vertexBuffer n.WebGLBuffer
indexBuffer n.WebGLBuffer
previousMesh *mesh
uModelMatrixLoc n.WebGLUniformLocation
uViewMatrixLoc n.WebGLUniformLocation
uProjectionMatrixLoc n.WebGLUniformLocation
projectionMatrix Matrix
cameraMatrix Matrix
}
//newMeshRenderer creates the renderer and sets up the buffers
func newMeshRenderer() *meshRenderer {
mr := &meshRenderer{}
//Can be combined, see the UI Renderer as an example
mr.vertexBuffer = n.GL.CreateBuffer()
mr.indexBuffer = n.GL.CreateBuffer()
//Create the shader
shader, err := n.LoadShaderFromURL("resources/shader/mesh.vert", "/resources/shader/mesh.frag")
if err != nil {
log.Fatalln("Failed to load shader. ", err)
}
mr.shader = shader
mr.shader.BindVertexData("position", n.GlArrayBuffer, mr.vertexBuffer, 3, n.GlFloat, false, 0, 0)
mr.uProjectionMatrixLoc = mr.shader.GetUniformLocation("uProj")
mr.uViewMatrixLoc = mr.shader.GetUniformLocation("uView")
mr.uModelMatrixLoc = mr.shader.GetUniformLocation("uModel")
mr.shader.Use()
//Setup initial camera
mr.projectionMatrix = n.NewMatrixPerspective(45, float32(n.GL.Width())/float32(n.GL.Height()), 1, 100.0)
//mr.cameraMatrix = n.NewMatrixTranslate(Vector3{10, -1, 0})
//p := Vector3{-10, 10, 0}
//q := n.NewQuaternionLookAt(p, Vector3{0, 0, 0}, Vector3{0, 1, 0})
//mr.cameraMatrix = n.NewMatrixTranslate(p).Multiply(n.NewMatrixRotation(q))
mr.cameraMatrix = n.NewMatrixTranslate(Vector3{0, 0, 0})
log.Println(mr.cameraMatrix)
//mr.cameraMatrix = mr.cameraMatrix.Multiply(n.NewMatrixLookAt(Vector3{20.0, 20.0, 20.0}, Vector3{0, 0, 0}, Vector3{0, 1, 0}))
//log.Println(mr.cameraMatrix)
//mr.cameraMatrix = n.NewMatrixRotation(n.NewQuaternionAxis(n.PI/3, Vector3{1, 0, 0})).Multiply(n.NewMatrixTranslate(Vector3{0, 20, -20}))
return mr
}
//begin prepares the renderer
func (mr *meshRenderer) begin() {
//Clear the scene
n.GL.ClearDepth(1)
n.GL.DepthFunc(n.GlLEqual)
//Clear
n.GL.Enable(n.GlDepthTest)
n.GL.Clear(n.GlColorBufferBit | n.GlDepthBufferBit)
//Use SHader
mr.shader.Use()
//Update the camera
n.GL.UniformMatrix4fv(mr.uProjectionMatrixLoc, mr.projectionMatrix)
n.GL.UniformMatrix4fv(mr.uViewMatrixLoc, mr.cameraMatrix)
}
//end flushes the renderer
func (mr *meshRenderer) end() {
mr.previousMesh = nil
}
//draw a particular mesh to the screen
func (mr *meshRenderer) draw(mesh *mesh, modelMatrix Matrix) {
//New Mesh, Who Dis?
if mr.previousMesh != mesh {
mr.previousMesh = mesh
n.GL.BindBuffer(n.GlArrayBuffer, mr.vertexBuffer)
n.GL.BufferData(n.GlArrayBuffer, mr.previousMesh.verts, n.GlStaticDraw)
n.GL.BindBuffer(n.GlElementArrayBuffer, mr.indexBuffer)
n.GL.BufferData(n.GlElementArrayBuffer, mr.previousMesh.tris, n.GlStaticDraw)
}
//Set the shader deets
n.GL.UniformMatrix4fv(mr.uModelMatrixLoc, modelMatrix)
//Render
n.GL.DrawElements(n.GlLines, len(mr.previousMesh.tris), n.GlUnsignedShort, 0)
}