path points are now transformed by the transformation matrix as they are added

This commit is contained in:
Thomas Friedel 2018-02-05 19:53:10 +01:00
parent 3ead983efa
commit 0bd060ae1b
4 changed files with 35 additions and 22 deletions

View file

@ -27,6 +27,7 @@ type Canvas struct {
type pathPoint struct { type pathPoint struct {
pos lm.Vec2 pos lm.Vec2
tf lm.Vec2
move bool move bool
next lm.Vec2 next lm.Vec2
attach bool attach bool
@ -94,7 +95,16 @@ func (cv *Canvas) ptToGL(x, y float32) (fx, fy float32) {
} }
func (cv *Canvas) vecToGL(v lm.Vec2) (fx, fy float32) { func (cv *Canvas) vecToGL(v lm.Vec2) (fx, fy float32) {
return v[0]*2/cv.fw - 1, -v[1]*2/cv.fh + 1
}
func (cv *Canvas) tf(v lm.Vec2) lm.Vec2 {
v, _ = v.MulMat3x3(cv.state.transform) v, _ = v.MulMat3x3(cv.state.transform)
return v
}
func (cv *Canvas) tfToGL(x, y float32) (fx, fy float32) {
v := cv.tf(lm.Vec2{x, y})
return v[0]*2/cv.fw - 1, -v[1]*2/cv.fh + 1 return v[0]*2/cv.fw - 1, -v[1]*2/cv.fh + 1
} }
@ -304,10 +314,10 @@ func (cv *Canvas) FillRect(x, y, w, h float32) {
gli.UseProgram(sr.id) gli.UseProgram(sr.id)
x0f, y0f := cv.ptToGL(x, y) x0f, y0f := cv.tfToGL(x, y)
x1f, y1f := cv.ptToGL(x, y+h) x1f, y1f := cv.tfToGL(x, y+h)
x2f, y2f := cv.ptToGL(x+w, y+h) x2f, y2f := cv.tfToGL(x+w, y+h)
x3f, y3f := cv.ptToGL(x+w, y) x3f, y3f := cv.tfToGL(x+w, y)
gli.BindBuffer(gl_ARRAY_BUFFER, buf) gli.BindBuffer(gl_ARRAY_BUFFER, buf)
data := [8]float32{x0f, y0f, x1f, y1f, x2f, y2f, x3f, y3f} data := [8]float32{x0f, y0f, x1f, y1f, x2f, y2f, x3f, y3f}

View file

@ -158,10 +158,10 @@ func (cv *Canvas) DrawImage(img *Image, coords ...float32) {
dw, dh = coords[6], coords[7] dw, dh = coords[6], coords[7]
} }
dx0, dy0 := cv.ptToGL(dx, dy) dx0, dy0 := cv.tfToGL(dx, dy)
dx1, dy1 := cv.ptToGL(dx, dy+dh) dx1, dy1 := cv.tfToGL(dx, dy+dh)
dx2, dy2 := cv.ptToGL(dx+dw, dy+dh) dx2, dy2 := cv.tfToGL(dx+dw, dy+dh)
dx3, dy3 := cv.ptToGL(dx+dw, dy) dx3, dy3 := cv.tfToGL(dx+dw, dy)
sx /= float32(img.w) sx /= float32(img.w)
sy /= float32(img.h) sy /= float32(img.h)
sw /= float32(img.w) sw /= float32(img.w)

View file

@ -20,8 +20,9 @@ func (cv *Canvas) BeginPath() {
} }
func (cv *Canvas) MoveTo(x, y float32) { func (cv *Canvas) MoveTo(x, y float32) {
cv.linePath = append(cv.linePath, pathPoint{pos: lm.Vec2{x, y}, move: true}) tf := cv.tf(lm.Vec2{x, y})
cv.polyPath = append(cv.polyPath, pathPoint{pos: lm.Vec2{x, y}, move: true}) cv.linePath = append(cv.linePath, pathPoint{pos: lm.Vec2{x, y}, tf: tf, move: true})
cv.polyPath = append(cv.polyPath, pathPoint{pos: lm.Vec2{x, y}, tf: tf, move: true})
} }
func (cv *Canvas) LineTo(x, y float32) { func (cv *Canvas) LineTo(x, y float32) {
@ -52,24 +53,26 @@ func (cv *Canvas) LineTo(x, y float32) {
} }
if draw { if draw {
cv.linePath[len(cv.linePath)-1].next = p cv.linePath[len(cv.linePath)-1].next = cv.tf(p)
cv.linePath[len(cv.linePath)-1].attach = true cv.linePath[len(cv.linePath)-1].attach = true
cv.linePath = append(cv.linePath, pathPoint{pos: p, move: false}) cv.linePath = append(cv.linePath, pathPoint{pos: p, tf: cv.tf(p), move: false})
} else { } else {
cv.linePath = append(cv.linePath, pathPoint{pos: p, move: true}) cv.linePath = append(cv.linePath, pathPoint{pos: p, tf: cv.tf(p), move: true})
} }
lp = p lp = p
v = tp.Sub(lp) v = tp.Sub(lp)
} }
} else { } else {
cv.linePath[len(cv.linePath)-1].next = lm.Vec2{x, y} tf := cv.tf(lm.Vec2{x, y})
cv.linePath[len(cv.linePath)-1].next = tf
cv.linePath[len(cv.linePath)-1].attach = true cv.linePath[len(cv.linePath)-1].attach = true
cv.linePath = append(cv.linePath, pathPoint{pos: lm.Vec2{x, y}, move: false}) cv.linePath = append(cv.linePath, pathPoint{pos: lm.Vec2{x, y}, tf: tf, move: false})
} }
cv.polyPath[len(cv.polyPath)-1].next = lm.Vec2{x, y} tf := cv.tf(lm.Vec2{x, y})
cv.polyPath[len(cv.polyPath)-1].next = tf
cv.polyPath[len(cv.polyPath)-1].attach = true cv.polyPath[len(cv.polyPath)-1].attach = true
cv.polyPath = append(cv.polyPath, pathPoint{pos: lm.Vec2{x, y}, move: false}) cv.polyPath = append(cv.polyPath, pathPoint{pos: lm.Vec2{x, y}, tf: tf, move: false})
} }
func (cv *Canvas) Arc(x, y, radius, startAngle, endAngle float32, anticlockwise bool) { func (cv *Canvas) Arc(x, y, radius, startAngle, endAngle float32, anticlockwise bool) {
@ -105,10 +108,10 @@ func (cv *Canvas) ClosePath() {
} }
cv.linePath[len(cv.linePath)-1].next = cv.linePath[0].pos cv.linePath[len(cv.linePath)-1].next = cv.linePath[0].pos
cv.linePath[len(cv.linePath)-1].attach = true cv.linePath[len(cv.linePath)-1].attach = true
cv.linePath = append(cv.linePath, pathPoint{pos: cv.linePath[0].pos, move: false, next: cv.linePath[1].pos, attach: true}) cv.linePath = append(cv.linePath, pathPoint{pos: cv.linePath[0].pos, move: false, tf: cv.linePath[0].tf, next: cv.linePath[1].pos, attach: true})
cv.polyPath[len(cv.polyPath)-1].next = cv.polyPath[0].pos cv.polyPath[len(cv.polyPath)-1].next = cv.polyPath[0].pos
cv.polyPath[len(cv.polyPath)-1].attach = true cv.polyPath[len(cv.polyPath)-1].attach = true
cv.polyPath = append(cv.polyPath, pathPoint{pos: cv.polyPath[0].pos, move: false, next: cv.polyPath[1].pos, attach: true}) cv.polyPath = append(cv.polyPath, pathPoint{pos: cv.polyPath[0].pos, move: false, tf: cv.linePath[0].tf, next: cv.polyPath[1].pos, attach: true})
} }
func (cv *Canvas) Stroke() { func (cv *Canvas) Stroke() {
@ -138,11 +141,11 @@ func (cv *Canvas) Stroke() {
var p0 lm.Vec2 var p0 lm.Vec2
for _, p := range cv.linePath { for _, p := range cv.linePath {
if p.move { if p.move {
p0 = p.pos p0 = p.tf
start = true start = true
continue continue
} }
p1 := p.pos p1 := p.tf
v0 := p1.Sub(p0).Norm() v0 := p1.Sub(p0).Norm()
v1 := lm.Vec2{v0[1], -v0[0]}.MulF(cv.state.stroke.lineWidth * 0.5) v1 := lm.Vec2{v0[1], -v0[0]}.MulF(cv.state.stroke.lineWidth * 0.5)

View file

@ -65,7 +65,7 @@ func triangulatePath(path []pathPoint, target []float32) []float32 {
var buf [500]lm.Vec2 var buf [500]lm.Vec2
polygon := buf[:0] polygon := buf[:0]
for _, p := range path { for _, p := range path {
polygon = append(polygon, p.pos) polygon = append(polygon, p.tf)
} }
for len(polygon) > 2 { for len(polygon) > 2 {