1
0
forked from 0ad/0ad

Updates to water and a fix for a rendering bug with bar textures

This was SVN commit r3902.
This commit is contained in:
Matei 2006-05-28 21:58:56 +00:00
parent b6055f891b
commit 67ede785d5
7 changed files with 96 additions and 34 deletions

View File

@ -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 );

View File

@ -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");
} }

View File

@ -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

View File

@ -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);

View File

@ -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;

View File

@ -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();

View File

@ -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;