gg/src/gx/rect.go

120 lines
2.2 KiB
Go
Raw Normal View History

package gx
2023-05-22 23:39:01 +03:00
import (
"github.com/hajimehoshi/ebiten/v2"
//"github.com/hajimehoshi/ebiten/v2/vector"
//"fmt"
2023-05-22 23:39:01 +03:00
//"image"
)
// The type describes rectangle geometry.
2023-05-22 23:39:01 +03:00
type Rectangle struct {
// Position of up left corner
// and the point to
// rotate around(relatively of position, not absolute).
// Scale represent width and height.
Transform
}
// The type describes rectangle that can be drawn.
type DrawableRectangle struct {
Rectangle
ShaderOptions
2023-05-25 00:42:48 +03:00
// Solid color of the rectangle.
// Will be ignored if the Shader
// field is not nil.
Color Color
2023-05-25 00:42:48 +03:00
2023-05-26 18:31:04 +03:00
// Should be draw or not.
Visible bool
2023-05-22 23:39:01 +03:00
}
// Return points of corners of the rectangle.
func (r Rectangle) Corners() []Point {
return []Point{}
}
// Get 2 triangles that the rectangle consists of.
func (r Rectangle) Triangles() Triangles {
2023-05-30 14:34:10 +03:00
m := r.Matrix()
p1 := V(0, 0).Apply(&m)
p2 := V(1, 0).Apply(&m)
p3 := V(1, -1).Apply(&m)
p4 := V(0, -1).Apply(&m)
//fmt.Println("in:", p1, p2, p3, p4)
2023-05-22 23:39:01 +03:00
2023-05-30 14:34:10 +03:00
return Triangles{
Triangle{p1, p2, p3},
Triangle{p1, p4, p3},
}
}
2023-05-30 14:34:10 +03:00
// Check whether the rectangle contains the point.
func (r Rectangle) ContainsPoint(p Point) bool {
return r.Triangles().ContainsPoint(p)
}
2023-05-30 14:34:10 +03:00
// Check whether the drawable rectangle should be drawn.
2023-05-26 18:31:04 +03:00
func (r *DrawableRectangle) IsVisible() bool {
return r.Visible
}
2023-05-26 18:31:04 +03:00
func (r *DrawableRectangle) Draw(
2023-05-22 23:39:01 +03:00
e *Engine,
i *Image,
) {
t := r.Transform
2023-05-25 00:42:48 +03:00
// Draw solid color if no shader.
if r.Shader == nil {
2023-05-22 23:39:01 +03:00
img := NewImage(1, 1)
img.Set(0, 0, r.Color)
2023-05-26 18:31:04 +03:00
2023-05-30 14:34:10 +03:00
m := t.Matrix()
rm := e.Camera().RealMatrix(e)
2023-05-26 18:31:04 +03:00
m.Concat(rm)
2023-05-22 23:39:01 +03:00
opts := &ebiten.DrawImageOptions{
GeoM: m,
}
i.DrawImage(img, opts)
return
}
2023-05-26 18:31:04 +03:00
2023-05-25 00:42:48 +03:00
// Use the Color as base image if no is provided.
//var did bool
2023-05-26 18:31:04 +03:00
if r.Images[0] == nil {
r.Images[0] = NewImage(1, 1)
r.Images[0].Set(0, 0, r.Color)
//did = true
2023-05-25 00:42:48 +03:00
}
2023-05-26 18:31:04 +03:00
w, h := r.Images[0].Size()
/*if !did {
2023-05-26 18:31:04 +03:00
t.S.X /= Float(w)
t.S.Y /= Float(h)
t.S.X *= r.W
t.S.Y *= r.H
}*/
2023-05-26 18:31:04 +03:00
2023-05-30 14:34:10 +03:00
rm := e.Camera().RealMatrix(e)
m := t.Matrix()
2023-05-26 18:31:04 +03:00
m.Concat(rm)
2023-05-25 00:42:48 +03:00
// Drawing with shader.
2023-05-22 23:39:01 +03:00
opts := &ebiten.DrawRectShaderOptions{
2023-05-23 16:25:21 +03:00
GeoM: m,
2023-05-26 18:31:04 +03:00
Images: r.Images,
Uniforms: r.Uniforms,
2023-05-22 23:39:01 +03:00
}
2023-05-25 00:42:48 +03:00
i.DrawRectShader(w, h, r.Shader, opts)
}