diff --git a/binaries/data/mods/public/gui/options/options.xml b/binaries/data/mods/public/gui/options/options.xml
index 6c2622b798..6870c157c3 100644
--- a/binaries/data/mods/public/gui/options/options.xml
+++ b/binaries/data/mods/public/gui/options/options.xml
@@ -28,22 +28,22 @@
diff --git a/binaries/data/mods/public/gui/pregame/mainmenu.js b/binaries/data/mods/public/gui/pregame/mainmenu.js
index fc409326ce..43d1f4a01e 100644
--- a/binaries/data/mods/public/gui/pregame/mainmenu.js
+++ b/binaries/data/mods/public/gui/pregame/mainmenu.js
@@ -162,7 +162,7 @@ function onTick()
Engine.PushGuiPage("page_splashscreen.xml", { "page": "splashscreen" } );
// Warn about removing fixed render path
- if (renderer.renderpath == "fixed")
+ if (Engine.Renderer_GetRenderPath() == "fixed")
messageBox(
600,
300,
diff --git a/binaries/data/mods/public/gui/session/session.xml b/binaries/data/mods/public/gui/session/session.xml
index 9e649f5ced..d5b335333e 100644
--- a/binaries/data/mods/public/gui/session/session.xml
+++ b/binaries/data/mods/public/gui/session/session.xml
@@ -64,14 +64,18 @@
@@ -450,78 +454,78 @@
diff --git a/build/premake/premake4.lua b/build/premake/premake4.lua
index ca44bd7f97..786110bdec 100644
--- a/build/premake/premake4.lua
+++ b/build/premake/premake4.lua
@@ -600,6 +600,7 @@ function setup_all_libs ()
"graphics",
"graphics/scripting",
"renderer",
+ "renderer/scripting",
"third_party/mikktspace"
}
extern_libs = {
diff --git a/source/gui/scripting/ScriptFunctions.cpp b/source/gui/scripting/ScriptFunctions.cpp
index bb7fd377c0..266d4ac46f 100644
--- a/source/gui/scripting/ScriptFunctions.cpp
+++ b/source/gui/scripting/ScriptFunctions.cpp
@@ -45,6 +45,7 @@
#include "ps/GameSetup/Atlas.h"
#include "ps/GameSetup/Config.h"
#include "ps/ConfigDB.h"
+#include "renderer/scripting/JSInterface_Renderer.h"
#include "tools/atlas/GameInterface/GameLoop.h"
#include "simulation2/Simulation2.h"
@@ -652,6 +653,7 @@ void SetBoundingBoxDebugOverlay(void* UNUSED(cbdata), bool enabled)
void GuiScriptingInit(ScriptInterface& scriptInterface)
{
JSI_GameView::RegisterScriptFunctions(scriptInterface);
+ JSI_Renderer::RegisterScriptFunctions(scriptInterface);
// GUI manager functions:
scriptInterface.RegisterFunction("GetActiveGui");
diff --git a/source/ps/GameSetup/GameSetup.cpp b/source/ps/GameSetup/GameSetup.cpp
index f01f325730..c89c648e08 100644
--- a/source/ps/GameSetup/GameSetup.cpp
+++ b/source/ps/GameSetup/GameSetup.cpp
@@ -321,9 +321,6 @@ static void RegisterJavascriptInterfaces()
// maths
JSI_Vector3D::init();
- // renderer
- CRenderer::ScriptingInit();
-
// ps
JSI_Console::init();
@@ -1344,7 +1341,7 @@ void CancelLoad(const CStrW& message)
JSBool ok = JS_GetProperty(cx, g_GUI->GetScriptObject(), "cancelOnError", &fval);
ENSURE(ok);
- jsval msgval = ToJSVal(message);
+ jsval msgval = ScriptInterface::ToJSVal(cx, message);
if (ok && !JSVAL_IS_VOID(fval))
JS_CallFunctionValue(cx, g_GUI->GetScriptObject(), fval, 1, &msgval, &rval);
diff --git a/source/renderer/Renderer.cpp b/source/renderer/Renderer.cpp
index 4cff27e98f..9a903fe976 100644
--- a/source/renderer/Renderer.cpp
+++ b/source/renderer/Renderer.cpp
@@ -472,25 +472,6 @@ CRenderer::CRenderer()
m_hCompositeAlphaMap = 0;
m_Stats.Reset();
- AddLocalProperty(L"particles", &m_Options.m_Particles, false);
-
- AddLocalProperty(L"waternormal", &m_Options.m_WaterNormal, false);
- AddLocalProperty(L"waterrealdepth", &m_Options.m_WaterRealDepth, false);
- AddLocalProperty(L"waterreflection", &m_Options.m_WaterReflection, false);
- AddLocalProperty(L"waterrefraction", &m_Options.m_WaterRefraction, false);
- AddLocalProperty(L"waterfoam", &m_Options.m_WaterFoam, false);
- AddLocalProperty(L"watercoastalwaves", &m_Options.m_WaterCoastalWaves, false);
- AddLocalProperty(L"watershadow", &m_Options.m_WaterShadow, false);
-
- AddLocalProperty(L"horizonHeight", &m->skyManager.m_HorizonHeight, false);
- AddLocalProperty(L"waterMurkiness", &m->waterManager.m_Murkiness, false);
- AddLocalProperty(L"waterReflTintStrength", &m->waterManager.m_ReflectionTintStrength, false);
- AddLocalProperty(L"waterRepeatPeriod", &m->waterManager.m_RepeatPeriod, false);
- AddLocalProperty(L"waterShininess", &m->waterManager.m_Shininess, false);
- AddLocalProperty(L"waterSpecularStrength", &m->waterManager.m_SpecularStrength, false);
- AddLocalProperty(L"waterWaviness", &m->waterManager.m_Waviness, false);
- AddLocalProperty(L"silhouettes", &m_Options.m_Silhouettes, false);
- AddLocalProperty(L"showsky", &m_Options.m_ShowSky, false);
RegisterFileReloadFunc(ReloadChangedFileCB, this);
}
@@ -721,6 +702,10 @@ void CRenderer::SetOptionBool(enum Option opt,bool value)
case OPT_PARTICLES:
m_Options.m_Particles = value;
break;
+ case OPT_PREFERGLSL:
+ m_Options.m_PreferGLSL = value;
+ MakeShadersDirty();
+ break;
case OPT_SILHOUETTES:
m_Options.m_Silhouettes = value;
break;
@@ -760,6 +745,8 @@ bool CRenderer::GetOptionBool(enum Option opt) const
return m_Options.m_ShadowPCF;
case OPT_PARTICLES:
return m_Options.m_Particles;
+ case OPT_PREFERGLSL:
+ return m_Options.m_PreferGLSL;
case OPT_SILHOUETTES:
return m_Options.m_Silhouettes;
case OPT_SHOWSKY:
@@ -1983,115 +1970,6 @@ void CRenderer::MakeShadersDirty()
m->ShadersDirty = true;
}
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// Scripting Interface
-
-jsval CRenderer::JSI_GetRenderPath(JSContext*)
-{
- return ToJSVal(GetRenderPathName(m_Options.m_RenderPath));
-}
-
-void CRenderer::JSI_SetRenderPath(JSContext* ctx, jsval newval)
-{
- CStr name;
-
- if (!ToPrimitive(ctx, newval, name))
- return;
-
- SetRenderPath(GetRenderPathByName(name));
-}
-
-jsval CRenderer::JSI_GetDepthTextureBits(JSContext*)
-{
- return ToJSVal(m->shadow.GetDepthTextureBits());
-}
-
-void CRenderer::JSI_SetDepthTextureBits(JSContext* ctx, jsval newval)
-{
- int depthTextureBits;
-
- if (!ToPrimitive(ctx, newval, depthTextureBits))
- return;
-
- m->shadow.SetDepthTextureBits(depthTextureBits);
-}
-
-jsval CRenderer::JSI_GetShadows(JSContext*)
-{
- return ToJSVal(m_Options.m_Shadows);
-}
-
-void CRenderer::JSI_SetShadows(JSContext* ctx, jsval newval)
-{
- ToPrimitive(ctx, newval, m_Options.m_Shadows);
- ReloadShaders();
-}
-
-jsval CRenderer::JSI_GetShadowAlphaFix(JSContext*)
-{
- return ToJSVal(m_Options.m_ShadowAlphaFix);
-}
-
-void CRenderer::JSI_SetShadowAlphaFix(JSContext* ctx, jsval newval)
-{
- if (!ToPrimitive(ctx, newval, m_Options.m_ShadowAlphaFix))
- return;
-
- m->shadow.RecreateTexture();
-}
-
-jsval CRenderer::JSI_GetShadowPCF(JSContext*)
-{
- return ToJSVal(m_Options.m_ShadowPCF);
-}
-
-void CRenderer::JSI_SetShadowPCF(JSContext* ctx, jsval newval)
-{
- ToPrimitive(ctx, newval, m_Options.m_ShadowPCF);
- ReloadShaders();
-}
-
-jsval CRenderer::JSI_GetPreferGLSL(JSContext*)
-{
- return ToJSVal(m_Options.m_PreferGLSL);
-}
-
-void CRenderer::JSI_SetPreferGLSL(JSContext* ctx, jsval newval)
-{
- ToPrimitive(ctx, newval, m_Options.m_PreferGLSL);
- ReloadShaders();
-}
-
-jsval CRenderer::JSI_GetSky(JSContext*)
-{
- return ToJSVal(m->skyManager.GetSkySet());
-}
-
-void CRenderer::JSI_SetSky(JSContext* ctx, jsval newval)
-{
- CStrW skySet;
- if (!ToPrimitive(ctx, newval, skySet)) return;
- m->skyManager.SetSkySet(skySet);
-}
-
-void CRenderer::ScriptingInit()
-{
- AddProperty(L"renderpath", &CRenderer::JSI_GetRenderPath, &CRenderer::JSI_SetRenderPath);
- AddProperty(L"displayFrustum", &CRenderer::m_DisplayFrustum);
- AddProperty(L"shadowZBias", &CRenderer::m_ShadowZBias);
- AddProperty(L"shadowMapSize", &CRenderer::m_ShadowMapSize);
- AddProperty(L"shadows", &CRenderer::JSI_GetShadows, &CRenderer::JSI_SetShadows);
- AddProperty(L"depthTextureBits", &CRenderer::JSI_GetDepthTextureBits, &CRenderer::JSI_SetDepthTextureBits);
- AddProperty(L"shadowAlphaFix", &CRenderer::JSI_GetShadowAlphaFix, &CRenderer::JSI_SetShadowAlphaFix);
- AddProperty(L"shadowPCF", &CRenderer::JSI_GetShadowPCF, &CRenderer::JSI_SetShadowPCF);
- AddProperty(L"preferGLSL", &CRenderer::JSI_GetPreferGLSL, &CRenderer::JSI_SetPreferGLSL);
- AddProperty(L"skipSubmit", &CRenderer::m_SkipSubmit);
- AddProperty(L"skySet", &CRenderer::JSI_GetSky, &CRenderer::JSI_SetSky);
-
- CJSObject::ScriptingInit("Renderer");
-}
-
-
CTextureManager& CRenderer::GetTextureManager()
{
return m->textureManager;
diff --git a/source/renderer/Renderer.h b/source/renderer/Renderer.h
index 3e0b5b97fb..6f60f760a2 100644
--- a/source/renderer/Renderer.h
+++ b/source/renderer/Renderer.h
@@ -28,11 +28,11 @@
#include "graphics/ShaderProgram.h"
#include "lib/res/handle.h"
#include "ps/Singleton.h"
-#include "scripting/ScriptableObject.h"
#include "renderer/PostprocManager.h"
#include "renderer/Scene.h"
#include "renderer/TimeManager.h"
+#include "scriptinterface/ScriptInterface.h"
// necessary declarations
class CLightEnv;
@@ -71,7 +71,6 @@ struct CRendererInternals;
class CRenderer :
public Singleton,
- public CJSObject,
private SceneCollector
{
public:
@@ -89,6 +88,7 @@ public:
OPT_WATERSHADOW,
OPT_SHADOWPCF,
OPT_PARTICLES,
+ OPT_PREFERGLSL,
OPT_SILHOUETTES,
OPT_SHOWSKY
};
@@ -317,7 +317,7 @@ public:
*/
const Caps& GetCapabilities() const { return m_Caps; }
- static void ScriptingInit();
+ static void RegisterScriptFunctions(ScriptInterface& scriptInterface);
protected:
friend struct CRendererInternals;
@@ -335,24 +335,6 @@ protected:
friend class ShaderInstancingModelRenderer;
friend class TerrainRenderer;
- // scripting
- // TODO: Perhaps we could have a version of AddLocalProperty for function-driven
- // properties? Then we could hide these function in the private implementation class.
- jsval JSI_GetRenderPath(JSContext*);
- void JSI_SetRenderPath(JSContext* ctx, jsval newval);
- jsval JSI_GetDepthTextureBits(JSContext*);
- void JSI_SetDepthTextureBits(JSContext* ctx, jsval newval);
- jsval JSI_GetShadows(JSContext*);
- void JSI_SetShadows(JSContext* ctx, jsval newval);
- jsval JSI_GetShadowAlphaFix(JSContext*);
- void JSI_SetShadowAlphaFix(JSContext* ctx, jsval newval);
- jsval JSI_GetShadowPCF(JSContext*);
- void JSI_SetShadowPCF(JSContext* ctx, jsval newval);
- jsval JSI_GetPreferGLSL(JSContext*);
- void JSI_SetPreferGLSL(JSContext* ctx, jsval newval);
- jsval JSI_GetSky(JSContext*);
- void JSI_SetSky(JSContext* ctx, jsval newval);
-
//BEGIN: Implementation of SceneCollector
void Submit(CPatch* patch);
void Submit(SOverlayLine* overlay);
diff --git a/source/renderer/scripting/JSInterface_Renderer.cpp b/source/renderer/scripting/JSInterface_Renderer.cpp
new file mode 100644
index 0000000000..88331d1ca5
--- /dev/null
+++ b/source/renderer/scripting/JSInterface_Renderer.cpp
@@ -0,0 +1,85 @@
+/* Copyright (C) 2013 Wildfire Games.
+ * This file is part of 0 A.D.
+ *
+ * 0 A.D. is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * 0 A.D. is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with 0 A.D. If not, see .
+ */
+
+#include "precompiled.h"
+
+#include "JSInterface_Renderer.h"
+#include "renderer/Renderer.h"
+
+#define IMPLEMENT_BOOLEAN_SCRIPT_SETTING(NAME, SCRIPTNAME) \
+bool JSI_Renderer::Get##SCRIPTNAME##Enabled(void* UNUSED(cbdata)) \
+{ \
+ return g_Renderer.GetOptionBool(CRenderer::OPT_##NAME); \
+} \
+\
+void JSI_Renderer::Set##SCRIPTNAME##Enabled(void* UNUSED(cbdata), bool Enabled) \
+{ \
+ g_Renderer.SetOptionBool(CRenderer::OPT_##NAME, Enabled); \
+}
+
+IMPLEMENT_BOOLEAN_SCRIPT_SETTING(PARTICLES, Particles);
+IMPLEMENT_BOOLEAN_SCRIPT_SETTING(PREFERGLSL, PreferGLSL);
+IMPLEMENT_BOOLEAN_SCRIPT_SETTING(WATERNORMAL, WaterNormal);
+IMPLEMENT_BOOLEAN_SCRIPT_SETTING(SHADOWPCF, ShadowPCF);
+IMPLEMENT_BOOLEAN_SCRIPT_SETTING(SHADOWS, Shadows);
+IMPLEMENT_BOOLEAN_SCRIPT_SETTING(WATERREALDEPTH, WaterRealDepth);
+IMPLEMENT_BOOLEAN_SCRIPT_SETTING(WATERREFLECTION, WaterReflection);
+IMPLEMENT_BOOLEAN_SCRIPT_SETTING(WATERREFRACTION, WaterRefraction);
+IMPLEMENT_BOOLEAN_SCRIPT_SETTING(WATERFOAM, WaterFoam);
+IMPLEMENT_BOOLEAN_SCRIPT_SETTING(WATERCOASTALWAVES, WaterCoastalWaves);
+IMPLEMENT_BOOLEAN_SCRIPT_SETTING(WATERSHADOW, WaterShadow);
+IMPLEMENT_BOOLEAN_SCRIPT_SETTING(SILHOUETTES, Silhouettes);
+IMPLEMENT_BOOLEAN_SCRIPT_SETTING(SHOWSKY, ShowSky);
+
+#undef IMPLEMENT_BOOLEAN_SCRIPT_SETTING
+
+std::string JSI_Renderer::GetRenderPath(void* UNUSED(cbdata))
+{
+ return CRenderer::GetRenderPathName(g_Renderer.GetRenderPath());
+}
+
+void JSI_Renderer::SetRenderPath(void* UNUSED(cbdata), std::string name)
+{
+ g_Renderer.SetRenderPath(CRenderer::GetRenderPathByName(name));
+}
+
+
+#define REGISTER_BOOLEAN_SCRIPT_SETTING(NAME) \
+scriptInterface.RegisterFunction("Renderer_Get" #NAME "Enabled"); \
+scriptInterface.RegisterFunction("Renderer_Set" #NAME "Enabled");
+
+void JSI_Renderer::RegisterScriptFunctions(ScriptInterface& scriptInterface)
+{
+ scriptInterface.RegisterFunction("Renderer_GetRenderPath");
+ scriptInterface.RegisterFunction("Renderer_SetRenderPath");
+ REGISTER_BOOLEAN_SCRIPT_SETTING(Shadows);
+ REGISTER_BOOLEAN_SCRIPT_SETTING(ShadowPCF);
+ REGISTER_BOOLEAN_SCRIPT_SETTING(Particles);
+ REGISTER_BOOLEAN_SCRIPT_SETTING(PreferGLSL);
+ REGISTER_BOOLEAN_SCRIPT_SETTING(WaterNormal);
+ REGISTER_BOOLEAN_SCRIPT_SETTING(WaterRealDepth);
+ REGISTER_BOOLEAN_SCRIPT_SETTING(WaterReflection);
+ REGISTER_BOOLEAN_SCRIPT_SETTING(WaterRefraction);
+ REGISTER_BOOLEAN_SCRIPT_SETTING(WaterFoam);
+ REGISTER_BOOLEAN_SCRIPT_SETTING(WaterCoastalWaves);
+ REGISTER_BOOLEAN_SCRIPT_SETTING(WaterShadow);
+ REGISTER_BOOLEAN_SCRIPT_SETTING(Silhouettes);
+ REGISTER_BOOLEAN_SCRIPT_SETTING(ShowSky);
+}
+
+#undef REGISTER_BOOLEAN_SCRIPT_SETTING
+
diff --git a/source/renderer/scripting/JSInterface_Renderer.h b/source/renderer/scripting/JSInterface_Renderer.h
new file mode 100644
index 0000000000..eca4afafbf
--- /dev/null
+++ b/source/renderer/scripting/JSInterface_Renderer.h
@@ -0,0 +1,52 @@
+/* Copyright (C) 2013 Wildfire Games.
+ * This file is part of 0 A.D.
+ *
+ * 0 A.D. is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * 0 A.D. is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with 0 A.D. If not, see .
+ */
+
+
+#ifndef INCLUDED_JSINTERFACE_RENDERER
+#define INCLUDED_JSINTERFACE_RENDERER
+
+class ScriptInterface;
+
+#define DECLARE_BOOLEAN_SCRIPT_SETTING(NAME) \
+ bool Get##NAME##Enabled(void* cbdata); \
+ void Set##NAME##Enabled(void* cbdata, bool Enabled);
+
+namespace JSI_Renderer
+{
+ std::string GetRenderPath(void* cbdata);
+ void SetRenderPath(void* cbdata, std::string name);
+
+ DECLARE_BOOLEAN_SCRIPT_SETTING(Shadows);
+ DECLARE_BOOLEAN_SCRIPT_SETTING(ShadowPCF);
+ DECLARE_BOOLEAN_SCRIPT_SETTING(Particles);
+ DECLARE_BOOLEAN_SCRIPT_SETTING(PreferGLSL);
+ DECLARE_BOOLEAN_SCRIPT_SETTING(WaterNormal);
+ DECLARE_BOOLEAN_SCRIPT_SETTING(WaterRealDepth);
+ DECLARE_BOOLEAN_SCRIPT_SETTING(WaterReflection);
+ DECLARE_BOOLEAN_SCRIPT_SETTING(WaterRefraction);
+ DECLARE_BOOLEAN_SCRIPT_SETTING(WaterFoam);
+ DECLARE_BOOLEAN_SCRIPT_SETTING(WaterCoastalWaves);
+ DECLARE_BOOLEAN_SCRIPT_SETTING(WaterShadow);
+ DECLARE_BOOLEAN_SCRIPT_SETTING(Silhouettes);
+ DECLARE_BOOLEAN_SCRIPT_SETTING(ShowSky);
+
+ void RegisterScriptFunctions(ScriptInterface& scriptInterface);
+}
+
+#undef DECLARE_BOOLEAN_SCRIPT_SETTING
+
+#endif
diff --git a/source/scripting/ScriptGlue.cpp b/source/scripting/ScriptGlue.cpp
index db2a56906b..f946985f06 100644
--- a/source/scripting/ScriptGlue.cpp
+++ b/source/scripting/ScriptGlue.cpp
@@ -408,15 +408,6 @@ JSFunctionSpec ScriptFunctionTable[] =
// property accessors
//-----------------------------------------------------------------------------
-JSBool GetRenderer(JSContext* UNUSED(cx), JSObject* UNUSED(obj), jsid UNUSED(id), jsval* vp)
-{
- if (CRenderer::IsInitialised())
- *vp = OBJECT_TO_JSVAL(g_Renderer.GetScript());
- else
- *vp = JSVAL_NULL;
- return JS_TRUE;
-}
-
enum ScriptGlobalTinyIDs
{
@@ -430,7 +421,6 @@ enum ScriptGlobalTinyIDs
JSPropertySpec ScriptGlobalTable[] =
{
{ "console" , GLOBAL_CONSOLE, JSPROP_PERMANENT|JSPROP_READONLY, JSI_Console::getConsole, 0 },
- { "renderer" , 0, JSPROP_PERMANENT|JSPROP_READONLY, GetRenderer, 0 },
// end of table marker
{ 0, 0, 0, 0, 0 },
diff --git a/source/tools/atlas/GameInterface/Handlers/MiscHandlers.cpp b/source/tools/atlas/GameInterface/Handlers/MiscHandlers.cpp
index 78485ca081..161ba47ec6 100644
--- a/source/tools/atlas/GameInterface/Handlers/MiscHandlers.cpp
+++ b/source/tools/atlas/GameInterface/Handlers/MiscHandlers.cpp
@@ -33,6 +33,7 @@
#include "ps/GameSetup/Config.h"
#include "ps/GameSetup/GameSetup.h"
#include "renderer/Renderer.h"
+#include "scripting/ScriptingHost.h"
extern void (*Atlas_GLSwapBuffers)(void* context);