Files
nmage/res/models/loader.go

74 lines
1.6 KiB
Go
Executable File

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
}