diff options
| -rwxr-xr-x | indra/newview/llfloatermodelpreview.cpp | 56 | ||||
| -rw-r--r-- | indra/newview/llfloatermodelpreview.h | 668 | ||||
| -rw-r--r-- | indra/newview/llfloatermodelwizard.cpp | 223 | ||||
| -rw-r--r-- | indra/newview/llfloatermodelwizard.h | 36 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/floater_model_wizard.xml | 1392 | 
5 files changed, 1367 insertions, 1008 deletions
| diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp index 552e1d9fe1..a1c2265f62 100755 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -276,7 +276,10 @@ BOOL LLFloaterModelPreview::postBuild()  		return FALSE;
  	}
 -	setViewOption("show_textures", true);
 +
 +
 +
 +
  	childSetAction("lod_browse", onBrowseLOD, this);
 @@ -393,13 +396,22 @@ LLFloaterModelPreview::~LLFloaterModelPreview()  void LLFloaterModelPreview::onViewOptionChecked(const LLSD& userdata)
  {
 -	mViewOption[userdata.asString()] = !mViewOption[userdata.asString()];
 -	mModelPreview->refresh();
 +	if (mModelPreview)
 +	{
 +		mModelPreview->mViewOption[userdata.asString()] = !mModelPreview->mViewOption[userdata.asString()];
 +		
 +		mModelPreview->refresh();
 +	}
  }
  bool LLFloaterModelPreview::isViewOptionChecked(const LLSD& userdata)
  {
 -	return mViewOption[userdata.asString()];
 +	if (mModelPreview)
 +	{
 +		return mModelPreview->mViewOption[userdata.asString()];
 +	}
 +
 +	return false;
  }
  bool LLFloaterModelPreview::isViewOptionEnabled(const LLSD& userdata)
 @@ -422,11 +434,6 @@ void LLFloaterModelPreview::disableViewOption(const std::string& option)  	setViewOptionEnabled(option, false);
  }
 -void LLFloaterModelPreview::setViewOption(const std::string& option, bool value)
 -{
 -	mViewOption[option] = value;
 -}
 -
  void LLFloaterModelPreview::loadModel(S32 lod)
  {
  	mModelPreview->mLoading = true;
 @@ -2031,6 +2038,8 @@ LLModelPreview::LLModelPreview(S32 width, S32 height, LLFloater* fmp)  	mBuildBorderMode = GLOD_BORDER_UNLOCK;
  	mBuildOperator = GLOD_OPERATOR_HALF_EDGE_COLLAPSE;
 +	mViewOption["show_textures"] = false;
 +
  	mFMP = fmp;
  	glodInit();
 @@ -3279,13 +3288,14 @@ void LLModelPreview::updateStatusMessages()  			if (!fmp->isViewOptionEnabled("show_physics"))
  			{
  				fmp->enableViewOption("show_physics");
 -				fmp->setViewOption("show_physics", true);
 +				mViewOption["show_physics"] = true;
  			}
  		}
  		else
  		{
  			fmp->disableViewOption("show_physics");
 -			fmp->setViewOption("show_physics", false);
 +			mViewOption["show_physics"] = false;
 +
  		}
  		//bool use_hull = fmp->childGetValue("physics_use_hull").asBoolean();
 @@ -3610,21 +3620,11 @@ BOOL LLModelPreview::render()  	LLMutexLock lock(this);
  	mNeedsUpdate = FALSE;
 -	bool edges = false;
 -	bool joint_positions = false;
 -	bool skin_weight = false;
 -	bool textures = false;
 -	bool physics = false;
 -
 -	LLFloaterModelPreview* fmp = LLFloaterModelPreview::sInstance;
 -	if (fmp)
 -	{
 -		edges = fmp->isViewOptionChecked("show_edges");
 -		joint_positions = fmp->isViewOptionChecked("show_joint_positions");
 -		skin_weight = fmp->isViewOptionChecked("show_skin_weight");
 -		textures = fmp->isViewOptionChecked("show_textures");
 -		physics = fmp->isViewOptionChecked("show_physics");
 -	}
 +	bool edges = mViewOption["show_edges"];
 +	bool joint_positions = mViewOption["show_joint_positions"];
 +	bool skin_weight = mViewOption["show_skin_weight"];
 +	bool textures = mViewOption["show_textures"];
 +	bool physics = mViewOption["show_physics"];
  	S32 width = getWidth();
  	S32 height = getHeight();
 @@ -3657,6 +3657,8 @@ BOOL LLModelPreview::render()  		gGL.popMatrix();
  	}
 +	LLFloaterModelPreview* fmp = LLFloaterModelPreview::sInstance;
 +	
  	bool has_skin_weights = false;
  	bool upload_skin = mFMP->childGetValue("upload_skin").asBoolean();
  	bool upload_joints = mFMP->childGetValue("upload_joints").asBoolean();
 @@ -3688,7 +3690,7 @@ BOOL LLModelPreview::render()  		mFMP->childDisable("upload_skin");
  		if (fmp)
  		{
 -			fmp->setViewOption("show_skin_weight", false);
 +			mViewOption["show_skin_weight"] = false;
  			fmp->disableViewOption("show_skin_weight");
  			fmp->disableViewOption("show_joint_positions");
  		}
 diff --git a/indra/newview/llfloatermodelpreview.h b/indra/newview/llfloatermodelpreview.h index 48263d493a..df1b06aeaf 100644 --- a/indra/newview/llfloatermodelpreview.h +++ b/indra/newview/llfloatermodelpreview.h @@ -1,337 +1,333 @@ -/**
 - * @file llfloatermodelpreview.h
 - * @brief LLFloaterModelPreview class definition
 - *
 - * $LicenseInfo:firstyear=2004&license=viewerlgpl$
 - * Second Life Viewer Source Code
 - * Copyright (C) 2010, Linden Research, Inc.
 - * 
 - * This library is free software; you can redistribute it and/or
 - * modify it under the terms of the GNU Lesser General Public
 - * License as published by the Free Software Foundation;
 - * version 2.1 of the License only.
 - * 
 - * This library is distributed in the hope that it will be useful,
 - * but WITHOUT ANY WARRANTY; without even the implied warranty of
 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 - * Lesser General Public License for more details.
 - * 
 - * You should have received a copy of the GNU Lesser General Public
 - * License along with this library; if not, write to the Free Software
 - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 - * 
 - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
 - * $/LicenseInfo$
 - */
 -
 -#ifndef LL_LLFLOATERMODELPREVIEW_H
 -#define LL_LLFLOATERMODELPREVIEW_H
 -
 -#include "llfloaternamedesc.h"
 -
 -#include "lldynamictexture.h"
 -#include "llquaternion.h"
 -#include "llmeshrepository.h"
 -#include "llmodel.h"
 -#include "llthread.h"
 -#include "llviewermenufile.h"
 -
 -class LLComboBox;
 -class LLJoint;
 -class LLViewerJointMesh;
 -class LLVOAvatar;
 -class LLTextBox;
 -class LLVertexBuffer;
 -class LLModelPreview;
 -class LLFloaterModelPreview;
 -class daeElement;
 -class domProfile_COMMON;
 -class domInstance_geometry;
 -class domNode;
 -class domTranslate;
 -class LLMenuButton;
 -class LLToggleableMenu;
 -
 -const S32 NUM_LOD = 4;
 -
 -class LLModelLoader : public LLThread
 -{
 -public:
 -	typedef enum
 -	{
 -		STARTING = 0,
 -		READING_FILE,
 -		CREATING_FACES,
 -		GENERATING_VERTEX_BUFFERS,
 -		GENERATING_LOD,
 -		DONE,
 -		ERROR_PARSING, //basically loading failed
 -	} eLoadState;
 -
 -	U32 mState;
 -	std::string mFilename;
 -	S32 mLod;
 -	LLModelPreview* mPreview;
 -	LLMatrix4 mTransform;
 -	BOOL mFirstTransform;
 -	LLVector3 mExtents[2];
 -
 -	std::map<daeElement*, LLPointer<LLModel> > mModel;
 -	
 -	typedef std::vector<LLPointer<LLModel> > model_list;
 -	model_list mModelList;
 -
 -	typedef std::vector<LLModelInstance> model_instance_list;
 -	
 -	typedef std::map<LLMatrix4, model_instance_list > scene;
 -
 -	scene mScene;
 -
 -	typedef std::queue<LLPointer<LLModel> > model_queue;
 -
 -	//queue of models that need a physics rep
 -	model_queue mPhysicsQ;
 -
 -	LLModelLoader(std::string filename, S32 lod, LLModelPreview* preview);
 -
 -	virtual void run();
 -	
 -	void processElement(daeElement* element);
 -	std::vector<LLImportMaterial> getMaterials(LLModel* model, domInstance_geometry* instance_geo);
 -	LLImportMaterial profileToMaterial(domProfile_COMMON* material);
 -	std::string getElementLabel(daeElement *element);
 -	LLColor4 getDaeColor(daeElement* element);
 -	
 -	daeElement* getChildFromElement( daeElement* pElement, std::string const & name );
 -	
 -	bool isNodeAJoint( domNode* pNode );
 -	void processJointNode( domNode* pNode, std::map<std::string,LLMatrix4>& jointTransforms );
 -	void extractTranslation( domTranslate* pTranslate, LLMatrix4& transform );
 -	void extractTranslationViaElement( daeElement* pTranslateElement, LLMatrix4& transform );
 -	
 -	void setLoadState( U32 state ) { mState = state; }
 -	U32 getLoadState( void ) { return mState; }
 -	
 -	//map of avatar joints as named in COLLADA assets to internal joint names
 -	std::map<std::string, std::string> mJointMap;
 -};
 -
 -class LLFloaterModelPreview : public LLFloater
 -{
 -public:
 -	
 -	class DecompRequest : public LLPhysicsDecomp::Request
 -	{
 -	public:
 -		S32 mContinue;
 -		LLPointer<LLModel> mModel;
 -		
 -		DecompRequest(const std::string& stage, LLModel* mdl);
 -		virtual S32 statusCallback(const char* status, S32 p1, S32 p2);
 -		virtual void completed();
 -		
 -	};
 -	static LLFloaterModelPreview* sInstance;
 -	
 -	LLFloaterModelPreview(const LLSD& key);
 -	virtual ~LLFloaterModelPreview();
 -	
 -	virtual BOOL postBuild();
 -	
 -	BOOL handleMouseDown(S32 x, S32 y, MASK mask);
 -	BOOL handleMouseUp(S32 x, S32 y, MASK mask);
 -	BOOL handleHover(S32 x, S32 y, MASK mask);
 -	BOOL handleScrollWheel(S32 x, S32 y, S32 clicks); 
 -	
 -	static void onMouseCaptureLostModelPreview(LLMouseHandler*);
 -	static void setUploadAmount(S32 amount) { sUploadAmount = amount; }
 -	
 -	static void onBrowseLOD(void* data);
 -	
 -	static void onUpload(void* data);
 -	
 -	static void onClearMaterials(void* data);
 -	static void onModelDecompositionComplete(LLModel* model, std::vector<LLPointer<LLVertexBuffer> >& physics_mesh);
 -	
 -	static void refresh(LLUICtrl* ctrl, void* data);
 -	
 -	void updateResourceCost();
 -	
 -	void			loadModel(S32 lod);
 -	
 -	void onViewOptionChecked(const LLSD& userdata);
 -	bool isViewOptionChecked(const LLSD& userdata);
 -	bool isViewOptionEnabled(const LLSD& userdata);
 -	void setViewOptionEnabled(const std::string& option, bool enabled);
 -	void enableViewOption(const std::string& option);
 -	void disableViewOption(const std::string& option);
 -	void setViewOption(const std::string& option, bool value);
 -
 -protected:
 -	friend class LLModelPreview;
 -	friend class LLMeshFilePicker;
 -	friend class LLPhysicsDecomp;
 -	
 -	static void		onImportScaleCommit(LLUICtrl*, void*);
 -	static void		onUploadJointsCommit(LLUICtrl*,void*);
 -	static void		onUploadSkinCommit(LLUICtrl*,void*);
 -	
 -	static void		onPreviewLODCommit(LLUICtrl*,void*);
 -	
 -	static void		onGenerateNormalsCommit(LLUICtrl*,void*);
 -	
 -	static void		onAutoFillCommit(LLUICtrl*,void*);
 -	static void		onLODParamCommit(LLUICtrl*,void*);
 -	
 -	static void		onExplodeCommit(LLUICtrl*, void*);
 -	
 -	static void onPhysicsParamCommit(LLUICtrl* ctrl, void* userdata);
 -	static void onPhysicsStageExecute(LLUICtrl* ctrl, void* userdata);
 -	static void onPhysicsStageCancel(LLUICtrl* ctrl, void* userdata);
 -	
 -	static void onPhysicsBrowse(LLUICtrl* ctrl, void* userdata);
 -	static void onPhysicsUseLOD(LLUICtrl* ctrl, void* userdata);
 -	static void onPhysicsOptimize(LLUICtrl* ctrl, void* userdata);
 -	static void onPhysicsDecomposeBack(LLUICtrl* ctrl, void* userdata);
 -	static void onPhysicsSimplifyBack(LLUICtrl* ctrl, void* userdata);
 -		
 -	void			draw();
 -	
 -	void initDecompControls();
 -	
 -	void setStatusMessage(const std::string& msg);
 -
 -	LLModelPreview*	mModelPreview;
 -	
 -	LLPhysicsDecomp::decomp_params mDecompParams;
 -	
 -	S32				mLastMouseX;
 -	S32				mLastMouseY;
 -	LLRect			mPreviewRect;
 -	U32				mGLName;
 -	static S32		sUploadAmount;
 -	
 -	std::set<LLPointer<DecompRequest> > mCurRequest;
 -	std::string mStatusMessage;
 -
 +/** + * @file llfloatermodelpreview.h + * @brief LLFloaterModelPreview class definition + * + * $LicenseInfo:firstyear=2004&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +#ifndef LL_LLFLOATERMODELPREVIEW_H +#define LL_LLFLOATERMODELPREVIEW_H + +#include "llfloaternamedesc.h" + +#include "lldynamictexture.h" +#include "llquaternion.h" +#include "llmeshrepository.h" +#include "llmodel.h" +#include "llthread.h" +#include "llviewermenufile.h" + +class LLComboBox; +class LLJoint; +class LLViewerJointMesh; +class LLVOAvatar; +class LLTextBox; +class LLVertexBuffer; +class LLModelPreview; +class LLFloaterModelPreview; +class daeElement; +class domProfile_COMMON; +class domInstance_geometry; +class domNode; +class domTranslate; +class LLMenuButton; +class LLToggleableMenu; + +const S32 NUM_LOD = 4; + +class LLModelLoader : public LLThread +{ +public: +	typedef enum +	{ +		STARTING = 0, +		READING_FILE, +		CREATING_FACES, +		GENERATING_VERTEX_BUFFERS, +		GENERATING_LOD, +		DONE, +		ERROR_PARSING, //basically loading failed +	} eLoadState; + +	U32 mState; +	std::string mFilename; +	S32 mLod; +	LLModelPreview* mPreview; +	LLMatrix4 mTransform; +	BOOL mFirstTransform; +	LLVector3 mExtents[2]; + +	std::map<daeElement*, LLPointer<LLModel> > mModel; +	 +	typedef std::vector<LLPointer<LLModel> > model_list; +	model_list mModelList; + +	typedef std::vector<LLModelInstance> model_instance_list; +	 +	typedef std::map<LLMatrix4, model_instance_list > scene; + +	scene mScene; + +	typedef std::queue<LLPointer<LLModel> > model_queue; + +	//queue of models that need a physics rep +	model_queue mPhysicsQ; + +	LLModelLoader(std::string filename, S32 lod, LLModelPreview* preview); + +	virtual void run(); +	 +	void processElement(daeElement* element); +	std::vector<LLImportMaterial> getMaterials(LLModel* model, domInstance_geometry* instance_geo); +	LLImportMaterial profileToMaterial(domProfile_COMMON* material); +	std::string getElementLabel(daeElement *element); +	LLColor4 getDaeColor(daeElement* element); +	 +	daeElement* getChildFromElement( daeElement* pElement, std::string const & name ); +	 +	bool isNodeAJoint( domNode* pNode ); +	void processJointNode( domNode* pNode, std::map<std::string,LLMatrix4>& jointTransforms ); +	void extractTranslation( domTranslate* pTranslate, LLMatrix4& transform ); +	void extractTranslationViaElement( daeElement* pTranslateElement, LLMatrix4& transform ); +	 +	void setLoadState( U32 state ) { mState = state; } +	U32 getLoadState( void ) { return mState; } +	 +	//map of avatar joints as named in COLLADA assets to internal joint names +	std::map<std::string, std::string> mJointMap; +}; + +class LLFloaterModelPreview : public LLFloater +{ +public: +	 +	class DecompRequest : public LLPhysicsDecomp::Request +	{ +	public: +		S32 mContinue; +		LLPointer<LLModel> mModel; +		 +		DecompRequest(const std::string& stage, LLModel* mdl); +		virtual S32 statusCallback(const char* status, S32 p1, S32 p2); +		virtual void completed(); +		 +	}; +	static LLFloaterModelPreview* sInstance; +	 +	LLFloaterModelPreview(const LLSD& key); +	virtual ~LLFloaterModelPreview(); +	 +	virtual BOOL postBuild(); +	 +	BOOL handleMouseDown(S32 x, S32 y, MASK mask); +	BOOL handleMouseUp(S32 x, S32 y, MASK mask); +	BOOL handleHover(S32 x, S32 y, MASK mask); +	BOOL handleScrollWheel(S32 x, S32 y, S32 clicks);  +	 +	static void onMouseCaptureLostModelPreview(LLMouseHandler*); +	static void setUploadAmount(S32 amount) { sUploadAmount = amount; } +	 +	static void onBrowseLOD(void* data); +	 +	static void onUpload(void* data); +	 +	static void onClearMaterials(void* data); +	 +	static void refresh(LLUICtrl* ctrl, void* data); +	 +	void updateResourceCost(); +	 +	void			loadModel(S32 lod); +	 +	void onViewOptionChecked(const LLSD& userdata); +	bool isViewOptionChecked(const LLSD& userdata); +	bool isViewOptionEnabled(const LLSD& userdata); +	void setViewOptionEnabled(const std::string& option, bool enabled); +	void enableViewOption(const std::string& option); +	void disableViewOption(const std::string& option); + +protected: +	friend class LLModelPreview; +	friend class LLMeshFilePicker; +	friend class LLPhysicsDecomp; +	 +	static void		onImportScaleCommit(LLUICtrl*, void*); +	static void		onUploadJointsCommit(LLUICtrl*,void*); +	static void		onUploadSkinCommit(LLUICtrl*,void*); +	 +	static void		onPreviewLODCommit(LLUICtrl*,void*); +	 +	static void		onGenerateNormalsCommit(LLUICtrl*,void*); +	 +	static void		onAutoFillCommit(LLUICtrl*,void*); +	static void		onLODParamCommit(LLUICtrl*,void*); +	 +	static void		onExplodeCommit(LLUICtrl*, void*); +	 +	static void onPhysicsParamCommit(LLUICtrl* ctrl, void* userdata); +	static void onPhysicsStageExecute(LLUICtrl* ctrl, void* userdata); +	static void onPhysicsStageCancel(LLUICtrl* ctrl, void* userdata); +	 +	static void onPhysicsBrowse(LLUICtrl* ctrl, void* userdata); +	static void onPhysicsUseLOD(LLUICtrl* ctrl, void* userdata); +	static void onPhysicsOptimize(LLUICtrl* ctrl, void* userdata); +	static void onPhysicsDecomposeBack(LLUICtrl* ctrl, void* userdata); +	static void onPhysicsSimplifyBack(LLUICtrl* ctrl, void* userdata); +		 +	void			draw(); +	 +	void initDecompControls(); +	 +	void setStatusMessage(const std::string& msg); + +	LLModelPreview*	mModelPreview; +	 +	LLPhysicsDecomp::decomp_params mDecompParams; +	 +	S32				mLastMouseX; +	S32				mLastMouseY; +	LLRect			mPreviewRect; +	U32				mGLName; +	static S32		sUploadAmount; +	 +	std::set<LLPointer<DecompRequest> > mCurRequest; +	std::string mStatusMessage; + +	//use "disabled" as false by default +	std::map<std::string, bool> mViewOptionDisabled; +	 +	//store which lod mode each LOD is using +	// 0 - load from file +	// 1 - auto generate +	// 2 - None +	S32 mLODMode[4]; + +	LLMenuButton* mViewOptionMenuButton; +	LLToggleableMenu* mViewOptionMenu; +	LLMutex* mStatusLock; +}; + +class LLMeshFilePicker : public LLFilePickerThread +{ +public: +	LLMeshFilePicker(LLModelPreview* mp, S32 lod); +	virtual void notify(const std::string& filename); + +private: +	LLModelPreview* mMP; +	S32 mLOD; +}; + + +class LLModelPreview : public LLViewerDynamicTexture, public LLMutex +{ + public: +	 +	 LLModelPreview(S32 width, S32 height, LLFloater* fmp); +	virtual ~LLModelPreview(); + +	void resetPreviewTarget(); +	void setPreviewTarget(F32 distance); +	void setTexture(U32 name) { mTextureName = name; } + +	void setPhysicsFromLOD(S32 lod); +	BOOL render(); +	void update(); +	void genBuffers(S32 lod, bool skinned); +	void clearBuffers(); +	void refresh(); +	void rotate(F32 yaw_radians, F32 pitch_radians); +	void zoom(F32 zoom_amt); +	void pan(F32 right, F32 up); +	virtual BOOL needsRender() { return mNeedsUpdate; } +	void setPreviewLOD(S32 lod); +	void clearModel(S32 lod); +	void loadModel(std::string filename, S32 lod); +	void loadModelCallback(S32 lod); +	void genLODs(S32 which_lod = -1, U32 decimation = 3); +	void generateNormals(); +	void consolidate(); +	void clearMaterials(); +	U32 calcResourceCost(); +	void rebuildUploadData(); +	void clearIncompatible(S32 lod); +	void updateStatusMessages(); +	bool containsRiggedAsset( void ); +	void clearGLODGroup(); + + +	static void	textureLoadedCallback( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* src_aux, S32 discard_level, BOOL final, void* userdata ); + + protected: +	friend class LLFloaterModelPreview; +	friend class LLFloaterModelWizard; +	friend class LLFloaterModelPreview::DecompRequest; +	friend class LLPhysicsDecomp; + +	LLFloater*  mFMP; + +	BOOL        mNeedsUpdate; +	bool		mDirty; +	bool		mGenLOD; +	U32         mTextureName; +	F32			mCameraDistance; +	F32			mCameraYaw; +	F32			mCameraPitch; +	F32			mCameraZoom; +	LLVector3	mCameraOffset; +	LLVector3	mPreviewTarget; +	LLVector3	mPreviewScale; +	S32			mPreviewLOD; +	U32			mResourceCost; +	std::string mLODFile[LLModel::NUM_LODS]; +	bool		mLoading; +  	std::map<std::string, bool> mViewOption;
 -
 -	//use "disabled" as false by default
 -	std::map<std::string, bool> mViewOptionDisabled;
 -	
 -	//store which lod mode each LOD is using
 -	// 0 - load from file
 -	// 1 - auto generate
 -	// 2 - None
 -	S32 mLODMode[4];
 -
 -	LLMenuButton* mViewOptionMenuButton;
 -	LLToggleableMenu* mViewOptionMenu;
 -	LLMutex* mStatusLock;
 -};
 -
 -class LLMeshFilePicker : public LLFilePickerThread
 -{
 -public:
 -	LLMeshFilePicker(LLModelPreview* mp, S32 lod);
 -	virtual void notify(const std::string& filename);
 -
 -private:
 -	LLModelPreview* mMP;
 -	S32 mLOD;
 -};
 -
 -
 -class LLModelPreview : public LLViewerDynamicTexture, public LLMutex
 -{
 - public:
 -	
 -	 LLModelPreview(S32 width, S32 height, LLFloater* fmp);
 -	virtual ~LLModelPreview();
 -
 -	void resetPreviewTarget();
 -	void setPreviewTarget(F32 distance);
 -	void setTexture(U32 name) { mTextureName = name; }
 -
 -	void setPhysicsFromLOD(S32 lod);
 -	BOOL render();
 -	void update();
 -	void genBuffers(S32 lod, bool skinned);
 -	void clearBuffers();
 -	void refresh();
 -	void rotate(F32 yaw_radians, F32 pitch_radians);
 -	void zoom(F32 zoom_amt);
 -	void pan(F32 right, F32 up);
 -	virtual BOOL needsRender() { return mNeedsUpdate; }
 -	void setPreviewLOD(S32 lod);
 -	void clearModel(S32 lod);
 -	void loadModel(std::string filename, S32 lod);
 -	void loadModelCallback(S32 lod);
 -	void genLODs(S32 which_lod = -1, U32 decimation = 3);
 -	void generateNormals();
 -	void consolidate();
 -	void clearMaterials();
 -	U32 calcResourceCost();
 -	void rebuildUploadData();
 -	void clearIncompatible(S32 lod);
 -	void updateStatusMessages();
 -	bool containsRiggedAsset( void );
 -	void clearGLODGroup();
 -
 -
 -	static void	textureLoadedCallback( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* src_aux, S32 discard_level, BOOL final, void* userdata );
 -
 - protected:
 -	friend class LLFloaterModelPreview;
 -	friend class LLFloaterModelWizard;
 -	friend class LLFloaterModelPreview::DecompRequest;
 -	friend class LLPhysicsDecomp;
 -
 -	LLFloater*  mFMP;
 -
 -	BOOL        mNeedsUpdate;
 -	bool		mDirty;
 -	bool		mGenLOD;
 -	U32         mTextureName;
 -	F32			mCameraDistance;
 -	F32			mCameraYaw;
 -	F32			mCameraPitch;
 -	F32			mCameraZoom;
 -	LLVector3	mCameraOffset;
 -	LLVector3	mPreviewTarget;
 -	LLVector3	mPreviewScale;
 -	S32			mPreviewLOD;
 -	U32			mResourceCost;
 -	std::string mLODFile[LLModel::NUM_LODS];
 -	bool		mLoading;
 -
 -	//GLOD object parameters (must rebuild object if these change)
 -	F32 mBuildShareTolerance;
 -	U32 mBuildQueueMode;
 -	U32 mBuildOperator;
 -	U32 mBuildBorderMode;
 -	
 -
 -	LLModelLoader* mModelLoader;
 -
 -
 -	LLModelLoader::scene mScene[LLModel::NUM_LODS];
 -	LLModelLoader::scene mBaseScene;
 -
 -	LLModelLoader::model_list mModel[LLModel::NUM_LODS];
 -	LLModelLoader::model_list mBaseModel;
 -
 -	U32 mGroup;
 -	std::map<LLPointer<LLModel>, U32> mObject;
 -	U32 mMaxTriangleLimit;
 -	std::map<LLPointer<LLModel>, std::vector<LLPointer<LLVertexBuffer> > > mPhysicsMesh;
 -
 -	LLMeshUploadThread::instance_list mUploadData;
 -	std::set<LLPointer<LLViewerFetchedTexture> > mTextureSet;
 -
 -	//map of vertex buffers to models (one vertex buffer in vector per face in model
 -	std::map<LLModel*, std::vector<LLPointer<LLVertexBuffer> > > mVertexBuffer[LLModel::NUM_LODS+1];
 -};
 -
 -
 -#endif  // LL_LLFLOATERMODELPREVIEW_H
 + +	//GLOD object parameters (must rebuild object if these change) +	F32 mBuildShareTolerance; +	U32 mBuildQueueMode; +	U32 mBuildOperator; +	U32 mBuildBorderMode; +	 +	LLModelLoader* mModelLoader; + +	LLModelLoader::scene mScene[LLModel::NUM_LODS]; +	LLModelLoader::scene mBaseScene; + +	LLModelLoader::model_list mModel[LLModel::NUM_LODS]; +	LLModelLoader::model_list mBaseModel; + +	U32 mGroup; +	std::map<LLPointer<LLModel>, U32> mObject; +	U32 mMaxTriangleLimit; +	std::map<LLPointer<LLModel>, std::vector<LLPointer<LLVertexBuffer> > > mPhysicsMesh; + +	LLMeshUploadThread::instance_list mUploadData; +	std::set<LLPointer<LLViewerFetchedTexture> > mTextureSet; + +	//map of vertex buffers to models (one vertex buffer in vector per face in model +	std::map<LLModel*, std::vector<LLPointer<LLVertexBuffer> > > mVertexBuffer[LLModel::NUM_LODS+1]; +}; + + +#endif  // LL_LLFLOATERMODELPREVIEW_H 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(¶m); +	} + +	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() diff --git a/indra/newview/llfloatermodelwizard.h b/indra/newview/llfloatermodelwizard.h index b7fd28aa9d..eaf188ed40 100644 --- a/indra/newview/llfloatermodelwizard.h +++ b/indra/newview/llfloatermodelwizard.h @@ -26,13 +26,35 @@  #ifndef LLFLOATERMODELWIZARD_H  #define LLFLOATERMODELWIZARD_H + +#include "llmeshrepository.h" +#include "llmodel.h" +#include "llthread.h" + +  class LLModelPreview; +  class LLFloaterModelWizard : public LLFloater  {  public: +	 +	class DecompRequest : public LLPhysicsDecomp::Request +	{ +	public: +		S32 mContinue; +		LLPointer<LLModel> mModel; +		 +		DecompRequest(const std::string& stage, LLModel* mdl); +		virtual S32 statusCallback(const char* status, S32 p1, S32 p2); +		virtual void completed(); +		 +	}; +	 +	static LLFloaterModelWizard* sInstance; +  	LLFloaterModelWizard(const LLSD& key); -	virtual ~LLFloaterModelWizard() {}; +	virtual ~LLFloaterModelWizard();  	/*virtual*/	BOOL	postBuild();  	void			draw(); @@ -41,6 +63,14 @@ public:  	BOOL handleHover(S32 x, S32 y, MASK mask);  	BOOL handleScrollWheel(S32 x, S32 y, S32 clicks);  +	 +	void initDecompControls(); +	 +	LLPhysicsDecomp::decomp_params mDecompParams; +	std::set<LLPointer<DecompRequest> > mCurRequest; +	std::string mStatusMessage; +	static void executePhysicsStage(std::string stage_name); +  private:  	enum EWizardState  	{ @@ -59,9 +89,9 @@ private:  	bool onEnableNext();  	bool onEnableBack();  	void loadModel(); -	static void	onPreviewLODCommit(LLUICtrl*,void*); +	void onPreviewLODCommit(LLUICtrl*);  	void onAccuracyPerformance(const LLSD& data); -	static void onUpload(void* data); +	void onUpload();  	LLModelPreview*	mModelPreview;  	LLRect			mPreviewRect; diff --git a/indra/newview/skins/default/xui/en/floater_model_wizard.xml b/indra/newview/skins/default/xui/en/floater_model_wizard.xml index 0f8844519a..e2ec557b06 100644 --- a/indra/newview/skins/default/xui/en/floater_model_wizard.xml +++ b/indra/newview/skins/default/xui/en/floater_model_wizard.xml @@ -1,624 +1,768 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 -<floater
 - legacy_header_height="18"
 - layout="topleft"
 - name="Model Wizard"
 - help_topic="model_wizard"
 - bg_opaque_image_overlay="0.5 0.5 0.5 1"
 - height="450"
 - save_rect="true"
 - title="UPLOAD MODEL WIZARD"
 - width="530">
 -	<button
 -	 top="30"
 -	 tab_stop="false"
 -	 left="410"
 -	 height="32"
 -	 name="upload_btn"
 -	 enabled="false"
 -	 label="5. Upload"
 -	 border="false"
 -	 image_unselected="model_wizard/middle_button_off.png"
 -	 image_selected="model_wizard/middle_button_press.png"
 -	 image_hover_unselected="model_wizard/middle_button_over.png"
 -	 image_disabled="model_wizard/middle_button_disabled.png"
 -	 image_disabled_selected="model_wizard/middle_button_disabled.png"
 -	 width="110"/>
 -	<button
 -	 top="30"
 -	 left="310"
 -	 height="32"
 -	 tab_stop="false"
 -	 name="review_btn"
 -	 label="4. Review"
 -	 enabled="false"
 -	 border="false"
 -	 image_unselected="model_wizard/middle_button_off.png"
 -	 image_selected="model_wizard/middle_button_press.png"
 -	 image_hover_unselected="model_wizard/middle_button_over.png"
 -	 image_disabled="model_wizard/middle_button_disabled.png"
 -	 image_disabled_selected="model_wizard/middle_button_disabled.png"
 -	 width="110"/>
 -	<button
 -	 top="30"
 -	 left="210"
 -	 height="32"
 -	 name="physics_btn"
 -	 label="3. Physics"
 -	 tab_stop="false"
 -	 enabled="false"
 -	 border="false"
 -	 image_unselected="model_wizard/middle_button_off.png"
 -	 image_selected="model_wizard/middle_button_press.png"
 -	 image_hover_unselected="model_wizard/middle_button_over.png"
 -	 image_disabled="model_wizard/middle_button_disabled.png"
 -	 image_disabled_selected="model_wizard/middle_button_disabled.png"
 -	 width="110"/>
 -	<button
 -	 top="30"
 -	 left="115"
 -	 name="optimize_btn"
 -	 label="2. Optimize"
 -	 tab_stop="false"
 -	 height="32"
 -	 border="false"
 -	 image_unselected="model_wizard/middle_button_off.png"
 -	 image_selected="model_wizard/middle_button_press.png"
 -	 image_hover_unselected="model_wizard/middle_button_over.png"
 -	 image_disabled="model_wizard/middle_button_disabled.png"
 -	 image_disabled_selected="model_wizard/middle_button_disabled.png"
 -	 width="110"/>
 -	<button
 -	 top="30"
 -	 left="15"
 -	 name="choose_file_btn"
 -	 tab_stop="false"
 -	 enabled="false"
 -	 label="1. Choose File"
 -	 height="32"
 -	 image_unselected="model_wizard/left_button_off.png"
 -	 image_selected="model_wizard/left_button_press.png"
 -	 image_hover_unselected="model_wizard/left_button_over.png"
 -	 image_disabled="model_wizard/left_button_disabled.png"
 -	 image_disabled_selected="model_wizard/left_button_disabled.png"
 -	 width="110"/>
 -	<panel
 -		 height="388"
 -		 top_pad="0"
 -		 name="choose_file_panel"
 -		 visible="false"
 -		 width="530"
 -		 left="0">
 -		<panel
 -		 height="20"
 -		 top_pad="20"
 -		 width="500"
 -		 name="header_panel"
 -		 bg_opaque_color="DkGray2"
 -		 background_visible="true"
 -		 background_opaque="true"
 -		 left="20">
 -			<text
 -			 width="200"
 -			 left="10"
 -			 top="2"
 -			 name="header_text"
 -			 height="10"
 -			 font="SansSerifBig"
 -			 layout="topleft">
 -				Upload Model
 -			</text>
 -		</panel>
 -		<text
 -		 top_pad="14"
 -		 width="460"
 -		 height="20"
 -		 name="description"
 -		 font="SansSerifSmall"
 -		 layout="topleft"
 -		 word_wrap="true"
 -		 left_delta="0">
 -			This wizard will help you import mesh models to Second Life.  First specify a file containing the model you wish to import.  Second Life supports COLLADA (.dae) files.
 -		</text>
 -		<panel
 -		 top_delta="40"
 -		 left="15"
 -		 height="245"
 -		 width="500"
 -		 name="content"
 -		 bg_opaque_color="DkGray2"
 -		 background_visible="true"
 -		 background_opaque="true">
 -			<text
 -			 type="string"
 -			 length="1"
 -			 text_color="White" 
 -			 follows="left|top"
 -			 top="10"
 -			 height="10"
 -			 layout="topleft"
 -			 left_delta="10"
 -			 name="Cache location"
 -			 width="300">
 -				Filename:
 -			</text>
 -			<line_editor
 -			 border_style="line"
 -			 border_thickness="1"
 -			 follows="left|top"
 -			 font="SansSerifSmall"
 -			 height="20"
 -			 layout="topleft"
 -			 left_delta="0"
 -			 max_length="4096"
 -			 name="lod_file"
 -			 top_pad="5"
 -			 width="220" />
 -			<button
 -			 follows="left|top"
 -			 height="23"
 -			 label="Browse..."
 -			 label_selected="Browse..."
 -			 layout="topleft"
 -			 left_pad="5"
 -			 name="browse"
 -			 top_delta="-1"
 -			 width="85">
 -			</button>
 -			<text
 -			 top_delta="-15"
 -			 width="200"
 -			 height="15"
 -			 font="SansSerifSmall"
 -			 layout="topleft"
 -			 text_color="White"
 -			 left_pad="19">
 -				Model Preview:
 -			</text>
 -			<!-- Placeholder panel for 3D preview render -->
 -			<panel
 -			 left_delta="0"
 -			 top_pad="0"
 -			 name="preview_panel"
 -			 bevel_style="none"
 -			 border_style="line"
 -			 border="true"
 -			 height="150"
 -			 follows="all"
 -			 width="150">
 -			</panel>
 -			<text
 -			 top_pad="10"
 -			 width="130"
 -			 height="15"
 -			 left="340"
 -			 text_color="White"
 -			 word_wrap="true">
 -				Dimensions (meters):
 -			</text>
 -			<text
 -			 top_pad="2"
 -			 width="160"
 -			 height="15"
 -			 name="import_dimensions"
 -			 left_delta="0">
 -				X:  [X] |Y:  [Y] |Z: [Z]
 -			</text>
 -			<text
 -			 top="100"
 -			 width="320"
 -			 height="15"
 -			 left="10"
 -			 text_color="White" 
 -			 word_wrap="true">
 -				Note:
 -			</text>
 -			<text
 -			 top_pad="0"
 -			 width="320"
 -			 height="40"
 -			 left="10"
 -			 word_wrap="true">
 -Advanced users familiar with 3d content creation tools may prefer to use the [secondlife:///app/floater/upload_model Advanced Mesh Import Window] .
 -			</text>
 -		</panel>
 -	</panel>
 -
 -
 -	<panel
 -		 height="388"
 -		 top_delta="0"
 -		 name="optimize_panel"
 -		 visible="true"
 -		 width="530"
 -		 left="0">
 -		<panel
 -		 height="20"
 -		 top_pad="20"
 -		 name="header_panel"
 -		 width="500"
 -		 bg_opaque_color="DkGray2"
 -		 background_visible="true"
 -		 background_opaque="true"
 -		 left="20">
 -			<text
 -			 width="200"
 -			 left="10"
 -			 name="header_text"
 -			 top="2"
 -			 height="10"
 -			 font="SansSerifBig"
 -			 layout="topleft">
 -				Optimize
 -			</text>
 -		</panel>
 -		<text
 -		 top_pad="14"
 -		 width="460"
 -		 height="20"
 -		 font="SansSerifSmall"
 -		 layout="topleft"
 -		 name="description"
 -		 word_wrap="true"
 -		 left_delta="0">
 -			This wizard is optimizing your model. This may take several minutes. To stop the process click the back button
 -		</text>
 -		<panel
 -		 top_delta="40"
 -		 visible="false"
 -		 left="15"
 -		 height="245"
 -		 width="500"
 -		 name="content"
 -		 bg_opaque_color="DkGray2"
 -		 background_visible="true"
 -		 background_opaque="true">
 -			<text
 -			 top="20"
 -			 width="300"
 -			 height="12"
 -			 font="SansSerifBold"
 -			 left="112">Generating Level of Detail</text>
 -			<progress_bar
 -			  name="optimize_progress_bar"
 -              image_fill="model_wizard\progress_light.png"
 -			  color_bg="1 1 1 1"
 -			  color_bar="1 1 1 0.96"
 -			  follows="left|right|top"
 -			  width="260"
 -			  height="16"
 -			  image_bar="model_wizard\progress_bar_bg.png"
 -			  top_pad="14"
 -			  left="110"/>
 -			<icon
 -			 top_pad="10"
 -			 left_delta="0"
 -			 width="13"
 -			 height="12"
 -			 image_name="model_wizard\check_mark.png"/>
 -			<text
 -			 top_delta="0"
 -			 left_delta="18"
 -			 name="high_detail_text"
 -			 width="200"
 -			 height="14">Generate Level of Detail: High</text>
 -			<icon
 -			 top_pad="10"
 -			 left_delta="-18"
 -			 width="13"
 -			 height="12"
 -			 image_name="model_wizard\check_mark.png"/>
 -			<text
 -			 top_delta="0"
 -			 left_delta="18"
 -			 name="medium_detail_text"
 -			 width="200"
 -			 height="14">Generate Level of Detail: Medium</text>
 -			<icon
 -			 top_pad="10"
 -			 left_delta="-18"
 -			 width="13"
 -			 height="12"
 -			 image_name="model_wizard\check_mark.png"/>
 -			<text
 -			 top_delta="0"
 -			 left_delta="18"
 -			 name="low_detail_text"
 -			 width="200"
 -			 height="14">Generate Level of Detail: Low</text>
 -			<icon
 -			 top_pad="10"
 -			 left_delta="-18"
 -			 width="13"
 -			 height="12"
 -			 image_name="model_wizard\check_mark.png"/>
 -			<text
 -			 top_delta="0"
 -			 left_delta="18"
 -			 name="lowest_detail_text"
 -			 width="200"
 -			 height="14">Generate Level of Detail: Lowest</text>
 -		</panel>
 -		<panel
 -				 top_delta="0"
 -				 left_delta="0"
 -				 height="245"
 -				 width="500"
 -				 name="content2"
 -				 bg_opaque_color="DkGray2"
 -				 background_visible="true"
 -				 background_opaque="true">
 -			<text top="10" left="10" width="85" text_color="White" follows="left|top" height="15" name="lod_label">
 -				Model Preview:
 -			</text>
 -			<combo_box left_pad="5" top_delta="-2"  follows="left|top" list_position="below" height="18"
 -	     name="preview_lod_combo" width="90" tool_tip="LOD to view in preview render">
 -				<combo_item name="high">
 -					High
 -				</combo_item>
 -				<combo_item name="medium">
 -					Medium
 -				</combo_item>
 -				<combo_item name="lowest">
 -					Lowest
 -				</combo_item>
 -				<combo_item name="low">
 -					Low
 -				</combo_item>
 -			</combo_box>
 -			<panel
 -				 left="10"
 -				 top_pad="5"
 -				 name="preview_panel"
 -				 bevel_style="none"
 -				 border_style="line"
 -				 border="true"
 -				 height="175"
 -				 follows="all"
 -				 width="175">
 -			</panel>
 -			<text top="35" left="220" text_color="White" font="SansSerifSmallBold" width="300" height="4">Performance</text>
 -			<text top="55" left="200" halign="center" width="130" word_wrap="true"   font="SansSerifSmall" height="80">Faster rendering but less detailed; lowers Resource (prim) cost.</text>
 -			<text top="35" left="380" text_color="White" font="SansSerifSmallBold" width="300" height="4">Accuracy</text>
 -			<text top="55" left="360" halign="center" width="130" word_wrap="true"   font="SansSerifSmall" height="80">More detailed model but slower; increases Resource (prim) cost.</text>
 -
 -			<slider
 -		   follows="left|top"
 -		   height="20"
 -		   increment="1"
 -		   layout="topleft"
 -		   left="200"
 -		   max_val="2"
 -		   initial_value="1"
 -		   min_val="0"
 -		   name="accuracy_slider"
 -		   show_text="false"
 -		   top="105"
 -		   width="290" />
 -			<text 
 -			font="SansSerifSmall" 
 -			top_pad="1"  
 -			width="300" 
 -			left_delta="6" 
 -			height="4">'                                             '                                             '</text>
 -			<text top_delta="25" width="100" text_color="White" left_delta="50"  height="20">Resource Cost:</text>
 -			<text top_delta="25" width="100" text_color="White" left_delta="0"  height="20">Upload Fee:</text>
 -			<text
 -			 top_pad="15"
 -			 width="130"
 -			 height="15"
 -			 left="10"
 -			 text_color="White"
 -			 word_wrap="true">
 -				Dimensions (meters):
 -			</text>
 -			<text
 -			 top_pad="0"
 -			 width="160"
 -			 height="15"
 -			 name="import_dimensions"
 -			 left_delta="0">
 -				X:  [X] |Y:  [Y] |Z: [Z]
 -			</text>
 -		</panel>
 -	</panel>
 -
 -
 -
 -	<panel
 -		 height="388"
 -		 top_delta="0"
 -		 name="physics_panel"
 -		 visible="false"
 -		 width="530"
 -		 left="0">
 -		<panel
 -		 height="20"
 -		 top_pad="20"
 -		 name="header_panel"
 -		 width="500"
 -		 bg_opaque_color="DkGray2"
 -		 background_visible="true"
 -		 background_opaque="true"
 -		 left="20">
 -			<text
 -			 width="200"
 -			 left="10"
 -			 name="header_text"
 -			 top="2"
 -			 height="10"
 -			 font="SansSerifBig"
 -			 layout="topleft">
 -				Physics
 -			</text>
 -		</panel>
 -		<text
 -		 top_pad="14"
 -		 width="460"
 -		 height="20"
 -		 font="SansSerifSmall"
 -		 layout="topleft"
 -		 name="description"
 -		 word_wrap="true"
 -		 left_delta="0">
 -			The wizard will create a physical shape, which determines how the object interacts with other objects and avatars. Set the slider to the detail level most appropriate for how your object will be used:
 -		</text>
 -		<panel
 -		 top_delta="40"
 -		 left="15"
 -		 height="245"
 -		 width="500"
 -		 name="content"
 -		 bg_opaque_color="DkGray2"
 -		 background_visible="true"
 -		 background_opaque="true"/>
 -	</panel>
 -
 -
 -	<panel
 -		 height="388"
 -		 top_delta="0"
 -		 name="review_panel"
 -		 visible="false"
 -		 width="530"
 -		 left="0">
 -		<panel
 -		 height="20"
 -		 top_pad="20"
 -		 name="header_panel"
 -		 width="500"
 -		 bg_opaque_color="DkGray2"
 -		 background_visible="true"
 -		 background_opaque="true"
 -		 left="20">
 -			<text
 -			 width="200"
 -			 left="10"
 -			 name="header_text"
 -			 top="2"
 -			 height="10"
 -			 font="SansSerifBig"
 -			 layout="topleft">
 -				Review
 -			</text>
 -		</panel>
 -		<text
 -		 top_pad="14"
 -		 width="460"
 -		 height="20"
 -		 font="SansSerifSmall"
 -		 layout="topleft"
 -		 name="description"
 -		 word_wrap="true"
 -		 left_delta="0">
 -			Review the details below then click. Upload to upload your model. Your L$ balance will be charged when you click Upload.
 -		</text>
 -		<panel
 -		 top_delta="40"
 -		 left="15"
 -		 height="245"
 -		 width="500"
 -		 name="content"
 -		 bg_opaque_color="DkGray2"
 -		 background_visible="true"
 -		 background_opaque="true"/>
 -	</panel>
 -
 -
 -
 -
 -	<panel
 -		 height="388"
 -		 top_delta="0"
 -		 name="upload_panel"
 -		 visible="false"
 -		 width="530"
 -		 left="0">
 -		<panel
 -		 height="20"
 -		 top_pad="20"
 -		 name="header_panel"
 -		 width="500"
 -		 bg_opaque_color="DkGray2"
 -		 background_visible="true"
 -		 background_opaque="true"
 -		 left="20">
 -			<text
 -			 width="200"
 -			 left="10"
 -			 name="header_text"
 -			 top="2"
 -			 height="10"
 -			 font="SansSerifBig"
 -			 layout="topleft">
 -				Upload Complete!
 -			</text>
 -		</panel>
 -		<text
 -		 top_pad="14"
 -		 width="460"
 -		 height="20"
 -		 font="SansSerifSmall"
 -		 layout="topleft"
 -		 name="description"
 -		 word_wrap="true"
 -		 left_delta="0">
 -			Congratulations! Your model has been sucessfully uploaded.  You will find the model in the Objects folder in your inventory.
 -		</text>
 -		<panel
 -		 top_delta="40"
 -		 left="15"
 -		 height="245"
 -		 width="500"
 -		 name="content"
 -		 bg_opaque_color="DkGray2"
 -		 background_visible="true"
 -		 background_opaque="true">
 -			<button top="10" follows="top|left" height="20" label="Upload"
 -				   left="15" width="80" name="ok_btn" tool_tip="Upload to simulator"/>
 -		</panel>
 -	</panel>
 -
 -
 -
 -	<button
 -	 top="412"
 -	 right="-245"
 -	 width="90"
 -	 height="22"
 -	 name="back"
 -	 label="<< Back" />
 -	<button
 -	 top_delta="0"
 -	 right="-150"
 -	 width="90"
 -	 height="22"
 -	 name="next"
 -	 label="Next >> " />
 -	<button
 -	 top_delta="0"
 -	 right="-15"
 -	 width="90"
 -	 height="22"
 -	 name="cancel"
 -	 label="Cancel" />
 -	<spinner visible="false" left="10" height="20" follows="top|left" width="80" top_pad="-50" value="1.0" min_val="0.01" max_val="64.0" name="import_scale"/>
 -
 -	<string name="status_idle">Idle</string>
 -	<string name="status_reading_file">Loading...</string>
 -	<string name="status_generating_meshes">Generating Meshes...</string>
 -	<string name="high">High</string>
 -	<string name="medium">Medium</string>
 -	<string name="low">Low</string>
 -	<string name="lowest">Lowest</string>
 -	<string name="mesh_status_good">Ship it!</string>
 -	<string name="mesh_status_na">N/A</string>
 -	<string name="mesh_status_none">None</string>
 -	<string name="mesh_status_submesh_mismatch">Levels of detail have a different number of textureable faces.</string>
 -	<string name="mesh_status_mesh_mismatch">Levels of detail have a different number of mesh instances.</string>
 -	<string name="mesh_status_too_many_vertices">Level of detail has too many vertices.</string>
 -	<string name="mesh_status_missing_lod">Missing required level of detail.</string>
 -	<string name="layer_all">All</string>
 -	<!-- Text to display in physics layer combo box for "all layers" -->
 -
 -</floater>
 +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<floater + legacy_header_height="18" + layout="topleft" + name="Model Wizard" + help_topic="model_wizard" + bg_opaque_image_overlay="0.5 0.5 0.5 1" + height="475" + save_rect="true" + title="UPLOAD MODEL WIZARD" + width="530"> +	<button +	 top="32" +	 tab_stop="false" +	 left="410" +	 height="32" +	 name="upload_btn" +	 enabled="false" +	 label="5. Upload" +	 border="false" +	 image_unselected="model_wizard/middle_button_off.png" +	 image_selected="model_wizard/middle_button_press.png" +	 image_hover_unselected="model_wizard/middle_button_over.png" +	 image_disabled="model_wizard/middle_button_disabled.png" +	 image_disabled_selected="model_wizard/middle_button_disabled.png" +	 width="110"/> +	<button +	 top="32" +	 left="310" +	 height="32" +	 tab_stop="false" +	 name="review_btn" +	 label="4. Review" +	 enabled="false" +	 border="false" +	 image_unselected="model_wizard/middle_button_off.png" +	 image_selected="model_wizard/middle_button_press.png" +	 image_hover_unselected="model_wizard/middle_button_over.png" +	 image_disabled="model_wizard/middle_button_disabled.png" +	 image_disabled_selected="model_wizard/middle_button_disabled.png" +	 width="110"/> +	<button +	 top="32" +	 left="210" +	 height="32" +	 name="physics_btn" +	 label="3. Physics" +	 tab_stop="false" +	 enabled="false" +	 border="false" +	 image_unselected="model_wizard/middle_button_off.png" +	 image_selected="model_wizard/middle_button_press.png" +	 image_hover_unselected="model_wizard/middle_button_over.png" +	 image_disabled="model_wizard/middle_button_disabled.png" +	 image_disabled_selected="model_wizard/middle_button_disabled.png" +	 width="110"/> +	<button +	 top="32" +	 left="115" +	 name="optimize_btn" +	 label="2. Optimize" +	 tab_stop="false" +	 height="32" +	 border="false" +	 image_unselected="model_wizard/middle_button_off.png" +	 image_selected="model_wizard/middle_button_press.png" +	 image_hover_unselected="model_wizard/middle_button_over.png" +	 image_disabled="model_wizard/middle_button_disabled.png" +	 image_disabled_selected="model_wizard/middle_button_disabled.png" +	 width="110"/> +	<button +	 top="32" +	 left="15" +	 name="choose_file_btn" +	 tab_stop="false" +	 enabled="false" +	 label="1. Choose File" +	 height="32" +	 image_unselected="model_wizard/left_button_off.png" +	 image_selected="model_wizard/left_button_press.png" +	 image_hover_unselected="model_wizard/left_button_over.png" +	 image_disabled="model_wizard/left_button_disabled.png" +	 image_disabled_selected="model_wizard/left_button_disabled.png" +	 width="110"/> +	<panel +		 height="388" +		 top_pad="0" +		 name="choose_file_panel" +		 visible="false" +		 width="530" +		 left="0"> +		<panel +		 height="20" +		 top_pad="20" +		 width="500" +		 name="header_panel" +		 bg_opaque_color="DkGray2" +		 background_visible="true" +		 background_opaque="true" +		 left="20"> +			<text +			 width="200" +			 left="10" +			 top="2" +			 name="header_text" +			 height="10" +			 font="SansSerifBig" +			 layout="topleft"> +				Upload Model +			</text> +		</panel> +		<text +		 top_pad="14" +		 width="460" +		 height="20" +		 name="description" +		 font="SansSerifSmall" +		 layout="topleft" +		 word_wrap="true" +		 left_delta="0"> +			This wizard will help you import mesh models to Second Life.  First specify a file containing the model you wish to import.  Second Life supports COLLADA (.dae) files. +		</text> +		<panel +		 top_delta="40" +		 left="15" +		 height="245" +		 width="500" +		 name="content" +		 bg_opaque_color="DkGray2" +		 background_visible="true" +		 background_opaque="true"> +			<text +			 type="string" +			 length="1" +			 text_color="White"  +			 follows="left|top" +			 top="10" +			 height="10" +			 layout="topleft" +			 left_delta="10" +			 name="Cache location" +			 width="300"> +				Filename: +			</text> +			<line_editor +			 border_style="line" +			 border_thickness="1" +			 follows="left|top" +			 font="SansSerifSmall" +			 height="20" +			 layout="topleft" +			 left_delta="0" +			 max_length="4096" +			 name="lod_file" +			 top_pad="5" +			 width="220" /> +			<button +			 follows="left|top" +			 height="23" +			 label="Browse..." +			 label_selected="Browse..." +			 layout="topleft" +			 left_pad="5" +			 name="browse" +			 top_delta="-1" +			 width="85"> +			</button> +			<text +			 top_delta="-15" +			 width="200" +			 height="15" +			 font="SansSerifSmall" +			 layout="topleft" +			 text_color="White" +			 left_pad="19"> +				Model Preview: +			</text> +			<!-- Placeholder panel for 3D preview render --> +			<panel +			 left_delta="0" +			 top_pad="0" +			 name="preview_panel" +			 bevel_style="none" +			 border_style="line" +			 border="true" +			 height="150" +			 follows="all" +			 width="150"> +			</panel> +			<text +			 top_pad="10" +			 width="130" +			 height="15" +			 left="340" +			 text_color="White" +			 word_wrap="true"> +				Dimensions (meters): +			</text> +			<text +			 top_pad="2" +			 width="160" +			 height="15" +			 name="import_dimensions" +			 left_delta="0"> +				X:  [X] |Y:  [Y] |Z: [Z] +			</text> +			<text +			 top="100" +			 width="320" +			 height="15" +			 left="10" +			 text_color="White"  +			 word_wrap="true"> +				Note: +			</text> +			<text +			 top_pad="0" +			 width="320" +			 height="40" +			 left="10" +			 word_wrap="true"> +Advanced users familiar with 3d content creation tools may prefer to use the [secondlife:///app/floater/upload_model Advanced Mesh Import Window] . +			</text> +		</panel> +	</panel> + + +	<panel +		 height="388" +		 top_delta="0" +		 name="optimize_panel" +		 visible="false" +		 width="530" +		 left="0"> +		<panel +		 height="20" +		 top_pad="20" +		 name="header_panel" +		 width="500" +		 bg_opaque_color="DkGray2" +		 background_visible="true" +		 background_opaque="true" +		 left="20"> +			<text +			 width="200" +			 left="10" +			 name="header_text" +			 top="2" +			 height="10" +			 font="SansSerifBig" +			 layout="topleft"> +				Optimize +			</text> +		</panel> +		<text +		 top_pad="14" +		 width="460" +		 height="20" +		 font="SansSerifSmall" +		 layout="topleft" +		 name="description" +		 word_wrap="true" +		 left_delta="0"> +			This wizard is optimizing your model. This may take several minutes. To stop the process click the back button +		</text> +		<panel +		 top_delta="40" +		 visible="false" +		 left="15" +		 height="245" +		 width="500" +		 name="content" +		 bg_opaque_color="DkGray2" +		 background_visible="true" +		 background_opaque="true"> +			<text +			 top="20" +			 width="300" +			 height="12" +			 font="SansSerifBold" +			 left="112">Generating Level of Detail</text> +			<progress_bar +			  name="optimize_progress_bar" +              image_fill="model_wizard\progress_light.png" +			  color_bg="1 1 1 1" +			  color_bar="1 1 1 0.96" +			  follows="left|right|top" +			  width="260" +			  height="16" +			  image_bar="model_wizard\progress_bar_bg.png" +			  top_pad="14" +			  left="110"/> +			<icon +			 top_pad="10" +			 left_delta="0" +			 width="13" +			 height="12" +			 image_name="model_wizard\check_mark.png"/> +			<text +			 top_delta="0" +			 left_delta="18" +			 name="high_detail_text" +			 width="200" +			 height="14">Generate Level of Detail: High</text> +			<icon +			 top_pad="10" +			 left_delta="-18" +			 width="13" +			 height="12" +			 image_name="model_wizard\check_mark.png"/> +			<text +			 top_delta="0" +			 left_delta="18" +			 name="medium_detail_text" +			 width="200" +			 height="14">Generate Level of Detail: Medium</text> +			<icon +			 top_pad="10" +			 left_delta="-18" +			 width="13" +			 height="12" +			 image_name="model_wizard\check_mark.png"/> +			<text +			 top_delta="0" +			 left_delta="18" +			 name="low_detail_text" +			 width="200" +			 height="14">Generate Level of Detail: Low</text> +			<icon +			 top_pad="10" +			 left_delta="-18" +			 width="13" +			 height="12" +			 image_name="model_wizard\check_mark.png"/> +			<text +			 top_delta="0" +			 left_delta="18" +			 name="lowest_detail_text" +			 width="200" +			 height="14">Generate Level of Detail: Lowest</text> +		</panel> +		<panel +				 top_delta="0" +				 left_delta="0" +				 height="245" +				 width="500" +				 name="content2" +				 bg_opaque_color="DkGray2" +				 background_visible="true" +				 background_opaque="true"> +			<text top="10" left="10" width="85" text_color="White" follows="left|top" height="15" name="lod_label"> +				Model Preview: +			</text> +			<combo_box left_pad="5" top_delta="-2"  follows="left|top" list_position="below" height="18" +	     name="preview_lod_combo" width="90" tool_tip="LOD to view in preview render"> +				<combo_item name="high"> +					High +				</combo_item> +				<combo_item name="medium"> +					Medium +				</combo_item> +				<combo_item name="lowest"> +					Lowest +				</combo_item> +				<combo_item name="low"> +					Low +				</combo_item> +			</combo_box> +			<panel +				 left="10" +				 top_pad="5" +				 name="preview_panel" +				 bevel_style="none" +				 border_style="line" +				 border="true" +				 height="175" +				 follows="all" +				 width="175"> +			</panel> +			<text top="35" left="220" text_color="White" font="SansSerifSmallBold" width="300" height="4">Performance</text> +			<text top="55" left="200" halign="center" width="130" word_wrap="true"   font="SansSerifSmall" height="80">Faster rendering but less detailed; lowers Resource (prim) cost.</text> +			<text top="35" left="380" text_color="White" font="SansSerifSmallBold" width="300" height="4">Accuracy</text> +			<text top="55" left="360" halign="center" width="130" word_wrap="true"   font="SansSerifSmall" height="80">More detailed model but slower; increases Resource (prim) cost.</text> + +			<slider +		   follows="left|top" +		   height="20" +		   increment="1" +		   layout="topleft" +		   left="200" +		   max_val="2" +		   initial_value="1" +		   min_val="0" +		   name="accuracy_slider" +		   show_text="false" +		   top="105" +		   width="290" /> +			<text  +			font="SansSerifSmall"  +			top_pad="1"   +			width="300"  +			left_delta="6"  +			height="4">'                                             '                                             '</text> +			<text top_delta="25" width="100" text_color="White" left_delta="50"  height="20">Resource Cost:</text> +			<text top_delta="25" width="100" text_color="White" left_delta="0"  height="20">Upload Fee:</text> +			<text +			 top_pad="15" +			 width="130" +			 height="15" +			 left="10" +			 text_color="White" +			 word_wrap="true"> +				Dimensions (meters): +			</text> +			<text +			 top_pad="0" +			 width="160" +			 height="15" +			 name="import_dimensions" +			 left_delta="0"> +				X:  [X] |Y:  [Y] |Z: [Z] +			</text> +		</panel> +	</panel> + + + +	<panel +		 height="388" +		 top_delta="0" +		 name="physics_panel" +		 visible="false" +		 width="530" +		 left="0"> +		<panel +		 height="20" +		 top_pad="20" +		 name="header_panel" +		 width="500" +		 bg_opaque_color="DkGray2" +		 background_visible="true" +		 background_opaque="true" +		 left="20"> +			<text +			 width="200" +			 left="10" +			 name="header_text" +			 top="2" +			 height="10" +			 font="SansSerifBig" +			 layout="topleft"> +				Physics +			</text> +		</panel> +		<text +		 top_pad="14" +		 width="460" +		 height="50" +		 font="SansSerifSmall" +		 layout="topleft" +		 name="description" +		 word_wrap="true" +		 left_delta="0"> +			The wizard will create a physical shape, which determines how the object interacts with other objects and avatars. Set the slider to the detail level most appropriate for how your object will be used: +		</text> +    <panel +		 top_delta="40" +		 left="15" +		 height="245" +		 width="500" +		 name="content" +		 bg_opaque_color="DkGray2" +		 background_visible="true" +		 background_opaque="true"> +      <text top="15" left="30" text_color="White" font="SansSerifSmallBold" width="300" height="4">Performance</text> +      <text top="35" left="10" halign="center" width="130" word_wrap="true"   font="SansSerifSmall" height="80">Faster rendering but less detailed; lowers Resource (prim) cost.</text> +      <text top="15" left="390" text_color="White" font="SansSerifSmallBold" width="300" height="4">Accuracy</text> +      <text top="35" left="360" halign="center" width="130" word_wrap="true"   font="SansSerifSmall" height="80">More detailed model but slower; increases Resource (prim) cost.</text> + +      <slider +		   follows="left|top" +		   height="22" +		   increment=".1" +		   layout="topleft" +		   left="20" +		   max_val="1" +		   initial_value="0.5" +		   min_val="0" +		   name="physics_slider" +		   show_text="false" +		   top="80" +		   width="440" /> +      <text +			font="SansSerifSmall" +			top_pad="0" +			width="500" +			left_delta="6" +			height="4">'             '             '             '             '              '             '             '             '              '             '</text> +      <text top_pad="10" width="110" halign="center" word_wrap="true" left="25"  height="40">Recommended for solid objects</text> +      <text top_delta="0" width="110" halign="center" word_wrap="true" left="190"  height="40">Recommended for buildings</text> +      <text top_delta="0" width="110" halign="center" word_wrap="true" left="350"  height="40">Recommended for vehicles</text> +      <text top_delta="60" width="100" text_color="White" left="160"  height="20">Resource Cost:</text> +      <text top_delta="20" width="100" text_color="White" left_delta="0"  height="20">Physics Cost:</text> +      <text top_delta="20" width="100" text_color="White" left_delta="0"  height="20">Upload Fee:</text> +  +    </panel> +	</panel> + + +	<panel +		 height="388" +		 top_delta="0" +		 name="review_panel" +		 visible="false" +		 width="530" +		 left="0"> +		<panel +		 height="22" +		 top_pad="16" +		 name="header_panel" +		 width="500" +		 bg_opaque_color="DkGray2" +		 background_visible="true" +		 background_opaque="true" +		 left="20"> +			<text +			 width="200" +			 left="10" +			 name="header_text" +			 text_color="White"  +			 top="3" +			 height="10" +			 font="SansSerifBig" +			 layout="topleft"> +				Review +			</text> +		</panel> +		<text +		 top_pad="14" +		 width="460" +		 height="20" +		 font="SansSerifSmall" +		 layout="topleft" +		 name="description" +		 word_wrap="true" +		 left_delta="10"> +			Review the details below then click. Upload to upload your model. Your L$ balance will be charged when you click Upload. +		</text> +    <panel +		 top_delta="40" +		 left="15" +		 height="245" +		 width="500" +		 name="content"> +      <text top="10" left="10" width="85" text_color="White" follows="left|top" height="15" name="lod_label"> +        Model Preview: +      </text> +      <combo_box left_pad="5" top_delta="-2"  follows="left|top" list_position="below" height="18" +	     name="preview_lod_combo" width="90" tool_tip="LOD to view in preview render"> +        <combo_item name="high"> +          High +        </combo_item> +        <combo_item name="medium"> +          Medium +        </combo_item> +        <combo_item name="lowest"> +          Lowest +        </combo_item> +        <combo_item name="low"> +          Low +        </combo_item> +      </combo_box> +      <panel +				 left="10" +				 top_pad="10" +				 name="preview_panel" +				 bevel_style="none" +				 border_style="line" +				 border="true" +				 height="190" +				 follows="all" +				 width="190"> +			</panel>			 +      <text +			 top_pad="8" +			 width="130" +			 height="15" +			 left="10" +			 text_color="White" +			 word_wrap="true"> +				Dimensions (meters): +			</text> +      <text +			 top_pad="0" +			 width="160" +			 height="15" +			 name="import_dimensions" +			 left_delta="0"> +        X:  [X] |Y:  [Y] |Z: [Z] +      </text> +      </panel> +    <text +      width="200" +      height="12" +      top="125"  +      left="230"  +      font="SansSerifSmallBold"  +      text_color="White">Resource Cost:</text> +    <text +      width="285" +      height="30" +      top_pad="0" +      left_delta="0" +      word_wrap="true" +      font="SansSerifItalic">This is the cost to your Region's prim/object limit, at default scale</text> +	<text +	 width="200" +	 height="12" +	 top_pad="10" +		 left_delta="0" +	 font="SansSerifSmallBold" +	 text_color="White">Physics Cost:</text> +	<text +	  width="285" +	  height="30" +	  top_pad="0" +		  left_delta="0" +	  word_wrap="true" +	  font="SansSerifItalic">This is the cost to your Region's prim/object limit, at default scale</text> +		<text +		 width="200" +		 height="12" +		 top_pad="10" +		left_delta="0" +		 font="SansSerifSmallBold" +		 text_color="White">Upload Fee:</text> +		<text +		  width="285" +		  height="26" +		  top_pad="0" +		  left_delta="0" +		  word_wrap="true" +		  font="SansSerifItalic">This is the amount the upload will cost.</text> +		<check_box +			height="16" +			layout="topleft" +			left_delta="0" +			name="confirm_checkbox" +			top_pad="15" +			width="16" /> +		<text +		  height="100" +		  width="240" +		  word_wrap="true"  +		  left_delta="25" +		  top_delta="0">I confirm that I have the appropriate rights to the material contained in this model. [secondlife:///app/floater/learn_more Learn more]</text> +	</panel> + + + + +	<panel +		 height="388" +		 top_delta="0" +		 name="upload_panel" +		 visible="true" +		 width="530" +		 left="0"> +		<panel +		 height="20" +		 top_pad="20" +		 name="header_panel" +		 width="500" +		 bg_opaque_color="DkGray2" +		 background_visible="true" +		 background_opaque="true" +		 left="20"> +			<text +			 width="200" +			 left="10" +			 name="header_text" +			 top="2" +			 text_color="White"  +			 height="10" +			 font="SansSerifBig" +			 layout="topleft"> +				Upload Complete! +			</text> +		</panel> +		<text +		 top_pad="14" +		 width="460" +		 height="20" +		 font="SansSerifSmall" +		 layout="topleft" +		 name="description" +		 word_wrap="true" +		 left_delta="0"> +			Congratulations! Your model has been sucessfully uploaded.  You will find the model in the Objects folder in your inventory. +		</text> +		<icon +			 top_pad="15" +			 left_delta="0" +			 width="495" +			 height="2" +			 image_name="model_wizard\divider_line.png"/> +	</panel> + + + +	<button +	 top="440" +	 right="-245" +	 width="90" +	 height="22" +	 name="back" +	 label="<< Back" /> +	<button +	 top_delta="0" +	 right="-150" +	 width="90" +	 height="22" +	 name="next" +	 label="Next >> " /> +	<button +	 top_delta="0" +	 right="-150" +	 width="90" +	 height="22" +	 visible="false"  +	 name="upload"  +	 tool_tip="Upload to simulator" +	 label="Upload" /> +	<button +	 top_delta="0" +	 right="-15" +	 width="90" +	 height="22" +	 name="cancel" +	 label="Cancel" /> +	<button +	 top_delta="0" +	 right="-15" +	 width="90" +	 height="22" +	 name="close" +	 visible="false"  +	 label="Close" /> +	<spinner visible="false" left="10" height="20" follows="top|left" width="80" top_pad="-50" value="1.0" min_val="0.01" max_val="64.0" name="import_scale"/> + +	<string name="status_idle">Idle</string> +	<string name="status_reading_file">Loading...</string> +	<string name="status_generating_meshes">Generating Meshes...</string> +	<string name="high">High</string> +	<string name="medium">Medium</string> +	<string name="low">Low</string> +	<string name="lowest">Lowest</string> +	<string name="mesh_status_good">Ship it!</string> +	<string name="mesh_status_na">N/A</string> +	<string name="mesh_status_none">None</string> +	<string name="mesh_status_submesh_mismatch">Levels of detail have a different number of textureable faces.</string> +	<string name="mesh_status_mesh_mismatch">Levels of detail have a different number of mesh instances.</string> +	<string name="mesh_status_too_many_vertices">Level of detail has too many vertices.</string> +	<string name="mesh_status_missing_lod">Missing required level of detail.</string> +	<string name="layer_all">All</string> +	<!-- Text to display in physics layer combo box for "all layers" --> + +</floater> | 
