add line shape
This commit is contained in:
parent
23fd33ac75
commit
0786726aa4
128
graphics.go
128
graphics.go
|
@ -37,6 +37,129 @@ type DrawDeleter interface {
|
||||||
Deleter
|
Deleter
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// LineColor a line shape (with sharp ends) filled with a single color.
|
||||||
|
type LineColor struct {
|
||||||
|
parent pixelgl.Doer
|
||||||
|
color color.Color
|
||||||
|
a, b Vec
|
||||||
|
width float64
|
||||||
|
va *pixelgl.VertexArray
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewLineColor creates a new line shape between points A and B filled with a single color. Parent is an object
|
||||||
|
// that this shape belongs to, such as a window, or a graphics effect.
|
||||||
|
func NewLineColor(parent pixelgl.Doer, c color.Color, a, b Vec, width float64) *LineColor {
|
||||||
|
lc := &LineColor{
|
||||||
|
parent: parent,
|
||||||
|
color: c,
|
||||||
|
a: a,
|
||||||
|
b: b,
|
||||||
|
width: width,
|
||||||
|
}
|
||||||
|
|
||||||
|
var format pixelgl.VertexFormat
|
||||||
|
parent.Do(func(ctx pixelgl.Context) {
|
||||||
|
format = ctx.Shader().VertexFormat()
|
||||||
|
})
|
||||||
|
|
||||||
|
var err error
|
||||||
|
lc.va, err = pixelgl.NewVertexArray(
|
||||||
|
parent,
|
||||||
|
format,
|
||||||
|
pixelgl.TriangleStripDrawMode,
|
||||||
|
pixelgl.DynamicUsage,
|
||||||
|
4,
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
panic(errors.Wrap(err, "failed to create line"))
|
||||||
|
}
|
||||||
|
|
||||||
|
lc.va.SetVertexAttributeVec4(0, pixelgl.Color, mgl32.Vec4{1, 1, 1, 1})
|
||||||
|
lc.va.SetVertexAttributeVec4(1, pixelgl.Color, mgl32.Vec4{1, 1, 1, 1})
|
||||||
|
lc.va.SetVertexAttributeVec4(2, pixelgl.Color, mgl32.Vec4{1, 1, 1, 1})
|
||||||
|
lc.va.SetVertexAttributeVec4(3, pixelgl.Color, mgl32.Vec4{1, 1, 1, 1})
|
||||||
|
|
||||||
|
lc.setPoints()
|
||||||
|
|
||||||
|
return lc
|
||||||
|
}
|
||||||
|
|
||||||
|
// setPoints updates the vertex array data according to A, B and width.
|
||||||
|
func (lc *LineColor) setPoints() {
|
||||||
|
r := (lc.b - lc.a).Unit().Scaled(lc.width / 2).Rotated(math.Pi / 2)
|
||||||
|
for i, p := range []Vec{lc.a - r, lc.a + r, lc.b - r, lc.b + r} {
|
||||||
|
lc.va.SetVertexAttributeVec2(i, pixelgl.Position, mgl32.Vec2{float32(p.X()), float32(p.Y())})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetColor changes the color of a line.
|
||||||
|
func (lc *LineColor) SetColor(c color.Color) {
|
||||||
|
lc.color = c
|
||||||
|
}
|
||||||
|
|
||||||
|
// Color returns the current color of a line.
|
||||||
|
func (lc *LineColor) Color() color.Color {
|
||||||
|
return lc.color
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetA changes the position of the first endpoint of a line.
|
||||||
|
func (lc *LineColor) SetA(a Vec) {
|
||||||
|
lc.a = a
|
||||||
|
lc.setPoints()
|
||||||
|
}
|
||||||
|
|
||||||
|
// A returns the current position of the first endpoint of a line.
|
||||||
|
func (lc *LineColor) A() Vec {
|
||||||
|
return lc.a
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetB changes the position of the second endpoint of a line.
|
||||||
|
func (lc *LineColor) SetB(b Vec) {
|
||||||
|
lc.b = b
|
||||||
|
lc.setPoints()
|
||||||
|
}
|
||||||
|
|
||||||
|
// B returns the current position of the second endpoint of a line.
|
||||||
|
func (lc *LineColor) B() Vec {
|
||||||
|
return lc.b
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetWidth changes the width of a line.
|
||||||
|
func (lc *LineColor) SetWidth(width float64) {
|
||||||
|
lc.width = width
|
||||||
|
lc.setPoints()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Width returns the current width of a line.
|
||||||
|
func (lc *LineColor) Width() float64 {
|
||||||
|
return lc.width
|
||||||
|
}
|
||||||
|
|
||||||
|
// Draw draws a line transformed by the supplied transforms applied in the reverse order.
|
||||||
|
func (lc *LineColor) Draw(t ...Transform) {
|
||||||
|
mat := mgl32.Ident3()
|
||||||
|
for i := range t {
|
||||||
|
mat = mat.Mul3(t[i].Mat3())
|
||||||
|
}
|
||||||
|
|
||||||
|
var shader *pixelgl.Shader
|
||||||
|
lc.parent.Do(func(ctx pixelgl.Context) {
|
||||||
|
shader = ctx.Shader()
|
||||||
|
})
|
||||||
|
|
||||||
|
r, g, b, a := colorToRGBA(lc.color)
|
||||||
|
shader.SetUniformVec4(pixelgl.MaskColor, mgl32.Vec4{r, g, b, a})
|
||||||
|
shader.SetUniformMat3(pixelgl.Transform, mat)
|
||||||
|
shader.SetUniformInt(pixelgl.IsTexture, 0)
|
||||||
|
|
||||||
|
lc.va.Draw()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete destroys a line shape and releases it's video memory. Do not use this shape after calling Delete.
|
||||||
|
func (lc *LineColor) Delete() {
|
||||||
|
lc.va.Delete()
|
||||||
|
}
|
||||||
|
|
||||||
// PolygonColor is a polygon shape filled with a single color.
|
// PolygonColor is a polygon shape filled with a single color.
|
||||||
type PolygonColor struct {
|
type PolygonColor struct {
|
||||||
parent pixelgl.Doer
|
parent pixelgl.Doer
|
||||||
|
@ -259,3 +382,8 @@ func (ec *EllipseColor) Draw(t ...Transform) {
|
||||||
|
|
||||||
ec.va.Draw()
|
ec.va.Draw()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Delete destroys an ellipse shape and releases it's video memory. Do not use this shape after calling Delete.
|
||||||
|
func (ec *EllipseColor) Delete() {
|
||||||
|
ec.va.Delete()
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue