diff --git a/tinyrender1/main.go b/tinyrender1/main.go index 3d01105..5667e49 100644 --- a/tinyrender1/main.go +++ b/tinyrender1/main.go @@ -6,14 +6,14 @@ import ( "log" "os" "runtime/pprof" // For performance whatever - - "github.com/udhos/gwob" + // "github.com/udhos/gwob" ) const ( Width = 512 Height = 512 - LineRepeat = 1_000_000 + ObjectFile = "head.obj" + //LineRepeat = 1_000_000 ) func must(err error) { @@ -42,18 +42,42 @@ func main() { fb := NewFramebuffer(Width, Height) + log.Printf("Loading obj %s", ObjectFile) + + of, err := os.Open(ObjectFile) + must(err) + defer of.Close() + o, err := ParseObj(of) + must(err) + // gwobopts := &gwob.ObjParserOptions {} + // o, err := gwob.NewObjFromFile(ObjectFile, gwobopts) + // must(err) + log.Printf("Running render") - // Just draw a simple line (a million times or something) - for range LineRepeat { - // LineDumb5(&fb, 0xFFFFFF, 100, 100, 350, 200) - // LineDumb5(&fb, 0xFF0000, 120, 100, 200, 350) - // LineDumb5(&fb, 0xFF0000, 350, 200, 100, 100) // backward first line - Bresenham2(&fb, 0xFFFFFF, 100, 100, 350, 200) - Bresenham2(&fb, 0xFF0000, 120, 100, 200, 350) - Bresenham2(&fb, 0xFF0000, 350, 200, 100, 100) // backward first line + for _, f := range o.Faces { + log.Printf("%v", f) + for i := range 3 { // Triangles, bro + v0 := f[i] + v1 := f[(i+1)%3] + x0 := int((v0.X + 1) * float32(fb.Width/2)) + y0 := int((v0.Y + 1) * float32(fb.Height/2)) + x1 := int((v1.X + 1) * float32(fb.Width/2)) + y1 := int((v1.Y + 1) * float32(fb.Height/2)) + Bresenham2(&fb, 0xFFFFFF, x0, int(fb.Height)-y0, x1, int(fb.Height)-y1) + } } + // Just draw a simple line (a million times or something) + // for range LineRepeat { + // // LineDumb5(&fb, 0xFFFFFF, 100, 100, 350, 200) + // // LineDumb5(&fb, 0xFF0000, 120, 100, 200, 350) + // // LineDumb5(&fb, 0xFF0000, 350, 200, 100, 100) // backward first line + // Bresenham2(&fb, 0xFFFFFF, 100, 100, 350, 200) + // Bresenham2(&fb, 0xFF0000, 120, 100, 200, 350) + // Bresenham2(&fb, 0xFF0000, 350, 200, 100, 100) // backward first line + // } + log.Printf("Exporting ppm to stdout") fmt.Print(fb.ExportPPM()) diff --git a/tinyrender1/obj.go b/tinyrender1/obj.go index a670512..94f3429 100644 --- a/tinyrender1/obj.go +++ b/tinyrender1/obj.go @@ -5,6 +5,7 @@ import ( "bufio" "fmt" "io" + "log" "strings" ) @@ -19,27 +20,42 @@ type ObjModel struct { Faces []Facef } +// Parse an obj file at the given reader. Only handles v and f right now func ParseObj(reader io.Reader) (*ObjModel, error) { result := ObjModel{ Vertices: make([]Vec3f, 0), Faces: make([]Facef, 0), } - scanner := bufio.NewScanner(reader) - for scanner.Scan() { + breader := bufio.NewReader(reader) + done := false + for !done { // Scan a line - line := strings.Trim(scanner.Text(), " \t") + line, err := breader.ReadString('\n') + if err != nil { + if err == io.EOF { + done = true + } else { + log.Printf("NOT EOF ERR?") + return nil, err + } + } + line = strings.Trim(line, " \t\n\r") + if len(line) == 0 { + continue + } // Find the first "item", whatever that is. This also gets rid of comments // since we just don't use lines that start with # (no handler var t string - _, err := fmt.Sscan(line, t) + _, err = fmt.Sscan(line, &t) if err != nil { + log.Printf("SSCANF ERR") return nil, err } line = line[len(t):] if t == "v" { // Read a vertex, should be just three floats var vertex Vec3f - _, err := fmt.Sscan(line, vertex.X, vertex.Y, vertex.Z) + _, err := fmt.Sscan(line, &vertex.X, &vertex.Y, &vertex.Z) if err != nil { return nil, err } @@ -50,7 +66,7 @@ func ParseObj(reader io.Reader) (*ObjModel, error) { var face Facef for i := range 3 { var vi, ti0, ti1 int - _, err := fmt.Sscanf(line, "%d/%d/%d", vi, ti0, ti1) + _, err := fmt.Sscanf(line, "%d/%d/%d", &vi, &ti0, &ti1) if err != nil { return nil, err }