diff --git a/shader/pull/wall.frag b/shader/pull/wall.frag new file mode 100644 index 000000000..1e0a58d26 --- /dev/null +++ b/shader/pull/wall.frag @@ -0,0 +1,19 @@ +#version 450 core +layout (location=0) out vec4 fCol; +layout (location=1) out vec4 fPos; +layout (location=2) out vec4 fNorm; +in vec3 vTexCoords; +in vec4 vPos; +in float vAng; +layout (binding=40) uniform sampler2DArray diffuseSampler; +layout (binding=41) uniform sampler2DArray normalSampler; +vec2 rotateV2 (float a, vec2 v) +{ return vec2(v.x*cos(a) - v.y*sin(a), v.x*sin(a) + v.y*cos(a)); } +void main() +{ + fCol = texture(diffuseSampler,vTexCoords); + fPos = vPos; + vec4 basenorm = texture(normalSampler,vTexCoords) - 0.5; + vec2 n1 = rotateV2(vAng,vec2(basenorm.x,basenorm.z)); + fNorm = vec4(-vec3(n1,basenorm.y),0); +} diff --git a/shader/pull/wall.vert b/shader/pull/wall.vert new file mode 100644 index 000000000..062cdd612 --- /dev/null +++ b/shader/pull/wall.vert @@ -0,0 +1,22 @@ +#version 450 core +struct PosTex { vec4 pospos; vec4 texang; }; +layout (std140, binding = 0) uniform TheMat { mat4 theMat; } ; +layout (std430, binding = 2) readonly buffer Pos { PosTex data[]; }; +out float vAng; +out vec4 vPos; +out vec3 vTexCoords; +int indices[6] = {0,1,3,0,3,2}; +void main() +{ + vec4 texang = data[gl_VertexID / 6].texang; + vec4 pp = data[gl_VertexID / 6].pospos; + int j = indices[gl_VertexID % 6]; + float z = (j > 1.5 ? 100 : 0); + vec2 xy = (j % 2 > 0 ? pp.xy : pp.zw); + vPos = vec4( xy, z, 1); + gl_Position = theMat * vPos; + vAng = texang.y; + float d = distance(pp.xy,pp.zw) / 50; + int jj = j / 2; + vTexCoords = vec3(d * (j % 2), 2 * jj , texang.x); +} diff --git a/shader/pull/window.vert b/shader/pull/window.vert index 442b8ca4f..cc3dc284e 100644 --- a/shader/pull/window.vert +++ b/shader/pull/window.vert @@ -12,5 +12,6 @@ void main() int j = indices[gl_VertexID % 6]; float z = (j > 1.5 ? 5000 : 0); vec2 xy = (j % 2 > 0 ? pp.xy : pp.zw); - gl_Position = theMat * vec4( xy, z, 1); + vPos = vec4( xy, z, 1); + gl_Position = theMat * vPos; } diff --git a/shader/wall/basic.geom b/shader/wall/basic.geom index 8ea2720ef..6398d74fc 100644 --- a/shader/wall/basic.geom +++ b/shader/wall/basic.geom @@ -20,7 +20,6 @@ void main() vec2 d = vec2(p1.xy - p2.xy); float dist = distance(p1xy,p2xy); float tcoordx = dist / 50; - vec4 norm = vec4( d.y, -d.x, 0, 0); gPos = p1; gl_Position = vec4(theMat * p1); gTexCoords = vec3 (0,0,tcoordz); diff --git a/src/Data/Preload/Render.hs b/src/Data/Preload/Render.hs index 3f302eb46..931d623d9 100644 --- a/src/Data/Preload/Render.hs +++ b/src/Data/Preload/Render.hs @@ -19,6 +19,7 @@ data RenderData = RenderData , _alphaDivideShader :: Shader -- , _windowShader :: Shader , _windowPullShader :: Shader + , _pullWallShader :: Shader , _fullscreenShader :: Shader , _transparencyCompShader :: Shader , _bloomBlurShader :: Shader @@ -42,6 +43,7 @@ data RenderData = RenderData , _rboBaseBloom :: GLuint -- RenderbufferObject id , _matUBO :: GLuint -- BufferObject id , _winSSBO :: GLuint + , _wallSSBO :: GLuint -- , _lightsUBO :: GLuint -- BufferObject id , _vboWindows :: VBO , _vboShapes :: VBO diff --git a/src/Dodge/Render.hs b/src/Dodge/Render.hs index db89311d4..c7f13a87d 100644 --- a/src/Dodge/Render.hs +++ b/src/Dodge/Render.hs @@ -113,6 +113,9 @@ doDrawing' win pdata u = do glNamedBufferSubData (pdata ^. winSSBO) 0 (fromIntegral $ nWins * sizeOf (0::Float) * 8) (pdata ^. vboWindows . vboPtr) + glNamedBufferSubData (pdata ^. wallSSBO) 0 + (fromIntegral $ trueNWalls * sizeOf (0::Float) * 8) + (pdata ^. wallVBO . vboPtr) setViewport _gr_world_res cfig glBindFramebuffer GL_FRAMEBUFFER (pdata ^. fboBase . _1 . unFBO) glDepthMask GL_TRUE @@ -162,12 +165,18 @@ doDrawing' win pdata u = do --draw walls onto base buffer glEnable GL_CULL_FACE glCullFace GL_BACK - glUseProgram (pdata ^. wallShader . shaderUINT) - glBindVertexArray $ pdata ^. wallShader . shaderVAO . vaoName +-- glUseProgram (pdata ^. wallShader . shaderUINT) +-- glBindVertexArray $ pdata ^. wallShader . shaderVAO . vaoName +-- glDrawArrays +-- (_unPrimitiveMode $ pdata ^. wallShader . shaderPrimitive) +-- 0 +-- (fromIntegral trueNWalls) + glUseProgram (pdata ^. pullWallShader . shaderUINT) + glBindVertexArray $ pdata ^. dummyVAO . vaoName glDrawArrays - (_unPrimitiveMode $ pdata ^. wallShader . shaderPrimitive) + GL_TRIANGLES 0 - (fromIntegral trueNWalls) + (fromIntegral trueNWalls * 6) --draw object shapes onto base buffer let fs = _shapeShader pdata glUseProgram (_shaderUINT fs) diff --git a/src/Dodge/TestString.hs b/src/Dodge/TestString.hs index 4ac98d240..1b08aff55 100644 --- a/src/Dodge/TestString.hs +++ b/src/Dodge/TestString.hs @@ -32,7 +32,7 @@ import Data.Foldable import Data.Monoid testStringInit :: Universe -> [String] -testStringInit _ = [] +testStringInit u = [show $ length $ u ^. uvWorld . cWorld . lWorld . walls] -- [show $ foldMap (foldMap (Sum . length . (^. seObstacles))) -- $ u ^. uvWorld . cWorld . incGraph] -- foldMap prettyShort $ u ^? uvWorld . cWorld . lWorld . machines . ix 0 . mcType . _McProxSensor diff --git a/src/Preload/Render.hs b/src/Preload/Render.hs index 595b71672..297a24b92 100644 --- a/src/Preload/Render.hs +++ b/src/Preload/Render.hs @@ -41,14 +41,20 @@ preloadRender = do winssbo <- mglCreate glCreateBuffers let winssbosize = sizeOf (0::Float) * 8 * 1024 - glNamedBufferStorage winssbo (fromIntegral winssbosize) nullPtr GL_DYNAMIC_STORAGE_BIT glBindBufferBase GL_SHADER_STORAGE_BUFFER 1 winssbo + wallssbo <- mglCreate glCreateBuffers + let wallssbosize = sizeOf (0::Float) * 8 * 2048 + glNamedBufferStorage wallssbo (fromIntegral wallssbosize) nullPtr GL_DYNAMIC_STORAGE_BIT + glBindBufferBase GL_SHADER_STORAGE_BUFFER 2 wallssbo + dummyvao <- mglCreate glGenVertexArrays winpull <- makeShaderUsingVAO "pull/window" [vert,frag] pmTriangles (VAO dummyvao) + wallpull <- makeShaderUsingVAO "pull/wall" [vert,frag] pmTriangles (VAO dummyvao) + -- setup shape geometry/cap VBO and two VAOs putStrLn "Setup shape VBO, VAO, EBO" shVBO <- setupVBO shapeVerxSize @@ -182,6 +188,7 @@ preloadRender = do , _ceilingStencilShader = ceilingstencilshader -- , _windowShader = windowshader , _windowPullShader = winpull + , _pullWallShader = wallpull , _fullscreenShader = fsShad , _transparencyCompShader = transcompshader , _alphaDivideShader = alphadivideshader @@ -203,6 +210,7 @@ preloadRender = do , _rboBaseBloom = rboBaseBloomName , _matUBO = theUBO , _winSSBO = winssbo + , _wallSSBO = wallssbo -- , _lightsUBO = lightsubo , _vboWindows = winvbo , _vboShapes = shVBO