diff --git a/shader/texture/barrel.frag b/shader/texture/barrel.frag index e06fd6f45..4125f13b5 100644 --- a/shader/texture/barrel.frag +++ b/shader/texture/barrel.frag @@ -1,12 +1,11 @@ #version 450 core in vec2 texPos; -in vec2 distmask; -in vec2 pinch; +in vec2 distmask[2]; +in vec2 pinch[2]; out vec4 fColor; layout (binding = 1) uniform sampler2D screenTexture; -float x = 1 - min(1, sqrt(distance(distmask,vec2(0,0)))); -float xab = abs(distmask.x); -float yab = abs(distmask.y); +float x = 1 - min(1, sqrt(distance(distmask[0],vec2(0,0)))); +//float x = 1 - min(1, dot(distmask,distmask)); vec3 toYUV (vec3 rgb) { return rgb * mat3 ( 0.299 , 0.587 , 0.114 @@ -23,14 +22,12 @@ vec3 toRGB (vec3 yuv) } void main() { - fColor = texture(screenTexture, (texPos + x * pinch)); - //fColor = texture(screenTexture, (texPos + x*pinch)); - //fColor = texture(screenTexture, (texPos + x*pinch)); -// fColor = vec4 -// ( texture(screenTexture, (texPos + x*pinch)).r -// , texture(screenTexture, (texPos + x*(-pinch))).g -// , texture(screenTexture, texPos).ba -// ) ; + float y = 1 - min(1, sqrt(distance(distmask[1],vec2(0,0)))); + fColor = texture(screenTexture + , (texPos + x * pinch[0] + + y * pinch[1] + )); +} // fColor = vec4 // ( toRGB(vec3( toYUV(texture(screenTexture, texPos).rgb).r // , toYUV(texture(screenTexture, (texPos + x*pinch)).rgb).g @@ -38,4 +35,3 @@ void main() // ) ) // , 1 // ) ; -} diff --git a/shader/texture/barrel.vert b/shader/texture/barrel.vert index f51725bc3..cc927f422 100644 --- a/shader/texture/barrel.vert +++ b/shader/texture/barrel.vert @@ -3,8 +3,8 @@ struct DataS { vec2 pos; vec2 v1; vec2 v2; vec2 t1; vec2 t2; vec2 t3; }; layout (std430, binding = 9) readonly buffer Data { DataS data[]; }; layout (std140, binding = 0) uniform TheMat { mat4 theMat; } ; out vec2 texPos; -out vec2 distmask; -out vec2 pinch; +out vec2 distmask[2]; +out vec2 pinch[2]; const int ks[6] = {0,1,2 // 2--3 ,2,1,3 // | | @@ -31,12 +31,14 @@ mat4 toTransMat (vec2 p) void main() { int k = ks[gl_VertexID]; - DataS thedata = data[gl_VertexID/6]; - vec4 off = theMat * vec4(data[gl_VertexID/6].pos, 0,1); + for(int i = 0; i < 2; ++i) + { + vec4 off = theMat * vec4(data[i + gl_VertexID/6].pos, 0,1); + DataS thedata = data[i + gl_VertexID/6]; vec2 r1 = f(thedata.v1); vec2 r2 = f(thedata.v2); mat2 distT = inverse (mat2(r1,r2)); - distmask = distT * (cs[k] - off.xy); + distmask[i] = (distT * (cs[k] - off.xy)); vec4 pinchx = theMat * toTransMat(thedata.t3) * toTransMat(thedata.pos) @@ -49,7 +51,8 @@ void main() * inverse(toTransMat(thedata.pos)) * inverse(theMat) * (vec4(cs[k],0,1)); - pinch = ncToTex(pinchx.xy) - ncToTex(cs[k]); + pinch[i] = ncToTex(pinchx.xy) - ncToTex(cs[k]); + } texPos = ncToTex(cs[k]); gl_Position = vec4 (cs[k],0,1); } diff --git a/src/Dodge/Data/Distortion.hs b/src/Dodge/Data/Distortion.hs index ce9636ea1..1308f1792 100644 --- a/src/Dodge/Data/Distortion.hs +++ b/src/Dodge/Data/Distortion.hs @@ -3,14 +3,21 @@ module Dodge.Data.Distortion where +import Control.Lens import Geometry import Data.Aeson import Data.Aeson.TH data Distortion = RadialDistortion - Point2 Point2 Point2 - Point2 Point2 Point2 - Int + { _rdPos :: Point2 + , _rdDist1 :: Point2 + , _rdDist2 :: Point2 + , _rdT1 :: Point2 + , _rdT2 :: Point2 + , _rdT3 :: Point2 + , _rdTime :: Int + } deriving (Eq, Ord, Show, Read) --Generic, Flat) +makeLenses ''Distortion deriveJSON defaultOptions ''Distortion diff --git a/src/Dodge/Event/Test.hs b/src/Dodge/Event/Test.hs index 3765cf11c..2bfc6d318 100644 --- a/src/Dodge/Event/Test.hs +++ b/src/Dodge/Event/Test.hs @@ -16,8 +16,10 @@ testEvent w = fromMaybe w $ do cpos (V2 distR 0) (V2 0 distR) - (V2 2 0) - (V2 0 0.5) - (V2 0 0) + (V2 1 (-1)) + (V2 1 1) + (V2 distR 0) 20 - return $ w & cWorld . lWorld . distortions .~ [distortionBulge] + return $ w & cWorld . lWorld . distortions .~ [distortionBulge + , distortionBulge & rdPos +~ 50 + ] diff --git a/src/Dodge/Render.hs b/src/Dodge/Render.hs index 758eb11af..790db4355 100644 --- a/src/Dodge/Render.hs +++ b/src/Dodge/Render.hs @@ -367,12 +367,11 @@ doDrawing' win pdata u = do glUseProgram (pdata ^. fullscreenShader) glDrawArrays GL_TRIANGLES 0 6 --(RadialDistortion (V2 a b) (V2 c d) (V2 e f) (V2 g h) _:_) -> do - (RadialDistortion a b c d e f _:_) -> do + rs -> do glBindFramebuffer GL_FRAMEBUFFER (pdata ^. fbo2 . _1 . unFBO) --- pokeArray (pdata ^. barrelShader . _2 . vboPtr) [a, b, c, d, e, f, g, h] - withArray [a, b, c, d, e, f] $ + withArray (concatMap rdToVec2s rs) $ glNamedBufferSubData (pdata ^. barrelShader . _2 . vboName) 0 - (12 * fromIntegral (sizeOf (0 :: Float))) + (12 * fromIntegral (length rs * sizeOf (0 :: Float))) glBindTextureUnit 1 $ pdata ^. fboBase . _2 . _1 . unTO glUseProgram (pdata ^. barrelShader . _1) glDrawArrays GL_TRIANGLES 0 6 @@ -398,6 +397,9 @@ doDrawing' win pdata u = do renderLayer FixedCoordLayer shadV pokeCounts SDL.glSwapWindow win +rdToVec2s :: Distortion -> [Point2] +rdToVec2s (RadialDistortion a b c d e f _) = [a,b,c,d,e,f] + bufferPerspectiveMatrixUBO :: Config -> Camera -> GLuint -> IO () bufferPerspectiveMatrixUBO cfig cam uboid = withArray