From 8f3b5d0bfe5a5ca85eca52323abb2c082af0981b Mon Sep 17 00:00:00 2001 From: jgk Date: Sat, 13 Mar 2021 12:58:20 +0100 Subject: [PATCH] Determine bug in bezier curve rendering --- shader/bezierQuad.geom | 31 ++++++++++++++++++++++--------- src/Dodge/Critters.hs | 1 - src/Dodge/Rendering.hs | 2 +- src/Dodge/Rooms.hs | 2 +- src/Picture.hs | 23 +++++++++++++---------- 5 files changed, 37 insertions(+), 22 deletions(-) diff --git a/shader/bezierQuad.geom b/shader/bezierQuad.geom index 6c0c97f1f..efa778b7a 100644 --- a/shader/bezierQuad.geom +++ b/shader/bezierQuad.geom @@ -1,6 +1,6 @@ #version 430 core layout (triangles) in; -layout (triangle_strip, max_vertices = 4) out; +layout (triangle_strip, max_vertices = 5) out; in vec4 vColor[]; in float vRad[]; out vec4 gColor; @@ -8,8 +8,11 @@ out float gRadStart; out float gRadEnd; out vec3 gBoundingBox; -vec3 normV (vec3 v) -{ return vec3(v.y,-v.x,v.z) ; +vec2 normV2 (vec2 v) +{ return vec2(-v.y,v.x) ; +} +float lhs (vec2 da, vec2 db) +{ return sign(dot(da, normV2(db))) ; } void main() @@ -21,21 +24,31 @@ void main() gRadStart = vRad[0]; gRadEnd = vRad[2]; + vec2 ab = (pa.xy - pb.xy); + vec2 cb = (pc.xy - pb.xy); + float dir = lhs( cb,ab); + gBoundingBox = vec3 (0.9,0.1,0); + gColor = vColor[0]; + gl_Position = vec4 (pa.xy + dir * 2 * gRadStart * normV2(ab) , pa.z , 1); + EmitVertex(); + gBoundingBox = vec3 (0.1,0.9,0); + gColor = vColor[2]; +// gl_Position = vec4 (pc.xy + dir * gRadEnd * (normV2 (pb.xy-pc.xy)), pa.z , 1); + gl_Position = vec4 (pc.xy - dir * 2 * gRadEnd * normV2(cb) , pc.z , 1); + EmitVertex(); gBoundingBox = vec3 (1,0,1); gColor = vColor[0]; - gl_Position = vec4 (pa + normV (pa-pb) , 1); - EmitVertex(); gl_Position = vec4 (pa, 1); EmitVertex(); - gBoundingBox = vec3 (0,0,0); - gColor = vColor[1]; - gl_Position = vec4 (pb, 1); - EmitVertex(); gBoundingBox = vec3 (0,1,1); gColor = vColor[2]; gl_Position = vec4 (pc, 1); EmitVertex(); + gBoundingBox = vec3 (0,0,0); + gColor = vColor[1]; + gl_Position = vec4 (pb, 1); + EmitVertex(); EndPrimitive(); } diff --git a/src/Dodge/Critters.hs b/src/Dodge/Critters.hs index df9827288..d9701afc1 100644 --- a/src/Dodge/Critters.hs +++ b/src/Dodge/Critters.hs @@ -364,7 +364,6 @@ startCr = basicCreature ,hvAutoGun ,teslaGun ,latchkey 0 - ,frontArmour ,miniGun ,medkit 50 ,bezierGun diff --git a/src/Dodge/Rendering.hs b/src/Dodge/Rendering.hs index ca187e2d3..eb94d2303 100644 --- a/src/Dodge/Rendering.hs +++ b/src/Dodge/Rendering.hs @@ -122,7 +122,7 @@ worldPictures w testPic :: World -> [Picture] testPic w = --[blank] - [setLayer 1 $ onLayerL [99] $ bezierQuad white red 20 50 (-200,0) (0,0) (200,50) ] + [setLayer 1 $ onLayerL [99] $ bezierQuad white red 20 20 (00,00) (200,200) (200,000) ] -- $ uncurry translate (mouseWorldPos w) diff --git a/src/Dodge/Rooms.hs b/src/Dodge/Rooms.hs index b14d4fa6a..4b3d87015 100644 --- a/src/Dodge/Rooms.hs +++ b/src/Dodge/Rooms.hs @@ -548,7 +548,7 @@ deadEndRoom = Room ] , _rmLinks = lnks , _rmPath = [] - , _rmPS = [PS (0,-10) 0 basicLS] + , _rmPS = [PS (0,-20) 0 basicLS] , _rmBound = rectNSWE 20 (-20) (-30) 30 } where lnks = [((0,30) ,0) diff --git a/src/Picture.hs b/src/Picture.hs index 3570db576..60d7d629c 100644 --- a/src/Picture.hs +++ b/src/Picture.hs @@ -70,19 +70,22 @@ polygonCol :: [(Point2,RGBA)] -> Picture polygonCol = PolygonCol 0 -- note that much of work computing the width of the bezier curve is done here --- not sure that moving the control point does much... bezierQuad :: Color -> Color -> Float -> Float -> Point2 -> Point2 -> Point2 -> Picture bezierQuad cola colc ra rc a b c = BezierQuad 0 [(aX,cola ,raX) - ,(bx,mixColors 0.5 0.5 cola colc,1) + ,(bX,mixColors 0.5 0.5 cola colc,1) ,(cX,colc ,rcX)] - where v = a -.- c - nv = normalizeV v - aX = a +.+ ra * 0.5 *.* nv - cX = c -.- rc * 0.5 *.* nv - raX = ra / magV (aX -.- cX) - rcX = rc / magV (aX -.- cX) - bx = b +.+ (0.5 * ra *.* normalizeV (b -.- a)) - +.+ (0.5 * rc *.* normalizeV (b -.- c)) + where b2a | isLHS a b c = b -.- a + | otherwise = a -.- b + nb2a = normalizeV $ vNormal b2a + aX = a +.+ ra * 0.5 *.* nb2a + b2c | isLHS a b c = c -.- b + | otherwise = b -.- c + nb2c = normalizeV $ vNormal b2c + cX = c +.+ rc * 0.5 *.* nb2c + raX = ra / magV (aX -.- bX) + rcX = rc / magV (cX -.- bX) + bX = b +.+ (0.5 * ra *.* nb2a) + +.+ (0.5 * rc *.* nb2c) color :: RGBA -> Picture -> Picture {-# INLINE color #-}