diff --git a/tinyrender1/image.go b/tinyrender1/image.go index 675df86..4f94176 100644 --- a/tinyrender1/image.go +++ b/tinyrender1/image.go @@ -36,6 +36,13 @@ func (fb *Framebuffer) Set(x uint, y uint, color uint) { fb.Data[x+y*fb.Width] = color } +func (fb *Framebuffer) SetSafe(x uint, y uint, color uint) { + if x >= fb.Width || y >= fb.Height { + return + } + fb.Data[x+y*fb.Width] = color +} + // Given some image data, return a string that is the ppm of it func (fb *Framebuffer) ExportPPM() string { var result strings.Builder diff --git a/tinyrender1/obj.go b/tinyrender1/obj.go index 94f3429..c951083 100644 --- a/tinyrender1/obj.go +++ b/tinyrender1/obj.go @@ -64,16 +64,18 @@ func ParseObj(reader io.Reader) (*ObjModel, error) { // Read a face; in our example, it's always three sets. // For THIS example, we throw away those other values var face Facef + var vi [3]int + var ti int + _, err := fmt.Sscanf(line, "%d/%d/%d %d/%d/%d %d/%d/%d", + &vi[0], &ti, &ti, &vi[1], &ti, &ti, &vi[2], &ti, &ti) + if err != nil { + return nil, err + } for i := range 3 { - var vi, ti0, ti1 int - _, err := fmt.Sscanf(line, "%d/%d/%d", &vi, &ti0, &ti1) - if err != nil { - return nil, err + if vi[i] > len(result.Vertices) || vi[i] < 1 { + return nil, fmt.Errorf("Face vertex index out of bounds: %d", vi[i]) } - if vi > len(result.Vertices) || vi < 1 { - return nil, fmt.Errorf("Face vertex index out of bounds: %d", vi) - } - face[i] = result.Vertices[vi-1] + face[i] = result.Vertices[vi[i]-1] } result.Faces = append(result.Faces, face) } diff --git a/tinyrender1/render.go b/tinyrender1/render.go index d5b0026..bf5a23c 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.Set(uint(x0), uint(y0), color) + fb.SetSafe(uint(x0), uint(y0), color) if x0 == x1 && y0 == y1 { break }