mirror of
https://github.com/bloeys/nmage.git
synced 2025-12-29 13:28:20 +00:00
Ep5: Obj file loading+indexed drawing+uniforms
This commit is contained in:
73
res/models/loader.go
Executable file
73
res/models/loader.go
Executable file
@ -0,0 +1,73 @@
|
||||
package models
|
||||
|
||||
import (
|
||||
"os"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/bloeys/go-sdl-engine/logging"
|
||||
)
|
||||
|
||||
type ObjInfo struct {
|
||||
VertPos []float32
|
||||
TriIndices []uint32
|
||||
}
|
||||
|
||||
func LoadObj(file string) (objInfo ObjInfo, err error) {
|
||||
|
||||
b, err := os.ReadFile(file)
|
||||
if err != nil {
|
||||
return objInfo, err
|
||||
}
|
||||
|
||||
lines := strings.Split(string(b), "\n")
|
||||
for i := 0; i < len(lines); i++ {
|
||||
|
||||
s := strings.SplitN(lines[i], " ", 2)
|
||||
switch s[0] {
|
||||
case "v":
|
||||
|
||||
vertPosStrings := strings.Split(s[1], " ")
|
||||
|
||||
f, err := strconv.ParseFloat(vertPosStrings[0], 32)
|
||||
if err != nil {
|
||||
return objInfo, err
|
||||
}
|
||||
objInfo.VertPos = append(objInfo.VertPos, float32(f))
|
||||
|
||||
f, err = strconv.ParseFloat(vertPosStrings[1], 32)
|
||||
if err != nil {
|
||||
return objInfo, err
|
||||
}
|
||||
objInfo.VertPos = append(objInfo.VertPos, float32(f))
|
||||
|
||||
f, err = strconv.ParseFloat(vertPosStrings[2], 32)
|
||||
if err != nil {
|
||||
return objInfo, err
|
||||
}
|
||||
objInfo.VertPos = append(objInfo.VertPos, float32(f))
|
||||
|
||||
case "f":
|
||||
|
||||
facesStrings := strings.Split(s[1], " ")
|
||||
objInfo.TriIndices = append(objInfo.TriIndices, getVertIndexFromFace(facesStrings[0]))
|
||||
objInfo.TriIndices = append(objInfo.TriIndices, getVertIndexFromFace(facesStrings[1]))
|
||||
objInfo.TriIndices = append(objInfo.TriIndices, getVertIndexFromFace(facesStrings[2]))
|
||||
|
||||
default:
|
||||
}
|
||||
}
|
||||
|
||||
return objInfo, nil
|
||||
}
|
||||
|
||||
func getVertIndexFromFace(f string) uint32 {
|
||||
|
||||
indxStr := strings.SplitN(f, "/", 2)[0]
|
||||
index, err := strconv.Atoi(indxStr)
|
||||
if err != nil {
|
||||
logging.ErrLog.Printf("Invalid face index '%v'. Err: %v", indxStr, err)
|
||||
return 0
|
||||
}
|
||||
return uint32(index) - 1
|
||||
}
|
||||
46
res/models/obj.obj
Executable file
46
res/models/obj.obj
Executable file
@ -0,0 +1,46 @@
|
||||
# Blender v2.92.0 OBJ File: ''
|
||||
# www.blender.org
|
||||
mtllib obj.mtl
|
||||
o Cube
|
||||
v 2.275618 1.000000 0.349413
|
||||
v 3.520138 -1.000000 0.102233
|
||||
v 2.275618 1.000000 0.752820
|
||||
v 3.520138 -1.000000 1.000000
|
||||
v 0.244520 1.000000 0.349413
|
||||
v -1.000000 -1.000000 0.102233
|
||||
v 0.244520 1.000000 0.752820
|
||||
v -1.000000 -1.000000 1.000000
|
||||
vt 0.806168 0.568832
|
||||
vt 0.693832 0.681168
|
||||
vt 0.693832 0.568832
|
||||
vt 0.375000 1.000000
|
||||
vt 0.375000 0.750000
|
||||
vt 0.375000 0.000000
|
||||
vt 0.625000 0.250000
|
||||
vt 0.375000 0.250000
|
||||
vt 0.375000 0.500000
|
||||
vt 0.125000 0.750000
|
||||
vt 0.125000 0.500000
|
||||
vt 0.806168 0.681168
|
||||
vt 0.625000 0.931168
|
||||
vt 0.625000 0.068832
|
||||
vn 0.0000 1.0000 0.0000
|
||||
vn 0.0000 0.1227 0.9924
|
||||
vn -0.8490 0.5283 0.0000
|
||||
vn 0.0000 -1.0000 0.0000
|
||||
vn 0.8490 0.5283 0.0000
|
||||
vn 0.0000 0.1227 -0.9924
|
||||
usemtl Material
|
||||
s off
|
||||
f 5/1/1 3/2/1 1/3/1
|
||||
f 3/2/2 8/4/2 4/5/2
|
||||
f 8/6/3 5/7/3 6/8/3
|
||||
f 2/9/4 8/10/4 6/11/4
|
||||
f 1/3/5 4/5/5 2/9/5
|
||||
f 5/7/6 2/9/6 6/8/6
|
||||
f 5/1/1 7/12/1 3/2/1
|
||||
f 3/2/2 7/13/2 8/4/2
|
||||
f 8/6/3 7/14/3 5/7/3
|
||||
f 2/9/4 4/5/4 8/10/4
|
||||
f 1/3/5 3/2/5 4/5/5
|
||||
f 5/7/6 1/3/6 2/9/6
|
||||
Reference in New Issue
Block a user