From be3d3e4b25832ff5dab130e21b7dde185b168ae0 Mon Sep 17 00:00:00 2001 From: Carlos Sanchez Date: Tue, 23 Jul 2024 19:00:19 -0400 Subject: [PATCH] Beginning tinyrender --- tinyrender1/.gitignore | 1 + tinyrender1/go.mod | 3 +++ tinyrender1/image.go | 46 ++++++++++++++++++++++++++++++++++++++++++ tinyrender1/main.go | 18 +++++++++++++++++ 4 files changed, 68 insertions(+) create mode 100644 tinyrender1/.gitignore create mode 100644 tinyrender1/go.mod create mode 100644 tinyrender1/image.go create mode 100644 tinyrender1/main.go diff --git a/tinyrender1/.gitignore b/tinyrender1/.gitignore new file mode 100644 index 0000000..6357051 --- /dev/null +++ b/tinyrender1/.gitignore @@ -0,0 +1 @@ +tinyrender1 diff --git a/tinyrender1/go.mod b/tinyrender1/go.mod new file mode 100644 index 0000000..e920698 --- /dev/null +++ b/tinyrender1/go.mod @@ -0,0 +1,3 @@ +module tinyrender1 + +go 1.22.5 diff --git a/tinyrender1/image.go b/tinyrender1/image.go new file mode 100644 index 0000000..c2d2bdf --- /dev/null +++ b/tinyrender1/image.go @@ -0,0 +1,46 @@ +package main + +import ( + "fmt" + "strings" +) + +// Convert rgb to uint +func Col2Uint(r, g, b byte) uint { + return (uint(r) << 16) | (uint(g) << 8) | uint(b) +} + +// Convert uint to rgb (in that order) +func Uint2Col(col uint) (byte, byte, byte) { + return byte((col >> 16) & 0xFF), byte((col >> 8) & 0xFF), byte(col & 0xFF) +} + +// Color is in ARGB (alpha not used right now) +type Framebuffer struct { + Data []uint + Width uint + Height uint +} + +// Create a new framebuffer for the given width and height. +func NewFramebuffer(width uint, height uint) Framebuffer { + return Framebuffer{ + Data: make([]uint, width*height), + Width: width, + Height: height, + } +} + +// Given some image data, return a string that is the ppm of it +func (fb *Framebuffer) ExportPPM() string { + var result strings.Builder + result.WriteString(fmt.Sprintf("P3\n%d %d\n255\n", fb.Width, fb.Height)) + for y := range fb.Height { + for x := range fb.Width { + r, g, b := Uint2Col(fb.Data[x+y*fb.Width]) + result.WriteString(fmt.Sprintf("%d %d %d\t", r, g, b)) + } + result.WriteRune('\n') + } + return result.String() +} diff --git a/tinyrender1/main.go b/tinyrender1/main.go new file mode 100644 index 0000000..142a7ec --- /dev/null +++ b/tinyrender1/main.go @@ -0,0 +1,18 @@ +package main + +import ( + "fmt" + "log" +) + +const ( + Width = 512 + Height = 512 +) + +func main() { + log.Printf("Program start") + fb := NewFramebuffer(Width, Height) + fmt.Print(fb.ExportPPM()) + log.Printf("Program end") +}