Browse Source

Updated TSStatic to utilize the getShapeAsset utility functions, and shifted the loader logic to utilize ShapeAssets exclusively, having straight file names go through the utility function to find/process a relevent asset.

Areloch 5 years ago
parent
commit
7029024b8e

+ 1 - 1
Engine/source/T3D/assets/ShapeAsset.cpp

@@ -300,6 +300,7 @@ bool ShapeAsset::getAssetByFilename(StringTableEntry fileName, AssetPtr<ShapeAss
       //If possible, see if we can run an in-place import and the get the asset from that
 #if TORQUE_DEBUG
       Con::warnf("ShapeAsset::getAssetByFilename - Attempted to in-place import a shapefile(%s) that had no associated asset", fileName);
+#endif
 
       ConsoleValueRef result = Con::executef("importLooseFile", fileName, true);
 
@@ -315,7 +316,6 @@ bool ShapeAsset::getAssetByFilename(StringTableEntry fileName, AssetPtr<ShapeAss
                return true;
          }
       }
-#endif
 
       //Didn't work, so have us fall back to a placeholder asset
       shapeAsset->setAssetId(StringTable->insert("Core_Rendering:noshape"));

+ 71 - 123
Engine/source/T3D/tsStatic.cpp

@@ -101,9 +101,6 @@ ConsoleDocClass( TSStatic,
 );
 
 TSStatic::TSStatic()
-:
-   cubeDescId( 0 ),
-   reflectorDesc( NULL )
 {
    mNetFlags.set(Ghostable | ScopeAlways);
 
@@ -171,7 +168,7 @@ void TSStatic::initPersistFields()
          &TSStatic::_setShapeAsset, &defaultProtectedGetFn,
          "The source shape asset.");
 
