From 7c878691db12df71b6924a8337f8e4c821189eb7 Mon Sep 17 00:00:00 2001 From: Armin Weatherwax Date: Fri, 27 Aug 2010 01:16:13 +0200 Subject: Katharine Berry: Added loading of water params from notecards. --- linden/indra/newview/llinventorybridge.cpp | 11 +- linden/indra/newview/llwaterparammanager.cpp | 147 ++++++++++++++++++++++++--- linden/indra/newview/llwaterparammanager.h | 13 +++ linden/indra/newview/llwaterparamset.h | 3 +- linden/indra/newview/llwlparammanager.cpp | 1 + 5 files changed, 157 insertions(+), 18 deletions(-) diff --git a/linden/indra/newview/llinventorybridge.cpp b/linden/indra/newview/llinventorybridge.cpp index a3a6e78..712d2fe 100644 --- a/linden/indra/newview/llinventorybridge.cpp +++ b/linden/indra/newview/llinventorybridge.cpp @@ -78,6 +78,7 @@ #include "llviewerobjectlist.h" #include "llviewerwindow.h" #include "llvoavatar.h" +#include "llwaterparammanager.h" #include "llwearable.h" #include "llwearablelist.h" #include "llviewermessage.h" @@ -3068,7 +3069,11 @@ void LLNotecardBridge::openItem() if(isSkySetting()) { LLWLParamManager::instance()->loadPresetNotecard(item->getName(), item->getAssetUUID(), mUUID); - } + } + else if(isWaterSetting()) + { + LLWaterParamManager::instance()->loadPresetNotecard(item->getName(), item->getAssetUUID(), mUUID); + } else { open_notecard(item, getPrefix() + item->getName(), LLUUID::null, FALSE); @@ -3123,6 +3128,10 @@ void LLNotecardBridge::performAction(LLFolderView* folder, LLInventoryModel* mod { LLWLParamManager::instance()->loadPresetNotecard(itemp->getName(), itemp->getAssetUUID(), mUUID); } + else if ("load_waterlight" == action) + { + LLWaterParamManager::instance()->loadPresetNotecard(itemp->getName(), itemp->getAssetUUID(), mUUID); + } else if ("edit_windlight" == action) { open_notecard(itemp, getPrefix() + itemp->getName(), LLUUID::null, FALSE); diff --git a/linden/indra/newview/llwaterparammanager.cpp b/linden/indra/newview/llwaterparammanager.cpp index 4a61b78..0b08b14 100644 --- a/linden/indra/newview/llwaterparammanager.cpp +++ b/linden/indra/newview/llwaterparammanager.cpp @@ -48,6 +48,17 @@ #include "lllineeditor.h" #include "llsdserialize.h" +// For notecard loading +#include "llvfile.h" +#include "llnotecard.h" +#include "llmemorystream.h" +#include "llnotify.h" +#include "llagent.h" +#include "llinventorymodel.h" +#include "llviewerinventory.h" +#include "llviewerregion.h" +#include "llassetuploadresponders.h" + #include "v4math.h" #include "llviewerdisplay.h" #include "llviewercontrol.h" @@ -141,6 +152,17 @@ void LLWaterParamManager::loadAllPresets(const std::string& file_name) void LLWaterParamManager::loadPreset(const std::string & name,bool propagate) { + // Check if we already have the preset before we try loading it again. + if(mParamList.find(name) != mParamList.end()) + { + if(propagate) + { + getParamSet(name, mCurParams); + propagateParameters(); + } + return; + } + // bugfix for SL-46920: preventing filenames that break stuff. char * curl_str = curl_escape(name.c_str(), name.size()); std::string escaped_filename(curl_str); @@ -165,21 +187,7 @@ void LLWaterParamManager::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 @@ -193,7 +201,76 @@ void LLWaterParamManager::loadPreset(const std::string & name,bool propagate) getParamSet(name, mCurParams); propagateParameters(); } -} +} + +bool LLWaterParamManager::loadPresetXML(const std::string& name, std::istream& preset_stream, bool propagate /* = false */, 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[] = { + "blurMultiplier", + "fresnelOffset", + "fresnelScale", + "normScale", + "normalMap", + "scaleAbove", + "scaleBelow", + "waterFogColor", + "waterFogDensity", + "wave1Dir", + "wave2Dir" + }; + 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 water 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); + } + + if(propagate) + { + getParamSet(name, mCurParams); + propagateParameters(); + } + return true; +} + +void LLWaterParamManager::loadPresetNotecard(const std::string& name, const LLUUID& asset_id, const LLUUID& inv_id) +{ + gAssetStorage->getInvItemAsset(LLHost::invalid, + gAgent.getID(), + gAgent.getSessionID(), + gAgent.getID(), + LLUUID::null, + inv_id, + asset_id, + LLAssetType::AT_NOTECARD, + &loadWaterNotecard, + (void*)&inv_id); +} void LLWaterParamManager::savePreset(const std::string & name) { @@ -457,3 +534,41 @@ LLWaterParamManager * LLWaterParamManager::instance() return sInstance; } + +// static +void LLWaterParamManager::loadWaterNotecard(LLVFS *vfs, const LLUUID& asset_id, LLAssetType::EType asset_type, void *user_data, S32 status, LLExtStat ext_status) +{ + LLUUID inventory_id(*((LLUUID*)user_data)); + std::string name = "WindLight Setting.ww"; + LLViewerInventoryItem *item = gInventory.getItem(inventory_id); + if(item) + { + inventory_id = item->getUUID(); + name = item->getName(); + } + if(LL_ERR_NOERR == status) + { + LLVFile file(vfs, asset_id, asset_type, LLVFile::READ); + S32 file_length = file.getSize(); + std::vector buffer(file_length + 1); + file.read((U8*)&buffer[0], file_length); + buffer[file_length] = 0; + LLNotecard notecard(LLNotecard::MAX_SIZE); + LLMemoryStream str((U8*)&buffer[0], file_length + 1); + notecard.importStream(str); + std::string settings = notecard.getText(); + LLMemoryStream settings_str((U8*)settings.c_str(), settings.length()); + bool is_real_setting = sInstance->loadPresetXML(name, settings_str, true, true); + if(!is_real_setting) + { + LLSD subs; + subs["NAME"] = name; + LLNotifications::instance().add("KittyInvalidWaterlightNotecard", subs); + } + else + { + // We can do this because we know mCurParams + sInstance->mParamList[name].mInventoryID = inventory_id; + } + } +} diff --git a/linden/indra/newview/llwaterparammanager.h b/linden/indra/newview/llwaterparammanager.h index babaf00..baac4cf 100644 --- a/linden/indra/newview/llwaterparammanager.h +++ b/linden/indra/newview/llwaterparammanager.h @@ -39,6 +39,10 @@ #include "llviewercamera.h" #include "v4color.h" +#include "llassettype.h" // Ugh. + +class LLVFS; + const F32 WATER_FOG_LIGHT_CLAMP = 0.3f; // color control @@ -231,6 +235,13 @@ public: /// load an individual preset into the sky void loadPreset(const std::string & name,bool propagate=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 propogate=false, bool check_if_real=false); + + /// Load an individual preset from a notecard. + void loadPresetNotecard(const std::string& name, const LLUUID& asset_id, const LLUUID& inv_id); /// save the parameter presets to file void savePreset(const std::string & name); @@ -322,6 +333,8 @@ private: // our parameter manager singleton instance static LLWaterParamManager * sInstance; + + static void loadWaterNotecard(LLVFS *vfs, const LLUUID& asset_id, LLAssetType::EType asset_type, void *user_data, S32 status, LLExtStat ext_status); }; inline void LLWaterParamManager::setDensitySliderValue(F32 val) diff --git a/linden/indra/newview/llwaterparamset.h b/linden/indra/newview/llwaterparamset.h index 9087843..efbad31 100644 --- a/linden/indra/newview/llwaterparamset.h +++ b/linden/indra/newview/llwaterparamset.h @@ -49,7 +49,8 @@ class LLWaterParamSet friend class LLWaterParamManager; public: - std::string mName; + std::string mName; + LLUUID mInventoryID; private: diff --git a/linden/indra/newview/llwlparammanager.cpp b/linden/indra/newview/llwlparammanager.cpp index b3c2b0b..d7df7ae 100644 --- a/linden/indra/newview/llwlparammanager.cpp +++ b/linden/indra/newview/llwlparammanager.cpp @@ -718,6 +718,7 @@ LLWLParamManager * LLWLParamManager::instance() return sInstance; } +// static void LLWLParamManager::loadWindlightNotecard(LLVFS *vfs, const LLUUID& asset_id, LLAssetType::EType asset_type, void *user_data, S32 status, LLExtStat ext_status) { LLUUID inventory_id(*((LLUUID*)user_data)); -- cgit v1.1