changes to librw layer, GLES now runtime choice

This commit is contained in:
aap 2020-11-18 10:27:55 +01:00
parent b58a54527e
commit 82b0103c67
30 changed files with 563 additions and 181 deletions

View File

@ -134,6 +134,7 @@ vehicleRenderCB(rw::Atomic *atomic, rw::gl3::InstanceDataHeader *header)
} }
SetRenderState(SRCBLEND, BLENDSRCALPHA); SetRenderState(SRCBLEND, BLENDSRCALPHA);
setTexture(1, nil);
#ifndef RW_GL_USE_VAOS #ifndef RW_GL_USE_VAOS
disableAttribPointers(header->attribDesc, header->numAttribs); disableAttribPointers(header->attribDesc, header->numAttribs);
@ -158,13 +159,8 @@ CreateVehiclePipe(void)
{ {
#ifdef RW_GLES2 #include "shaders/neoVehicle_fs_gl.inc"
#include "gl2_shaders/neoVehicle_fs_gl2.inc" #include "shaders/neoVehicle_vs_gl.inc"
#include "gl2_shaders/neoVehicle_vs_gl2.inc"
#else
#include "shaders/neoVehicle_fs_gl3.inc"
#include "shaders/neoVehicle_vs_gl3.inc"
#endif
const char *vs[] = { shaderDecl, header_vert_src, neoVehicle_vert_src, nil }; const char *vs[] = { shaderDecl, header_vert_src, neoVehicle_vert_src, nil };
const char *fs[] = { shaderDecl, header_frag_src, neoVehicle_frag_src, nil }; const char *fs[] = { shaderDecl, header_frag_src, neoVehicle_frag_src, nil };
neoVehicleShader = Shader::create(vs, fs); neoVehicleShader = Shader::create(vs, fs);
@ -256,6 +252,7 @@ worldRenderCB(rw::Atomic *atomic, rw::gl3::InstanceDataHeader *header)
drawInst(header, inst); drawInst(header, inst);
inst++; inst++;
} }
setTexture(1, nil);
#ifndef RW_GL_USE_VAOS #ifndef RW_GL_USE_VAOS
disableAttribPointers(header->attribDesc, header->numAttribs); disableAttribPointers(header->attribDesc, header->numAttribs);
#endif #endif
@ -273,13 +270,8 @@ CreateWorldPipe(void)
ReadTweakValueTable((char*)work_buff, WorldLightmapBlend); ReadTweakValueTable((char*)work_buff, WorldLightmapBlend);
{ {
#ifdef RW_GLES2 #include "shaders/neoWorldIII_fs_gl.inc"
#include "gl2_shaders/neoWorldIII_fs_gl2.inc" #include "shaders/default_UV2_gl.inc"
#include "gl2_shaders/default_UV2_gl2.inc"
#else
#include "shaders/neoWorldIII_fs_gl3.inc"
#include "shaders/default_UV2_gl3.inc"
#endif
const char *vs[] = { shaderDecl, header_vert_src, default_UV2_vert_src, nil }; const char *vs[] = { shaderDecl, header_vert_src, default_UV2_vert_src, nil };
const char *fs[] = { shaderDecl, header_frag_src, neoWorldIII_frag_src, nil }; const char *fs[] = { shaderDecl, header_frag_src, neoWorldIII_frag_src, nil };
neoWorldShader = Shader::create(vs, fs); neoWorldShader = Shader::create(vs, fs);
@ -381,13 +373,8 @@ CreateGlossPipe(void)
using namespace rw::gl3; using namespace rw::gl3;
{ {
#ifdef RW_GLES2 #include "shaders/neoGloss_fs_gl.inc"
#include "gl2_shaders/neoGloss_fs_gl2.inc" #include "shaders/neoGloss_vs_gl.inc"
#include "gl2_shaders/neoGloss_vs_gl2.inc"
#else
#include "shaders/neoGloss_fs_gl3.inc"
#include "shaders/neoGloss_vs_gl3.inc"
#endif
const char *vs[] = { shaderDecl, header_vert_src, neoGloss_vert_src, nil }; const char *vs[] = { shaderDecl, header_vert_src, neoGloss_vert_src, nil };
const char *fs[] = { shaderDecl, header_frag_src, neoGloss_frag_src, nil }; const char *fs[] = { shaderDecl, header_frag_src, neoGloss_frag_src, nil };
neoGlossShader = Shader::create(vs, fs); neoGlossShader = Shader::create(vs, fs);
@ -558,13 +545,8 @@ CreateRimLightPipes(void)
} }
{ {
#ifdef RW_GLES2 #include "shaders/simple_fs_gl.inc"
#include "gl2_shaders/simple_fs_gl2.inc" #include "shaders/neoRimSkin_gl.inc"
#include "gl2_shaders/neoRimSkin_gl2.inc"
#else
#include "shaders/simple_fs_gl3.inc"
#include "shaders/neoRimSkin_gl3.inc"
#endif
const char *vs[] = { shaderDecl, header_vert_src, neoRimSkin_vert_src, nil }; const char *vs[] = { shaderDecl, header_vert_src, neoRimSkin_vert_src, nil };
const char *fs[] = { shaderDecl, header_frag_src, simple_frag_src, nil }; const char *fs[] = { shaderDecl, header_frag_src, simple_frag_src, nil };
neoRimSkinShader = Shader::create(vs, fs); neoRimSkinShader = Shader::create(vs, fs);
@ -572,13 +554,8 @@ CreateRimLightPipes(void)
} }
{ {
#ifdef RW_GLES2 #include "shaders/simple_fs_gl.inc"
#include "gl2_shaders/simple_fs_gl2.inc" #include "shaders/neoRim_gl.inc"
#include "gl2_shaders/neoRim_gl2.inc"
#else
#include "shaders/simple_fs_gl3.inc"
#include "shaders/neoRim_gl3.inc"
#endif
const char *vs[] = { shaderDecl, header_vert_src, neoRim_vert_src, nil }; const char *vs[] = { shaderDecl, header_vert_src, neoRim_vert_src, nil };
const char *fs[] = { shaderDecl, header_frag_src, simple_frag_src, nil }; const char *fs[] = { shaderDecl, header_frag_src, simple_frag_src, nil };
neoRimShader = Shader::create(vs, fs); neoRimShader = Shader::create(vs, fs);

View File

@ -150,13 +150,8 @@ CPostFX::Open(RwCamera *cam)
#ifdef RW_OPENGL #ifdef RW_OPENGL
using namespace rw::gl3; using namespace rw::gl3;
{ {
#ifdef RW_GLES2 #include "shaders/im2d_gl.inc"
#include "gl2_shaders/im2d_gl2.inc" #include "shaders/colourfilterIII_fs_gl.inc"
#include "gl2_shaders/colourfilterIII_fs_gl2.inc"
#else
#include "shaders/im2d_gl3.inc"
#include "shaders/colourfilterIII_fs_gl3.inc"
#endif
const char *vs[] = { shaderDecl, header_vert_src, im2d_vert_src, nil }; const char *vs[] = { shaderDecl, header_vert_src, im2d_vert_src, nil };
const char *fs[] = { shaderDecl, header_frag_src, colourfilterIII_frag_src, nil }; const char *fs[] = { shaderDecl, header_frag_src, colourfilterIII_frag_src, nil };
colourFilterIII = Shader::create(vs, fs); colourFilterIII = Shader::create(vs, fs);
@ -164,17 +159,12 @@ CPostFX::Open(RwCamera *cam)
} }
{ {
#ifdef RW_GLES2 #include "shaders/im2d_gl.inc"
#include "gl2_shaders/im2d_gl2.inc" #include "shaders/contrast_fs_gl.inc"
#include "gl2_shaders/contrast_fs_gl2.inc"
#else
#include "shaders/im2d_gl3.inc"
#include "shaders/contrast_fs_gl3.inc"
const char *vs[] = { shaderDecl, header_vert_src, im2d_vert_src, nil }; const char *vs[] = { shaderDecl, header_vert_src, im2d_vert_src, nil };
const char *fs[] = { shaderDecl, header_frag_src, contrast_frag_src, nil }; const char *fs[] = { shaderDecl, header_frag_src, contrast_frag_src, nil };
contrast = Shader::create(vs, fs); contrast = Shader::create(vs, fs);
assert(contrast); assert(contrast);
#endif
} }
#endif #endif

View File

@ -1,68 +1,68 @@
all: im2d_gl3.inc simple_fs_gl3.inc default_UV2_gl3.inc \ all: im2d_gl.inc simple_fs_gl.inc default_UV2_gl.inc \
colourfilterIII_fs_gl3.inc contrast_fs_gl3.inc \ colourfilterIII_fs_gl.inc contrast_fs_gl.inc \
neoRim_gl3.inc neoRimSkin_gl3.inc \ neoRim_gl.inc neoRimSkin_gl.inc \
neoWorldIII_fs_gl3.inc neoGloss_vs_gl3.inc neoGloss_fs_gl3.inc \ neoWorldIII_fs_gl.inc neoGloss_vs_gl.inc neoGloss_fs_gl.inc \
neoVehicle_vs_gl3.inc neoVehicle_fs_gl3.inc neoVehicle_vs_gl.inc neoVehicle_fs_gl.inc
im2d_gl3.inc: im2d.vert im2d_gl.inc: im2d.vert
(echo 'const char *im2d_vert_src =';\ (echo 'const char *im2d_vert_src =';\
sed 's/..*/"&\\n"/' im2d.vert;\ sed 's/..*/"&\\n"/' im2d.vert;\
echo ';') >im2d_gl3.inc echo ';') >im2d_gl.inc
simple_fs_gl3.inc: simple.frag simple_fs_gl.inc: simple.frag
(echo 'const char *simple_frag_src =';\ (echo 'const char *simple_frag_src =';\
sed 's/..*/"&\\n"/' simple.frag;\ sed 's/..*/"&\\n"/' simple.frag;\
echo ';') >simple_fs_gl3.inc echo ';') >simple_fs_gl.inc
default_UV2_gl3.inc: default_UV2.vert default_UV2_gl.inc: default_UV2.vert
(echo 'const char *default_UV2_vert_src =';\ (echo 'const char *default_UV2_vert_src =';\
sed 's/..*/"&\\n"/' default_UV2.vert;\ sed 's/..*/"&\\n"/' default_UV2.vert;\
echo ';') >default_UV2_gl3.inc echo ';') >default_UV2_gl.inc
colourfilterIII_fs_gl3.inc: colourfilterIII.frag colourfilterIII_fs_gl.inc: colourfilterIII.frag
(echo 'const char *colourfilterIII_frag_src =';\ (echo 'const char *colourfilterIII_frag_src =';\
sed 's/..*/"&\\n"/' colourfilterIII.frag;\ sed 's/..*/"&\\n"/' colourfilterIII.frag;\
echo ';') >colourfilterIII_fs_gl3.inc echo ';') >colourfilterIII_fs_gl.inc
contrast_fs_gl3.inc: contrast.frag contrast_fs_gl.inc: contrast.frag
(echo 'const char *contrast_frag_src =';\ (echo 'const char *contrast_frag_src =';\
sed 's/..*/"&\\n"/' contrast.frag;\ sed 's/..*/"&\\n"/' contrast.frag;\
echo ';') >contrast_fs_gl3.inc echo ';') >contrast_fs_gl.inc
neoRim_gl3.inc: neoRim.vert neoRim_gl.inc: neoRim.vert
(echo 'const char *neoRim_vert_src =';\ (echo 'const char *neoRim_vert_src =';\
sed 's/..*/"&\\n"/' neoRim.vert;\ sed 's/..*/"&\\n"/' neoRim.vert;\
echo ';') >neoRim_gl3.inc echo ';') >neoRim_gl.inc
neoRimSkin_gl3.inc: neoRimSkin.vert neoRimSkin_gl.inc: neoRimSkin.vert
(echo 'const char *neoRimSkin_vert_src =';\ (echo 'const char *neoRimSkin_vert_src =';\
sed 's/..*/"&\\n"/' neoRimSkin.vert;\ sed 's/..*/"&\\n"/' neoRimSkin.vert;\
echo ';') >neoRimSkin_gl3.inc echo ';') >neoRimSkin_gl.inc
neoWorldIII_fs_gl3.inc: neoWorldIII.frag neoWorldIII_fs_gl.inc: neoWorldIII.frag
(echo 'const char *neoWorldIII_frag_src =';\ (echo 'const char *neoWorldIII_frag_src =';\
sed 's/..*/"&\\n"/' neoWorldIII.frag;\ sed 's/..*/"&\\n"/' neoWorldIII.frag;\
echo ';') >neoWorldIII_fs_gl3.inc echo ';') >neoWorldIII_fs_gl.inc
neoGloss_fs_gl3.inc: neoGloss.frag neoGloss_fs_gl.inc: neoGloss.frag
(echo 'const char *neoGloss_frag_src =';\ (echo 'const char *neoGloss_frag_src =';\
sed 's/..*/"&\\n"/' neoGloss.frag;\ sed 's/..*/"&\\n"/' neoGloss.frag;\
echo ';') >neoGloss_fs_gl3.inc echo ';') >neoGloss_fs_gl.inc
neoGloss_vs_gl3.inc: neoGloss.vert neoGloss_vs_gl.inc: neoGloss.vert
(echo 'const char *neoGloss_vert_src =';\ (echo 'const char *neoGloss_vert_src =';\
sed 's/..*/"&\\n"/' neoGloss.vert;\ sed 's/..*/"&\\n"/' neoGloss.vert;\
echo ';') >neoGloss_vs_gl3.inc echo ';') >neoGloss_vs_gl.inc
neoVehicle_vs_gl3.inc: neoVehicle.vert neoVehicle_vs_gl.inc: neoVehicle.vert
(echo 'const char *neoVehicle_vert_src =';\ (echo 'const char *neoVehicle_vert_src =';\
sed 's/..*/"&\\n"/' neoVehicle.vert;\ sed 's/..*/"&\\n"/' neoVehicle.vert;\
echo ';') >neoVehicle_vs_gl3.inc echo ';') >neoVehicle_vs_gl.inc
neoVehicle_fs_gl3.inc: neoVehicle.frag neoVehicle_fs_gl.inc: neoVehicle.frag
(echo 'const char *neoVehicle_frag_src =';\ (echo 'const char *neoVehicle_frag_src =';\
sed 's/..*/"&\\n"/' neoVehicle.frag;\ sed 's/..*/"&\\n"/' neoVehicle.frag;\
echo ';') >neoVehicle_fs_gl3.inc echo ';') >neoVehicle_fs_gl.inc

View File

@ -1,11 +1,9 @@
uniform sampler2D tex0; uniform sampler2D tex0;
uniform vec4 u_blurcolor; uniform vec4 u_blurcolor;
in vec4 v_color; FSIN vec4 v_color;
in vec2 v_tex0; FSIN vec2 v_tex0;
in float v_fog; FSIN float v_fog;
out vec4 color;
void void
main(void) main(void)
@ -17,7 +15,10 @@ main(void)
vec4 tmp = dst*(1.0-a) + prev*u_blurcolor*a; vec4 tmp = dst*(1.0-a) + prev*u_blurcolor*a;
prev = clamp(tmp, 0.0, 1.0); prev = clamp(tmp, 0.0, 1.0);
} }
vec4 color;
color.rgb = prev.rgb; color.rgb = prev.rgb;
color.a = 1.0f; color.a = 1.0f;
FRAGCOLOR(color);
} }

