summaryrefslogtreecommitdiff
path: root/indra/newview/llfloatermodelwizard.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview/llfloatermodelwizard.cpp')
-rw-r--r--indra/newview/llfloatermodelwizard.cpp223
1 files changed, 205 insertions, 18 deletions
diff --git a/indra/newview/llfloatermodelwizard.cpp b/indra/newview/llfloatermodelwizard.cpp
index aca5d67e60..fe53eafa40 100644
--- a/indra/newview/llfloatermodelwizard.cpp
+++ b/indra/newview/llfloatermodelwizard.cpp
@@ -35,10 +35,11 @@
#include "llfloatermodelwizard.h"
#include "llfloatermodelpreview.h"
#include "llfloaterreg.h"
-#include "llslider.h"
+#include "llsliderctrl.h"
#include "lltoolmgr.h"
#include "llviewerwindow.h"
+LLFloaterModelWizard* LLFloaterModelWizard::sInstance = NULL;
static const std::string stateNames[]={
"choose_file",
@@ -50,8 +51,12 @@ static const std::string stateNames[]={
LLFloaterModelWizard::LLFloaterModelWizard(const LLSD& key)
: LLFloater(key)
{
+ sInstance = this;
+}
+LLFloaterModelWizard::~LLFloaterModelWizard()
+{
+ sInstance = NULL;
}
-
void LLFloaterModelWizard::setState(int state)
{
mState = state;
@@ -69,6 +74,34 @@ void LLFloaterModelWizard::setState(int state)
if (state == OPTIMIZE)
{
mModelPreview->genLODs(-1);
+ mModelPreview->mViewOption["show_physics"] = false;
+ }
+
+ if (state == PHYSICS)
+ {
+ mModelPreview->setPhysicsFromLOD(1);
+ mModelPreview->mViewOption["show_physics"] = true;
+
+ getChild<LLView>("next")->setVisible(true);
+ getChild<LLView>("upload")->setVisible(false);
+ }
+
+ if (state == REVIEW)
+ {
+ executePhysicsStage("Decompose");
+ getChild<LLView>("close")->setVisible(false);
+ getChild<LLView>("next")->setVisible(false);
+ getChild<LLView>("back")->setVisible(true);
+ getChild<LLView>("upload")->setVisible(true);
+ getChild<LLView>("cancel")->setVisible(true);
+ }
+
+ if (state == UPLOAD)
+ {
+ getChild<LLView>("close")->setVisible(true);
+ getChild<LLView>("back")->setVisible(false);
+ getChild<LLView>("upload")->setVisible(false);
+ getChild<LLView>("cancel")->setVisible(false);
}
}
@@ -227,6 +260,161 @@ BOOL LLFloaterModelWizard::handleScrollWheel(S32 x, S32 y, S32 clicks)
return TRUE;
}
+void LLFloaterModelWizard::initDecompControls()
+{
+ LLSD key;
+
+ static const LLCDStageData* stage = NULL;
+ static S32 stage_count = 0;
+
+ if (!stage && LLConvexDecomposition::getInstance() != NULL)
+ {
+ stage_count = LLConvexDecomposition::getInstance()->getStages(&stage);
+ }
+
+ static const LLCDParam* param = NULL;
+ static S32 param_count = 0;
+ if (!param && LLConvexDecomposition::getInstance() != NULL)
+ {
+ param_count = LLConvexDecomposition::getInstance()->getParameters(&param);
+ }
+
+ for (S32 j = stage_count-1; j >= 0; --j)
+ {
+ gMeshRepo.mDecompThread->mStageID[stage[j].mName] = j;
+ // protected against stub by stage_count being 0 for stub above
+ LLConvexDecomposition::getInstance()->registerCallback(j, LLPhysicsDecomp::llcdCallback);
+
+ for (S32 i = 0; i < param_count; ++i)
+ {
+ if (param[i].mStage != j)
+ {
+ 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)
+ {
+ mDecompParams[param[i].mName] = LLSD(param[i].mDefault.mFloat);
+ }
+ else if (param[i].mType == LLCDParam::LLCD_INTEGER)
+ {
+ mDecompParams[param[i].mName] = LLSD(param[i].mDefault.mIntOrEnumValue);
+ }
+ else if (param[i].mType == LLCDParam::LLCD_BOOLEAN)
+ {
+ mDecompParams[param[i].mName] = LLSD(param[i].mDefault.mBool);
+ }
+ else if (param[i].mType == LLCDParam::LLCD_ENUM)
+ {
+ mDecompParams[param[i].mName] = LLSD(param[i].mDefault.mIntOrEnumValue);
+ }
+ }
+ }
+
+ mDecompParams["Simplify Method"] = 0; // set it to retain %
+}
+
+//static
+void LLFloaterModelWizard::executePhysicsStage(std::string stage_name)
+{
+ if (sInstance)
+ {
+ F64 physics_accuracy = sInstance->getChild<LLSliderCtrl>("physics_slider")->getValue().asReal();
+
+ sInstance->mDecompParams["Retain%"] = physics_accuracy;
+
+ if (!sInstance->mCurRequest.empty())
+ {
+ llinfos << "Decomposition request still pending." << llendl;
+ return;
+ }
+
+ if (sInstance->mModelPreview)
+ {
+ for (S32 i = 0; i < sInstance->mModelPreview->mModel[LLModel::LOD_PHYSICS].size(); ++i)
+ {
+ LLModel* mdl = sInstance->mModelPreview->mModel[LLModel::LOD_PHYSICS][i];
+ DecompRequest* request = new DecompRequest(stage_name, mdl);
+ sInstance->mCurRequest.insert(request);
+ gMeshRepo.mDecompThread->submitRequest(request);
+ }
+ }
+ }
+}
+
+LLFloaterModelWizard::DecompRequest::DecompRequest(const std::string& stage, LLModel* mdl)
+{
+ mStage = stage;
+ mContinue = 1;
+ mModel = mdl;
+ mDecompID = &mdl->mDecompID;
+ mParams = sInstance->mDecompParams;
+
+ //copy out positions and indices
+ if (mdl)
+ {
+ U16 index_offset = 0;
+
+ mPositions.clear();
+ mIndices.clear();
+
+ //queue up vertex positions and indices
+ for (S32 i = 0; i < mdl->getNumVolumeFaces(); ++i)
+ {
+ const LLVolumeFace& face = mdl->getVolumeFace(i);
+ if (mPositions.size() + face.mNumVertices > 65535)
+ {
+ continue;
+ }
+
+ for (U32 j = 0; j < face.mNumVertices; ++j)
+ {
+ mPositions.push_back(LLVector3(face.mPositions[j].getF32ptr()));
+ }
+
+ for (U32 j = 0; j < face.mNumIndices; ++j)
+ {
+ mIndices.push_back(face.mIndices[j]+index_offset);
+ }
+
+ index_offset += face.mNumVertices;
+ }
+ }
+}
+
+
+S32 LLFloaterModelWizard::DecompRequest::statusCallback(const char* status, S32 p1, S32 p2)
+{
+ setStatusMessage(llformat("%s: %d/%d", status, p1, p2));
+
+ return mContinue;
+}
+
+void LLFloaterModelWizard::DecompRequest::completed()
+{ //called from the main thread
+ mModel->setConvexHullDecomposition(mHull);
+
+ if (sInstance)
+ {
+ if (sInstance->mModelPreview)
+ {
+ sInstance->mModelPreview->mPhysicsMesh[mModel] = mHullMesh;
+ sInstance->mModelPreview->mDirty = true;
+ LLFloaterModelWizard::sInstance->mModelPreview->refresh();
+ }
+
+ sInstance->mCurRequest.erase(this);
+ }
+
+ if (mStage == "Decompose")
+ {
+ executePhysicsStage("Simplify");
+ }
+}
+
BOOL LLFloaterModelWizard::postBuild()
{
@@ -236,13 +424,13 @@ BOOL LLFloaterModelWizard::postBuild()
getChild<LLUICtrl>("browse")->setCommitCallback(boost::bind(&LLFloaterModelWizard::loadModel, this));
getChild<LLUICtrl>("cancel")->setCommitCallback(boost::bind(&LLFloaterModelWizard::onClickCancel, this));
+ getChild<LLUICtrl>("close")->setCommitCallback(boost::bind(&LLFloaterModelWizard::onClickCancel, this));
getChild<LLUICtrl>("back")->setCommitCallback(boost::bind(&LLFloaterModelWizard::onClickBack, this));
getChild<LLUICtrl>("next")->setCommitCallback(boost::bind(&LLFloaterModelWizard::onClickNext, this));
- childSetCommitCallback("preview_lod_combo", onPreviewLODCommit, this);
+ getChild<LLUICtrl>("preview_lod_combo")->setCommitCallback(boost::bind(&LLFloaterModelWizard::onPreviewLODCommit, this, _1));
getChild<LLUICtrl>("accuracy_slider")->setCommitCallback(boost::bind(&LLFloaterModelWizard::onAccuracyPerformance, this, _2));
-
- childSetAction("ok_btn", onUpload, this);
-
+ getChild<LLUICtrl>("upload")->setCommitCallback(boost::bind(&LLFloaterModelWizard::onUpload, this));
+
LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar;
enable_registrar.add("Next.OnEnable", boost::bind(&LLFloaterModelWizard::onEnableNext, this));
@@ -262,19 +450,20 @@ BOOL LLFloaterModelWizard::postBuild()
childSetTextArg("import_dimensions", "[Y]", LLStringUtil::null);
childSetTextArg("import_dimensions", "[Z]", LLStringUtil::null);
+ initDecompControls();
+
return TRUE;
}
-void LLFloaterModelWizard::onUpload(void* user_data)
-{
- LLFloaterModelWizard* mp = (LLFloaterModelWizard*) user_data;
+void LLFloaterModelWizard::onUpload()
+{
+ mModelPreview->rebuildUploadData();
- mp->mModelPreview->rebuildUploadData();
+ gMeshRepo.uploadModel(mModelPreview->mUploadData, mModelPreview->mPreviewScale,
+ childGetValue("upload_textures").asBoolean(), childGetValue("upload_skin"), childGetValue("upload_joints"));
- gMeshRepo.uploadModel(mp->mModelPreview->mUploadData, mp->mModelPreview->mPreviewScale,
- mp->childGetValue("upload_textures").asBoolean(), mp->childGetValue("upload_skin"), mp->childGetValue("upload_joints"));
+ setState(UPLOAD);
- mp->closeFloater(false);
}
@@ -287,11 +476,9 @@ void LLFloaterModelWizard::onAccuracyPerformance(const LLSD& data)
mModelPreview->refresh();
}
-void LLFloaterModelWizard::onPreviewLODCommit(LLUICtrl* ctrl, void* userdata)
+void LLFloaterModelWizard::onPreviewLODCommit(LLUICtrl* ctrl)
{
- LLFloaterModelWizard *fp =(LLFloaterModelWizard *)userdata;
-
- if (!fp->mModelPreview)
+ if (!mModelPreview)
{
return;
}
@@ -302,7 +489,7 @@ void LLFloaterModelWizard::onPreviewLODCommit(LLUICtrl* ctrl, void* userdata)
which_mode = (NUM_LOD-1)-combo->getFirstSelectedIndex(); // combo box list of lods is in reverse order
- fp->mModelPreview->setPreviewLOD(which_mode);
+ mModelPreview->setPreviewLOD(which_mode);
}
void LLFloaterModelWizard::draw()