diff options
| -rw-r--r-- | indra/newview/cube.dae | 103 | ||||
| -rw-r--r-- | indra/newview/llfloatermodelpreview.cpp | 26 | ||||
| -rw-r--r-- | indra/newview/llfloatermodelpreview.h | 1 | ||||
| -rw-r--r-- | indra/newview/llmodelpreview.cpp | 23 | ||||
| -rw-r--r-- | indra/newview/llmodelpreview.h | 15 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/floater_model_preview.xml | 1 | ||||
| -rwxr-xr-x | indra/newview/viewer_manifest.py | 3 | 
7 files changed, 163 insertions, 9 deletions
diff --git a/indra/newview/cube.dae b/indra/newview/cube.dae new file mode 100644 index 0000000000..085b2c7309 --- /dev/null +++ b/indra/newview/cube.dae @@ -0,0 +1,103 @@ +<?xml version="1.0" encoding="UTF-8"?> +<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1"> + <asset> +  <contributor> +   modified from https://gist.github.com/wtsnz/bfa11c40e04594b260255b5dc7956f26 +  </contributor> +  <created>2018-10-25T16:29:03Z</created> +  <modified>2022-02-18T00:00:00Z</modified> +  <unit meter="1.000000"/> +  <up_axis>Y_UP</up_axis> + </asset> + + <library_materials> +  <material id="Blue" name="Blue"> +   <instance_effect url="#effect_Blue"/> +  </material> + </library_materials> + + + <library_effects> +  <effect id="effect_Blue"> +   <profile_COMMON> +    <technique sid="common"> +     <phong> +      <ambient> +       <color>0 0 0 1</color> +      </ambient> +      <diffuse> +       <color>0.137255 0.403922 0.870588 1</color> +      </diffuse> +      <specular> +       <color>0.5 0.5 0.5 1</color> +      </specular> +      <shininess> +       <float>16</float> +      </shininess> +      <transparent opaque="A_ONE"> +       <color>0 0 0 1</color> +      </transparent> +      <transparency> +       <float>1</float> +      </transparency> +      <index_of_refraction> +       <float>1</float> +      </index_of_refraction> +     </phong> +    </technique> +   </profile_COMMON> +  </effect> + </library_effects> + + + <library_geometries> +  <geometry id="F1" name="default_physics_shape"> +   <mesh> + +    <source id="cube-vertex-positions"> +     <float_array id="ID2-array" count="72">-0.5 0.5 0.5 -0.5 -0.5 0.5 0.5 -0.5 0.5 0.5 0.5 0.5 -0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 -0.5 -0.5 0.5 -0.5 -0.5 -0.5 -0.5 0.5 -0.5 -0.5 0.5 -0.5 0.5 -0.5 -0.5 0.5 -0.5 0.5 0.5 -0.5 0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 0.5 0.5 -0.5 0.5 0.5 -0.5 -0.5 0.5 0.5 -0.5 0.5 0.5 0.5 0.5 0.5 -0.5 0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 0.5 -0.5 </float_array> +     <technique_common> +      <accessor source="#ID2-array" count="24" stride="3"> +       <param name="X" type="float"/> +       <param name="Y" type="float"/> +       <param name="Z" type="float"/> +      </accessor> +     </technique_common> +    </source> + +    <vertices id="cube-vertices"> +     <input semantic="POSITION" source="#cube-vertex-positions"/> +    </vertices> + +    <triangles count="12" material="geometryElement5"> +     <input semantic="VERTEX" offset="0" source="#cube-vertices"/> +     <p>0 1 2 0 2 3 4 5 6 4 6 7 8 9 10 8 10 11 12 13 14 12 14 15 16 17 18 16 18 19 20 21 22 20 22 23 </p> +    </triangles> +     +   </mesh> +  </geometry> + </library_geometries> + <library_visual_scenes> + + +  <visual_scene id="reportScene"> +  <!-- No Spaces allowed in Name --> +   <node id="F1" name="Face1"> +    <instance_geometry url="#F1"> +     <bind_material> +      <technique_common> +       <instance_material symbol="geometryElement5" target="#Blue"/> +      </technique_common> +     </bind_material> +    </instance_geometry> +   </node> +  </visual_scene> + </library_visual_scenes> + + + <scene> +  <instance_visual_scene url="#reportScene"/> + </scene> + + +</COLLADA> diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp index 0fefb0d432..d99d95934c 100644 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -476,22 +476,25 @@ void LLFloaterModelPreview::loadHighLodModel()  	loadModel(3);  } -void LLFloaterModelPreview::loadModel(S32 lod) +void LLFloaterModelPreview::prepareToLoadModel(S32 lod)  {  	mModelPreview->mLoading = true;  	if (lod == LLModel::LOD_PHYSICS)  	{  		// loading physics from file  		mModelPreview->mPhysicsSearchLOD = lod; +		mModelPreview->mWarnOfUnmatchedPhyicsMeshes = false;  	} - +} +void LLFloaterModelPreview::loadModel(S32 lod) +{ +	prepareToLoadModel(lod);  	(new LLMeshFilePicker(mModelPreview, lod))->getFile();  }  void LLFloaterModelPreview::loadModel(S32 lod, const std::string& file_name, bool force_disable_slm)  { -	mModelPreview->mLoading = true; - +	prepareToLoadModel(lod);  	mModelPreview->loadModel(file_name, lod, force_disable_slm);  } @@ -1060,11 +1063,18 @@ void LLFloaterModelPreview::onPhysicsUseLOD(LLUICtrl* ctrl, void* userdata)  	}  	S32 file_mode = iface->getItemCount() - 1; -	if (which_mode < file_mode) +	S32 cube_mode = file_mode - 1; +	if (which_mode < cube_mode)  	{  		S32 which_lod = num_lods - which_mode;  		sInstance->mModelPreview->setPhysicsFromLOD(which_lod);  	} +	else if (which_mode == cube_mode) +	{ +		std::string path = gDirUtilp->getAppRODataDir(); +		gDirUtilp->append(path, "cube.dae"); +		sInstance->loadModel(LLModel::LOD_PHYSICS, path); +	}  	LLModelPreview *model_preview = sInstance->mModelPreview;  	if (model_preview) @@ -1659,15 +1669,15 @@ LLFloaterModelPreview::DecompRequest::DecompRequest(const std::string& stage, LL  void LLFloaterModelPreview::setCtrlLoadFromFile(S32 lod)  {      if (lod == LLModel::LOD_PHYSICS) -    { +	{          LLComboBox* lod_combo = findChild<LLComboBox>("physics_lod_combo");          if (lod_combo)          { -            lod_combo->setCurrentByIndex(5); +            lod_combo->setCurrentByIndex(lod_combo->getItemCount() - 1);          }      }      else -{ +	{          LLComboBox* lod_combo = findChild<LLComboBox>("lod_source_" + lod_name[lod]);          if (lod_combo)  	{ diff --git a/indra/newview/llfloatermodelpreview.h b/indra/newview/llfloatermodelpreview.h index b5dab262a3..614087e36d 100644 --- a/indra/newview/llfloatermodelpreview.h +++ b/indra/newview/llfloatermodelpreview.h @@ -223,6 +223,7 @@ private:  	void resetUploadOptions();  	void clearLogTab(); +	void prepareToLoadModel(S32 lod);  	void createSmoothComboBox(LLComboBox* combo_box, float min, float max); diff --git a/indra/newview/llmodelpreview.cpp b/indra/newview/llmodelpreview.cpp index 6b50e1f800..7578d3b9bb 100644 --- a/indra/newview/llmodelpreview.cpp +++ b/indra/newview/llmodelpreview.cpp @@ -86,6 +86,7 @@ static const LLColor4 PREVIEW_DEG_FILL_COL(1.f, 0.f, 0.f, 0.5f);  static const F32 PREVIEW_DEG_EDGE_WIDTH(3.f);  static const F32 PREVIEW_DEG_POINT_SIZE(8.f);  static const F32 PREVIEW_ZOOM_LIMIT(10.f); +static const std::string DEFAULT_PHYSICS_MESH_NAME = "default_physics_shape";  const F32 SKIN_WEIGHT_CAMERA_DISTANCE = 16.f; @@ -465,6 +466,20 @@ void LLModelPreview::rebuildUploadData()                          LLFloaterModelPreview::addStringToLog(out, false);                      }                  } +                if (mWarnOfUnmatchedPhyicsMeshes && !lod_model && (i == LLModel::LOD_PHYSICS)) +                { +                    // Despite the various strategies above, if we don't now have a physics model, we're going to end up with decomposition. +                    // That's ok, but might not what they wanted. Use default_physics_shape if found. +                    std::ostringstream out; +                    out << "No physics model specified for " << instance.mLabel; +                    if (mDefaultPhysicsShapeP) +                    { +                        out << " - using: " << DEFAULT_PHYSICS_MESH_NAME; +                        lod_model = mDefaultPhysicsShapeP; +                    } +                    LL_WARNS() << out.str() << LL_ENDL; +                    LLFloaterModelPreview::addStringToLog(out, !mDefaultPhysicsShapeP); // Flash log tab if no default. +                }                  if (lod_model)                  { @@ -1051,6 +1066,13 @@ void LLModelPreview::loadModelCallback(S32 loaded_lod)          }          else          { +            if (loaded_lod == LLModel::LOD_PHYSICS) +            {   // Explicitly loading physics. See if there is a default mesh. +                LLMatrix4 ignored_transform; // Each mesh that uses this will supply their own. +                mDefaultPhysicsShapeP = nullptr; +                FindModel(mScene[loaded_lod], DEFAULT_PHYSICS_MESH_NAME + getLodSuffix(loaded_lod), mDefaultPhysicsShapeP, ignored_transform); +                mWarnOfUnmatchedPhyicsMeshes = true; +            }              BOOL legacyMatching = gSavedSettings.getBOOL("ImporterLegacyMatching");              if (!legacyMatching)              { @@ -1121,7 +1143,6 @@ void LLModelPreview::loadModelCallback(S32 loaded_lod)                                      LL_WARNS() << out.str() << LL_ENDL;                                      LLFloaterModelPreview::addStringToLog(out, false);                                  } -                                  mModel[loaded_lod][idx]->mLabel = name;                              }                          } diff --git a/indra/newview/llmodelpreview.h b/indra/newview/llmodelpreview.h index 8e59c71a55..f5f4227049 100644 --- a/indra/newview/llmodelpreview.h +++ b/indra/newview/llmodelpreview.h @@ -217,6 +217,21 @@ private:      LLVOAvatar* getPreviewAvatar(void) { return mPreviewAvatar; }      // Count amount of original models, excluding sub-models      static U32 countRootModels(LLModelLoader::model_list models); +    /// Indicates whether we should warn of high-lod meshes that do not have a corresponding physics mesh. +    /// Reset when resetting the modelpreview (i.e., when the uploader dialog is created or reset), and when +    /// about to process a physics file. Set to true immediately after the file is loaded (before rebuildUploadData()). +    /// +    /// (The rules for mapping the correspondence of high-lod meshes to physics meshes are complex. When +    /// lod rendering meshes are used, there is never an unmatched mesh. Nor is there a mismatch when +    /// the high-lod file and physics file have ony one mesh each. In these cases, this value is moot. +    /// When there are multiple meshes in each file, they are matched by name or order, and some meshes +    /// are broken up by limitations into multiple objects, and thus there can be mismatches.) +    bool mWarnOfUnmatchedPhyicsMeshes{false}; +    /// A mesh to use as the default physics shape in only those cases where the physics shape is not otherwise specified. +    /// It is set only when the user chooses a physics shape file that contains a mesh with a name that matches DEFAULT_PHYSICS_MESH_NAME. +    /// It is reset when such a name is not found, and when resetting the modelpreview. +    /// Not read unless mWarnOfUnmatchedPhyicsMeshes is true. +    LLModel* mDefaultPhysicsShapeP{};  protected:      friend class LLModelLoader; diff --git a/indra/newview/skins/default/xui/en/floater_model_preview.xml b/indra/newview/skins/default/xui/en/floater_model_preview.xml index f4cf2cb512..96cb7c8641 100644 --- a/indra/newview/skins/default/xui/en/floater_model_preview.xml +++ b/indra/newview/skins/default/xui/en/floater_model_preview.xml @@ -784,6 +784,7 @@                          <combo_item name="physics_medium"> Medium </combo_item>                          <combo_item name="physics_low">    Low    </combo_item>                          <combo_item name="physics_lowest"> Lowest </combo_item> +                        <combo_item name="physics_bounding_box"> Bounding Box </combo_item>                          <combo_item name="load_from_file"> From file   </combo_item>                      </combo_box>                      <line_editor diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index ae3ed56b3d..371ea88542 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -575,6 +575,7 @@ class WindowsManifest(ViewerManifest):          self.path(src="licenses-win32.txt", dst="licenses.txt")          self.path("featuretable.txt") +        self.path("cube.dae")          with self.prefix(src=pkgdir):              self.path("ca-bundle.crt") @@ -960,6 +961,7 @@ class DarwinManifest(ViewerManifest):                  self.path("licenses-mac.txt", dst="licenses.txt")                  self.path("featuretable_mac.txt") +                self.path("cube.dae")                  self.path("SecondLife.nib")                  with self.prefix(src=pkgdir,dst=""): @@ -1435,6 +1437,7 @@ class LinuxManifest(ViewerManifest):              print("Skipping llcommon.so (assuming llcommon was linked statically)")          self.path("featuretable_linux.txt") +        self.path("cube.dae")          with self.prefix(src=pkgdir):              self.path("ca-bundle.crt")  | 
