remove TrianglesContainer + add Append to Triangles
This commit is contained in:
parent
b4c035e2ff
commit
8ec1bdfadf
|
@ -5,15 +5,6 @@ import (
|
||||||
"image/color"
|
"image/color"
|
||||||
)
|
)
|
||||||
|
|
||||||
// TrianglesContainer is an extension of Triangles that can accumulate Triangles inside of it using
|
|
||||||
// the Append method.
|
|
||||||
type TrianglesContainer interface {
|
|
||||||
Triangles
|
|
||||||
|
|
||||||
// Append adds supplied Triangles to the end of the TrianglesContainer.
|
|
||||||
Append(Triangles)
|
|
||||||
}
|
|
||||||
|
|
||||||
// TrianglesData specifies a list of Triangles vertices with three common properties: Position,
|
// TrianglesData specifies a list of Triangles vertices with three common properties: Position,
|
||||||
// Color and Texture.
|
// Color and Texture.
|
||||||
type TrianglesData []struct {
|
type TrianglesData []struct {
|
||||||
|
|
|
@ -44,6 +44,11 @@ type Triangles interface {
|
||||||
// If these Triangles and supplied Triangles have different lengths, these Triangles should
|
// If these Triangles and supplied Triangles have different lengths, these Triangles should
|
||||||
// be resized.
|
// be resized.
|
||||||
Update(Triangles)
|
Update(Triangles)
|
||||||
|
|
||||||
|
// Append adds supplied Triangles to the end of these Triangles.
|
||||||
|
//
|
||||||
|
// Behavior regarding unsupported properties should be same as with Update.
|
||||||
|
Append(Triangles)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Drawer is something that can be drawn onto any Target.
|
// Drawer is something that can be drawn onto any Target.
|
||||||
|
|
53
window.go
53
window.go
|
@ -395,23 +395,9 @@ func (wt *windowTriangles) Draw() {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (wt *windowTriangles) Update(t Triangles) {
|
func (wt *windowTriangles) updateData(offset int, t Triangles) {
|
||||||
if t.Len() > wt.Len() {
|
|
||||||
newData := make([]pixelgl.VertexData, t.Len()-wt.Len())
|
|
||||||
// default values
|
|
||||||
for i := range newData {
|
|
||||||
newData[i] = make(pixelgl.VertexData)
|
|
||||||
newData[i][colorVec4] = mgl32.Vec4{1, 1, 1, 1}
|
|
||||||
newData[i][textureVec2] = mgl32.Vec2{-1, -1}
|
|
||||||
}
|
|
||||||
wt.data = append(wt.data, newData...)
|
|
||||||
}
|
|
||||||
if t.Len() < wt.Len() {
|
|
||||||
wt.data = wt.data[:t.Len()]
|
|
||||||
}
|
|
||||||
|
|
||||||
if t, ok := t.(TrianglesPosition); ok {
|
if t, ok := t.(TrianglesPosition); ok {
|
||||||
for i := range wt.data {
|
for i := offset; i < offset+t.Len(); i++ {
|
||||||
pos := t.Position(i)
|
pos := t.Position(i)
|
||||||
wt.data[i][positionVec2] = mgl32.Vec2{
|
wt.data[i][positionVec2] = mgl32.Vec2{
|
||||||
float32(pos.X()),
|
float32(pos.X()),
|
||||||
|
@ -420,7 +406,7 @@ func (wt *windowTriangles) Update(t Triangles) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if t, ok := t.(TrianglesColor); ok {
|
if t, ok := t.(TrianglesColor); ok {
|
||||||
for i := range wt.data {
|
for i := offset; i < offset+t.Len(); i++ {
|
||||||
col := NRGBAModel.Convert(t.Color(i)).(NRGBA)
|
col := NRGBAModel.Convert(t.Color(i)).(NRGBA)
|
||||||
wt.data[i][colorVec4] = mgl32.Vec4{
|
wt.data[i][colorVec4] = mgl32.Vec4{
|
||||||
float32(col.R),
|
float32(col.R),
|
||||||
|
@ -431,7 +417,7 @@ func (wt *windowTriangles) Update(t Triangles) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if t, ok := t.(TrianglesTexture); ok {
|
if t, ok := t.(TrianglesTexture); ok {
|
||||||
for i := range wt.data {
|
for i := offset; i < offset+t.Len(); i++ {
|
||||||
tex := t.Texture(i)
|
tex := t.Texture(i)
|
||||||
wt.data[i][textureVec2] = mgl32.Vec2{
|
wt.data[i][textureVec2] = mgl32.Vec2{
|
||||||
float32(tex.X()),
|
float32(tex.X()),
|
||||||
|
@ -439,8 +425,25 @@ func (wt *windowTriangles) Update(t Triangles) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// submit data to vertex slice
|
func (wt *windowTriangles) resize(len int) {
|
||||||
|
if len > wt.Len() {
|
||||||
|
newData := make([]pixelgl.VertexData, len-wt.Len())
|
||||||
|
// default values
|
||||||
|
for i := range newData {
|
||||||
|
newData[i] = make(pixelgl.VertexData)
|
||||||
|
newData[i][colorVec4] = mgl32.Vec4{1, 1, 1, 1}
|
||||||
|
newData[i][textureVec2] = mgl32.Vec2{-1, -1}
|
||||||
|
}
|
||||||
|
wt.data = append(wt.data, newData...)
|
||||||
|
}
|
||||||
|
if len < wt.Len() {
|
||||||
|
wt.data = wt.data[:len]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (wt *windowTriangles) submitData() {
|
||||||
data := wt.data // avoid race condition
|
data := wt.data // avoid race condition
|
||||||
pixelgl.DoNoBlock(func() {
|
pixelgl.DoNoBlock(func() {
|
||||||
wt.vs.Begin()
|
wt.vs.Begin()
|
||||||
|
@ -455,6 +458,18 @@ func (wt *windowTriangles) Update(t Triangles) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (wt *windowTriangles) Update(t Triangles) {
|
||||||
|
wt.resize(t.Len())
|
||||||
|
wt.updateData(0, t)
|
||||||
|
wt.submitData()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (wt *windowTriangles) Append(t Triangles) {
|
||||||
|
wt.resize(wt.Len() + t.Len())
|
||||||
|
wt.updateData(wt.Len()-t.Len(), t)
|
||||||
|
wt.submitData()
|
||||||
|
}
|
||||||
|
|
||||||
func (wt *windowTriangles) Position(i int) Vec {
|
func (wt *windowTriangles) Position(i int) Vec {
|
||||||
v := wt.data[i][positionVec2].(mgl32.Vec2)
|
v := wt.data[i][positionVec2].(mgl32.Vec2)
|
||||||
return V(float64(v.X()), float64(v.Y()))
|
return V(float64(v.X()), float64(v.Y()))
|
||||||
|
|
Loading…
Reference in New Issue