[Issue 662] STORM-1265: Combine Terrain and Ground Textures tabs in Region/Estate floater

This commit is contained in:
Lirusaito
2013-02-28 23:37:23 -05:00
parent c509378b24
commit 8eff717612
4 changed files with 585 additions and 302 deletions

View File

@@ -199,10 +199,6 @@ BOOL LLFloaterRegionInfo::postBuild()
LLUICtrlFactory::getInstance()->buildPanel(panel, "panel_region_terrain.xml");
mTab->addTabPanel(panel, panel->getLabel(), FALSE);
panel = new LLPanelRegionTextureInfo;
mInfoPanels.push_back(panel);
LLUICtrlFactory::getInstance()->buildPanel(panel, "panel_region_texture.xml");
mTab->addTabPanel(panel, panel->getLabel(), FALSE);
panel = new LLPanelRegionDebugInfo;
mInfoPanels.push_back(panel);
@@ -421,6 +417,23 @@ LLPanelEstateCovenant* LLFloaterRegionInfo::getPanelCovenant()
return panel;
}
// static
LLPanelRegionTerrainInfo* LLFloaterRegionInfo::getPanelRegionTerrain()
{
LLFloaterRegionInfo* floater = LLFloaterRegionInfo::getInstance();
if (!floater)
{
llassert(floater);
return NULL;
}
LLTabContainer* tab_container = floater->getChild<LLTabContainer>("region_panels");
LLPanelRegionTerrainInfo* panel =
dynamic_cast<LLPanelRegionTerrainInfo*>(tab_container->getChild<LLPanel>("Terrain"));
llassert(panel);
return panel;
}
void LLFloaterRegionInfo::refreshFromRegion(LLViewerRegion* region)
{
if (!region)
@@ -1022,127 +1035,7 @@ void LLPanelRegionDebugInfo::onClickCancelRestart(void* data)
}
/////////////////////////////////////////////////////////////////////////////
// LLPanelRegionTextureInfo
//
LLPanelRegionTextureInfo::LLPanelRegionTextureInfo() : LLPanelRegionInfo()
{
// nothing.
}
bool LLPanelRegionTextureInfo::refreshFromRegion(LLViewerRegion* region)
{
BOOL allow_modify = gAgent.isGodlike() || (region && region->canManageEstate());
setCtrlsEnabled(allow_modify);
childDisable("apply_btn");
if (region)
{
childSetValue("region_text", LLSD(region->getName()));
}
else
{
childSetValue("region_text", LLSD(""));
}
if (!region) return LLPanelRegionInfo::refreshFromRegion(region);
LLVLComposition* compp = region->getComposition();
LLTextureCtrl* texture_ctrl;
std::string buffer;
for(S32 i = 0; i < TERRAIN_TEXTURE_COUNT; ++i)
{
buffer = llformat("texture_detail_%d", i);
texture_ctrl = getChild<LLTextureCtrl>(buffer);
if(texture_ctrl)
{
lldebugs << "Detail Texture " << i << ": "
<< compp->getDetailTextureID(i) << llendl;
LLUUID tmp_id(compp->getDetailTextureID(i));
texture_ctrl->setImageAssetID(tmp_id);
}
}
for(S32 i = 0; i < CORNER_COUNT; ++i)
{
buffer = llformat("height_start_spin_%d", i);
childSetValue(buffer, LLSD(compp->getStartHeight(i)));
buffer = llformat("height_range_spin_%d", i);
childSetValue(buffer, LLSD(compp->getHeightRange(i)));
}
// Call the parent for common book-keeping
return LLPanelRegionInfo::refreshFromRegion(region);
}
BOOL LLPanelRegionTextureInfo::postBuild()
{
LLPanelRegionInfo::postBuild();
std::string buffer;
for(S32 i = 0; i < TERRAIN_TEXTURE_COUNT; ++i)
{
buffer = llformat("texture_detail_%d", i);
initCtrl(buffer);
}
for(S32 i = 0; i < CORNER_COUNT; ++i)
{
buffer = llformat("height_start_spin_%d", i);
initCtrl(buffer);
buffer = llformat("height_range_spin_%d", i);
initCtrl(buffer);
}
return LLPanelRegionInfo::postBuild();
}
BOOL LLPanelRegionTextureInfo::sendUpdate()
{
llinfos << "LLPanelRegionTextureInfo::sendUpdate()" << llendl;
// Make sure user hasn't chosen wacky textures.
if (!validateTextureSizes())
{
return FALSE;
}
LLTextureCtrl* texture_ctrl;
std::string buffer;
std::string id_str;
LLMessageSystem* msg = gMessageSystem;
strings_t strings;
LLUUID invoice(LLFloaterRegionInfo::getLastInvoice());
for(S32 i = 0; i < TERRAIN_TEXTURE_COUNT; ++i)
{
buffer = llformat("texture_detail_%d", i);
texture_ctrl = getChild<LLTextureCtrl>(buffer);
if(texture_ctrl)
{
LLUUID tmp_id(texture_ctrl->getImageAssetID());
tmp_id.toString(id_str);
buffer = llformat("%d %s", i, id_str.c_str());
strings.push_back(buffer);
}
}
sendEstateOwnerMessage(msg, "texturedetail", invoice, strings);
strings.clear();
for(S32 i = 0; i < CORNER_COUNT; ++i)
{
buffer = llformat("height_start_spin_%d", i);
std::string buffer2 = llformat("height_range_spin_%d", i);
std::string buffer3 = llformat("%d %f %f", i, (F32)childGetValue(buffer).asReal(), (F32)childGetValue(buffer2).asReal());
strings.push_back(buffer3);
}
sendEstateOwnerMessage(msg, "textureheights", invoice, strings);
strings.clear();
sendEstateOwnerMessage(msg, "texturecommit", invoice, strings);
return TRUE;
}
BOOL LLPanelRegionTextureInfo::validateTextureSizes()
BOOL LLPanelRegionTerrainInfo::validateTextureSizes()
{
for(S32 i = 0; i < TERRAIN_TEXTURE_COUNT; ++i)
{
@@ -1211,11 +1104,26 @@ BOOL LLPanelRegionTerrainInfo::postBuild()
childSetCommitCallback("use_estate_sun_check", onChangeUseEstateTime, this);
initCtrl("sun_hour_slider");
std::string buffer;
for(S32 i = 0; i < TERRAIN_TEXTURE_COUNT; ++i)
{
buffer = llformat("texture_detail_%d", i);
initCtrl(buffer);
}
for(S32 i = 0; i < CORNER_COUNT; ++i)
{
buffer = llformat("height_start_spin_%d", i);
initCtrl(buffer);
buffer = llformat("height_range_spin_%d", i);
initCtrl(buffer);
}
childSetAction("download_raw_btn", onClickDownloadRaw, this);
childSetAction("upload_raw_btn", onClickUploadRaw, this);
childSetAction("bake_terrain_btn", onClickBakeTerrain, this);
return TRUE;
return LLPanelRegionInfo::postBuild();
}
// virtual
@@ -1229,6 +1137,39 @@ bool LLPanelRegionTerrainInfo::refreshFromRegion(LLViewerRegion* region)
getChildView("apply_btn")->setEnabled(FALSE);
if (region)
{
getChild<LLUICtrl>("region_text")->setValue(LLSD(region->getName()));
LLVLComposition* compp = region->getComposition();
LLTextureCtrl* texture_ctrl;
std::string buffer;
for(S32 i = 0; i < TERRAIN_TEXTURE_COUNT; ++i)
{
buffer = llformat("texture_detail_%d", i);
texture_ctrl = getChild<LLTextureCtrl>(buffer);
if(texture_ctrl)
{
lldebugs << "Detail Texture " << i << ": "
<< compp->getDetailTextureID(i) << llendl;
LLUUID tmp_id(compp->getDetailTextureID(i));
texture_ctrl->setImageAssetID(tmp_id);
}
}
for(S32 i = 0; i < CORNER_COUNT; ++i)
{
buffer = llformat("height_start_spin_%d", i);
getChild<LLUICtrl>(buffer)->setValue(LLSD(compp->getStartHeight(i)));
buffer = llformat("height_range_spin_%d", i);
getChild<LLUICtrl>(buffer)->setValue(LLSD(compp->getHeightRange(i)));
}
}
else
{
lldebugs << "no region set" << llendl;
getChild<LLUICtrl>("region_text")->setValue(LLSD(""));
}
getChildView("download_raw_btn")->setEnabled(owner_or_god);
getChildView("upload_raw_btn")->setEnabled(owner_or_god);
@@ -1259,6 +1200,52 @@ BOOL LLPanelRegionTerrainInfo::sendUpdate()
// and sync the region with it
region_info.sendRegionTerrain(invoice);
// =======================================
// Assemble and send texturedetail message
// Make sure user hasn't chosen wacky textures.
if (!validateTextureSizes())
{
return FALSE;
}
LLTextureCtrl* texture_ctrl;
std::string id_str;
LLMessageSystem* msg = gMessageSystem;
for(S32 i = 0; i < TERRAIN_TEXTURE_COUNT; ++i)
{
buffer = llformat("texture_detail_%d", i);
texture_ctrl = getChild<LLTextureCtrl>(buffer);
if(texture_ctrl)
{
LLUUID tmp_id(texture_ctrl->getImageAssetID());
tmp_id.toString(id_str);
buffer = llformat("%d %s", i, id_str.c_str());
strings.push_back(buffer);
}
}
sendEstateOwnerMessage(msg, "texturedetail", invoice, strings);
strings.clear();
// ========================================
// Assemble and send textureheights message
for(S32 i = 0; i < CORNER_COUNT; ++i)
{
buffer = llformat("height_start_spin_%d", i);
std::string buffer2 = llformat("height_range_spin_%d", i);
std::string buffer3 = llformat("%d %f %f", i, (F32)getChild<LLUICtrl>(buffer)->getValue().asReal(), (F32)getChild<LLUICtrl>(buffer2)->getValue().asReal());
strings.push_back(buffer3);
}
sendEstateOwnerMessage(msg, "textureheights", invoice, strings);
strings.clear();
// ========================================
// Send texturecommit message
sendEstateOwnerMessage(msg, "texturecommit", invoice, strings);
// Grab estate information in case the user decided to set the
// region back to estate time. JC
LLFloaterRegionInfo* floater = LLFloaterRegionInfo::getInstance();
@@ -2476,7 +2463,7 @@ const std::string LLPanelEstateInfo::getOwnerName() const
void LLPanelEstateInfo::setOwnerName(const std::string& name)
{
childSetValue("estate_owner", LLSD(name));
getChild<LLUICtrl>("estate_owner")->setValue(LLSD(name));
}
void LLPanelEstateInfo::setAccessAllowedEnabled(bool enable_agent,
@@ -2556,6 +2543,7 @@ void LLPanelEstateInfo::clearAccessLists()
{
name_list->deleteAllItems();
}
updateControls(gAgent.getRegion());
}
// enables/disables the "remove" button for the various allow/ban lists

View File

@@ -57,7 +57,6 @@ class AIFilePicker;
class LLPanelRegionGeneralInfo;
class LLPanelRegionDebugInfo;
class LLPanelRegionTextureInfo;
class LLPanelRegionTerrainInfo;
class LLPanelEstateInfo;
class LLPanelEstateCovenant;
@@ -87,6 +86,7 @@ public:
static LLPanelEstateInfo* getPanelEstate();
static LLPanelEstateCovenant* getPanelCovenant();
static LLPanelRegionTerrainInfo* getPanelRegionTerrain();
// from LLPanel
virtual void refresh();
@@ -213,23 +213,6 @@ private:
/////////////////////////////////////////////////////////////////////////////
class LLPanelRegionTextureInfo : public LLPanelRegionInfo
{
public:
LLPanelRegionTextureInfo();
~LLPanelRegionTextureInfo() {}
virtual BOOL postBuild(); // LLPanel
virtual bool refreshFromRegion(LLViewerRegion* region); // refresh local settings from region update from simulator
protected:
virtual BOOL sendUpdate();
BOOL validateTextureSizes();
};
/////////////////////////////////////////////////////////////////////////////
class LLPanelRegionTerrainInfo : public LLPanelRegionInfo
{
LOG_CLASS(LLPanelRegionTerrainInfo);
@@ -242,10 +225,14 @@ public:
virtual bool refreshFromRegion(LLViewerRegion* region); // refresh local settings from region update from simulator
BOOL validateTextureSizes();
protected:
virtual BOOL sendUpdate();
static void onChangeUseEstateTime(LLUICtrl* ctrl, void* user_data);
//static void onChangeAnything(LLUICtrl* ctrl, void* userData); // callback for any change, to enable commit button
virtual BOOL sendUpdate();
static void onClickDownloadRaw(void*);
void onClickDownloadRaw_continued(AIFilePicker* filepicker);

View File

@@ -1,60 +1,466 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel border="true" bottom="0" follows="top|left" height="320" label="Terrain"
left="0" name="Terrain" width="480">
<text bottom="-30" follows="left|top" font="SansSerif" height="20" left="10"
name="region_text_lbl" width="100">
Region:
</text>
<text bottom_delta="0" follows="left|top" font="SansSerif" height="20" left="60"
name="region_text" width="400">
unknown
</text>
<spinner bottom_delta="-30" follows="left|top" height="20" increment=".1"
label="Water Height" label_width="120" left="15" max_val="100" min_val="0"
name="water_height_spin" width="180" />
<button bottom_delta="0" follows="left|top" font="SansSerifSmall" height="18" label="?"
left="200" name="water_height_help" width="18" />
<spinner bottom_delta="-20" follows="left|top" height="20" increment=".2"
label="Terrain Raise Limit" label_width="120" left="15" max_val="100"
min_val="0" name="terrain_raise_spin" width="180" />
<button bottom_delta="0" follows="left|top" font="SansSerifSmall" height="18" label="?"
left="200" name="terrain_raise_help" width="18" />
<spinner bottom_delta="-20" follows="left|top" height="20" increment=".2"
label="Terrain Lower Limit" label_width="120" left="15" max_val="0"
min_val="-100" name="terrain_lower_spin" width="180" />
<button bottom_delta="0" follows="left|top" font="SansSerifSmall" height="18" label="?"
left="200" name="terrain_lower_help" width="18" />
<check_box bottom="-55" follows="left|top" height="20" label="Use Estate Sun" left="250"
name="use_estate_sun_check" width="100" />
<button bottom_delta="0" follows="left|top" font="SansSerifSmall" height="18" label="?"
left="420" name="use_estate_sun_help" width="18" />
<check_box bottom_delta="-20" follows="left|top" height="20" label="Fixed Sun" left="250"
name="fixed_sun_check" width="100" />
<button bottom_delta="0" follows="left|top" font="SansSerifSmall" height="18" label="?"
left="420" name="fixed_sun_help" width="18" />
<icon bottom_delta="-25" follows="left|top" height="20"
image_name="icon_day_cycle.tga" left="285" name="daycycle" width="165" />
<slider bottom_delta="-25" follows="left|top" height="20" increment="0.001"
label="Phase" left="250" max_val="30" min_val="6" name="sun_hour_slider"
show_text="false" width="200" />
<button bottom_delta="-30" enabled="false" follows="left|top" height="20" label="Apply"
left="350" name="apply_btn" width="90" />
<view_border bevel_style="none" border_thickness="1" bottom_delta="-5" follows="top|left"
height="130" left="8" width="460" />
<button bottom_delta="-80" follows="left|top" height="20"
label="Download RAW terrain..." left="10" name="download_raw_btn"
tool_tip="Available only to estate owners, not managers" width="170" />
<button bottom_delta="0" follows="left|top" font="SansSerifSmall" height="18" label="?"
left="190" name="download_raw_help" width="18" />
<button bottom_delta="-23" follows="left|top" height="20" label="Upload RAW terrain..."
left="10" name="upload_raw_btn"
tool_tip="Available only to estate owners, not managers" width="170" />
<button bottom_delta="0" follows="left|top" font="SansSerifSmall" height="18" label="?"
left="190" name="upload_raw_help" width="18" />
<button bottom_delta="-40" follows="left|top" height="20" label="Bake Terrain"
left="10" name="bake_terrain_btn"
tool_tip="Set current terrain as mid-point for raise/lower limits"
width="100" />
<button bottom_delta="0" follows="left|top" font="SansSerifSmall" height="18" label="?"
left="120" name="bake_terrain_help" width="18" />
<panel
border="true"
follows="top|left"
help_topic="panel_region_terrain_tab"
label="Terrain"
layout="topleft"
left="0"
name="Terrain"
bottom="0"
height="320"
width="480">
<text
follows="left|top"
font="SansSerif"
height="20"
layout="topleft"
left="10"
name="region_text_lbl"
bottom="-30"
width="100">
Region:
</text>
<text
follows="left|top"
font="SansSerif"
height="20"
layout="topleft"
left="60"
name="region_text"
bottom_delta="0"
width="400">
unknown
</text>
<spinner
follows="left|top"
height="20"
increment=".1"
label="Water Height"
label_width="120"
layout="topleft"
left="15"
max_val="100"
min_val="0"
name="water_height_spin"
bottom="-60"
width="180" />
<button
bottom_delta="3"
follows="left|top"
font="SansSerifSmall"
height="18"
label="?"
left_delta="182"
name="water_height_help"
width="18" />
<spinner
follows="left|top"
height="20"
increment="0.2"
label="Terrain Raise Limit"
label_width="120"
layout="topleft"
left="240"
max_val="100"
min_val="0"
name="terrain_raise_spin"
bottom="-60"
width="180" />
<button
bottom_delta="3"
follows="left|top"
font="SansSerifSmall"
height="18"
label="?"
left_delta="182"
name="terrain_raise_help"
width="18" />
<spinner
follows="left|top"
height="20"
increment="0.2"
label="Terrain Lower Limit"
label_width="120"
layout="topleft"
left="240"
max_val="0"
min_val="-100"
name="terrain_lower_spin"
bottom_delta="-25"
width="180" />
<button
bottom_delta="3"
follows="left|top"
font="SansSerifSmall"
height="18"
label="?"
left_delta="182"
name="terrain_lower_help"
width="18" />
<view_border
bevel_style="none"
follows="top|left"
height="60"
layout="topleft"
left="8"
bottom_delta="-10"
top="30"
width="460" />
<text
type="string"
length="1"
follows="left|top"
height="20"
layout="topleft"
left="10"
name="detail_texture_text"
bottom_delta="-30"
width="300">
Terrain Textures
</text>
<texture_picker
follows="left|top"
height="100"
layout="topleft"
left_delta="0"
name="texture_detail_0"
bottom_delta="-100"
width="100" />
<texture_picker
follows="left|top"
height="100"
layout="topleft"
left_delta="110"
name="texture_detail_1"
bottom_delta="0"
width="100" />
<texture_picker
follows="left|top"
height="100"
layout="topleft"
left_delta="110"
name="texture_detail_2"
bottom_delta="0"
width="100" />
<texture_picker
follows="left|top"
height="100"
layout="topleft"
left_delta="110"
name="texture_detail_3"
bottom_delta="0"
width="100" />
<text
type="string"
length="1"
follows="left|top"
height="20"
layout="topleft"
left="10"
name="height_text_lbl"
bottom_delta="-10"
width="65">
1 (Low)
</text>
<text
type="string"
length="1"
follows="left|top"
height="20"
layout="topleft"
left_delta="110"
name="height_text_lbl2"
bottom_delta="0"
width="100">
2
</text>
<text
type="string"
length="1"
follows="left|top"
height="20"
layout="topleft"
left_delta="110"
name="height_text_lbl3"
bottom_delta="0"
width="100">
3
</text>
<text
type="string"
length="1"
follows="left|top"
height="20"
layout="topleft"
left_delta="110"
name="height_text_lbl4"
bottom_delta="0"
width="100">
4 (High)
</text>
<text
type="string"
length="1"
follows="left|top"
height="20"
layout="topleft"
left="10"
name="height_text_lbl5"
bottom_delta="-30"
top_delta="30"
width="300">
Texture Elevation Ranges
</text>
<text
follows="left|top"
height="20"
layout="topleft"
left="10"
name="height_text_lbl10"
top_delta="30"
width="200"
word_wrap="true">
These values represent the blend
range for the textures above.
</text>
<text
follows="left|top"
height="60"
layout="topleft"
left_delta="0"
name="height_text_lbl11"
bottom_delta="-80"
top_delta="32"
width="200"
word_wrap="true">
Measured in meters, the LOW value
is the MAXIMUM height of Texture #1,
and the HIGH value is the
MINIMUM height of Texture #4.
</text>
<text
follows="left|top"
height="20"
layout="topleft"
left="270"
name="height_text_lbl6"
bottom="-260"
width="100">
Northwest
</text>
<text
follows="left|top"
height="20"
layout="topleft"
left_delta="110"
name="height_text_lbl7"
bottom_delta="0"
width="100">
Northeast
</text>
<!-- northwest low-->
<spinner
follows="left|top"
height="20"
increment="0.5"
label="Low"
label_width="37"
layout="topleft"
left="230"
max_val="500"
min_val="-500"
name="height_start_spin_1"
bottom_delta="-20"
width="100" />
<!-- northeast low-->
<spinner
follows="left|top"
height="20"
increment="0.5"
label="Low"
label_width="37"
layout="topleft"
left_delta="110"
max_val="500"
min_val="-500"
name="height_start_spin_3"
bottom_delta="0"
width="100" />
<!-- northwest high-->
<spinner
follows="left|top"
height="20"
increment="0.5"
label="High"
label_width="37"
layout="topleft"
left="230"
max_val="500"
min_val="-500"
name="height_range_spin_1"
bottom_delta="-20"
width="100" />
<!-- northeast high-->
<spinner
follows="left|top"
height="20"
increment="0.5"
label="High"
label_width="37"
layout="topleft"
left_delta="110"
max_val="500"
min_val="-500"
name="height_range_spin_3"
bottom_delta="0"
width="100" />
<text
follows="left|top"
height="20"
layout="topleft"
left="270"
name="height_text_lbl8"
bottom_delta="-20"
top_pad="10"
width="100">
Southwest
</text>
<text
follows="left|top"
height="20"
layout="topleft"
left_delta="110"
name="height_text_lbl9"
bottom_delta="0"
width="100">
Southeast
</text>
<!-- southwest low-->
<spinner
follows="left|top"
height="20"
increment="0.5"
label="Low"
label_width="37"
layout="topleft"
left="230"
max_val="500"
min_val="-500"
name="height_start_spin_0"
bottom_delta="-20"
width="100" />
<!-- southeast low-->
<spinner
follows="left|top"
height="20"
increment="0.5"
label="Low"
label_width="37"
layout="topleft"
left_delta="110"
max_val="500"
min_val="-500"
name="height_start_spin_2"
bottom_delta="0"
width="100" />
<!--southwest high-->
<spinner
follows="left|top"
height="20"
increment="0.5"
label="High"
label_width="37"
layout="topleft"
left="230"
max_val="500"
min_val="-500"
name="height_range_spin_0"
bottom_delta="-20"
width="100" />
<!-- southeast high-->
<spinner
follows="left|top"
height="20"
increment="0.5"
label="High"
label_width="37"
layout="topleft"
left_delta="110"
max_val="500"
min_val="-500"
name="height_range_spin_2"
bottom_delta="0"
width="100" />
<!-- Terrain Download/Upload/Bake buttons -->
<button
follows="left|top"
height="20"
label="Download RAW terrain..."
font="SansSerifSmall"
layout="topleft"
left="10"
name="download_raw_btn"
tool_tip="Available only to estate owners, not managers"
bottom_delta="-35"
width="140" />
<button
bottom_delta="0"
follows="left|top"
font="SansSerifSmall"
height="20"
label="?"
left_delta="140"
name="download_raw_help"
width="20" />
<button
follows="left|top"
height="20"
label="Upload RAW terrain..."
font="SansSerifSmall"
layout="topleft"
left_delta="30"
bottom_delta="0"
name="upload_raw_btn"
tool_tip="Available only to estate owners, not managers"
width="130" />
<button
bottom_delta="0"
follows="left|top"
font="SansSerifSmall"
height="20"
label="?"
left_delta="130"
name="upload_raw_help"
width="20" />
<button
bottom_delta="0"
follows="left|top"
height="20"
label="Bake Terrain"
font="SansSerifSmall"
layout="topleft"
left_delta="30"
name="bake_terrain_btn"
tool_tip="Set current terrain as mid-point for raise/lower limits"
width="80" />
<button
bottom_delta="0"
follows="left|top"
font="SansSerifSmall"
height="20"
label="?"
left_delta="80"
name="bake_terrain_help"
width="20" />
<button
enabled="true"
follows="left|top"
height="20"
label="Apply"
layout="topleft"
left_delta="-80"
name="apply_btn"
bottom_delta="-40"
width="100" />
</panel>

View File

@@ -1,98 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel border="true" bottom="0" follows="top|left" height="320"
label="Ground Textures" left="0" name="Textures" width="480">
<text bottom="-30" follows="left|top" font="SansSerif" height="20" left="10"
name="region_text_lbl" width="100">
Region:
</text>
<text bottom_delta="0" follows="left|top" font="SansSerif" height="20" left="60"
name="region_text" width="400">
unknown
</text>
<text bottom_delta="-26" follows="left|top" height="20" left="10"
name="detail_texture_text" width="300">
Terrain Textures
</text>
<texture_picker bottom_delta="-100" follows="left|top" height="100" left="10"
name="texture_detail_0" width="100" />
<texture_picker bottom_delta="0" follows="left|top" height="100" left="120"
name="texture_detail_1" width="100" />
<texture_picker bottom_delta="0" follows="left|top" height="100" left="230"
name="texture_detail_2" width="100" />
<texture_picker bottom_delta="0" follows="left|top" height="100" left="340"
name="texture_detail_3" width="100" />
<text bottom_delta="-10" follows="left|top" height="20" left="10"
name="height_text_lbl" width="65">
1 (Low)
</text>
<text bottom_delta="0" follows="left|top" height="20" left="120"
name="height_text_lbl2" width="100">
2
</text>
<text bottom_delta="0" follows="left|top" height="20" left="230"
name="height_text_lbl3" width="100">
3
</text>
<text bottom_delta="0" follows="left|top" height="20" left="340"
name="height_text_lbl4" width="100">
4 (High)
</text>
<text bottom_delta="-40" follows="left|top" height="20" left="10"
name="height_text_lbl5" width="300">
Texture Elevation Ranges
</text>
<text bottom_delta="-15" follows="left|top" height="20" left="51"
name="height_text_lbl6" width="100">
Southwest
</text>
<text bottom_delta="0" follows="left|top" height="20" left="161"
name="height_text_lbl7" width="100">
Northwest
</text>
<text bottom_delta="0" follows="left|top" height="20" left="271"
name="height_text_lbl8" width="100">
Southeast
</text>
<text bottom_delta="0" follows="left|top" height="20" left="381"
name="height_text_lbl9" width="100">
Northeast
</text>
<spinner bottom_delta="-20" follows="left|top" height="20" increment="0.5" label="Low"
label_width="37" left="10" max_val="500" min_val="-500"
name="height_start_spin_0" width="100" />
<spinner bottom_delta="0" follows="left|top" height="20" increment="0.5" label="Low"
label_width="37" left="120" max_val="500" min_val="-500"
name="height_start_spin_1" width="100" />
<spinner bottom_delta="0" follows="left|top" height="20" increment="0.5" label="Low"
label_width="37" left="230" max_val="500" min_val="-500"
name="height_start_spin_2" width="100" />
<spinner bottom_delta="0" follows="left|top" height="20" increment="0.5" label="Low"
label_width="37" left="340" max_val="500" min_val="-500"
name="height_start_spin_3" width="100" />
<spinner bottom_delta="-20" follows="left|top" height="20" increment="0.5" label="High"
label_width="37" left="10" max_val="500" min_val="-500"
name="height_range_spin_0" width="100" />
<spinner bottom_delta="0" follows="left|top" height="20" increment="0.5" label="High"
label_width="37" left="120" max_val="500" min_val="-500"
name="height_range_spin_1" width="100" />
<spinner bottom_delta="0" follows="left|top" height="20" increment="0.5" label="High"
label_width="37" left="230" max_val="500" min_val="-500"
name="height_range_spin_2" width="100" />
<spinner bottom_delta="0" follows="left|top" height="20" increment="0.5" label="High"
label_width="37" left="340" max_val="500" min_val="-500"
name="height_range_spin_3" width="100" />
<text bottom_delta="-40" follows="left|top" height="20" left="25"
name="height_text_lbl10" width="480">
These values represent the blend range for the textures above.
</text>
<text bottom_delta="-16" follows="left|top" height="20" left="25"
name="height_text_lbl11" width="450">
Measured in meters, the LOW value is the MAXIMUM height of Texture #1,
</text>
<text bottom_delta="-16" follows="left|top" height="20" left="25"
name="height_text_lbl12" width="480">
and the HIGH value is the MINIMUM height of Texture #4.
</text>
<button bottom="10" enabled="false" follows="left|bottom" height="20" label="Apply"
left="350" name="apply_btn" width="100" />
</panel>