NewGeometry generates and returns a geometry from the specified object
(obj *Object)
| 310 | |
| 311 | // NewGeometry generates and returns a geometry from the specified object |
| 312 | func (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 | } |
no test coverage detected