MCPcopy
hub / github.com/g3n/engine / NewGeometry

Method NewGeometry

loader/obj/obj.go:312–369  ·  view source on GitHub ↗

NewGeometry generates and returns a geometry from the specified object

(obj *Object)

Source from the content-addressed store, hash-verified

310
311// NewGeometry generates and returns a geometry from the specified object
312func (dec *Decoder) NewGeometry(obj *Object) (*geometry.Geometry, error) {
313
314 geom := geometry.NewGeometry()
315
316 // Create buffers
317 positions := math32.NewArrayF32(0, 0)
318 normals := math32.NewArrayF32(0, 0)
319 uvs := math32.NewArrayF32(0, 0)
320 indices := math32.NewArrayU32(0, 0)
321
322 // copy all vertex info from the decoded Object, face and index to the geometry
323 copyVertex := func(face *Face, idx int) {
324 var vec3 math32.Vector3
325 var vec2 math32.Vector2
326
327 pos := positions.Size() / 3
328 // Copy vertex position and append to geometry
329 dec.Vertices.GetVector3(3*face.Vertices[idx], &vec3)
330 positions.AppendVector3(&vec3)
331 // Copy vertex normal and append to geometry
332 if face.Normals[idx] != invINDEX {
333 dec.Normals.GetVector3(3*face.Normals[idx], &vec3)
334 normals.AppendVector3(&vec3)
335 }
336 // Copy vertex uv and append to geometry
337 if face.Uvs[idx] != invINDEX {
338 dec.Uvs.GetVector2(2*face.Uvs[idx], &vec2)
339 uvs.AppendVector2(&vec2)
340 }
341 indices.Append(uint32(pos))
342 }
343
344 var group *geometry.Group
345 matName := ""
346 matIndex := 0
347 for _, face := range obj.Faces {
348 // If face material changed, starts a new group
349 if face.Material != matName {
350 group = geom.AddGroup(indices.Size(), 0, matIndex)
351 matName = face.Material
352 matIndex++
353 }
354 // Copy face vertices to geometry
355 for idx := 1; idx < len(face.Vertices)-1; idx++ {
356 copyVertex(&face, 0)
357 copyVertex(&face, idx)
358 copyVertex(&face, idx+1)
359 group.Count += 3
360 }
361 }
362
363 geom.SetIndices(indices)
364 geom.AddVBO(gls.NewVBO(positions).AddAttrib(gls.VertexPosition))
365 geom.AddVBO(gls.NewVBO(normals).AddAttrib(gls.VertexNormal))
366 geom.AddVBO(gls.NewVBO(uvs).AddAttrib(gls.VertexTexcoord))
367
368 return geom, nil
369}

Callers 1

NewMeshMethod · 0.95

Calls 15

SizeMethod · 0.95
AppendVector3Method · 0.95
AppendVector2Method · 0.95
AppendMethod · 0.95
AddGroupMethod · 0.95
SizeMethod · 0.95
SetIndicesMethod · 0.95
AddVBOMethod · 0.95
NewGeometryFunction · 0.92
NewArrayF32Function · 0.92
NewArrayU32Function · 0.92
NewVBOFunction · 0.92

Tested by

no test coverage detected