View File

@ -0,0 +1,26 @@
const char *colourfilterIII_frag_src =
"uniform sampler2D tex0;\n"
"uniform vec4 u_blurcolor;\n"
"FSIN vec4 v_color;\n"
"FSIN vec2 v_tex0;\n"
"FSIN float v_fog;\n"
"void\n"
"main(void)\n"
"{\n"
" float a = u_blurcolor.a;\n"
" vec4 dst = texture(tex0, vec2(v_tex0.x, 1.0-v_tex0.y));\n"
" vec4 prev = dst;\n"
" for(int i = 0; i < 5; i++){\n"
" vec4 tmp = dst*(1.0-a) + prev*u_blurcolor*a;\n"
" prev = clamp(tmp, 0.0, 1.0);\n"
" }\n"
" vec4 color;\n"
" color.rgb = prev.rgb;\n"
" color.a = 1.0f;\n"
" FRAGCOLOR(color);\n"
"}\n"
;

View File

@ -2,17 +2,18 @@ uniform sampler2D tex0;
uniform vec3 u_contrastAdd; uniform vec3 u_contrastAdd;
uniform vec3 u_contrastMult; uniform vec3 u_contrastMult;
in vec4 v_color; FSIN vec4 v_color;
in vec2 v_tex0; FSIN vec2 v_tex0;
in float v_fog; FSIN float v_fog;
out vec4 color;
void void
main(void) main(void)
{ {
vec4 dst = texture(tex0, vec2(v_tex0.x, 1.0-v_tex0.y)); vec4 dst = texture(tex0, vec2(v_tex0.x, 1.0-v_tex0.y));
vec4 color;
color.rgb = dst.rgb*u_contrastMult + u_contrastAdd; color.rgb = dst.rgb*u_contrastMult + u_contrastAdd;
color.a = 1.0f; color.a = 1.0f;
FRAGCOLOR(color);
} }

View File

@ -0,0 +1,21 @@
const char *contrast_frag_src =
"uniform sampler2D tex0;\n"
"uniform vec3 u_contrastAdd;\n"
"uniform vec3 u_contrastMult;\n"
"FSIN vec4 v_color;\n"
"FSIN vec2 v_tex0;\n"
"FSIN float v_fog;\n"
"void\n"
"main(void)\n"
"{\n"
" vec4 dst = texture(tex0, vec2(v_tex0.x, 1.0-v_tex0.y));\n"
" vec4 color;\n"
" color.rgb = dst.rgb*u_contrastMult + u_contrastAdd;\n"
" color.a = 1.0f;\n"
" FRAGCOLOR(color);\n"
"}\n"
;

View File

@ -1,13 +1,9 @@
layout(location = 0) in vec3 in_pos; VSIN(ATTRIB_POS) vec3 in_pos;
layout(location = 1) in vec3 in_normal;
layout(location = 2) in vec4 in_color;
layout(location = 3) in vec2 in_tex0;
layout(location = 4) in vec2 in_tex1;
out vec4 v_color; VSOUT vec4 v_color;
out vec2 v_tex0; VSOUT vec2 v_tex0;
out vec2 v_tex1; VSOUT vec2 v_tex1;
out float v_fog; VSOUT float v_fog;
void void
main(void) main(void)

