2023-10-23 15:45:18 +03:00
|
|
|
package gg
|
2023-05-04 19:31:33 +03:00
|
|
|
|
2023-05-22 23:39:01 +03:00
|
|
|
import (
|
2024-01-11 06:39:57 +03:00
|
|
|
//"github.com/hajimehoshi/ebiten/v2"
|
2023-05-22 23:39:01 +03:00
|
|
|
//"github.com/hajimehoshi/ebiten/v2/vector"
|
2023-05-23 16:19:55 +03:00
|
|
|
//"fmt"
|
2023-05-22 23:39:01 +03:00
|
|
|
//"image"
|
|
|
|
)
|
|
|
|
|
2024-01-16 01:08:21 +03:00
|
|
|
// The type describes rectangle geometry with
|
|
|
|
// way to move, rotate and scale it.
|
2023-05-22 23:39:01 +03:00
|
|
|
type Rectangle struct {
|
2024-01-08 06:09:36 +03:00
|
|
|
Object
|
2023-05-30 13:24:14 +03:00
|
|
|
Transform
|
2024-01-16 01:08:21 +03:00
|
|
|
Width, Height Float
|
2023-05-22 23:39:01 +03:00
|
|
|
}
|
|
|
|
|
2023-06-03 11:25:19 +03:00
|
|
|
// Return points of vertices of the rectangle.
|
2024-01-16 01:08:21 +03:00
|
|
|
func (r Rectangle) Vertices() Vertices {
|
2023-05-30 14:34:10 +03:00
|
|
|
m := r.Matrix()
|
2023-12-26 23:31:04 +03:00
|
|
|
p1 := V(0, 0).Apply(m)
|
|
|
|
p2 := V(1, 0).Apply(m)
|
|
|
|
p3 := V(1, 1).Apply(m)
|
|
|
|
p4 := V(0, 1).Apply(m)
|
2023-06-03 11:25:19 +03:00
|
|
|
return Points{p1, p2, p3, p4}
|
|
|
|
}
|
|
|
|
|
2023-06-03 22:41:00 +03:00
|
|
|
func (r Rectangle) Edges() Edges {
|
2023-06-03 12:26:31 +03:00
|
|
|
vs := r.Vertices()
|
2024-01-16 01:08:21 +03:00
|
|
|
return Edges{
|
|
|
|
Edge{vs[0], vs[1]},
|
|
|
|
Edge{vs[1], vs[2]},
|
|
|
|
Edge{vs[2], vs[3]},
|
|
|
|
Edge{vs[3], vs[0]},
|
2023-06-03 12:26:31 +03:00
|
|
|
}
|
2023-06-03 11:25:19 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
// Get 2 triangles that the rectangle consists of.
|
2024-01-11 06:39:57 +03:00
|
|
|
func (r Rectangle) MakeTriangles() Triangles {
|
2023-06-03 11:25:19 +03:00
|
|
|
pts := r.Vertices()
|
|
|
|
p1 := pts[0]
|
|
|
|
p2 := pts[1]
|
|
|
|
p3 := pts[2]
|
|
|
|
p4 := pts[3]
|
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 13:12:11 +03:00
|
|
|
}
|
|
|
|
|
2023-05-30 14:34:10 +03:00
|
|
|
// Check whether the rectangle contains the point.
|
2024-01-16 01:08:21 +03:00
|
|
|
func (r Rectangle) ContainedPoints(pts Points) (Points) {
|
|
|
|
return r.MakeTriangles().ContainedPoints(pts)
|
|
|
|
}
|
|
|
|
|
|
|
|
// The type describes rectangle that can be drawn.
|
|
|
|
type DrawableRectangle struct {
|
|
|
|
Rectangle
|
|
|
|
ShaderOptions
|
|
|
|
|
|
|
|
// Solid color of the rectangle.
|
|
|
|
// Will be ignored if the Shader
|
|
|
|
// field is not nil.
|
|
|
|
Colority
|
|
|
|
|
|
|
|
// Should be draw or not.
|
|
|
|
Visibility
|
|
|
|
Collidability
|
2023-05-04 19:31:33 +03:00
|
|
|
}
|
|
|
|
|
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 {
|
2023-05-23 16:19:55 +03:00
|
|
|
return r.Visible
|
|
|
|
}
|
|
|
|
|
2024-01-11 06:39:57 +03:00
|
|
|
func (r *DrawableRectangle) Draw(c *Context) []EVertex {
|
|
|
|
return (&DrawableTriangles{
|
|
|
|
Colority: r.Colority,
|
|
|
|
Triangles: r.MakeTriangles(),
|
|
|
|
}).MakeEVertices(c)
|
2023-05-26 18:31:04 +03:00
|
|
|
|
2024-01-11 06:39:57 +03:00
|
|
|
/*// Use the Color as base image if no is provided.
|
2023-05-30 22:35:49 +03:00
|
|
|
//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)
|
2023-05-25 00:42:48 +03:00
|
|
|
}
|
|
|
|
|
2023-05-26 18:31:04 +03:00
|
|
|
w, h := r.Images[0].Size()
|
|
|
|
|
2023-05-25 00:42:48 +03:00
|
|
|
// Drawing with shader.
|
2024-01-08 02:53:00 +03:00
|
|
|
c.DrawRectShader(w, h, r.Shader, &ebiten.DrawRectShaderOptions{
|
|
|
|
GeoM: m,
|
2023-05-26 18:31:04 +03:00
|
|
|
Images: r.Images,
|
|
|
|
Uniforms: r.Uniforms,
|
2024-01-11 06:39:57 +03:00
|
|
|
})*/
|
|
|
|
return nil
|
2023-05-04 19:31:33 +03:00
|
|
|
}
|
|
|
|
|