summaryrefslogtreecommitdiff
path: root/indra/newview/llfloatermodelpreview.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview/llfloatermodelpreview.cpp')
-rw-r--r--indra/newview/llfloatermodelpreview.cpp129
1 files changed, 94 insertions, 35 deletions
diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp
index 5dd983d818..3ef892f739 100644
--- a/indra/newview/llfloatermodelpreview.cpp
+++ b/indra/newview/llfloatermodelpreview.cpp
@@ -269,8 +269,6 @@ BOOL LLFloaterModelPreview::postBuild()
childSetCommitCallback("show edges", onShowEdgesCommit, this);
childSetCommitCallback("auto fill", onAutoFillCommit, this);
- childSetCommitCallback("explode", onExplodeCommit, this);
-
childSetTextArg("status", "[STATUS]", getString("status_idle"));
for (S32 lod = 0; lod < LLModel::NUM_LODS; ++lod)
@@ -535,7 +533,7 @@ void LLFloaterModelPreview::onShowEdgesCommit(LLUICtrl* ctrl, void* userdata)
//static
void LLFloaterModelPreview::onExplodeCommit(LLUICtrl* ctrl, void* userdata)
{
- LLFloaterModelPreview* fp = (LLFloaterModelPreview*) userdata;
+ LLFloaterModelPreview* fp = LLFloaterModelPreview::sInstance;
fp->mModelPreview->refresh();
}
@@ -557,6 +555,8 @@ void LLFloaterModelPreview::draw()
LLFloater::draw();
LLRect r = getRect();
+ mModelPreview->update();
+
if (!mLoading)
{
childSetTextArg("status", "[STATUS]", getString("status_idle"));
@@ -776,7 +776,7 @@ void LLFloaterModelPreview::showDecompFloater()
mDecompFloater = new LLPhysicsDecompFloater(key);
S32 left = 20;
- S32 right = 270;
+ S32 right = 320;
S32 cur_y = 30;
@@ -837,15 +837,19 @@ void LLFloaterModelPreview::showDecompFloater()
continue;
}
+ std::string name(param[i].mName ? param[i].mName : "");
+ std::string description(param[i].mDescription ? param[i].mDescription : "");
+
if (param[i].mType == LLCDParam::LLCD_FLOAT)
{
LLSliderCtrl::Params p;
- p.name(param[i].mName);
- p.label(param[i].mName);
+ p.name(name);
+ p.label(name);
p.rect(LLRect(left, cur_y, right, cur_y-20));
p.min_value(param[i].mDetails.mRange.mLow.mFloat);
p.max_value(param[i].mDetails.mRange.mHigh.mFloat);
p.increment(param[i].mDetails.mRange.mDelta.mFloat);
+ p.tool_tip(description);
p.decimal_digits(3);
p.initial_value(param[i].mDefault.mFloat);
LLSliderCtrl* slider = LLUICtrlFactory::create<LLSliderCtrl>(p);
@@ -856,12 +860,13 @@ void LLFloaterModelPreview::showDecompFloater()
else if (param[i].mType == LLCDParam::LLCD_INTEGER)
{
LLSliderCtrl::Params p;
- p.name(param[i].mName);
- p.label(param[i].mName);
+ p.name(name);
+ p.label(name);
p.rect(LLRect(left, cur_y, right, cur_y-20));
p.min_value(param[i].mDetails.mRange.mLow.mIntOrEnumValue);
p.max_value(param[i].mDetails.mRange.mHigh.mIntOrEnumValue);
p.increment(param[i].mDetails.mRange.mDelta.mIntOrEnumValue);
+ p.tool_tip(description);
p.initial_value(param[i].mDefault.mIntOrEnumValue);
LLSliderCtrl* slider = LLUICtrlFactory::create<LLSliderCtrl>(p);
slider->setCommitCallback(onPhysicsParamCommit, (void*) &param[i]);
@@ -872,9 +877,10 @@ void LLFloaterModelPreview::showDecompFloater()
{
LLCheckBoxCtrl::Params p;
p.rect(LLRect(left, cur_y, right, cur_y-20));
- p.name(param[i].mName);
- p.label(param[i].mName);
+ p.name(name);
+ p.label(name);
p.initial_value(param[i].mDefault.mBool);
+ p.tool_tip(description);
LLCheckBoxCtrl* check_box = LLUICtrlFactory::create<LLCheckBoxCtrl>(p);
check_box->setCommitCallback(onPhysicsParamCommit, (void*) &param[i]);
mDecompFloater->addChild(check_box);
@@ -882,24 +888,61 @@ void LLFloaterModelPreview::showDecompFloater()
}
else if (param[i].mType == LLCDParam::LLCD_ENUM)
{
- LLComboBox::Params p;
- p.rect(LLRect(left, cur_y, right/3, cur_y-20));
- p.name(param[i].mName);
- p.label(param[i].mName);
- LLComboBox* combo_box = LLUICtrlFactory::create<LLComboBox>(p);
- for (S32 k = 0; k < param[i].mDetails.mEnumValues.mNumEnums; ++k)
- {
- combo_box->add(param[i].mDetails.mEnumValues.mEnumsArray[k].mName,
- LLSD::Integer(param[i].mDetails.mEnumValues.mEnumsArray[k].mValue));
+ S32 cur_x = left;
+
+ { //add label
+ LLTextBox::Params p;
+ const LLFontGL* font = (LLFontGL*) p.font();
+
+ p.rect(LLRect(left, cur_y, left+font->getWidth(name), cur_y-20));
+ p.name(name);
+ p.label(name);
+ p.initial_value(name);
+ LLTextBox* text_box = LLUICtrlFactory::create<LLTextBox>(p);
+ mDecompFloater->addChild(text_box);
+ cur_x += text_box->getRect().getWidth();
+ }
+
+ { //add combo_box
+ LLComboBox::Params p;
+ p.rect(LLRect(cur_x, cur_y, right-right/4, cur_y-20));
+ p.name(name);
+ p.label(name);
+ p.tool_tip(description);
+
+ LLComboBox* combo_box = LLUICtrlFactory::create<LLComboBox>(p);
+ for (S32 k = 0; k < param[i].mDetails.mEnumValues.mNumEnums; ++k)
+ {
+ combo_box->add(param[i].mDetails.mEnumValues.mEnumsArray[k].mName,
+ LLSD::Integer(param[i].mDetails.mEnumValues.mEnumsArray[k].mValue));
+ }
+ combo_box->setValue(param[i].mDefault.mIntOrEnumValue);
+ combo_box->setCommitCallback(onPhysicsParamCommit, (void*) &param[i]);
+ mDecompFloater->addChild(combo_box);
+ cur_y += 30;
}
- combo_box->setValue(param[i].mDefault.mIntOrEnumValue);
- combo_box->setCommitCallback(onPhysicsParamCommit, (void*) &param[i]);
- mDecompFloater->addChild(combo_box);
- cur_y += 30;
}
}
}
+ cur_y += 30;
+ //explode slider
+ {
+ LLSliderCtrl::Params p;
+ p.initial_value(0);
+ p.min_value(0);
+ p.max_value(1);
+ p.decimal_digits(2);
+ p.increment(0.05f);
+ p.label("Explode");
+ p.name("explode");
+ p.rect(LLRect(left, cur_y, right, cur_y-20));
+ LLSliderCtrl* slider = LLUICtrlFactory::create<LLSliderCtrl>(p);
+
+ mDecompFloater->addChild(slider);
+ cur_y += 30;
+ }
+
//mesh render checkbox
{
LLCheckBoxCtrl::Params p;
@@ -926,15 +969,16 @@ void LLFloaterModelPreview::showDecompFloater()
LLTextBox::Params p;
p.label("Model");
p.name("model label");
- p.rect(LLRect(right/3, cur_y, right/2, cur_y-20));
+ p.rect(LLRect(right/2, cur_y, right-right/3, cur_y-20));
LLTextBox* text_box = LLUICtrlFactory::create<LLTextBox>(p);
text_box->setValue("Model");
mDecompFloater->addChild(text_box);
}
+
{
//add submesh combo box
LLComboBox::Params p;
- p.rect(LLRect(right/2, cur_y, right, cur_y-20));
+ p.rect(LLRect(right-right/2+p.font()->getWidth("Model"), cur_y, right, cur_y-20));
p.name("model");
LLComboBox* combo_box = LLUICtrlFactory::create<LLComboBox>(p);
for (S32 i = 0; i < mModelPreview->mBaseModel.size(); ++i)
@@ -954,6 +998,8 @@ void LLFloaterModelPreview::showDecompFloater()
mDecompFloater->setRect(LLRect(10, cur_y+20, right+20, 10));
}
+ mDecompFloater->childSetCommitCallback("explode", LLFloaterModelPreview::onExplodeCommit, this);
+
mDecompFloater->openFloater();
}
@@ -1703,7 +1749,7 @@ LLImportMaterial LLModelLoader::profileToMaterial(domProfile_COMMON* material)
std::string filename = cdom::uriToNativePath(init->getValue().str());
mat.mDiffuseMap = LLViewerTextureManager::getFetchedTextureFromUrl("file://" + filename, TRUE, LLViewerTexture::BOOST_PREVIEW);
- mat.mDiffuseMap->setLoadedCallback(LLModelPreview::textureLoadedCallback, 0, TRUE, FALSE, this->mPreview, NULL, NULL);
+ mat.mDiffuseMap->setLoadedCallback(LLModelPreview::textureLoadedCallback, 0, TRUE, FALSE, this->mPreview, NULL, FALSE);
mat.mDiffuseMap->forceToSaveRawImage();
mat.mDiffuseMapFilename = filename;
@@ -1813,6 +1859,7 @@ LLModelPreview::LLModelPreview(S32 width, S32 height, LLFloaterModelPreview* fmp
mTextureName = 0;
mPreviewLOD = 3;
mModelLoader = NULL;
+ mDirty = false;
mLODMode[0] = 0;
@@ -1881,7 +1928,7 @@ U32 LLModelPreview::calcResourceCost()
mFMP->childSetTextArg(info_name[LLModel::LOD_PHYSICS], "[POINTS]", llformat("%d",num_points));
updateStatusMessages();
-
+
return cost;
}
@@ -2024,8 +2071,8 @@ void LLModelPreview::loadModelCallback(S32 lod)
clearIncompatible(lod);
- mResourceCost = calcResourceCost();
-
+ mDirty = true;
+
mPreviewTarget = (mModelLoader->mExtents[0] + mModelLoader->mExtents[1]) * 0.5f;
mPreviewScale = (mModelLoader->mExtents[1] - mModelLoader->mExtents[0]) * 0.5f;
setPreviewTarget(mPreviewScale.magVec()*2.f);
@@ -2556,6 +2603,9 @@ void LLModelPreview::genLODs(S32 which_lod)
target_model->mInvBindMatrix = base->mInvBindMatrix;
target_model->mBindShapeMatrix = base->mBindShapeMatrix;
+ //copy material list
+ target_model->mMaterialList = base->mMaterialList;
+
if (!validate_model(target_model))
{
llerrs << "Invalid model generated when creating LODs" << llendl;
@@ -2656,8 +2706,8 @@ void LLModelPreview::updateStatusMessages()
const F32 ratio = 0.5f;
const S32 required_verts = 128;
- F32 scaler = powf(0.5f, lod_high-lod);
- S32 max_verts = verts[lod_high][i]*scaler;
+ F32 scaler = powf(ratio, lod_high-lod);
+ S32 max_verts = (S32)(verts[lod_high][i]*scaler);
if (max_verts > required_verts)
{ //some model in this slot might have more than 128 vertices
@@ -2691,8 +2741,8 @@ void LLModelPreview::updateStatusMessages()
{
const F32 ratio = 0.5f;
- F32 scaler = powf(0.5f, lod_high-lod);
- S32 max_verts = verts[lod_high][i]*scaler;
+ F32 scaler = powf(ratio, lod_high-lod);
+ S32 max_verts = (S32)(verts[lod_high][i]*scaler);
if (verts[lod][i] > max_verts)
{
@@ -2864,6 +2914,15 @@ void LLModelPreview::genBuffers(S32 lod)
}
}
+void LLModelPreview::update()
+{
+ if (mDirty)
+ {
+ mDirty = false;
+ mResourceCost = calcResourceCost();
+ }
+}
+
//-----------------------------------------------------------------------------
// render()
//-----------------------------------------------------------------------------
@@ -2910,7 +2969,7 @@ BOOL LLModelPreview::render()
mFMP->childSetEnabled("consolidate", !avatar_preview);
- F32 explode = mFMP->childGetValue("explode").asReal();
+ F32 explode = mFMP->mDecompFloater ? mFMP->mDecompFloater->childGetValue("explode").asReal() : 0.f;
glMatrixMode(GL_PROJECTION);
gGL.popMatrix();
@@ -3353,7 +3412,7 @@ void LLFloaterModelPreview::onModelDecompositionComplete(LLModel* model, std::ve
{
sInstance->mModelPreview->mPhysicsMesh[model] = physics_mesh;
- sInstance->mModelPreview->mResourceCost = sInstance->mModelPreview->calcResourceCost();
+ sInstance->mModelPreview->mDirty = true;
}
}