From 5ba57500f0df4cb6808a9d588dcb4c00dd5da4d6 Mon Sep 17 00:00:00 2001 From: Armin Weatherwax Date: Thu, 26 Aug 2010 14:58:21 +0200 Subject: Katharine Berry: Allow loading of windlight parameters from arbitrary XML streams. --- linden/indra/newview/llwlparammanager.cpp | 76 +++++++++++++++++++++++++------ linden/indra/newview/llwlparammanager.h | 4 ++ 2 files changed, 65 insertions(+), 15 deletions(-) (limited to 'linden/indra/newview') diff --git a/linden/indra/newview/llwlparammanager.cpp b/linden/indra/newview/llwlparammanager.cpp index cf6744f..5f80283 100644 --- a/linden/indra/newview/llwlparammanager.cpp +++ b/linden/indra/newview/llwlparammanager.cpp @@ -159,6 +159,66 @@ void LLWLParamManager::loadPresets(const std::string& file_name) } +bool LLWLParamManager::loadPresetXML(const std::string& name, std::istream& preset_stream, bool check_if_real /* = false */) +{ + LLSD paramsData(LLSD::emptyMap()); + + LLPointer parser = new LLSDXMLParser(); + + if(parser->parse(preset_stream, paramsData, LLSDSerialize::SIZE_UNLIMITED) == LLSDParser::PARSE_FAILURE) + { + return false; + } + + if(check_if_real) + { + static const char* expected_windlight_settings[] = { + "ambient", + "blue_density", + "blue_horizon", + "cloud_color", + "cloud_pos_density1", + "cloud_pos_density2", + "cloud_scale", + "cloud_scroll_rate", + "cloud_shadow", + "density_multiplier", + "distance_multiplier", + "east_angle", + "enable_cloud_scroll", + "gamma", + "glow", + "haze_density", + "haze_horizon", + "lightnorm", + "max_y", + "star_brightness", + "sun_angle", + "sunlight_color" + }; + static S32 expected_count = LL_ARRAY_SIZE(expected_windlight_settings); + for(S32 i = 0; i < expected_count; ++i) + { + if(!paramsData.has(expected_windlight_settings[i])) + { + LL_WARNS("WindLight") << "Attempted to load WindLight param set without " << expected_windlight_settings[i] << LL_ENDL; + return false; + } + } + } + + std::map::iterator mIt = mParamList.find(name); + if(mIt == mParamList.end()) + { + addParamSet(name, paramsData); + } + else + { + setParamSet(name, paramsData); + } + return true; +} + void LLWLParamManager::savePresets(const std::string & fileName) { //Nobody currently calls me, but if they did, then its reasonable to write the data out to the user's folder @@ -211,21 +271,7 @@ void LLWLParamManager::loadPreset(const std::string & name,bool propagate) if (presetsXML) { - LLSD paramsData(LLSD::emptyMap()); - - LLPointer parser = new LLSDXMLParser(); - - parser->parse(presetsXML, paramsData, LLSDSerialize::SIZE_UNLIMITED); - - std::map::iterator mIt = mParamList.find(name); - if(mIt == mParamList.end()) - { - addParamSet(name, paramsData); - } - else - { - setParamSet(name, paramsData); - } + loadPresetXML(name, presetsXML); presetsXML.close(); } else diff --git a/linden/indra/newview/llwlparammanager.h b/linden/indra/newview/llwlparammanager.h index 6b6300c..141af3c 100644 --- a/linden/indra/newview/llwlparammanager.h +++ b/linden/indra/newview/llwlparammanager.h @@ -145,6 +145,10 @@ public: /// load an individual preset into the sky void loadPreset(const std::string & name,bool propogate=true); + /// load an individual preset into the sky from an LLSD stream + /// Returns whether the stream was actually reasonable XML to load from. + bool loadPresetXML(const std::string& name, std::istream& preset_stream, bool check_if_real=false); + /// save the parameter presets to file void savePreset(const std::string & name); -- cgit v1.1