From 649cffa1e37d4f39b30e45dbcbc87188dc77727c Mon Sep 17 00:00:00 2001 From: Thomas Friedel Date: Sun, 25 Mar 2018 15:42:23 +0200 Subject: [PATCH] clipping fixed --- canvas.go | 5 ++++- paths.go | 26 +++++++++++++++++--------- sdlcanvas/sdlcanvas.go | 2 +- 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/canvas.go b/canvas.go index bde28bb..9ccb115 100644 --- a/canvas.go +++ b/canvas.go @@ -262,7 +262,10 @@ func LoadGL(glimpl GL) (err error) { gli.Enable(gl_BLEND) gli.BlendFunc(gl_SRC_ALPHA, gl_ONE_MINUS_SRC_ALPHA) gli.Enable(gl_STENCIL_TEST) - gli.StencilFunc(gl_EQUAL, 1, 0x00) + gli.StencilMask(0xFF) + gli.Clear(gl_STENCIL_BUFFER_BIT) + gli.StencilOp(gl_KEEP, gl_KEEP, gl_KEEP) + gli.StencilFunc(gl_EQUAL, 0, 0xFF) return } diff --git a/paths.go b/paths.go index fa885dc..c956f99 100644 --- a/paths.go +++ b/paths.go @@ -465,17 +465,12 @@ func (cv *Canvas) Clip() { func (cv *Canvas) clip(path []pathPoint) { cv.activate() - gli.ColorMask(false, false, false, false) - gli.StencilFunc(gl_ALWAYS, 2, 0xFF) - gli.StencilOp(gl_REPLACE, gl_REPLACE, gl_REPLACE) - gli.StencilMask(0x02) - gli.Clear(gl_STENCIL_BUFFER_BIT) - var triBuf [1000]float32 tris := triBuf[:0] tris = append(tris, 0, 0, float32(cv.fw), 0, float32(cv.fw), float32(cv.fh), 0, 0, float32(cv.fw), float32(cv.fh), 0, float32(cv.fh)) + baseLen := len(tris) tris = triangulatePath(path, tris) - if len(tris) > 0 { + if len(tris) <= baseLen { return } @@ -488,10 +483,23 @@ func (cv *Canvas) clip(path []pathPoint) { gli.Uniform2f(sr.canvasSize, float32(cv.fw), float32(cv.fh)) gli.EnableVertexAttribArray(sr.vertex) - gli.DrawArrays(gl_TRIANGLES, 0, 6) - gli.StencilFunc(gl_ALWAYS, 0, 0xFF) + gli.ColorMask(false, false, false, false) + + gli.StencilMask(0x04) + gli.StencilFunc(gl_ALWAYS, 4, 0x04) + gli.StencilOp(gl_REPLACE, gl_REPLACE, gl_REPLACE) gli.DrawArrays(gl_TRIANGLES, 6, int32(len(tris)/2-6)) + gli.StencilMask(0x02) + gli.StencilFunc(gl_EQUAL, 0, 0x06) + gli.StencilOp(gl_KEEP, gl_INVERT, gl_INVERT) + gli.DrawArrays(gl_TRIANGLES, 0, 6) + + gli.StencilMask(0x04) + gli.StencilFunc(gl_ALWAYS, 0, 0x04) + gli.StencilOp(gl_ZERO, gl_ZERO, gl_ZERO) + gli.DrawArrays(gl_TRIANGLES, 0, 6) + gli.DisableVertexAttribArray(sr.vertex) gli.ColorMask(true, true, true, true) diff --git a/sdlcanvas/sdlcanvas.go b/sdlcanvas/sdlcanvas.go index 858da41..94d9690 100644 --- a/sdlcanvas/sdlcanvas.go +++ b/sdlcanvas/sdlcanvas.go @@ -38,7 +38,7 @@ func CreateCanvasWindow(w, h int, title string) (*Window, *canvas.Canvas, error) sdl.GL_SetAttribute(sdl.GL_BLUE_SIZE, 8) sdl.GL_SetAttribute(sdl.GL_ALPHA_SIZE, 8) sdl.GL_SetAttribute(sdl.GL_DEPTH_SIZE, 0) - sdl.GL_SetAttribute(sdl.GL_STENCIL_SIZE, 1) + sdl.GL_SetAttribute(sdl.GL_STENCIL_SIZE, 8) sdl.GL_SetAttribute(sdl.GL_DOUBLEBUFFER, 1) sdl.GL_SetAttribute(sdl.GL_MULTISAMPLEBUFFERS, 1) sdl.GL_SetAttribute(sdl.GL_MULTISAMPLESAMPLES, 4)