272 lines
6.7 KiB
C++
272 lines
6.7 KiB
C++
/**
|
|
* @file llwldaycycle.cpp
|
|
* @brief Implementation for the LLWLDayCycle class.
|
|
*
|
|
* $LicenseInfo:firstyear=2007&license=viewergpl$
|
|
*
|
|
* Copyright (c) 2007-2009, 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://secondlifegrid.net/programs/open_source/licensing/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://secondlifegrid.net/programs/open_source/licensing/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 "llweb.h"
|
|
|
|
#include "llviewerwindow.h"
|
|
|
|
#include <map>
|
|
|
|
LLWLDayCycle::LLWLDayCycle() :
|
|
mDayRate(120),
|
|
mName("Unnamed Cycle")
|
|
{
|
|
}
|
|
|
|
|
|
LLWLDayCycle::~LLWLDayCycle()
|
|
{
|
|
}
|
|
|
|
void LLWLDayCycle::loadDayCycle(const std::string & fileName)
|
|
{
|
|
// clear the first few things
|
|
mTimeMap.clear();
|
|
|
|
// bugfix for SL-46920: preventing filenames that break stuff.
|
|
std::string escaped_filename = LLWeb::curlEscape(fileName);
|
|
|
|
escaped_filename += ".xml";
|
|
|
|
std::string pathName(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/days", escaped_filename));
|
|
llinfos << "Loading Day Cycle preset from " << pathName << llendl;
|
|
|
|
llifstream day_cycle_xml;
|
|
day_cycle_xml.open(pathName.c_str());
|
|
|
|
// That failed, try loading from the users area instead.
|
|
if(!day_cycle_xml)
|
|
{
|
|
pathName=gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/days", escaped_filename);
|
|
llinfos << "Loading User Day Cycle preset from " << pathName << llendl;
|
|
day_cycle_xml.open(pathName.c_str());
|
|
}
|
|
|
|
if (day_cycle_xml)
|
|
{
|
|
// load and parse it
|
|
LLSD day_data(LLSD::emptyArray());
|
|
LLPointer<LLSDParser> parser = new LLSDXMLParser();
|
|
parser->parse(day_cycle_xml, day_data, LLSDSerialize::SIZE_UNLIMITED);
|
|
llinfos << "Loading day cycle into timeline..." << llendl;
|
|
// add each key
|
|
for(S32 i = 0; i < day_data.size(); ++i)
|
|
{
|
|
llinfos << "Loading value" << i << llendl;
|
|
// 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::getInstance()->getParamSet(day_data[i][1].asString(), pset);
|
|
if(!success)
|
|
{
|
|
// alert the user
|
|
LLSD args;
|
|
args["SKY"] = day_data[i][1].asString();
|
|
LLNotifications::instance().add("WLMissingSky", args, LLSD());
|
|
continue;
|
|
}
|
|
|
|
// then add the key
|
|
addKey((F32)day_data[i][0].asReal(), day_data[i][1].asString());
|
|
}
|
|
|
|
day_cycle_xml.close();
|
|
}
|
|
else
|
|
{
|
|
llwarns << "Can't find " << fileName << llendl;
|
|
return;
|
|
}
|
|
}
|
|
|
|
void LLWLDayCycle::saveDayCycle(const std::string & fileName)
|
|
{
|
|
|
|
// bugfix for SL-46920: preventing filenames that break stuff.
|
|
std::string escaped_filename = LLWeb::curlEscape(fileName);
|
|
|
|
escaped_filename += ".xml";
|
|
|
|
std::string pathName(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/days", escaped_filename));
|
|
llinfos << "Saving Day Cycle preset from " << pathName << llendl;
|
|
|
|
llofstream day_cycle_xml;
|
|
day_cycle_xml.open(pathName.c_str());
|
|
|
|
// That failed, try loading from the users area instead.
|
|
if(!day_cycle_xml)
|
|
{
|
|
pathName=gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/days", escaped_filename);
|
|
llinfos << "Saving User Day Cycle preset from " << pathName << llendl;
|
|
day_cycle_xml.open(pathName.c_str());
|
|
}
|
|
|
|
LLSD day_data(LLSD::emptyArray());
|
|
|
|
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);
|
|
}
|
|
|
|
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 std::string & 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 std::string & name)
|
|
{
|
|
// just remove and add back
|
|
// make sure param exists
|
|
LLWLParamSet tmp;
|
|
bool stat = LLWLParamManager::getInstance()->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 std::string & 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::getInstance()->getParamSet(mIt->second, param);
|
|
}
|
|
|
|
// return error if not found
|
|
return false;
|
|
}
|
|
|
|
bool LLWLDayCycle::getKeyedParamName(F32 time, std::string & 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;
|
|
}
|