directory layout mess.master
@@ -0,0 +1,2 @@ | |||
# Our binaries | |||
neercs |
@@ -0,0 +1,36 @@ | |||
if USE_CACA | |||
noinst_PROGRAMS = neercs | |||
endif | |||
neercs_SOURCES = \ | |||
neercs.cpp neercs.h \ | |||
\ | |||
video/render.cpp video/render.h \ | |||
video/text-render.cpp video/text-render.h \ | |||
video/blurh.lolfx video/blurv.lolfx video/glow.lolfx \ | |||
video/postfx.lolfx video/radial.lolfx video/simple.lolfx \ | |||
video/text.lolfx | |||
neercs_CPPFLAGS = @LOL_CFLAGS@ @PIPI_CFLAGS@ @CACA_CFLAGS@ | |||
neercs_LDADD = | |||
neercs_LDFLAGS = $(top_builddir)/src/liblol.a \ | |||
@LOL_LIBS@ @PIPI_LIBS@ @CACA_LIBS@ @UTIL_LIBS@ @PAM_LIBS@ | |||
neercs_DEPENDENCIES = $(top_builddir)/src/liblol.a | |||
if USE_CACA | |||
all-local: neercs$(EXEEXT) | |||
test $(MAKE_FSELF) = no || make_fself neercs$(EXEEXT) neercs.self | |||
endif | |||
CLEANFILES = $(noinst_PROGRAMS:%$(EXEEXT)=%.self) \ | |||
$(noinst_PROGRAMS:%$(EXEEXT)=%.elf) \ | |||
$(noinst_PROGRAMS:%$(EXEEXT)=%.exe) | |||
SUFFIXES = .lolfx | |||
.lolfx.o: | |||
(echo "char const *"; \ | |||
echo "lolfx_$(notdir $(basename $(filter %.lolfx, $^))) ="; \ | |||
$(SED) 's/"/\\"/g' $(filter %.lolfx, $^) | \ | |||
$(SED) 's/\([^\r]*\).*/"\1\\n"/'; \ | |||
echo ";") | $(CXXCOMPILE) -xc++ -c - -o $@ | |||
@@ -0,0 +1,122 @@ | |||
// | |||
// Neercs | |||
// | |||
// Copyright: (c) 2012 Sam Hocevar <sam@hocevar.net> | |||
// | |||
#if defined HAVE_CONFIG_H | |||
# include "config.h" | |||
#endif | |||
#if defined _WIN32 | |||
# include <direct.h> | |||
#endif | |||
#if defined _XBOX | |||
# define _USE_MATH_DEFINES /* for M_PI */ | |||
# include <xtl.h> | |||
# undef near /* Fuck Microsoft */ | |||
# undef far /* Fuck Microsoft again */ | |||
#elif defined _WIN32 | |||
# define _USE_MATH_DEFINES /* for M_PI */ | |||
# define WIN32_LEAN_AND_MEAN | |||
# include <windows.h> | |||
# undef near /* Fuck Microsoft */ | |||
# undef far /* Fuck Microsoft again */ | |||
#else | |||
# include <cmath> | |||
#endif | |||
#if USE_SDL && defined __APPLE__ | |||
# include <SDL_main.h> | |||
#endif | |||
#include <time.h> | |||
#include <caca.h> | |||
#include "core.h" | |||
#include "loldebug.h" | |||
using namespace std; | |||
using namespace lol; | |||
#include "neercs.h" | |||
#include "video/render.h" | |||
Neercs::Neercs() | |||
: m_ready(false), | |||
m_caca(caca_create_canvas(47, 32)), | |||
m_render(new Render(m_caca)), | |||
m_time(0.f) | |||
{ | |||
Ticker::Ref(m_render); | |||
} | |||
void Neercs::TickGame(float seconds) | |||
{ | |||
WorldEntity::TickGame(seconds); | |||
m_time += seconds; | |||
caca_set_color_ansi(m_caca, CACA_DEFAULT, CACA_DEFAULT); | |||
caca_clear_canvas(m_caca); | |||
caca_fill_ellipse(m_caca, 20+10 * lol::cos(m_time * 1.f), 10+10 * lol::sin(m_time * 1.f), 16+8 * lol::sin(m_time * 6.f), 12+6 * lol::cos(m_time * 5.f), '|'); | |||
caca_fill_ellipse(m_caca, 20+10 * lol::cos(m_time * 1.f), 10+10 * lol::sin(m_time * 1.f), 12+8 * lol::sin(m_time * 6.f), 8+6 * lol::cos(m_time * 5.f), ' '); | |||
caca_set_color_ansi(m_caca, 2, CACA_DEFAULT); | |||
int x1 = 12 + 10 * lol::cos(m_time * 5.f); | |||
int y1 = 6 + 5 * lol::sin(m_time * 5.f); | |||
int x2 = 30 + 5 * lol::cos(m_time * 8.f); | |||
int y2 = 8 + 5 * lol::sin(m_time * 8.f); | |||
int y3 = 8 + 5 * lol::cos(m_time * 5.f); | |||
caca_draw_thin_line(m_caca, x1, y1, x2, y2); | |||
caca_draw_thin_line(m_caca, 40, y3, x2, y2); | |||
caca_draw_thin_line(m_caca, x1, y1, 40, y3); | |||
int x3 = 13 + 7 * lol::cos(m_time * 3.f); | |||
caca_set_color_ansi(m_caca, CACA_CYAN, CACA_BLUE); | |||
caca_put_str(m_caca, x3, 3, " LOL WUT "); | |||
int x4 = 6 + 5 * lol::cos(m_time * 2.f); | |||
caca_set_color_ansi(m_caca, CACA_YELLOW, CACA_RED); | |||
caca_put_str(m_caca, x4, 25, "Le Caca C'Est Surpuissant \\:D/"); | |||
caca_put_str(m_caca, 0, 0, "ABCDEFGHIJKLMNOPQRSTUVWXYZ"); | |||
caca_put_str(m_caca, 0, 1, " !\"#$%&'()*+,-./0123456789"); | |||
if (Input::GetButtonState(27 /*SDLK_ESCAPE*/)) | |||
Ticker::Shutdown(); | |||
} | |||
void Neercs::TickDraw(float seconds) | |||
{ | |||
WorldEntity::TickDraw(seconds); | |||
} | |||
Neercs::~Neercs() | |||
{ | |||
Ticker::Unref(m_render); | |||
} | |||
int main(int argc, char **argv) | |||
{ | |||
Application app("Neercs", ivec2(800, 600), 60.0f); | |||
#if defined _MSC_VER && !defined _XBOX | |||
_chdir(".."); | |||
#elif defined _WIN32 && !defined _XBOX | |||
_chdir("../.."); | |||
#endif | |||
new Neercs(); | |||
new DebugFps(5, 5); | |||
app.ShowPointer(false); | |||
app.Run(); | |||
return EXIT_SUCCESS; | |||
} | |||
@@ -0,0 +1,34 @@ | |||
// | |||
// Neercs | |||
// | |||
// Copyright: (c) 2012 Sam Hocevar <sam@hocevar.net> | |||
// | |||
#if !defined __NEERCS_H__ | |||
#define __NEERCS_H__ | |||
#include <caca.h> | |||
#include "video/render.h" | |||
class Neercs : public WorldEntity | |||
{ | |||
public: | |||
Neercs(); | |||
virtual ~Neercs(); | |||
char const *GetName() { return "<neercs>"; } | |||
protected: | |||
virtual void TickGame(float seconds); | |||
virtual void TickDraw(float seconds); | |||
private: | |||
bool m_ready; | |||
caca_canvas_t *m_caca; | |||
Render *m_render; | |||
float m_time; | |||
}; | |||
#endif // __NEERCS_H__ | |||
@@ -0,0 +1,81 @@ | |||
<?xml version="1.0" encoding="utf-8"?> | |||
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | |||
<ItemGroup Label="ProjectConfigurations"> | |||
<ProjectConfiguration Include="Debug|Win32"> | |||
<Configuration>Debug</Configuration> | |||
<Platform>Win32</Platform> | |||
</ProjectConfiguration> | |||
<ProjectConfiguration Include="Debug|x64"> | |||
<Configuration>Debug</Configuration> | |||
<Platform>x64</Platform> | |||
</ProjectConfiguration> | |||
<ProjectConfiguration Include="Debug|Xbox 360"> | |||
<Configuration>Debug</Configuration> | |||
<Platform>Xbox 360</Platform> | |||
</ProjectConfiguration> | |||
<ProjectConfiguration Include="Release|Win32"> | |||
<Configuration>Release</Configuration> | |||
<Platform>Win32</Platform> | |||
</ProjectConfiguration> | |||
<ProjectConfiguration Include="Release|x64"> | |||
<Configuration>Release</Configuration> | |||
<Platform>x64</Platform> | |||
</ProjectConfiguration> | |||
<ProjectConfiguration Include="Release|Xbox 360"> | |||
<Configuration>Release</Configuration> | |||
<Platform>Xbox 360</Platform> | |||
</ProjectConfiguration> | |||
</ItemGroup> | |||
<ItemGroup> | |||
<ClInclude Include="neercs.h" /> | |||
<ClInclude Include="video\render.h" /> | |||
<ClInclude Include="video\text-render.h" /> | |||
</ItemGroup> | |||
<ItemGroup> | |||
<ClCompile Include="neercs.cpp" /> | |||
<ClCompile Include="video\render.cpp" /> | |||
<ClCompile Include="video\text-render.cpp" /> | |||
</ItemGroup> | |||
<ItemGroup> | |||
<ProjectReference Include="$(SolutionDir)\..\..\src\lolcore.vcxproj"> | |||
<Project>{9e62f2fe-3408-4eae-8238-fd84238ceeda}</Project> | |||
</ProjectReference> | |||
</ItemGroup> | |||
<ItemGroup> | |||
<LolFxCompile Include="video\blurh.lolfx" /> | |||
<LolFxCompile Include="video\blurv.lolfx" /> | |||
<LolFxCompile Include="video\glow.lolfx" /> | |||
<LolFxCompile Include="video\postfx.lolfx" /> | |||
<LolFxCompile Include="video\radial.lolfx" /> | |||
<LolFxCompile Include="video\simple.lolfx" /> | |||
<LolFxCompile Include="video\text.lolfx" /> | |||
</ItemGroup> | |||
<PropertyGroup Label="Globals"> | |||
<ProjectGuid>{587FCCE9-1D8D-4398-B8B6-E8F4E9A92233}</ProjectGuid> | |||
<ConfigurationType>Application</ConfigurationType> | |||
<Keyword>Win32Proj</Keyword> | |||
</PropertyGroup> | |||
<Import Project="$(SolutionDir)\Lol.Core.Config.props" /> | |||
<ImportGroup Label="ExtensionSettings"> | |||
<Import Project="$(SolutionDir)\Lol.Fx.props" /> | |||
</ImportGroup> | |||
<ImportGroup Label="PropertySheets"> | |||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> | |||
<Import Project="$(SolutionDir)\Lol.Core.Vars.props" /> | |||
</ImportGroup> | |||
<PropertyGroup Label="UserMacros" /> | |||
<Import Project="$(SolutionDir)\Lol.Core.Rules.props" /> | |||
<ItemDefinitionGroup> | |||
<ClCompile> | |||
<AdditionalIncludeDirectories>$(CacaIncludes);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | |||
</ClCompile> | |||
<Link> | |||
<AdditionalDependencies>$(CacaDeps);%(AdditionalDependencies)</AdditionalDependencies> | |||
<AdditionalLibraryDirectories>$(CacaLibs);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> | |||
</Link> | |||
</ItemDefinitionGroup> | |||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> | |||
<ImportGroup Label="ExtensionTargets"> | |||
<Import Project="$(SolutionDir)\Lol.Fx.targets" /> | |||
</ImportGroup> | |||
</Project> |
@@ -0,0 +1,49 @@ | |||
<?xml version="1.0" encoding="utf-8"?> | |||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | |||
<ItemGroup> | |||
<ClCompile Include="neercs.cpp" /> | |||
<ClCompile Include="video\render.cpp"> | |||
<Filter>video</Filter> | |||
</ClCompile> | |||
<ClCompile Include="video\text-render.cpp"> | |||
<Filter>video</Filter> | |||
</ClCompile> | |||
</ItemGroup> | |||
<ItemGroup> | |||
<ClInclude Include="neercs.h" /> | |||
<ClInclude Include="video\render.h"> | |||
<Filter>video</Filter> | |||
</ClInclude> | |||
<ClInclude Include="video\text-render.h"> | |||
<Filter>video</Filter> | |||
</ClInclude> | |||
</ItemGroup> | |||
<ItemGroup> | |||
<Filter Include="video"> | |||
<UniqueIdentifier>{8598edd6-ce35-4250-b16e-4237b34ebd2a}</UniqueIdentifier> | |||
</Filter> | |||
</ItemGroup> | |||
<ItemGroup> | |||
<LolFxCompile Include="video\blurh.lolfx"> | |||
<Filter>video</Filter> | |||
</LolFxCompile> | |||
<LolFxCompile Include="video\blurv.lolfx"> | |||
<Filter>video</Filter> | |||
</LolFxCompile> | |||
<LolFxCompile Include="video\glow.lolfx"> | |||
<Filter>video</Filter> | |||
</LolFxCompile> | |||
<LolFxCompile Include="video\postfx.lolfx"> | |||
<Filter>video</Filter> | |||
</LolFxCompile> | |||
<LolFxCompile Include="video\radial.lolfx"> | |||
<Filter>video</Filter> | |||
</LolFxCompile> | |||
<LolFxCompile Include="video\simple.lolfx"> | |||
<Filter>video</Filter> | |||
</LolFxCompile> | |||
<LolFxCompile Include="video\text.lolfx"> | |||
<Filter>video</Filter> | |||
</LolFxCompile> | |||
</ItemGroup> | |||
</Project> |
@@ -0,0 +1,36 @@ | |||
-- GLSL.Vert -- | |||
#version 120 | |||
void main() | |||
{ | |||
gl_Position=gl_Vertex; | |||
gl_TexCoord[0]=gl_MultiTexCoord0; | |||
} | |||
-- GLSL.Frag -- | |||
#version 120 | |||
uniform sampler2D texture; | |||
uniform vec2 screen_size; | |||
uniform float time; | |||
uniform float value; | |||
float blur=value; | |||
void main(void) | |||
{ | |||
vec4 total=vec4(0.0); | |||
vec2 p=gl_TexCoord[0].xy/screen_size; | |||
total+=texture2D(texture,vec2(p.x-blur*4.0,p.y))*0.04; | |||
total+=texture2D(texture,vec2(p.x-blur*3.0,p.y))*0.08; | |||
total+=texture2D(texture,vec2(p.x-blur*2.0,p.y))*0.12; | |||
total+=texture2D(texture,vec2(p.x-blur ,p.y))*0.16; | |||
total+=texture2D(texture,vec2(p.x ,p.y))*0.20; | |||
total+=texture2D(texture,vec2(p.x+blur ,p.y))*0.16; | |||
total+=texture2D(texture,vec2(p.x+blur*2.0,p.y))*0.12; | |||
total+=texture2D(texture,vec2(p.x+blur*3.0,p.y))*0.08; | |||
total+=texture2D(texture,vec2(p.x+blur*4.0,p.y))*0.04; | |||
gl_FragColor=total; | |||
} |
@@ -0,0 +1,36 @@ | |||
-- GLSL.Vert -- | |||
#version 120 | |||
void main() | |||
{ | |||
gl_Position=gl_Vertex; | |||
gl_TexCoord[0]=gl_MultiTexCoord0; | |||
} | |||
-- GLSL.Frag -- | |||
#version 120 | |||
uniform sampler2D texture; | |||
uniform vec2 screen_size; | |||
uniform float time; | |||
uniform float value; | |||
float blur=value; | |||
void main(void) | |||
{ | |||
vec4 total=vec4(0.0); | |||
vec2 p=gl_TexCoord[0].xy/screen_size; | |||
total+=texture2D(texture,vec2(p.x,p.y-blur*4.0))*0.04; | |||
total+=texture2D(texture,vec2(p.x,p.y-blur*3.0))*0.08; | |||
total+=texture2D(texture,vec2(p.x,p.y-blur*2.0))*0.12; | |||
total+=texture2D(texture,vec2(p.x,p.y-blur ))*0.16; | |||
total+=texture2D(texture,vec2(p.x,p.y ))*0.20; | |||
total+=texture2D(texture,vec2(p.x,p.y+blur ))*0.16; | |||
total+=texture2D(texture,vec2(p.x,p.y+blur*2.0))*0.12; | |||
total+=texture2D(texture,vec2(p.x,p.y+blur*3.0))*0.08; | |||
total+=texture2D(texture,vec2(p.x,p.y+blur*4.0))*0.04; | |||
gl_FragColor=total; | |||
} |
@@ -0,0 +1,31 @@ | |||
-- GLSL.Vert -- | |||
#version 120 | |||
void main() | |||
{ | |||
gl_Position=gl_Vertex; | |||
gl_TexCoord[0]=gl_MultiTexCoord0; | |||
} | |||
-- GLSL.Frag -- | |||
#version 120 | |||
uniform sampler2D texture; | |||
uniform sampler2D texture_prv; | |||
uniform vec2 screen_size; | |||
uniform float time; | |||
uniform float step; | |||
uniform float value1; | |||
uniform float value2; | |||
void main(void) | |||
{ | |||
vec2 p=gl_TexCoord[0].xy; | |||
vec4 source=texture2D(texture_prv,p); | |||
vec4 glow=texture2D(texture,p); | |||
source=smoothstep(step,1.0,source); | |||
vec4 color=glow*value1+source*value2; | |||
gl_FragColor=color; | |||
} |
@@ -0,0 +1,90 @@ | |||
-- GLSL.Vert -- | |||
#version 120 | |||
void main() | |||
{ | |||
gl_Position=gl_Vertex; | |||
gl_TexCoord[0]=gl_MultiTexCoord0; | |||
} | |||
-- GLSL.Frag -- | |||
#version 120 | |||
uniform sampler2D texture; | |||
uniform vec2 screen_size; | |||
uniform float time; | |||
uniform float flash; | |||
uniform float value; | |||
uniform float deform; | |||
uniform bool scanline; | |||
uniform float sync; | |||
const float PI=3.14159265358979323846; | |||
float lens=PI/(deform+sync*0.0625); | |||
vec2 zoom(in vec2 p,in float radius) | |||
{ | |||
float zoom=1.5-(radius*cos(p.x*PI/lens)+radius*cos(p.y*PI/lens)); | |||
return vec2(p.x*zoom-0.5,p.y*zoom-0.5); | |||
} | |||
vec3 get_color(in sampler2D tex,in vec2 p) | |||
{ | |||
return (p.x<-1.0||p.x>0.0||p.y<-1.0||p.y>0.0)?vec3(0.0,0.0,0.0):texture2D(tex,p).xyz; | |||
} | |||
float rand(in vec2 p) | |||
{ | |||
return fract(sin(dot(p.xy,vec2(12.9898,78.233)))*43758.5453); | |||
} | |||
void main(void) | |||
{ | |||
vec2 q=gl_TexCoord[0].xy; | |||
vec2 p=-1.0+2.0*gl_TexCoord[0].xy; | |||
p.y+=0.025*sync; | |||
vec2 z =zoom(p,0.5250); | |||
vec2 z1=zoom(p,0.5225); | |||
vec2 z2=zoom(p,0.5275); | |||
float g=(2.0-cos(PI/lens/2.0+z.x*PI/lens)-cos(PI/lens/2.0+z.y*PI/lens))*32.0; | |||
float rnd1=rand(vec2(p.x+time,p.y-time)); | |||
float rnd2=rand(vec2(p.x-time,p.y+time)); | |||
float d1=rnd1*value/float(screen_size.x); | |||
float d2=rnd2*value/float(screen_size.y); | |||
vec3 source;//=get_color(texture,z); | |||
source.x=get_color(texture,vec2(z.x+d1,z.y)).x; | |||
source.y=get_color(texture,vec2(z.x+d1,z.y)).y; | |||
source.z=get_color(texture,vec2(z.x+d1,z.y)).z; | |||
vec3 glass1=get_color(texture,z1); | |||
vec3 glass2=get_color(texture,z2); | |||
float v=value/float(screen_size.x)*g; | |||
vec3 noise; | |||
noise.x=get_color(texture,vec2(z.x+d1-v,z.y+d2)).x; | |||
noise.y=get_color(texture,vec2(z.x+d1 ,z.y-d2)).y; | |||
noise.z=get_color(texture,vec2(z.x+d1+v,z.y-d2)).z; | |||
vec3 color=source+glass1*glass1*0.25+glass2*glass2*0.25+(scanline?noise:source); | |||
color+=flash; // flash | |||
if(scanline) | |||
{ | |||
color-=0.0125*mod(z.y*4.0+time*0.25,1.0); // electron beam | |||
color-=(vec3(rnd1,rnd1,rnd1)-vec3(rnd2,rnd2,rnd2))*0.1; // noise | |||
color*=0.75+0.25*sin(z.x*float(screen_size.x*2)); // scanline w | |||
color*=0.90+0.10*cos(z.y*float(screen_size.y))*sin(0.5+z.x*float(screen_size.x)); // scanline h | |||
} | |||
else | |||
{ | |||
color*=0.675; | |||
} | |||
color=vec3(color.x*0.875,color.y*1.0,color.z*0.625); | |||
color*=q.x*(6.0-q.x*6.0)*q.y*(6.0-q.y*6.0); // vignetting | |||
gl_FragColor=vec4(color,1.0); | |||
} |
@@ -0,0 +1,54 @@ | |||
-- GLSL.Vert -- | |||
#version 120 | |||
void main() | |||
{ | |||
gl_Position=gl_Vertex; | |||
gl_TexCoord[0]=gl_MultiTexCoord0; | |||
} | |||
-- GLSL.Frag -- | |||
#version 120 | |||
uniform sampler2D texture; | |||
uniform vec2 screen_size; | |||
uniform float time; | |||
uniform float value1; | |||
uniform float value2; | |||
uniform float color; | |||
float PI=3.14159265358979323846; | |||
vec3 deform(in vec2 p) | |||
{ | |||
vec2 uv; | |||
float zoom=0.5; | |||
uv.x=p.x*zoom-0.5; | |||
uv.y=p.y*zoom-0.5; | |||
return texture2D(texture,uv).xyz; | |||
} | |||
void main(void) | |||
{ | |||
int n=32; | |||
vec2 p=-1.0+4.0*gl_TexCoord[0].xy; | |||
vec2 s=p; | |||
vec3 source=deform(s); | |||
vec3 total=vec3(0,1.0,1.0); | |||
vec2 d=-p/float(n*2); | |||
float w=value1; | |||
for(int i=0;i<n;i++) | |||
{ | |||
vec3 c=deform(s); | |||
vec3 data=c+vec3(c.x*color-p.x*color,c.z*color+p.y*color,c.y*color+p.x*color); | |||
total+=data*w; | |||
w*=value2; | |||
s+=d; | |||
} | |||
gl_FragColor=vec4(source*0.625+total*0.025,1.0); | |||
} |
@@ -0,0 +1,607 @@ | |||
// | |||
// Neercs | |||
// | |||
#if defined HAVE_CONFIG_H | |||
# include "config.h" | |||
#endif | |||
#if defined _XBOX | |||
# define _USE_MATH_DEFINES /* for M_PI */ | |||
# include <xtl.h> | |||
#elif defined _WIN32 | |||
# define _USE_MATH_DEFINES /* for M_PI */ | |||
# define WIN32_LEAN_AND_MEAN | |||
# include <windows.h> | |||
#endif | |||
#include <cmath> | |||
#include <cstdio> | |||
#include <cstdlib> | |||
#include <ctime> | |||
#include <string> | |||
#include "core.h" | |||
#include "lolgl.h" | |||
using namespace std; | |||
using namespace lol; | |||
#include "../neercs.h" | |||
#include "render.h" | |||
#include "text-render.h" | |||
extern char const *lolfx_blurh; | |||
extern char const *lolfx_blurv; | |||
extern char const *lolfx_glow; | |||
extern char const *lolfx_postfx; | |||
extern char const *lolfx_radial; | |||
extern char const *lolfx_simple; | |||
#define DEBUG 1 // debug flag //#if defined(_DEBUG) | |||
#define PID M_PI/180.0f // pi ratio | |||
#define CR 1.0f/256.0f // color ratio | |||
/* | |||
* Various variables | |||
*/ | |||
int keys[256]; // keyboard array | |||
int active = true; // window active flag | |||
bool fullscreen = DEBUG?false:true; // fullscreen flag | |||
bool paused = false; // pause flag | |||
float nearplane = 0.1f; // nearplane | |||
float farplane = 1000.0f; // farplane | |||
bool polygon = true; // polygon mode | |||
int polygon_fillmode = GL_FILL; // fill mode | |||
/* window variable */ | |||
ivec2 screen_size; // screen size | |||
int window_color = 32; // color depth | |||
vec3 screen_color = CR * vec3(48, 56, 64); // screen color | |||
/* object variable */ | |||
float main_angle = 0.0f; // main angle | |||
float part_angle = 0.0f; // part angle | |||
float fx_angle; // current angle | |||
/* text variable */ | |||
char const *name = "cacaShell"; | |||
/* fs_quad variable */ | |||
float fs_quad_vtx[] = {-1.0f, 1.0f, 0, 1.0f, -1.0f, -1.0f, 0, 1.0f, 1.0f, -1.0f, 0, 1.0f, 1.0f, 1.0f, 0, 1.0f}; | |||
float fs_quad_tex[] = {0, 1.0f, 0, 0, 1.0f, 0, 1.0f, 1.0f}; | |||
/* flash variable */ | |||
bool flash_flag = false; // flag | |||
float flash_angle = 0; // angle | |||
float flash_value = 0; // value | |||
float flash_speed = 1.5f; // speed | |||
/* fade variable */ | |||
bool fade_flag = false; // flag | |||
float fade_angle = 0; // angle | |||
float fade_value = 0; // value | |||
float fade_speed = 0.2f; // speed | |||
/* sync variable */ | |||
bool sync_flag = false; // flag | |||
float sync_angle = 0; // angle | |||
float sync_value = 1.0f; // value | |||
float sync_speed = 1.0f; // speed | |||
/* beat variable */ | |||
bool beat_flag = false; // flag | |||
float beat_angle = 0; // angle | |||
float beat_value = 0; // value | |||
float beat_speed = 2.0f; // speed | |||
/* corner variable */ | |||
const int corner_n = 10; // polygon number | |||
int corner_w = 24; // radius | |||
int corner_vtx[corner_n*6];// vertex array | |||
/* dos variable */ | |||
bool dos_flag = true; // flag | |||
int dos_m; // margin | |||
vec3 dos_color = CR * vec3(48, 56, 64); // color value | |||
int dos_vtx[8]; // vertex array | |||
ivec2 ratio_2d(2,4); // 2d ratio | |||
ivec2 map_size(256,256); // texture map size | |||
ivec2 font_size(8,8); // font size | |||
vec2 car_size(1.0f/map_size.x*font_size.x, 1.0f/map_size.y*font_size.y); | |||
int shell_vtx[8]; // vertex array | |||
float shell_tex[] = {1.0f, 0.96875f, 1.0f, 1.0f, 0.78125f, 1.0f, 0.78125f, 0.96875f}; | |||
/* keyboard variable */ | |||
int key_code = 0; // keyboard code | |||
/* common variable */ | |||
float value, angle, radius, scale, speed; | |||
/* shader variable */ | |||
bool shader_flag = true; | |||
bool shader_blur_flag = true; | |||
bool shader_glow_flag = true; | |||
bool shader_effect_flag = true; | |||
bool shader_postfx_flag = true; | |||
int glow_fbo_size = 2; // glow fbo size | |||
float glow_smoothstep = 0.0f; // glow smoothstep value (try 0.025f) | |||
float glow_mix_ratio1 = 0.5f; // glow mixing ratio | |||
float glow_mix_ratio2 = 0.5f; // source mixing ratio | |||
float radial_value1 = 2.0f; | |||
float radial_value2 = 0.8f; | |||
float radial_color = 0; // color | |||
bool postfx_scanline = true; | |||
float postfx_deform = 0.5f; // deformation ratio | |||
Shader *shader_simple, *shader_blur_h, *shader_blur_v; | |||
Shader *shader_glow, *shader_radial, *shader_postfx; | |||
// shader variables | |||
ShaderUniform shader_simple_texture; | |||
ShaderUniform shader_blur_h_texture, | |||
shader_blur_h_screen_size, | |||
shader_blur_h_time, | |||
shader_blur_h_value; | |||
ShaderUniform shader_blur_v_texture, | |||
shader_blur_v_screen_size, | |||
shader_blur_v_time, | |||
shader_blur_v_value; | |||
ShaderUniform shader_glow_texture, | |||
shader_glow_texture_prv, | |||
shader_glow_screen_size, | |||
shader_glow_time, | |||
shader_glow_step, | |||
shader_glow_value1, | |||
shader_glow_value2; | |||
ShaderUniform shader_radial_texture, | |||
shader_radial_screen_size, | |||
shader_radial_time, | |||
shader_radial_value1, | |||
shader_radial_value2, | |||
shader_radial_color; | |||
ShaderUniform shader_postfx_texture, | |||
shader_postfx_texture_2d, | |||
shader_postfx_screen_size, | |||
shader_postfx_time, | |||
shader_postfx_flash, | |||
shader_postfx_value, | |||
shader_postfx_deform, | |||
shader_postfx_scanline, | |||
shader_postfx_sync; | |||
FrameBuffer *fbo_back, *fbo_front; | |||
FrameBuffer *fbo_blur_h, *fbo_blur_v, *fbo_ping, *fbo_pong; | |||
TextRender *text_render; | |||
void fs_quad() | |||
{ | |||
glLoadIdentity(); | |||
glDrawArrays(GL_QUADS, 0, 4); | |||
} | |||
void draw_shader_simple(FrameBuffer *fbo_output, int n) | |||
{ | |||
shader_simple->Bind(); | |||
shader_simple->SetTexture(shader_simple_texture, fbo_output->GetTexture(), n); | |||
fs_quad(); | |||
shader_simple->Unbind(); | |||
} | |||
void rectangle(int x, int y, int w, int h) | |||
{ | |||
glLoadIdentity(); | |||
glBegin(GL_QUADS); | |||
glVertex2i(x+w, y ); | |||
glVertex2i(x , y ); | |||
glVertex2i(x , y+h); | |||
glVertex2i(x+w, y+h); | |||
glEnd(); | |||
} | |||
void corner() | |||
{ | |||
float vertex[6+corner_n*2]; | |||
vertex[0] = 0; | |||
vertex[1] = 0; | |||
for (int i = 1; i < corner_n + 1; i++) | |||
{ | |||
int j = i*2; | |||
float a = PID*90.0f/(corner_n-1)*(i-1); | |||
vertex[j ] = corner_w-corner_w*cosf(a); | |||
vertex[j+1] = corner_w-corner_w*sinf(a); | |||
} | |||
for (int i = 0; i < corner_n; i++) | |||
{ | |||
int j = i*6; | |||
int k = i*2; | |||
corner_vtx[j ] = (int)vertex[0]; | |||
corner_vtx[j+1] = (int)vertex[1]; | |||
corner_vtx[j+2] = (int)vertex[2+k]; | |||
corner_vtx[j+3] = (int)vertex[3+k]; | |||
corner_vtx[j+4] = (int)vertex[4+k]; | |||
corner_vtx[j+5] = (int)vertex[5+k]; | |||
} | |||
} | |||
int InitGL(void) | |||
{ | |||
glDepthMask(GL_TRUE); // do not write z-buffer | |||
glEnable(GL_CULL_FACE); // disable cull face | |||
glCullFace(GL_BACK); // don't draw front face | |||
if (shader_flag) | |||
{ | |||
/* Initialise framebuffer objects */ | |||
fbo_back = new FrameBuffer(screen_size); | |||
fbo_front = new FrameBuffer(screen_size); | |||
fbo_blur_h = new FrameBuffer(screen_size / glow_fbo_size); | |||
fbo_blur_v = new FrameBuffer(screen_size / glow_fbo_size); | |||
fbo_ping = new FrameBuffer(screen_size); | |||
fbo_pong = new FrameBuffer(screen_size); | |||
// shader simple | |||
shader_simple = Shader::Create(lolfx_simple); | |||
shader_simple_texture = shader_simple->GetUniformLocation("texture"); | |||
// shader blur horizontal | |||
shader_blur_h = Shader::Create(lolfx_blurh); | |||
shader_blur_h_texture = shader_blur_h->GetUniformLocation("texture"); | |||
shader_blur_h_screen_size = shader_blur_h->GetUniformLocation("screen_size"); | |||
shader_blur_h_time = shader_blur_h->GetUniformLocation("time"); | |||
shader_blur_h_value = shader_blur_h->GetUniformLocation("value"); | |||
// shader blur vertical | |||
shader_blur_v = Shader::Create(lolfx_blurv); | |||
shader_blur_v_texture = shader_blur_v->GetUniformLocation("texture"); | |||
shader_blur_v_screen_size = shader_blur_v->GetUniformLocation("screen_size"); | |||
shader_blur_v_time = shader_blur_v->GetUniformLocation("time"); | |||
shader_blur_v_value = shader_blur_v->GetUniformLocation("value"); | |||
// shader glow | |||
shader_glow = Shader::Create(lolfx_glow); | |||
shader_glow_texture = shader_glow->GetUniformLocation("texture"); | |||
shader_glow_texture_prv = shader_glow->GetUniformLocation("texture_prv"); | |||
shader_glow_screen_size = shader_glow->GetUniformLocation("screen_size"); | |||
shader_glow_time = shader_glow->GetUniformLocation("time"); | |||
shader_glow_step = shader_glow->GetUniformLocation("step"); | |||
shader_glow_value1 = shader_glow->GetUniformLocation("value1"); | |||
shader_glow_value2 = shader_glow->GetUniformLocation("value2"); | |||
// shader radial | |||
shader_radial = Shader::Create(lolfx_radial); | |||
shader_radial_texture = shader_radial->GetUniformLocation("texture"); | |||
shader_radial_screen_size = shader_radial->GetUniformLocation("screen_size"); | |||
shader_radial_time = shader_radial->GetUniformLocation("time"); | |||
shader_radial_value1 = shader_radial->GetUniformLocation("value1"); | |||
shader_radial_value2 = shader_radial->GetUniformLocation("value2"); | |||
shader_radial_color = shader_radial->GetUniformLocation("color"); | |||
// shader postfx | |||
shader_postfx = Shader::Create(lolfx_postfx); | |||
shader_postfx_texture = shader_postfx->GetUniformLocation("texture"); | |||
shader_postfx_texture_2d = shader_postfx->GetUniformLocation("texture_2d"); | |||
shader_postfx_screen_size = shader_postfx->GetUniformLocation("screen_size"); | |||
shader_postfx_time = shader_postfx->GetUniformLocation("time"); | |||
shader_postfx_flash = shader_postfx->GetUniformLocation("flash"); | |||
shader_postfx_value = shader_postfx->GetUniformLocation("value"); | |||
shader_postfx_deform = shader_postfx->GetUniformLocation("deform"); | |||
shader_postfx_scanline = shader_postfx->GetUniformLocation("scanline"); | |||
shader_postfx_sync = shader_postfx->GetUniformLocation("sync"); | |||
} | |||
return true; | |||
} | |||
int CreateGLWindow(char const *title) | |||
{ | |||
screen_size = Video::GetSize(); | |||
corner_w = 16*ratio_2d.x; | |||
corner(); | |||
dos_m=12*ratio_2d.x; | |||
dos_vtx[0]=font_size.x*ratio_2d.x/2.0f; | |||
dos_vtx[1]=font_size.y*ratio_2d.y/2.0f; | |||
dos_vtx[2]=font_size.x*ratio_2d.x/2.0f; | |||
dos_vtx[3]=-font_size.y*ratio_2d.y/2.0f; | |||
dos_vtx[4]=-font_size.x*ratio_2d.x/2.0f; | |||
dos_vtx[5]=-font_size.y*ratio_2d.y/2.0f; | |||
dos_vtx[6]=-font_size.x*ratio_2d.x/2.0f; | |||
dos_vtx[7]=font_size.y*ratio_2d.y/2.0f; | |||
shell_vtx[0]=dos_m+58*ratio_2d.x; | |||
shell_vtx[1]=dos_m+(font_size.y+1)*ratio_2d.y; | |||
shell_vtx[2]=dos_m+58*ratio_2d.x; | |||
shell_vtx[3]=dos_m+ratio_2d.y; | |||
shell_vtx[4]=dos_m+2*ratio_2d.x; | |||
shell_vtx[5]=dos_m+ratio_2d.y; | |||
shell_vtx[6]=dos_m+2*ratio_2d.x; | |||
shell_vtx[7]=dos_m+(font_size.y+1)*ratio_2d.y; | |||
InitGL(); | |||
return true; | |||
} | |||
Render::Render(caca_canvas_t *caca) | |||
: m_caca(caca), | |||
m_ready(false) | |||
{ | |||
text_render = new TextRender(m_caca, font_size); | |||
} | |||
void Render::TickGame(float seconds) | |||
{ | |||
Entity::TickGame(seconds); | |||
} | |||
void Render::TickDraw(float seconds) | |||
{ | |||
Entity::TickDraw(seconds); | |||
if (!m_ready) | |||
{ | |||
CreateGLWindow("LOL"); | |||
text_render->Init(); | |||
m_ready = true; | |||
} | |||
// timer | |||
if(!paused) | |||
main_angle += seconds * 100.0f * PID; | |||
if(sync_flag) | |||
{ | |||
angle=(main_angle-sync_angle)*sync_speed; | |||
sync_value=1.0f-sinf(angle); | |||
if(angle>90.0f*PID) | |||
{ | |||
sync_value=0; | |||
sync_flag=false; | |||
} | |||
} | |||
if(beat_flag) | |||
{ | |||
angle=(main_angle-beat_angle)*beat_speed; | |||
beat_value=1.0f-sinf(angle); | |||
if(angle>90.0f*PID) | |||
{ | |||
beat_value=0; | |||
beat_flag=false; | |||
} | |||
} | |||
if(flash_flag) | |||
{ | |||
angle=(main_angle-flash_angle)*flash_speed; | |||
flash_value=1.0f-sinf(angle); | |||
if(angle>90.0f*PID) | |||
{ | |||
flash_value=0; | |||
flash_flag=false; | |||
} | |||
} | |||
if(fade_flag) | |||
{ | |||
angle=(main_angle-fade_angle)*fade_speed; | |||
fade_value=1.0f-sinf(angle); | |||
if(angle>90.0f*PID) | |||
{ | |||
fade_value=0; | |||
fade_flag=false; | |||
} | |||
} | |||
Draw2D(); | |||
Draw3D(); | |||
} | |||
void Render::Draw2D() | |||
{ | |||
/* Draw text in an offline buffer */ | |||
text_render->Render(); | |||
if(shader_flag) | |||
fbo_back->Bind(); | |||
glViewport(0, 0, screen_size.x, screen_size.y); | |||
/* Clear the back buffer */ | |||
glEnable(GL_BLEND); | |||
glBlendFunc(GL_SRC_COLOR,GL_DST_ALPHA); | |||
glClearColor(screen_color.r, screen_color.g, screen_color.b, 0.5f); | |||
glClearDepth(1.0f); // set depth buffer | |||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); | |||
ivec2 border_top = ivec2(dos_m, dos_m + font_size.y * ratio_2d.y) | |||
+ ratio_2d * 2; | |||
ivec2 border_bottom = ivec2(dos_m * 2, dos_m * 2 + font_size.y * ratio_2d.y) | |||
+ ratio_2d * 2; | |||
text_render->Blit(border_top, screen_size - border_bottom); | |||
//if(polygon) glEnable(GL_LINE_SMOOTH); else glDisable(GL_LINE_SMOOTH); | |||
glLineWidth((polygon)?2.0f:1.0f); | |||
fx_angle=main_angle-part_angle; | |||
if(polygon) glEnable(GL_TEXTURE_2D); | |||
glMatrixMode(GL_PROJECTION); | |||
mat4 m = mat4::ortho(0, screen_size.x, screen_size.y, 0, -1.f, 1.f); | |||
glLoadMatrixf(&m[0][0]); | |||
glMatrixMode(GL_MODELVIEW); | |||
// draw dos | |||
if(dos_flag) | |||
{ | |||
glDisable(GL_TEXTURE_2D); | |||
glDisable(GL_BLEND); | |||
glColor3f(1.0f,1.0f,1.0f); | |||
rectangle(dos_m,dos_m,screen_size.x-53*ratio_2d.x-dos_m*2,(font_size.y+2)*ratio_2d.y); | |||
rectangle(screen_size.x-51*ratio_2d.x-dos_m,dos_m,22*ratio_2d.x,(font_size.y+2)*ratio_2d.y); | |||
rectangle(screen_size.x-27*ratio_2d.x-dos_m,dos_m,22*ratio_2d.x,(font_size.y+2)*ratio_2d.y); | |||
rectangle(screen_size.x-3*ratio_2d.x-dos_m,dos_m,3*ratio_2d.x,(font_size.y+2)*ratio_2d.y); | |||
rectangle(dos_m,dos_m+(font_size.y+2)*ratio_2d.y,2*ratio_2d.x,screen_size.y-(font_size.y+2)*ratio_2d.y-dos_m*2); | |||
rectangle(screen_size.x-2*ratio_2d.x-dos_m,dos_m+(font_size.y+2)*ratio_2d.y,2*ratio_2d.x,screen_size.y-(font_size.y+2)*ratio_2d.y-dos_m*2); | |||
rectangle(dos_m+2*ratio_2d.x,screen_size.y-ratio_2d.y-dos_m,screen_size.x-4*ratio_2d.x-dos_m*2,ratio_2d.y); | |||
glColor3f(dos_color.x,dos_color.y,dos_color.z); | |||
rectangle(dos_m+2*ratio_2d.x,dos_m+ratio_2d.y,56*ratio_2d.x,font_size.y*ratio_2d.y); | |||
rectangle(dos_m+60*ratio_2d.x,dos_m+2*ratio_2d.y,screen_size.x-115*ratio_2d.x-dos_m*2,2*ratio_2d.y); | |||
rectangle(dos_m+60*ratio_2d.x,dos_m+6*ratio_2d.y,screen_size.x-115*ratio_2d.x-dos_m*2,2*ratio_2d.y); | |||
rectangle(screen_size.x-49*ratio_2d.x-dos_m,dos_m+ratio_2d.y,14*ratio_2d.x,6*ratio_2d.y); | |||
glColor3f(1.0f,1.0f,1.0f); | |||
rectangle(screen_size.x-47*ratio_2d.x-dos_m,dos_m+2*ratio_2d.y,10*ratio_2d.x,4*ratio_2d.y); | |||
glColor3f(0,0,0); | |||
rectangle(screen_size.x-45*ratio_2d.x-dos_m,dos_m+3*ratio_2d.y,14*ratio_2d.x,6*ratio_2d.y); | |||
rectangle(screen_size.x-25*ratio_2d.x-dos_m,dos_m+1*ratio_2d.y,14*ratio_2d.x,6*ratio_2d.y); | |||
glColor3f(dos_color.x,dos_color.y,dos_color.z); | |||
rectangle(screen_size.x-21*ratio_2d.x-dos_m,dos_m+2*ratio_2d.y,14*ratio_2d.x,7*ratio_2d.y); | |||
glColor3f(1.0f,1.0f,1.0f); | |||
rectangle(screen_size.x-19*ratio_2d.x-dos_m,dos_m+3*ratio_2d.y,10*ratio_2d.x,5*ratio_2d.y); | |||
rectangle(screen_size.x-16*ratio_2d.x-dos_m,screen_size.y-9*ratio_2d.y-dos_m,14*ratio_2d.x,8*ratio_2d.y); | |||
glColor3f(dos_color.x,dos_color.y,dos_color.z); | |||
rectangle(screen_size.x-14*ratio_2d.x-dos_m,screen_size.y-8*ratio_2d.y-dos_m,12*ratio_2d.x,7*ratio_2d.y); | |||
glColor3f(1.0f,1.0f,1.0f); | |||
rectangle(screen_size.x-8*ratio_2d.x-dos_m,screen_size.y-8*ratio_2d.y-dos_m,8*ratio_2d.x,2*ratio_2d.y); | |||
rectangle(screen_size.x-14*ratio_2d.x-dos_m,screen_size.y-5*ratio_2d.y-dos_m,4*ratio_2d.x,5*ratio_2d.y); | |||
rectangle(screen_size.x-12*ratio_2d.x-dos_m,screen_size.y-7*ratio_2d.y-dos_m,2*ratio_2d.x,1*ratio_2d.y); | |||
rectangle(screen_size.x-8*ratio_2d.x-dos_m,screen_size.y-5*ratio_2d.y-dos_m,4*ratio_2d.x,3*ratio_2d.y); | |||
glEnable(GL_BLEND); | |||
if(polygon) glEnable(GL_TEXTURE_2D); | |||
glBlendFunc(GL_ONE, GL_ONE); | |||
glVertexPointer(2, GL_INT, 0, shell_vtx); | |||
glTexCoordPointer(2, GL_FLOAT, 0, shell_tex); | |||
glDrawArrays(GL_QUADS, 0, 4); | |||
} | |||
// draw corner | |||
glDisable(GL_TEXTURE_2D); | |||
glDisable(GL_BLEND); | |||
glVertexPointer(2, GL_INT, 0, corner_vtx); | |||
glLoadIdentity(); | |||
glColor3f(0, 0, 0); | |||
glDrawArrays(GL_TRIANGLES, 0, corner_n*3); | |||
glTranslated(screen_size.x, 0, 0); | |||
glRotated(90.0f, 0, 0, 1.0f); | |||
glDrawArrays(GL_TRIANGLES, 0, corner_n*3); | |||
glTranslated(screen_size.y, 0, 0); | |||
glRotated(90.0f, 0, 0, 1.0f); | |||
glDrawArrays(GL_TRIANGLES, 0, corner_n*3); | |||
glTranslated(screen_size.x, 0, 0); | |||
glRotated(90.0f, 0, 0, 1.0f); | |||
glDrawArrays(GL_TRIANGLES, 0, corner_n*3); | |||
glEnable(GL_BLEND); | |||
} | |||
void Render::Draw3D() | |||
{ | |||
if (!shader_flag) | |||
return; | |||
glDisable(GL_DEPTH_TEST); | |||
glDisable(GL_BLEND); | |||
glEnableClientState(GL_VERTEX_ARRAY); | |||
glVertexPointer(4, GL_FLOAT, 0, fs_quad_vtx); | |||
glEnableClientState(GL_TEXTURE_COORD_ARRAY); | |||
glTexCoordPointer(2, GL_FLOAT, 0, fs_quad_tex); | |||
fbo_back->Unbind(); | |||
if (shader_effect_flag && shader_blur_flag) | |||
{ | |||
// shader blur horizontal | |||
fbo_ping->Bind(); | |||
shader_blur_h->Bind(); | |||
shader_blur_h->SetTexture(shader_blur_h_texture, fbo_back->GetTexture(), 0); | |||
shader_blur_h->SetUniform(shader_blur_h_screen_size, vec2(1.0f)); | |||
shader_blur_h->SetUniform(shader_blur_h_time, fx_angle); | |||
shader_blur_h->SetUniform(shader_blur_h_value, 0.5f/screen_size.x); | |||
fs_quad(); | |||
shader_blur_h->Unbind(); | |||
fbo_ping->Unbind(); | |||
// shader blur vertical | |||
fbo_front->Bind(); | |||
shader_blur_v->Bind(); | |||
shader_blur_v->SetTexture(shader_blur_v_texture, fbo_ping->GetTexture(), 0); | |||
shader_blur_v->SetUniform(shader_blur_v_screen_size, vec2(1.0f)); | |||
shader_blur_v->SetUniform(shader_blur_v_time, fx_angle); | |||
shader_blur_v->SetUniform(shader_blur_v_value, 0.5f/screen_size.y); | |||
fs_quad(); | |||
shader_blur_v->Unbind(); | |||
} | |||
else | |||
{ | |||
// shader simple | |||
fbo_front->Bind(); | |||
draw_shader_simple(fbo_back, 0); | |||
} | |||
fbo_front->Unbind(); | |||
// shader glow | |||
if(shader_effect_flag && shader_glow_flag) | |||
{ | |||
// shader blur horizontal | |||
fbo_blur_h->Bind(); | |||
shader_blur_h->Bind(); | |||
shader_blur_h->SetTexture(shader_blur_h_texture, fbo_ping->GetTexture(), 0); | |||
shader_blur_h->SetUniform(shader_blur_h_screen_size, vec2(1.0f / glow_fbo_size)); | |||
shader_blur_h->SetUniform(shader_blur_h_time, fx_angle); | |||
shader_blur_h->SetUniform(shader_blur_h_value, 2.5f/screen_size.x); | |||
fs_quad(); | |||
shader_blur_h->Unbind(); | |||
fbo_blur_h->Unbind(); | |||
// shader blur vertical | |||
fbo_blur_v->Bind(); | |||
shader_blur_v->Bind(); | |||
shader_blur_v->SetTexture(shader_blur_v_texture, fbo_blur_h->GetTexture(), 0); | |||
shader_blur_v->SetUniform(shader_blur_v_screen_size, vec2(1.0f / glow_fbo_size)); | |||
shader_blur_v->SetUniform(shader_blur_v_time, fx_angle); | |||
shader_blur_v->SetUniform(shader_blur_h_value, 2.5f/screen_size.y); | |||
fs_quad(); | |||
shader_blur_v->Unbind(); | |||
fbo_blur_v->Unbind(); | |||
// shader blur horizontal | |||
fbo_blur_h->Bind(); | |||
shader_blur_h->Bind(); | |||
shader_blur_h->SetTexture(shader_blur_h_texture, fbo_blur_v->GetTexture(), 0); | |||
shader_blur_h->SetUniform(shader_blur_h_screen_size, vec2(1.0f / glow_fbo_size)); | |||
shader_blur_h->SetUniform(shader_blur_h_time, fx_angle); | |||
shader_blur_h->SetUniform(shader_blur_h_value, 1.0f/screen_size.x); | |||
fs_quad(); | |||
shader_blur_h->Unbind(); | |||
fbo_blur_h->Unbind(); | |||
// shader blur vertical | |||
fbo_blur_v->Bind(); | |||
shader_blur_v->Bind(); | |||
shader_blur_v->SetTexture(shader_blur_v_texture, fbo_blur_h->GetTexture(), 0); | |||
shader_blur_v->SetUniform(shader_blur_v_screen_size, vec2(1.0f / glow_fbo_size)); | |||
shader_blur_v->SetUniform(shader_blur_v_time, fx_angle); | |||
shader_blur_v->SetUniform(shader_blur_h_value, 1.0f/screen_size.y); | |||
fs_quad(); | |||
shader_blur_v->Unbind(); | |||
fbo_blur_v->Unbind(); | |||
// shader glow | |||
fbo_pong->Bind(); | |||
shader_glow->Bind(); | |||
shader_glow->SetTexture(shader_glow_texture, fbo_blur_v->GetTexture(), 0); | |||
shader_glow->SetTexture(shader_glow_texture_prv, fbo_front->GetTexture(), 1); | |||
shader_glow->SetUniform(shader_glow_screen_size, vec2(1.0f)); | |||
shader_glow->SetUniform(shader_glow_time, fx_angle); | |||
shader_glow->SetUniform(shader_glow_step, glow_smoothstep); | |||
shader_glow->SetUniform(shader_glow_value1, glow_mix_ratio1); | |||
shader_glow->SetUniform(shader_glow_value2, glow_mix_ratio2); | |||
fs_quad(); | |||
shader_glow->Unbind(); | |||
} | |||
if(!shader_effect_flag) | |||
{ | |||
// shader simple | |||
fbo_pong->Bind(); | |||
draw_shader_simple(fbo_front, 0); | |||
} | |||
fbo_pong->Unbind(); | |||
if(shader_postfx_flag) | |||
{ | |||
// shader postfx | |||
shader_postfx->Bind(); | |||
shader_postfx->SetTexture(shader_postfx_texture, fbo_pong->GetTexture(), 0); | |||
shader_postfx->SetUniform(shader_postfx_screen_size, (vec2)screen_size); | |||
shader_postfx->SetUniform(shader_postfx_time, fx_angle); | |||
shader_postfx->SetUniform(shader_postfx_flash, flash_value); | |||
shader_postfx->SetUniform(shader_postfx_value, 4.0f); | |||
shader_postfx->SetUniform(shader_postfx_deform, postfx_deform); | |||
shader_postfx->SetUniform(shader_postfx_scanline, postfx_scanline); | |||
shader_postfx->SetUniform(shader_postfx_sync, (float)fabs(beat_value*cosf((main_angle-beat_angle)*8.0f))); | |||
fs_quad(); | |||
shader_postfx->Unbind(); | |||
} | |||
else | |||
{ | |||
// shader simple | |||
draw_shader_simple(fbo_pong, 0); | |||
} | |||
glDisableClientState(GL_VERTEX_ARRAY); | |||
glDisableClientState(GL_TEXTURE_COORD_ARRAY); | |||
} | |||
Render::~Render() | |||
{ | |||
} | |||
@@ -0,0 +1,28 @@ | |||
// | |||
// | |||
#if !defined __VIDEO_RENDER_H__ | |||
#define __VIDEO_RENDER_H__ | |||
class Render : public WorldEntity | |||
{ | |||
public: | |||
Render(caca_canvas_t *caca); | |||
virtual ~Render(); | |||
char const *GetName() { return "<title>"; } | |||
protected: | |||
virtual void TickGame(float seconds); | |||
virtual void TickDraw(float seconds); | |||
void Draw2D(); | |||
void Draw3D(); | |||
private: | |||
caca_canvas_t *m_caca; | |||
bool m_ready; | |||
}; | |||
#endif // __VIDEO_RENDER_H__ | |||
@@ -0,0 +1,20 @@ | |||
-- GLSL.Vert -- | |||
#version 120 | |||
void main() | |||
{ | |||
gl_Position=gl_Vertex; | |||
gl_TexCoord[0]=gl_MultiTexCoord0; | |||
} | |||
-- GLSL.Frag -- | |||
#version 120 | |||
uniform sampler2D texture; | |||
void main(void) | |||
{ | |||
gl_FragColor=vec4(texture2D(texture,gl_TexCoord[0].xy).xyz,1.0); | |||
} |
@@ -0,0 +1,151 @@ | |||
// | |||
// Neercs | |||
// | |||
#if defined HAVE_CONFIG_H | |||
# include "config.h" | |||
#endif | |||
#include <cmath> | |||
#include <cstdio> | |||
#include <cstdlib> | |||
#include <ctime> | |||
#include <string> | |||
#include "core.h" | |||
#include "lolgl.h" | |||
using namespace std; | |||
using namespace lol; | |||
#include "../neercs.h" | |||
#include "render.h" | |||
#include "text-render.h" | |||
extern char const *lolfx_text; | |||
/* | |||
* Text rendering interface | |||
*/ | |||
TextRender::TextRender(caca_canvas_t *caca, ivec2 font_size) | |||
: m_caca(caca), | |||
m_font_size(font_size), | |||
m_canvas_size(caca_get_canvas_width(m_caca), | |||
caca_get_canvas_height(m_caca)), | |||
m_fbo_size(m_font_size * m_canvas_size), | |||
m_cells(m_canvas_size.x * m_canvas_size.y) | |||
{ | |||
for (int j = 0; j < m_canvas_size.y; j++) | |||
for (int i = 0; i < m_canvas_size.x; i++) | |||
m_vertices << vec2(i, j); | |||
} | |||
void TextRender::Init() | |||
{ | |||
m_font = new TileSet("neercs/video/resource/map.png", | |||
ivec2(256, 256), ivec2(1)); | |||
m_shader = Shader::Create(lolfx_text); | |||
m_coord = m_shader->GetAttribLocation("in_Position", | |||
VertexUsage::Position, 0); | |||
m_color = m_shader->GetAttribLocation("in_Attr", | |||
VertexUsage::Color, 0); | |||
m_char = m_shader->GetAttribLocation("in_Char", | |||
VertexUsage::Color, 1); | |||
m_texture = m_shader->GetUniformLocation("in_Texture"); | |||
m_transform = m_shader->GetUniformLocation("in_Transform"); | |||
m_vdecl | |||
= new VertexDeclaration(VertexStream<vec2>(VertexUsage::Position), | |||
VertexStream<uint32_t>(VertexUsage::Color), | |||
VertexStream<uint32_t>(VertexUsage::Color)); | |||
m_vbo1 = new VertexBuffer(m_vertices.Bytes()); | |||
void *vertices = m_vbo1->Lock(0, 0); | |||
memcpy(vertices, &m_vertices[0], m_vertices.Bytes()); | |||
m_vbo1->Unlock(); | |||
m_vbo2 = new VertexBuffer(m_cells * sizeof(int32_t)); | |||
m_vbo3 = new VertexBuffer(m_cells * sizeof(int32_t)); | |||
m_fbo = new FrameBuffer(m_fbo_size); | |||
} | |||
void TextRender::Render() | |||
{ | |||
/* Transform matrix for the scene: | |||
* - translate to the centre of the glyph | |||
* - scale by 2.f * font_size / fbo_size | |||
* - translate to the lower left corner */ | |||
mat4 xform = mat4::translate(-1.f, -1.f + 2.0f * m_font_size.y | |||
* m_canvas_size.y / m_fbo_size.y, 0.f) | |||
* mat4::scale(vec3(2.f * m_font_size / m_fbo_size, 1.f) | |||
* vec3(1.f, -1.f, 1.f)) | |||
* mat4::translate(0.5f, 0.5f, 0.f); | |||
/* Upload libcaca canvas contents to the vertex buffers */ | |||
uint32_t *colors = (uint32_t *)m_vbo2->Lock(0, 0); | |||
for (int j = 0; j < m_canvas_size.y; j++) | |||
for (int i = 0; i < m_canvas_size.x; i++) | |||
{ | |||
uint32_t attr = caca_get_attr(m_caca, i, j); | |||
uint16_t fg = caca_attr_to_rgb12_fg(attr); | |||
uint16_t bg = caca_attr_to_rgb12_bg(attr); | |||
caca_set_color_argb(m_caca, fg, bg); | |||
attr = caca_get_attr(m_caca, -1, -1); | |||
caca_put_attr(m_caca, i, j, attr); | |||
} | |||
memcpy(colors, caca_get_canvas_attrs(m_caca), | |||
m_cells * sizeof(uint32_t)); | |||
m_vbo2->Unlock(); | |||
uint32_t *chars = (uint32_t *)m_vbo3->Lock(0, 0); | |||
memcpy(chars, caca_get_canvas_chars(m_caca), | |||
m_cells * sizeof(uint32_t)); | |||
m_vbo3->Unlock(); | |||
m_fbo->Bind(); | |||
glViewport(0, 0, m_fbo_size.x, m_fbo_size.y); | |||
glDisable(GL_DEPTH_TEST); | |||
glEnable(GL_POINT_SPRITE); | |||
//glEnable(GL_VERTEX_PROGRAM_POINT_SIZE); | |||
glDisable(GL_POINT_SMOOTH); | |||
glPointSize((float)max(m_font_size.x, m_font_size.y)); | |||
m_shader->Bind(); | |||
m_font->Bind(); | |||
m_shader->SetUniform(m_texture, 0); | |||
m_shader->SetUniform(m_transform, xform); | |||
m_vdecl->SetStream(m_vbo1, m_coord); | |||
m_vdecl->SetStream(m_vbo2, m_color); | |||
m_vdecl->SetStream(m_vbo3, m_char); | |||
m_vdecl->Bind(); | |||
m_vdecl->DrawElements(MeshPrimitive::Points, 0, m_cells); | |||
m_vdecl->Unbind(); | |||
m_font->Unbind(); | |||
m_shader->Unbind(); | |||
glDisable(GL_POINT_SPRITE); | |||
m_fbo->Unbind(); | |||
} | |||
void TextRender::Blit(ivec2 pos, ivec2 size) | |||
{ | |||
glDisable(GL_BLEND); | |||
glEnable(GL_TEXTURE_2D); | |||
glBindTexture(GL_TEXTURE_2D, m_fbo->GetTexture()); | |||
glColor3f(1.0f, 1.0f, 1.0f); | |||
vec2 tc = (vec2)m_canvas_size * m_font_size / m_fbo_size; | |||
glLoadIdentity(); | |||
glBegin(GL_QUADS); | |||
glTexCoord2f(tc.x, tc.y); | |||
glVertex2i(pos.x + size.x, pos.y); | |||
glTexCoord2f(0.0f, tc.y); | |||
glVertex2i(pos.x, pos.y); | |||
glTexCoord2f(0.0f, 0.0f); | |||
glVertex2i(pos.x, pos.y + size.y); | |||
glTexCoord2f(tc.x, 0.0f); | |||
glVertex2i(pos.x + size.x, pos.y + size.y); | |||
glEnd(); | |||
} | |||
@@ -0,0 +1,31 @@ | |||
// | |||
// Neercs | |||
// | |||
#if !defined __TEXT_RENDER_H__ | |||
#define __TEXT_RENDER_H__ | |||
struct TextRender | |||
{ | |||
TextRender(caca_canvas_t *caca, ivec2 font_size); | |||
void Init(); | |||
void Render(); | |||
void Blit(ivec2 pos, ivec2 size); | |||
private: | |||
caca_canvas_t *m_caca; | |||
ivec2 m_font_size, m_canvas_size, m_fbo_size; | |||
int m_cells; | |||
Array<vec2> m_vertices; | |||
TileSet *m_font; | |||
Shader *m_shader; | |||
ShaderAttrib m_coord, m_color, m_char; | |||
ShaderUniform m_texture, m_transform; | |||
VertexDeclaration *m_vdecl; | |||
VertexBuffer *m_vbo1, *m_vbo2, *m_vbo3; | |||
FrameBuffer *m_fbo; | |||
}; | |||
#endif // __TEXT_RENDER_H__ | |||
@@ -0,0 +1,55 @@ | |||
-- GLSL.Vert -- | |||
#version 130 | |||
attribute vec2 in_Position; | |||
attribute uint in_Char, in_Attr; | |||
varying vec4 pass_Foreground; | |||
varying vec4 pass_Background; | |||
varying vec2 pass_UV; | |||
uniform mat4 in_Transform; | |||
void main() | |||
{ | |||
float u = float(in_Char & 0xfu) / 32.0 + 0.0; | |||
float v = float((in_Char >> 4u) & 0xfu) / 32.0 + 0.5; | |||
pass_UV = vec2(u, v); | |||
float A = float(in_Attr >> 29u) / 7.0; | |||
float B = float((in_Attr >> 25u) & 0xfu) / 15.0; | |||
float C = float((in_Attr >> 21u) & 0xfu) / 15.0; | |||
float D = float((in_Attr >> 18u) & 0x7u) / 7.0; | |||
float E = float((in_Attr >> 15u) & 0x7u) / 7.0; | |||
float F = float((in_Attr >> 11u) & 0xfu) / 15.0; | |||
float G = float((in_Attr >> 7u) & 0xfu) / 15.0; | |||
float H = float((in_Attr >> 4u) & 0x7u) / 7.0; | |||
pass_Background = vec4(B, C, D, 1.0 - A); | |||
pass_Foreground = vec4(F, G, H, 1.0 - E); | |||
// This only works with glEnable(GL_VERTEX_PROGRAM_POINT_SIZE); | |||
//gl_PointSize = 40; | |||
gl_Position = in_Transform * vec4(in_Position, 0.0, 1.0); | |||
} | |||
-- GLSL.Frag -- | |||
#version 130 | |||
varying vec4 pass_Foreground; | |||
varying vec4 pass_Background; | |||
varying vec2 pass_UV; | |||
uniform sampler2D in_Texture; | |||
void main(void) | |||
{ | |||
vec2 c = gl_PointCoord * (1.0 / 32.0) + pass_UV; | |||
float t = texture2D(in_Texture, c).x; | |||
gl_FragColor = mix(pass_Background, pass_Foreground, t); | |||
} | |||