Quellcode durchsuchen

Merge pull request #1200 from Areloch/MiscEngineFixes_20240203

Misc Engine fixes and additions
Brian Roberts vor 1 Jahr
Ursprung
Commit
b31a5eafe2

+ 8 - 4
Engine/source/T3D/Scene.cpp

@@ -361,15 +361,19 @@ DefineEngineMethod(Scene, getRootScene, S32, (),,
 }
 }
 
 
 DefineEngineMethod(Scene, addDynamicObject, void, (SceneObject* sceneObj), (nullAsType<SceneObject*>()),
 DefineEngineMethod(Scene, addDynamicObject, void, (SceneObject* sceneObj), (nullAsType<SceneObject*>()),
-   "Get the root Scene object that is loaded.\n"
-   "@return The id of the Root Scene. Will be 0 if no root scene is loaded")
+   "Adds an object to the scene's dynamic objects list. Used for things spawned as part of gameplay and not permanent objects to be saved out as part of the level proper.")
 {
 {
    object->addDynamicObject(sceneObj);
    object->addDynamicObject(sceneObj);
 }
 }
 
 
+DefineEngineMethod(Scene, clearDynamicObjects, void, (),,
+   "Clears all objects from the scene's dynamic objects list.")
+{
+   object->clearDynamicObjects();
+}
+
 DefineEngineMethod(Scene, removeDynamicObject, void, (SceneObject* sceneObj), (nullAsType<SceneObject*>()),
 DefineEngineMethod(Scene, removeDynamicObject, void, (SceneObject* sceneObj), (nullAsType<SceneObject*>()),
-   "Get the root Scene object that is loaded.\n"
-   "@return The id of the Root Scene. Will be 0 if no root scene is loaded")
+   "Removes an object from the scene's dynamic objects list.")
 {
 {
    object->removeDynamicObject(sceneObj);
    object->removeDynamicObject(sceneObj);
 }
 }

+ 1 - 0
Engine/source/T3D/Scene.h

@@ -65,6 +65,7 @@ public:
 
 
    void addDynamicObject(SceneObject* object);
    void addDynamicObject(SceneObject* object);
    void removeDynamicObject(SceneObject* object);
    void removeDynamicObject(SceneObject* object);
+   void clearDynamicObjects() { mDynamicObjects.clear(); }
 
 
    void dumpUtilizedAssets();
    void dumpUtilizedAssets();
 
 

+ 23 - 0
Engine/source/T3D/shapeBase.cpp

@@ -2184,6 +2184,29 @@ void ShapeBase::getEyeCameraTransform(IDisplayDevice *displayDevice, U32 eyeId,
    *outMat = cameraTransform * temp;
    *outMat = cameraTransform * temp;
 }
 }
 
 
