diff --git a/source/renderer/Renderer.cpp b/source/renderer/Renderer.cpp index 138500020f..0912de7f03 100644 --- a/source/renderer/Renderer.cpp +++ b/source/renderer/Renderer.cpp @@ -1450,6 +1450,21 @@ void CRenderer::JSI_SetDepthTextureBits(JSContext* ctx, jsval newval) m->shadow->SetDepthTextureBits(depthTextureBits); } +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"fastPlayerColor", &CRenderer::JSI_GetFastPlayerColor, &CRenderer::JSI_SetFastPlayerColor); @@ -1461,6 +1476,7 @@ void CRenderer::ScriptingInit() AddProperty(L"shadowZBias", &CRenderer::m_ShadowZBias); AddProperty(L"disableCopyShadow", &CRenderer::m_DisableCopyShadow); AddProperty(L"depthTextureBits", &CRenderer::JSI_GetDepthTextureBits, &CRenderer::JSI_SetDepthTextureBits); + AddProperty(L"skySet", &CRenderer::JSI_GetSky, &CRenderer::JSI_SetSky); CJSObject::ScriptingInit("Renderer"); } diff --git a/source/renderer/Renderer.h b/source/renderer/Renderer.h index 94323c3590..477d36c79a 100644 --- a/source/renderer/Renderer.h +++ b/source/renderer/Renderer.h @@ -327,6 +327,8 @@ protected: void JSI_SetUseDepthTexture(JSContext* ctx, jsval newval); jsval JSI_GetDepthTextureBits(JSContext*); void JSI_SetDepthTextureBits(JSContext* ctx, jsval newval); + jsval JSI_GetSky(JSContext*); + void JSI_SetSky(JSContext* ctx, jsval newval); static void ScriptingInit(); // patch rendering stuff diff --git a/source/renderer/SkyManager.cpp b/source/renderer/SkyManager.cpp index 77c6d2a351..f3f20418d6 100644 --- a/source/renderer/SkyManager.cpp +++ b/source/renderer/SkyManager.cpp @@ -30,13 +30,26 @@ // SkyManager implementation +/////////////////////////////////////////////////////////////////// +// String names for each image, in order of the IMG_ constants +const char* SkyManager::IMAGE_NAMES[5] = { + "front", + "back", + "right", + "left", + "top" +}; + + /////////////////////////////////////////////////////////////////// // Construction/Destruction SkyManager::SkyManager() { - // water m_RenderSky = true; + // TODO: add a way to set the initial skyset before progressive load + m_SkySet = L"default"; + for (uint i = 0; i < ARRAY_SIZE(m_SkyTexture); i++) m_SkyTexture[i] = 0; @@ -54,16 +67,6 @@ SkyManager::~SkyManager() // Progressive load of sky textures int SkyManager::LoadSkyTextures() { - // Note: this must be kept in sync with the IMG_ constants in SkyManager.h - static const char* IMAGE_NAMES[6] = { - "front", - "back", - "right", - "left", - "top", - "bottom" - }; - const uint num_textures = ARRAY_SIZE(m_SkyTexture); // yield after this time is reached. balances increased progress bar @@ -73,10 +76,8 @@ int SkyManager::LoadSkyTextures() while (cur_loading_tex < num_textures) { char filename[PATH_MAX]; - // TODO: add a member variable and setter for this. (can't make this - // a parameter because this function is called via delay-load code) - static const char* const set_name = "day1"; - snprintf(filename, ARRAY_SIZE(filename), "art/textures/skies/%s/%s.dds", set_name, IMAGE_NAMES[cur_loading_tex]); + snprintf(filename, ARRAY_SIZE(filename), "art/textures/skies/%s/%s.dds", + CStr8(m_SkySet).c_str(), IMAGE_NAMES[cur_loading_tex]); Handle ht = ogl_tex_load(filename); if (ht <= 0) { @@ -104,7 +105,35 @@ void SkyManager::UnloadSkyTextures() ogl_tex_free(m_SkyTexture[i]); m_SkyTexture[i] = 0; } - cur_loading_tex = 0; // so they will be reloaded if LoadWaterTextures is called again + cur_loading_tex = 0; +} + + +/////////////////////////////////////////////////////////////////// +// Switch to a different sky set (while the game is running) +void SkyManager::SetSkySet( CStrW newSet ) +{ + if( newSet != m_SkySet ) + { + m_SkySet = newSet; + + UnloadSkyTextures(); + + for( int i=0; i