commit a725c6588d5bdc8bd850bd3d90d48590da3f8f83
parent b2d0180669048d007691ba434db948042d6adbc7
Author: Matsuda Kenji <info@mtkn.jp>
Date: Fri, 29 Nov 2024 08:38:58 +0900
read mtl file
Diffstat:
3 files changed, 35 insertions(+), 7 deletions(-)
diff --git a/cmd/sample/fragment.glsl b/cmd/sample/fragment.glsl
@@ -57,6 +57,7 @@ void main() {
for (int i = 0; i < PointLights.length(); i++) {
fcol += vec4(calcPointLight(PointLights[i], Cube, CamPos), 0);
}
+ float x;
}
vec3 calcPointLight(PointLight l, Material m, vec3 camPos) {
diff --git a/cmd/sample/main.go b/cmd/sample/main.go
@@ -308,7 +308,7 @@ func (app *App) Update() error {
teapotUniforms.Trans.View = view
teapotUniforms.Trans.Projection = projection
teapotUniforms.Trans.Model = tofu.Translate(tofu.Vec3{0, 0, 0}).
- Mul(tofu.Scale(0.06))
+ Mul(tofu.Scale(0.3))
teapotUniforms.CamPos = camera.Pos
if err := app.teapotProgram.SetUniforms(); err != nil {
log.Printf("teapotprogram.setuniforms(): %v", err)
@@ -327,7 +327,7 @@ func (app *App) Update() error {
for _, pl := range pointLights {
lightUniforms.Trans.Model = tofu.Translate(pl.Pos).
Mul(tofu.Scale(0.3))
- lightUniforms.LightCol = pl.Specular
+ lightUniforms.LightCol = tofu.Vec3{1, 1, 1}.Sub(tofu.Vec3{1, 1, 1}.Sub(pl.Specular).MulF(0.3))
if err := app.lightProgram.SetUniforms(); err != nil {
log.Printf("lightprogram.setuniforms(): %v", err)
}
@@ -376,7 +376,7 @@ func main() {
lightFpath := filepath.Join(filepath.Dir(f), "light_fragment.glsl")
texturePath := filepath.Join(filepath.Dir(f), "container2.png")
specularMapPath := filepath.Join(filepath.Dir(f), "container2_specular.png")
- teapotPath := filepath.Join(filepath.Dir(f), "teapot.obj")
+ teapotPath := filepath.Join(filepath.Dir(f), "backpack/backpack.obj")
teapotFpath := filepath.Join(filepath.Dir(f), "teapot.glsl")
teapot, err = tofu.DecodeObject(teapotPath)
diff --git a/object.go b/object.go
@@ -2,21 +2,30 @@ package tofu
import (
"bufio"
+ "errors"
"fmt"
"log"
"math"
"os"
+ "path/filepath"
"strconv"
"strings"
"github.com/go-gl/gl/v3.3-core/gl"
)
+type ErrUnsupported string
+
+func (e ErrUnsupported) Error() string {
+ return string(e) + " unsupported, ignoring"
+}
+
type Object struct {
Vertices []Vec3
TexCoords []Vec2
Normals []Vec3
Faces []Face
+ Materials map[string]*Material
vao *VAO
}
@@ -30,8 +39,13 @@ func DecodeObject(filename string) (*Object, error) {
s := bufio.NewScanner(f)
nl := 1
for s.Scan() {
- if err := decodeLine(obj, s.Text()); err != nil {
- return nil, fmt.Errorf("%s:%d %s", filename, nl, err)
+ if err := decodeObjectLine(obj, s.Text(), filename); err != nil {
+ var perr ErrUnsupported
+ if errors.As(err, &perr) {
+ //log.Printf("%s:%d %v", filename, nl, perr)
+ } else {
+ return nil, fmt.Errorf("%s:%d %s", filename, nl, err)
+ }
}
nl++
}
@@ -41,7 +55,7 @@ func DecodeObject(filename string) (*Object, error) {
return obj, nil
}
-func decodeLine(obj *Object, line string) error {
+func decodeObjectLine(obj *Object, line string, filename string) error {
if len(line) == 0 || line[0] == '#' {
return nil
}
@@ -66,8 +80,21 @@ func decodeLine(obj *Object, line string) error {
if err := obj.addFace(sf[1:]); err != nil {
return fmt.Errorf("addFace: %v", err)
}
+ case "mtllib":
+ if len(sf) < 2 {
+ return fmt.Errorf("no mtllib file specified")
+ }
+ m, err := decodeMaterial(filepath.Join(filepath.Dir(filename), sf[1]))
+ if err != nil {
+ return fmt.Errorf("decode mtl file: %v", err)
+ }
+ if obj.Materials == nil {
+ obj.Materials = make(map[string]*Material)
+ }
+ obj.Materials[m.Name] = m
+ log.Printf("mtl: %+v", m)
default:
- log.Printf("unsupported: %s, ignoring", t)
+ return ErrUnsupported(t)
}
return nil
}