Merge branch 'master' into sdl2
This commit is contained in:
commit
ed087bb89e
320 changed files with 18335 additions and 9574 deletions
|
@ -1,4 +1,4 @@
|
|||
attribute vec4 attr_Position;
|
||||
attribute vec3 attr_Position;
|
||||
attribute vec4 attr_TexCoord0;
|
||||
|
||||
uniform mat4 u_ModelViewProjectionMatrix;
|
||||
|
@ -8,6 +8,6 @@ varying vec2 var_TexCoords;
|
|||
|
||||
void main()
|
||||
{
|
||||
gl_Position = u_ModelViewProjectionMatrix * attr_Position;
|
||||
gl_Position = u_ModelViewProjectionMatrix * vec4(attr_Position, 1.0);
|
||||
var_TexCoords = attr_TexCoord0.st;
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
attribute vec4 attr_Position;
|
||||
attribute vec3 attr_Position;
|
||||
attribute vec4 attr_TexCoord0;
|
||||
|
||||
uniform mat4 u_ModelViewProjectionMatrix;
|
||||
|
@ -8,6 +8,6 @@ varying vec2 var_TexCoords;
|
|||
|
||||
void main()
|
||||
{
|
||||
gl_Position = u_ModelViewProjectionMatrix * attr_Position;
|
||||
gl_Position = u_ModelViewProjectionMatrix * vec4(attr_Position, 1.0);
|
||||
var_TexCoords = attr_TexCoord0.st;
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
attribute vec4 attr_Position;
|
||||
attribute vec3 attr_Position;
|
||||
attribute vec4 attr_TexCoord0;
|
||||
attribute vec3 attr_Normal;
|
||||
|
||||
|
@ -32,7 +32,7 @@ vec3 DeformPosition(const vec3 pos, const vec3 normal, const vec2 st)
|
|||
|
||||
if (u_DeformGen == DGEN_BULGE)
|
||||
{
|
||||
phase *= M_PI * 0.25 * st.x;
|
||||
phase *= st.x;
|
||||
}
|
||||
else // if (u_DeformGen <= DGEN_WAVE_INVERSE_SAWTOOTH)
|
||||
{
|
||||
|
@ -48,7 +48,7 @@ vec3 DeformPosition(const vec3 pos, const vec3 normal, const vec2 st)
|
|||
}
|
||||
else if (u_DeformGen == DGEN_WAVE_SQUARE)
|
||||
{
|
||||
func = sign(sin(value * 2.0 * M_PI));
|
||||
func = sign(0.5 - fract(value));
|
||||
}
|
||||
else if (u_DeformGen == DGEN_WAVE_TRIANGLE)
|
||||
{
|
||||
|
@ -62,7 +62,7 @@ vec3 DeformPosition(const vec3 pos, const vec3 normal, const vec2 st)
|
|||
{
|
||||
func = (1.0 - fract(value));
|
||||
}
|
||||
else if (u_DeformGen == DGEN_BULGE)
|
||||
else // if (u_DeformGen == DGEN_BULGE)
|
||||
{
|
||||
func = sin(value);
|
||||
}
|
||||
|
@ -73,16 +73,16 @@ vec3 DeformPosition(const vec3 pos, const vec3 normal, const vec2 st)
|
|||
|
||||
void main()
|
||||
{
|
||||
vec4 position = attr_Position;
|
||||
vec3 normal = attr_Normal;
|
||||
vec3 position = attr_Position;
|
||||
vec3 normal = attr_Normal * 2.0 - vec3(1.0);
|
||||
|
||||
#if defined(USE_DEFORM_VERTEXES)
|
||||
position.xyz = DeformPosition(position.xyz, normal, attr_TexCoord0.st);
|
||||
position = DeformPosition(position, normal, attr_TexCoord0.st);
|
||||
#endif
|
||||
|
||||
gl_Position = u_ModelViewProjectionMatrix * position;
|
||||
gl_Position = u_ModelViewProjectionMatrix * vec4(position, 1.0);
|
||||
|
||||
vec3 dist = u_DlightInfo.xyz - position.xyz;
|
||||
vec3 dist = u_DlightInfo.xyz - position;
|
||||
|
||||
var_Tex1 = dist.xy * u_DlightInfo.a + vec2(0.5);
|
||||
float dlightmod = step(0.0, dot(dist, normal));
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
attribute vec4 attr_Position;
|
||||
attribute vec3 attr_Position;
|
||||
attribute vec4 attr_TexCoord0;
|
||||
|
||||
uniform mat4 u_ModelViewProjectionMatrix;
|
||||
|
@ -8,6 +8,6 @@ varying vec2 var_TexCoords;
|
|||
|
||||
void main()
|
||||
{
|
||||
gl_Position = u_ModelViewProjectionMatrix * attr_Position;
|
||||
gl_Position = u_ModelViewProjectionMatrix * vec4(attr_Position, 1.0);
|
||||
var_TexCoords = attr_TexCoord0.st;
|
||||
}
|
||||
|
|
|
@ -5,5 +5,5 @@ varying float var_Scale;
|
|||
void main()
|
||||
{
|
||||
gl_FragColor = u_Color;
|
||||
gl_FragColor.a *= sqrt(clamp(var_Scale, 0.0, 1.0));
|
||||
gl_FragColor.a = sqrt(clamp(var_Scale, 0.0, 1.0));
|
||||
}
|
||||
|
|
|
@ -1,27 +1,30 @@
|
|||
attribute vec4 attr_Position;
|
||||
attribute vec3 attr_Position;
|
||||
attribute vec3 attr_Normal;
|
||||
|
||||
attribute vec4 attr_TexCoord0;
|
||||
|
||||
//#if defined(USE_VERTEX_ANIMATION)
|
||||
attribute vec4 attr_Position2;
|
||||
#if defined(USE_VERTEX_ANIMATION)
|
||||
attribute vec3 attr_Position2;
|
||||
attribute vec3 attr_Normal2;
|
||||
//#endif
|
||||
#endif
|
||||
|
||||
uniform vec4 u_FogDistance;
|
||||
uniform vec4 u_FogDepth;
|
||||
uniform float u_FogEyeT;
|
||||
|
||||
//#if defined(USE_DEFORM_VERTEXES)
|
||||
#if defined(USE_DEFORM_VERTEXES)
|
||||
uniform int u_DeformGen;
|
||||
uniform float u_DeformParams[5];
|
||||
//#endif
|
||||
#endif
|
||||
|
||||
uniform float u_Time;
|
||||
uniform mat4 u_ModelViewProjectionMatrix;
|
||||
|
||||
//#if defined(USE_VERTEX_ANIMATION)
|
||||
#if defined(USE_VERTEX_ANIMATION)
|
||||
uniform float u_VertexLerp;
|
||||
//#endif
|
||||
#endif
|
||||
|
||||
uniform vec4 u_Color;
|
||||
|
||||
varying float var_Scale;
|
||||
|
||||
|
@ -41,7 +44,7 @@ vec3 DeformPosition(const vec3 pos, const vec3 normal, const vec2 st)
|
|||
|
||||
if (u_DeformGen == DGEN_BULGE)
|
||||
{
|
||||
phase *= M_PI * 0.25 * st.x;
|
||||
phase *= st.x;
|
||||
}
|
||||
else // if (u_DeformGen <= DGEN_WAVE_INVERSE_SAWTOOTH)
|
||||
{
|
||||
|
@ -57,7 +60,7 @@ vec3 DeformPosition(const vec3 pos, const vec3 normal, const vec2 st)
|
|||
}
|
||||
else if (u_DeformGen == DGEN_WAVE_SQUARE)
|
||||
{
|
||||
func = sign(sin(value * 2.0 * M_PI));
|
||||
func = sign(0.5 - fract(value));
|
||||
}
|
||||
else if (u_DeformGen == DGEN_WAVE_TRIANGLE)
|
||||
{
|
||||
|
@ -71,7 +74,7 @@ vec3 DeformPosition(const vec3 pos, const vec3 normal, const vec2 st)
|
|||
{
|
||||
func = (1.0 - fract(value));
|
||||
}
|
||||
else if (u_DeformGen == DGEN_BULGE)
|
||||
else // if (u_DeformGen == DGEN_BULGE)
|
||||
{
|
||||
func = sin(value);
|
||||
}
|
||||
|
@ -80,15 +83,15 @@ vec3 DeformPosition(const vec3 pos, const vec3 normal, const vec2 st)
|
|||
}
|
||||
#endif
|
||||
|
||||
float CalcFog(vec4 position)
|
||||
float CalcFog(vec3 position)
|
||||
{
|
||||
float s = dot(position, u_FogDistance) * 8.0;
|
||||
float t = dot(position, u_FogDepth);
|
||||
float s = dot(vec4(position, 1.0), u_FogDistance) * 8.0;
|
||||
float t = dot(vec4(position, 1.0), u_FogDepth);
|
||||
|
||||
float eyeOutside = step(0.0, -u_FogEyeT);
|
||||
float fogged = step(eyeOutside, t);
|
||||
|
||||
t = max(t, 1e-6);
|
||||
float eyeOutside = float(u_FogEyeT < 0.0);
|
||||
float fogged = float(t >= eyeOutside);
|
||||
|
||||
t += 1e-6;
|
||||
t *= fogged / (t - u_FogEyeT * eyeOutside);
|
||||
|
||||
return s * t;
|
||||
|
@ -97,18 +100,19 @@ float CalcFog(vec4 position)
|
|||
void main()
|
||||
{
|
||||
#if defined(USE_VERTEX_ANIMATION)
|
||||
vec4 position = mix(attr_Position, attr_Position2, u_VertexLerp);
|
||||
vec3 normal = normalize(mix(attr_Normal, attr_Normal2, u_VertexLerp));
|
||||
vec3 position = mix(attr_Position, attr_Position2, u_VertexLerp);
|
||||
vec3 normal = mix(attr_Normal, attr_Normal2, u_VertexLerp);
|
||||
normal = normalize(normal - vec3(0.5));
|
||||
#else
|
||||
vec4 position = attr_Position;
|
||||
vec3 normal = attr_Normal;
|
||||
vec3 position = attr_Position;
|
||||
vec3 normal = attr_Normal * 2.0 - vec3(1.0);
|
||||
#endif
|
||||
|
||||
#if defined(USE_DEFORM_VERTEXES)
|
||||
position.xyz = DeformPosition(position.xyz, normal, attr_TexCoord0.st);
|
||||
#endif
|
||||
|
||||
gl_Position = u_ModelViewProjectionMatrix * position;
|
||||
gl_Position = u_ModelViewProjectionMatrix * vec4(position, 1.0);
|
||||
|
||||
var_Scale = CalcFog(position);
|
||||
var_Scale = CalcFog(position) * u_Color.a * u_Color.a;
|
||||
}
|
||||
|
|
|
@ -37,6 +37,8 @@ void main()
|
|||
{
|
||||
color = color2;
|
||||
}
|
||||
|
||||
//color = color * (u_Texture1Env.xxxx + color2 * u_Texture1Env.z) + color2 * u_Texture1Env.y;
|
||||
#endif
|
||||
|
||||
gl_FragColor = color * var_Color;
|
||||
|
|
|
@ -73,7 +73,7 @@ vec3 DeformPosition(const vec3 pos, const vec3 normal, const vec2 st)
|
|||
|
||||
if (u_DeformGen == DGEN_BULGE)
|
||||
{
|
||||
phase *= M_PI * 0.25 * st.x;
|
||||
phase *= st.x;
|
||||
}
|
||||
else // if (u_DeformGen <= DGEN_WAVE_INVERSE_SAWTOOTH)
|
||||
{
|
||||
|
@ -89,11 +89,11 @@ vec3 DeformPosition(const vec3 pos, const vec3 normal, const vec2 st)
|
|||
}
|
||||
else if (u_DeformGen == DGEN_WAVE_SQUARE)
|
||||
{
|
||||
func = sign(sin(value * 2.0 * M_PI));
|
||||
func = sign(fract(0.5 - value));
|
||||
}
|
||||
else if (u_DeformGen == DGEN_WAVE_TRIANGLE)
|
||||
{
|
||||
func = 1.0 - abs(4.0 * fract(value + 0.25) - 2.0);
|
||||
func = abs(fract(value + 0.75) - 0.5) * 4.0 - 1.0;
|
||||
}
|
||||
else if (u_DeformGen == DGEN_WAVE_SAWTOOTH)
|
||||
{
|
||||
|
@ -103,7 +103,7 @@ vec3 DeformPosition(const vec3 pos, const vec3 normal, const vec2 st)
|
|||
{
|
||||
func = (1.0 - fract(value));
|
||||
}
|
||||
else if (u_DeformGen == DGEN_BULGE)
|
||||
else // if (u_DeformGen == DGEN_BULGE)
|
||||
{
|
||||
func = sin(value);
|
||||
}
|
||||
|
@ -124,7 +124,9 @@ vec2 GenTexCoords(int TCGen, vec3 position, vec3 normal, vec3 TCGenVector0, vec3
|
|||
else if (TCGen == TCGEN_ENVIRONMENT_MAPPED)
|
||||
{
|
||||
vec3 viewer = normalize(u_LocalViewOrigin - position);
|
||||
tex = -reflect(viewer, normal).yz * vec2(0.5, -0.5) + 0.5;
|
||||
vec2 ref = reflect(viewer, normal).yz;
|
||||
tex.s = ref.x * -0.5 + 0.5;
|
||||
tex.t = ref.y * 0.5 + 0.5;
|
||||
}
|
||||
else if (TCGen == TCGEN_VECTOR)
|
||||
{
|
||||
|
@ -139,13 +141,14 @@ vec2 GenTexCoords(int TCGen, vec3 position, vec3 normal, vec3 TCGenVector0, vec3
|
|||
vec2 ModTexCoords(vec2 st, vec3 position, vec4 texMatrix, vec4 offTurb)
|
||||
{
|
||||
float amplitude = offTurb.z;
|
||||
float phase = offTurb.w;
|
||||
vec2 st2 = vec2(dot(st, texMatrix.xz), dot(st, texMatrix.yw)) + offTurb.xy;
|
||||
float phase = offTurb.w * 2.0 * M_PI;
|
||||
vec2 st2;
|
||||
st2.x = st.x * texMatrix.x + (st.y * texMatrix.z + offTurb.x);
|
||||
st2.y = st.x * texMatrix.y + (st.y * texMatrix.w + offTurb.y);
|
||||
|
||||
vec3 offsetPos = position / 1024.0;
|
||||
offsetPos.x += offsetPos.z;
|
||||
vec2 offsetPos = vec2(position.x + position.z, position.y);
|
||||
|
||||
vec2 texOffset = sin((offsetPos.xy + vec2(phase)) * 2.0 * M_PI);
|
||||
vec2 texOffset = sin(offsetPos * (2.0 * M_PI / 1024.0) + vec2(phase));
|
||||
|
||||
return st2 + texOffset * amplitude;
|
||||
}
|
||||
|
@ -186,13 +189,13 @@ vec4 CalcColor(vec3 position, vec3 normal)
|
|||
#if defined(USE_FOG)
|
||||
float CalcFog(vec3 position)
|
||||
{
|
||||
float s = (dot(position, u_FogDistance.xyz) + u_FogDistance.w) * 8.0;
|
||||
float t = dot(position, u_FogDepth.xyz) + u_FogDepth.w;
|
||||
float s = dot(vec4(position, 1.0), u_FogDistance) * 8.0;
|
||||
float t = dot(vec4(position, 1.0), u_FogDepth);
|
||||
|
||||
float eyeOutside = step(0.0, -u_FogEyeT);
|
||||
float fogged = step(eyeOutside, t);
|
||||
|
||||
t = max(t, 1e-6);
|
||||
float eyeOutside = float(u_FogEyeT < 0.0);
|
||||
float fogged = float(t < eyeOutside);
|
||||
|
||||
t += 1e-6;
|
||||
t *= fogged / (t - u_FogEyeT * eyeOutside);
|
||||
|
||||
return s * t;
|
||||
|
@ -202,8 +205,9 @@ float CalcFog(vec3 position)
|
|||
void main()
|
||||
{
|
||||
#if defined(USE_VERTEX_ANIMATION)
|
||||
vec3 position = mix(attr_Position, attr_Position2, u_VertexLerp);
|
||||
vec3 normal = normalize(mix(attr_Normal, attr_Normal2, u_VertexLerp) * 2.0 - vec3(1.0));
|
||||
vec3 position = mix(attr_Position, attr_Position2, u_VertexLerp);
|
||||
vec3 normal = mix(attr_Normal, attr_Normal2, u_VertexLerp);
|
||||
normal = normalize(normal - vec3(0.5));
|
||||
#else
|
||||
vec3 position = attr_Position;
|
||||
vec3 normal = attr_Normal * 2.0 - vec3(1.0);
|
||||
|
|
|
@ -166,22 +166,41 @@ vec3 EnvironmentBRDF(float gloss, float NE, vec3 specular)
|
|||
float a1 = t.w;
|
||||
return clamp( a0 + specular * ( a1 - a0 ), 0.0, 1.0 );
|
||||
#elif 0
|
||||
// from http://seblagarde.wordpress.com/2011/08/17/hello-world/
|
||||
// from http://seblagarde.wordpress.com/2011/08/17/hello-world/
|
||||
return mix(specular.rgb, max(specular.rgb, vec3(gloss)), CalcFresnel(NE));
|
||||
#else
|
||||
// from http://advances.realtimerendering.com/s2011/Lazarov-Physically-Based-Lighting-in-Black-Ops%20%28Siggraph%202011%20Advances%20in%20Real-Time%20Rendering%20Course%29.pptx
|
||||
// from http://advances.realtimerendering.com/s2011/Lazarov-Physically-Based-Lighting-in-Black-Ops%20%28Siggraph%202011%20Advances%20in%20Real-Time%20Rendering%20Course%29.pptx
|
||||
return mix(specular.rgb, vec3(1.0), CalcFresnel(NE) / (4.0 - 3.0 * gloss));
|
||||
#endif
|
||||
}
|
||||
|
||||
float CalcBlinn(float NH, float shininess)
|
||||
{
|
||||
#if 0
|
||||
// from http://seblagarde.wordpress.com/2012/06/03/spherical-gaussien-approximation-for-blinn-phong-phong-and-fresnel/
|
||||
float a = shininess + 0.775;
|
||||
return exp(a * NH - a);
|
||||
#if defined(USE_BLINN) || defined(USE_BLINN_FRESNEL)
|
||||
// Normalized Blinn-Phong
|
||||
float norm = shininess * 0.125 + 1.0;
|
||||
#elif defined(USE_MCAULEY)
|
||||
// Cook-Torrance as done by Stephen McAuley
|
||||
// http://blog.selfshadow.com/publications/s2012-shading-course/mcauley/s2012_pbs_farcry3_notes_v2.pdf
|
||||
float norm = shininess * 0.25 + 0.125;
|
||||
#elif defined(USE_GOTANDA)
|
||||
// Neumann-Neumann as done by Yoshiharu Gotanda
|
||||
// http://research.tri-ace.com/Data/s2012_beyond_CourseNotes.pdf
|
||||
float norm = shininess * 0.124858 + 0.269182;
|
||||
#elif defined(USE_LAZAROV)
|
||||
// Cook-Torrance as done by Dimitar Lazarov
|
||||
// http://blog.selfshadow.com/publications/s2013-shading-course/lazarov/s2013_pbs_black_ops_2_notes.pdf
|
||||
float norm = shininess * 0.125 + 0.25;
|
||||
#else
|
||||
return pow(NH, shininess);
|
||||
float norm = 1.0;
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
// from http://seblagarde.wordpress.com/2012/06/03/spherical-gaussien-approximation-for-blinn-phong-phong-and-fresnel/
|
||||
float a = shininess + 0.775;
|
||||
return norm * exp(a * NH - a);
|
||||
#else
|
||||
return norm * pow(NH, shininess);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -215,145 +234,122 @@ float CalcFresnel(float EH)
|
|||
|
||||
float CalcVisibility(float NH, float NL, float NE, float EH, float gloss)
|
||||
{
|
||||
#if 1
|
||||
// From http://blog.selfshadow.com/publications/s2013-shading-course/lazarov/s2013_pbs_black_ops_2_notes.pdf
|
||||
#if defined(USE_GOTANDA)
|
||||
// Neumann-Neumann as done by Yoshiharu Gotanda
|
||||
// http://research.tri-ace.com/Data/s2012_beyond_CourseNotes.pdf
|
||||
return 1.0 / max(max(NL, NE), EPSILON);
|
||||
#elif defined(USE_LAZAROV)
|
||||
// Cook-Torrance as done by Dimitar Lazarov
|
||||
// http://blog.selfshadow.com/publications/s2013-shading-course/lazarov/s2013_pbs_black_ops_2_notes.pdf
|
||||
float k = min(1.0, gloss + 0.545);
|
||||
return 1.0 / (k * EH * EH + (1.0 - k));
|
||||
#elif 0
|
||||
return 1.0 / (k * (EH * EH - 1.0) + 1.0);
|
||||
#elif defined(USE_GGX)
|
||||
float roughness = exp2(gloss * -6.5);
|
||||
|
||||
#if defined(USE_GGX)
|
||||
// From http://blog.selfshadow.com/publications/s2013-shading-course/karis/s2013_pbs_epic_notes_v2.pdf
|
||||
float k = roughness + 1.0;
|
||||
k *= k * 0.125;
|
||||
#else
|
||||
float k = roughness;
|
||||
#endif
|
||||
// Modified from http://blog.selfshadow.com/publications/s2013-shading-course/karis/s2013_pbs_epic_notes_v2.pdf
|
||||
// NL, NE in numerator factored out from cook-torrance
|
||||
float k = roughness + 1.0;
|
||||
k *= k * 0.125;
|
||||
|
||||
float k2 = 1.0 - k;
|
||||
|
||||
float invGeo1 = NL * k2 + k;
|
||||
float invGeo2 = NE * k2 + k;
|
||||
|
||||
|
||||
return 1.0 / (invGeo1 * invGeo2);
|
||||
#else
|
||||
float geo = 2.0 * NH * min(NE, NL);
|
||||
geo /= max(EH, geo);
|
||||
|
||||
return geo;
|
||||
return 1.0;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
vec3 CalcSpecular(vec3 specular, float NH, float NL, float NE, float EH, float gloss, float shininess)
|
||||
{
|
||||
float blinn = CalcBlinn(NH, shininess);
|
||||
#if defined(USE_GGX)
|
||||
float distrib = CalcGGX(NH, gloss);
|
||||
#else
|
||||
float distrib = CalcBlinn(NH, shininess);
|
||||
#endif
|
||||
|
||||
#if defined(USE_BLINN)
|
||||
vec3 fSpecular = specular;
|
||||
#else
|
||||
vec3 fSpecular = mix(specular, vec3(1.0), CalcFresnel(EH));
|
||||
#endif
|
||||
|
||||
float vis = CalcVisibility(NH, NL, NE, EH, gloss);
|
||||
|
||||
#if defined(USE_BLINN)
|
||||
// Normalized Blinn-Phong
|
||||
return specular * blinn * (shininess * 0.125 + 1.0);
|
||||
#elif defined(USE_BLINN_FRESNEL)
|
||||
// Normalized Blinn-Phong with Fresnel
|
||||
return fSpecular * blinn * (shininess * 0.125 + 1.0);
|
||||
#elif defined(USE_MCAULEY)
|
||||
// Cook-Torrance as done by Stephen McAuley
|
||||
// http://blog.selfshadow.com/publications/s2012-shading-course/mcauley/s2012_pbs_farcry3_notes_v2.pdf
|
||||
return fSpecular * blinn * (shininess * 0.25 + 0.125);
|
||||
#elif defined(USE_GOTANDA)
|
||||
// Neumann-Neumann as done by Yoshiharu Gotanda
|
||||
// http://research.tri-ace.com/Data/s2012_beyond_CourseNotes.pdf
|
||||
return fSpecular * blinn * (shininess * 0.124858 + 0.269182) / max(max(NL, NE), EPSILON);
|
||||
#elif defined(USE_LAZAROV)
|
||||
// Cook-Torrance as done by Dimitar Lazarov
|
||||
// http://blog.selfshadow.com/publications/s2013-shading-course/lazarov/s2013_pbs_black_ops_2_notes.pdf
|
||||
return fSpecular * blinn * (shininess * 0.125 + 0.25) * vis;
|
||||
#endif
|
||||
|
||||
return vec3(0.0);
|
||||
return fSpecular * (distrib * vis);
|
||||
}
|
||||
|
||||
|
||||
float CalcLightAttenuation(vec3 dir, float sqrRadius)
|
||||
float CalcLightAttenuation(float point, float normDist)
|
||||
{
|
||||
// point light at >0 radius, directional otherwise
|
||||
float point = float(sqrRadius > 0.0);
|
||||
|
||||
// inverse square light
|
||||
float attenuation = sqrRadius / dot(dir, dir);
|
||||
|
||||
// zero light at radius, approximating q3 style
|
||||
// zero light at 1.0, approximating q3 style
|
||||
// also don't attenuate directional light
|
||||
attenuation = (0.5 * attenuation - 1.5) * point + 1.0;
|
||||
|
||||
float attenuation = (0.5 * normDist - 1.5) * point + 1.0;
|
||||
|
||||
// clamp attenuation
|
||||
#if defined(NO_LIGHT_CLAMP)
|
||||
attenuation = max(attenuation, 0.0);
|
||||
#else
|
||||
attenuation = clamp(attenuation, 0.0, 1.0);
|
||||
#endif
|
||||
|
||||
|
||||
return attenuation;
|
||||
}
|
||||
|
||||
// from http://www.thetenthplanet.de/archives/1180
|
||||
mat3 cotangent_frame( vec3 N, vec3 p, vec2 uv )
|
||||
{
|
||||
// get edge vectors of the pixel triangle
|
||||
vec3 dp1 = dFdx( p );
|
||||
vec3 dp2 = dFdy( p );
|
||||
vec2 duv1 = dFdx( uv );
|
||||
vec2 duv2 = dFdy( uv );
|
||||
|
||||
// solve the linear system
|
||||
vec3 dp2perp = cross( dp2, N );
|
||||
vec3 dp1perp = cross( N, dp1 );
|
||||
vec3 T = dp2perp * duv1.x + dp1perp * duv2.x;
|
||||
vec3 B = dp2perp * duv1.y + dp1perp * duv2.y;
|
||||
|
||||
// construct a scale-invariant frame
|
||||
float invmax = inversesqrt( max( dot(T,T), dot(B,B) ) );
|
||||
return mat3( T * invmax, B * invmax, N );
|
||||
// get edge vectors of the pixel triangle
|
||||
vec3 dp1 = dFdx( p );
|
||||
vec3 dp2 = dFdy( p );
|
||||
vec2 duv1 = dFdx( uv );
|
||||
vec2 duv2 = dFdy( uv );
|
||||
|
||||
// solve the linear system
|
||||
vec3 dp2perp = cross( dp2, N );
|
||||
vec3 dp1perp = cross( N, dp1 );
|
||||
vec3 T = dp2perp * duv1.x + dp1perp * duv2.x;
|
||||
vec3 B = dp2perp * duv1.y + dp1perp * duv2.y;
|
||||
|
||||
// construct a scale-invariant frame
|
||||
float invmax = inversesqrt( max( dot(T,T), dot(B,B) ) );
|
||||
return mat3( T * invmax, B * invmax, N );
|
||||
}
|
||||
|
||||
void main()
|
||||
{
|
||||
vec3 L, N, E, H;
|
||||
float NL, NH, NE, EH;
|
||||
|
||||
#if (defined(USE_LIGHT) && !defined(USE_FAST_LIGHT)) || defined(USE_PARALLAXMAP)
|
||||
|
||||
#if defined(USE_LIGHT) && !defined(USE_FAST_LIGHT)
|
||||
#if defined(USE_VERT_TANGENT_SPACE)
|
||||
mat3 tangentToWorld = mat3(var_Tangent.xyz, var_Bitangent.xyz, var_Normal.xyz);
|
||||
E = vec3(var_Normal.w, var_Tangent.w, var_Bitangent.w);
|
||||
#else
|
||||
mat3 tangentToWorld = cotangent_frame(var_Normal, -var_ViewDir, var_TexCoords.xy);
|
||||
E = var_ViewDir;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(USE_DELUXEMAP)
|
||||
L = texture2D(u_DeluxeMap, var_TexCoords.zw).xyz - vec3(0.5);
|
||||
L = L * u_EnableTextures.y + var_LightDir.xyz;
|
||||
#elif defined(USE_LIGHT) && !defined(USE_FAST_LIGHT)
|
||||
E = normalize(E);
|
||||
|
||||
L = var_LightDir.xyz;
|
||||
#endif
|
||||
|
||||
#if (defined(USE_LIGHT) && !defined(USE_FAST_LIGHT)) || defined(USE_PARALLAXMAP)
|
||||
#if defined(USE_VERT_TANGENT_SPACE)
|
||||
E = normalize(vec3(var_Normal.w, var_Tangent.w, var_Bitangent.w));
|
||||
#else
|
||||
E = normalize(var_ViewDir);
|
||||
#if defined(USE_DELUXEMAP)
|
||||
L += (texture2D(u_DeluxeMap, var_TexCoords.zw).xyz - vec3(0.5)) * u_EnableTextures.y;
|
||||
#endif
|
||||
float sqrLightDist = dot(L, L);
|
||||
#endif
|
||||
|
||||
#if defined(USE_LIGHTMAP)
|
||||
vec4 lightSample = texture2D(u_LightMap, var_TexCoords.zw).rgba;
|
||||
#if defined(RGBM_LIGHTMAP)
|
||||
lightSample.rgb *= 32.0 * lightSample.a;
|
||||
#endif
|
||||
vec4 lightSample = texture2D(u_LightMap, var_TexCoords.zw);
|
||||
vec3 lightColor = lightSample.rgb;
|
||||
#if defined(RGBM_LIGHTMAP)
|
||||
lightColor *= 32.0 * lightSample.a;
|
||||
#endif
|
||||
#elif defined(USE_LIGHT_VECTOR) && !defined(USE_FAST_LIGHT)
|
||||
vec3 lightColor = u_DirectedLight * CalcLightAttenuation(L, var_LightDir.w);
|
||||
vec3 lightColor = u_DirectedLight * CalcLightAttenuation(float(var_LightDir.w > 0.0), var_LightDir.w / sqrLightDist);
|
||||
vec3 ambientColor = u_AmbientLight;
|
||||
#elif defined(USE_LIGHT_VERTEX) && !defined(USE_FAST_LIGHT)
|
||||
vec3 lightColor = var_LightColor;
|
||||
|
@ -383,21 +379,22 @@ void main()
|
|||
N.xy = texture2D(u_NormalMap, texCoords).rg - vec2(0.5);
|
||||
#endif
|
||||
N.xy *= u_EnableTextures.x;
|
||||
N.z = sqrt(0.25 - dot(N.xy, N.xy));
|
||||
N = normalize(tangentToWorld * N);
|
||||
N.z = sqrt((0.25 - N.x * N.x) - N.y * N.y);
|
||||
N = tangentToWorld * N;
|
||||
#else
|
||||
N = normalize(var_Normal.xyz);
|
||||
N = var_Normal.xyz;
|
||||
#endif
|
||||
|
||||
L = normalize(L);
|
||||
|
||||
N = normalize(N);
|
||||
L /= sqrt(sqrLightDist);
|
||||
|
||||
#if defined(USE_SHADOWMAP)
|
||||
vec2 shadowTex = gl_FragCoord.xy * r_FBufScale;
|
||||
float shadowValue = texture2D(u_ShadowMap, shadowTex).r;
|
||||
|
||||
// surfaces not facing the light are always shadowed
|
||||
shadowValue *= step(0.0, dot(var_Normal.xyz, var_PrimaryLightDir.xyz));
|
||||
|
||||
shadowValue *= float(dot(var_Normal.xyz, var_PrimaryLightDir.xyz) > 0.0);
|
||||
|
||||
#if defined(SHADOWMAP_MODULATE)
|
||||
//vec3 shadowColor = min(u_PrimaryLightAmbient, lightColor);
|
||||
vec3 shadowColor = u_PrimaryLightAmbient * lightColor;
|
||||
|
@ -428,44 +425,41 @@ void main()
|
|||
NL = clamp(dot(N, L), 0.0, 1.0);
|
||||
NE = clamp(dot(N, E), 0.0, 1.0);
|
||||
|
||||
vec4 specular = vec4(1.0);
|
||||
#if defined(USE_SPECULARMAP)
|
||||
vec4 specular = texture2D(u_SpecularMap, texCoords);
|
||||
specular = (specular - vec4(1.0)) * u_EnableTextures.z + vec4(1.0);
|
||||
specular += texture2D(u_SpecularMap, texCoords) * u_EnableTextures.z - u_EnableTextures.zzzz;
|
||||
#if defined(USE_GAMMA2_TEXTURES)
|
||||
specular.rgb *= specular.rgb;
|
||||
#endif
|
||||
#else
|
||||
vec4 specular = vec4(1.0);
|
||||
#endif
|
||||
|
||||
specular *= u_MaterialInfo.xxxy;
|
||||
|
||||
|
||||
float gloss = specular.a;
|
||||
float shininess = exp2(gloss * 13.0);
|
||||
|
||||
#if defined(SPECULAR_IS_METALLIC)
|
||||
// diffuse is actually base color, and red of specular is metallicness
|
||||
// diffuse is actually base color, and red of specular is metallicness
|
||||
float metallic = specular.r;
|
||||
|
||||
specular.rgb = vec3(0.04) + 0.96 * diffuse.rgb * metallic;
|
||||
|
||||
specular.rgb = (0.96 * metallic) * diffuse.rgb + vec3(0.04);
|
||||
diffuse.rgb *= 1.0 - metallic;
|
||||
#else
|
||||
// adjust diffuse by specular reflectance, to maintain energy conservation
|
||||
diffuse.rgb *= vec3(1.0) - specular.rgb;
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
reflectance = CalcDiffuse(diffuse.rgb, N, L, E, NE, NL, shininess);
|
||||
|
||||
#if defined(r_deluxeSpecular) || defined(USE_LIGHT_VECTOR)
|
||||
float adjGloss = gloss;
|
||||
float adjShininess = shininess;
|
||||
|
||||
#if !defined(USE_LIGHT_VECTOR)
|
||||
|
||||
#if !defined(USE_LIGHT_VECTOR)
|
||||
adjGloss *= r_deluxeSpecular;
|
||||
adjShininess = exp2(adjGloss * 13.0);
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
H = normalize(L + E);
|
||||
|
||||
EH = clamp(dot(E, H), 0.0, 1.0);
|
||||
|
@ -477,16 +471,16 @@ void main()
|
|||
reflectance += CalcSpecular(specular.rgb, NH, NL, NE, EH, adjGloss, adjShininess);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
gl_FragColor.rgb = lightColor * reflectance * NL;
|
||||
|
||||
gl_FragColor.rgb = lightColor * reflectance * NL;
|
||||
gl_FragColor.rgb += ambientColor * (diffuse.rgb + specular.rgb);
|
||||
|
||||
|
||||
#if defined(USE_CUBEMAP)
|
||||
reflectance = EnvironmentBRDF(gloss, NE, specular.rgb);
|
||||
|
||||
vec3 R = reflect(E, N);
|
||||
|
||||
vec3 cubeLightColor = textureCubeLod(u_CubeMap, R, 7.0 - gloss * 7.0).rgb * u_EnableTextures.w;
|
||||
vec3 cubeLightColor = textureCubeLod(u_CubeMap, R, 7.0 - gloss * 7.0).rgb * u_EnableTextures.w;
|
||||
|
||||
#if defined(USE_LIGHTMAP)
|
||||
cubeLightColor *= lightSample.rgb;
|
||||
|
@ -495,29 +489,40 @@ void main()
|
|||
#else
|
||||
cubeLightColor *= lightColor * NL + ambientColor;
|
||||
#endif
|
||||
|
||||
|
||||
//gl_FragColor.rgb += diffuse.rgb * textureCubeLod(u_CubeMap, N, 7.0).rgb * u_EnableTextures.w;
|
||||
gl_FragColor.rgb += cubeLightColor * reflectance;
|
||||
#endif
|
||||
|
||||
#if defined(USE_PRIMARY_LIGHT)
|
||||
L = var_PrimaryLightDir.xyz; //normalize(var_PrimaryLightDir.xyz);
|
||||
NL = clamp(dot(N, L), 0.0, 1.0);
|
||||
vec3 L2, H2;
|
||||
float NL2, EH2, NH2;
|
||||
|
||||
H = normalize(L + E);
|
||||
EH = clamp(dot(E, H), 0.0, 1.0);
|
||||
NH = clamp(dot(N, H), 0.0, 1.0);
|
||||
L2 = var_PrimaryLightDir.xyz;
|
||||
|
||||
reflectance = CalcDiffuse(diffuse.rgb, N, L, E, NE, NL, shininess);
|
||||
reflectance += CalcSpecular(specular.rgb, NH, NL, NE, EH, gloss, shininess);
|
||||
// enable when point lights are supported as primary lights
|
||||
//sqrLightDist = dot(L2, L2);
|
||||
//L2 /= sqrt(sqrLightDist);
|
||||
|
||||
NL2 = clamp(dot(N, L2), 0.0, 1.0);
|
||||
|
||||
H2 = normalize(L2 + E);
|
||||
EH2 = clamp(dot(E, H2), 0.0, 1.0);
|
||||
NH2 = clamp(dot(N, H2), 0.0, 1.0);
|
||||
|
||||
reflectance = CalcDiffuse(diffuse.rgb, N, L2, E, NE, NL2, shininess);
|
||||
reflectance += CalcSpecular(specular.rgb, NH2, NL2, NE, EH2, gloss, shininess);
|
||||
|
||||
lightColor = u_PrimaryLightColor;
|
||||
|
||||
// enable when point lights are supported as primary lights
|
||||
//lightColor *= CalcLightAttenuation(float(u_PrimaryLightDir.w > 0.0), u_PrimaryLightDir.w / sqrLightDist);
|
||||
|
||||
lightColor = u_PrimaryLightColor; // * CalcLightAttenuation(L, u_PrimaryLightDir.w);
|
||||
|
||||
#if defined(USE_SHADOWMAP)
|
||||
lightColor *= shadowValue;
|
||||
#endif
|
||||
|
||||
gl_FragColor.rgb += lightColor * reflectance * NL;
|
||||
gl_FragColor.rgb += lightColor * reflectance * NL2;
|
||||
#endif
|
||||
|
||||
gl_FragColor.a = diffuse.a;
|
||||
|
|
|
@ -14,8 +14,7 @@ attribute vec4 attr_Tangent;
|
|||
attribute vec3 attr_Position2;
|
||||
attribute vec3 attr_Normal2;
|
||||
#if defined(USE_VERT_TANGENT_SPACE)
|
||||
attribute vec3 attr_Tangent2;
|
||||
attribute vec3 attr_Bitangent2;
|
||||
attribute vec4 attr_Tangent2;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
@ -108,13 +107,15 @@ vec2 GenTexCoords(int TCGen, vec3 position, vec3 normal, vec3 TCGenVector0, vec3
|
|||
else if (TCGen == TCGEN_ENVIRONMENT_MAPPED)
|
||||
{
|
||||
vec3 viewer = normalize(u_LocalViewOrigin - position);
|
||||
tex = -reflect(viewer, normal).yz * vec2(0.5, -0.5) + 0.5;
|
||||
vec2 ref = reflect(viewer, normal).yz;
|
||||
tex.s = ref.x * -0.5 + 0.5;
|
||||
tex.t = ref.y * 0.5 + 0.5;
|
||||
}
|
||||
else if (TCGen == TCGEN_VECTOR)
|
||||
{
|
||||
tex = vec2(dot(position, TCGenVector0), dot(position, TCGenVector1));
|
||||
}
|
||||
|
||||
|
||||
return tex;
|
||||
}
|
||||
#endif
|
||||
|
@ -123,38 +124,33 @@ vec2 GenTexCoords(int TCGen, vec3 position, vec3 normal, vec3 TCGenVector0, vec3
|
|||
vec2 ModTexCoords(vec2 st, vec3 position, vec4 texMatrix, vec4 offTurb)
|
||||
{
|
||||
float amplitude = offTurb.z;
|
||||
float phase = offTurb.w;
|
||||
vec2 st2 = vec2(dot(st, texMatrix.xz), dot(st, texMatrix.yw)) + offTurb.xy;
|
||||
float phase = offTurb.w * 2.0 * M_PI;
|
||||
vec2 st2;
|
||||
st2.x = st.x * texMatrix.x + (st.y * texMatrix.z + offTurb.x);
|
||||
st2.y = st.x * texMatrix.y + (st.y * texMatrix.w + offTurb.y);
|
||||
|
||||
vec2 offsetPos = vec2(position.x + position.z, position.y);
|
||||
|
||||
vec2 texOffset = sin(offsetPos * (2.0 * M_PI / 1024.0) + vec2(phase));
|
||||
|
||||
vec3 offsetPos = position / 1024.0;
|
||||
offsetPos.x += offsetPos.z;
|
||||
|
||||
vec2 texOffset = sin((offsetPos.xy + vec2(phase)) * 2.0 * M_PI);
|
||||
|
||||
return st2 + texOffset * amplitude;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
float CalcLightAttenuation(vec3 dir, float sqrRadius)
|
||||
float CalcLightAttenuation(float point, float normDist)
|
||||
{
|
||||
// point light at >0 radius, directional otherwise
|
||||
float point = float(sqrRadius > 0.0);
|
||||
|
||||
// inverse square light
|
||||
float attenuation = sqrRadius / dot(dir, dir);
|
||||
|
||||
// zero light at radius, approximating q3 style
|
||||
// zero light at 1.0, approximating q3 style
|
||||
// also don't attenuate directional light
|
||||
attenuation = (0.5 * attenuation - 1.5) * point + 1.0;
|
||||
|
||||
float attenuation = (0.5 * normDist - 1.5) * point + 1.0;
|
||||
|
||||
// clamp attenuation
|
||||
#if defined(NO_LIGHT_CLAMP)
|
||||
attenuation = max(attenuation, 0.0);
|
||||
#else
|
||||
attenuation = clamp(attenuation, 0.0, 1.0);
|
||||
#endif
|
||||
|
||||
|
||||
return attenuation;
|
||||
}
|
||||
|
||||
|
@ -162,22 +158,22 @@ float CalcLightAttenuation(vec3 dir, float sqrRadius)
|
|||
void main()
|
||||
{
|
||||
#if defined(USE_VERTEX_ANIMATION)
|
||||
vec3 position = mix(attr_Position, attr_Position2, u_VertexLerp);
|
||||
vec3 normal = normalize(mix(attr_Normal, attr_Normal2, u_VertexLerp) * 2.0 - vec3(1.0));
|
||||
vec3 position = mix(attr_Position, attr_Position2, u_VertexLerp);
|
||||
vec3 normal = mix(attr_Normal, attr_Normal2, u_VertexLerp);
|
||||
#if defined(USE_VERT_TANGENT_SPACE) && defined(USE_LIGHT) && !defined(USE_FAST_LIGHT)
|
||||
vec3 tangent = normalize(mix(attr_Tangent.xyz, attr_Tangent2.xyz, u_VertexLerp) * 2.0 - vec3(1.0));
|
||||
vec3 tangent = mix(attr_Tangent.xyz, attr_Tangent2.xyz, u_VertexLerp);
|
||||
#endif
|
||||
#else
|
||||
vec3 position = attr_Position;
|
||||
vec3 normal = attr_Normal * 2.0 - vec3(1.0);
|
||||
vec3 normal = attr_Normal;
|
||||
#if defined(USE_VERT_TANGENT_SPACE) && defined(USE_LIGHT) && !defined(USE_FAST_LIGHT)
|
||||
vec3 tangent = attr_Tangent.xyz * 2.0 - vec3(1.0);
|
||||
vec3 tangent = attr_Tangent.xyz;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
normal = normal * 2.0 - vec3(1.0);
|
||||
#if defined(USE_VERT_TANGENT_SPACE) && defined(USE_LIGHT) && !defined(USE_FAST_LIGHT)
|
||||
vec3 bitangent = cross(normal, tangent);
|
||||
bitangent *= attr_Tangent.w * 2.0 - 1.0;
|
||||
tangent = tangent * 2.0 - vec3(1.0);
|
||||
#endif
|
||||
|
||||
#if defined(USE_TCGEN)
|
||||
|
@ -195,18 +191,21 @@ void main()
|
|||
gl_Position = u_ModelViewProjectionMatrix * vec4(position, 1.0);
|
||||
|
||||
#if defined(USE_MODELMATRIX)
|
||||
position = (u_ModelMatrix * vec4(position, 1.0)).xyz;
|
||||
normal = (u_ModelMatrix * vec4(normal, 0.0)).xyz;
|
||||
#if defined(USE_VERT_TANGENT_SPACE)
|
||||
tangent = (u_ModelMatrix * vec4(tangent, 0.0)).xyz;
|
||||
bitangent = (u_ModelMatrix * vec4(bitangent, 0.0)).xyz;
|
||||
position = (u_ModelMatrix * vec4(position, 1.0)).xyz;
|
||||
normal = (u_ModelMatrix * vec4(normal, 0.0)).xyz;
|
||||
#if defined(USE_VERT_TANGENT_SPACE) && defined(USE_LIGHT) && !defined(USE_FAST_LIGHT)
|
||||
tangent = (u_ModelMatrix * vec4(tangent, 0.0)).xyz;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(USE_VERT_TANGENT_SPACE) && defined(USE_LIGHT) && !defined(USE_FAST_LIGHT)
|
||||
vec3 bitangent = cross(normal, tangent) * (attr_Tangent.w * 2.0 - 1.0);
|
||||
#endif
|
||||
|
||||
#if defined(USE_LIGHT_VECTOR)
|
||||
vec3 L = u_LightOrigin.xyz - (position * u_LightOrigin.w);
|
||||
#elif defined(USE_LIGHT)
|
||||
vec3 L = attr_LightDirection;
|
||||
#elif defined(USE_LIGHT) && !defined(USE_FAST_LIGHT)
|
||||
vec3 L = attr_LightDirection * 2.0 - vec3(1.0);
|
||||
#if defined(USE_MODELMATRIX)
|
||||
L = (u_ModelMatrix * vec4(L, 0.0)).xyz;
|
||||
#endif
|
||||
|
@ -215,7 +214,7 @@ void main()
|
|||
#if defined(USE_LIGHTMAP)
|
||||
var_TexCoords.zw = attr_TexCoord1.st;
|
||||
#endif
|
||||
|
||||
|
||||
var_Color = u_VertColor * attr_Color + u_BaseColor;
|
||||
#if defined(USE_LIGHT_VERTEX) && !defined(USE_FAST_LIGHT)
|
||||
var_LightColor = var_Color.rgb;
|
||||
|
@ -223,10 +222,11 @@ void main()
|
|||
#endif
|
||||
|
||||
#if defined(USE_LIGHT_VECTOR) && defined(USE_FAST_LIGHT)
|
||||
float attenuation = CalcLightAttenuation(L, u_LightRadius * u_LightRadius);
|
||||
float NL = clamp(dot(normal, normalize(L)), 0.0, 1.0);
|
||||
float sqrLightDist = dot(L, L);
|
||||
float attenuation = CalcLightAttenuation(u_LightOrigin.w, u_LightRadius * u_LightRadius / sqrLightDist);
|
||||
float NL = clamp(dot(normalize(normal), L) / sqrt(sqrLightDist), 0.0, 1.0);
|
||||
|
||||
var_Color.rgb *= u_DirectedLight * attenuation * NL + u_AmbientLight;
|
||||
var_Color.rgb *= u_DirectedLight * (attenuation * NL) + u_AmbientLight;
|
||||
#endif
|
||||
|
||||
#if defined(USE_PRIMARY_LIGHT) || defined(USE_SHADOWMAP)
|
||||
|
@ -241,15 +241,12 @@ void main()
|
|||
var_LightDir = vec4(L, 0.0);
|
||||
#endif
|
||||
#if defined(USE_DELUXEMAP)
|
||||
var_LightDir *= 1.0 - u_EnableTextures.y;
|
||||
var_LightDir -= u_EnableTextures.y * var_LightDir;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(USE_LIGHT) && !defined(USE_FAST_LIGHT)
|
||||
vec3 viewDir = u_ViewOrigin - position;
|
||||
#endif
|
||||
|
||||
#if defined(USE_LIGHT) && !defined(USE_FAST_LIGHT)
|
||||
#if defined(USE_VERT_TANGENT_SPACE)
|
||||
// store view direction in tangent space to save on varyings
|
||||
var_Normal = vec4(normal, viewDir.x);
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
attribute vec4 attr_Position;
|
||||
attribute vec3 attr_Position;
|
||||
attribute vec3 attr_Normal;
|
||||
|
||||
uniform mat4 u_ModelViewProjectionMatrix;
|
||||
|
@ -8,10 +8,8 @@ varying vec3 var_Normal;
|
|||
|
||||
void main()
|
||||
{
|
||||
vec4 position = attr_Position;
|
||||
gl_Position = u_ModelViewProjectionMatrix * vec4(attr_Position, 1.0);
|
||||
|
||||
gl_Position = u_ModelViewProjectionMatrix * position;
|
||||
|
||||
var_Position = position.xyz;
|
||||
var_Normal = attr_Normal;
|
||||
var_Position = attr_Position;
|
||||
var_Normal = attr_Normal * 2.0 - vec3(1.0);
|
||||
}
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
attribute vec4 attr_Position;
|
||||
attribute vec3 attr_Position;
|
||||
attribute vec3 attr_Normal;
|
||||
attribute vec4 attr_TexCoord0;
|
||||
|
||||
//#if defined(USE_VERTEX_ANIMATION)
|
||||
attribute vec4 attr_Position2;
|
||||
attribute vec3 attr_Position2;
|
||||
attribute vec3 attr_Normal2;
|
||||
//#endif
|
||||
|
||||
|
@ -38,7 +38,7 @@ vec3 DeformPosition(const vec3 pos, const vec3 normal, const vec2 st)
|
|||
|
||||
if (u_DeformGen == DGEN_BULGE)
|
||||
{
|
||||
phase *= M_PI * 0.25 * st.x;
|
||||
phase *= st.x;
|
||||
}
|
||||
else // if (u_DeformGen <= DGEN_WAVE_INVERSE_SAWTOOTH)
|
||||
{
|
||||
|
@ -54,7 +54,7 @@ vec3 DeformPosition(const vec3 pos, const vec3 normal, const vec2 st)
|
|||
}
|
||||
else if (u_DeformGen == DGEN_WAVE_SQUARE)
|
||||
{
|
||||
func = sign(sin(value * 2.0 * M_PI));
|
||||
func = sign(0.5 - fract(value));
|
||||
}
|
||||
else if (u_DeformGen == DGEN_WAVE_TRIANGLE)
|
||||
{
|
||||
|
@ -68,7 +68,7 @@ vec3 DeformPosition(const vec3 pos, const vec3 normal, const vec2 st)
|
|||
{
|
||||
func = (1.0 - fract(value));
|
||||
}
|
||||
else if (u_DeformGen == DGEN_BULGE)
|
||||
else // if (u_DeformGen == DGEN_BULGE)
|
||||
{
|
||||
func = sin(value);
|
||||
}
|
||||
|
@ -78,12 +78,13 @@ vec3 DeformPosition(const vec3 pos, const vec3 normal, const vec2 st)
|
|||
|
||||
void main()
|
||||
{
|
||||
vec4 position = mix(attr_Position, attr_Position2, u_VertexLerp);
|
||||
vec3 normal = normalize(mix(attr_Normal, attr_Normal2, u_VertexLerp));
|
||||
vec3 position = mix(attr_Position, attr_Position2, u_VertexLerp);
|
||||
vec3 normal = mix(attr_Normal, attr_Normal2, u_VertexLerp);
|
||||
normal = normalize(normal - vec3(0.5));
|
||||
|
||||
position.xyz = DeformPosition(position.xyz, normal, attr_TexCoord0.st);
|
||||
position = DeformPosition(position, normal, attr_TexCoord0.st);
|
||||
|
||||
gl_Position = u_ModelViewProjectionMatrix * position;
|
||||
gl_Position = u_ModelViewProjectionMatrix * vec4(position, 1.0);
|
||||
|
||||
var_Position = (u_ModelMatrix * position).xyz;
|
||||
var_Position = (u_ModelMatrix * vec4(position, 1.0)).xyz;
|
||||
}
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
uniform sampler2D u_DiffuseMap;
|
||||
uniform vec4 u_Color;
|
||||
|
||||
varying vec2 var_Tex1;
|
||||
varying vec2 var_Tex1;
|
||||
|
||||
|
||||
void main()
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#version 120
|
||||
|
||||
attribute vec4 attr_Position;
|
||||
attribute vec3 attr_Position;
|
||||
attribute vec4 attr_TexCoord0;
|
||||
|
||||
uniform mat4 u_ModelViewProjectionMatrix;
|
||||
|
@ -10,6 +10,6 @@ varying vec2 var_Tex1;
|
|||
|
||||
void main()
|
||||
{
|
||||
gl_Position = u_ModelViewProjectionMatrix * attr_Position;
|
||||
gl_Position = u_ModelViewProjectionMatrix * vec4(attr_Position, 1.0);
|
||||
var_Tex1 = attr_TexCoord0.st;
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
attribute vec4 attr_Position;
|
||||
attribute vec3 attr_Position;
|
||||
attribute vec4 attr_TexCoord0;
|
||||
|
||||
uniform mat4 u_ModelViewProjectionMatrix;
|
||||
|
@ -8,6 +8,6 @@ varying vec2 var_TexCoords;
|
|||
|
||||
void main()
|
||||
{
|
||||
gl_Position = u_ModelViewProjectionMatrix * attr_Position;
|
||||
gl_Position = u_ModelViewProjectionMatrix * vec4(attr_Position, 1.0);
|
||||
var_TexCoords = attr_TexCoord0.st;
|
||||
}
|
||||
|
|
|
@ -33,143 +33,6 @@ frame.
|
|||
|
||||
*/
|
||||
|
||||
/*
|
||||
==============
|
||||
R_AddAnimSurfaces
|
||||
==============
|
||||
*/
|
||||
void R_AddAnimSurfaces( trRefEntity_t *ent ) {
|
||||
md4Header_t *header;
|
||||
md4Surface_t *surface;
|
||||
md4LOD_t *lod;
|
||||
shader_t *shader;
|
||||
int cubemapIndex;
|
||||
int i;
|
||||
|
||||
header = (md4Header_t *) tr.currentModel->modelData;
|
||||
lod = (md4LOD_t *)( (byte *)header + header->ofsLODs );
|
||||
cubemapIndex = R_CubemapForPoint(ent->e.origin);
|
||||
|
||||
surface = (md4Surface_t *)( (byte *)lod + lod->ofsSurfaces );
|
||||
for ( i = 0 ; i < lod->numSurfaces ; i++ ) {
|
||||
shader = R_GetShaderByHandle( surface->shaderIndex );
|
||||
R_AddDrawSurf( (void *)surface, shader, 0 /*fogNum*/, qfalse, qfalse, cubemapIndex );
|
||||
surface = (md4Surface_t *)( (byte *)surface + surface->ofsEnd );
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
==============
|
||||
RB_SurfaceAnim
|
||||
==============
|
||||
*/
|
||||
void RB_SurfaceAnim( md4Surface_t *surface ) {
|
||||
int i, j, k;
|
||||
float frontlerp, backlerp;
|
||||
int *triangles;
|
||||
int indexes;
|
||||
int baseIndex, baseVertex;
|
||||
int numVerts;
|
||||
md4Vertex_t *v;
|
||||
md4Bone_t bones[MD4_MAX_BONES];
|
||||
md4Bone_t *bonePtr, *bone;
|
||||
md4Header_t *header;
|
||||
md4Frame_t *frame;
|
||||
md4Frame_t *oldFrame;
|
||||
int frameSize;
|
||||
|
||||
|
||||
if ( backEnd.currentEntity->e.oldframe == backEnd.currentEntity->e.frame ) {
|
||||
backlerp = 0;
|
||||
frontlerp = 1;
|
||||
} else {
|
||||
backlerp = backEnd.currentEntity->e.backlerp;
|
||||
frontlerp = 1.0f - backlerp;
|
||||
}
|
||||
header = (md4Header_t *)((byte *)surface + surface->ofsHeader);
|
||||
|
||||
frameSize = (size_t)( &((md4Frame_t *)0)->bones[ header->numBones ] );
|
||||
|
||||
frame = (md4Frame_t *)((byte *)header + header->ofsFrames +
|
||||
backEnd.currentEntity->e.frame * frameSize );
|
||||
oldFrame = (md4Frame_t *)((byte *)header + header->ofsFrames +
|
||||
backEnd.currentEntity->e.oldframe * frameSize );
|
||||
|
||||
RB_CheckOverflow( surface->numVerts, surface->numTriangles * 3 );
|
||||
|
||||
triangles = (int *) ((byte *)surface + surface->ofsTriangles);
|
||||
indexes = surface->numTriangles * 3;
|
||||
baseIndex = tess.numIndexes;
|
||||
baseVertex = tess.numVertexes;
|
||||
for (j = 0 ; j < indexes ; j++) {
|
||||
tess.indexes[baseIndex + j] = baseIndex + triangles[j];
|
||||
}
|
||||
tess.numIndexes += indexes;
|
||||
|
||||
//
|
||||
// lerp all the needed bones
|
||||
//
|
||||
if ( !backlerp ) {
|
||||
// no lerping needed
|
||||
bonePtr = frame->bones;
|
||||
} else {
|
||||
bonePtr = bones;
|
||||
for ( i = 0 ; i < header->numBones*12 ; i++ ) {
|
||||
((float *)bonePtr)[i] = frontlerp * ((float *)frame->bones)[i]
|
||||
+ backlerp * ((float *)oldFrame->bones)[i];
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// deform the vertexes by the lerped bones
|
||||
//
|
||||
numVerts = surface->numVerts;
|
||||
// FIXME
|
||||
// This makes TFC's skeletons work. Shouldn't be necessary anymore, but left
|
||||
// in for reference.
|
||||
//v = (md4Vertex_t *) ((byte *)surface + surface->ofsVerts + 12);
|
||||
v = (md4Vertex_t *) ((byte *)surface + surface->ofsVerts);
|
||||
for ( j = 0; j < numVerts; j++ ) {
|
||||
vec3_t tempVert, tempNormal;
|
||||
md4Weight_t *w;
|
||||
|
||||
VectorClear( tempVert );
|
||||
VectorClear( tempNormal );
|
||||
w = v->weights;
|
||||
for ( k = 0 ; k < v->numWeights ; k++, w++ ) {
|
||||
bone = bonePtr + w->boneIndex;
|
||||
|
||||
tempVert[0] += w->boneWeight * ( DotProduct( bone->matrix[0], w->offset ) + bone->matrix[0][3] );
|
||||
tempVert[1] += w->boneWeight * ( DotProduct( bone->matrix[1], w->offset ) + bone->matrix[1][3] );
|
||||
tempVert[2] += w->boneWeight * ( DotProduct( bone->matrix[2], w->offset ) + bone->matrix[2][3] );
|
||||
|
||||
tempNormal[0] += w->boneWeight * DotProduct( bone->matrix[0], v->normal );
|
||||
tempNormal[1] += w->boneWeight * DotProduct( bone->matrix[1], v->normal );
|
||||
tempNormal[2] += w->boneWeight * DotProduct( bone->matrix[2], v->normal );
|
||||
}
|
||||
|
||||
tess.xyz[baseVertex + j][0] = tempVert[0];
|
||||
tess.xyz[baseVertex + j][1] = tempVert[1];
|
||||
tess.xyz[baseVertex + j][2] = tempVert[2];
|
||||
|
||||
tess.normal[baseVertex + j][0] = (uint8_t)(tempNormal[0] * 127.5f + 128.0f);
|
||||
tess.normal[baseVertex + j][1] = (uint8_t)(tempNormal[1] * 127.5f + 128.0f);
|
||||
tess.normal[baseVertex + j][2] = (uint8_t)(tempNormal[2] * 127.5f + 128.0f);
|
||||
|
||||
tess.texCoords[baseVertex + j][0][0] = v->texCoords[0];
|
||||
tess.texCoords[baseVertex + j][0][1] = v->texCoords[1];
|
||||
|
||||
// FIXME
|
||||
// This makes TFC's skeletons work. Shouldn't be necessary anymore, but left
|
||||
// in for reference.
|
||||
//v = (md4Vertex_t *)( ( byte * )&v->weights[v->numWeights] + 12 );
|
||||
v = (md4Vertex_t *)&v->weights[v->numWeights];
|
||||
}
|
||||
|
||||
tess.numVertexes += surface->numVerts;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// copied and adapted from tr_mesh.c
|
||||
|
||||
|
@ -198,7 +61,7 @@ static int R_MDRCullModel( mdrHeader_t *header, trRefEntity_t *ent ) {
|
|||
switch ( R_CullLocalPointAndRadius( newFrame->localOrigin, newFrame->radius ) )
|
||||
{
|
||||
// Ummm... yeah yeah I know we don't really have an md3 here.. but we pretend
|
||||
// we do. After all, the purpose of md4s are not that different, are they?
|
||||
// we do. After all, the purpose of mdrs are not that different, are they?
|
||||
|
||||
case CULL_OUT:
|
||||
tr.pc.c_sphere_cull_md3_out++;
|
||||
|
@ -448,7 +311,7 @@ void R_MDRAddAnimSurfaces( trRefEntity_t *ent ) {
|
|||
RB_MDRSurfaceAnim
|
||||
==============
|
||||
*/
|
||||
void RB_MDRSurfaceAnim( md4Surface_t *surface )
|
||||
void RB_MDRSurfaceAnim( mdrSurface_t *surface )
|
||||
{
|
||||
int i, j, k;
|
||||
float frontlerp, backlerp;
|
||||
|
@ -460,7 +323,7 @@ void RB_MDRSurfaceAnim( md4Surface_t *surface )
|
|||
mdrHeader_t *header;
|
||||
mdrFrame_t *frame;
|
||||
mdrFrame_t *oldFrame;
|
||||
mdrBone_t bones[MD4_MAX_BONES], *bonePtr, *bone;
|
||||
mdrBone_t bones[MDR_MAX_BONES], *bonePtr, *bone;
|
||||
|
||||
int frameSize;
|
||||
|
||||
|
@ -548,9 +411,7 @@ void RB_MDRSurfaceAnim( md4Surface_t *surface )
|
|||
tess.xyz[baseVertex + j][1] = tempVert[1];
|
||||
tess.xyz[baseVertex + j][2] = tempVert[2];
|
||||
|
||||
tess.normal[baseVertex + j][0] = (uint8_t)(tempNormal[0] * 127.5f + 128.0f);
|
||||
tess.normal[baseVertex + j][1] = (uint8_t)(tempNormal[1] * 127.5f + 128.0f);
|
||||
tess.normal[baseVertex + j][2] = (uint8_t)(tempNormal[2] * 127.5f + 128.0f);
|
||||
tess.normal[baseVertex + j] = R_VboPackNormal(tempNormal);
|
||||
|
||||
tess.texCoords[baseVertex + j][0][0] = v->texCoords[0];
|
||||
tess.texCoords[baseVertex + j][0][1] = v->texCoords[1];
|
||||
|
|
|
@ -461,7 +461,7 @@ void RB_BeginDrawingView (void) {
|
|||
FBO_Bind(backEnd.viewParms.targetFbo);
|
||||
|
||||
// FIXME: hack for cubemap testing
|
||||
if (backEnd.viewParms.targetFbo == tr.renderCubeFbo)
|
||||
if (tr.renderCubeFbo && backEnd.viewParms.targetFbo == tr.renderCubeFbo)
|
||||
{
|
||||
//qglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_CUBE_MAP_POSITIVE_X + backEnd.viewParms.targetFboLayer, backEnd.viewParms.targetFbo->colorImage[0]->texnum, 0);
|
||||
qglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_CUBE_MAP_POSITIVE_X + backEnd.viewParms.targetFboLayer, tr.cubemaps[backEnd.viewParms.targetFboCubemapIndex]->texnum, 0);
|
||||
|
@ -501,7 +501,7 @@ void RB_BeginDrawingView (void) {
|
|||
}
|
||||
|
||||
// clear to black for cube maps
|
||||
if (backEnd.viewParms.targetFbo == tr.renderCubeFbo)
|
||||
if (tr.renderCubeFbo && backEnd.viewParms.targetFbo == tr.renderCubeFbo)
|
||||
{
|
||||
clearBits |= GL_COLOR_BUFFER_BIT;
|
||||
qglClearColor( 0.0f, 0.0f, 0.0f, 1.0f );
|
||||
|
@ -1081,7 +1081,7 @@ const void *RB_DrawSurfs( const void *data ) {
|
|||
FBO_BlitFromTexture(tr.renderDepthImage, NULL, NULL, tr.hdrDepthFbo, NULL, NULL, NULL, 0);
|
||||
}
|
||||
|
||||
if (backEnd.viewParms.flags & VPF_USESUNLIGHT)
|
||||
if (r_sunlightMode->integer && backEnd.viewParms.flags & VPF_USESUNLIGHT)
|
||||
{
|
||||
vec4_t quadVerts[4];
|
||||
vec2_t texCoords[4];
|
||||
|
@ -1296,7 +1296,7 @@ const void *RB_DrawSurfs( const void *data ) {
|
|||
RB_RenderFlares();
|
||||
}
|
||||
|
||||
if (glRefConfig.framebufferObject && backEnd.viewParms.targetFbo == tr.renderCubeFbo)
|
||||
if (glRefConfig.framebufferObject && tr.renderCubeFbo && backEnd.viewParms.targetFbo == tr.renderCubeFbo)
|
||||
{
|
||||
FBO_Bind(NULL);
|
||||
GL_SelectTexture(TB_CUBEMAP);
|
||||
|
@ -1558,13 +1558,19 @@ const void *RB_CapShadowMap(const void *data)
|
|||
GL_SelectTexture(0);
|
||||
if (cmd->cubeSide != -1)
|
||||
{
|
||||
GL_Bind(tr.shadowCubemaps[cmd->map]);
|
||||
qglCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + cmd->cubeSide, 0, GL_RGBA8, backEnd.refdef.x, glConfig.vidHeight - ( backEnd.refdef.y + PSHADOW_MAP_SIZE ), PSHADOW_MAP_SIZE, PSHADOW_MAP_SIZE, 0);
|
||||
if (tr.shadowCubemaps[cmd->map])
|
||||
{
|
||||
GL_Bind(tr.shadowCubemaps[cmd->map]);
|
||||
qglCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + cmd->cubeSide, 0, GL_RGBA8, backEnd.refdef.x, glConfig.vidHeight - ( backEnd.refdef.y + PSHADOW_MAP_SIZE ), PSHADOW_MAP_SIZE, PSHADOW_MAP_SIZE, 0);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
GL_Bind(tr.pshadowMaps[cmd->map]);
|
||||
qglCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, backEnd.refdef.x, glConfig.vidHeight - ( backEnd.refdef.y + PSHADOW_MAP_SIZE ), PSHADOW_MAP_SIZE, PSHADOW_MAP_SIZE, 0);
|
||||
if (tr.pshadowMaps[cmd->map])
|
||||
{
|
||||
GL_Bind(tr.pshadowMaps[cmd->map]);
|
||||
qglCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, backEnd.refdef.x, glConfig.vidHeight - ( backEnd.refdef.y + PSHADOW_MAP_SIZE ), PSHADOW_MAP_SIZE, PSHADOW_MAP_SIZE, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1666,7 +1672,7 @@ const void *RB_PostProcess(const void *data)
|
|||
else
|
||||
RB_GaussianBlur(backEnd.refdef.blurFactor);
|
||||
|
||||
if (0)
|
||||
if (0 && r_sunlightMode->integer)
|
||||
{
|
||||
ivec4_t dstBox;
|
||||
VectorSet4(dstBox, 0, 0, 128, 128);
|
||||
|
|
|
@ -128,17 +128,34 @@ static void R_ColorShiftLightingBytes( byte in[4], byte out[4] ) {
|
|||
|
||||
/*
|
||||
===============
|
||||
R_ColorShiftLightingBytes
|
||||
R_ColorShiftLightingFloats
|
||||
|
||||
===============
|
||||
*/
|
||||
static void R_ColorShiftLightingFloats(float in[4], float out[4], float scale )
|
||||
{
|
||||
float r, g, b;
|
||||
|
||||
scale *= pow(2.0f, r_mapOverBrightBits->integer - tr.overbrightBits);
|
||||
|
||||
out[0] = in[0] * scale;
|
||||
out[1] = in[1] * scale;
|
||||
out[2] = in[2] * scale;
|
||||
r = in[0] * scale;
|
||||
g = in[1] * scale;
|
||||
b = in[2] * scale;
|
||||
|
||||
// normalize by color instead of saturating to white
|
||||
if ( !r_hdr->integer && ( r > 1 || g > 1 || b > 1 ) ) {
|
||||
float max;
|
||||
|
||||
max = r > g ? r : g;
|
||||
max = max > b ? max : b;
|
||||
r = r / max;
|
||||
g = g / max;
|
||||
b = b / max;
|
||||
}
|
||||
|
||||
out[0] = r;
|
||||
out[1] = g;
|
||||
out[2] = b;
|
||||
out[3] = in[3];
|
||||
}
|
||||
|
||||
|
@ -471,7 +488,7 @@ static void R_LoadLightmaps( lump_t *l, lump_t *surfs ) {
|
|||
image[j*4+2] = buf_p[j*3+2];
|
||||
|
||||
// make 0,0,0 into 127,127,127
|
||||
if ((image[j*4+0] == 0) && (image[j*4+0] == 0) && (image[j*4+2] == 0))
|
||||
if ((image[j*4+0] == 0) && (image[j*4+1] == 0) && (image[j*4+2] == 0))
|
||||
{
|
||||
image[j*4+0] =
|
||||
image[j*4+1] =
|
||||
|
|
|
@ -710,4 +710,19 @@ void GLimp_InitExtraExtensions()
|
|||
{
|
||||
ri.Printf(PRINT_ALL, result[2], extension);
|
||||
}
|
||||
|
||||
// GL_ARB_vertex_type_2_10_10_10_rev
|
||||
extension = "GL_ARB_vertex_type_2_10_10_10_rev";
|
||||
glRefConfig.packedNormalDataType = GL_UNSIGNED_BYTE;
|
||||
if( GLimp_HaveExtension( extension ) )
|
||||
{
|
||||
if (r_arb_vertex_type_2_10_10_10_rev->integer)
|
||||
glRefConfig.packedNormalDataType = GL_UNSIGNED_INT_2_10_10_10_REV;
|
||||
|
||||
ri.Printf(PRINT_ALL, result[r_arb_vertex_type_2_10_10_10_rev->integer ? 1 : 0], extension);
|
||||
}
|
||||
else
|
||||
{
|
||||
ri.Printf(PRINT_ALL, result[2], extension);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -52,7 +52,7 @@ void Mat4SimpleInverse( const mat4_t in, mat4_t out);
|
|||
#define VectorCopy5(a,b) ((b)[0]=(a)[0],(b)[1]=(a)[1],(b)[2]=(a)[2],(b)[3]=(a)[3],(b)[4]=(a)[4])
|
||||
|
||||
#define OffsetByteToFloat(a) ((float)(a) * 1.0f/127.5f - 1.0f)
|
||||
#define FloatToOffsetByte(a) (byte)(((a) + 1.0f) * 127.5f)
|
||||
#define FloatToOffsetByte(a) (byte)((a) * 127.5f + 128.0f)
|
||||
#define ByteToFloat(a) ((float)(a) * 1.0f/255.0f)
|
||||
#define FloatToByte(a) (byte)((a) * 255.0f)
|
||||
|
||||
|
|
|
@ -465,34 +465,48 @@ void FBO_Init(void)
|
|||
}
|
||||
|
||||
// FIXME: Don't use separate color/depth buffers for a shadow buffer
|
||||
for( i = 0; i < MAX_DRAWN_PSHADOWS; i++)
|
||||
if (MAX_DRAWN_PSHADOWS && tr.pshadowMaps[0])
|
||||
{
|
||||
tr.pshadowFbos[i] = FBO_Create(va("_shadowmap%d", i), tr.pshadowMaps[i]->width, tr.pshadowMaps[i]->height);
|
||||
FBO_Bind(tr.pshadowFbos[i]);
|
||||
for( i = 0; i < MAX_DRAWN_PSHADOWS; i++)
|
||||
{
|
||||
tr.pshadowFbos[i] = FBO_Create(va("_shadowmap%d", i), tr.pshadowMaps[i]->width, tr.pshadowMaps[i]->height);
|
||||
FBO_Bind(tr.pshadowFbos[i]);
|
||||
|
||||
//FBO_CreateBuffer(tr.pshadowFbos[i], GL_RGBA8, 0, 0);
|
||||
FBO_AttachTextureImage(tr.pshadowMaps[i], 0);
|
||||
//FBO_CreateBuffer(tr.pshadowFbos[i], GL_RGBA8, 0, 0);
|
||||
FBO_AttachTextureImage(tr.pshadowMaps[i], 0);
|
||||
|
||||
FBO_CreateBuffer(tr.pshadowFbos[i], GL_DEPTH_COMPONENT24_ARB, 0, 0);
|
||||
//R_AttachFBOTextureDepth(tr.textureDepthImage->texnum);
|
||||
FBO_CreateBuffer(tr.pshadowFbos[i], GL_DEPTH_COMPONENT24_ARB, 0, 0);
|
||||
//R_AttachFBOTextureDepth(tr.textureDepthImage->texnum);
|
||||
|
||||
R_CheckFBO(tr.pshadowFbos[i]);
|
||||
R_CheckFBO(tr.pshadowFbos[i]);
|
||||
}
|
||||
}
|
||||
|
||||
for ( i = 0; i < 3; i++)
|
||||
if (tr.sunShadowDepthImage[0])
|
||||
{
|
||||
tr.sunShadowFbo[i] = FBO_Create("_sunshadowmap", tr.sunShadowDepthImage[i]->width, tr.sunShadowDepthImage[i]->height);
|
||||
FBO_Bind(tr.sunShadowFbo[i]);
|
||||
for ( i = 0; i < 3; i++)
|
||||
{
|
||||
tr.sunShadowFbo[i] = FBO_Create("_sunshadowmap", tr.sunShadowDepthImage[i]->width, tr.sunShadowDepthImage[i]->height);
|
||||
FBO_Bind(tr.sunShadowFbo[i]);
|
||||
|
||||
//FBO_CreateBuffer(tr.sunShadowFbo[i], GL_RGBA8, 0, 0);
|
||||
//FBO_AttachTextureImage(tr.sunShadowImage, 0);
|
||||
qglDrawBuffer(GL_NONE);
|
||||
qglReadBuffer(GL_NONE);
|
||||
//FBO_CreateBuffer(tr.sunShadowFbo[i], GL_RGBA8, 0, 0);
|
||||
//FBO_AttachTextureImage(tr.sunShadowImage, 0);
|
||||
qglDrawBuffer(GL_NONE);
|
||||
qglReadBuffer(GL_NONE);
|
||||
|
||||
//FBO_CreateBuffer(tr.sunShadowFbo, GL_DEPTH_COMPONENT24_ARB, 0, 0);
|
||||
R_AttachFBOTextureDepth(tr.sunShadowDepthImage[i]->texnum);
|
||||
//FBO_CreateBuffer(tr.sunShadowFbo, GL_DEPTH_COMPONENT24_ARB, 0, 0);
|
||||
R_AttachFBOTextureDepth(tr.sunShadowDepthImage[i]->texnum);
|
||||
|
||||
R_CheckFBO(tr.sunShadowFbo[i]);
|
||||
R_CheckFBO(tr.sunShadowFbo[i]);
|
||||
|
||||
}
|
||||
|
||||
tr.screenShadowFbo = FBO_Create("_screenshadow", tr.screenShadowImage->width, tr.screenShadowImage->height);
|
||||
FBO_Bind(tr.screenShadowFbo);
|
||||
|
||||
FBO_AttachTextureImage(tr.screenShadowImage, 0);
|
||||
|
||||
R_CheckFBO(tr.screenShadowFbo);
|
||||
}
|
||||
|
||||
for (i = 0; i < 2; i++)
|
||||
|
@ -537,15 +551,6 @@ void FBO_Init(void)
|
|||
R_CheckFBO(tr.quarterFbo[i]);
|
||||
}
|
||||
|
||||
{
|
||||
tr.screenShadowFbo = FBO_Create("_screenshadow", tr.screenShadowImage->width, tr.screenShadowImage->height);
|
||||
FBO_Bind(tr.screenShadowFbo);
|
||||
|
||||
FBO_AttachTextureImage(tr.screenShadowImage, 0);
|
||||
|
||||
R_CheckFBO(tr.screenShadowFbo);
|
||||
}
|
||||
|
||||
if (r_ssao->integer)
|
||||
{
|
||||
tr.hdrDepthFbo = FBO_Create("_hdrDepth", tr.hdrDepthImage->width, tr.hdrDepthImage->height);
|
||||
|
@ -563,6 +568,7 @@ void FBO_Init(void)
|
|||
R_CheckFBO(tr.screenSsaoFbo);
|
||||
}
|
||||
|
||||
if (tr.renderCubeImage)
|
||||
{
|
||||
tr.renderCubeFbo = FBO_Create("_renderCubeFbo", tr.renderCubeImage->width, tr.renderCubeImage->height);
|
||||
FBO_Bind(tr.renderCubeFbo);
|
||||
|
|
|
@ -1647,7 +1647,10 @@ void GLSL_VertexAttribPointers(uint32_t attribBits)
|
|||
}
|
||||
|
||||
// don't just call LogComment, or we will get a call to va() every frame!
|
||||
GLimp_LogComment(va("--- GL_VertexAttribPointers( %s ) ---\n", vbo->name));
|
||||
if(r_logFile->integer)
|
||||
{
|
||||
GLimp_LogComment(va("--- GL_VertexAttribPointers( %s ) ---\n", vbo->name));
|
||||
}
|
||||
|
||||
// position/normal/tangent are always set in case of animation
|
||||
oldFrame = glState.vertexAttribsOldFrame;
|
||||
|
@ -1682,7 +1685,7 @@ void GLSL_VertexAttribPointers(uint32_t attribBits)
|
|||
{
|
||||
GLimp_LogComment("qglVertexAttribPointerARB( ATTR_INDEX_NORMAL )\n");
|
||||
|
||||
qglVertexAttribPointerARB(ATTR_INDEX_NORMAL, 3, GL_UNSIGNED_BYTE, GL_TRUE, vbo->stride_normal, BUFFER_OFFSET(vbo->ofs_normal + newFrame * vbo->size_normal));
|
||||
qglVertexAttribPointerARB(ATTR_INDEX_NORMAL, 4, glRefConfig.packedNormalDataType, GL_TRUE, vbo->stride_normal, BUFFER_OFFSET(vbo->ofs_normal + newFrame * vbo->size_normal));
|
||||
glState.vertexAttribPointersSet |= ATTR_NORMAL;
|
||||
}
|
||||
|
||||
|
@ -1691,7 +1694,7 @@ void GLSL_VertexAttribPointers(uint32_t attribBits)
|
|||
{
|
||||
GLimp_LogComment("qglVertexAttribPointerARB( ATTR_INDEX_TANGENT )\n");
|
||||
|
||||
qglVertexAttribPointerARB(ATTR_INDEX_TANGENT, 4, GL_UNSIGNED_BYTE, GL_TRUE, vbo->stride_tangent, BUFFER_OFFSET(vbo->ofs_tangent + newFrame * vbo->size_normal)); // FIXME
|
||||
qglVertexAttribPointerARB(ATTR_INDEX_TANGENT, 4, glRefConfig.packedNormalDataType, GL_TRUE, vbo->stride_tangent, BUFFER_OFFSET(vbo->ofs_tangent + newFrame * vbo->size_normal)); // FIXME
|
||||
glState.vertexAttribPointersSet |= ATTR_TANGENT;
|
||||
}
|
||||
#endif
|
||||
|
@ -1708,7 +1711,7 @@ void GLSL_VertexAttribPointers(uint32_t attribBits)
|
|||
{
|
||||
GLimp_LogComment("qglVertexAttribPointerARB( ATTR_INDEX_LIGHTDIRECTION )\n");
|
||||
|
||||
qglVertexAttribPointerARB(ATTR_INDEX_LIGHTDIRECTION, 3, GL_FLOAT, 0, vbo->stride_lightdir, BUFFER_OFFSET(vbo->ofs_lightdir));
|
||||
qglVertexAttribPointerARB(ATTR_INDEX_LIGHTDIRECTION, 4, glRefConfig.packedNormalDataType, GL_TRUE, vbo->stride_lightdir, BUFFER_OFFSET(vbo->ofs_lightdir));
|
||||
glState.vertexAttribPointersSet |= ATTR_LIGHTDIRECTION;
|
||||
}
|
||||
|
||||
|
@ -1724,7 +1727,7 @@ void GLSL_VertexAttribPointers(uint32_t attribBits)
|
|||
{
|
||||
GLimp_LogComment("qglVertexAttribPointerARB( ATTR_INDEX_NORMAL2 )\n");
|
||||
|
||||
qglVertexAttribPointerARB(ATTR_INDEX_NORMAL2, 3, GL_UNSIGNED_BYTE, GL_TRUE, vbo->stride_normal, BUFFER_OFFSET(vbo->ofs_normal + oldFrame * vbo->size_normal));
|
||||
qglVertexAttribPointerARB(ATTR_INDEX_NORMAL2, 4, glRefConfig.packedNormalDataType, GL_TRUE, vbo->stride_normal, BUFFER_OFFSET(vbo->ofs_normal + oldFrame * vbo->size_normal));
|
||||
glState.vertexAttribPointersSet |= ATTR_NORMAL2;
|
||||
}
|
||||
|
||||
|
@ -1733,7 +1736,7 @@ void GLSL_VertexAttribPointers(uint32_t attribBits)
|
|||
{
|
||||
GLimp_LogComment("qglVertexAttribPointerARB( ATTR_INDEX_TANGENT2 )\n");
|
||||
|
||||
qglVertexAttribPointerARB(ATTR_INDEX_TANGENT2, 4, GL_UNSIGNED_BYTE, GL_TRUE, vbo->stride_tangent, BUFFER_OFFSET(vbo->ofs_tangent + oldFrame * vbo->size_normal)); // FIXME
|
||||
qglVertexAttribPointerARB(ATTR_INDEX_TANGENT2, 4, glRefConfig.packedNormalDataType, GL_TRUE, vbo->stride_tangent, BUFFER_OFFSET(vbo->ofs_tangent + oldFrame * vbo->size_normal)); // FIXME
|
||||
glState.vertexAttribPointersSet |= ATTR_TANGENT2;
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -2972,25 +2972,34 @@ void R_CreateBuiltinImages( void ) {
|
|||
tr.quarterImage[x] = R_CreateImage(va("*quarter%d", x), NULL, width / 2, height / 2, IMGTYPE_COLORALPHA, IMGFLAG_NO_COMPRESSION | IMGFLAG_CLAMPTOEDGE, GL_RGBA8);
|
||||
}
|
||||
|
||||
tr.screenShadowImage = R_CreateImage("*screenShadow", NULL, width, height, IMGTYPE_COLORALPHA, IMGFLAG_NO_COMPRESSION | IMGFLAG_CLAMPTOEDGE, GL_RGBA8);
|
||||
|
||||
if (r_ssao->integer)
|
||||
{
|
||||
tr.screenSsaoImage = R_CreateImage("*screenSsao", NULL, width / 2, height / 2, IMGTYPE_COLORALPHA, IMGFLAG_NO_COMPRESSION | IMGFLAG_CLAMPTOEDGE, GL_RGBA8);
|
||||
tr.hdrDepthImage = R_CreateImage("*hdrDepth", NULL, width, height, IMGTYPE_COLORALPHA, IMGFLAG_NO_COMPRESSION | IMGFLAG_CLAMPTOEDGE, GL_INTENSITY32F_ARB);
|
||||
}
|
||||
|
||||
for( x = 0; x < MAX_DRAWN_PSHADOWS; x++)
|
||||
if (r_shadows->integer == 4)
|
||||
{
|
||||
tr.pshadowMaps[x] = R_CreateImage(va("*shadowmap%i", x), NULL, PSHADOW_MAP_SIZE, PSHADOW_MAP_SIZE, IMGTYPE_COLORALPHA, IMGFLAG_NO_COMPRESSION | IMGFLAG_CLAMPTOEDGE, GL_RGBA8);
|
||||
for( x = 0; x < MAX_DRAWN_PSHADOWS; x++)
|
||||
{
|
||||
tr.pshadowMaps[x] = R_CreateImage(va("*shadowmap%i", x), NULL, PSHADOW_MAP_SIZE, PSHADOW_MAP_SIZE, IMGTYPE_COLORALPHA, IMGFLAG_NO_COMPRESSION | IMGFLAG_CLAMPTOEDGE, GL_RGBA8);
|
||||
}
|
||||
}
|
||||
|
||||
for ( x = 0; x < 3; x++)
|
||||
if (r_sunlightMode->integer)
|
||||
{
|
||||
tr.sunShadowDepthImage[x] = R_CreateImage(va("*sunshadowdepth%i", x), NULL, r_shadowMapSize->integer, r_shadowMapSize->integer, IMGTYPE_COLORALPHA, IMGFLAG_NO_COMPRESSION | IMGFLAG_CLAMPTOEDGE, GL_DEPTH_COMPONENT24_ARB);
|
||||
for ( x = 0; x < 3; x++)
|
||||
{
|
||||
tr.sunShadowDepthImage[x] = R_CreateImage(va("*sunshadowdepth%i", x), NULL, r_shadowMapSize->integer, r_shadowMapSize->integer, IMGTYPE_COLORALPHA, IMGFLAG_NO_COMPRESSION | IMGFLAG_CLAMPTOEDGE, GL_DEPTH_COMPONENT24_ARB);
|
||||
}
|
||||
|
||||
tr.screenShadowImage = R_CreateImage("*screenShadow", NULL, width, height, IMGTYPE_COLORALPHA, IMGFLAG_NO_COMPRESSION | IMGFLAG_CLAMPTOEDGE, GL_RGBA8);
|
||||
}
|
||||
|
||||
tr.renderCubeImage = R_CreateImage("*renderCube", NULL, CUBE_MAP_SIZE, CUBE_MAP_SIZE, IMGTYPE_COLORALPHA, IMGFLAG_NO_COMPRESSION | IMGFLAG_CLAMPTOEDGE | IMGFLAG_MIPMAP | IMGFLAG_CUBEMAP, rgbFormat);
|
||||
if (r_cubeMapping->integer)
|
||||
{
|
||||
tr.renderCubeImage = R_CreateImage("*renderCube", NULL, CUBE_MAP_SIZE, CUBE_MAP_SIZE, IMGTYPE_COLORALPHA, IMGFLAG_NO_COMPRESSION | IMGFLAG_CLAMPTOEDGE | IMGFLAG_MIPMAP | IMGFLAG_CUBEMAP, rgbFormat);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -103,6 +103,7 @@ cvar_t *r_ext_texture_float;
|
|||
cvar_t *r_arb_half_float_pixel;
|
||||
cvar_t *r_ext_framebuffer_multisample;
|
||||
cvar_t *r_arb_seamless_cube_map;
|
||||
cvar_t *r_arb_vertex_type_2_10_10_10_rev;
|
||||
|
||||
cvar_t *r_mergeMultidraws;
|
||||
cvar_t *r_mergeLeafSurfaces;
|
||||
|
@ -160,6 +161,7 @@ cvar_t *r_shadowMapSize;
|
|||
cvar_t *r_shadowCascadeZNear;
|
||||
cvar_t *r_shadowCascadeZFar;
|
||||
cvar_t *r_shadowCascadeZBias;
|
||||
cvar_t *r_ignoreDstAlpha;
|
||||
|
||||
cvar_t *r_ignoreGLErrors;
|
||||
cvar_t *r_logFile;
|
||||
|
@ -1128,6 +1130,7 @@ void R_Register( void )
|
|||
r_arb_half_float_pixel = ri.Cvar_Get( "r_arb_half_float_pixel", "1", CVAR_ARCHIVE | CVAR_LATCH);
|
||||
r_ext_framebuffer_multisample = ri.Cvar_Get( "r_ext_framebuffer_multisample", "0", CVAR_ARCHIVE | CVAR_LATCH);
|
||||
r_arb_seamless_cube_map = ri.Cvar_Get( "r_arb_seamless_cube_map", "0", CVAR_ARCHIVE | CVAR_LATCH);
|
||||
r_arb_vertex_type_2_10_10_10_rev = ri.Cvar_Get( "r_arb_vertex_type_2_10_10_10_rev", "1", CVAR_ARCHIVE | CVAR_LATCH);
|
||||
|
||||
r_ext_texture_filter_anisotropic = ri.Cvar_Get( "r_ext_texture_filter_anisotropic",
|
||||
"0", CVAR_ARCHIVE | CVAR_LATCH );
|
||||
|
@ -1148,7 +1151,7 @@ void R_Register( void )
|
|||
r_ignorehwgamma = ri.Cvar_Get( "r_ignorehwgamma", "0", CVAR_ARCHIVE | CVAR_LATCH);
|
||||
r_mode = ri.Cvar_Get( "r_mode", "-2", CVAR_ARCHIVE | CVAR_LATCH );
|
||||
r_fullscreen = ri.Cvar_Get( "r_fullscreen", "1", CVAR_ARCHIVE );
|
||||
r_noborder = ri.Cvar_Get("r_noborder", "0", CVAR_ARCHIVE);
|
||||
r_noborder = ri.Cvar_Get("r_noborder", "0", CVAR_ARCHIVE | CVAR_LATCH);
|
||||
r_customwidth = ri.Cvar_Get( "r_customwidth", "1600", CVAR_ARCHIVE | CVAR_LATCH );
|
||||
r_customheight = ri.Cvar_Get( "r_customheight", "1024", CVAR_ARCHIVE | CVAR_LATCH );
|
||||
r_customPixelAspect = ri.Cvar_Get( "r_customPixelAspect", "1", CVAR_ARCHIVE | CVAR_LATCH );
|
||||
|
@ -1215,6 +1218,7 @@ void R_Register( void )
|
|||
r_shadowCascadeZNear = ri.Cvar_Get( "r_shadowCascadeZNear", "4", CVAR_ARCHIVE | CVAR_LATCH );
|
||||
r_shadowCascadeZFar = ri.Cvar_Get( "r_shadowCascadeZFar", "3072", CVAR_ARCHIVE | CVAR_LATCH );
|
||||
r_shadowCascadeZBias = ri.Cvar_Get( "r_shadowCascadeZBias", "-320", CVAR_ARCHIVE | CVAR_LATCH );
|
||||
r_ignoreDstAlpha = ri.Cvar_Get( "r_ignoreDstAlpha", "1", CVAR_ARCHIVE | CVAR_LATCH );
|
||||
|
||||
//
|
||||
// temporary latched variables that can only change over a restart
|
||||
|
|
|
@ -526,83 +526,6 @@ enum
|
|||
ATTR_INDEX_NORMAL2 = 12
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
GLS_SRCBLEND_ZERO = (1 << 0),
|
||||
GLS_SRCBLEND_ONE = (1 << 1),
|
||||
GLS_SRCBLEND_DST_COLOR = (1 << 2),
|
||||
GLS_SRCBLEND_ONE_MINUS_DST_COLOR = (1 << 3),
|
||||
GLS_SRCBLEND_SRC_ALPHA = (1 << 4),
|
||||
GLS_SRCBLEND_ONE_MINUS_SRC_ALPHA = (1 << 5),
|
||||
GLS_SRCBLEND_DST_ALPHA = (1 << 6),
|
||||
GLS_SRCBLEND_ONE_MINUS_DST_ALPHA = (1 << 7),
|
||||
GLS_SRCBLEND_ALPHA_SATURATE = (1 << 8),
|
||||
|
||||
GLS_SRCBLEND_BITS = GLS_SRCBLEND_ZERO
|
||||
| GLS_SRCBLEND_ONE
|
||||
| GLS_SRCBLEND_DST_COLOR
|
||||
| GLS_SRCBLEND_ONE_MINUS_DST_COLOR
|
||||
| GLS_SRCBLEND_SRC_ALPHA
|
||||
| GLS_SRCBLEND_ONE_MINUS_SRC_ALPHA
|
||||
| GLS_SRCBLEND_DST_ALPHA
|
||||
| GLS_SRCBLEND_ONE_MINUS_DST_ALPHA
|
||||
| GLS_SRCBLEND_ALPHA_SATURATE,
|
||||
|
||||
GLS_DSTBLEND_ZERO = (1 << 9),
|
||||
GLS_DSTBLEND_ONE = (1 << 10),
|
||||
GLS_DSTBLEND_SRC_COLOR = (1 << 11),
|
||||
GLS_DSTBLEND_ONE_MINUS_SRC_COLOR = (1 << 12),
|
||||
GLS_DSTBLEND_SRC_ALPHA = (1 << 13),
|
||||
GLS_DSTBLEND_ONE_MINUS_SRC_ALPHA = (1 << 14),
|
||||
GLS_DSTBLEND_DST_ALPHA = (1 << 15),
|
||||
GLS_DSTBLEND_ONE_MINUS_DST_ALPHA = (1 << 16),
|
||||
|
||||
GLS_DSTBLEND_BITS = GLS_DSTBLEND_ZERO
|
||||
| GLS_DSTBLEND_ONE
|
||||
| GLS_DSTBLEND_SRC_COLOR
|
||||
| GLS_DSTBLEND_ONE_MINUS_SRC_COLOR
|
||||
| GLS_DSTBLEND_SRC_ALPHA
|
||||
| GLS_DSTBLEND_ONE_MINUS_SRC_ALPHA
|
||||
| GLS_DSTBLEND_DST_ALPHA
|
||||
| GLS_DSTBLEND_ONE_MINUS_DST_ALPHA,
|
||||
|
||||
GLS_DEPTHMASK_TRUE = (1 << 17),
|
||||
|
||||
GLS_POLYMODE_LINE = (1 << 18),
|
||||
|
||||
GLS_DEPTHTEST_DISABLE = (1 << 19),
|
||||
|
||||
GLS_DEPTHFUNC_LESS = (1 << 20),
|
||||
GLS_DEPTHFUNC_EQUAL = (1 << 21),
|
||||
|
||||
GLS_DEPTHFUNC_BITS = GLS_DEPTHFUNC_LESS
|
||||
| GLS_DEPTHFUNC_EQUAL,
|
||||
|
||||
GLS_ATEST_GT_0 = (1 << 22),
|
||||
GLS_ATEST_LT_128 = (1 << 23),
|
||||
GLS_ATEST_GE_128 = (1 << 24),
|
||||
// GLS_ATEST_GE_CUSTOM = (1 << 25),
|
||||
|
||||
GLS_ATEST_BITS = GLS_ATEST_GT_0
|
||||
| GLS_ATEST_LT_128
|
||||
| GLS_ATEST_GE_128,
|
||||
// | GLS_ATEST_GT_CUSTOM,
|
||||
|
||||
GLS_REDMASK_FALSE = (1 << 26),
|
||||
GLS_GREENMASK_FALSE = (1 << 27),
|
||||
GLS_BLUEMASK_FALSE = (1 << 28),
|
||||
GLS_ALPHAMASK_FALSE = (1 << 29),
|
||||
|
||||
GLS_COLORMASK_BITS = GLS_REDMASK_FALSE
|
||||
| GLS_GREENMASK_FALSE
|
||||
| GLS_BLUEMASK_FALSE
|
||||
| GLS_ALPHAMASK_FALSE,
|
||||
|
||||
GLS_STENCILTEST_ENABLE = (1 << 30),
|
||||
|
||||
GLS_DEFAULT = GLS_DEPTHMASK_TRUE
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
ATTR_POSITION = 0x0001,
|
||||
|
@ -924,7 +847,6 @@ typedef enum {
|
|||
SF_TRIANGLES,
|
||||
SF_POLY,
|
||||
SF_MDV,
|
||||
SF_MD4,
|
||||
SF_MDR,
|
||||
SF_IQM,
|
||||
SF_FLARE,
|
||||
|
@ -1342,7 +1264,6 @@ typedef enum {
|
|||
MOD_BAD,
|
||||
MOD_BRUSH,
|
||||
MOD_MESH,
|
||||
MOD_MD4,
|
||||
MOD_MDR,
|
||||
MOD_IQM
|
||||
} modtype_t;
|
||||
|
@ -1355,7 +1276,7 @@ typedef struct model_s {
|
|||
int dataSize; // just for listing purposes
|
||||
bmodel_t *bmodel; // only if type == MOD_BRUSH
|
||||
mdvModel_t *mdv[MD3_MAX_LODS]; // only if type == MOD_MESH
|
||||
void *modelData; // only if type == (MOD_MD4 | MOD_MDR | MOD_IQM)
|
||||
void *modelData; // only if type == (MOD_MDR | MOD_IQM)
|
||||
|
||||
int numLods;
|
||||
} model_t;
|
||||
|
@ -1502,6 +1423,8 @@ typedef struct {
|
|||
|
||||
qboolean depthClamp;
|
||||
qboolean seamlessCubeMap;
|
||||
|
||||
GLenum packedNormalDataType;
|
||||
} glRefConfig_t;
|
||||
|
||||
|
||||
|
@ -1800,6 +1723,7 @@ extern cvar_t *r_ext_texture_float;
|
|||
extern cvar_t *r_arb_half_float_pixel;
|
||||
extern cvar_t *r_ext_framebuffer_multisample;
|
||||
extern cvar_t *r_arb_seamless_cube_map;
|
||||
extern cvar_t *r_arb_vertex_type_2_10_10_10_rev;
|
||||
|
||||
extern cvar_t *r_nobind; // turns off binding to appropriate textures
|
||||
extern cvar_t *r_singleShader; // make most world faces use default shader
|
||||
|
@ -1893,6 +1817,7 @@ extern cvar_t *r_shadowMapSize;
|
|||
extern cvar_t *r_shadowCascadeZNear;
|
||||
extern cvar_t *r_shadowCascadeZFar;
|
||||
extern cvar_t *r_shadowCascadeZBias;
|
||||
extern cvar_t *r_ignoreDstAlpha;
|
||||
|
||||
extern cvar_t *r_greyscale;
|
||||
|
||||
|
@ -2086,13 +2011,13 @@ typedef struct shaderCommands_s
|
|||
{
|
||||
glIndex_t indexes[SHADER_MAX_INDEXES] QALIGN(16);
|
||||
vec4_t xyz[SHADER_MAX_VERTEXES] QALIGN(16);
|
||||
uint8_t normal[SHADER_MAX_VERTEXES][4] QALIGN(16);
|
||||
uint32_t normal[SHADER_MAX_VERTEXES] QALIGN(16);
|
||||
#ifdef USE_VERT_TANGENT_SPACE
|
||||
uint8_t tangent[SHADER_MAX_VERTEXES][4] QALIGN(16);
|
||||
uint32_t tangent[SHADER_MAX_VERTEXES] QALIGN(16);
|
||||
#endif
|
||||
vec2_t texCoords[SHADER_MAX_VERTEXES][2] QALIGN(16);
|
||||
vec4_t vertexColors[SHADER_MAX_VERTEXES] QALIGN(16);
|
||||
vec4_t lightdir[SHADER_MAX_VERTEXES] QALIGN(16);
|
||||
uint32_t lightdir[SHADER_MAX_VERTEXES] QALIGN(16);
|
||||
//int vertexDlightBits[SHADER_MAX_VERTEXES] QALIGN(16);
|
||||
|
||||
VBO_t *vbo;
|
||||
|
@ -2256,6 +2181,12 @@ VERTEX BUFFER OBJECTS
|
|||
|
||||
============================================================
|
||||
*/
|
||||
|
||||
uint32_t R_VboPackTangent(vec4_t v);
|
||||
uint32_t R_VboPackNormal(vec3_t v);
|
||||
void R_VboUnpackTangent(vec4_t v, uint32_t b);
|
||||
void R_VboUnpackNormal(vec3_t v, uint32_t b);
|
||||
|
||||
VBO_t *R_CreateVBO(const char *name, byte * vertexes, int vertexesSize, vboUsage_t usage);
|
||||
VBO_t *R_CreateVBO2(const char *name, int numVertexes, srfVert_t * vertexes, uint32_t stateBits, vboUsage_t usage);
|
||||
|
||||
|
@ -2346,11 +2277,8 @@ ANIMATED MODELS
|
|||
=============================================================
|
||||
*/
|
||||
|
||||
// void R_MakeAnimModel( model_t *model ); haven't seen this one really, so not needed I guess.
|
||||
void R_AddAnimSurfaces( trRefEntity_t *ent );
|
||||
void RB_SurfaceAnim( md4Surface_t *surfType );
|
||||
void R_MDRAddAnimSurfaces( trRefEntity_t *ent );
|
||||
void RB_MDRSurfaceAnim( md4Surface_t *surface );
|
||||
void RB_MDRSurfaceAnim( mdrSurface_t *surface );
|
||||
qboolean R_LoadIQM (model_t *mod, void *buffer, int filesize, const char *name );
|
||||
void R_AddIQMSurfaces( trRefEntity_t *ent );
|
||||
void RB_IQMSurfaceAnim( surfaceType_t *surface );
|
||||
|
|
|
@ -1574,9 +1574,7 @@ static qboolean SurfIsOffscreen( const drawSurf_t *drawSurf, vec4_t clipDest[128
|
|||
shortest = len;
|
||||
}
|
||||
|
||||
tNormal[0] = tess.normal[tess.indexes[i]][0] / 127.5f - 1.0f;
|
||||
tNormal[1] = tess.normal[tess.indexes[i]][1] / 127.5f - 1.0f;
|
||||
tNormal[2] = tess.normal[tess.indexes[i]][2] / 127.5f - 1.0f;
|
||||
R_VboUnpackNormal(tNormal, tess.normal[tess.indexes[i]]);
|
||||
|
||||
if ( DotProduct( normal, tNormal ) >= 0 )
|
||||
{
|
||||
|
@ -1915,9 +1913,6 @@ static void R_AddEntitySurface (int entityNum)
|
|||
case MOD_MESH:
|
||||
R_AddMD3Surfaces( ent );
|
||||
break;
|
||||
case MOD_MD4:
|
||||
R_AddAnimSurfaces( ent );
|
||||
break;
|
||||
case MOD_MDR:
|
||||
R_MDRAddAnimSurfaces( ent );
|
||||
break;
|
||||
|
@ -2204,12 +2199,6 @@ void R_RenderPshadowMaps(const refdef_t *fd)
|
|||
}
|
||||
break;
|
||||
|
||||
case MOD_MD4:
|
||||
{
|
||||
// FIXME: actually calculate the radius and bounds, this is a horrible hack
|
||||
radius = r_pshadowDist->value / 2.0f;
|
||||
}
|
||||
break;
|
||||
case MOD_MDR:
|
||||
{
|
||||
// FIXME: never actually tested this
|
||||
|
@ -2862,7 +2851,7 @@ void R_RenderCubemapSide( int cubemapIndex, int cubemapSide, qboolean subscene )
|
|||
|
||||
// FIXME: sun shadows aren't rendered correctly in cubemaps
|
||||
// fix involves changing r_FBufScale to fit smaller cubemap image size, or rendering cubemap to framebuffer first
|
||||
if(0) //(glRefConfig.framebufferObject && (r_forceSun->integer || tr.sunShadows))
|
||||
if(0) //(glRefConfig.framebufferObject && r_sunlightMode->integer && (r_forceSun->integer || tr.sunShadows))
|
||||
{
|
||||
R_RenderSunShadowMaps(&refdef, 0);
|
||||
R_RenderSunShadowMaps(&refdef, 1);
|
||||
|
|
|
@ -26,7 +26,6 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|||
#define LL(x) x=LittleLong(x)
|
||||
|
||||
static qboolean R_LoadMD3(model_t *mod, int lod, void *buffer, int bufferSize, const char *modName);
|
||||
static qboolean R_LoadMD4(model_t *mod, void *buffer, const char *name );
|
||||
static qboolean R_LoadMDR(model_t *mod, void *buffer, int filesize, const char *name );
|
||||
|
||||
/*
|
||||
|
@ -73,15 +72,10 @@ qhandle_t R_RegisterMD3(const char *name, model_t *mod)
|
|||
continue;
|
||||
|
||||
ident = LittleLong(* (unsigned *) buf.u);
|
||||
if (ident == MD4_IDENT)
|
||||
loaded = R_LoadMD4(mod, buf.u, name);
|
||||
if (ident == MD3_IDENT)
|
||||
loaded = R_LoadMD3(mod, lod, buf.u, size, name);
|
||||
else
|
||||
{
|
||||
if (ident == MD3_IDENT)
|
||||
loaded = R_LoadMD3(mod, lod, buf.u, size, name);
|
||||
else
|
||||
ri.Printf(PRINT_WARNING,"R_RegisterMD3: unknown fileid for %s\n", name);
|
||||
}
|
||||
ri.Printf(PRINT_WARNING,"R_RegisterMD3: unknown fileid for %s\n", name);
|
||||
|
||||
ri.FS_FreeFile(buf.v);
|
||||
|
||||
|
@ -201,7 +195,6 @@ static modelExtToLoaderMap_t modelLoaders[ ] =
|
|||
{
|
||||
{ "iqm", R_RegisterIQM },
|
||||
{ "mdr", R_RegisterMDR },
|
||||
{ "md4", R_RegisterMD3 },
|
||||
{ "md3", R_RegisterMD3 }
|
||||
};
|
||||
|
||||
|
@ -690,9 +683,9 @@ static qboolean R_LoadMD3(model_t * mod, int lod, void *buffer, int bufferSize,
|
|||
{
|
||||
vec3_t *verts;
|
||||
vec2_t *texcoords;
|
||||
uint8_t *normals;
|
||||
uint32_t *normals;
|
||||
#ifdef USE_VERT_TANGENT_SPACE
|
||||
uint8_t *tangents;
|
||||
uint32_t *tangents;
|
||||
#endif
|
||||
|
||||
byte *data;
|
||||
|
@ -709,11 +702,11 @@ static qboolean R_LoadMD3(model_t * mod, int lod, void *buffer, int bufferSize,
|
|||
dataSize += surf->numVerts * mdvModel->numFrames * sizeof(*verts);
|
||||
|
||||
ofs_normal = dataSize;
|
||||
dataSize += surf->numVerts * mdvModel->numFrames * sizeof(*normals) * 4;
|
||||
dataSize += surf->numVerts * mdvModel->numFrames * sizeof(*normals);
|
||||
|
||||
#ifdef USE_VERT_TANGENT_SPACE
|
||||
ofs_tangent = dataSize;
|
||||
dataSize += surf->numVerts * mdvModel->numFrames * sizeof(*tangents) * 4;
|
||||
dataSize += surf->numVerts * mdvModel->numFrames * sizeof(*tangents);
|
||||
#endif
|
||||
|
||||
ofs_st = dataSize;
|
||||
|
@ -732,18 +725,17 @@ static qboolean R_LoadMD3(model_t * mod, int lod, void *buffer, int bufferSize,
|
|||
for ( j = 0; j < surf->numVerts * mdvModel->numFrames ; j++, v++ )
|
||||
{
|
||||
vec3_t nxt;
|
||||
vec4_t tangent;
|
||||
|
||||
CrossProduct(v->normal, v->tangent, nxt);
|
||||
VectorCopy(v->xyz, verts[j]);
|
||||
normals[j*4+0] = (uint8_t)(v->normal[0] * 127.5f + 128.0f);
|
||||
normals[j*4+1] = (uint8_t)(v->normal[1] * 127.5f + 128.0f);
|
||||
normals[j*4+2] = (uint8_t)(v->normal[2] * 127.5f + 128.0f);
|
||||
normals[j*4+3] = 0;
|
||||
|
||||
normals[j] = R_VboPackNormal(v->normal);
|
||||
#ifdef USE_VERT_TANGENT_SPACE
|
||||
tangents[j*4+0] = (uint8_t)(v->tangent[0] * 127.5f + 128.0f);
|
||||
tangents[j*4+1] = (uint8_t)(v->tangent[1] * 127.5f + 128.0f);
|
||||
tangents[j*4+2] = (uint8_t)(v->tangent[2] * 127.5f + 128.0f);
|
||||
tangents[j*4+3] = (DotProduct(nxt, v->bitangent) < 0.0f) ? 0 : 255;
|
||||
CrossProduct(v->normal, v->tangent, nxt);
|
||||
VectorCopy(v->tangent, tangent);
|
||||
tangent[3] = (DotProduct(nxt, v->bitangent) < 0.0f) ? -1.0f : 1.0f;
|
||||
|
||||
tangents[j] = R_VboPackTangent(tangent);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -772,14 +764,14 @@ static qboolean R_LoadMD3(model_t * mod, int lod, void *buffer, int bufferSize,
|
|||
vboSurf->vbo->ofs_st = ofs_st;
|
||||
|
||||
vboSurf->vbo->stride_xyz = sizeof(*verts);
|
||||
vboSurf->vbo->stride_normal = sizeof(*normals) * 4;
|
||||
vboSurf->vbo->stride_normal = sizeof(*normals);
|
||||
#ifdef USE_VERT_TANGENT_SPACE
|
||||
vboSurf->vbo->stride_tangent = sizeof(*tangents) * 4;
|
||||
vboSurf->vbo->stride_tangent = sizeof(*tangents);
|
||||
#endif
|
||||
vboSurf->vbo->stride_st = sizeof(*st);
|
||||
|
||||
vboSurf->vbo->size_xyz = sizeof(*verts) * surf->numVerts;
|
||||
vboSurf->vbo->size_normal = sizeof(*normals) * surf->numVerts * 4;
|
||||
vboSurf->vbo->size_normal = sizeof(*normals) * surf->numVerts;
|
||||
|
||||
ri.Free(data);
|
||||
|
||||
|
@ -835,7 +827,7 @@ static qboolean R_LoadMDR( model_t *mod, void *buffer, int filesize, const char
|
|||
LL(pinmodel->ofsFrames);
|
||||
|
||||
// This is a model that uses some type of compressed Bones. We don't want to uncompress every bone for each rendered frame
|
||||
// over and over again, we'll uncompress it in this function already, so we must adjust the size of the target md4.
|
||||
// over and over again, we'll uncompress it in this function already, so we must adjust the size of the target mdr.
|
||||
if(pinmodel->ofsFrames < 0)
|
||||
{
|
||||
// mdrFrame_t is larger than mdrCompFrame_t:
|
||||
|
@ -1132,162 +1124,6 @@ static qboolean R_LoadMDR( model_t *mod, void *buffer, int filesize, const char
|
|||
return qtrue;
|
||||
}
|
||||
|
||||
/*
|
||||
=================
|
||||
R_LoadMD4
|
||||
=================
|
||||
*/
|
||||
|
||||
static qboolean R_LoadMD4( model_t *mod, void *buffer, const char *mod_name ) {
|
||||
int i, j, k, lodindex;
|
||||
md4Header_t *pinmodel, *md4;
|
||||
md4Frame_t *frame;
|
||||
md4LOD_t *lod;
|
||||
md4Surface_t *surf;
|
||||
md4Triangle_t *tri;
|
||||
md4Vertex_t *v;
|
||||
int version;
|
||||
int size;
|
||||
shader_t *sh;
|
||||
int frameSize;
|
||||
|
||||
pinmodel = (md4Header_t *)buffer;
|
||||
|
||||
version = LittleLong (pinmodel->version);
|
||||
if (version != MD4_VERSION) {
|
||||
ri.Printf( PRINT_WARNING, "R_LoadMD4: %s has wrong version (%i should be %i)\n",
|
||||
mod_name, version, MD4_VERSION);
|
||||
return qfalse;
|
||||
}
|
||||
|
||||
mod->type = MOD_MD4;
|
||||
size = LittleLong(pinmodel->ofsEnd);
|
||||
mod->dataSize += size;
|
||||
mod->modelData = md4 = ri.Hunk_Alloc( size, h_low );
|
||||
|
||||
Com_Memcpy(md4, buffer, size);
|
||||
|
||||
LL(md4->ident);
|
||||
LL(md4->version);
|
||||
LL(md4->numFrames);
|
||||
LL(md4->numBones);
|
||||
LL(md4->numLODs);
|
||||
LL(md4->ofsFrames);
|
||||
LL(md4->ofsLODs);
|
||||
md4->ofsEnd = size;
|
||||
|
||||
if ( md4->numFrames < 1 ) {
|
||||
ri.Printf( PRINT_WARNING, "R_LoadMD4: %s has no frames\n", mod_name );
|
||||
return qfalse;
|
||||
}
|
||||
|
||||
// we don't need to swap tags in the renderer, they aren't used
|
||||
|
||||
// swap all the frames
|
||||
frameSize = (size_t)( &((md4Frame_t *)0)->bones[ md4->numBones ] );
|
||||
for ( i = 0 ; i < md4->numFrames ; i++) {
|
||||
frame = (md4Frame_t *) ( (byte *)md4 + md4->ofsFrames + i * frameSize );
|
||||
frame->radius = LittleFloat( frame->radius );
|
||||
for ( j = 0 ; j < 3 ; j++ ) {
|
||||
frame->bounds[0][j] = LittleFloat( frame->bounds[0][j] );
|
||||
frame->bounds[1][j] = LittleFloat( frame->bounds[1][j] );
|
||||
frame->localOrigin[j] = LittleFloat( frame->localOrigin[j] );
|
||||
}
|
||||
for ( j = 0 ; j < md4->numBones * sizeof( md4Bone_t ) / 4 ; j++ ) {
|
||||
((float *)frame->bones)[j] = LittleFloat( ((float *)frame->bones)[j] );
|
||||
}
|
||||
}
|
||||
|
||||
// swap all the LOD's
|
||||
lod = (md4LOD_t *) ( (byte *)md4 + md4->ofsLODs );
|
||||
for ( lodindex = 0 ; lodindex < md4->numLODs ; lodindex++ ) {
|
||||
|
||||
// swap all the surfaces
|
||||
surf = (md4Surface_t *) ( (byte *)lod + lod->ofsSurfaces );
|
||||
for ( i = 0 ; i < lod->numSurfaces ; i++) {
|
||||
LL(surf->ident);
|
||||
LL(surf->numTriangles);
|
||||
LL(surf->ofsTriangles);
|
||||
LL(surf->numVerts);
|
||||
LL(surf->ofsVerts);
|
||||
LL(surf->ofsEnd);
|
||||
|
||||
if ( surf->numVerts >= SHADER_MAX_VERTEXES ) {
|
||||
ri.Printf(PRINT_WARNING, "R_LoadMD4: %s has more than %i verts on %s (%i).\n",
|
||||
mod_name, SHADER_MAX_VERTEXES - 1, surf->name[0] ? surf->name : "a surface",
|
||||
surf->numVerts );
|
||||
return qfalse;
|
||||
}
|
||||
if ( surf->numTriangles*3 >= SHADER_MAX_INDEXES ) {
|
||||
ri.Printf(PRINT_WARNING, "R_LoadMD4: %s has more than %i triangles on %s (%i).\n",
|
||||
mod_name, ( SHADER_MAX_INDEXES / 3 ) - 1, surf->name[0] ? surf->name : "a surface",
|
||||
surf->numTriangles );
|
||||
return qfalse;
|
||||
}
|
||||
|
||||
// change to surface identifier
|
||||
surf->ident = SF_MD4;
|
||||
|
||||
// lowercase the surface name so skin compares are faster
|
||||
Q_strlwr( surf->name );
|
||||
|
||||
// register the shaders
|
||||
sh = R_FindShader( surf->shader, LIGHTMAP_NONE, qtrue );
|
||||
if ( sh->defaultShader ) {
|
||||
surf->shaderIndex = 0;
|
||||
} else {
|
||||
surf->shaderIndex = sh->index;
|
||||
}
|
||||
|
||||
// swap all the triangles
|
||||
tri = (md4Triangle_t *) ( (byte *)surf + surf->ofsTriangles );
|
||||
for ( j = 0 ; j < surf->numTriangles ; j++, tri++ ) {
|
||||
LL(tri->indexes[0]);
|
||||
LL(tri->indexes[1]);
|
||||
LL(tri->indexes[2]);
|
||||
}
|
||||
|
||||
// swap all the vertexes
|
||||
// FIXME
|
||||
// This makes TFC's skeletons work. Shouldn't be necessary anymore, but left
|
||||
// in for reference.
|
||||
//v = (md4Vertex_t *) ( (byte *)surf + surf->ofsVerts + 12);
|
||||
v = (md4Vertex_t *) ( (byte *)surf + surf->ofsVerts);
|
||||
for ( j = 0 ; j < surf->numVerts ; j++ ) {
|
||||
v->normal[0] = LittleFloat( v->normal[0] );
|
||||
v->normal[1] = LittleFloat( v->normal[1] );
|
||||
v->normal[2] = LittleFloat( v->normal[2] );
|
||||
|
||||
v->texCoords[0] = LittleFloat( v->texCoords[0] );
|
||||
v->texCoords[1] = LittleFloat( v->texCoords[1] );
|
||||
|
||||
v->numWeights = LittleLong( v->numWeights );
|
||||
|
||||
for ( k = 0 ; k < v->numWeights ; k++ ) {
|
||||
v->weights[k].boneIndex = LittleLong( v->weights[k].boneIndex );
|
||||
v->weights[k].boneWeight = LittleFloat( v->weights[k].boneWeight );
|
||||
v->weights[k].offset[0] = LittleFloat( v->weights[k].offset[0] );
|
||||
v->weights[k].offset[1] = LittleFloat( v->weights[k].offset[1] );
|
||||
v->weights[k].offset[2] = LittleFloat( v->weights[k].offset[2] );
|
||||
}
|
||||
// FIXME
|
||||
// This makes TFC's skeletons work. Shouldn't be necessary anymore, but left
|
||||
// in for reference.
|
||||
//v = (md4Vertex_t *)( ( byte * )&v->weights[v->numWeights] + 12 );
|
||||
v = (md4Vertex_t *)( ( byte * )&v->weights[v->numWeights]);
|
||||
}
|
||||
|
||||
// find the next surface
|
||||
surf = (md4Surface_t *)( (byte *)surf + surf->ofsEnd );
|
||||
}
|
||||
|
||||
// find the next LOD
|
||||
lod = (md4LOD_t *)( (byte *)lod + lod->ofsEnd );
|
||||
}
|
||||
|
||||
return qtrue;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//=============================================================================
|
||||
|
@ -1310,11 +1146,6 @@ void RE_BeginRegistration( glconfig_t *glconfigOut ) {
|
|||
RE_ClearScene();
|
||||
|
||||
tr.registered = qtrue;
|
||||
|
||||
// NOTE: this sucks, for some reason the first stretch pic is never drawn
|
||||
// without this we'd see a white flash on a level load because the very
|
||||
// first time the level shot would not be drawn
|
||||
// RE_StretchPic(0, 0, 0, 0, 0, 0, 1, 1, 0);
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
|
@ -1527,17 +1358,6 @@ void R_ModelBounds( qhandle_t handle, vec3_t mins, vec3_t maxs ) {
|
|||
VectorCopy( frame->bounds[0], mins );
|
||||
VectorCopy( frame->bounds[1], maxs );
|
||||
|
||||
return;
|
||||
} else if (model->type == MOD_MD4) {
|
||||
md4Header_t *header;
|
||||
md4Frame_t *frame;
|
||||
|
||||
header = (md4Header_t *)model->modelData;
|
||||
frame = (md4Frame_t *) ((byte *)header + header->ofsFrames);
|
||||
|
||||
VectorCopy( frame->bounds[0], mins );
|
||||
VectorCopy( frame->bounds[1], maxs );
|
||||
|
||||
return;
|
||||
} else if (model->type == MOD_MDR) {
|
||||
mdrHeader_t *header;
|
||||
|
|
|
@ -1024,7 +1024,10 @@ void RB_IQMSurfaceAnim( surfaceType_t *surface ) {
|
|||
int i;
|
||||
|
||||
vec4_t *outXYZ;
|
||||
uint8_t *outNormal;
|
||||
uint32_t *outNormal;
|
||||
#ifdef USE_VERT_TANGENT_SPACE
|
||||
uint32_t *outTangent;
|
||||
#endif
|
||||
vec2_t (*outTexCoord)[2];
|
||||
vec4_t *outColor;
|
||||
|
||||
|
@ -1039,7 +1042,10 @@ void RB_IQMSurfaceAnim( surfaceType_t *surface ) {
|
|||
RB_CHECKOVERFLOW( surf->num_vertexes, surf->num_triangles * 3 );
|
||||
|
||||
outXYZ = &tess.xyz[tess.numVertexes];
|
||||
outNormal = &tess.normal[tess.numVertexes][0];
|
||||
outNormal = &tess.normal[tess.numVertexes];
|
||||
#ifdef USE_VERT_TANGENT_SPACE
|
||||
outTangent = &tess.tangent[tess.numVertexes];
|
||||
#endif
|
||||
outTexCoord = &tess.texCoords[tess.numVertexes];
|
||||
outColor = &tess.vertexColors[tess.numVertexes];
|
||||
|
||||
|
@ -1050,7 +1056,7 @@ void RB_IQMSurfaceAnim( surfaceType_t *surface ) {
|
|||
|
||||
// transform vertexes and fill other data
|
||||
for( i = 0; i < surf->num_vertexes;
|
||||
i++, outXYZ++, outNormal+=4, outTexCoord++, outColor++ ) {
|
||||
i++, outXYZ++, outNormal++, outTexCoord++, outColor++ ) {
|
||||
int j, k;
|
||||
float vtxMat[12];
|
||||
float nrmMat[9];
|
||||
|
@ -1116,22 +1122,25 @@ void RB_IQMSurfaceAnim( surfaceType_t *surface ) {
|
|||
vtxMat[11];
|
||||
(*outXYZ)[3] = 1.0f;
|
||||
|
||||
(outNormal)[0] = (uint8_t)((
|
||||
nrmMat[ 0] * data->normals[3*vtx+0] +
|
||||
nrmMat[ 1] * data->normals[3*vtx+1] +
|
||||
nrmMat[ 2] * data->normals[3*vtx+2]
|
||||
)* 127.5f + 128.0f);
|
||||
(outNormal)[1] = (uint8_t)((
|
||||
nrmMat[ 3] * data->normals[3*vtx+0] +
|
||||
nrmMat[ 4] * data->normals[3*vtx+1] +
|
||||
nrmMat[ 5] * data->normals[3*vtx+2]
|
||||
)* 127.5f + 128.0f);
|
||||
(outNormal)[2] = (uint8_t)((
|
||||
nrmMat[ 6] * data->normals[3*vtx+0] +
|
||||
nrmMat[ 7] * data->normals[3*vtx+1] +
|
||||
nrmMat[ 8] * data->normals[3*vtx+2]
|
||||
)* 127.5f + 128.0f);
|
||||
(outNormal)[3] = 0;
|
||||
{
|
||||
vec3_t normal;
|
||||
vec4_t tangent;
|
||||
|
||||
normal[0] = DotProduct(&nrmMat[0], &data->normals[3*vtx]);
|
||||
normal[1] = DotProduct(&nrmMat[3], &data->normals[3*vtx]);
|
||||
normal[2] = DotProduct(&nrmMat[6], &data->normals[3*vtx]);
|
||||
|
||||
*outNormal = R_VboPackNormal(normal);
|
||||
|
||||
#ifdef USE_VERT_TANGENT_SPACE
|
||||
tangent[0] = DotProduct(&nrmMat[0], &data->tangents[4*vtx]);
|
||||
tangent[1] = DotProduct(&nrmMat[3], &data->tangents[4*vtx]);
|
||||
tangent[2] = DotProduct(&nrmMat[6], &data->tangents[4*vtx]);
|
||||
tangent[3] = data->tangents[4*vtx+3];
|
||||
|
||||
*outTangent++ = R_VboPackTangent(tangent);
|
||||
#endif
|
||||
}
|
||||
|
||||
(*outColor)[0] = data->colors[4*vtx+0] / 255.0f;
|
||||
(*outColor)[1] = data->colors[4*vtx+1] / 255.0f;
|
||||
|
|
|
@ -496,7 +496,7 @@ void RE_RenderScene( const refdef_t *fd ) {
|
|||
}
|
||||
|
||||
// playing with even more shadows
|
||||
if(glRefConfig.framebufferObject && !( fd->rdflags & RDF_NOWORLDMODEL ) && (r_forceSun->integer || tr.sunShadows))
|
||||
if(glRefConfig.framebufferObject && r_sunlightMode->integer && !( fd->rdflags & RDF_NOWORLDMODEL ) && (r_forceSun->integer || tr.sunShadows))
|
||||
{
|
||||
R_RenderSunShadowMaps(fd, 0);
|
||||
R_RenderSunShadowMaps(fd, 1);
|
||||
|
|
|
@ -1241,7 +1241,7 @@ static void RB_IterateStagesGeneric( shaderCommands_t *input )
|
|||
int i;
|
||||
vec4_t enableTextures;
|
||||
|
||||
if ((backEnd.viewParms.flags & VPF_USESUNLIGHT) && (pStage->glslShaderIndex & LIGHTDEF_LIGHTTYPE_MASK))
|
||||
if (r_sunlightMode->integer && (backEnd.viewParms.flags & VPF_USESUNLIGHT) && (pStage->glslShaderIndex & LIGHTDEF_LIGHTTYPE_MASK))
|
||||
{
|
||||
GL_BindToTMU(tr.screenShadowImage, TB_SHADOWMAP);
|
||||
GLSL_SetUniformVec3(sp, UNIFORM_PRIMARYLIGHTAMBIENT, backEnd.refdef.sunAmbCol);
|
||||
|
@ -1552,8 +1552,8 @@ void RB_StageIteratorGeneric( void )
|
|||
//
|
||||
// pshadows!
|
||||
//
|
||||
if (glRefConfig.framebufferObject && tess.pshadowBits && tess.shader->sort <= SS_OPAQUE
|
||||
&& !(tess.shader->surfaceFlags & (SURF_NODLIGHT | SURF_SKY) ) ) {
|
||||
if (glRefConfig.framebufferObject && r_shadows->integer == 4 && tess.pshadowBits
|
||||
&& tess.shader->sort <= SS_OPAQUE && !(tess.shader->surfaceFlags & (SURF_NODLIGHT | SURF_SKY) ) ) {
|
||||
ProjectPshadowVBOGLSL();
|
||||
}
|
||||
|
||||
|
|
|
@ -116,29 +116,27 @@ void RB_CalcDeformVertexes( deformStage_t *ds )
|
|||
vec3_t offset;
|
||||
float scale;
|
||||
float *xyz = ( float * ) tess.xyz;
|
||||
uint8_t *normal = ( uint8_t * ) tess.normal;
|
||||
uint32_t *normal = tess.normal;
|
||||
float *table;
|
||||
|
||||
if ( ds->deformationWave.frequency == 0 )
|
||||
{
|
||||
scale = EvalWaveForm( &ds->deformationWave );
|
||||
|
||||
for ( i = 0; i < tess.numVertexes; i++, xyz += 4, normal += 4 )
|
||||
for ( i = 0; i < tess.numVertexes; i++, xyz += 4, normal++ )
|
||||
{
|
||||
offset[0] = (normal[0] / 127.5f - 1.0f) * scale;
|
||||
offset[1] = (normal[1] / 127.5f - 1.0f) * scale;
|
||||
offset[2] = (normal[2] / 127.5f - 1.0f) * scale;
|
||||
R_VboUnpackNormal(offset, *normal);
|
||||
|
||||
xyz[0] += offset[0];
|
||||
xyz[1] += offset[1];
|
||||
xyz[2] += offset[2];
|
||||
xyz[0] += offset[0] * scale;
|
||||
xyz[1] += offset[1] * scale;
|
||||
xyz[2] += offset[2] * scale;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
table = TableForFunc( ds->deformationWave.func );
|
||||
|
||||
for ( i = 0; i < tess.numVertexes; i++, xyz += 4, normal += 4 )
|
||||
for ( i = 0; i < tess.numVertexes; i++, xyz += 4, normal++ )
|
||||
{
|
||||
float off = ( xyz[0] + xyz[1] + xyz[2] ) * ds->deformationSpread;
|
||||
|
||||
|
@ -147,13 +145,11 @@ void RB_CalcDeformVertexes( deformStage_t *ds )
|
|||
ds->deformationWave.phase + off,
|
||||
ds->deformationWave.frequency );
|
||||
|
||||
offset[0] = (normal[0] / 127.5f - 1.0f) * scale;
|
||||
offset[1] = (normal[1] / 127.5f - 1.0f) * scale;
|
||||
offset[2] = (normal[2] / 127.5f - 1.0f) * scale;
|
||||
|
||||
xyz[0] += offset[0];
|
||||
xyz[1] += offset[1];
|
||||
xyz[2] += offset[2];
|
||||
R_VboUnpackNormal(offset, *normal);
|
||||
|
||||
xyz[0] += offset[0] * scale;
|
||||
xyz[1] += offset[1] * scale;
|
||||
xyz[2] += offset[2] * scale;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -169,14 +165,12 @@ void RB_CalcDeformNormals( deformStage_t *ds ) {
|
|||
int i;
|
||||
float scale;
|
||||
float *xyz = ( float * ) tess.xyz;
|
||||
uint8_t *normal = ( uint8_t * ) tess.normal;
|
||||
uint32_t *normal = tess.normal;
|
||||
|
||||
for ( i = 0; i < tess.numVertexes; i++, xyz += 4, normal += 4 ) {
|
||||
for ( i = 0; i < tess.numVertexes; i++, xyz += 4, normal++ ) {
|
||||
vec3_t fNormal;
|
||||
|
||||
fNormal[0] = normal[0] / 127.5f - 1.0f;
|
||||
fNormal[1] = normal[1] / 127.5f - 1.0f;
|
||||
fNormal[2] = normal[2] / 127.5f - 1.0f;
|
||||
R_VboUnpackNormal(fNormal, *normal);
|
||||
|
||||
scale = 0.98f;
|
||||
scale = R_NoiseGet4f( xyz[0] * scale, xyz[1] * scale, xyz[2] * scale,
|
||||
|
@ -195,9 +189,7 @@ void RB_CalcDeformNormals( deformStage_t *ds ) {
|
|||
|
||||
VectorNormalizeFast( fNormal );
|
||||
|
||||
normal[0] = (uint8_t)(fNormal[0] * 127.5f + 128.0f);
|
||||
normal[1] = (uint8_t)(fNormal[0] * 127.5f + 128.0f);
|
||||
normal[2] = (uint8_t)(fNormal[0] * 127.5f + 128.0f);
|
||||
*normal = R_VboPackNormal(fNormal);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -211,22 +203,25 @@ void RB_CalcBulgeVertexes( deformStage_t *ds ) {
|
|||
int i;
|
||||
const float *st = ( const float * ) tess.texCoords[0];
|
||||
float *xyz = ( float * ) tess.xyz;
|
||||
uint8_t *normal = ( uint8_t * ) tess.normal;
|
||||
uint32_t *normal = tess.normal;
|
||||
float now;
|
||||
|
||||
now = backEnd.refdef.time * ds->bulgeSpeed * 0.001f;
|
||||
|
||||
for ( i = 0; i < tess.numVertexes; i++, xyz += 4, st += 4, normal += 4 ) {
|
||||
for ( i = 0; i < tess.numVertexes; i++, xyz += 4, st += 4, normal++ ) {
|
||||
int off;
|
||||
float scale;
|
||||
vec3_t fNormal;
|
||||
|
||||
R_VboUnpackNormal(fNormal, *normal);
|
||||
|
||||
off = (float)( FUNCTABLE_SIZE / (M_PI*2) ) * ( st[0] * ds->bulgeWidth + now );
|
||||
|
||||
scale = tr.sinTable[ off & FUNCTABLE_MASK ] * ds->bulgeHeight;
|
||||
|
||||
xyz[0] += (normal[0] / 127.5f - 1.0f) * scale;
|
||||
xyz[1] += (normal[1] / 127.5f - 1.0f) * scale;
|
||||
xyz[2] += (normal[2] / 127.5f - 1.0f) * scale;
|
||||
xyz[0] += fNormal[0] * scale;
|
||||
xyz[1] += fNormal[1] * scale;
|
||||
xyz[2] += fNormal[2] * scale;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -281,11 +276,8 @@ void DeformText( const char *text ) {
|
|||
height[0] = 0;
|
||||
height[1] = 0;
|
||||
height[2] = -1;
|
||||
|
||||
fNormal[0] = tess.normal[0][0] / 127.5f - 1.0f;
|
||||
fNormal[1] = tess.normal[0][1] / 127.5f - 1.0f;
|
||||
fNormal[2] = tess.normal[0][2] / 127.5f - 1.0f;
|
||||
|
||||
R_VboUnpackNormal(fNormal, tess.normal[0]);
|
||||
CrossProduct( fNormal, height, width );
|
||||
|
||||
// find the midpoint of the box
|
||||
|
|
|
@ -203,10 +203,16 @@ static int NameToSrcBlendMode( const char *name )
|
|||
}
|
||||
else if ( !Q_stricmp( name, "GL_DST_ALPHA" ) )
|
||||
{
|
||||
if (r_ignoreDstAlpha->integer)
|
||||
return GLS_SRCBLEND_ONE;
|
||||
|
||||
return GLS_SRCBLEND_DST_ALPHA;
|
||||
}
|
||||
else if ( !Q_stricmp( name, "GL_ONE_MINUS_DST_ALPHA" ) )
|
||||
{
|
||||
if (r_ignoreDstAlpha->integer)
|
||||
return GLS_SRCBLEND_ZERO;
|
||||
|
||||
return GLS_SRCBLEND_ONE_MINUS_DST_ALPHA;
|
||||
}
|
||||
else if ( !Q_stricmp( name, "GL_SRC_ALPHA_SATURATE" ) )
|
||||
|
@ -243,10 +249,16 @@ static int NameToDstBlendMode( const char *name )
|
|||
}
|
||||
else if ( !Q_stricmp( name, "GL_DST_ALPHA" ) )
|
||||
{
|
||||
if (r_ignoreDstAlpha->integer)
|
||||
return GLS_DSTBLEND_ONE;
|
||||
|
||||
return GLS_DSTBLEND_DST_ALPHA;
|
||||
}
|
||||
else if ( !Q_stricmp( name, "GL_ONE_MINUS_DST_ALPHA" ) )
|
||||
{
|
||||
if (r_ignoreDstAlpha->integer)
|
||||
return GLS_DSTBLEND_ZERO;
|
||||
|
||||
return GLS_DSTBLEND_ONE_MINUS_DST_ALPHA;
|
||||
}
|
||||
else if ( !Q_stricmp( name, "GL_SRC_COLOR" ) )
|
||||
|
|
|
@ -124,26 +124,11 @@ void RB_AddQuadStampExt( vec3_t origin, vec3_t left, vec3_t up, float color[4],
|
|||
// constant normal all the way around
|
||||
VectorSubtract( vec3_origin, backEnd.viewParms.or.axis[0], normal );
|
||||
|
||||
tess.normal[ndx][0] = (uint8_t)(normal[0] * 127.5f + 128.0f);
|
||||
tess.normal[ndx][1] = (uint8_t)(normal[1] * 127.5f + 128.0f);
|
||||
tess.normal[ndx][2] = (uint8_t)(normal[2] * 127.5f + 128.0f);
|
||||
tess.normal[ndx][3] = 0;
|
||||
tess.normal[ndx] =
|
||||
tess.normal[ndx+1] =
|
||||
tess.normal[ndx+2] =
|
||||
tess.normal[ndx+3] = R_VboPackNormal(normal);
|
||||
|
||||
tess.normal[ndx+1][0] = (uint8_t)(normal[0] * 127.5f + 128.0f);
|
||||
tess.normal[ndx+1][1] = (uint8_t)(normal[1] * 127.5f + 128.0f);
|
||||
tess.normal[ndx+1][2] = (uint8_t)(normal[2] * 127.5f + 128.0f);
|
||||
tess.normal[ndx+1][3] = 0;
|
||||
|
||||
tess.normal[ndx+2][0] = (uint8_t)(normal[0] * 127.5f + 128.0f);
|
||||
tess.normal[ndx+2][1] = (uint8_t)(normal[1] * 127.5f + 128.0f);
|
||||
tess.normal[ndx+2][2] = (uint8_t)(normal[2] * 127.5f + 128.0f);
|
||||
tess.normal[ndx+2][3] = 0;
|
||||
|
||||
tess.normal[ndx+3][0] = (uint8_t)(normal[0] * 127.5f + 128.0f);
|
||||
tess.normal[ndx+3][1] = (uint8_t)(normal[1] * 127.5f + 128.0f);
|
||||
tess.normal[ndx+3][2] = (uint8_t)(normal[2] * 127.5f + 128.0f);
|
||||
tess.normal[ndx+3][3] = 0;
|
||||
|
||||
// standard square texture coordinates
|
||||
VectorSet2(tess.texCoords[ndx ][0], s1, t1);
|
||||
VectorSet2(tess.texCoords[ndx ][1], s1, t1);
|
||||
|
@ -331,10 +316,11 @@ static void RB_SurfaceVertsAndIndexes( int numVerts, srfVert_t *verts, int numIn
|
|||
int i;
|
||||
glIndex_t *inIndex;
|
||||
srfVert_t *dv;
|
||||
float *xyz, *texCoords, *lightCoords, *lightdir;
|
||||
uint8_t *normal;
|
||||
float *xyz, *texCoords, *lightCoords;
|
||||
uint32_t *lightdir;
|
||||
uint32_t *normal;
|
||||
#ifdef USE_VERT_TANGENT_SPACE
|
||||
uint8_t *tangent;
|
||||
uint32_t *tangent;
|
||||
#endif
|
||||
glIndex_t *outIndex;
|
||||
float *color;
|
||||
|
@ -361,28 +347,18 @@ static void RB_SurfaceVertsAndIndexes( int numVerts, srfVert_t *verts, int numIn
|
|||
if ( tess.shader->vertexAttribs & ATTR_NORMAL )
|
||||
{
|
||||
dv = verts;
|
||||
normal = tess.normal[ tess.numVertexes ];
|
||||
for ( i = 0 ; i < numVerts ; i++, dv++, normal+=4 )
|
||||
{
|
||||
normal[0] = (uint8_t)(dv->normal[0] * 127.5f + 128.0f);
|
||||
normal[1] = (uint8_t)(dv->normal[1] * 127.5f + 128.0f);
|
||||
normal[2] = (uint8_t)(dv->normal[2] * 127.5f + 128.0f);
|
||||
normal[3] = 0;
|
||||
}
|
||||
normal = &tess.normal[ tess.numVertexes ];
|
||||
for ( i = 0 ; i < numVerts ; i++, dv++, normal++ )
|
||||
*normal = R_VboPackNormal(dv->normal);
|
||||
}
|
||||
|
||||
#ifdef USE_VERT_TANGENT_SPACE
|
||||
if ( tess.shader->vertexAttribs & ATTR_TANGENT )
|
||||
{
|
||||
dv = verts;
|
||||
tangent = tess.tangent[ tess.numVertexes ];
|
||||
for ( i = 0 ; i < numVerts ; i++, dv++, tangent+=4 )
|
||||
{
|
||||
tangent[0] = (uint8_t)(dv->tangent[0] * 127.5f + 128.0f);
|
||||
tangent[1] = (uint8_t)(dv->tangent[1] * 127.5f + 128.0f);
|
||||
tangent[2] = (uint8_t)(dv->tangent[2] * 127.5f + 128.0f);
|
||||
tangent[3] = (uint8_t)(dv->tangent[3] * 127.5f + 128.0f);
|
||||
}
|
||||
tangent = &tess.tangent[ tess.numVertexes ];
|
||||
for ( i = 0 ; i < numVerts ; i++, dv++, tangent++ )
|
||||
*tangent = R_VboPackTangent(dv->tangent);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -413,9 +389,9 @@ static void RB_SurfaceVertsAndIndexes( int numVerts, srfVert_t *verts, int numIn
|
|||
if ( tess.shader->vertexAttribs & ATTR_LIGHTDIRECTION )
|
||||
{
|
||||
dv = verts;
|
||||
lightdir = tess.lightdir[ tess.numVertexes ];
|
||||
for ( i = 0 ; i < numVerts ; i++, dv++, lightdir+=4 )
|
||||
VectorCopy(dv->lightdir, lightdir);
|
||||
lightdir = &tess.lightdir[ tess.numVertexes ];
|
||||
for ( i = 0 ; i < numVerts ; i++, dv++, lightdir++ )
|
||||
*lightdir = R_VboPackNormal(dv->lightdir);
|
||||
}
|
||||
|
||||
#if 0 // nothing even uses vertex dlightbits
|
||||
|
@ -651,6 +627,8 @@ static void DoRailCore( const vec3_t start, const vec3_t end, const vec3_t up, f
|
|||
int vbase;
|
||||
float t = len / 256.0f;
|
||||
|
||||
RB_CHECKOVERFLOW( 4, 6 );
|
||||
|
||||
vbase = tess.numVertexes;
|
||||
|
||||
spanWidth2 = -spanWidth;
|
||||
|
@ -1150,14 +1128,14 @@ static void LerpMeshVertexes_scalar(mdvSurface_t *surf, float backlerp)
|
|||
}
|
||||
#endif
|
||||
float *outXyz;
|
||||
uint8_t *outNormal;
|
||||
uint32_t *outNormal;
|
||||
mdvVertex_t *newVerts;
|
||||
int vertNum;
|
||||
|
||||
newVerts = surf->verts + backEnd.currentEntity->e.frame * surf->numVerts;
|
||||
|
||||
outXyz = tess.xyz[tess.numVertexes];
|
||||
outNormal = tess.normal[tess.numVertexes];
|
||||
outNormal = &tess.normal[tess.numVertexes];
|
||||
|
||||
if (backlerp == 0)
|
||||
{
|
||||
|
@ -1172,14 +1150,11 @@ static void LerpMeshVertexes_scalar(mdvSurface_t *surf, float backlerp)
|
|||
VectorCopy(newVerts->xyz, outXyz);
|
||||
VectorCopy(newVerts->normal, normal);
|
||||
|
||||
outNormal[0] = (uint8_t)(normal[0] * 127.5f + 128.0f);
|
||||
outNormal[1] = (uint8_t)(normal[1] * 127.5f + 128.0f);
|
||||
outNormal[2] = (uint8_t)(normal[2] * 127.5f + 128.0f);
|
||||
outNormal[3] = 0;
|
||||
*outNormal = R_VboPackNormal(normal);
|
||||
|
||||
newVerts++;
|
||||
outXyz += 4;
|
||||
outNormal += 4;
|
||||
outNormal++;
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -1200,15 +1175,12 @@ static void LerpMeshVertexes_scalar(mdvSurface_t *surf, float backlerp)
|
|||
VectorLerp(newVerts->normal, oldVerts->normal, backlerp, normal);
|
||||
VectorNormalize(normal);
|
||||
|
||||
outNormal[0] = (uint8_t)(normal[0] * 127.5f + 128.0f);
|
||||
outNormal[1] = (uint8_t)(normal[1] * 127.5f + 128.0f);
|
||||
outNormal[2] = (uint8_t)(normal[2] * 127.5f + 128.0f);
|
||||
outNormal[3] = 0;
|
||||
*outNormal = R_VboPackNormal(normal);
|
||||
|
||||
newVerts++;
|
||||
oldVerts++;
|
||||
outXyz += 4;
|
||||
outNormal += 4;
|
||||
outNormal++;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1330,11 +1302,12 @@ static void RB_SurfaceGrid( srfBspSurface_t *srf ) {
|
|||
int i, j;
|
||||
float *xyz;
|
||||
float *texCoords, *lightCoords;
|
||||
uint8_t *normal;
|
||||
uint32_t *normal;
|
||||
#ifdef USE_VERT_TANGENT_SPACE
|
||||
uint8_t *tangent;
|
||||
uint32_t *tangent;
|
||||
#endif
|
||||
float *color, *lightdir;
|
||||
float *color;
|
||||
uint32_t *lightdir;
|
||||
srfVert_t *dv;
|
||||
int rows, irows, vrows;
|
||||
int used;
|
||||
|
@ -1417,14 +1390,14 @@ static void RB_SurfaceGrid( srfBspSurface_t *srf ) {
|
|||
numVertexes = tess.numVertexes;
|
||||
|
||||
xyz = tess.xyz[numVertexes];
|
||||
normal = tess.normal[numVertexes];
|
||||
normal = &tess.normal[numVertexes];
|
||||
#ifdef USE_VERT_TANGENT_SPACE
|
||||
tangent = tess.tangent[numVertexes];
|
||||
tangent = &tess.tangent[numVertexes];
|
||||
#endif
|
||||
texCoords = tess.texCoords[numVertexes][0];
|
||||
lightCoords = tess.texCoords[numVertexes][1];
|
||||
color = tess.vertexColors[numVertexes];
|
||||
lightdir = tess.lightdir[numVertexes];
|
||||
lightdir = &tess.lightdir[numVertexes];
|
||||
//vDlightBits = &tess.vertexDlightBits[numVertexes];
|
||||
|
||||
for ( i = 0 ; i < rows ; i++ ) {
|
||||
|
@ -1440,21 +1413,13 @@ static void RB_SurfaceGrid( srfBspSurface_t *srf ) {
|
|||
|
||||
if ( tess.shader->vertexAttribs & ATTR_NORMAL )
|
||||
{
|
||||
normal[0] = (uint8_t)(dv->normal[0] * 127.5f + 128.0f);
|
||||
normal[1] = (uint8_t)(dv->normal[1] * 127.5f + 128.0f);
|
||||
normal[2] = (uint8_t)(dv->normal[2] * 127.5f + 128.0f);
|
||||
normal[3] = 0;
|
||||
normal += 4;
|
||||
*normal++ = R_VboPackNormal(dv->normal);
|
||||
}
|
||||
|
||||
#ifdef USE_VERT_TANGENT_SPACE
|
||||
if ( tess.shader->vertexAttribs & ATTR_TANGENT )
|
||||
{
|
||||
tangent[0] = (uint8_t)(dv->tangent[0] * 127.5f + 128.0f);
|
||||
tangent[1] = (uint8_t)(dv->tangent[1] * 127.5f + 128.0f);
|
||||
tangent[2] = (uint8_t)(dv->tangent[2] * 127.5f + 128.0f);
|
||||
tangent[3] = (uint8_t)(dv->tangent[3] * 127.5f + 128.0f);
|
||||
tangent += 4;
|
||||
*tangent++ = R_VboPackTangent(dv->tangent);
|
||||
}
|
||||
#endif
|
||||
if ( tess.shader->vertexAttribs & ATTR_TEXCOORD )
|
||||
|
@ -1477,8 +1442,7 @@ static void RB_SurfaceGrid( srfBspSurface_t *srf ) {
|
|||
|
||||
if ( tess.shader->vertexAttribs & ATTR_LIGHTDIRECTION )
|
||||
{
|
||||
VectorCopy(dv->lightdir, lightdir);
|
||||
lightdir += 4;
|
||||
*lightdir++ = R_VboPackNormal(dv->lightdir);
|
||||
}
|
||||
|
||||
//*vDlightBits++ = dlightBits;
|
||||
|
@ -1676,7 +1640,6 @@ void (*rb_surfaceTable[SF_NUM_SURFACE_TYPES])( void *) = {
|
|||
(void(*)(void*))RB_SurfaceTriangles, // SF_TRIANGLES,
|
||||
(void(*)(void*))RB_SurfacePolychain, // SF_POLY,
|
||||
(void(*)(void*))RB_SurfaceMesh, // SF_MDV,
|
||||
(void(*)(void*))RB_SurfaceAnim, // SF_MD4,
|
||||
(void(*)(void*))RB_MDRSurfaceAnim, // SF_MDR,
|
||||
(void(*)(void*))RB_IQMSurfaceAnim, // SF_IQM,
|
||||
(void(*)(void*))RB_SurfaceFlare, // SF_FLARE,
|
||||
|
|
|
@ -22,6 +22,75 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|||
// tr_vbo.c
|
||||
#include "tr_local.h"
|
||||
|
||||
|
||||
uint32_t R_VboPackTangent(vec4_t v)
|
||||
{
|
||||
if (glRefConfig.packedNormalDataType == GL_UNSIGNED_INT_2_10_10_10_REV)
|
||||
{
|
||||
return (((uint32_t)(v[3] * 1.5f + 2.0f )) << 30)
|
||||
| (((uint32_t)(v[2] * 511.5f + 512.0f)) << 20)
|
||||
| (((uint32_t)(v[1] * 511.5f + 512.0f)) << 10)
|
||||
| (((uint32_t)(v[0] * 511.5f + 512.0f)));
|
||||
}
|
||||
else
|
||||
{
|
||||
return (((uint32_t)(v[3] * 127.5f + 128.0f)) << 24)
|
||||
| (((uint32_t)(v[2] * 127.5f + 128.0f)) << 16)
|
||||
| (((uint32_t)(v[1] * 127.5f + 128.0f)) << 8)
|
||||
| (((uint32_t)(v[0] * 127.5f + 128.0f)));
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t R_VboPackNormal(vec3_t v)
|
||||
{
|
||||
if (glRefConfig.packedNormalDataType == GL_UNSIGNED_INT_2_10_10_10_REV)
|
||||
{
|
||||
return (((uint32_t)(v[2] * 511.5f + 512.0f)) << 20)
|
||||
| (((uint32_t)(v[1] * 511.5f + 512.0f)) << 10)
|
||||
| (((uint32_t)(v[0] * 511.5f + 512.0f)));
|
||||
}
|
||||
else
|
||||
{
|
||||
return (((uint32_t)(v[2] * 127.5f + 128.0f)) << 16)
|
||||
| (((uint32_t)(v[1] * 127.5f + 128.0f)) << 8)
|
||||
| (((uint32_t)(v[0] * 127.5f + 128.0f)));
|
||||
}
|
||||
}
|
||||
|
||||
void R_VboUnpackTangent(vec4_t v, uint32_t b)
|
||||
{
|
||||
if (glRefConfig.packedNormalDataType == GL_UNSIGNED_INT_2_10_10_10_REV)
|
||||
{
|
||||
v[0] = ((b) & 0x3ff) * 1.0f/511.5f - 1.0f;
|
||||
v[1] = ((b >> 10) & 0x3ff) * 1.0f/511.5f - 1.0f;
|
||||
v[2] = ((b >> 20) & 0x3ff) * 1.0f/511.5f - 1.0f;
|
||||
v[3] = ((b >> 30) & 0x3) * 1.0f/1.5f - 1.0f;
|
||||
}
|
||||
else
|
||||
{
|
||||
v[0] = ((b) & 0xff) * 1.0f/127.5f - 1.0f;
|
||||
v[1] = ((b >> 8) & 0xff) * 1.0f/127.5f - 1.0f;
|
||||
v[2] = ((b >> 16) & 0xff) * 1.0f/127.5f - 1.0f;
|
||||
v[3] = ((b >> 24) & 0xff) * 1.0f/127.5f - 1.0f;
|
||||
}
|
||||
}
|
||||
|
||||
void R_VboUnpackNormal(vec3_t v, uint32_t b)
|
||||
{
|
||||
if (glRefConfig.packedNormalDataType == GL_UNSIGNED_INT_2_10_10_10_REV)
|
||||
{
|
||||
v[0] = ((b) & 0x3ff) * 1.0f/511.5f - 1.0f;
|
||||
v[1] = ((b >> 10) & 0x3ff) * 1.0f/511.5f - 1.0f;
|
||||
v[2] = ((b >> 20) & 0x3ff) * 1.0f/511.5f - 1.0f;
|
||||
}
|
||||
else
|
||||
{
|
||||
v[0] = ((b) & 0xff) * 1.0f/127.5f - 1.0f;
|
||||
v[1] = ((b >> 8) & 0xff) * 1.0f/127.5f - 1.0f;
|
||||
v[2] = ((b >> 16) & 0xff) * 1.0f/127.5f - 1.0f;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
============
|
||||
R_CreateVBO
|
||||
|
@ -142,14 +211,14 @@ VBO_t *R_CreateVBO2(const char *name, int numVertexes, srfVert_t * vert
|
|||
if(stateBits & ATTR_NORMAL)
|
||||
{
|
||||
vbo->ofs_normal = dataSize;
|
||||
dataSize += sizeof(uint8_t) * 4;
|
||||
dataSize += sizeof(uint32_t);
|
||||
}
|
||||
|
||||
#ifdef USE_VERT_TANGENT_SPACE
|
||||
if(stateBits & ATTR_TANGENT)
|
||||
{
|
||||
vbo->ofs_tangent = dataSize;
|
||||
dataSize += sizeof(uint8_t) * 4;
|
||||
dataSize += sizeof(uint32_t);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -174,7 +243,7 @@ VBO_t *R_CreateVBO2(const char *name, int numVertexes, srfVert_t * vert
|
|||
if(stateBits & ATTR_LIGHTDIRECTION)
|
||||
{
|
||||
vbo->ofs_lightdir = dataSize;
|
||||
dataSize += sizeof(verts[0].lightdir);
|
||||
dataSize += sizeof(uint32_t);
|
||||
}
|
||||
|
||||
vbo->stride_xyz = dataSize;
|
||||
|
@ -204,31 +273,22 @@ VBO_t *R_CreateVBO2(const char *name, int numVertexes, srfVert_t * vert
|
|||
// normal
|
||||
if(stateBits & ATTR_NORMAL)
|
||||
{
|
||||
uint8_t *p = data + dataOfs;
|
||||
uint32_t *p = (uint32_t *)(data + dataOfs);
|
||||
|
||||
p[0] = (uint8_t)(verts[i].normal[0] * 127.5f + 128.0f);
|
||||
p[1] = (uint8_t)(verts[i].normal[1] * 127.5f + 128.0f);
|
||||
p[2] = (uint8_t)(verts[i].normal[2] * 127.5f + 128.0f);
|
||||
p[3] = 0;
|
||||
*p = R_VboPackNormal(verts[i].normal);
|
||||
|
||||
dataOfs += sizeof(uint8_t) * 4;
|
||||
dataOfs += sizeof(uint32_t);
|
||||
}
|
||||
|
||||
#ifdef USE_VERT_TANGENT_SPACE
|
||||
// tangent
|
||||
if(stateBits & ATTR_TANGENT)
|
||||
{
|
||||
vec3_t nxt;
|
||||
uint8_t *p = data + dataOfs;
|
||||
uint32_t *p = (uint32_t *)(data + dataOfs);
|
||||
|
||||
CrossProduct(verts[i].normal, verts[i].tangent, nxt);
|
||||
*p = R_VboPackTangent(verts[i].tangent);
|
||||
|
||||
p[0] = (uint8_t)(verts[i].tangent[0] * 127.5f + 128.0f);
|
||||
p[1] = (uint8_t)(verts[i].tangent[1] * 127.5f + 128.0f);
|
||||
p[2] = (uint8_t)(verts[i].tangent[2] * 127.5f + 128.0f);
|
||||
p[3] = (uint8_t)(verts[i].tangent[3] * 127.5f + 128.0f);
|
||||
|
||||
dataOfs += sizeof(uint8_t) * 4;
|
||||
dataOfs += sizeof(uint32_t);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -256,8 +316,11 @@ VBO_t *R_CreateVBO2(const char *name, int numVertexes, srfVert_t * vert
|
|||
// feed vertex light directions
|
||||
if(stateBits & ATTR_LIGHTDIRECTION)
|
||||
{
|
||||
memcpy(data + dataOfs, &verts[i].lightdir, sizeof(verts[i].lightdir));
|
||||
dataOfs += sizeof(verts[i].lightdir);
|
||||
uint32_t *p = (uint32_t *)(data + dataOfs);
|
||||
|
||||
*p = R_VboPackNormal(verts[i].lightdir);
|
||||
|
||||
dataOfs += sizeof(uint32_t);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -268,13 +331,13 @@ VBO_t *R_CreateVBO2(const char *name, int numVertexes, srfVert_t * vert
|
|||
|
||||
if(stateBits & ATTR_NORMAL)
|
||||
{
|
||||
dataSize += sizeof(uint8_t) * 4;
|
||||
dataSize += sizeof(uint32_t);
|
||||
}
|
||||
|
||||
#ifdef USE_VERT_TANGENT_SPACE
|
||||
if(stateBits & ATTR_TANGENT)
|
||||
{
|
||||
dataSize += sizeof(uint8_t) * 4;
|
||||
dataSize += sizeof(uint32_t);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -295,7 +358,7 @@ VBO_t *R_CreateVBO2(const char *name, int numVertexes, srfVert_t * vert
|
|||
|
||||
if(stateBits & ATTR_LIGHTDIRECTION)
|
||||
{
|
||||
dataSize += sizeof(verts[0].lightdir);
|
||||
dataSize += sizeof(uint32_t);
|
||||
}
|
||||
|
||||
// create VBO
|
||||
|
@ -314,14 +377,14 @@ VBO_t *R_CreateVBO2(const char *name, int numVertexes, srfVert_t * vert
|
|||
vbo->ofs_lightdir = 0;
|
||||
|
||||
vbo->stride_xyz = sizeof(verts[0].xyz);
|
||||
vbo->stride_normal = sizeof(uint8_t) * 4;
|
||||
vbo->stride_normal = sizeof(uint32_t);
|
||||
#ifdef USE_VERT_TANGENT_SPACE
|
||||
vbo->stride_tangent = sizeof(uint8_t) * 4;
|
||||
vbo->stride_tangent = sizeof(uint32_t);
|
||||
#endif
|
||||
vbo->stride_vertexcolor = sizeof(verts[0].vertexColors);
|
||||
vbo->stride_st = sizeof(verts[0].st);
|
||||
vbo->stride_lightmap = sizeof(verts[0].lightmap);
|
||||
vbo->stride_lightdir = sizeof(verts[0].lightdir);
|
||||
vbo->stride_lightdir = sizeof(uint32_t);
|
||||
|
||||
//ri.Printf(PRINT_ALL, "2CreateVBO: %d, %d %d %d %d %d, %d %d %d %d %d\n", dataSize, vbo->ofs_xyz, vbo->ofs_normal, vbo->ofs_st, vbo->ofs_lightmap, vbo->ofs_vertexcolor,
|
||||
//vbo->stride_xyz, vbo->stride_normal, vbo->stride_st, vbo->stride_lightmap, vbo->stride_vertexcolor);
|
||||
|
@ -339,14 +402,11 @@ VBO_t *R_CreateVBO2(const char *name, int numVertexes, srfVert_t * vert
|
|||
vbo->ofs_normal = dataOfs;
|
||||
for (i = 0; i < numVertexes; i++)
|
||||
{
|
||||
uint8_t *p = data + dataOfs;
|
||||
uint32_t *p = (uint32_t *)(data + dataOfs);
|
||||
|
||||
p[0] = (uint8_t)(verts[i].normal[0] * 127.5f + 128.0f);
|
||||
p[1] = (uint8_t)(verts[i].normal[1] * 127.5f + 128.0f);
|
||||
p[2] = (uint8_t)(verts[i].normal[2] * 127.5f + 128.0f);
|
||||
p[3] = 0;
|
||||
*p = R_VboPackNormal(verts[i].normal);
|
||||
|
||||
dataOfs += sizeof(uint8_t) * 4;
|
||||
dataOfs += sizeof(uint32_t);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -357,17 +417,11 @@ VBO_t *R_CreateVBO2(const char *name, int numVertexes, srfVert_t * vert
|
|||
vbo->ofs_tangent = dataOfs;
|
||||
for (i = 0; i < numVertexes; i++)
|
||||
{
|
||||
vec3_t nxt;
|
||||
uint8_t *p = data + dataOfs;
|
||||
uint32_t *p = (uint32_t *)(data + dataOfs);
|
||||
|
||||
CrossProduct(verts[i].normal, verts[i].tangent, nxt);
|
||||
*p = R_VboPackTangent(verts[i].tangent);
|
||||
|
||||
p[0] = (uint8_t)(verts[i].tangent[0] * 127.5f + 128.0f);
|
||||
p[1] = (uint8_t)(verts[i].tangent[1] * 127.5f + 128.0f);
|
||||
p[2] = (uint8_t)(verts[i].tangent[2] * 127.5f + 128.0f);
|
||||
p[3] = (uint8_t)(verts[i].tangent[3] * 127.5f + 128.0f);
|
||||
|
||||
dataOfs += sizeof(uint8_t) * 4;
|
||||
dataOfs += sizeof(uint32_t);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
@ -411,8 +465,11 @@ VBO_t *R_CreateVBO2(const char *name, int numVertexes, srfVert_t * vert
|
|||
vbo->ofs_lightdir = dataOfs;
|
||||
for (i = 0; i < numVertexes; i++)
|
||||
{
|
||||
memcpy(data + dataOfs, &verts[i].lightdir, sizeof(verts[i].lightdir));
|
||||
dataOfs += sizeof(verts[i].lightdir);
|
||||
uint32_t *p = (uint32_t *)(data + dataOfs);
|
||||
|
||||
*p = R_VboPackNormal(verts[i].lightdir);
|
||||
|
||||
dataOfs += sizeof(uint32_t);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue