From 1c5600293b44f4259391c7bc20103623ccba8447 Mon Sep 17 00:00:00 2001 From: Ketmar Dark Date: Fri, 1 Apr 2016 23:13:36 +0300 Subject: [PATCH] light system seems to work again --- data/scripts/maps/map01.dacs | 5 ++--- data/shaders/srlight_blur.frag | 11 ++++++++--- data/shaders/srlight_blur_occ.frag | 40 ++++++++++++++++++++++++++++++++++---- render.d | 18 +++++++++++------ 4 files changed, 58 insertions(+), 16 deletions(-) diff --git a/data/scripts/maps/map01.dacs b/data/scripts/maps/map01.dacs index 8fadb92..f8d5d1c 100644 --- a/data/scripts/maps/map01.dacs +++ b/data/scripts/maps/map01.dacs @@ -26,7 +26,8 @@ import stdlib; const LYOfs = 1; void putStaticLights () { -/+ + //miscAmbientlight.spawn(0, 0, 800, 800, 64); return; + miscLevellight.spawn( 27, 391-0+LYOfs, 255, 100); miscLevellight.spawn(542, 424-0+LYOfs, 255, 100); miscLevellight.spawn(377, 368-0+LYOfs, 255, 32); @@ -45,8 +46,6 @@ void putStaticLights () { //miscAmbientlight.spawn(10, 10, 550, 150, 255); //miscAmbientlight.spawn(10, 10, 550, 350, 128, 0, 0); -+/ - miscAmbientlight.spawn(0, 0, 800, 800, 64); } diff --git a/data/shaders/srlight_blur.frag b/data/shaders/srlight_blur.frag index 547954d..9dc5643 100644 --- a/data/shaders/srlight_blur.frag +++ b/data/shaders/srlight_blur.frag @@ -45,9 +45,14 @@ void main (void) { // don't even ask me! vec2 btxy = vec2(lightPos.x+gl_FragCoord.x, lightPos.y+gl_TexCoord[0].y*lightTexSize.x); btxy.y = mapPixSize.y-btxy.y; + btxy /= mapPixSize; + vec2 ocxy = vec2(btxy.x, 1.0-btxy.y); vec4 color; - { + if (texture2D(texOcc, ocxy).a > 0.75) { + // occluder hit, this will take care of lighted walls (we'll fix wall in next pass) + color = vec4(0.0, 0.0, 0.0, 0.0); + } else { float ltsxi = 1.0/lightTexSize.x; // rectangular to polar @@ -89,7 +94,7 @@ void main (void) { if (lit == 0.0) { #ifdef DEBUG_RECT - color = texture2D(texBg, btxy/mapPixSize); + color = texture2D(texBg, btxy); color.b = 1.0; color.a = 0.4; #else @@ -97,7 +102,7 @@ void main (void) { #endif } else { // has some light here - vec4 bcolor = texture2D(texBg, btxy/mapPixSize); + vec4 bcolor = texture2D(texBg, btxy); #ifdef DEBUG_RECT color = bcolor; color.b = 1.0; diff --git a/data/shaders/srlight_blur_occ.frag b/data/shaders/srlight_blur_occ.frag index 5614fe9..de47a4f 100644 --- a/data/shaders/srlight_blur_occ.frag +++ b/data/shaders/srlight_blur_occ.frag @@ -17,6 +17,8 @@ */ #version 130 +//#define DEBUG_RECT + #define PI 3.1415926 #define SEARCH_RADIUS (4) @@ -25,7 +27,7 @@ uniform sampler2D texLMap; // light texture of lightTexSize uniform sampler2D texBg; // background uniform sampler2D texOcc; // occluders -uniform vec2 lightTexSize; +uniform vec2 lightTexSize; // x: lightSize; y: size of this texture uniform vec2 mapPixSize; uniform vec4 lightColor; uniform vec2 lightPos; @@ -86,19 +88,48 @@ bool hasLight (in vec2 txo, in float pixelStep) { void main (void) { vec2 vTexCoord0 = gl_TexCoord[0].xy; // in light texture (texLMap) - vec2 btxy = gl_FragCoord.xy/mapPixSize; + //vec2 btxy = gl_FragCoord.xy/mapPixSize; + // don't even ask me! + vec2 btxy = vec2(/*lightPos.x+*/gl_FragCoord.x, /*lightPos.y+gl_TexCoord[0].y*lightTexSize.x*/gl_FragCoord.y); + //btxy.y = mapPixSize.y-btxy.y; + btxy /= mapPixSize; vec2 ocxy = vec2(btxy.x, 1.0-btxy.y); vec4 color; +#ifdef DEBUG_RECT + vec4 bcolor = texture2D(texBg, btxy); + color = bcolor; + color.b = 1.0; + color.a = 0.4; + //if (texture2D(texOcc, ocxy).a <= 0.75) color.a = 0.1; + + vec2 ourpos = gl_FragCoord.xy; + ourpos.y = mapPixSize.y-ourpos.y; + // distance from this point to light origin + float lit = clamp(1.0-(distance(ourpos, lightPos)/(lightTexSize.x/2.0)), 0.0, 1.0); + lit = smoothstep(0.1, 1.0, lit); + color.a = lit; + + //if (texture2D(texOcc, ocxy).a <= 0.75) discard; // empty space + //float pixelStep = 1.0/lightTexSize.x; + //if (!hasLight(vTexCoord0, pixelStep)) discard; + /* + color.r = vTexCoord0.x; + color.g = 0; + color.b = 0; + color.a = 1.0; + */ +#else if (texture2D(texOcc, ocxy).a <= 0.75) discard; // empty space // occluder hit; look for light in 8px radius - float pixelStep = 1.0/lightTexSize.x; + float pixelStep = 1.0/lightTexSize.y; if (!hasLight(vTexCoord0, pixelStep)) discard; // background vec4 bcolor = texture2D(texBg, btxy); // light is y-mirrored - vec2 ourpos = vec2(gl_FragCoord.x, mapPixSize.y-gl_FragCoord.y-1.0); + vec2 ourpos = gl_FragCoord.xy; + ourpos.y = mapPixSize.y-ourpos.y; // distance from this point to light origin float lit = clamp(1.0-(distance(ourpos, lightPos)/(lightTexSize.x/2.0)), 0.0, 1.0); lit = smoothstep(0.1, 1.0, lit); @@ -109,5 +140,6 @@ void main (void) { color += bcolor*lit; color.a = lit/2.0; } +#endif gl_FragColor = color; } diff --git a/render.d b/render.d index b94db55..5aeb66d 100644 --- a/render.d +++ b/render.d @@ -483,9 +483,8 @@ void renderLight() (int lightX, int lightY, in auto ref SVec4F lcol, int lightRa glBlendFunc(GL_SRC_ALPHA, GL_ONE); orthoCamera(fboLevelLight.tex.width, fboLevelLight.tex.height); //drawAtXY(fboOccluders.tex, lightX-lightRadius, lightY-lightRadius, mirrorY:true); - float occs = 1.0f-1.0f*lightSize/(MaxLightRadius*2); float occe = 1.0f*lightSize/(MaxLightRadius*2); - //occe = 1.0f; + float occs = 1.0f-occe; int x0 = lightX-lightRadius+0; int y1 = lightY-lightRadius+0; int x1 = lightX+lightRadius-1+1; @@ -508,14 +507,21 @@ void renderLight() (int lightX, int lightY, in auto ref SVec4F lcol, int lightRa glRectf(x0, y0, x1, y1); */ // and blend it again, with the shader that will touch only occluders - /* shadBlurOcc.exec((Shader shad) { - shad["lightTexSize"] = SVec2F(lightSize, lightSize); + //shad["lightTexSize"] = SVec2F(lightSize, lightSize); + shad["lightTexSize"] = SVec2F(lightSize, fboOccluders.tex.height); shad["lightColor"] = SVec4F(lcol.x, lcol.y, lcol.z, lcol.w); shad["lightPos"] = SVec2F(lightX, lightY); - drawAtXY(fboOccluders.tex.tid, lightX-lightRadius, lightY-lightRadius, lightSize, lightSize, mirrorY:true); + //shad["lightPos"] = SVec2F(lightX-lightRadius, lightY-lightRadius); + glBindTexture(GL_TEXTURE_2D, fboOccluders.tex.tid); + glBegin(GL_QUADS); + glTexCoord2f(0.0f, occs); glVertex2i(x0, y0); // top-left + glTexCoord2f(occe, occs); glVertex2i(x1, y0); // top-right + glTexCoord2f(occe, 1.0f); glVertex2i(x1, y1); // bottom-right + glTexCoord2f(0.0f, 1.0f); glVertex2i(x0, y1); // bottom-left + glEnd(); + //drawAtXY(fboOccluders.tex.tid, lightX-lightRadius, lightY-lightRadius, lightSize, lightSize, mirrorY:true); }); - */ }); } -- 2.11.4.GIT