49 lines
1.2 KiB
Go
49 lines
1.2 KiB
Go
package main
|
|
|
|
import "io"
|
|
import "image"
|
|
import "image/color"
|
|
|
|
type Textures []Texture
|
|
|
|
type Texture struct {
|
|
Data []color.RGBA
|
|
Stride int
|
|
}
|
|
|
|
func (texture Textures) At (wall int, offset Vector) color.RGBA {
|
|
wall --
|
|
if wall < 0 || wall >= len(texture) { return color.RGBA { } }
|
|
image := texture[wall]
|
|
|
|
xOffset := int(offset.X * float64(image.Stride))
|
|
yOffset := int(offset.Y * float64(len(image.Data) / image.Stride))
|
|
|
|
index := xOffset + yOffset * image.Stride
|
|
if index < 0 { return color.RGBA { } }
|
|
if index >= len(image.Data) { return color.RGBA { } }
|
|
return image.Data[index]
|
|
}
|
|
|
|
func TextureFrom (source io.Reader) (texture Texture, err error) {
|
|
sourceImage, _, err := image.Decode(source)
|
|
if err != nil { return }
|
|
bounds := sourceImage.Bounds()
|
|
texture.Stride = bounds.Dx()
|
|
texture.Data = make([]color.RGBA, bounds.Dx() * bounds.Dy())
|
|
|
|
index := 0
|
|
for y := bounds.Min.Y; y < bounds.Max.Y; y ++ {
|
|
for x := bounds.Min.X; x < bounds.Max.X; x ++ {
|
|
r, g, b, a := sourceImage.At(x, y).RGBA()
|
|
texture.Data[index] = color.RGBA {
|
|
R: uint8(r >> 8),
|
|
G: uint8(g >> 8),
|
|
B: uint8(b >> 8),
|
|
A: uint8(a >> 8),
|
|
}
|
|
index ++
|
|
}}
|
|
return texture, nil
|
|
}
|