-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathobject3d.go
131 lines (103 loc) · 2.82 KB
/
object3d.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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
package three
import (
"github.com/go-gl/gl"
"github.com/go-gl/mathgl/mgl32"
)
// Object3D described an object in 3D space.
type Object3D struct {
vertexBuffer gl.Buffer
uvBuffer gl.Buffer
normalBuffer gl.Buffer
index *Index
transform *Transform
}
// NewObject3D returns a new Object3D. It initializes the transform
// of the object.
func NewObject3D() Object3D {
o := Object3D{
transform: NewTransform(),
}
return o
}
// Index returns the FBO index.
func (o *Object3D) Index() *Index {
return o.index
}
// Transform returns the transform object (translation, rotation, scale) for this object.
func (o *Object3D) Transform() *Transform {
return o.transform
}
// UVBuffer returns the buffer object for this objects uvs.
func (o *Object3D) UVBuffer() gl.Buffer {
return o.uvBuffer
}
// VertexBuffer returns the buffer object for this objects vertices.
func (o *Object3D) VertexBuffer() gl.Buffer {
return o.vertexBuffer
}
// NormalBuffer returns the buffer object for this objects normals.
func (o *Object3D) NormalBuffer() gl.Buffer {
return o.normalBuffer
}
func newUvBuffer(uvs []mgl32.Vec2, compressed bool) gl.Buffer {
result := []float32{}
for _, uv := range uvs {
result = append(result, uv.X(), uv.Y())
}
if compressed {
// Invert V because we're using a compressed texture
for i := 1; i < len(result); i += 2 {
result[i] = 1.0 - result[i]
}
}
glBuffer := gl.GenBuffer()
glBuffer.Bind(gl.ARRAY_BUFFER)
gl.BufferData(gl.ARRAY_BUFFER, len(result)*2*4, result, gl.STATIC_DRAW)
return glBuffer
}
func newVertexBuffer(geometry Shape) gl.Buffer {
result := []float32{}
faces := geometry.Faces()
vertices := geometry.Vertices()
if len(faces) > 0 {
// Handle faces
for _, face := range faces {
for i := 0; i < 3; i++ {
vertex := vertices[face.At(i)]
result = append(result, vertex.X(), vertex.Y(), vertex.Z())
}
}
} else {
// Handle plain vertices
for _, vertex := range geometry.Vertices() {
result = append(result, vertex.X(), vertex.Y(), vertex.Z())
}
}
glBuffer := gl.GenBuffer()
glBuffer.Bind(gl.ARRAY_BUFFER)
gl.BufferData(gl.ARRAY_BUFFER, len(result)*3*4, result, gl.STATIC_DRAW)
return glBuffer
}
func newNormalBuffer(geometry Shape) gl.Buffer {
result := []float32{}
normals := geometry.Normals()
for _, face := range geometry.Faces() {
for i := 0; i < 3; i++ {
normal := normals[face.NormalAt(i)]
result = append(result, normal.X(), normal.Y(), normal.Z())
}
}
glBuffer := gl.GenBuffer()
glBuffer.Bind(gl.ARRAY_BUFFER)
gl.BufferData(gl.ARRAY_BUFFER, len(result)*3*4, result, gl.STATIC_DRAW)
return glBuffer
}
func generateIndex(geometry Shape) *Index {
// Disabled VBO index for now
// data := []uint16{}
// for _, f := range geometry.Faces() {
// data = append(data, f.A(), f.B(), f.C())
// }
index := &Index{count: 0}
return index
}