diff --git a/blooDot.vcxproj b/blooDot.vcxproj
index 817fd17..12360b7 100644
--- a/blooDot.vcxproj
+++ b/blooDot.vcxproj
@@ -188,7 +188,7 @@
false
- version.lib;dinput8.lib;dxguid.lib;user32.lib;gdi32.lib;winmm.lib;imm32.lib;ole32.lib;oleaut32.lib;shell32.lib;uuid.lib;iconv.lib;advapi32.lib;setupapi.lib
+ version.lib;dinput8.lib;dxguid.lib;user32.lib;gdi32.lib;winmm.lib;imm32.lib;ole32.lib;oleaut32.lib;shell32.lib;uuid.lib;iconv.lib;advapi32.lib;setupapi.lib;opengl32.lib
false
false
@@ -240,7 +240,7 @@
true
true
false
- version.lib;dinput8.lib;dxguid.lib;user32.lib;gdi32.lib;winmm.lib;imm32.lib;ole32.lib;oleaut32.lib;shell32.lib;uuid.lib;iconv.lib;advapi32.lib;setupapi.lib
+ version.lib;dinput8.lib;dxguid.lib;user32.lib;gdi32.lib;winmm.lib;imm32.lib;ole32.lib;oleaut32.lib;shell32.lib;uuid.lib;iconv.lib;advapi32.lib;setupapi.lib;opengl32.lib
@@ -492,6 +492,7 @@
+
true
false
@@ -500,6 +501,7 @@
true
false
+
diff --git a/blooDot.vcxproj.filters b/blooDot.vcxproj.filters
index f147f45..e7af448 100644
--- a/blooDot.vcxproj.filters
+++ b/blooDot.vcxproj.filters
@@ -520,6 +520,12 @@
Planning
+
+ Resource Files\shaders
+
+
+ Resource Files\shaders
+
diff --git a/chunk-sizes.h b/chunk-sizes.h
index b49f9d4..005e54b 100644
--- a/chunk-sizes.h
+++ b/chunk-sizes.h
@@ -53,5 +53,5 @@ size_t chunkSizes[] = {
106415, // CHUNK_KEY_DINGS_SNURCH_SNAVIOR_FLOOR
702, // CHUNK_KEY_DINGS_SNURCH_SNAVIOR_COLLISION
882, // CHUNK_KEY_SHADER_VERTEX
- 4648 // CHUNK_KEY_SHADER_FRAGMENT
+ 4873 // CHUNK_KEY_SHADER_FRAGMENT
};
diff --git a/orchestrator.cpp b/orchestrator.cpp
index 08613b5..7a0ba9a 100644
--- a/orchestrator.cpp
+++ b/orchestrator.cpp
@@ -40,8 +40,10 @@ namespace blooDot::Orchestrator
void MainLoop(SDL_Renderer* renderer, SDL_Window* mainWindow)
{
+#ifndef NDEBUG
toggleDebugView = isCreatorMode;
+#endif
if (!InitializeDings())
{
mainRunning = false;
diff --git a/res/fragment.glsl b/res/fragment.glsl
index 899a944..d899628 100644
--- a/res/fragment.glsl
+++ b/res/fragment.glsl
@@ -40,17 +40,24 @@ vec2 res = vec2(640.0,480.0); // /3.0
//------------------------------------------------------------------------
// sRGB to Linear
// Assuming using sRGB typed textures this should not be needed.
-float ToLinear1(float c){return(c<=0.04045)?c/12.92:pow((c+0.055)/1.055,2.4);}
+float ToLinear1(float c)
+{
+ return
+ c <= 0.04045
+ ? c / 12.92
+ : pow((c + 0.055) / 1.055, 2.4);
+}
+
vec3 ToLinear(vec3 c)
{
- return vec3(ToLinear1(c.r),ToLinear1(c.g),ToLinear1(c.b));
+ return vec3(ToLinear1(c.r),ToLinear1(c.g),ToLinear1(c.b));
}
// Linear to sRGB
// Assuming using sRGB typed textures this should not be needed
float ToSrgb1(float c)
{
- return(c<0.0031308?c*12.92:1.055*pow(c,0.41666)-0.055);
+ return(c<0.0031308?c*12.92:1.055*pow(c,0.41666)-0.055);
}
vec3 ToSrgb(vec3 c)
@@ -62,111 +69,135 @@ vec3 ToSrgb(vec3 c)
// Also zeroes off screen
vec3 Fetch(vec2 pos,vec2 off)
{
- pos=floor(pos*res+off)/res;
- if(max(abs(pos.x-0.5),abs(pos.y-0.5))>0.5)return vec3(0.0,0.0,0.0);
- return ToLinear(texture2D(tex0,pos.xy,-16.0).rgb);
+ pos=floor(pos*res+off)/res;
+ if(max(abs(pos.x-0.5),abs(pos.y-0.5))>0.5)
+ {
+ return vec3(0.0,0.0,0.0);
+ }
+
+ return ToLinear(texture2D(tex0,pos.xy,-16.0).rgb);
}
// Distance in emulated pixels to nearest texel
vec2 Dist(vec2 pos)
{
- pos=pos*res;return -((pos-floor(pos))-vec2(0.5));
+ pos=pos*res;
+
+ return -((pos-floor(pos))-vec2(0.5));
}
// 1D Gaussian
float Gaus(float pos,float scale)
{
- return exp2(scale*pos*pos);
+ return exp2(scale*pos*pos);
}
// 3-tap Gaussian filter along horz line
vec3 Horz3(vec2 pos,float off)
{
- vec3 b=Fetch(pos,vec2(-1.0,off));
- vec3 c=Fetch(pos,vec2( 0.0,off));
- vec3 d=Fetch(pos,vec2( 1.0,off));
- float dst=Dist(pos).x;
- // Convert distance to weight
- float scale=hardPix;
- float wb=Gaus(dst-1.0,scale);
- float wc=Gaus(dst+0.0,scale);
- float wd=Gaus(dst+1.0,scale);
- // Return filtered sample
- return (b*wb+c*wc+d*wd)/(wb+wc+wd);
+ vec3 b=Fetch(pos,vec2(-1.0,off));
+ vec3 c=Fetch(pos,vec2( 0.0,off));
+ vec3 d=Fetch(pos,vec2( 1.0,off));
+ float dst=Dist(pos).x;
+ // Convert distance to weight
+ float scale=hardPix;
+ float wb=Gaus(dst-1.0,scale);
+ float wc=Gaus(dst+0.0,scale);
+ float wd=Gaus(dst+1.0,scale);
+
+ // Return filtered sample
+ return (b*wb+c*wc+d*wd)/(wb+wc+wd);
}
// 5-tap Gaussian filter along horz line
vec3 Horz5(vec2 pos,float off)
{
- vec3 a=Fetch(pos,vec2(-2.0,off));
- vec3 b=Fetch(pos,vec2(-1.0,off));
- vec3 c=Fetch(pos,vec2( 0.0,off));
- vec3 d=Fetch(pos,vec2( 1.0,off));
- vec3 e=Fetch(pos,vec2( 2.0,off));
- float dst=Dist(pos).x;
- // Convert distance to weight.
- float scale=hardPix;
- float wa=Gaus(dst-2.0,scale);
- float wb=Gaus(dst-1.0,scale);
- float wc=Gaus(dst+0.0,scale);
- float wd=Gaus(dst+1.0,scale);
- float we=Gaus(dst+2.0,scale);
- // Return filtered sample.
- return (a*wa+b*wb+c*wc+d*wd+e*we)/(wa+wb+wc+wd+we);
+ vec3 a=Fetch(pos,vec2(-2.0,off));
+ vec3 b=Fetch(pos,vec2(-1.0,off));
+ vec3 c=Fetch(pos,vec2( 0.0,off));
+ vec3 d=Fetch(pos,vec2( 1.0,off));
+ vec3 e=Fetch(pos,vec2( 2.0,off));
+ float dst=Dist(pos).x;
+
+ // Convert distance to weight.
+ float scale=hardPix;
+ float wa=Gaus(dst-2.0,scale);
+ float wb=Gaus(dst-1.0,scale);
+ float wc=Gaus(dst+0.0,scale);
+ float wd=Gaus(dst+1.0,scale);
+ float we=Gaus(dst+2.0,scale);
+
+ // Return filtered sample.
+ return (a*wa+b*wb+c*wc+d*wd+e*we)/(wa+wb+wc+wd+we);
}
// Return scanline weight
float Scan(vec2 pos,float off)
{
- float dst=Dist(pos).y;
- return Gaus(dst+off,hardScan);
+ float dst=Dist(pos).y;
+
+ return Gaus(dst+off,hardScan);
}
// Allow nearest three lines to effect pixel.
vec3 Tri(vec2 pos)
{
- vec3 a=Horz3(pos,-1.0);
- vec3 b=Horz5(pos, 0.0);
- vec3 c=Horz3(pos, 1.0);
- float wa=Scan(pos,-1.0);
- float wb=Scan(pos, 0.0);
- float wc=Scan(pos, 1.0);
- return a*wa+b*wb+c*wc;
+ vec3 a=Horz3(pos,-1.0);
+ vec3 b=Horz5(pos, 0.0);
+ vec3 c=Horz3(pos, 1.0);
+ float wa=Scan(pos,-1.0);
+ float wb=Scan(pos, 0.0);
+ float wc=Scan(pos, 1.0);
+
+ return a*wa+b*wb+c*wc;
}
// Distortion of scanlines, and end of screen alpha
vec2 Warp(vec2 pos)
{
- pos=pos*2.0-1.0;
- pos*=vec2(1.0+(pos.y*pos.y)*warp.x,1.0+(pos.x*pos.x)*warp.y);
- return pos*0.5+0.5;
+ pos=pos*2.0-1.0;
+ pos*=vec2(1.0+(pos.y*pos.y)*warp.x,1.0+(pos.x*pos.x)*warp.y);
+
+ return pos*0.5+0.5;
}
// Shadow mask
vec3 Mask(vec2 pos)
{
- pos.x+=pos.y*3.0;
- vec3 mask=vec3(maskDark,maskDark,maskDark);
- pos.x=fract(pos.x/6.0);
- if(pos.x<0.333)mask.r=maskLight;
- else if(pos.x<0.666)mask.g=maskLight;
- else mask.b=maskLight;
- return mask;
+ pos.x+=pos.y*3.0;
+ vec3 mask=vec3(maskDark,maskDark,maskDark);
+ pos.x=fract(pos.x/6.0);
+ if(pos.x<0.333)
+ {
+ mask.r=maskLight;
+ }
+ else if(pos.x<0.666)
+ {
+ mask.g=maskLight;
+ }
+ else
+ {
+ mask.b=maskLight;
+ }
+
+ return mask;
}
// Draw dividing bars
float Bar(float pos,float bar)
{
- pos-=bar;return pos*pos<4.0?0.0:1.0;
+ pos-=bar;
+
+ return pos*pos<4.0?0.0:1.0;
}
// Entry
void main()
{
- // Unmodified
- vec2 pos=Warp(v_texCoord);
- vec4 fragColor;
- fragColor.rgb=Tri(pos)*Mask(gl_FragCoord.xy);
- fragColor.rgb=ToSrgb(fragColor.rgb);
- gl_FragColor=v_color * vec4(fragColor.rgb, 1.0);
+ // Unmodified
+ vec2 pos=Warp(v_texCoord);
+ vec4 fragColor;
+ fragColor.rgb=Tri(pos)*Mask(gl_FragCoord.xy);
+ fragColor.rgb=ToSrgb(fragColor.rgb);
+ gl_FragColor=v_color * vec4(fragColor.rgb, 1.0);
}
\ No newline at end of file
diff --git a/shader-engine.cpp b/shader-engine.cpp
index 036deab..ddea92e 100644
--- a/shader-engine.cpp
+++ b/shader-engine.cpp
@@ -8,6 +8,10 @@
using namespace blooDot::Res;
+///
+/// Original inspiration for this part came from code by Augusto Ruiz
+/// https://github.com/AugustoRuiz/sdl2glsl (MIT Licence)
+///
namespace blooDot::ShaderEngine
{
PFNGLCREATESHADERPROC glCreateShader;
@@ -87,7 +91,11 @@ namespace blooDot::ShaderEngine
{
char* log = (char*)malloc(logLen * sizeof(char));
glGetProgramInfoLog(programId, logLen, &logLen, log);
- std::cout << "Prog Info Log: " << std::endl << log << std::endl;
+ std::cout
+ << "Shader linker output:\n"
+ << log
+ << "\n";
+
free(log);
}
}
@@ -159,14 +167,23 @@ namespace blooDot::ShaderEngine
glGetShaderiv(result, GL_COMPILE_STATUS, &shaderCompiled);
if (shaderCompiled != GL_TRUE)
{
- std::cout << "Error en la compilación: " << result << "!" << std::endl;
+ std::cout
+ << "Failed to compiler shader:\n"
+ << result
+ << "\n";
+
GLint logLength;
glGetShaderiv(result, GL_INFO_LOG_LENGTH, &logLength);
if (logLength > 0)
{
GLchar* log = (GLchar*)malloc(logLength);
+
glGetShaderInfoLog(result, logLength, &logLength, log);
- std::cout << "Shader compile log:" << log << std::endl;
+ std::cout
+ << "Shader compiler output:\n"
+ << log
+ << "\n";
+
free(log);
}
@@ -175,7 +192,7 @@ namespace blooDot::ShaderEngine
}
else
{
- std::cout << "Shader compilado correctamente. Id = " << result << std::endl;
+ std::cout << "Successfully compiled shader #" << result << "\n";
}
return result;