From 4820995ad450a0f82eaa347b264dabc14b367785 Mon Sep 17 00:00:00 2001 From: Carlos Sanchez Date: Tue, 23 Jul 2024 23:46:18 -0400 Subject: [PATCH] Bad idea --- tinyrender1/main.go | 82 +++++++++++++++++++++++++++++-------------- tinyrender1/render.go | 2 +- 2 files changed, 56 insertions(+), 28 deletions(-) diff --git a/tinyrender1/main.go b/tinyrender1/main.go index 5667e49..77725f4 100644 --- a/tinyrender1/main.go +++ b/tinyrender1/main.go @@ -5,15 +5,14 @@ import ( "fmt" "log" "os" - "runtime/pprof" // For performance whatever - // "github.com/udhos/gwob" + "runtime/pprof" // For performance profiling (unnecessary) ) const ( Width = 512 Height = 512 ObjectFile = "head.obj" - //LineRepeat = 1_000_000 + Repeat = 1_000 ) func must(err error) { @@ -49,34 +48,63 @@ func main() { defer of.Close() o, err := ParseObj(of) must(err) - // gwobopts := &gwob.ObjParserOptions {} - // o, err := gwob.NewObjFromFile(ObjectFile, gwobopts) - // must(err) log.Printf("Running render") - 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) - } - } + halfwidth := float32(fb.Width / 2) + halfheight := float32(fb.Height / 2) - // 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 - // } + var x [3]int + var y [3]int + var wi = int(fb.Width - 1) + var hi = int(fb.Height - 1) + for range Repeat { + for _, f := range o.Faces { + for i := range 3 { // Triangles, bro + x[i] = int((f[i].X + 1) * halfwidth) + y[i] = hi - int((f[i].Y+1)*halfheight) + if x[i] > wi { + x[i] = wi + } else if x[i] < 0 { + x[i] = 0 + } + if y[i] > hi { + y[i] = hi + } else if y[i] < 0 { + y[i] = 0 + } + } + Bresenham2(&fb, 0xFFFFFF, x[0], y[0], x[1], y[1]) + Bresenham2(&fb, 0xFFFFFF, x[1], y[1], x[2], y[2]) + Bresenham2(&fb, 0xFFFFFF, x[2], y[2], x[0], y[0]) + // x0 := int((f[0].X + 1) * halfwidth) + // y0 := int((f[0].Y + 1) * halfheight) + // x1 := int((f[1].X + 1) * halfwidth) + // y1 := int((f[1].Y + 1) * halfheight) + // x2 := int((f[2].X + 1) * halfwidth) + // y2 := int((f[2].Y + 1) * halfheight) + + // Bresenham2(&fb, 0xFFFFFF, x0, int(fb.Height)-y0, x1, int(fb.Height)-y1) + // for i := range 3 { // Triangles, bro + // Bresenham2(&fb, 0xFFFFFF, x0, int(fb.Height)-y0, x1, int(fb.Height)-y1) + // // v0 := f[i] + // // v1 := f[(i+1)%3] + // // x0 := int((v0.X + 1) * halfwidth) + // // y0 := int((v0.Y + 1) * halfheight) + // // x1 := int((v1.X + 1) * halfwidth) + // // y1 := int((v1.Y + 1) * halfheight) + // Bresenham2(&fb, 0xFFFFFF, x0, int(fb.Height)-y0, x1, int(fb.Height)-y1) + // } + } + + // Just draw a simple line (a million times or something) + // // 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/render.go b/tinyrender1/render.go index bf5a23c..d5b0026 100644 --- a/tinyrender1/render.go +++ b/tinyrender1/render.go @@ -173,7 +173,7 @@ func Bresenham2(fb *Framebuffer, color uint, x0 int, y0 int, x1 int, y1 int) { err := dx + dy for { - fb.SetSafe(uint(x0), uint(y0), color) + fb.Set(uint(x0), uint(y0), color) if x0 == x1 && y0 == y1 { break }