-      addProtectedField("shapeName",   TypeShapeFilename,  Offset( mShapeName, TSStatic ), &TSStatic::_setShape, &defaultProtectedGetFn,
+      addProtectedField("shapeName",   TypeFilename,  Offset( mShapeName, TSStatic ), &TSStatic::_setShape, &defaultProtectedGetFn,
          "%Path and filename of the model file (.DTS, .DAE) to use for this TSStatic."/*, AbstractClassRep::FieldFlags::FIELD_HideInInspectors*/ );
 
    endGroup("Shape");
@@ -219,11 +216,6 @@ void TSStatic::initPersistFields()
 
    endGroup("Rendering");
 
-   addGroup( "Reflection" );
-      addField( "cubeReflectorDesc", TypeRealString, Offset( cubeDescName, TSStatic ), 
-         "References a ReflectorDesc datablock that defines performance and quality properties for dynamic reflections.\n");
-   endGroup( "Reflection" );
-
    addGroup("Collision");
 
       addField( "collisionType",    TypeTSMeshType,   Offset( mCollisionType,   TSStatic ),
@@ -265,18 +257,26 @@ bool TSStatic::_setShape(void* obj, const char* index, const char* data)
 {
    TSStatic* ts = static_cast<TSStatic*>(obj);// ->setFile(FileName(data));
 
-   //before we continue, lets hit up the Asset Database to see if this file is associated to an asset. If so, we grab the asset instead
-   AssetQuery query;
-   S32 foundAssetcount = AssetDatabase.findAssetLooseFile(&query, data);
-   if (foundAssetcount == 0)
+   if (ShapeAsset::getAssetByFilename(StringTable->insert(data), &ts->mShapeAsset))
    {
-      //didn't find any assets. continue as normal
-      ts->mShapeName = StringTable->insert(data);
+      //Special exception case. If we've defaulted to the 'no shape' mesh, don't save it out, we'll retain the original ids/paths so it doesn't break
+      //the TSStatic
+
+      if (ts->mShapeAsset.getAssetId() != StringTable->insert("Core_Rendering:noshape"))
+      {
+         //ts->mShapeAssetId = ts->mShapeAsset.getAssetId();
+         ts->mShapeName = StringTable->EmptyString();
+      }
+      /*else
+      {
+         ts->mShapeAssetId = StringTable->EmptyString();
+      }*/
+
+      ts->_createShape();
    }
    else
    {
-      ts->setShapeAsset(query.mAssetList[0]);
-      ts->mShapeName = StringTable->EmptyString();
+      ts->mShapeAsset = StringTable->EmptyString();
    }
 
    return false;
@@ -284,9 +284,9 @@ bool TSStatic::_setShape(void* obj, const char* index, const char* data)
 
 bool TSStatic::_setShapeAsset(void* obj, const char* index, const char* data)
 {
-   TSStatic* ts = static_cast<TSStatic*>(obj);// ->setFile(FileName(data));
+   TSStatic* ts = static_cast<TSStatic*>(obj);
 
-   ts->setShapeAsset(StringTable->insert(data));
+   ts->setShapeAsset(data);
 
    return false;
 }
@@ -366,14 +366,6 @@ bool TSStatic::onAdd()
 
    addToScene();
 
-   if ( isClientObject() )
-   {      
-      mCubeReflector.unregisterReflector();
-
-      if ( reflectorDesc )
-         mCubeReflector.registerReflector( this, reflectorDesc );
-   }
-
    _updateShouldTick();
 
    // Accumulation and environment mapping
@@ -387,10 +379,23 @@ bool TSStatic::onAdd()
 
 bool TSStatic::setShapeAsset(const StringTableEntry shapeAssetId)
 {
-   mShapeAssetId = shapeAssetId;
+   if (ShapeAsset::getAssetById(StringTable->insert(shapeAssetId), &mShapeAsset))
+   {
+      //Special exception case. If we've defaulted to the 'no shape' mesh, don't save it out, we'll retain the original ids/paths so it doesn't break
+      //the TSStatic
+      if (mShapeAsset.getAssetId() != StringTable->insert("Core_Rendering:noshape"))
+      {
+         mShapeName = StringTable->EmptyString();
+      }
 
-   _createShape();
-   return true;
+      _createShape();
+
+      return true;
+   }
+   else
+   {
+      return false;
+   }
 }
 
 bool TSStatic::_createShape()
@@ -403,54 +408,30 @@ bool TSStatic::_createShape()
    SAFE_DELETE( mPhysicsRep );
    SAFE_DELETE( mShapeInstance );
    mAmbientThread = NULL;
-   mShape = NULL;
 
-   if (mShapeAssetId != StringTable->EmptyString())
-   {
-      mShapeAsset = mShapeAssetId;
-
-      if (mShapeAsset.isNull())
-      {
-         Con::errorf("[TSStatic] Failed to load shape asset.");
-         return false;
-      }
-
-      mShape = mShapeAsset->getShapeResource();
-
-      if(!mShape)
-      {
-         Con::errorf("TSStatic::_createShape() - Shape Asset had no valid shape!");
-         return false;
-      }
-   }
-   else
+   if (mShapeAsset.isNull())
    {
-      if (!mShapeName || mShapeName[0] == '\0')
-      {
-         Con::errorf("TSStatic::_createShape() - No shape name!");
-         return false;
-      }
-
-      mShapeHash = _StringTable::hashString(mShapeName);
-
-      mShape = ResourceManager::get().load(mShapeName);
+      Con::errorf("[TSStatic] Failed to load shape asset.");
+      return false;
    }
 
-   if ( bool(mShape) == false )
+   if(!mShapeAsset->getShapeResource())
    {
-      Con::errorf( "TSStatic::_createShape() - Unable to load shape: %s", mShapeName );
+      Con::errorf("TSStatic::_createShape() - Shape Asset had no valid shape!");
       return false;
    }
 
    if (  isClientObject() && 
-         !mShape->preloadMaterialList(mShape.getPath()) && 
+         !mShapeAsset->getShapeResource()->preloadMaterialList(mShapeAsset->getShapeFile()) &&
          NetConnection::filesWereDownloaded() )
       return false;
 
-   mObjBox = mShape->mBounds;
+   TSShape* shape = mShapeAsset->getShapeResource();
+
+   mObjBox = shape->mBounds;
    resetWorldBox();
 
-   mShapeInstance = new TSShapeInstance( mShape, isClientObject() );
+   mShapeInstance = new TSShapeInstance(shape, isClientObject() );
    if (isClientObject())
    {
       mShapeInstance->cloneMaterialList();
@@ -468,7 +449,7 @@ bool TSStatic::_createShape()
    prepCollision();
 
    // Find the "ambient" animation if it exists
-   S32 ambientSeq = mShape->findSequence("ambient");
+   S32 ambientSeq = shape->findSequence("ambient");
 
    if ( ambientSeq > -1 && !mAmbientThread )
       mAmbientThread = mShapeInstance->addThread();
@@ -476,18 +457,8 @@ bool TSStatic::_createShape()
    if ( mAmbientThread )
       mShapeInstance->setSequence( mAmbientThread, ambientSeq, 0);
 
-   // Resolve CubeReflectorDesc.
-   if ( cubeDescName.isNotEmpty() )
-   {
-      Sim::findObject( cubeDescName, reflectorDesc );
-   }
-   else if( cubeDescId > 0 )
-   {
-      Sim::findObject( cubeDescId, reflectorDesc );
-   }
-
    //Set up the material slot vars for easy manipulation
-   S32 materialCount = mShape->materialList->getMaterialNameList().size(); //mMeshAsset->getMaterialCount();
+   S32 materialCount = shape->materialList->getMaterialNameList().size(); //mMeshAsset->getMaterialCount();
 
    if (isServerObject())
    {
@@ -495,7 +466,7 @@ bool TSStatic::_createShape()
 
       for (U32 i = 0; i < materialCount; i++)
       {
-         StringTableEntry materialname = StringTable->insert(mShape->materialList->getMaterialName(i).c_str());
+         StringTableEntry materialname = StringTable->insert(shape->materialList->getMaterialName(i).c_str());
 
          dSprintf(matFieldName, 128, "MaterialSlot%d", i);
          StringTableEntry matFld = StringTable->insert(matFieldName);
@@ -572,22 +543,24 @@ void TSStatic::prepCollision()
    mLOSDetails.clear();
    mConvexList->nukeList();
 
+   TSShape* shape = mShapeAsset->getShapeResource();
+
    if ( mCollisionType == CollisionMesh || mCollisionType == VisibleMesh )
    {
-      mShape->findColDetails( mCollisionType == VisibleMesh, &mCollisionDetails, &mLOSDetails );
+      shape->findColDetails( mCollisionType == VisibleMesh, &mCollisionDetails, &mLOSDetails );
       if ( mDecalType == mCollisionType )
       {
          mDecalDetailsPtr = &mCollisionDetails;
       }
       else if ( mDecalType == CollisionMesh || mDecalType == VisibleMesh )
       {
-         mShape->findColDetails( mDecalType == VisibleMesh, &mDecalDetails, 0 );
+         shape->findColDetails( mDecalType == VisibleMesh, &mDecalDetails, 0 );
          mDecalDetailsPtr = &mDecalDetails;
       }
    }
    else if ( mDecalType == CollisionMesh || mDecalType == VisibleMesh )
    {
-      mShape->findColDetails( mDecalType == VisibleMesh, &mDecalDetails, 0 );
+      shape->findColDetails( mDecalType == VisibleMesh, &mDecalDetails, 0 );
       mDecalDetailsPtr = &mDecalDetails;
    }
 
@@ -601,16 +574,18 @@ void TSStatic::_updatePhysics()
    if ( !PHYSICSMGR || mCollisionType == None )
       return;
 
+   TSShape* shape = mShapeAsset->getShapeResource();
+
    PhysicsCollision *colShape = NULL;
    if ( mCollisionType == Bounds )
    {
       MatrixF offset( true );
-      offset.setPosition( mShape->center );
+      offset.setPosition(shape->center );
       colShape = PHYSICSMGR->createCollision();
       colShape->addBox( getObjBox().getExtents() * 0.5f * mObjScale, offset );         
    }
    else
-      colShape = mShape->buildColShape( mCollisionType == VisibleMesh, getScale() );
+      colShape = shape->buildColShape( mCollisionType == VisibleMesh, getScale() );
 
    if ( colShape )
    {
@@ -643,8 +618,6 @@ void TSStatic::onRemove()
    mShapeInstance = NULL;
 
    mAmbientThread = NULL;
-   if ( isClientObject() )
-       mCubeReflector.unregisterReflector();
 
    Parent::onRemove();
 }
@@ -800,12 +773,6 @@ void TSStatic::prepRenderImage( SceneRenderState* state )
 
    F32 invScale = (1.0f/getMax(getMax(mObjScale.x,mObjScale.y),mObjScale.z));   
 
-   // If we're currently rendering our own reflection we
-   // don't want to render ourselves into it.
-   if ( mCubeReflector.isRendering() )
-      return;
-
-
    if ( mForceDetail == -1 )
       mShapeInstance->setDetailFromDistance( state, dist * invScale );
    else
@@ -822,9 +789,6 @@ void TSStatic::prepRenderImage( SceneRenderState* state )
    rdata.setFadeOverride( 1.0f );
    rdata.setOriginSort( mUseOriginSort );
 
-   if ( mCubeReflector.isEnabled() )
-      rdata.setCubemap( mCubeReflector.getCubemap() );
-
    // Acculumation
    rdata.setAccuTex(mAccuTex);
 
@@ -852,20 +816,6 @@ void TSStatic::prepRenderImage( SceneRenderState* state )
    mat.scale( mObjScale );
    GFX->setWorldMatrix( mat );
 
-   if ( state->isDiffusePass() && mCubeReflector.isEnabled() && mCubeReflector.getOcclusionQuery() )
-   {
-       RenderPassManager *pass = state->getRenderPass();
-       OccluderRenderInst *ri = pass->allocInst<OccluderRenderInst>();  
-       
-       ri->type = RenderPassManager::RIT_Occluder;
-       ri->query = mCubeReflector.getOcclusionQuery();
-       mObjToWorld.mulP( mObjBox.getCenter(), &ri->position );
-       ri->scale.set( mObjBox.getExtents() );
-       ri->orientation = pass->allocUniqueXform( mObjToWorld ); 
-       ri->isSphere = false;
-       state->getRenderPass()->addInst( ri );
-   }
-
    mShapeInstance->animate();
    if(mShapeInstance)
    {
@@ -969,8 +919,8 @@ U32 TSStatic::packUpdate(NetConnection *con, U32 mask, BitStream *stream)
 
    if (stream->writeFlag(mask & AdvancedStaticOptionsMask))
    {
-      stream->writeString(mShapeAssetId);
-      stream->writeString(mShapeName);
+      if(mShapeAsset->isAssetValid())
+         stream->writeString(mShapeAsset.getAssetId());
       
       stream->write((U32)mDecalType);
 
@@ -1002,11 +952,6 @@ U32 TSStatic::packUpdate(NetConnection *con, U32 mask, BitStream *stream)
    if ( mLightPlugin )
       retMask |= mLightPlugin->packUpdate(this, AdvancedStaticOptionsMask, con, mask, stream);
 
-   if( stream->writeFlag( reflectorDesc != NULL ) )
-   {
-      stream->writeRangedU32( reflectorDesc->getId(), DataBlockObjectIdFirst,  DataBlockObjectIdLast );
-   }
-
    stream->write(mOverrideColor);
 
    if (stream->writeFlag(mask & MaterialMask))
@@ -1081,9 +1026,7 @@ void TSStatic::unpackUpdate(NetConnection *con, BitStream *stream)
    {
       char buffer[256];
       stream->readString(buffer);
-      mShapeAssetId = StringTable->insert(buffer);
-
-      mShapeName = stream->readSTString();
+      mShapeAsset = StringTable->insert(buffer);
 
       stream->read((U32*)&mDecalType);
 
@@ -1118,11 +1061,6 @@ void TSStatic::unpackUpdate(NetConnection *con, BitStream *stream)
       mLightPlugin->unpackUpdate(this, con, stream);
    }
 
-   if( stream->readFlag() )
-   {
-      cubeDescId = stream->readRangedU32( DataBlockObjectIdFirst, DataBlockObjectIdLast );
-   }
-
    stream->read(&mOverrideColor);
 
    if (stream->readFlag())
@@ -1418,6 +1356,16 @@ void TSStatic::buildConvex(const Box3F& box, Convex* convex)
    }
 }
 
+Resource<TSShape> TSStatic::getShape() const
+{
+   if (mShapeAsset->isAssetValid())
+   {
+      return mShapeAsset->getShapeResource();
+   }
+
+   return nullptr;
+}
+
 SceneObject* TSStaticPolysoupConvex::smCurObject = NULL;
 
 TSStaticPolysoupConvex::TSStaticPolysoupConvex()
@@ -1586,7 +1534,7 @@ U32 TSStatic::getNumDetails()
 
 void TSStatic::updateMaterials()
 {
-   if (mChangingMaterials.empty() || !mShape)
+   if (mChangingMaterials.empty() || !mShapeAsset->getShapeResource())
       return;
 
    TSMaterialList* pMatList = mShapeInstance->getMaterialList();

+ 1 - 12
Engine/source/T3D/tsStatic.h

@@ -43,11 +43,6 @@
 #ifndef _TSSHAPE_H_
 #include "ts/tsShape.h"
 #endif
-
-#ifndef _REFLECTOR_H_
-   #include "scene/reflector.h"
-#endif
-
 #ifndef _ASSET_PTR_H_
 #include "assets/assetPtr.h"
 #endif 
@@ -179,18 +174,12 @@ protected:
    /// Start or stop processing ticks depending on our state.
    void _updateShouldTick();
 
-   String cubeDescName;
-   U32 cubeDescId;
-   ReflectorDesc *reflectorDesc;
-   CubeReflector mCubeReflector;
-
 protected:
 
    Convex *mConvexList;
 
    StringTableEntry  mShapeName;
    U32               mShapeHash;
-   Resource<TSShape> mShape;
    Vector<S32> mCollisionDetails;
    Vector<S32> mLOSDetails;
    TSShapeInstance *mShapeInstance;
@@ -261,7 +250,7 @@ public:
 
    bool allowPlayerStep() const { return mAllowPlayerStep; }
 
-   Resource<TSShape> getShape() const { return mShape; }
+   Resource<TSShape> getShape() const;
 	StringTableEntry getShapeFileName() { return mShapeName; }
    void setShapeFileName(StringTableEntry shapeName) { mShapeName = shapeName; }
   

+ 48 - 2
Templates/BaseGame/game/tools/assetBrowser/scripts/assetImport.cs

@@ -135,6 +135,29 @@ function findImageFile(%path, %materialName, %type)
       return %path @ "/" @ %materialName @ ".tif";
 }
 
+function getAssetTypeByFilename(%filePath)
+{
+   %fileExt = fileExt( %filePath );
+   
+   //add it to our array!
+   if(isImageFormat(%fileExt))
+      return "ImageAsset";
+   else if( isShapeFormat(%fileExt))
+      return "ShapeAsset";
+   else if( isSoundFormat(%fileExt))
+      return "SoundAsset";
+   else if( %fileExt $= ".cs" || %fileExt $= ".cs.dso" )
+      return "ScriptAsset";
+   else if( %fileExt $= ".gui" || %fileExt $= ".gui.dso" )
+      return "GUIAsset";
+   else if (%fileExt $= ".zip")
+      return "zip";
+   else if( %fileExt $= "")
+      return "folder";
+   
+   return "";
+}
+
 function AssetBrowser::onBeginDropFiles( %this )
 {   
    if(!AssetBrowser.isAwake())
@@ -405,20 +428,43 @@ function ImportAssetWindow::reloadImportOptionConfigs(%this)
 //
 function importLooseFile(%filePath, %forceAutoImport)
 {
+   %assetType = getAssetTypeByFilename(%filePath);
+   
    if(%forceAutoImport)
    {
       //If we're attempting to fast-track the import, check that that's even an option
       if(ImportAssetWindow.importConfigsList.count() == 0 || 
       EditorSettings.value("Assets/AssetImporDefaultConfig") $= "" || 
       EditorSettings.value("Assets/AutoImport", false) == false)
+      {
+         MessageBoxOK("Unable to AutoImport", "Attempted to import a loose file " @ %filePath @ " with AutoImport but was unable to either due to lacking a valid import config, or the editor settings are not set to auto import.");
          return false;      
+      }
+      
+      if(%assetType $= "folder" || %assetType $= "zip")
+      {
+         MessageBoxOK("Unable to AutoImport", "Unable to auto import folders or zips at this time");
+         return false; 
+      }
+      
+      if(%assetType $= "")
+      {
+         MessageBoxOK("Unable to AutoImport", "Unable to auto import unknown file type for file " @ %filePath);
+         return false; 
+      }
    }
-   %assetItem = AssetBrowser.addImportingAsset("ImageAsset", %filePath, "", "");
+   
+   %assetItem = AssetBrowser.addImportingAsset(%assetType, %filePath, "", "");
    ImportAssetItems.add(%assetItem);
    
    if(%forceAutoImport)
    {
-      AssetImportTargetModule.text = AssetBrowser.dirHandler.getModuleFromAddress(filePath(%filePath)).ModuleId;
+      %targetModule = AssetBrowser.dirHandler.getModuleFromAddress(filePath(%filePath)).ModuleId;
+      AssetImportTargetModule.text = %targetModule;
+      
+      %assetItem.moduleName = %targetModule;
+      
+      AssetBrowser.dirHandler.currentAddress = filePath(%filePath);
       
       //skip the refresh delay, we'll force it here
       ImportAssetWindow.doRefresh();

+ 6 - 3
Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/shape.cs

@@ -158,10 +158,13 @@ function AssetBrowser::importShapeAsset(%this, %assetItem)
    %assetImportSuccessful = TAMLWrite(%newAsset, %assetPath @ %assetName @ ".asset.taml"); 
    
    //and copy the file into the relevent directory
-   %doOverwrite = !AssetBrowser.isAssetReImport;
-   if(!pathCopy(%filePath, %assetFullPath, %doOverwrite))
+   if(filePath(%filePath) !$= filePath(%assetFullPath))
    {
-      error("Unable to import asset: " @ %filePath);
+      %doOverwrite = !AssetBrowser.isAssetReImport;
+      if(!pathCopy(%filePath, %assetFullPath, %doOverwrite))
+      {
+         error("Unable to import asset: " @ %filePath);
+      }
    }
    
    %constructor = ShapeEditor.findConstructor( %assetFullPath );