View File

@ -0,0 +1,27 @@
const char *default_UV2_vert_src =
"VSIN(ATTRIB_POS) vec3 in_pos;\n"
"VSOUT vec4 v_color;\n"
"VSOUT vec2 v_tex0;\n"
"VSOUT vec2 v_tex1;\n"
"VSOUT float v_fog;\n"
"void\n"
"main(void)\n"
"{\n"
" vec4 Vertex = u_world * vec4(in_pos, 1.0);\n"
" gl_Position = u_proj * u_view * Vertex;\n"
" vec3 Normal = mat3(u_world) * in_normal;\n"
" v_tex0 = in_tex0;\n"
" v_tex1 = in_tex1;\n"
" v_color = in_color;\n"
" v_color.rgb += u_ambLight.rgb*surfAmbient;\n"
" v_color.rgb += DoDynamicLight(Vertex.xyz, Normal)*surfDiffuse;\n"
" v_color = clamp(v_color, 0.0, 1.0);\n"
" v_color *= u_matColor;\n"
" v_fog = DoFog(gl_Position.w);\n"
"}\n"
;

View File

@ -1,12 +1,10 @@
uniform vec4 u_xform; uniform vec4 u_xform;
layout(location = 0) in vec4 in_pos; VSIN(ATTRIB_POS) vec4 in_pos;
layout(location = 2) in vec4 in_color;
layout(location = 3) in vec2 in_tex0;
out vec4 v_color; VSOUT vec4 v_color;
out vec2 v_tex0; VSOUT vec2 v_tex0;
out float v_fog; VSOUT float v_fog;
void void
main(void) main(void)

View File

@ -0,0 +1,21 @@
const char *im2d_vert_src =
"uniform vec4 u_xform;\n"
"VSIN(ATTRIB_POS) vec4 in_pos;\n"
"VSOUT vec4 v_color;\n"
"VSOUT vec2 v_tex0;\n"
"VSOUT float v_fog;\n"
"void\n"
"main(void)\n"
"{\n"
" gl_Position = in_pos;\n"
" gl_Position.w = 1.0;\n"
" gl_Position.xy = gl_Position.xy * u_xform.xy + u_xform.zw;\n"
" v_fog = DoFog(gl_Position.z);\n"
" gl_Position.xyz *= gl_Position.w;\n"
" v_color = in_color;\n"
" v_tex0 = in_tex0;\n"
"}\n"
;

View File

@ -4,17 +4,15 @@ uniform vec4 u_reflProps;
#define glossMult (u_reflProps.x) #define glossMult (u_reflProps.x)
in vec3 v_normal; FSIN vec3 v_normal;
in vec3 v_light; FSIN vec3 v_light;
in vec2 v_tex0; FSIN vec2 v_tex0;
in float v_fog; FSIN float v_fog;
out vec4 color;
void void
main(void) main(void)
{ {
color = texture(tex0, vec2(v_tex0.x, 1.0-v_tex0.y)); vec4 color = texture(tex0, vec2(v_tex0.x, 1.0-v_tex0.y));
vec3 n = 2.0*v_normal-1.0; // unpack vec3 n = 2.0*v_normal-1.0; // unpack
vec3 v = 2.0*v_light-1.0; // vec3 v = 2.0*v_light-1.0; //
@ -22,5 +20,7 @@ main(void)
color = s*s*s*s*s*s*s*s*color*v_fog*glossMult; color = s*s*s*s*s*s*s*s*color*v_fog*glossMult;
DoAlphaTest(color.a); DoAlphaTest(color.a);
FRAGCOLOR(color);
} }

View File

@ -1,15 +1,11 @@
uniform vec3 u_eye; uniform vec3 u_eye;
VSIN(ATTRIB_POS) vec3 in_pos;
layout(location = 0) in vec3 in_pos; VSOUT vec3 v_normal;
layout(location = 1) in vec3 in_normal; VSOUT vec3 v_light;
layout(location = 2) in vec4 in_color; VSOUT vec2 v_tex0;
layout(location = 3) in vec2 in_tex0; VSOUT float v_fog;
out vec3 v_normal;
out vec3 v_light;
out vec2 v_tex0;
out float v_fog;
void void
main(void) main(void)

View File

