summaryrefslogtreecommitdiff
path: root/indra/newview/llwldaycycle.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview/llwldaycycle.cpp')
-rw-r--r--indra/newview/llwldaycycle.cpp233
1 files changed, 233 insertions, 0 deletions
diff --git a/indra/newview/llwldaycycle.cpp b/indra/newview/llwldaycycle.cpp
new file mode 100644
index 0000000000..b8b2a85ee4
--- /dev/null
+++ b/indra/newview/llwldaycycle.cpp
@@ -0,0 +1,233 @@
+/**
+ * @file llwldaycycle.cpp
+ * @brief Implementation for the LLWLDayCycle class.
+ *
+ * $LicenseInfo:firstyear=2007&license=viewergpl$
+ *
+ * Copyright (c) 2007-2007, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlife.com/developers/opensource/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlife.com/developers/opensource/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llwldaycycle.h"
+#include "llsdserialize.h"
+#include "llwlparammanager.h"
+
+#include "llviewerwindow.h"
+
+#include <map>
+
+LLWLDayCycle::LLWLDayCycle() : mDayRate(120)
+{
+}
+
+
+LLWLDayCycle::~LLWLDayCycle()
+{
+}
+
+void LLWLDayCycle::loadDayCycle(const LLString & fileName)
+{
+ // clear the first few things
+ mTimeMap.clear();
+
+ // now load the file
+ LLString pathName(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,
+ "windlight/days", fileName));
+ llinfos << "Loading DayCycle settings from " << pathName << llendl;
+
+ llifstream day_cycle_xml(pathName.c_str());
+ if (day_cycle_xml.is_open())
+ {
+ // load and parse it
+ LLSD day_data(LLSD::emptyArray());
+ LLPointer<LLSDParser> parser = new LLSDXMLParser();
+ parser->parse(day_cycle_xml, day_data, LLSDSerialize::SIZE_UNLIMITED);
+
+ // add each key
+ for(S32 i = 0; i < day_data.size(); ++i)
+ {
+ // make sure it's a two array
+ if(day_data[i].size() != 2)
+ {
+ continue;
+ }
+
+ // check each param name exists in param manager
+ bool success;
+ LLWLParamSet pset;
+ success = LLWLParamManager::instance()->getParamSet(day_data[i][1].asString(), pset);
+ if(!success)
+ {
+ // alert the user
+ LLString::format_map_t args;
+ args["[SKY]"] = day_data[i][1].asString();
+ gViewerWindow->alertXml("WLMissingSky", args);
+ continue;
+ }
+
+ // then add the key
+ addKey((F32)day_data[i][0].asReal(), day_data[i][1].asString());
+ }
+
+ day_cycle_xml.close();
+ }
+}
+
+void LLWLDayCycle::saveDayCycle(const LLString & fileName)
+{
+ LLSD day_data(LLSD::emptyArray());
+
+ LLString pathName(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/days", fileName));
+ //llinfos << "Saving WindLight settings to " << pathName << llendl;
+
+ for(std::map<F32, std::string>::const_iterator mIt = mTimeMap.begin();
+ mIt != mTimeMap.end();
+ ++mIt)
+ {
+ LLSD key(LLSD::emptyArray());
+ key.append(mIt->first);
+ key.append(mIt->second);
+ day_data.append(key);
+ }
+
+ std::ofstream day_cycle_xml(pathName.c_str());
+ LLPointer<LLSDFormatter> formatter = new LLSDXMLFormatter();
+ formatter->format(day_data, day_cycle_xml, LLSDFormatter::OPTIONS_PRETTY);
+
+ //day_cycle_xml.close();
+}
+
+
+void LLWLDayCycle::clearKeys()
+{
+ mTimeMap.clear();
+}
+
+
+bool LLWLDayCycle::addKey(F32 newTime, const LLString & paramName)
+{
+ // no adding negative time
+ if(newTime < 0)
+ {
+ newTime = 0;
+ }
+
+ // if time not being used, add it and return true
+ if(mTimeMap.find(newTime) == mTimeMap.end())
+ {
+ mTimeMap.insert(std::pair<F32, std::string>(newTime, paramName));
+ return true;
+ }
+
+ // otherwise, don't add, and return error
+ return false;
+}
+
+bool LLWLDayCycle::changeKeyTime(F32 oldTime, F32 newTime)
+{
+ // just remove and add back
+ std::string name = mTimeMap[oldTime];
+
+ bool stat = removeKey(oldTime);
+ if(stat == false)
+ {
+ return stat;
+ }
+
+ return addKey(newTime, name);
+}
+
+bool LLWLDayCycle::changeKeyParam(F32 time, const LLString & name)
+{
+ // just remove and add back
+ // make sure param exists
+ LLWLParamSet tmp;
+ bool stat = LLWLParamManager::instance()->getParamSet(name, tmp);
+ if(stat == false)
+ {
+ return stat;
+ }
+
+ mTimeMap[time] = name;
+ return true;
+}
+
+
+bool LLWLDayCycle::removeKey(F32 time)
+{
+ // look for the time. If there, erase it
+ std::map<F32, std::string>::iterator mIt = mTimeMap.find(time);
+ if(mIt != mTimeMap.end())
+ {
+ mTimeMap.erase(mIt);
+ return true;
+ }
+
+ return false;
+}
+
+bool LLWLDayCycle::getKey(const LLString & name, F32& key)
+{
+ // scroll through till we find the
+ std::map<F32, std::string>::iterator mIt = mTimeMap.begin();
+ for(; mIt != mTimeMap.end(); ++mIt)
+ {
+ if(name == mIt->second)
+ {
+ key = mIt->first;
+ return true;
+ }
+ }
+
+ return false;
+}
+
+bool LLWLDayCycle::getKeyedParam(F32 time, LLWLParamSet& param)
+{
+ // just scroll on through till you find it
+ std::map<F32, std::string>::iterator mIt = mTimeMap.find(time);
+ if(mIt != mTimeMap.end())
+ {
+ return LLWLParamManager::instance()->getParamSet(mIt->second, param);
+ }
+
+ // return error if not found
+ return false;
+}
+
+bool LLWLDayCycle::getKeyedParamName(F32 time, LLString & name)
+{
+ // just scroll on through till you find it
+ std::map<F32, std::string>::iterator mIt = mTimeMap.find(time);
+ if(mIt != mTimeMap.end())
+ {
+ name = mTimeMap[time];
+ return true;
+ }
+
+ // return error if not found
+ return false;
+}