2
0
Эх сурвалжийг харах

enum value listing
show the string value of masked enums in variable entries
also sort the combo case of scrolling and rotating materials

AzaezelX 7 сар өмнө
parent
commit
64103a58aa

+ 26 - 5
Engine/source/console/dynamicTypes.h

@@ -214,13 +214,34 @@ class BitfieldConsoleBaseType : public ConsoleBaseType
          
          
    public:
    public:
 
 
-      const char* getData( void* dptr, const EnumTable*, BitSet32 ) override
+      const char* getData(void* dptr, const EnumTable* tbl, BitSet32) override
       {
       {
-         static const U32 bufSize = 256;
-         char* returnBuffer = Con::getReturnBuffer(bufSize);
-         dSprintf(returnBuffer, bufSize, "%i", *((S32 *) dptr) );
-         return returnBuffer;
+         BitSet32 dptrVal = BitSet32(*(U32*)dptr);
+         String returnBuffer;
+         if (!tbl) tbl = getEnumTable();
+
+         const U32 numEnums = tbl->getNumValues();
+         bool first = true;
+
+         for (U32 i = 0; i < numEnums; i++)
+         {
+            if (dptrVal.test(BIT(i)))
+            {
+               if (first)
+               {
+                  returnBuffer = String::ToString("%s",(*tbl)[i].getName());
+               }
+               else
+               {
+                  returnBuffer += String::ToString(" | %s", (*tbl)[i].getName());
+               }
+               first = false;
+            }
+         }
+
+         return Con::getReturnBuffer(returnBuffer);
       }
       }