@ -0,0 +1,28 @@
const char *neoGloss_frag_src =
"uniform sampler2D tex0;\n"
"uniform vec4 u_reflProps;\n"
"#define glossMult (u_reflProps.x)\n"
"FSIN vec3 v_normal;\n"
"FSIN vec3 v_light;\n"
"FSIN vec2 v_tex0;\n"
"FSIN float v_fog;\n"
"void\n"
"main(void)\n"
"{\n"
" vec4 color = texture(tex0, vec2(v_tex0.x, 1.0-v_tex0.y));\n"
" vec3 n = 2.0*v_normal-1.0; // unpack\n"
" vec3 v = 2.0*v_light-1.0; //\n"
" float s = dot(n, v);\n"
" color = s*s*s*s*s*s*s*s*color*v_fog*glossMult;\n"
" DoAlphaTest(color.a);\n"
" FRAGCOLOR(color);\n"
"}\n"
;

View File

@ -0,0 +1,27 @@
const char *neoGloss_vert_src =
"uniform vec3 u_eye;\n"
"VSIN(ATTRIB_POS) vec3 in_pos;\n"
"VSOUT vec3 v_normal;\n"
"VSOUT vec3 v_light;\n"
"VSOUT vec2 v_tex0;\n"
"VSOUT float v_fog;\n"
"void\n"
"main(void)\n"
"{\n"
" vec4 Vertex = u_world * vec4(in_pos, 1.0);\n"
" gl_Position = u_proj * u_view * Vertex;\n"
" vec3 Normal = mat3(u_world) * in_normal;\n"
" v_tex0 = in_tex0;\n"
" vec3 viewVec = normalize(u_eye - Vertex.xyz);\n"
" vec3 Light = normalize(viewVec - u_lightDirection[0].xyz);\n"
" v_normal = 0.5*(1.0 + vec3(0.0, 0.0, 1.0)); // compress\n"
" v_light = 0.5*(1.0 + Light); //\n"
" v_fog = DoFog(gl_Position.w);\n"
"}\n"
;

View File

@ -3,14 +3,11 @@ uniform vec4 u_rampStart;
uniform vec4 u_rampEnd; uniform vec4 u_rampEnd;
uniform vec3 u_rimData; uniform vec3 u_rimData;
layout(location = 0) in vec3 in_pos; VSIN(ATTRIB_POS) vec3 in_pos;
layout(location = 1) in vec3 in_normal;
layout(location = 2) in vec4 in_color;
layout(location = 3) in vec2 in_tex0;
out vec4 v_color; VSOUT vec4 v_color;
out vec2 v_tex0; VSOUT vec2 v_tex0;
out float v_fog; VSOUT float v_fog;
void void
main(void) main(void)

View File

@ -5,16 +5,11 @@ uniform vec4 u_rampStart;
uniform vec4 u_rampEnd; uniform vec4 u_rampEnd;
uniform vec3 u_rimData; uniform vec3 u_rimData;
layout(location = 0) in vec3 in_pos; VSIN(ATTRIB_POS) vec3 in_pos;
layout(location = 1) in vec3 in_normal;
layout(location = 2) in vec4 in_color;
layout(location = 3) in vec2 in_tex0;
layout(location = 11) in vec4 in_weights;
layout(location = 12) in vec4 in_indices;
out vec4 v_color; VSOUT vec4 v_color;
out vec2 v_tex0; VSOUT vec2 v_tex0;
out float v_fog; VSOUT float v_fog;
void void
main(void) main(void)

View File

@ -0,0 +1,45 @@
const char *neoRimSkin_vert_src =
"uniform mat4 u_boneMatrices[64];\n"
"uniform vec3 u_viewVec;\n"
"uniform vec4 u_rampStart;\n"
"uniform vec4 u_rampEnd;\n"
"uniform vec3 u_rimData;\n"
"VSIN(ATTRIB_POS) vec3 in_pos;\n"
"VSOUT vec4 v_color;\n"
"VSOUT vec2 v_tex0;\n"
"VSOUT float v_fog;\n"
"void\n"
"main(void)\n"
"{\n"
" vec3 SkinVertex = vec3(0.0, 0.0, 0.0);\n"
" vec3 SkinNormal = vec3(0.0, 0.0, 0.0);\n"
" for(int i = 0; i < 4; i++){\n"
" SkinVertex += (u_boneMatrices[int(in_indices[i])] * vec4(in_pos, 1.0)).xyz * in_weights[i];\n"
" SkinNormal += (mat3(u_boneMatrices[int(in_indices[i])]) * in_normal) * in_weights[i];\n"
" }\n"
" vec4 Vertex = u_world * vec4(SkinVertex, 1.0);\n"
" gl_Position = u_proj * u_view * Vertex;\n"
" vec3 Normal = mat3(u_world) * SkinNormal;\n"
" v_tex0 = in_tex0;\n"
" v_color = in_color;\n"
" v_color.rgb += u_ambLight.rgb*surfAmbient;\n"
" v_color.rgb += DoDynamicLight(Vertex.xyz, Normal)*surfDiffuse;\n"
" // rim light\n"
" float f = u_rimData.x - u_rimData.y*dot(Normal, u_viewVec);\n"
" vec4 rimlight = clamp(mix(u_rampEnd, u_rampStart, f)*u_rimData.z, 0.0, 1.0);\n"
" v_color.rgb += rimlight.rgb;\n"
" v_color = clamp(v_color, 0.0, 1.0);\n"
" v_color *= u_matColor;\n"
" v_fog = DoFog(gl_Position.z);\n"
"}\n"
;

View File