+void ShapeBase::getNodeTransform(const char* nodeName, const MatrixF& xfm, MatrixF* outMat)
+{
+   if (!mShapeInstance)
+      return;
+
+   S32 nodeIDx = mDataBlock->getShapeResource()->findNode(nodeName);
+
+   MatrixF nodeTransform(xfm);
+   const Point3F& scale = getScale();
+   if (nodeIDx != -1)
+   {
+      nodeTransform = mShapeInstance->mNodeTransforms[nodeIDx];
+      nodeTransform.mul(xfm);
+   }
+   // The position of the mount point needs to be scaled.
+   Point3F position = nodeTransform.getPosition();
+   position.convolve(scale);
+   nodeTransform.setPosition(position);
+   // Also we would like the object to be scaled to the model.
+   outMat->mul(mObjToWorld, nodeTransform);
+   return;
+}
+
 void ShapeBase::getCameraParameters(F32 *min,F32* max,Point3F* off,MatrixF* rot)
 void ShapeBase::getCameraParameters(F32 *min,F32* max,Point3F* off,MatrixF* rot)
 {
 {
    *min = mDataBlock->cameraMinDist;
    *min = mDataBlock->cameraMinDist;

+ 2 - 0
Engine/source/T3D/shapeBase.h

@@ -1594,6 +1594,8 @@ public:
    /// @param   pos   Muzzle point (out)
    /// @param   pos   Muzzle point (out)
    void getMuzzlePoint(U32 imageSlot,Point3F* pos);
    void getMuzzlePoint(U32 imageSlot,Point3F* pos);
 
 
+   virtual void getNodeTransform(const char* nodeName, const MatrixF& xfm, MatrixF* outMat);
+
    /// @}
    /// @}
 
 
    /// @name Transforms
    /// @name Transforms

+ 1 - 1
Engine/source/afx/ea/afxEA_AnimClip.cpp

@@ -128,7 +128,7 @@ bool afxEA_AnimClip::ea_update(F32 dt)
     if (go_for_it)
     if (go_for_it)
     {
     {
       F32 rate = clip_data->rate/mProp_time_factor;
       F32 rate = clip_data->rate/mProp_time_factor;
-      F32 pos = mFmod(mLife_elapsed, anim_lifetime)/anim_lifetime;
+      F32 pos = (anim_lifetime>0) ? mFmod(mLife_elapsed, anim_lifetime)/anim_lifetime : 0;
       pos = mFmod(pos + clip_data->pos_offset, 1.0);
       pos = mFmod(pos + clip_data->pos_offset, 1.0);
       if (clip_data->rate < 0) 
       if (clip_data->rate < 0) 
         pos = 1.0f - pos;
         pos = 1.0f - pos;

+ 1 - 1
Engine/source/forest/editor/forestEditorCtrl.cpp

@@ -160,7 +160,7 @@ void ForestEditorCtrl::get3DCursor( GuiCursor *&cursor,
 
 
 void ForestEditorCtrl::on3DMouseDown( const Gui3DMouseEvent &evt )
 void ForestEditorCtrl::on3DMouseDown( const Gui3DMouseEvent &evt )
 {   
 {   
-   if ( !mForest && !updateActiveForest( true ) )
+   if ( !mForest || !updateActiveForest( true ) )
       return;
       return;
 
 
    if ( mTool )
    if ( mTool )

+ 23 - 0
Engine/source/gui/controls/guiBitmapBorderCtrl.cpp

@@ -48,7 +48,13 @@ class GuiBitmapBorderCtrl : public GuiControl
    };
    };
 	RectI *mBitmapBounds;  ///< bmp is [3*n], bmpHL is [3*n + 1], bmpNA is [3*n + 2]
 	RectI *mBitmapBounds;  ///< bmp is [3*n], bmpHL is [3*n + 1], bmpNA is [3*n + 2]
    GFXTexHandle mTextureObject;
    GFXTexHandle mTextureObject;
+   ColorI   mColor;
+
 public:
 public:
+   GuiBitmapBorderCtrl();
+
+   static void initPersistFields();
+
    bool onWake();
    bool onWake();
    void onSleep();
    void onSleep();
    void onRender(Point2I offset, const RectI &updateRect);
    void onRender(Point2I offset, const RectI &updateRect);
@@ -104,6 +110,21 @@ ConsoleDocClass( GuiBitmapBorderCtrl,
    "@ingroup GuiImages"
    "@ingroup GuiImages"
 );
 );
 
 
+GuiBitmapBorderCtrl::GuiBitmapBorderCtrl()
+{
+   mColor.set(255,255,255, 255);
+}
+
+void GuiBitmapBorderCtrl::initPersistFields()
+{
+   docsURL;
+   addGroup("Bitmap");
+   addField("color", TypeColorI, Offset(mColor, GuiBitmapBorderCtrl), "color mul");
+   endGroup("Bitmap");
+
+   Parent::initPersistFields();
+}
+
 bool GuiBitmapBorderCtrl::onWake()
 bool GuiBitmapBorderCtrl::onWake()
 {
 {
    if (! Parent::onWake())
    if (! Parent::onWake())
@@ -153,6 +174,8 @@ void GuiBitmapBorderCtrl::onRender(Point2I offset, const RectI &updateRect)
         drawUtil->drawRectFill(winRect, mProfile->mFillColor);
         drawUtil->drawRectFill(winRect, mProfile->mFillColor);
 
 
       drawUtil->clearBitmapModulation();
       drawUtil->clearBitmapModulation();
+      drawUtil->setBitmapModulation(mColor);
+
       drawUtil->drawBitmapSR(mTextureObject, offset, mBitmapBounds[BorderTopLeft]);
       drawUtil->drawBitmapSR(mTextureObject, offset, mBitmapBounds[BorderTopLeft]);
       drawUtil->drawBitmapSR(mTextureObject, Point2I(offset.x + getWidth() - mBitmapBounds[BorderTopRight].extent.x, offset.y),
       drawUtil->drawBitmapSR(mTextureObject, Point2I(offset.x + getWidth() - mBitmapBounds[BorderTopRight].extent.x, offset.y),
                       mBitmapBounds[BorderTopRight]);
                       mBitmapBounds[BorderTopRight]);

+ 16 - 1
Engine/source/math/mMatrix.h

@@ -228,7 +228,8 @@ public:
    //------------------------------------
    //------------------------------------
    friend MatrixF operator * ( const MatrixF &m1, const MatrixF &m2 );
    friend MatrixF operator * ( const MatrixF &m1, const MatrixF &m2 );
    MatrixF& operator *= ( const MatrixF &m );
    MatrixF& operator *= ( const MatrixF &m );
-
+   MatrixF &operator = (const MatrixF &m);
+   bool isNaN();
    // Static identity matrix
    // Static identity matrix
    const static MatrixF Identity;
    const static MatrixF Identity;
 };
 };
@@ -596,6 +597,20 @@ inline MatrixF& MatrixF::operator *= ( const MatrixF &m1 )
    return (*this);
    return (*this);
 }
 }
 
 
+inline MatrixF &MatrixF::operator = (const MatrixF &m1)
+{
+   for (U32 i=0;i<16;i++)
+   this->m[i] = m1.m[i];
+   return (*this);
+}
+inline bool MatrixF::isNaN()
+{
+   bool isaNaN = false;
+   for (U32 i = 0; i < 16; i++)
+      if (mIsNaN_F(m[i]))
+         isaNaN = true;
+   return isaNaN;
+}
 //------------------------------------
 //------------------------------------
 // Non-member methods
 // Non-member methods
 //------------------------------------
 //------------------------------------

+ 7 - 3
Engine/source/scene/sceneContainer.cpp

@@ -1485,7 +1485,7 @@ ConsoleFunctionGroupBegin( Containers,  "Functions for ray casting and spatial q
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
 
 
 DefineEngineFunction( containerBoxEmpty, bool,
 DefineEngineFunction( containerBoxEmpty, bool,
-   ( U32 mask, Point3F center, F32 xRadius, F32 yRadius, F32 zRadius, bool useClientContainer ), ( -1, -1, false ),
+   ( U32 mask, Point3F center, F32 xRadius, F32 yRadius, F32 zRadius, bool useClientContainer, SceneObject* ignoreObj), ( -1, -1, false, nullAsType<SceneObject*>()),
    "@brief See if any objects of the given types are present in box of given extent.\n\n"
    "@brief See if any objects of the given types are present in box of given extent.\n\n"
    "@note Extent parameter is last since only one radius is often needed.  If "
    "@note Extent parameter is last since only one radius is often needed.  If "
    "one radius is provided, the yRadius and zRadius are assumed to be the same.  Unfortunately, "
    "one radius is provided, the yRadius and zRadius are assumed to be the same.  Unfortunately, "
@@ -1519,8 +1519,12 @@ DefineEngineFunction( containerBoxEmpty, bool,
    polyList.mPlaneList[5].set(B.maxExtents, VectorF(0,0,1));
    polyList.mPlaneList[5].set(B.maxExtents, VectorF(0,0,1));
 
 
    SceneContainer* pContainer = useClientContainer ? &gClientContainer : &gServerContainer;
    SceneContainer* pContainer = useClientContainer ? &gClientContainer : &gServerContainer;
-
-   return ! pContainer->buildPolyList(PLC_Collision, B, mask, &polyList);
+   if (ignoreObj)
+      ignoreObj->disableCollision();
+   bool ret = !pContainer->buildPolyList(PLC_Collision, B, mask, &polyList);
+   if (ignoreObj)
+      ignoreObj->enableCollision();
+   return ret;
 }
 }
 
 
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------

+ 16 - 5
Engine/source/scene/sceneObject.cpp

@@ -521,8 +521,14 @@ void SceneObject::resetWorldBox()
    AssertFatal(mObjBox.isValidBox(), "SceneObject::resetWorldBox - Bad object box!");
    AssertFatal(mObjBox.isValidBox(), "SceneObject::resetWorldBox - Bad object box!");
 
 
    mWorldBox = mObjBox;
    mWorldBox = mObjBox;
-   mWorldBox.minExtents.convolve(mObjScale);
-   mWorldBox.maxExtents.convolve(mObjScale);
+
+   Point3F scale = Point3F(mFabs(mObjScale.x), mFabs(mObjScale.y), mFabs(mObjScale.z));
+   mWorldBox.minExtents.convolve(scale);
+   mWorldBox.maxExtents.convolve(scale);
+
+   if (mObjToWorld.isNaN())
+      mObjToWorld.identity();
+
    mObjToWorld.mul(mWorldBox);
    mObjToWorld.mul(mWorldBox);
 
 
    AssertFatal(mWorldBox.isValidBox(), "SceneObject::resetWorldBox - Bad world box!");
    AssertFatal(mWorldBox.isValidBox(), "SceneObject::resetWorldBox - Bad world box!");
@@ -585,11 +591,16 @@ void SceneObject::resetRenderWorldBox()
    AssertFatal( mObjBox.isValidBox(), "Bad object box!" );
    AssertFatal( mObjBox.isValidBox(), "Bad object box!" );
 
 
    mRenderWorldBox = mObjBox;
    mRenderWorldBox = mObjBox;
-   mRenderWorldBox.minExtents.convolve( mObjScale );
-   mRenderWorldBox.maxExtents.convolve( mObjScale );
+   Point3F scale = Point3F(mFabs(mObjScale.x), mFabs(mObjScale.y), mFabs(mObjScale.z));
+   mRenderWorldBox.minExtents.convolve(scale);
+   mRenderWorldBox.maxExtents.convolve(scale);
+
+   if (mRenderObjToWorld.isNaN())
+      mRenderObjToWorld.identity();
+
    mRenderObjToWorld.mul( mRenderWorldBox );
    mRenderObjToWorld.mul( mRenderWorldBox );
 
 
-   AssertFatal( mRenderWorldBox.isValidBox(), "Bad world box!" );
+   AssertFatal( mRenderWorldBox.isValidBox(), "Bad Render world box!" );
 
 
    // Create mRenderWorldSphere from mRenderWorldBox.
    // Create mRenderWorldSphere from mRenderWorldBox.