mirror of
https://github.com/bloeys/nmage.git
synced 2025-12-29 13:28:20 +00:00
74 lines
1.6 KiB
Go
Executable File
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
|
|
}
|