+
       void setData( void* dptr, S32 argc, const char** argv, const EnumTable*, BitSet32 ) override
       void setData( void* dptr, S32 argc, const char** argv, const EnumTable*, BitSet32 ) override
       {
       {
          if( argc != 1 ) return; \
          if( argc != 1 ) return; \

+ 32 - 32
Engine/source/console/simObject.cpp

@@ -47,42 +47,42 @@
 ImplementBitfieldType(GameTypeMasksType,
 ImplementBitfieldType(GameTypeMasksType,
    "The type of animation effect to apply to this material.\n"
    "The type of animation effect to apply to this material.\n"
    "@ingroup GFX\n\n")
    "@ingroup GFX\n\n")
-{ SceneObjectTypes::StaticObjectType, "StaticObjectType", "Static Objects.\n" },
-{ SceneObjectTypes::EnvironmentObjectType, "EnvironmentObjectType" , "Objects considered part of the background or environment of a level.\n" },
-{ SceneObjectTypes::TerrainObjectType, "TerrainObjectType" , "Terrain Objects.\n" },
-{ SceneObjectTypes::WaterObjectType, "WaterObjectType", "Water Objects.\n" },
-{ SceneObjectTypes::TriggerObjectType, "TriggerObjectType", "Interactive Trigger Objects.\n" },
-{ SceneObjectTypes::MarkerObjectType, "MarkerObjectType", "Marker Objects, utilized primarily for tooling.\n" },
-{ SceneObjectTypes::LightObjectType, "LightObjectType", "Lights.\n" },
-{ SceneObjectTypes::ZoneObjectType, "ZoneObjectType", "zones.\n" },
-{ SceneObjectTypes::StaticShapeObjectType, "StaticShapeObjectType", "Static Shape Objects. Distinct from StaticObjectType in that Static Shapes have additional functionality and behaviors.\n" },
-{ SceneObjectTypes::DynamicShapeObjectType, "DynamicShapeObjectType", "Any sort of Dynamic Object.\n" },
-{ SceneObjectTypes::GameBaseObjectType, "GameBaseObjectType", "Any Gamebase-based Objects. Objects generally associated to gameplay functionality.\n" },
-{ SceneObjectTypes::GameBaseHiFiObjectType, "GameBaseHiFiObjectType", "Specialised Gamebase-based Objects. currently narrowly used. if at all.\n" },
-{ SceneObjectTypes::ShapeBaseObjectType, "ShapeBaseObjectType", "Any Gamebase-based Objects. Objects generally associated to gameplay functionality.\n" },
-{ SceneObjectTypes::CameraObjectType, "CameraObjectType", "Camera Objects.\n" },
-{ SceneObjectTypes::PlayerObjectType, "PlayerObjectType", "Player Objects.\n" },
-{ SceneObjectTypes::ItemObjectType, "ItemObjectType", "Item Objects.\n" },
-{ SceneObjectTypes::VehicleObjectType, "VehicleObjectType", "Any sort of Vehicle Object.\n" },
-{ SceneObjectTypes::VehicleBlockerObjectType, "VehicleBlockerObjectType", "\n" },
-{ SceneObjectTypes::ProjectileObjectType, "ProjectileObjectType", "Projectiles.\n" },
-{ SceneObjectTypes::ExplosionObjectType, "ExplosionObjectType", "Explosion and Effects.\n" },
-{ SceneObjectTypes::CorpseObjectType, "CorpseObjectType", "Corpses of controlled objects.\n" },
-{ SceneObjectTypes::DebrisObjectType, "DebrisObjectType", "Debris or debris-like things such as shell casings.\n" },
-{ SceneObjectTypes::PhysicalZoneObjectType, "PhysicalZoneObjectType", "Physical Zones. Distinct from triggers in that they have physics forces applications.\n" },
-{ SceneObjectTypes::EntityObjectType, "EntityObjectType", "A generic entity.\n" },
-{ SceneObjectTypes::InteriorLikeObjectType, "InteriorLikeObjectType", "InteriorLikeObjectType (deprecated).\n" },
-{ SceneObjectTypes::TerrainLikeObjectType, "TerrainLikeObjectType", "Pseudo-terrains, like groundplanes, or meshroads.\n" },
+{ SceneObjectTypes::StaticObjectType, "$TypeMasks::StaticObjectType", "Static Objects.\n" },
+{ SceneObjectTypes::EnvironmentObjectType, "$TypeMasks::EnvironmentObjectType" , "Objects considered part of the background or environment of a level.\n" },
+{ SceneObjectTypes::TerrainObjectType, "$TypeMasks::TerrainObjectType" , "Terrain Objects.\n" },
+{ SceneObjectTypes::WaterObjectType, "$TypeMasks::WaterObjectType", "Water Objects.\n" },
+{ SceneObjectTypes::TriggerObjectType, "$TypeMasks::TriggerObjectType", "Interactive Trigger Objects.\n" },
+{ SceneObjectTypes::MarkerObjectType, "$TypeMasks::MarkerObjectType", "Marker Objects, utilized primarily for tooling.\n" },
+{ SceneObjectTypes::LightObjectType, "$TypeMasks::LightObjectType", "Lights.\n" },
+{ SceneObjectTypes::ZoneObjectType, "$TypeMasks::ZoneObjectType", "zones.\n" },
+{ SceneObjectTypes::StaticShapeObjectType, "$TypeMasks::StaticShapeObjectType", "Static Shape Objects. Distinct from StaticObjectType in that Static Shapes have additional functionality and behaviors.\n" },
+{ SceneObjectTypes::DynamicShapeObjectType, "$TypeMasks::DynamicShapeObjectType", "Any sort of Dynamic Object.\n" },
+{ SceneObjectTypes::GameBaseObjectType, "$TypeMasks::GameBaseObjectType", "Any Gamebase-based Objects. Objects generally associated to gameplay functionality.\n" },
+{ SceneObjectTypes::GameBaseHiFiObjectType, "$TypeMasks::GameBaseHiFiObjectType", "Specialised Gamebase-based Objects. currently narrowly used. if at all.\n" },
+{ SceneObjectTypes::ShapeBaseObjectType, "$TypeMasks::ShapeBaseObjectType", "Any Gamebase-based Objects. Objects generally associated to gameplay functionality.\n" },
+{ SceneObjectTypes::CameraObjectType, "$TypeMasks::CameraObjectType", "Camera Objects.\n" },
+{ SceneObjectTypes::PlayerObjectType, "$TypeMasks::PlayerObjectType", "Player Objects.\n" },
+{ SceneObjectTypes::ItemObjectType, "$TypeMasks::ItemObjectType", "Item Objects.\n" },
+{ SceneObjectTypes::VehicleObjectType, "$TypeMasks::VehicleObjectType", "Any sort of Vehicle Object.\n" },
+{ SceneObjectTypes::VehicleBlockerObjectType, "$TypeMasks::VehicleBlockerObjectType", "\n" },
+{ SceneObjectTypes::ProjectileObjectType, "$TypeMasks::ProjectileObjectType", "Projectiles.\n" },
+{ SceneObjectTypes::ExplosionObjectType, "$TypeMasks::ExplosionObjectType", "Explosion and Effects.\n" },
+{ SceneObjectTypes::CorpseObjectType, "$TypeMasks::CorpseObjectType", "Corpses of controlled objects.\n" },
+{ SceneObjectTypes::DebrisObjectType, "$TypeMasks::DebrisObjectType", "Debris or debris-like things such as shell casings.\n" },
+{ SceneObjectTypes::PhysicalZoneObjectType, "$TypeMasks::PhysicalZoneObjectType", "Physical Zones. Distinct from triggers in that they have physics forces applications.\n" },
+{ SceneObjectTypes::EntityObjectType, "$TypeMasks::EntityObjectType", "A generic entity.\n" },
+{ SceneObjectTypes::InteriorLikeObjectType, "$TypeMasks::InteriorLikeObjectType", "InteriorLikeObjectType (deprecated).\n" },
+{ SceneObjectTypes::TerrainLikeObjectType, "$TypeMasks::TerrainLikeObjectType", "Pseudo-terrains, like groundplanes, or meshroads.\n" },
 #if defined(AFX_CAP_AFXMODEL_TYPE) 
 #if defined(AFX_CAP_AFXMODEL_TYPE) 
 { SceneObjectTypes::afxModelObjectType, "afxModelObjectType", "afx-specific model typemask.\n" },
 { SceneObjectTypes::afxModelObjectType, "afxModelObjectType", "afx-specific model typemask.\n" },
 #else
 #else
-{ SceneObjectTypes::N_A_27, "N_A_27", "unused 27th bit.\n" },
+{ SceneObjectTypes::N_A_27, "$TypeMasks::N_A_27", "unused 27th bit.\n" },
 #endif
 #endif
-{ SceneObjectTypes::N_A_28, "N_A_28", "unused 28th bit.\n" },
-{ SceneObjectTypes::PathShapeObjectType, "PathShapeObjectType", "Path-following Objects.\n" },
-{ SceneObjectTypes::TurretObjectType, "TurretObjectType", "Turret Objects.\n" },
-{ SceneObjectTypes::N_A_31, "N_A_31", "unused 31st bit.\n" },
-{ SceneObjectTypes::N_A_32, "N_A_32", "unused 32nd bit.\n" },
+{ SceneObjectTypes::N_A_28, "$TypeMasks::N_A_28", "unused 28th bit.\n" },
+{ SceneObjectTypes::PathShapeObjectType, "$TypeMasks::PathShapeObjectType", "Path-following Objects.\n" },
+{ SceneObjectTypes::TurretObjectType, "$TypeMasks::TurretObjectType", "Turret Objects.\n" },
+{ SceneObjectTypes::N_A_31, "$TypeMasks::N_A_31", "unused 31st bit.\n" },
+{ SceneObjectTypes::N_A_32, "$TypeMasks::N_A_32", "unused 32nd bit.\n" },
 
 
 EndImplementBitfieldType;
 EndImplementBitfieldType;
 
 

+ 6 - 7
Engine/source/materials/materialDefinition.cpp

@@ -71,13 +71,12 @@ ConsoleDocClass(Material,
 ImplementBitfieldType(MaterialAnimType,
 ImplementBitfieldType(MaterialAnimType,
    "The type of animation effect to apply to this material.\n"
    "The type of animation effect to apply to this material.\n"
    "@ingroup GFX\n\n")
    "@ingroup GFX\n\n")
-{
-   Material::Scroll, "Scroll", "Scroll the material along the X/Y axis.\n"
-},
-{ Material::Rotate, "Rotate" , "Rotate the material around a point.\n" },
-{ Material::Wave, "Wave" , "Warps the material with an animation using Sin, Triangle or Square mathematics.\n" },
-{ Material::Scale, "Scale", "Scales the material larger and smaller with a pulsing effect.\n" },
-{ Material::Sequence, "Sequence", "Enables the material to have multiple frames of animation in its imagemap.\n" }
+{ Material::No, "$No", "No animations.\n"},
+{ Material::Scroll, "$Scroll", "Scroll the material along the X/Y axis.\n"},
+{ Material::Rotate, "$Rotate" , "Rotate the material around a point.\n" },
+{ Material::Wave, "$Wave" , "Warps the material with an animation using Sin, Triangle or Square mathematics.\n" },
+{ Material::Scale, "$Scale", "Scales the material larger and smaller with a pulsing effect.\n" },
+{ Material::Sequence, "$Sequence", "Enables the material to have multiple frames of animation in its imagemap.\n" }
 EndImplementBitfieldType;
 EndImplementBitfieldType;
 
 
 ImplementEnumType(MaterialBlendOp,
 ImplementEnumType(MaterialBlendOp,

+ 6 - 5
Engine/source/materials/materialDefinition.h

@@ -115,11 +115,12 @@ public:
 
 
    enum AnimType
    enum AnimType
    {
    {
-      Scroll = 1,
-      Rotate = 2,
-      Wave = 4,
-      Scale = 8,
-      Sequence = 16,
+      No = 0,
+      Scroll = BIT(0),
+      Rotate = BIT(1),
+      Wave = BIT(2),
+      Scale = BIT(3),
+      Sequence = BIT(4),
    };
    };
 
 
    enum WaveType
    enum WaveType

+ 60 - 77
Engine/source/materials/processedShaderMaterial.cpp

@@ -914,98 +914,81 @@ void ProcessedShaderMaterial::_setTextureTransforms(const U32 pass)
    PROFILE_SCOPE( ProcessedShaderMaterial_SetTextureTransforms );
    PROFILE_SCOPE( ProcessedShaderMaterial_SetTextureTransforms );
 
 
    ShaderConstHandles* handles = _getShaderConstHandles(pass);
    ShaderConstHandles* handles = _getShaderConstHandles(pass);
-   if (handles->mTexMatSC->isValid())
-   {   
-      MatrixF texMat( true );
-
-      mMaterial->updateTimeBasedParams();
-      F32 waveOffset = _getWaveOffset( pass ); // offset is between 0.0 and 1.0
+   if (!handles->mTexMatSC->isValid())
+      return;
 
 
-      // handle scroll anim type
-      if(  mMaterial->mAnimFlags[pass] & Material::Scroll )
-      {
-         if( mMaterial->mAnimFlags[pass] & Material::Wave )
-         {
-            Point3F scrollOffset;
-            scrollOffset.x = mMaterial->mScrollDir[pass].x * waveOffset;
-            scrollOffset.y = mMaterial->mScrollDir[pass].y * waveOffset;
-            scrollOffset.z = 1.0;
+   MatrixF texMat(true);
+   mMaterial->updateTimeBasedParams();
+   F32 waveOffset = _getWaveOffset(pass); // offset is between 0.0 and 1.0
 
 
-            texMat.setColumn( 3, scrollOffset );
-         }
-         else
-         {
-            Point3F offset( mMaterial->mScrollOffset[pass].x, 
-               mMaterial->mScrollOffset[pass].y, 
-               1.0 );
+   // --- Scroll Animation ---
+   if (mMaterial->mAnimFlags[pass] & Material::Scroll)
+   {
+      Point3F offset = (mMaterial->mAnimFlags[pass] & Material::Wave)
+         ? Point3F(mMaterial->mScrollDir[pass].x * waveOffset,
+            mMaterial->mScrollDir[pass].y * waveOffset, 0.0f)
+         : Point3F(mMaterial->mScrollOffset[pass].x,
+            mMaterial->mScrollOffset[pass].y, 0.0f);
+
+      MatrixF scrollMat(true);
+      scrollMat.setColumn(3, offset);
+      texMat.mul(scrollMat);
+   }
 
 
-            texMat.setColumn( 3, offset );
-         }
+   // --- Rotation Animation ---
+   if (mMaterial->mAnimFlags[pass] & Material::Rotate)
+   { 
+      F32 rotationAngle = (mMaterial->mAnimFlags[pass] & Material::Wave)
+         ? waveOffset * M_2PI
+         : mMaterial->mRotPos[pass];
 
 
-      }
+      MatrixF rotationMat(EulerF(0.0f, 0.0f, rotationAngle));
 
 
-      // handle rotation
-      if( mMaterial->mAnimFlags[pass] & Material::Rotate )
-      {
-         if( mMaterial->mAnimFlags[pass] & Material::Wave )
-         {
-            F32 rotPos = waveOffset * M_2PI;
-            texMat.set( EulerF( 0.0, 0.0, rotPos ) );
-            texMat.setColumn( 3, Point3F( 0.5, 0.5, 0.0 ) );
-
-            MatrixF test( true );
-            test.setColumn( 3, Point3F( mMaterial->mRotPivotOffset[pass].x, 
-               mMaterial->mRotPivotOffset[pass].y,
-               0.0 ) );
-            texMat.mul( test );
-         }
-         else
-         {
-            texMat.set( EulerF( 0.0, 0.0, mMaterial->mRotPos[pass] ) );
+      Point3F pivotPoint(
+         mMaterial->mRotPivotOffset[pass].x,
+         mMaterial->mRotPivotOffset[pass].y,
+         0.0f);
 
 
-            texMat.setColumn( 3, Point3F( 0.5, 0.5, 0.0 ) );
+      MatrixF finalRotationMat(true);
+      finalRotationMat.setColumn(3, pivotPoint);
+      finalRotationMat.mul(rotationMat);
+      finalRotationMat.setColumn(3, -pivotPoint);
 
 
-            MatrixF test( true );
-            test.setColumn( 3, Point3F( mMaterial->mRotPivotOffset[pass].x, 
-               mMaterial->mRotPivotOffset[pass].y,
-               0.0 ) );
-            texMat.mul( test );
-         }
-      }
+      // Apply final rotation matrix
+      texMat.mul(finalRotationMat);
+   }
 
 
-      // Handle scale + wave offset
-      if(  mMaterial->mAnimFlags[pass] & Material::Scale &&
-         mMaterial->mAnimFlags[pass] & Material::Wave )
-      {
-         F32 wOffset = fabs( waveOffset );
+   // --- Scale Animation ---
+   if ((mMaterial->mAnimFlags[pass] & Material::Scale) && (mMaterial->mAnimFlags[pass] & Material::Wave))
+   {
+      F32 scaleFactor = mFabs(waveOffset);
 
 
-         texMat.setColumn( 3, Point3F( 0.5, 0.5, 0.0 ) );
+      MatrixF scaleMat(true);
+      scaleMat.setRow(0, Point3F(scaleFactor, 0.0f, 0.0f));
+      scaleMat.setRow(1, Point3F(0.0f, scaleFactor, 0.0f));
+      scaleMat.setRow(2, Point3F(0.0f, 0.0f, scaleFactor));
 
 
-         MatrixF temp( true );
-         temp.setRow( 0, Point3F( wOffset,  0.0,  0.0 ) );
-         temp.setRow( 1, Point3F( 0.0,  wOffset,  0.0 ) );
-         temp.setRow( 2, Point3F( 0.0,  0.0,  wOffset ) );
-         temp.setColumn( 3, Point3F( -wOffset * 0.5, -wOffset * 0.5, 0.0 ) );
-         texMat.mul( temp );
-      }
+      // Apply final scale matrix
+      texMat.mul(scaleMat);
+   }
 
 
-      // handle sequence
-      if( mMaterial->mAnimFlags[pass] & Material::Sequence )
-      {
-         U32 frameNum = (U32)(MATMGR->getTotalTime() * mMaterial->mSeqFramePerSec[pass]);
-         F32 offset = frameNum * mMaterial->mSeqSegSize[pass];
+   // --- Sequence Animation ---
+   if (mMaterial->mAnimFlags[pass] & Material::Sequence)
+   {
+      U32 frameNum = static_cast<U32>(MATMGR->getTotalTime() * mMaterial->mSeqFramePerSec[pass]);
+      F32 offset = frameNum * mMaterial->mSeqSegSize[pass];
 
 
-         if ( mMaterial->mAnimFlags[pass] & Material::Scale )
-            texMat.scale( Point3F( mMaterial->mSeqSegSize[pass], 1.0f, 1.0f ) );
+      MatrixF sequenceMat(true);
+      sequenceMat.setColumn(3, Point3F(offset, 0.0f, 0.0f));
 
 
-         Point3F texOffset = texMat.getPosition();
-         texOffset.x += offset;
-         texMat.setPosition( texOffset );
-      }
+      if (mMaterial->mAnimFlags[pass] & Material::Scale)
+         sequenceMat.scale(Point3F(mMaterial->mSeqSegSize[pass], 1.0f, 1.0f));
 
 
-      GFXShaderConstBuffer* shaderConsts = _getShaderConstBuffer(pass);
-      shaderConsts->setSafe(handles->mTexMatSC, texMat);
+      texMat.mul(sequenceMat);
    }
    }
+
+   GFXShaderConstBuffer* shaderConsts = _getShaderConstBuffer(pass);
+   shaderConsts->setSafe(handles->mTexMatSC, texMat);
 }
 }
 
 
 //--------------------------------------------------------------------------
 //--------------------------------------------------------------------------