From df1a779d768f2c8105c2afa7455d6cb05bc960a1 Mon Sep 17 00:00:00 2001 From: Matei Date: Sun, 10 Sep 2006 05:31:41 +0000 Subject: [PATCH] # Updates to water rendering (more effects). This was SVN commit r4318. --- source/renderer/Renderer.cpp | 26 ++++++++++++++++++++++++++ source/renderer/Renderer.h | 7 +++++++ source/renderer/TerrainRenderer.cpp | 8 +++++++- source/renderer/WaterManager.cpp | 5 ++++- source/renderer/WaterManager.h | 3 +++ source/scripting/ScriptGlue.cpp | 19 +++++++++++++++++++ 6 files changed, 66 insertions(+), 2 deletions(-) diff --git a/source/renderer/Renderer.cpp b/source/renderer/Renderer.cpp index 9fe0be850a..dfb0e423c5 100644 --- a/source/renderer/Renderer.cpp +++ b/source/renderer/Renderer.cpp @@ -1745,6 +1745,18 @@ void CRenderer::JSI_SetWaterShininess(JSContext* ctx, jsval newval) m->waterManager.m_Shininess = value; } +jsval CRenderer::JSI_GetWaterSpecularStrength(JSContext*) +{ + return ToJSVal(m->waterManager.m_SpecularStrength); +} + +void CRenderer::JSI_SetWaterSpecularStrength(JSContext* ctx, jsval newval) +{ + float value; + if (!ToPrimitive(ctx, newval, value)) return; + m->waterManager.m_SpecularStrength = value; +} + jsval CRenderer::JSI_GetWaterMurkiness(JSContext*) { return ToJSVal(m->waterManager.m_Murkiness); @@ -1781,6 +1793,18 @@ void CRenderer::JSI_SetWaterRepeatPeriod(JSContext* ctx, jsval newval) m->waterManager.m_RepeatPeriod = value; } +void CRenderer::JSI_SetWaterReflectionTintStrength(JSContext* ctx, jsval newval) +{ + float value; + if (!ToPrimitive(ctx, newval, value)) return; + m->waterManager.m_ReflectionTintStrength = value; +} + +jsval CRenderer::JSI_GetWaterReflectionTintStrength(JSContext*) +{ + return ToJSVal(m->waterManager.m_ReflectionTintStrength); +} + void CRenderer::ScriptingInit() { AddProperty(L"fastPlayerColor", &CRenderer::JSI_GetFastPlayerColor, &CRenderer::JSI_SetFastPlayerColor); @@ -1796,9 +1820,11 @@ void CRenderer::ScriptingInit() AddProperty(L"horizonHeight", &CRenderer::JSI_GetHorizonHeight, &CRenderer::JSI_SetHorizonHeight); AddProperty(L"fancyWater", &CRenderer::JSI_GetFancyWater, &CRenderer::JSI_SetFancyWater); AddProperty(L"waterShininess", &CRenderer::JSI_GetWaterShininess, &CRenderer::JSI_SetWaterShininess); + AddProperty(L"waterSpecularStrength", &CRenderer::JSI_GetWaterSpecularStrength, &CRenderer::JSI_SetWaterSpecularStrength); AddProperty(L"waterWaviness", &CRenderer::JSI_GetWaterWaviness, &CRenderer::JSI_SetWaterWaviness); AddProperty(L"waterRepeatPeriod", &CRenderer::JSI_GetWaterRepeatPeriod, &CRenderer::JSI_SetWaterRepeatPeriod); AddProperty(L"waterMurkiness", &CRenderer::JSI_GetWaterMurkiness, &CRenderer::JSI_SetWaterMurkiness); + AddProperty(L"waterReflTintStrength", &CRenderer::JSI_GetWaterReflectionTintStrength, &CRenderer::JSI_SetWaterReflectionTintStrength); CJSObject::ScriptingInit("Renderer"); } diff --git a/source/renderer/Renderer.h b/source/renderer/Renderer.h index ed3e767dd7..0a1b650d1c 100644 --- a/source/renderer/Renderer.h +++ b/source/renderer/Renderer.h @@ -319,6 +319,9 @@ protected: friend class TerrainRenderer; // scripting + // TODO: It would be really nice to avoid having to create a function for each of these, + // perhaps using some new kind of property for CJSObject which points to an arbitrary value + // (since some of these are variables in other objects so member pointers won't work). static void ScriptingInit(); jsval JSI_GetFastPlayerColor(JSContext*); void JSI_SetFastPlayerColor(JSContext* ctx, jsval newval); @@ -336,6 +339,10 @@ protected: void JSI_SetFancyWater(JSContext* ctx, jsval newval); jsval JSI_GetWaterShininess(JSContext*); void JSI_SetWaterShininess(JSContext* ctx, jsval newval); + jsval JSI_GetWaterSpecularStrength(JSContext*); + void JSI_SetWaterSpecularStrength(JSContext* ctx, jsval newval); + jsval JSI_GetWaterReflectionTintStrength(JSContext*); + void JSI_SetWaterReflectionTintStrength(JSContext* ctx, jsval newval); jsval JSI_GetWaterWaviness(JSContext*); void JSI_SetWaterWaviness(JSContext* ctx, jsval newval); jsval JSI_GetWaterRepeatPeriod(JSContext*); diff --git a/source/renderer/TerrainRenderer.cpp b/source/renderer/TerrainRenderer.cpp index 7ae0eb4936..b672d05d21 100644 --- a/source/renderer/TerrainRenderer.cpp +++ b/source/renderer/TerrainRenderer.cpp @@ -473,12 +473,15 @@ void TerrainRenderer::RenderWater() GLint ambient = ogl_program_get_uniform_location( m->fancyWaterShader, "ambient" ); GLint sunDir = ogl_program_get_uniform_location( m->fancyWaterShader, "sunDir" ); GLint sunColor = ogl_program_get_uniform_location( m->fancyWaterShader, "sunColor" ); + GLint cameraPos = ogl_program_get_uniform_location( m->fancyWaterShader, "cameraPos" ); GLint shininess = ogl_program_get_uniform_location( m->fancyWaterShader, "shininess" ); + GLint specularStrength = ogl_program_get_uniform_location( m->fancyWaterShader, "specularStrength" ); GLint waviness = ogl_program_get_uniform_location( m->fancyWaterShader, "waviness" ); GLint murkiness = ogl_program_get_uniform_location( m->fancyWaterShader, "murkiness" ); GLint fullDepth = ogl_program_get_uniform_location( m->fancyWaterShader, "fullDepth" ); GLint tint = ogl_program_get_uniform_location( m->fancyWaterShader, "tint" ); - GLint cameraPos = ogl_program_get_uniform_location( m->fancyWaterShader, "cameraPos" ); + GLint reflectionTint = ogl_program_get_uniform_location( m->fancyWaterShader, "reflectionTint" ); + GLint reflectionTintStrength = ogl_program_get_uniform_location( m->fancyWaterShader, "reflectionTintStrength" ); GLint reflectionMatrix = ogl_program_get_uniform_location( m->fancyWaterShader, "reflectionMatrix" ); GLint refractionMatrix = ogl_program_get_uniform_location( m->fancyWaterShader, "refractionMatrix" ); GLint normalMap = ogl_program_get_uniform_location( m->fancyWaterShader, "normalMap" ); @@ -490,10 +493,13 @@ void TerrainRenderer::RenderWater() pglUniform3fvARB( sunDir, 1, &lightEnv.GetSunDir().X ); pglUniform3fvARB( sunColor, 1, &lightEnv.m_SunColor.X ); pglUniform1fARB( shininess, WaterMgr->m_Shininess ); + pglUniform1fARB( specularStrength, WaterMgr->m_SpecularStrength ); pglUniform1fARB( waviness, WaterMgr->m_Waviness ); pglUniform1fARB( murkiness, WaterMgr->m_Murkiness ); pglUniform1fARB( fullDepth, WaterMgr->m_WaterFullDepth ); pglUniform3fvARB( tint, 1, WaterMgr->m_WaterTint.FloatArray() ); + pglUniform1fARB( reflectionTintStrength, WaterMgr->m_ReflectionTintStrength ); + pglUniform3fvARB( reflectionTint, 1, WaterMgr->m_ReflectionTint.FloatArray() ); pglUniformMatrix4fvARB( reflectionMatrix, 1, false, &WaterMgr->m_ReflectionMatrix._11 ); pglUniformMatrix4fvARB( refractionMatrix, 1, false, &WaterMgr->m_RefractionMatrix._11 ); pglUniform1iARB( normalMap, 0 ); // texture unit 0 diff --git a/source/renderer/WaterManager.cpp b/source/renderer/WaterManager.cpp index e315938f31..779c3021c5 100644 --- a/source/renderer/WaterManager.cpp +++ b/source/renderer/WaterManager.cpp @@ -51,8 +51,11 @@ WaterManager::WaterManager() m_ReflectionTexture = 0; m_RefractionTexture = 0; m_WaterTexTimer = 0.0; - m_Shininess = 200.0f; + m_Shininess = 150.0f; + m_SpecularStrength = 0.45f; m_Waviness = 8.0f; + m_ReflectionTint = CColor(1.0f, 1.0f, 1.0f, 1.0f); + m_ReflectionTintStrength = 0.0f; m_WaterTint = CColor(0.25f, 0.3f, 0.55f, 1.0f); m_Murkiness = 0.3f; m_RepeatPeriod = 16.0f; diff --git a/source/renderer/WaterManager.h b/source/renderer/WaterManager.h index 9881822f2a..479b299bd5 100644 --- a/source/renderer/WaterManager.h +++ b/source/renderer/WaterManager.h @@ -59,8 +59,11 @@ public: CColor m_WaterTint; float m_RepeatPeriod; float m_Shininess; + float m_SpecularStrength; float m_Waviness; float m_Murkiness; + CColor m_ReflectionTint; + float m_ReflectionTintStrength; public: WaterManager(); diff --git a/source/scripting/ScriptGlue.cpp b/source/scripting/ScriptGlue.cpp index 63677e0698..74ef5d3fe5 100644 --- a/source/scripting/ScriptGlue.cpp +++ b/source/scripting/ScriptGlue.cpp @@ -1145,6 +1145,24 @@ JSBool setWaterTint( JSContext* cx, JSObject* UNUSED(globalObject), uint argc, j return( JS_TRUE ); } +// Sets the water tint (used to tint reflections in fancy water) +JSBool setReflectionTint( JSContext* cx, JSObject* UNUSED(globalObject), uint argc, jsval* argv, jsval* rval ) +{ + JSU_REQUIRE_PARAMS( 3 ); + float r,g,b; + if(!ToPrimitive( g_ScriptingHost.GetContext(), argv[0], r ) + || !ToPrimitive( g_ScriptingHost.GetContext(), argv[1], g ) + || !ToPrimitive( g_ScriptingHost.GetContext(), argv[2], b )) + { + JS_ReportError( cx, "Invalid arguments" ); + *rval = JSVAL_VOID; + return( JS_FALSE ); + } + g_Renderer.GetWaterManager()->m_ReflectionTint = CColor(r, g, b, 1.0f); + *rval = JSVAL_VOID; + return( JS_TRUE ); +} + // Sets the max water alpha (achieved when it is at WaterFullDepth or deeper) JSBool setWaterMaxAlpha( JSContext* cx, JSObject* UNUSED(globalObject), uint argc, jsval* argv, jsval* rval ) { @@ -1312,6 +1330,7 @@ JSFunctionSpec ScriptFunctionTable[] = JS_FUNC(getWaterHeight, getWaterHeight, 0) JS_FUNC(setWaterColor, setWaterColor, 3) JS_FUNC(setWaterTint, setWaterTint, 3) + JS_FUNC(setReflectionTint, setReflectionTint, 3) JS_FUNC(setWaterMaxAlpha, setWaterMaxAlpha, 0) JS_FUNC(setWaterFullDepth, setWaterFullDepth, 0) JS_FUNC(setWaterAlphaOffset, setWaterAlphaOffset, 0)