Beginning tinyrender
This commit is contained in:
parent
c7bd37c114
commit
be3d3e4b25
1
tinyrender1/.gitignore
vendored
Normal file
1
tinyrender1/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
tinyrender1
|
3
tinyrender1/go.mod
Normal file
3
tinyrender1/go.mod
Normal file
@ -0,0 +1,3 @@
|
||||
module tinyrender1
|
||||
|
||||
go 1.22.5
|
46
tinyrender1/image.go
Normal file
46
tinyrender1/image.go
Normal file
@ -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()
|
||||
}
|
18
tinyrender1/main.go
Normal file
18
tinyrender1/main.go
Normal file
@ -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")
|
||||
}
|
Loading…
Reference in New Issue
Block a user