@ -0,0 +1,36 @@
const char *neoRim_vert_src =
"uniform vec3 u_viewVec;\n"
"uniform vec4 u_rampStart;\n"
"uniform vec4 u_rampEnd;\n"
"uniform vec3 u_rimData;\n"
"VSIN(ATTRIB_POS) vec3 in_pos;\n"
"VSOUT vec4 v_color;\n"
"VSOUT vec2 v_tex0;\n"
"VSOUT float v_fog;\n"
"void\n"
"main(void)\n"
"{\n"
" vec4 Vertex = u_world * vec4(in_pos, 1.0);\n"
" gl_Position = u_proj * u_view * Vertex;\n"
" vec3 Normal = mat3(u_world) * in_normal;\n"
" v_tex0 = in_tex0;\n"
" v_color = in_color;\n"
" v_color.rgb += u_ambLight.rgb*surfAmbient;\n"
" v_color.rgb += DoDynamicLight(Vertex.xyz, Normal)*surfDiffuse;\n"
" // rim light\n"
" float f = u_rimData.x - u_rimData.y*dot(Normal, u_viewVec);\n"
" vec4 rimlight = clamp(mix(u_rampEnd, u_rampStart, f)*u_rimData.z, 0.0, 1.0);\n"
" v_color.rgb += rimlight.rgb;\n"
" v_color = clamp(v_color, 0.0, 1.0);\n"
" v_color *= u_matColor;\n"
" v_fog = DoFog(gl_Position.w);\n"
"}\n"
;

View File

@ -1,13 +1,11 @@
uniform sampler2D tex0; uniform sampler2D tex0;
uniform sampler2D tex1; uniform sampler2D tex1;
in vec4 v_color; FSIN vec4 v_color;
in vec4 v_reflcolor; FSIN vec4 v_reflcolor;
in vec2 v_tex0; FSIN vec2 v_tex0;
in vec2 v_tex1; FSIN vec2 v_tex1;
in float v_fog; FSIN float v_fog;
out vec4 color;
void void
main(void) main(void)
@ -20,9 +18,12 @@ main(void)
vec3 pass2 = v_reflcolor.rgb * v_fog; vec3 pass2 = v_reflcolor.rgb * v_fog;
vec4 color;
color.rgb = pass1.rgb*pass1.a + pass2; color.rgb = pass1.rgb*pass1.a + pass2;
color.a = pass1.a; color.a = pass1.a;
// color.rgb = mix(u_fogColor.rgb, color.rgb, v_fog); // color.rgb = mix(u_fogColor.rgb, color.rgb, v_fog);
DoAlphaTest(color.a); DoAlphaTest(color.a);
FRAGCOLOR(color);
} }

View File

@ -8,16 +8,13 @@ uniform vec4 u_specColor[5];
#define shininess (u_reflProps.z) #define shininess (u_reflProps.z)
#define specularity (u_reflProps.w) #define specularity (u_reflProps.w)
layout(location = 0) in vec3 in_pos; VSIN(ATTRIB_POS) vec3 in_pos;
layout(location = 1) in vec3 in_normal;
layout(location = 2) in vec4 in_color;
layout(location = 3) in vec2 in_tex0;
out vec4 v_color; VSOUT vec4 v_color;
out vec4 v_reflcolor; VSOUT vec4 v_reflcolor;
out vec2 v_tex0; VSOUT vec2 v_tex0;
out vec2 v_tex1; VSOUT vec2 v_tex1;
out float v_fog; VSOUT float v_fog;
vec3 DoDirLightSpec(vec3 Ldir, vec3 Lcol, vec3 N, vec3 V, float power) vec3 DoDirLightSpec(vec3 Ldir, vec3 Lcol, vec3 N, vec3 V, float power)
{ {

View File

@ -0,0 +1,31 @@
const char *neoVehicle_frag_src =
"uniform sampler2D tex0;\n"
"uniform sampler2D tex1;\n"
"FSIN vec4 v_color;\n"
"FSIN vec4 v_reflcolor;\n"
"FSIN vec2 v_tex0;\n"
"FSIN vec2 v_tex1;\n"
"FSIN float v_fog;\n"
"void\n"
"main(void)\n"
"{\n"
" vec4 pass1 = v_color*texture(tex0, vec2(v_tex0.x, 1.0-v_tex0.y));\n"
" vec3 envmap = texture(tex1, vec2(v_tex1.x, 1.0-v_tex1.y)).rgb;\n"
" pass1.rgb = mix(pass1.rgb, envmap, v_reflcolor.a);\n"
" pass1.rgb = mix(u_fogColor.rgb, pass1.rgb, v_fog);\n"
"// pass1.rgb += v_reflcolor.rgb * v_fog;\n"
" vec3 pass2 = v_reflcolor.rgb * v_fog;\n"
" vec4 color;\n"
" color.rgb = pass1.rgb*pass1.a + pass2;\n"
" color.a = pass1.a;\n"
"// color.rgb = mix(u_fogColor.rgb, color.rgb, v_fog);\n"
" DoAlphaTest(color.a);\n"
" FRAGCOLOR(color);\n"
"}\n"
;

View File

@ -0,0 +1,53 @@
const char *neoVehicle_vert_src =
"uniform vec3 u_eye;\n"
"uniform vec4 u_reflProps;\n"
"uniform vec4 u_specDir[5];\n"
"uniform vec4 u_specColor[5];\n"
"#define fresnel (u_reflProps.x)\n"
"#define lightStrength (u_reflProps.y) // speclight alpha\n"
"#define shininess (u_reflProps.z)\n"
"#define specularity (u_reflProps.w)\n"
"VSIN(ATTRIB_POS) vec3 in_pos;\n"
"VSOUT vec4 v_color;\n"
"VSOUT vec4 v_reflcolor;\n"
"VSOUT vec2 v_tex0;\n"
"VSOUT vec2 v_tex1;\n"
"VSOUT float v_fog;\n"
"vec3 DoDirLightSpec(vec3 Ldir, vec3 Lcol, vec3 N, vec3 V, float power)\n"
"{\n"
" return pow(clamp(dot(N, normalize(V + -Ldir)), 0.0, 1.0), power)*Lcol;\n"
"}\n"
"void\n"
"main(void)\n"
"{\n"
" vec4 Vertex = u_world * vec4(in_pos, 1.0);\n"
" gl_Position = u_proj * u_view * Vertex;\n"
" vec3 Normal = mat3(u_world) * in_normal;\n"
" vec3 viewVec = normalize(u_eye - Vertex.xyz);\n"
" v_tex0 = in_tex0;\n"
" v_color = in_color;\n"
" v_color.rgb += u_ambLight.rgb*surfAmbient;\n"
" v_color.rgb += DoDynamicLight(Vertex.xyz, Normal)*surfDiffuse*lightStrength;\n"
" v_color = clamp(v_color, 0.0, 1.0);\n"
" v_color *= u_matColor;\n"
" // reflect V along Normal\n"
" vec3 uv2 = Normal*dot(viewVec, Normal)*2.0 - viewVec;\n"
" v_tex1 = uv2.xy*0.5 + 0.5;\n"
" float b = 1.0 - clamp(dot(viewVec, Normal), 0.0, 1.0);\n"
" v_reflcolor = vec4(0.0, 0.0, 0.0, 1.0);\n"
" v_reflcolor.a = mix(b*b*b*b*b, 1.0f, fresnel)*shininess;\n"
" for(int i = 0; i < 5; i++)\n"
" v_reflcolor.rgb += DoDirLightSpec(u_specDir[i].xyz, u_specColor[i].rgb, Normal, viewVec, u_specDir[i].w)*specularity*lightStrength;\n"
" v_fog = DoFog(gl_Position.w);\n"
"}\n"
;

View File

@ -3,12 +3,10 @@ uniform sampler2D tex1;
uniform vec4 u_lightMap; uniform vec4 u_lightMap;
in vec4 v_color; FSIN vec4 v_color;
in vec2 v_tex0; FSIN vec2 v_tex0;
in vec2 v_tex1; FSIN vec2 v_tex1;
in float v_fog; FSIN float v_fog;
out vec4 color;
void void
main(void) main(void)
@ -16,10 +14,12 @@ main(void)
vec4 t0 = texture(tex0, vec2(v_tex0.x, 1.0-v_tex0.y)); vec4 t0 = texture(tex0, vec2(v_tex0.x, 1.0-v_tex0.y));
vec4 t1 = texture(tex1, vec2(v_tex1.x, 1.0-v_tex1.y)); vec4 t1 = texture(tex1, vec2(v_tex1.x, 1.0-v_tex1.y));
color = t0*v_color*(1 + u_lightMap*(2*t1-1)); vec4 color = t0*v_color*(1.0 + u_lightMap*(2.0*t1-1.0));
color.a = v_color.a*t0.a*u_lightMap.a; color.a = v_color.a*t0.a*u_lightMap.a;
color.rgb = mix(u_fogColor.rgb, color.rgb, v_fog); color.rgb = mix(u_fogColor.rgb, color.rgb, v_fog);
DoAlphaTest(color.a); DoAlphaTest(color.a);
FRAGCOLOR(color);
} }

