MAINT-8344 Day cycle editor (part 1)

master
andreykproductengine 2018-05-11 20:10:08 +03:00
parent 3c18de2136
commit cef4e29b90
6 changed files with 708 additions and 136 deletions

View File

@ -483,7 +483,7 @@ void LLSettingsDay::updateSettings()
//=========================================================================
LLSettingsDay::KeyframeList_t LLSettingsDay::getTrackKeyframes(S32 trackno)
{
if ((trackno < 1) || (trackno >= TRACK_MAX))
if ((trackno < 0) || (trackno >= TRACK_MAX))
{
LL_WARNS("DAYCYCLE") << "Attempt get track (#" << trackno << ") out of range!" << LL_ENDL;
return KeyframeList_t();
@ -508,6 +508,17 @@ void LLSettingsDay::setWaterAtKeyframe(const LLSettingsWaterPtr_t &water, F32 ke
setDirtyFlag(true);
}
const LLSettingsWaterPtr_t LLSettingsDay::getWaterAtKeyframe(F32 keyframe)
{
// todo: better way to identify keyframes?
CycleTrack_t::iterator iter = mDayTracks[TRACK_WATER].find(keyframe);
if (iter != mDayTracks[TRACK_WATER].end())
{
return std::dynamic_pointer_cast<LLSettingsWater>(iter->second);
}
return LLSettingsWaterPtr_t(NULL);
}
void LLSettingsDay::setSkyAtKeyframe(const LLSettingsSkyPtr_t &sky, F32 keyframe, S32 track)
{
@ -521,6 +532,42 @@ void LLSettingsDay::setSkyAtKeyframe(const LLSettingsSkyPtr_t &sky, F32 keyframe
setDirtyFlag(true);
}
const LLSettingsSkyPtr_t LLSettingsDay::getSkyAtKeyframe(F32 keyframe, S32 track)
{
if ((track < 1) || (track >= TRACK_MAX))
{
LL_WARNS("DAYCYCLE") << "Attempt to set sky track (#" << track << ") out of range!" << LL_ENDL;
return LLSettingsSkyPtr_t(NULL);
}
// todo: better way to identify keyframes?
CycleTrack_t::iterator iter = mDayTracks[track].find(keyframe);
if (iter != mDayTracks[track].end())
{
return std::dynamic_pointer_cast<LLSettingsSky>(iter->second);
}
return LLSettingsSkyPtr_t(NULL);
}
const LLSettingsBase::ptr_t LLSettingsDay::getSettingsAtKeyframe(F32 keyframe, S32 track)
{
if ((track < 0) || (track >= TRACK_MAX))
{
LL_WARNS("DAYCYCLE") << "Attempt to set sky track (#" << track << ") out of range!" << LL_ENDL;
return LLSettingsBase::ptr_t(NULL);
}
// todo: better way to identify keyframes?
CycleTrack_t::iterator iter = mDayTracks[track].find(keyframe);
if (iter != mDayTracks[track].end())
{
return iter->second;
}
return LLSettingsSkyPtr_t(NULL);
}
LLSettingsDay::TrackBound_t LLSettingsDay::getBoundingEntries(LLSettingsDay::CycleTrack_t &track, F32 keyframe)
{
return TrackBound_t(get_wrapping_atbefore(track, keyframe), get_wrapping_atafter(track, keyframe));

View File

@ -88,7 +88,10 @@ public:
KeyframeList_t getTrackKeyframes(S32 track);
void setWaterAtKeyframe(const LLSettingsWaterPtr_t &water, F32 keyframe);
const LLSettingsWaterPtr_t getWaterAtKeyframe(F32 keyframe);
void setSkyAtKeyframe(const LLSettingsSkyPtr_t &sky, F32 keyframe, S32 track);
const LLSettingsSkyPtr_t getSkyAtKeyframe(F32 keyframe, S32 track);
const LLSettingsBase::ptr_t getSettingsAtKeyframe(F32 keyframe, S32 track);
//---------------------------------------------------------------------
void startDayCycle();

View File

@ -45,16 +45,26 @@
#include "llagent.h"
#include "llregioninfomodel.h"
#include "llviewerregion.h"
#include "llpaneleditwater.h"
#include "llpaneleditsky.h"
#include "llenvironment.h"
#include "lltrans.h"
static const std::string track_tabs[] = {
"water_track",
"sky4_track",
"sky3_track",
"sky2_track",
"sky1_track",
};
LLFloaterEditExtDayCycle::LLFloaterEditExtDayCycle(const LLSD &key):
LLFloater(key),
mDayPresetsCombo(NULL),
mSaveButton(NULL),
mCancelButton(NULL)
mCancelButton(NULL),
mCurrentTrack(1)
// mDayCyclesCombo(NULL)
// , mTimeSlider(NULL)
// , mKeysSlider(NULL)
@ -62,32 +72,37 @@ LLFloaterEditExtDayCycle::LLFloaterEditExtDayCycle(const LLSD &key):
// , mMakeDefaultCheckBox(NULL)
// ,
{
mCommitCallbackRegistrar.add("DayCycle.Track", boost::bind(&LLFloaterEditExtDayCycle::onTrackSelectionCallback, this, _2));
}
// virtual
BOOL LLFloaterEditExtDayCycle::postBuild()
{
getChild<LLButton>("add_frame")->setCommitCallback(boost::bind(&LLFloaterEditExtDayCycle::onAddTrack, this));
getChild<LLButton>("delete_frame")->setCommitCallback(boost::bind(&LLFloaterEditExtDayCycle::onRemoveTrack, this));
getChild<LLLineEditor>("day_cycle_name")->setKeystrokeCallback(boost::bind(&LLFloaterEditExtDayCycle::onCommitName, this, _1, _2), NULL);
// mDayCyclesCombo = getChild<LLComboBox>("day_cycle_preset_combo");
// mTimeSlider = getChild<LLMultiSliderCtrl>("WLTimeSlider");
// mKeysSlider = getChild<LLMultiSliderCtrl>("WLDayCycleKeys");
mDayPresetsCombo = getChild<LLComboBox>("day_cycle_preset_combo");
// mTimeCtrl = getChild<LLTimeCtrl>("time");
mSaveButton = getChild<LLButton>("save_btn");
mCancelButton = getChild<LLButton>("cancel_btn");
mUploadButton = getChild<LLButton>("upload_btn");
mSaveButton = getChild<LLButton>("save_btn", true);
mCancelButton = getChild<LLButton>("cancel_btn", true);
mUploadButton = getChild<LLButton>("upload_btn", true);
mKeysSlider = getChild<LLMultiSliderCtrl>("WLDayCycleKeys");
mSkyTabContainer = getChild<LLView>("frame_settings_sky", true);
mWaterTabContainer = getChild<LLView>("frame_settings_water", true);
// mMakeDefaultCheckBox = getChild<LLCheckBoxCtrl>("make_default_cb");
//initCallbacks();
mDayPresetsCombo->setCommitCallback(boost::bind(&LLFloaterEditExtDayCycle::onDayPresetChanged, this));
mSaveButton->setCommitCallback(boost::bind(&LLFloaterEditExtDayCycle::onBtnSave, this));
mCancelButton->setCommitCallback(boost::bind(&LLFloaterEditExtDayCycle::onBtnCancel, this));
mUploadButton->setCommitCallback(boost::bind(&LLFloaterEditExtDayCycle::onUpload, this));
//initCallbacks();
// // add the time slider
// mTimeSlider->addSlider();
getChild<LLButton>("sky4_track", true)->setToggleState(true);
return TRUE;
}
@ -97,7 +112,52 @@ void LLFloaterEditExtDayCycle::onOpen(const LLSD& key)
LLEnvironment::instance().setSelectedEnvironment(LLEnvironment::ENV_EDIT);
LLEnvironment::instance().updateEnvironment();
refreshSkyPresetsList();
{
// TODO/TEMP
LLSettingsDay::ptr_t pday = LLEnvironment::instance().getEnvironmentDay(LLEnvironment::ENV_REGION);
mEditDay = pday->buildClone(); // pday should be passed as parameter
}
LLLineEditor* name_field = getChild<LLLineEditor>("day_cycle_name");
name_field->setText(mEditDay->getName());
selectTrack(mCurrentTrack);
/* TODO
if (mEditDay->hasSetting("cycle length")) // todo: figure out name
{
// extract setting
S32 extracted_time =
std::string time = LLTrans::getString("time_label", LLSD("TIME",(extracted_time * 0..100%) + offset));
std::string descr = LLTrans::getString("0_label", LLSD("DSC",time));
getChild<LLView>("p0")->setLabel(descr);
...
getChild<LLView>("p1")->setLabel(descr);
time =
descr =
getChild<LLView>("p2")->setLabel(descr);
time =
descr =
getChild<LLView>("p3")->setLabel(descr);
time =
descr =
getChild<LLView>("p4")->setLabel(descr);
}
else
{
std::string descr = LLTrans::getString("0_label", LLSD());
getChild<LLView>("p0")->setLabel(descr);
}
*/
/*list_name_id_t getSkyList() const;
list_name_id_t getWaterList() const;
getChild<LLButton>("sky4_track", true)->setToggleState(true);*/
}
void LLFloaterEditExtDayCycle::onClose(bool app_quitting)
@ -183,22 +243,6 @@ void LLFloaterEditExtDayCycle::onVisibilityChange(BOOL new_visibility)
}
}
//-------------------------------------------------------------------------
void LLFloaterEditExtDayCycle::onDayPresetChanged()
{
std::string dayname = mDayPresetsCombo->getSelectedValue().asString();
LLSettingsDay::ptr_t pday = LLEnvironment::instance().findDayCycleByName(dayname);
if (pday)
{
pday = pday->buildClone();
LLEnvironment::instance().setEnvironment(LLEnvironment::ENV_EDIT, pday, LLSettingsDay::DEFAULT_DAYLENGTH, LLSettingsDay::DEFAULT_DAYOFFSET);
mEditDay = pday;
}
}
void LLFloaterEditExtDayCycle::onBtnSave()
{
if (!mCommitSignal.empty())
@ -211,26 +255,134 @@ void LLFloaterEditExtDayCycle::onBtnCancel()
closeFloater();
}
//-------------------------------------------------------------------------
void LLFloaterEditExtDayCycle::refreshSkyPresetsList()
void LLFloaterEditExtDayCycle::onAddTrack()
{
mDayPresetsCombo->removeall();
LLEnvironment::list_name_id_t cyclelist = LLEnvironment::instance().getDayCycleList();
mDayPresetsCombo->removeall();
for (LLEnvironment::list_name_id_t::iterator it = cyclelist.begin(); it != cyclelist.end(); ++it)
F32 frame = 0; // temp?
mKeysSlider->addSlider(frame);
if (mCurrentTrack == 0)
{
mDayPresetsCombo->add((*it).first);
mEditDay->setWaterAtKeyframe(LLSettingsVOWater::buildDefaultWater(), frame);
}
else
{
mEditDay->setSkyAtKeyframe(LLSettingsVOSky::buildDefaultSky(), frame, mCurrentTrack);
}
}
void LLFloaterEditExtDayCycle::onRemoveTrack()
{
//mKeysSlider->deleteCurSlider();
}
void LLFloaterEditExtDayCycle::onCommitName(class LLLineEditor* caller, void* user_data)
{
mEditDay->setName(caller->getText());
}
void LLFloaterEditExtDayCycle::onTrackSelectionCallback(const LLSD& user_data)
{
U32 track_index = user_data.asInteger(); // 1-5
selectTrack(track_index);
}
void LLFloaterEditExtDayCycle::selectTrack(U32 track_index)
{
mCurrentTrack = track_index;
LLButton* button = getChild<LLButton>(track_tabs[track_index], true);
if (button->getToggleState())
{
return;
}
// set defaults on combo boxes
mDayPresetsCombo->selectFirstItem();
for (int i = 0; i < 5; i++)
{
getChild<LLButton>(track_tabs[i], true)->setToggleState(false);
}
button->setToggleState(true);
updateTabs();
updateSlider();
}
void LLFloaterEditExtDayCycle::updateTabs()
{
bool show_water = mCurrentTrack == 0;
mSkyTabContainer->setVisible(!show_water);
mWaterTabContainer->setVisible(show_water);
if (show_water)
{
updateWaterTabs();
}
else
{
updateSkyTabs();
}
}
void LLFloaterEditExtDayCycle::updateWaterTabs()
{
const LLSettingsWaterPtr_t p_water = mEditDay->getWaterAtKeyframe(mKeysSlider->getCurSliderValue());
// Compiler warnings from getChild about LLPanelSettingsWaterMainTab not being complete/missing params constructor...
// Todo: fix class to work with getChild()
LLPanelSettingsWaterMainTab* panel = mWaterTabContainer->findChild<LLPanelSettingsWaterMainTab>("water_panel", true);
if (panel)
{
panel->setWater(p_water); // todo: Null disables
}
}
void LLFloaterEditExtDayCycle::updateSkyTabs()
{
const LLSettingsSkyPtr_t p_sky = mEditDay->getSkyAtKeyframe(mKeysSlider->getCurSliderValue(), mCurrentTrack);
// Compiler warnings from getChild about tabs...
// Todo: fix class
LLPanelSettingsSky* panel;
panel = mSkyTabContainer->findChild<LLPanelSettingsSky>("atmosphere_panel", true);
if (panel)
{
panel->setSky(p_sky); // todo: Null disables
}
panel = mSkyTabContainer->findChild<LLPanelSettingsSky>("clouds_panel", true);
if (panel)
{
panel->setSky(p_sky);
}
panel = mSkyTabContainer->findChild<LLPanelSettingsSky>("moon_panel", true);
if (panel)
{
panel->setSky(p_sky);
}
}
void LLFloaterEditExtDayCycle::updateSlider()
{
mKeysSlider->clear();
LLSettingsDay::KeyframeList_t keyframes = mEditDay->getTrackKeyframes(mCurrentTrack);
LLSettingsDay::KeyframeList_t::iterator iter = keyframes.begin();
LLSettingsDay::KeyframeList_t::iterator end = keyframes.end();
while (iter != end)
{
mKeysSlider->addSlider(*iter);
iter++;
}
}
/*void LLFloaterEditExtDayCycle::updateTrack()
{
LLMultiSliderCtrl* slider = getChild<LLMultiSliderCtrl>("WLDayCycleKeys");
//mEditDay->getTrackKeyframes
// todo make tracks named to allow movement
}*/
//-------------------------------------------------------------------------
LLFloaterEditExtDayCycle::connection_t LLFloaterEditExtDayCycle::setEditCommitSignal(LLFloaterEditExtDayCycle::edit_commit_signal_t::slot_type cb)
{
return mCommitSignal.connect(cb);
@ -503,28 +655,26 @@ LLFloaterEditExtDayCycle::connection_t LLFloaterEditExtDayCycle::setEditCommitSi
// #endif
// }
//
// #if 0
// void LLFloaterEditExtDayCycle::addSliderKey(F32 time, LLWLParamKey keyframe)
// {
// // make a slider
// const std::string& sldr_name = mKeysSlider->addSlider(time);
// if (sldr_name.empty())
// {
// return;
// }
//
// // set the key
// SliderKey newKey(keyframe, mKeysSlider->getCurSliderValue());
//
// llassert_always(sldr_name != LLStringUtil::null);
//
// // add to map
// mSliderToKey.insert(std::pair<std::string, SliderKey>(sldr_name, newKey));
//
// llassert_always(mSliderToKey.size() == mKeysSlider->getValue().size());
// }
// #endif
//
void LLFloaterEditExtDayCycle::addSliderKey(F32 time, const std::shared_ptr<LLSettingsBase> keyframe)
{
// make a slider
const std::string& sldr_name = mKeysSlider->addSlider(time);
if (sldr_name.empty())
{
return;
}
// set the key
SliderKey newKey(keyframe, mKeysSlider->getCurSliderValue());
llassert_always(sldr_name != LLStringUtil::null);
// add to map
mSliderToKey.insert(std::pair<std::string, SliderKey>(sldr_name, newKey));
llassert_always(mSliderToKey.size() == mKeysSlider->getValue().size());
}
// #if 0
// LLWLParamKey LLFloaterEditExtDayCycle::getSelectedDayCycle()
// {

View File

@ -37,6 +37,18 @@ class LLLineEditor;
class LLMultiSliderCtrl;
class LLTimeCtrl;
typedef std::shared_ptr<LLSettingsBase> LLSettingsBasePtr_t;
class SliderKey
{
public:
SliderKey(LLSettingsBasePtr_t kf, F32 t) : keyframe(kf), time(t) {}
LLSettingsBasePtr_t keyframe;
F32 time;
};
/**
* Floater for creating or editing a day cycle.
*/
@ -75,18 +87,26 @@ private:
// void applyTrack();
//
// /// refresh the sky presets combobox
void refreshSkyPresetsList();
void onDayPresetChanged(); /// sky preset selected
void onBtnSave();
void onBtnCancel();
void onAddTrack();
void onRemoveTrack();
void onCommitName(class LLLineEditor* caller, void* user_data);
void onTrackSelectionCallback(const LLSD& user_data);
void onBtnSave();
void onBtnCancel();
void selectTrack(U32 track_index);
void updateTabs();
void updateSkyTabs();
void updateWaterTabs();
void updateSlider(); //track->slider
//void updateTrack(); // slider->track, todo: better name
// /// refresh the day cycle combobox
// void refreshDayCyclesList();
//
// /// add a slider to the track
// // void addSliderKey(F32 time, LLWLParamKey keyframe);
void addSliderKey(F32 time, const LLSettingsBasePtr_t key);
//
// void initCallbacks();
// // LLWLParamKey getSelectedDayCycle();
@ -123,8 +143,8 @@ private:
LLSettingsDay::ptr_t mSavedDay;
LLSettingsDay::ptr_t mEditDay;
U32 mCurrentTrack;
LLComboBox* mDayPresetsCombo;
LLButton* mSaveButton;
LLButton* mCancelButton;
LLButton* mUploadButton;
@ -133,12 +153,14 @@ private:
// LLComboBox* mDayCyclesCombo;
// LLMultiSliderCtrl* mTimeSlider;
// LLMultiSliderCtrl* mKeysSlider;
LLMultiSliderCtrl* mKeysSlider;
LLView* mSkyTabContainer;
LLView* mWaterTabContainer;
// LLTimeCtrl* mTimeCtrl;
// LLCheckBoxCtrl* mMakeDefaultCheckBox;
// map of sliders to parameters
// std::map<std::string, SliderKey> mSliderToKey;
std::map<std::string, SliderKey> mSliderToKey;
};
#endif // LL_LLFloaterEditExtDayCycle_H

View File

@ -1719,7 +1719,7 @@ LLViewerWindow::LLViewerWindow(const Params& p)
U32 fsaa_samples)
*/
// create window
mWindow = LLWindowManager::createWindow(this,
mWindow = LLWindowManager::createWindow(this,
p.title, p.name, p.x, p.y, p.width, p.height, 0,
p.fullscreen,
gHeadlessClient,

View File

@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
legacy_header_height="18"
height="500"
height="602"
layout="topleft"
name="env_edit_extdaycycle"
help_topic="day_presets"
@ -13,43 +12,53 @@
<string name="title_edit">Edit Day Cycle</string>
<string name="hint_new">Name your day cycle, adjust the controls to create it, and click "Save".</string>
<string name="hint_edit">To edit your day cycle, adjust the controls below and click "Save".</string>
<string name="combo_label">-Select a preset-</string>
<!-- Todo: These 5 strings might be subjected to a change to get dynamic labels-->
<string name="0_label">0%[DSC]</string>
<string name="1_label">25%[DSC]</string>
<string name="2_label">50%[DSC]</string>
<string name="3_label">75%[DSC]</string>
<string name="4_label">100%[DSC]</string>
<string name="time_label"> ([TIME] hr)</string>
<layout_stack name="test_stack"
width="705"
height="500"
height="602"
follows="all"
animate="false"
top="0"
orientation="vertical">
<layout_panel name="temp"
border="false"
auto_resize="false"
user_resize="true"
height="45"
min_height="45"
height="29"
min_height="29"
background_visible="false">
<!-- This layout_panel is for loading legacy presets -->
<text
follows="top|left|right"
follows="top|left"
font="SansSerif"
height="10"
layout="topleft"
name="label"
top_delta="70"
width="120">
Preset Name:
left="15"
top="5"
width="105">
Day Cycle Name:
</text>
<combo_box
allow_text_entry="true"
<line_editor
follows="top|left"
layout="topleft"
left_pad="10"
max_chars="100"
name="day_cycle_preset_combo"
top_delta="-5"
width="200" />
name="day_cycle_name"
top="5"
width="200"
height="21" />
</layout_panel>
<layout_panel name="timeline"
border="true"
<layout_panel name="timeline_track_selection"
border="false"
bevel_style="in"
auto_resize="false"
user_resize="true"
@ -58,74 +67,415 @@
min_height="0"
visible="true"
background_visible="true">
<text
follows="top|left|right"
font="SansSerif"
<panel name="timeline_layers"
border="false"
follows="left|top"
auto_resize="false"
user_resize="true"
bg_alpha_color="yellow"
height="150"
width="110"
top_pad="0"
min_height="0"
visible="true"
background_visible="true">
<button
follows="left|top"
height="23"
label="Sky 4"
layout="topleft"
top_pad="5"
left="10"
name="sky4_track"
width="100">
<button.commit_callback
function="DayCycle.Track"
parameter="1" />
</button>
<button
follows="left|top"
height="23"
label="Sky 3"
layout="topleft"
top_pad="0"
left="10"
name="sky3_track"
width="100">
<button.commit_callback
function="DayCycle.Track"
parameter="2" />
</button>
<button
follows="left|top"
height="23"
label="Sky 2"
layout="topleft"
top_pad="0"
left="10"
name="sky2_track"
width="100">
<button.commit_callback
function="DayCycle.Track"
parameter="3" />
</button>
<button
follows="left|top"
height="23"
label="Sky 1"
layout="topleft"
top_pad="0"
left="10"
name="sky1_track"
width="100">
<button.commit_callback
function="DayCycle.Track"
parameter="4" />
</button>
<button
follows="left|top"
height="23"
label="Water"
layout="topleft"
top_pad="0"
left="10"
name="water_track"
width="100">
<button.commit_callback
function="DayCycle.Track"
parameter="0" />
</button>
</panel>
<panel name="timeline"
border="true"
follows="left|top"
auto_resize="false"
user_resize="true"
height="150"
min_height="0"
width="595"
min_width="595"
left_pad="0"
visible="true">
<text
follows="left|top"
height="15"
layout="topleft"
left="10"
name="p0"
top_pad="5"
value="0%"
width="50" />
<text
follows="left|top|right"
height="15"
layout="topleft"
left_pad="69"
name="p1"
top_delta="0"
value="25%"
width="50" />
<text
follows="left|top|right"
height="15"
layout="topleft"
left_pad="69"
name="p2"
top_delta="0"
value="50%"
width="50" />
<text
follows="left|top|right"
height="15"
layout="topleft"
left_pad="69"
name="p3"
top_delta="0"
value="75%"
width="50" />
<text
follows="left|top|right"
height="15"
layout="topleft"
left_pad="69"
name="p4"
top_delta="0"
value="100%"
width="50" />
<multi_slider
can_edit_text="true"
decimal_digits="0"
draw_track="false"
follows="bottom"
height="10"
increment="0.0833333"
initial_value="0"
layout="topleft"
name="label"
top_offset="20"
left_offset="10"
width="120">
Time Line Goes here
</text>
left="10"
max_sliders="20"
max_val="24"
name="WLTimeSlider"
show_text="false"
top_pad="0"
use_triangle="true"
width="525"
min_width="525"/>
<multi_slider
can_edit_text="true"
decimal_digits="0"
follows="bottom"
height="10"
increment="0.0833333"
initial_value="0"
layout="topleft"
left="10"
max_sliders="20"
max_val="24"
name="WLDayCycleKeys"
show_text="false"
top_pad="15"
width="525"
min_width="525" />
<line_editor
border_style="line"
border_thickness="1"
follows="left|bottom"
font="SansSerif"
height="20"
layout="topleft"
left_pad="0"
max_length_bytes="300"
name="timeline_field"
select_on_focus="true"
value="%"
tool_tip="The full path to an editor (executable) to edit floater XML files (quotes not necessary)"
top_delta="-5"
width="35" />
<layout_stack
name="progress_control"
follows="top|left"
height="25"
width="83"
layout="topleft"
animate="false"
left="225"
top_pad="40"
orientation="horizontal">
<layout_panel
name="skip_back"
mouse_opaque="false"
auto_resize="false"
layout="topleft"
top="0"
height="25"
min_width="25"
width="25">
<button
name="skip_back_btn"
follows="top"
image_overlay="SkipBackward_Off"
image_disabled="PushButton_Disabled"
image_disabled_selected="PushButton_Disabled"
image_selected="PushButton_Selected"
image_unselected="PushButton_Off"
hover_glow_amount="0.15"
auto_resize="false"
width="25"
height="25"
layout="topleft"
tool_tip="Step back"
top="0"
left="0"/>
</layout_panel>
<layout_panel
name="play"
mouse_opaque="false"
auto_resize="false"
layout="topleft"
top="0"
height="25"
min_width="25"
width="25">
<button
name="play_btn"
follows="top"
image_overlay="Play_Off"
image_disabled="PushButton_Disabled"
image_disabled_selected="PushButton_Disabled"
image_selected="PushButton_Selected"
image_unselected="PushButton_Off"
hover_glow_amount="0.15"
auto_resize="false"
layout="topleft"
height="25"
width="25"
left="0"
top="0" />
</layout_panel>
<layout_panel
name="pause"
mouse_opaque="false"
auto_resize="false"
layout="topleft"
top="0"
height="25"
min_width="25"
width="25"
visible="false">
<button
name="pause_btn"
follows="top"
image_overlay="Pause_Off"
image_disabled="PushButton_Disabled"
image_disabled_selected="PushButton_Disabled"
image_selected="PushButton_Selected"
image_unselected="PushButton_Off"
hover_glow_amount="0.15"
auto_resize="false"
layout="topleft"
height="25"
width="25"
left="0"
top="0"/>
</layout_panel>
<layout_panel
name="skip_forward"
mouse_opaque="false"
auto_resize="false"
layout="topleft"
top="0"
height="25"
min_width="25"
width="25">
<button
name="skip_forward_btn"
follows="top"
image_overlay="SkipForward_Off"
image_disabled="PushButton_Disabled"
image_disabled_selected="PushButton_Disabled"
image_selected="PushButton_Selected"
image_unselected="PushButton_Off"
hover_glow_amount="0.15"
width="25"
height="25"
layout="topleft"
tool_tip="Step forward"
top="0" />
</layout_panel>
</layout_stack>
<button
follows="top|left"
height="23"
width="90"
label="Add Frame"
left_pad="175"
top_delta="-12"
name="add_frame" />
<button
follows="left|top"
height="23"
width="90"
label="Delete Frame"
top_pad="0"
left_delta="0"
name="delete_frame" />
</panel>
</layout_panel>
<layout_panel name="flex"
auto_resize="true"
<layout_panel name="frame_settings_water"
auto_resize="false"
user_resize="true"
bg_alpha_color="blue"
height="11"
height="386"
width="700"
min_height="0"
visible="true"
background_visible="true">
visible="false">
<tab_container
follows="all"
halign="left"
height="386"
layout="topleft"
left_offset="0"
name="landtab"
left="0"
name="water_tabs"
tab_position="top"
tab_width="140"
tab_padding_right="3"
top_offset="6"
width="633">
<panel
border="true"
follows="all"
label="DUMMY"
layout="topleft"
left="0"
help_topic="land_general_tab"
name="land_general_panel"
top="0">
<text
follows="top|left|right"
font="SansSerif"
height="10"
layout="center"
name="label"
top_offset="20"
left_offset="10"
width="300">
Space For editing selected frame
</text>
</panel>
top_pad="0"
width="700">
<panel
border="true"
filename="panel_settings_water.xml"
label="Water_panel"
layout="topleft"
left_delta="0"
top_pad="5"
name="water_panel"/>
</tab_container>
</layout_panel>
<layout_panel name="frame_settings_sky"
auto_resize="false"
user_resize="true"
height="386"
width="700"
min_height="0"
visible="true">
<tab_container
follows="all"
halign="left"
height="386"
visible="true"
layout="topleft"
left="0"
name="sky_tabs"
tab_position="top"
tab_width="140"
tab_padding_right="3"
top_pad="0"
width="700">
<panel
border="true"
filename="panel_settings_sky_atmos.xml"
label="Atmosphere &amp; Lighting"
layout="topleft"
left_delta="0"
top_pad="5"
name="atmosphere_panel" />
<panel
border="true"
filename="panel_settings_sky_clouds.xml"
label="Clouds"
layout="topleft"
left_delta="0"
top_pad="5"
name="clouds_panel" />
<panel
border="true"
filename="panel_settings_sky_sunmoon.xml"
label="Sun &amp; Moon"
layout="topleft"
left_delta="0"
top_pad="5"
name="moon_panel" />
</tab_container>
</layout_panel>
<layout_panel name="buttons"
auto_resize="false"
user_resize="true"
height="43"
height="26"
min_height="0"
background_visible="false">
visible="true"
width="700">
<button
follows="top|left"
height="23"
label="Save"
left_offset="160"
top_offset="60"
left="5"
top_pad="0"
name="save_btn"
width="100" />
<button
@ -138,7 +488,7 @@
width="100" />
<button
follows="top|right"
follows="top|left"
height="23"
label="Upload"
layout="topleft"