Updates to water and a fix for a rendering bug with bar textures
This was SVN commit r3902.
This commit is contained in:
parent
b6055f891b
commit
67ede785d5
@ -345,6 +345,13 @@ void Render()
|
|||||||
|
|
||||||
|
|
||||||
PROFILE_START( "render health bars" );
|
PROFILE_START( "render health bars" );
|
||||||
|
pglActiveTextureARB(GL_TEXTURE1_ARB);
|
||||||
|
glDisable(GL_TEXTURE_2D);
|
||||||
|
pglActiveTextureARB(GL_TEXTURE2_ARB);
|
||||||
|
glDisable(GL_TEXTURE_2D);
|
||||||
|
pglActiveTextureARB(GL_TEXTURE0_ARB);
|
||||||
|
glMatrixMode(GL_TEXTURE);
|
||||||
|
glLoadIdentity();
|
||||||
glMatrixMode(GL_PROJECTION);
|
glMatrixMode(GL_PROJECTION);
|
||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
glLoadIdentity();
|
glLoadIdentity();
|
||||||
@ -353,6 +360,7 @@ void Render()
|
|||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
glLoadIdentity();
|
glLoadIdentity();
|
||||||
|
|
||||||
|
glEnable( GL_TEXTURE_2D );
|
||||||
g_Mouseover.renderBarBorders();
|
g_Mouseover.renderBarBorders();
|
||||||
g_Selection.renderBarBorders();
|
g_Selection.renderBarBorders();
|
||||||
glDisable( GL_TEXTURE_2D );
|
glDisable( GL_TEXTURE_2D );
|
||||||
|
@ -1111,10 +1111,6 @@ void CRenderer::RenderRefractions()
|
|||||||
// Save the model-view-projection matrix so the shaders can use it for projective texturing
|
// Save the model-view-projection matrix so the shaders can use it for projective texturing
|
||||||
wm.m_RefractionMatrix = GetModelViewProjectionMatrix();
|
wm.m_RefractionMatrix = GetModelViewProjectionMatrix();
|
||||||
|
|
||||||
// Disable backface culling so trees render properly (it might also be possible to flip
|
|
||||||
// the culling direction here, but this seems to lead to problems)
|
|
||||||
//glDisable(GL_CULL_FACE);
|
|
||||||
|
|
||||||
// Make the depth buffer work backwards; there seems to be some oddness with
|
// Make the depth buffer work backwards; there seems to be some oddness with
|
||||||
// oblique frustum clipping and the "sign" parameter here
|
// oblique frustum clipping and the "sign" parameter here
|
||||||
glClearDepth(0);
|
glClearDepth(0);
|
||||||
@ -1123,8 +1119,6 @@ void CRenderer::RenderRefractions()
|
|||||||
glDepthFunc(GL_GEQUAL);
|
glDepthFunc(GL_GEQUAL);
|
||||||
|
|
||||||
// Render terrain and models
|
// Render terrain and models
|
||||||
//m->skyManager.RenderSky();
|
|
||||||
//oglCheck();
|
|
||||||
RenderPatches();
|
RenderPatches();
|
||||||
oglCheck();
|
oglCheck();
|
||||||
RenderModels();
|
RenderModels();
|
||||||
@ -1229,6 +1223,10 @@ void CRenderer::FlushFrame()
|
|||||||
oglCheck();
|
oglCheck();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Clean up texture blend mode so particles and other things render OK
|
||||||
|
// (really this should be cleaned up by whoever set it)
|
||||||
|
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
||||||
|
|
||||||
//// Particle Engine Rendering.
|
//// Particle Engine Rendering.
|
||||||
MICROLOG(L"render particles");
|
MICROLOG(L"render particles");
|
||||||
CParticleEngine::GetInstance()->renderParticles();
|
CParticleEngine::GetInstance()->renderParticles();
|
||||||
@ -1682,10 +1680,7 @@ jsval CRenderer::JSI_GetSky(JSContext*)
|
|||||||
void CRenderer::JSI_SetSky(JSContext* ctx, jsval newval)
|
void CRenderer::JSI_SetSky(JSContext* ctx, jsval newval)
|
||||||
{
|
{
|
||||||
CStrW skySet;
|
CStrW skySet;
|
||||||
|
if (!ToPrimitive<CStrW>(ctx, newval, skySet)) return;
|
||||||
if (!ToPrimitive<CStrW>(ctx, newval, skySet))
|
|
||||||
return;
|
|
||||||
|
|
||||||
m->skyManager.SetSkySet(skySet);
|
m->skyManager.SetSkySet(skySet);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1697,13 +1692,46 @@ jsval CRenderer::JSI_GetHorizonHeight(JSContext*)
|
|||||||
void CRenderer::JSI_SetHorizonHeight(JSContext* ctx, jsval newval)
|
void CRenderer::JSI_SetHorizonHeight(JSContext* ctx, jsval newval)
|
||||||
{
|
{
|
||||||
float value;
|
float value;
|
||||||
|
if (!ToPrimitive<float>(ctx, newval, value)) return;
|
||||||
if (!ToPrimitive<float>(ctx, newval, value))
|
|
||||||
return;
|
|
||||||
|
|
||||||
m->skyManager.m_HorizonHeight = value;
|
m->skyManager.m_HorizonHeight = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
jsval CRenderer::JSI_GetWaterShininess(JSContext*)
|
||||||
|
{
|
||||||
|
return ToJSVal(m->waterManager.m_Shininess);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CRenderer::JSI_SetWaterShininess(JSContext* ctx, jsval newval)
|
||||||
|
{
|
||||||
|
float value;
|
||||||
|
if (!ToPrimitive<float>(ctx, newval, value)) return;
|
||||||
|
m->waterManager.m_Shininess = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
jsval CRenderer::JSI_GetWaterWaviness(JSContext*)
|
||||||
|
{
|
||||||
|
return ToJSVal(m->waterManager.m_Waviness);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CRenderer::JSI_SetWaterWaviness(JSContext* ctx, jsval newval)
|
||||||
|
{
|
||||||
|
float value;
|
||||||
|
if (!ToPrimitive<float>(ctx, newval, value)) return;
|
||||||
|
m->waterManager.m_Waviness = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
jsval CRenderer::JSI_GetWaterRepeatPeriod(JSContext*)
|
||||||
|
{
|
||||||
|
return ToJSVal(m->waterManager.m_RepeatPeriod);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CRenderer::JSI_SetWaterRepeatPeriod(JSContext* ctx, jsval newval)
|
||||||
|
{
|
||||||
|
float value;
|
||||||
|
if (!ToPrimitive<float>(ctx, newval, value)) return;
|
||||||
|
m->waterManager.m_RepeatPeriod = value;
|
||||||
|
}
|
||||||
|
|
||||||
void CRenderer::ScriptingInit()
|
void CRenderer::ScriptingInit()
|
||||||
{
|
{
|
||||||
AddProperty(L"fastPlayerColor", &CRenderer::JSI_GetFastPlayerColor, &CRenderer::JSI_SetFastPlayerColor);
|
AddProperty(L"fastPlayerColor", &CRenderer::JSI_GetFastPlayerColor, &CRenderer::JSI_SetFastPlayerColor);
|
||||||
@ -1717,6 +1745,9 @@ void CRenderer::ScriptingInit()
|
|||||||
AddProperty(L"depthTextureBits", &CRenderer::JSI_GetDepthTextureBits, &CRenderer::JSI_SetDepthTextureBits);
|
AddProperty(L"depthTextureBits", &CRenderer::JSI_GetDepthTextureBits, &CRenderer::JSI_SetDepthTextureBits);
|
||||||
AddProperty(L"skySet", &CRenderer::JSI_GetSky, &CRenderer::JSI_SetSky);
|
AddProperty(L"skySet", &CRenderer::JSI_GetSky, &CRenderer::JSI_SetSky);
|
||||||
AddProperty(L"horizonHeight", &CRenderer::JSI_GetHorizonHeight, &CRenderer::JSI_SetHorizonHeight);
|
AddProperty(L"horizonHeight", &CRenderer::JSI_GetHorizonHeight, &CRenderer::JSI_SetHorizonHeight);
|
||||||
|
AddProperty(L"waterShininess", &CRenderer::JSI_GetWaterShininess, &CRenderer::JSI_SetWaterShininess);
|
||||||
|
AddProperty(L"waterWaviness", &CRenderer::JSI_GetWaterWaviness, &CRenderer::JSI_SetWaterWaviness);
|
||||||
|
AddProperty(L"waterRepeatPeriod", &CRenderer::JSI_GetWaterRepeatPeriod, &CRenderer::JSI_SetWaterRepeatPeriod);
|
||||||
|
|
||||||
CJSObject<CRenderer>::ScriptingInit("Renderer");
|
CJSObject<CRenderer>::ScriptingInit("Renderer");
|
||||||
}
|
}
|
||||||
|
@ -336,6 +336,12 @@ protected:
|
|||||||
void JSI_SetSky(JSContext* ctx, jsval newval);
|
void JSI_SetSky(JSContext* ctx, jsval newval);
|
||||||
jsval JSI_GetHorizonHeight(JSContext*);
|
jsval JSI_GetHorizonHeight(JSContext*);
|
||||||
void JSI_SetHorizonHeight(JSContext* ctx, jsval newval);
|
void JSI_SetHorizonHeight(JSContext* ctx, jsval newval);
|
||||||
|
jsval JSI_GetWaterShininess(JSContext*);
|
||||||
|
void JSI_SetWaterShininess(JSContext* ctx, jsval newval);
|
||||||
|
jsval JSI_GetWaterWaviness(JSContext*);
|
||||||
|
void JSI_SetWaterWaviness(JSContext* ctx, jsval newval);
|
||||||
|
jsval JSI_GetWaterRepeatPeriod(JSContext*);
|
||||||
|
void JSI_SetWaterRepeatPeriod(JSContext* ctx, jsval newval);
|
||||||
static void ScriptingInit();
|
static void ScriptingInit();
|
||||||
|
|
||||||
// patch rendering stuff
|
// patch rendering stuff
|
||||||
|
@ -433,10 +433,7 @@ void TerrainRenderer::RenderWater()
|
|||||||
float tx = -fmod(time, 20.0)/20.0;
|
float tx = -fmod(time, 20.0)/20.0;
|
||||||
float ty = fmod(time, 35.0)/35.0;
|
float ty = fmod(time, 35.0)/35.0;
|
||||||
glTranslatef(tx, ty, 0);
|
glTranslatef(tx, ty, 0);
|
||||||
}
|
|
||||||
|
|
||||||
if(!fancy)
|
|
||||||
{
|
|
||||||
// Set up texture environment to multiply vertex RGB by texture RGB and use vertex alpha
|
// Set up texture environment to multiply vertex RGB by texture RGB and use vertex alpha
|
||||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
|
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
|
||||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE);
|
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE);
|
||||||
@ -475,6 +472,7 @@ void TerrainRenderer::RenderWater()
|
|||||||
GLint sunDir = ogl_program_get_uniform_location( m->fancyWaterShader, "sunDir" );
|
GLint sunDir = ogl_program_get_uniform_location( m->fancyWaterShader, "sunDir" );
|
||||||
GLint sunColor = ogl_program_get_uniform_location( m->fancyWaterShader, "sunColor" );
|
GLint sunColor = ogl_program_get_uniform_location( m->fancyWaterShader, "sunColor" );
|
||||||
GLint shininess = ogl_program_get_uniform_location( m->fancyWaterShader, "shininess" );
|
GLint shininess = ogl_program_get_uniform_location( m->fancyWaterShader, "shininess" );
|
||||||
|
GLint waviness = ogl_program_get_uniform_location( m->fancyWaterShader, "waviness" );
|
||||||
GLint cameraPos = ogl_program_get_uniform_location( m->fancyWaterShader, "cameraPos" );
|
GLint cameraPos = ogl_program_get_uniform_location( m->fancyWaterShader, "cameraPos" );
|
||||||
GLint reflectionMatrix = ogl_program_get_uniform_location( m->fancyWaterShader, "reflectionMatrix" );
|
GLint reflectionMatrix = ogl_program_get_uniform_location( m->fancyWaterShader, "reflectionMatrix" );
|
||||||
GLint refractionMatrix = ogl_program_get_uniform_location( m->fancyWaterShader, "refractionMatrix" );
|
GLint refractionMatrix = ogl_program_get_uniform_location( m->fancyWaterShader, "refractionMatrix" );
|
||||||
@ -486,10 +484,11 @@ void TerrainRenderer::RenderWater()
|
|||||||
pglUniform3fvARB( ambient, 1, &lightEnv.m_TerrainAmbientColor.X );
|
pglUniform3fvARB( ambient, 1, &lightEnv.m_TerrainAmbientColor.X );
|
||||||
pglUniform3fvARB( sunDir, 1, &lightEnv.GetSunDir().X );
|
pglUniform3fvARB( sunDir, 1, &lightEnv.GetSunDir().X );
|
||||||
pglUniform3fvARB( sunColor, 1, &lightEnv.m_SunColor.X );
|
pglUniform3fvARB( sunColor, 1, &lightEnv.m_SunColor.X );
|
||||||
pglUniform1fARB( shininess, 200.0f );
|
pglUniform1fARB( shininess, WaterMgr->m_Shininess );
|
||||||
|
pglUniform1fARB( waviness, WaterMgr->m_Waviness );
|
||||||
pglUniformMatrix4fvARB( reflectionMatrix, 1, false, &WaterMgr->m_ReflectionMatrix._11 );
|
pglUniformMatrix4fvARB( reflectionMatrix, 1, false, &WaterMgr->m_ReflectionMatrix._11 );
|
||||||
pglUniformMatrix4fvARB( refractionMatrix, 1, false, &WaterMgr->m_RefractionMatrix._11 );
|
pglUniformMatrix4fvARB( refractionMatrix, 1, false, &WaterMgr->m_RefractionMatrix._11 );
|
||||||
pglUniform1iARB( normalMap, 0 ); // texture unit 0
|
pglUniform1iARB( normalMap, 0 ); // texture unit 0
|
||||||
pglUniform1iARB( reflectionMap, 1 ); // texture unit 1
|
pglUniform1iARB( reflectionMap, 1 ); // texture unit 1
|
||||||
pglUniform1iARB( refractionMap, 2 ); // texture unit 2
|
pglUniform1iARB( refractionMap, 2 ); // texture unit 2
|
||||||
|
|
||||||
@ -500,7 +499,7 @@ void TerrainRenderer::RenderWater()
|
|||||||
vertexDepth = ogl_program_get_attrib_location( m->fancyWaterShader, "vertexDepth" );
|
vertexDepth = ogl_program_get_attrib_location( m->fancyWaterShader, "vertexDepth" );
|
||||||
}
|
}
|
||||||
|
|
||||||
float repeatFreq = (fancy ? 18.0f : 16.0f);
|
float repeatPeriod = (fancy ? WaterMgr->m_RepeatPeriod : 16.0f);
|
||||||
|
|
||||||
glBegin(GL_QUADS);
|
glBegin(GL_QUADS);
|
||||||
|
|
||||||
@ -567,7 +566,7 @@ void TerrainRenderer::RenderWater()
|
|||||||
}
|
}
|
||||||
|
|
||||||
glColor4f(WaterMgr->m_WaterColor.r*losMod, WaterMgr->m_WaterColor.g*losMod, WaterMgr->m_WaterColor.b*losMod, alpha * FresnelScalar);
|
glColor4f(WaterMgr->m_WaterColor.r*losMod, WaterMgr->m_WaterColor.g*losMod, WaterMgr->m_WaterColor.b*losMod, alpha * FresnelScalar);
|
||||||
pglMultiTexCoord2fARB(GL_TEXTURE0, vertX/repeatFreq, vertZ/repeatFreq);
|
pglMultiTexCoord2fARB(GL_TEXTURE0, vertX/repeatPeriod, vertZ/repeatPeriod);
|
||||||
glVertex3f(vertX, WaterMgr->m_WaterHeight, vertZ);
|
glVertex3f(vertX, WaterMgr->m_WaterHeight, vertZ);
|
||||||
}
|
}
|
||||||
} //end of x loop
|
} //end of x loop
|
||||||
@ -592,7 +591,13 @@ void TerrainRenderer::RenderWater()
|
|||||||
ogl_program_use( 0 );
|
ogl_program_use( 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
glLoadIdentity();
|
if(!fancy)
|
||||||
|
{
|
||||||
|
// Clean up the texture matrix and blend mode
|
||||||
|
glLoadIdentity();
|
||||||
|
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
||||||
|
}
|
||||||
|
|
||||||
glMatrixMode(GL_MODELVIEW);
|
glMatrixMode(GL_MODELVIEW);
|
||||||
glDepthMask(GL_TRUE);
|
glDepthMask(GL_TRUE);
|
||||||
glDisable(GL_BLEND);
|
glDisable(GL_BLEND);
|
||||||
|
@ -51,6 +51,9 @@ WaterManager::WaterManager()
|
|||||||
m_ReflectionTexture = 0;
|
m_ReflectionTexture = 0;
|
||||||
m_RefractionTexture = 0;
|
m_RefractionTexture = 0;
|
||||||
m_WaterTexTimer = 0.0;
|
m_WaterTexTimer = 0.0;
|
||||||
|
m_Shininess = 200.0f;
|
||||||
|
m_Waviness = 2.9f;
|
||||||
|
m_RepeatPeriod = 16.0f;
|
||||||
|
|
||||||
for (uint i = 0; i < ARRAY_SIZE(m_WaterTexture); i++)
|
for (uint i = 0; i < ARRAY_SIZE(m_WaterTexture); i++)
|
||||||
m_WaterTexture[i] = 0;
|
m_WaterTexture[i] = 0;
|
||||||
|
@ -25,12 +25,6 @@ class WaterManager
|
|||||||
public:
|
public:
|
||||||
Handle m_WaterTexture[60];
|
Handle m_WaterTexture[60];
|
||||||
Handle m_NormalMap[60];
|
Handle m_NormalMap[60];
|
||||||
GLuint m_ReflectionTexture;
|
|
||||||
GLuint m_RefractionTexture;
|
|
||||||
uint m_ReflectionTextureSize;
|
|
||||||
uint m_RefractionTextureSize;
|
|
||||||
CMatrix3D m_ReflectionMatrix; // model-view-projection matrix for reflected camera
|
|
||||||
CMatrix3D m_RefractionMatrix; // model-view-projection matrix for refraction camera
|
|
||||||
|
|
||||||
int m_WaterCurrentTex;
|
int m_WaterCurrentTex;
|
||||||
CColor m_WaterColor;
|
CColor m_WaterColor;
|
||||||
@ -49,6 +43,22 @@ public:
|
|||||||
float m_TWaterScrollCounter;
|
float m_TWaterScrollCounter;
|
||||||
double m_WaterTexTimer;
|
double m_WaterTexTimer;
|
||||||
|
|
||||||
|
// Reflection and refraction textures for fancy water
|
||||||
|
GLuint m_ReflectionTexture;
|
||||||
|
GLuint m_RefractionTexture;
|
||||||
|
uint m_ReflectionTextureSize;
|
||||||
|
uint m_RefractionTextureSize;
|
||||||
|
|
||||||
|
// Model-view-projection matrices for reflected & refracted cameras
|
||||||
|
// (used to let the vertex shader do projective texturing)
|
||||||
|
CMatrix3D m_ReflectionMatrix;
|
||||||
|
CMatrix3D m_RefractionMatrix;
|
||||||
|
|
||||||
|
// Shader parameters for fancy water
|
||||||
|
float m_RepeatPeriod;
|
||||||
|
float m_Shininess;
|
||||||
|
float m_Waviness;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
WaterManager();
|
WaterManager();
|
||||||
~WaterManager();
|
~WaterManager();
|
||||||
|
@ -1172,11 +1172,8 @@ CVector2D CEntity::getScreenCoords( float height )
|
|||||||
}
|
}
|
||||||
void CEntity::renderBarBorders()
|
void CEntity::renderBarBorders()
|
||||||
{
|
{
|
||||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
|
if ( m_staminaBarHeight >= 0 &&
|
||||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_REPLACE);
|
g_Selection.m_unitUITextures.find(m_healthBorderName) != g_Selection.m_unitUITextures.end() )
|
||||||
glTexEnvf(GL_TEXTURE_FILTER_CONTROL, GL_TEXTURE_LOD_BIAS, g_Renderer.m_Options.m_LodBias);
|
|
||||||
|
|
||||||
if ( g_Selection.m_unitUITextures.find(m_healthBorderName) != g_Selection.m_unitUITextures.end() )
|
|
||||||
{
|
{
|
||||||
ogl_tex_bind( g_Selection.m_unitUITextures[m_healthBorderName] );
|
ogl_tex_bind( g_Selection.m_unitUITextures[m_healthBorderName] );
|
||||||
CVector2D pos = getScreenCoords( m_healthBarHeight );
|
CVector2D pos = getScreenCoords( m_healthBarHeight );
|
||||||
@ -1196,9 +1193,11 @@ void CEntity::renderBarBorders()
|
|||||||
|
|
||||||
glEnd();
|
glEnd();
|
||||||
}
|
}
|
||||||
if ( g_Selection.m_unitUITextures.find(m_staminaBorderName) != g_Selection.m_unitUITextures.end() )
|
if ( m_staminaBarHeight >= 0 &&
|
||||||
|
g_Selection.m_unitUITextures.find(m_staminaBorderName) != g_Selection.m_unitUITextures.end() )
|
||||||
{
|
{
|
||||||
ogl_tex_bind( g_Selection.m_unitUITextures[m_staminaBorderName] );
|
ogl_tex_bind( g_Selection.m_unitUITextures[m_staminaBorderName] );
|
||||||
|
|
||||||
CVector2D pos = getScreenCoords( m_staminaBarHeight );
|
CVector2D pos = getScreenCoords( m_staminaBarHeight );
|
||||||
float left = pos.x - m_staminaBorderWidth/2;
|
float left = pos.x - m_staminaBorderWidth/2;
|
||||||
float right = pos.x + m_staminaBorderWidth/2;
|
float right = pos.x + m_staminaBorderWidth/2;
|
||||||
|
Loading…
Reference in New Issue
Block a user