View File

@ -0,0 +1,27 @@
const char *neoWorldIII_frag_src =
"uniform sampler2D tex0;\n"
"uniform sampler2D tex1;\n"
"uniform vec4 u_lightMap;\n"
"FSIN vec4 v_color;\n"
"FSIN vec2 v_tex0;\n"
"FSIN vec2 v_tex1;\n"
"FSIN float v_fog;\n"
"void\n"
"main(void)\n"
"{\n"
" vec4 t0 = texture(tex0, vec2(v_tex0.x, 1.0-v_tex0.y));\n"
" vec4 t1 = texture(tex1, vec2(v_tex1.x, 1.0-v_tex1.y));\n"
" vec4 color = t0*v_color*(1.0 + u_lightMap*(2.0*t1-1.0));\n"
" color.a = v_color.a*t0.a*u_lightMap.a;\n"
" color.rgb = mix(u_fogColor.rgb, color.rgb, v_fog);\n"
" DoAlphaTest(color.a);\n"
" FRAGCOLOR(color);\n"
"}\n"
;

View File

@ -1,16 +1,17 @@
uniform sampler2D tex0; uniform sampler2D tex0;
in vec4 v_color; FSIN vec4 v_color;
in vec2 v_tex0; FSIN vec2 v_tex0;
in float v_fog; FSIN float v_fog;
out vec4 color;
void void
main(void) main(void)
{ {
vec4 color;
color = v_color*texture(tex0, vec2(v_tex0.x, 1.0-v_tex0.y)); color = v_color*texture(tex0, vec2(v_tex0.x, 1.0-v_tex0.y));
color.rgb = mix(u_fogColor.rgb, color.rgb, v_fog); color.rgb = mix(u_fogColor.rgb, color.rgb, v_fog);
DoAlphaTest(color.a); DoAlphaTest(color.a);
FRAGCOLOR(color);
} }

View File

@ -0,0 +1,19 @@
const char *simple_frag_src =
"uniform sampler2D tex0;\n"
"FSIN vec4 v_color;\n"
"FSIN vec2 v_tex0;\n"
"FSIN float v_fog;\n"
"void\n"
"main(void)\n"
"{\n"
" vec4 color;\n"
" color = v_color*texture(tex0, vec2(v_tex0.x, 1.0-v_tex0.y));\n"
" color.rgb = mix(u_fogColor.rgb, color.rgb, v_fog);\n"
" DoAlphaTest(color.a);\n"
" FRAGCOLOR(color);\n"
"}\n"
;

View File

@ -935,16 +935,3 @@ RtCharset *RtCharsetSetColors(RtCharset * charSet, const RwRGBA * foreGround,
RtCharset *RtCharsetGetDesc(RtCharset * charset, RtCharsetDesc * desc) { *desc = charset->desc; return charset; } RtCharset *RtCharsetGetDesc(RtCharset * charset, RtCharsetDesc * desc) { *desc = charset->desc; return charset; }
RtCharset *RtCharsetCreate(const RwRGBA * foreGround, const RwRGBA * backGround) { return Charset::create(foreGround, backGround); } RtCharset *RtCharsetCreate(const RwRGBA * foreGround, const RwRGBA * backGround) { return Charset::create(foreGround, backGround); }
RwBool RtCharsetDestroy(RtCharset * charSet) { charSet->destroy(); return true; } RwBool RtCharsetDestroy(RtCharset * charSet) { charSet->destroy(); return true; }
// fake shit
RwInt32 _rwD3D8FindCorrectRasterFormat(RwRasterType type, RwInt32 flags)
{
#ifdef RW_GL3
if(flags & (rwRASTERFORMATPAL8 | rwRASTERFORMAT8888))
return 'NOPE';
return 'YUP';
#endif
return flags & 0xF00;
}

View File

@ -150,11 +150,80 @@ RwTexDictionaryGtaStreamRead2(RwStream *stream, RwTexDictionary *texDict)
} }
#ifdef GTA_PC #ifdef GTA_PC
#ifdef RWLIBS
extern "C" RwInt32 _rwD3D8FindCorrectRasterFormat(RwRasterType type, RwInt32 flags); #ifdef LIBRW
#else
RwInt32 _rwD3D8FindCorrectRasterFormat(RwRasterType type, RwInt32 flags); #define CAPSVERSION 0
struct GPUcaps
{
uint32 version; // so we can force regeneration easily
uint32 platform;
uint32 subplatform;
uint32 dxtSupport;
};
static void
GetGPUcaps(GPUcaps *caps)
{
caps->version = CAPSVERSION;
caps->platform = rw::platform;
caps->subplatform = 0;
caps->dxtSupport = 0;
// TODO: more later
#ifdef RW_GL3
caps->subplatform = rw::gl3::gl3Caps.gles;
caps->dxtSupport = rw::gl3::gl3Caps.dxtSupported;
#endif #endif
#ifdef RW_D3D9
caps->dxtSupport = 1; // TODO, probably
#endif
}
void
ReadVideoCardCapsFile(GPUcaps *caps)
{
memset(caps, 0, sizeof(GPUcaps));
int32 file = CFileMgr::OpenFile("DATA\\CAPS.DAT", "rb");
if (file != 0) {
CFileMgr::Read(file, (char*)&caps->version, 4);
CFileMgr::Read(file, (char*)&caps->platform, 4);
CFileMgr::Read(file, (char*)&caps->subplatform, 4);
CFileMgr::Read(file, (char*)&caps->dxtSupport, 4);
CFileMgr::CloseFile(file);
}
}
bool
CheckVideoCardCaps(void)
{
GPUcaps caps, fcaps;
GetGPUcaps(&caps);
ReadVideoCardCapsFile(&fcaps);
return caps.version != fcaps.version ||
caps.platform != fcaps.platform ||
caps.subplatform != fcaps.subplatform ||
caps.dxtSupport != fcaps.dxtSupport;
}
void
WriteVideoCardCapsFile(void)
{
GPUcaps caps;
GetGPUcaps(&caps);
int32 file = CFileMgr::OpenFile("DATA\\CAPS.DAT", "wb");
if (file != 0) {
CFileMgr::Write(file, (char*)&caps.version, 4);
CFileMgr::Write(file, (char*)&caps.platform, 4);
CFileMgr::Write(file, (char*)&caps.subplatform, 4);
CFileMgr::Write(file, (char*)&caps.dxtSupport, 4);
CFileMgr::CloseFile(file);
}
}
#else
extern "C" RwInt32 _rwD3D8FindCorrectRasterFormat(RwRasterType type, RwInt32 flags);
void void
ReadVideoCardCapsFile(uint32 &cap32, uint32 &cap24, uint32 &cap16, uint32 &cap8) ReadVideoCardCapsFile(uint32 &cap32, uint32 &cap24, uint32 &cap16, uint32 &cap8)
{ {
@ -201,6 +270,7 @@ WriteVideoCardCapsFile(void)
CFileMgr::CloseFile(file); CFileMgr::CloseFile(file);
} }
} }
#endif
void void
ConvertingTexturesScreen(uint32 num, uint32 count, const char *text) ConvertingTexturesScreen(uint32 num, uint32 count, const char *text)
@ -281,6 +351,13 @@ CreateTxdImageForVideoCard()
return false; return false;
} }
#ifdef LIBRW
// so we can read back DXT with GLES
// only works for textures that are not yet loaded
// so let's hope that is the case for all
rw::gl3::needToReadBackTextures = true;
#endif
int32 i; int32 i;
for (i = 0; i < TXDSTORESIZE; i++) { for (i = 0; i < TXDSTORESIZE; i++) {
ConvertingTexturesScreen(i, TXDSTORESIZE, "CVT_MSG"); ConvertingTexturesScreen(i, TXDSTORESIZE, "CVT_MSG");
@ -308,6 +385,9 @@ CreateTxdImageForVideoCard()
delete []buf; delete []buf;
delete pDir; delete pDir;
CStreaming::RemoveTxd(i); CStreaming::RemoveTxd(i);
#ifdef LIBRW
rw::gl3::needToReadBackTextures = false;
#endif
return false; return false;
} }
@ -334,6 +414,10 @@ CreateTxdImageForVideoCard()
RwStreamClose(img, nil); RwStreamClose(img, nil);
delete []buf; delete []buf;
#ifdef LIBRW
rw::gl3::needToReadBackTextures = false;
#endif
if (!pDir->WriteDirFile("models\\txd.dir")) { if (!pDir->WriteDirFile("models\\txd.dir")) {
DealWithTxdWriteError(i, TXDSTORESIZE, "CVT_ERR"); DealWithTxdWriteError(i, TXDSTORESIZE, "CVT_ERR");
delete pDir; delete pDir;

2
vendor/librw vendored

@ -1 +1 @@
Subproject commit 7e80d45cdb6663f97d89ed443198ce6e37c4435e Subproject commit 4ac67e5df87da7d94725789cedad2b69e8687007