Merge pull request #1146 from Azaezel/alpha41/guiObjectViewObjections

Alpha41/gui object view objections
This commit is contained in:
Brian Roberts 2023-12-05 23:20:21 -06:00 committed by GitHub
commit 378c5481ee
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 130 additions and 128 deletions

View file

@ -91,7 +91,7 @@ IMPLEMENT_CALLBACK( GuiObjectView, onMouseLeave, void, (),(),
GuiObjectView::GuiObjectView() GuiObjectView::GuiObjectView()
: mMouseState( None ), : mMouseState( None ),
mLastMousePoint( 0, 0 ), mLastMousePoint( 0, 0 ),
mModel( NULL ), mModelInstance(NULL),
mMaxOrbitDist( 5.0f ), mMaxOrbitDist( 5.0f ),
mMinOrbitDist( 0.0f ), mMinOrbitDist( 0.0f ),
mCameraRotation( 0.0f, 0.0f, 0.0f ), mCameraRotation( 0.0f, 0.0f, 0.0f ),
@ -99,13 +99,13 @@ GuiObjectView::GuiObjectView()
mCameraSpeed( 0.01f ), mCameraSpeed( 0.01f ),
mMountNode( -1 ), mMountNode( -1 ),
mMountNodeName( "mount0" ), mMountNodeName( "mount0" ),
mMountedModel( NULL ), mMountedModelInstance( NULL ),
mAnimationSeq( -1 ), mAnimationSeq( -1 ),
mRunThread( NULL ), mRunThread( NULL ),
mLastRenderTime( 0 ), mLastRenderTime( 0 ),
mLight( NULL ), mLight( NULL ),
mLightColor( 1.0f, 1.0f, 1.0f ), mLightColor( 1.0f, 1.0f, 1.0f ),
mLightAmbient( 0.5f, 0.5f, 0.5f ), mLightAmbient( 1.0f, 1.0f, 1.0f ),
mLightDirection( 0.f, 0.707f, -0.707f ) mLightDirection( 0.f, 0.707f, -0.707f )
{ {
mCameraMatrix.identity(); mCameraMatrix.identity();
@ -117,16 +117,14 @@ GuiObjectView::GuiObjectView()
// By default don't do dynamic reflection // By default don't do dynamic reflection
// updates for this viewport. // updates for this viewport.
mReflectPriority = 0.0f; mReflectPriority = 0.0f;
INIT_ASSET(Model);
INIT_ASSET(MountedModel);
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
GuiObjectView::~GuiObjectView() GuiObjectView::~GuiObjectView()
{ {
if( mModel )
SAFE_DELETE( mModel );
if( mMountedModel )
SAFE_DELETE( mMountedModel );
if( mLight ) if( mLight )
SAFE_DELETE( mLight ); SAFE_DELETE( mLight );
} }
@ -137,12 +135,9 @@ void GuiObjectView::initPersistFields()
{ {
docsURL; docsURL;
addGroup( "Model" ); addGroup( "Model" );
INITPERSISTFIELD_SHAPEASSET(Model, GuiObjectView, "The source shape asset.");
addField( "shapeFile", TypeStringFilename, Offset( mModelName, GuiObjectView ),
"The object model shape file to show in the view." );
addField( "skin", TypeRealString, Offset( mSkinName, GuiObjectView ), addField( "skin", TypeRealString, Offset( mSkinName, GuiObjectView ),
"The skin to use on the object model." ); "The skin to use on the object model." );
endGroup( "Model" ); endGroup( "Model" );
addGroup( "Animation" ); addGroup( "Animation" );
@ -153,9 +148,7 @@ void GuiObjectView::initPersistFields()
endGroup( "Animation" ); endGroup( "Animation" );
addGroup( "Mounting" ); addGroup( "Mounting" );
INITPERSISTFIELD_SHAPEASSET(MountedModel, GuiObjectView, "The mounted shape asset.");
addField( "mountedShapeFile", TypeStringFilename, Offset( mMountedModelName, GuiObjectView ),
"Optional shape file to mount on the primary model (e.g. weapon)." );
addField( "mountedSkin", TypeRealString, Offset( mMountSkinName, GuiObjectView ), addField( "mountedSkin", TypeRealString, Offset( mMountSkinName, GuiObjectView ),
"Skin name used on mounted shape file." ); "Skin name used on mounted shape file." );
addField( "mountedNode", TypeRealString, Offset( mMountNodeName, GuiObjectView ), addField( "mountedNode", TypeRealString, Offset( mMountNodeName, GuiObjectView ),
@ -197,9 +190,7 @@ void GuiObjectView::onStaticModified( StringTableEntry slotName, const char* new
{ {
Parent::onStaticModified( slotName, newValue ); Parent::onStaticModified( slotName, newValue );
static StringTableEntry sShapeFile = StringTable->insert( "shapeFile" );
static StringTableEntry sSkin = StringTable->insert( "skin" ); static StringTableEntry sSkin = StringTable->insert( "skin" );
static StringTableEntry sMountedShapeFile = StringTable->insert( "mountedShapeFile" );
static StringTableEntry sMountedSkin = StringTable->insert( "mountedSkin" ); static StringTableEntry sMountedSkin = StringTable->insert( "mountedSkin" );
static StringTableEntry sMountedNode = StringTable->insert( "mountedNode" ); static StringTableEntry sMountedNode = StringTable->insert( "mountedNode" );
static StringTableEntry sLightColor = StringTable->insert( "lightColor" ); static StringTableEntry sLightColor = StringTable->insert( "lightColor" );
@ -211,12 +202,8 @@ void GuiObjectView::onStaticModified( StringTableEntry slotName, const char* new
static StringTableEntry sCameraRotation = StringTable->insert( "cameraRotation" ); static StringTableEntry sCameraRotation = StringTable->insert( "cameraRotation" );
static StringTableEntry sAnimSequence = StringTable->insert( "animSequence" ); static StringTableEntry sAnimSequence = StringTable->insert( "animSequence" );
if( slotName == sShapeFile ) if( slotName == sSkin )
setObjectModel( String( mModelName ) );
else if( slotName == sSkin )
setSkin( String( mSkinName ) ); setSkin( String( mSkinName ) );
else if( slotName == sMountedShapeFile )
setMountedObject( String( mMountedModelName ) );
else if( slotName == sMountedSkin ) else if( slotName == sMountedSkin )
setMountSkin( String( mMountSkinName ) ); setMountSkin( String( mMountSkinName ) );
else if( slotName == sMountedNode ) else if( slotName == sMountedNode )
@ -325,7 +312,7 @@ void GuiObjectView::setObjectAnimation( S32 index )
mAnimationSeq = index; mAnimationSeq = index;
mAnimationSeqName = String(); mAnimationSeqName = String();
if( mModel ) if(mModelInstance)
_initAnimation(); _initAnimation();
} }
@ -336,107 +323,123 @@ void GuiObjectView::setObjectAnimation( const String& sequenceName )
mAnimationSeq = -1; mAnimationSeq = -1;
mAnimationSeqName = sequenceName; mAnimationSeqName = sequenceName;
if( mModel ) if(mModelInstance)
_initAnimation(); _initAnimation();
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
void GuiObjectView::setObjectModel( const String& modelName ) bool GuiObjectView::setObjectModel( const String& modelName )
{ {
SAFE_DELETE( mModel );
mRunThread = 0; mRunThread = 0;
mModelName = String::EmptyString;
// Load the shape. // Load the shape.
_setModel(modelName);
Resource< TSShape > model = ResourceManager::get().load( modelName ); if( !getModelResource())
if( !model )
{ {
Con::warnf( "GuiObjectView::setObjectModel - Failed to load model '%s'", modelName.c_str() ); Con::warnf( "GuiObjectView::setObjectModel - Failed to load model '%s'", modelName.c_str() );
return; return false;
} }
if (!getModelResource()->preloadMaterialList(getModelResource().getPath())) return false;
// Instantiate it. // Instantiate it.
mModel = new TSShapeInstance( model, true ); mModelInstance = new TSShapeInstance(getModelResource(), true );
mModelName = modelName; mModelInstance->resetMaterialList();
mModelInstance->cloneMaterialList();
if( !mSkinName.isEmpty() ) if( !mSkinName.isEmpty() )
mModel->reSkin( mSkinName ); mModelInstance->reSkin( mSkinName );
TSMaterialList* pMatList = mModelInstance->getMaterialList();
pMatList->setTextureLookupPath(mModelAsset->getShapeFileName());
mModelInstance->initMaterialList();
// Initialize camera values. // Initialize camera values.
mOrbitPos = mModel->getShape()->center; mOrbitPos = getModelResource()->center;
mMinOrbitDist = mModel->getShape()->mRadius; mMinOrbitDist = getModelResource()->mRadius;
// Initialize animation. // Initialize animation.
_initAnimation(); _initAnimation();
_initMount(); _initMount();
return true;
}
void GuiObjectView::onModelChanged()
{
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
void GuiObjectView::setSkin( const String& name ) void GuiObjectView::setSkin( const String& name )
{ {
if( mModel ) if(mModelInstance)
mModel->reSkin( name, mSkinName ); mModelInstance->reSkin( name, mSkinName );
mSkinName = name; mSkinName = name;
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
void GuiObjectView::setMountSkin( const String& name ) bool GuiObjectView::setMountedObject( const String& modelName )
{ {
if( mMountedModel ) // Load the model.
mMountedModel->reSkin( name, mMountSkinName ); _setMountedModel(modelName);
if (!getMountedModelResource())
{
Con::warnf("GuiObjectView::setMountedObject - Failed to load model '%s'", modelName.c_str());
return false;
}
if (!getMountedModelResource()->preloadMaterialList(getMountedModelResource().getPath())) return false;
mMountedModelInstance = new TSShapeInstance(getMountedModelResource(), true);
mMountedModelInstance->resetMaterialList();
mMountedModelInstance->cloneMaterialList();
if( !mMountSkinName.isEmpty() )
mMountedModelInstance->reSkin( mMountSkinName );
mMountedModelInstance->initMaterialList();
if(mMountedModelInstance)
_initMount();
return true;
}
void GuiObjectView::onMountedModelChanged()
{
}
//------------------------------------------------------------------------------
void GuiObjectView::setMountSkin(const String& name)
{
if (mMountedModelInstance)
mMountedModelInstance->reSkin(name, mMountSkinName);
mMountSkinName = name; mMountSkinName = name;
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
void GuiObjectView::setMountNode( S32 index ) void GuiObjectView::setMountNode(S32 index)
{ {
setMountNode( String::ToString( "mount%i", index ) ); setMountNode(String::ToString("mount%i", index));
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
void GuiObjectView::setMountNode( const String& name ) void GuiObjectView::setMountNode(const String& name)
{ {
mMountNodeName = name; mMountNodeName = name;
if( mModel ) if (mModelInstance)
_initMount();
}
//------------------------------------------------------------------------------
void GuiObjectView::setMountedObject( const String& modelName )
{
SAFE_DELETE( mMountedModel );
mMountedModelName = String::EmptyString;
// Load the model.
Resource< TSShape > model = ResourceManager::get().load( modelName );
if( !model )
{
Con::warnf( "GuiObjectView::setMountedObject - Failed to load object model '%s'",
modelName.c_str() );
return;
}
mMountedModel = new TSShapeInstance( model, true );
mMountedModelName = modelName;
if( !mMountSkinName.isEmpty() )
mMountedModel->reSkin( mMountSkinName );
if( mModel )
_initMount(); _initMount();
} }
@ -483,7 +486,7 @@ void GuiObjectView::onMouseLeave( const GuiEvent & event )
void GuiObjectView::renderWorld( const RectI& updateRect ) void GuiObjectView::renderWorld( const RectI& updateRect )
{ {
if( !mModel ) if( !mModelInstance)
return; return;
GFXTransformSaver _saveTransforms; GFXTransformSaver _saveTransforms;
@ -538,26 +541,26 @@ void GuiObjectView::renderWorld( const RectI& updateRect )
// Render primary model. // Render primary model.
if( mModel ) if(mModelInstance)
{ {
if( mRunThread ) if( mRunThread )
{ {
mModel->advanceTime( dt / 1000.f, mRunThread ); mModelInstance->advanceTime( dt / 1000.f, mRunThread );
mModel->animate(); mModelInstance->animate();
} }
mModel->render( rdata ); mModelInstance->render( rdata );
} }
// Render mounted model. // Render mounted model.
if( mMountedModel && mMountNode != -1 ) if( mMountedModelInstance && mMountNode != -1 )
{ {
GFX->pushWorldMatrix(); GFX->pushWorldMatrix();
GFX->multWorld( mModel->mNodeTransforms[ mMountNode ] ); GFX->multWorld(mModelInstance->mNodeTransforms[ mMountNode ] );
GFX->multWorld( mMountTransform ); GFX->multWorld( mMountTransform );
mMountedModel->render( rdata ); mMountedModelInstance->render( rdata );
GFX->popWorldMatrix(); GFX->popWorldMatrix();
} }
@ -620,7 +623,7 @@ void GuiObjectView::setLightDirection( const Point3F& direction )
void GuiObjectView::_initAnimation() void GuiObjectView::_initAnimation()
{ {
AssertFatal( mModel, "GuiObjectView::_initAnimation - No model loaded!" ); AssertFatal(getModelResource(), "GuiObjectView::_initAnimation - No model loaded!" );
if( mAnimationSeqName.isEmpty() && mAnimationSeq == -1 ) if( mAnimationSeqName.isEmpty() && mAnimationSeq == -1 )
return; return;
@ -629,7 +632,7 @@ void GuiObjectView::_initAnimation()
if( !mAnimationSeqName.isEmpty() ) if( !mAnimationSeqName.isEmpty() )
{ {
mAnimationSeq = mModel->getShape()->findSequence( mAnimationSeqName ); mAnimationSeq = getModelResource()->findSequence( mAnimationSeqName );
if( mAnimationSeq == -1 ) if( mAnimationSeq == -1 )
{ {
@ -646,7 +649,7 @@ void GuiObjectView::_initAnimation()
if( mAnimationSeq != -1 ) if( mAnimationSeq != -1 )
{ {
if( mAnimationSeq >= mModel->getShape()->sequences.size() ) if( mAnimationSeq >= getModelResource()->sequences.size() )
{ {
Con::errorf( "GuiObjectView::_initAnimation - Sequence '%i' out of range for model '%s'", Con::errorf( "GuiObjectView::_initAnimation - Sequence '%i' out of range for model '%s'",
mAnimationSeq, mAnimationSeq,
@ -658,9 +661,9 @@ void GuiObjectView::_initAnimation()
} }
if( !mRunThread ) if( !mRunThread )
mRunThread = mModel->addThread(); mRunThread = mModelInstance->addThread();
mModel->setSequence( mRunThread, mAnimationSeq, 0.f ); mModelInstance->setSequence( mRunThread, mAnimationSeq, 0.f );
} }
mLastRenderTime = Platform::getVirtualMilliseconds(); mLastRenderTime = Platform::getVirtualMilliseconds();
@ -670,9 +673,9 @@ void GuiObjectView::_initAnimation()
void GuiObjectView::_initMount() void GuiObjectView::_initMount()
{ {
AssertFatal( mModel, "GuiObjectView::_initMount - No model loaded!" ); AssertFatal(mModelInstance, "GuiObjectView::_initMount - No model loaded!" );
if( !mMountedModel ) if( !mModelInstance)
return; return;
mMountTransform.identity(); mMountTransform.identity();
@ -681,7 +684,7 @@ void GuiObjectView::_initMount()
if( !mMountNodeName.isEmpty() ) if( !mMountNodeName.isEmpty() )
{ {
mMountNode = mModel->getShape()->findNode( mMountNodeName ); mMountNode = getModelResource()->findNode( mMountNodeName );
if( mMountNode == -1 ) if( mMountNode == -1 )
{ {
Con::errorf( "GuiObjectView::_initMount - No node '%s' on '%s'", Con::errorf( "GuiObjectView::_initMount - No node '%s' on '%s'",
@ -695,7 +698,7 @@ void GuiObjectView::_initMount()
// Make sure mount node is valid. // Make sure mount node is valid.
if( mMountNode != -1 && mMountNode >= mModel->getShape()->nodes.size() ) if( mMountNode != -1 && mMountNode >= getModelResource()->nodes.size() )
{ {
Con::errorf( "GuiObjectView::_initMount - Mount node index '%i' out of range for '%s'", Con::errorf( "GuiObjectView::_initMount - Mount node index '%i' out of range for '%s'",
mMountNode, mMountNode,
@ -708,11 +711,11 @@ void GuiObjectView::_initMount()
// Look up node on the mounted model from // Look up node on the mounted model from
// which to mount to the primary model's node. // which to mount to the primary model's node.
if (!getMountedModelResource()) return;
S32 mountPoint = mMountedModel->getShape()->findNode( "mountPoint" ); S32 mountPoint = getMountedModelResource()->findNode( "mountPoint" );
if( mountPoint != -1 ) if( mountPoint != -1 )
{ {
mMountedModel->getShape()->getNodeWorldTransform( mountPoint, &mMountTransform ), getMountedModelResource()->getNodeWorldTransform(mountPoint, &mMountTransform),
mMountTransform.inverse(); mMountTransform.inverse();
} }
} }
@ -733,12 +736,12 @@ DefineEngineMethod( GuiObjectView, getModel, const char*, (),,
"@return Name of the displayed model.\n\n" "@return Name of the displayed model.\n\n"
"@see GuiControl") "@see GuiControl")
{ {
return Con::getReturnBuffer( object->getModelName() ); return Con::getReturnBuffer( object->getModel() );
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
DefineEngineMethod( GuiObjectView, setModel, void, (const char* shapeName),, DefineEngineMethod( GuiObjectView, setModel, bool, (const char* shapeName),,
"@brief Sets the model to be displayed in this control.\n\n" "@brief Sets the model to be displayed in this control.\n\n"
"@param shapeName Name of the model to display.\n" "@param shapeName Name of the model to display.\n"
"@tsexample\n" "@tsexample\n"
@ -749,7 +752,7 @@ DefineEngineMethod( GuiObjectView, setModel, void, (const char* shapeName),,
"@endtsexample\n\n" "@endtsexample\n\n"
"@see GuiControl") "@see GuiControl")
{ {
object->setObjectModel( shapeName ); return object->setObjectModel( shapeName );
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@ -763,7 +766,7 @@ DefineEngineMethod( GuiObjectView, getMountedModel, const char*, (),,
"@return Name of the mounted model.\n\n" "@return Name of the mounted model.\n\n"
"@see GuiControl") "@see GuiControl")
{ {
return Con::getReturnBuffer( object->getMountedModelName() ); return Con::getReturnBuffer( object->getMountedModel() );
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------

View file

@ -69,12 +69,17 @@ class GuiObjectView : public GuiTSCtrl
/// @name Model /// @name Model
/// @{ /// @{
/// Name of the model loaded for display. ///Model loaded for display.
StringTableEntry mModelName; DECLARE_SHAPEASSET(GuiObjectView, Model, onModelChanged);
static bool _setModelData(void* obj, const char* index, const char* data)\
/// Model being displayed in the view. {
TSShapeInstance* mModel; bool ret = false;
GuiObjectView* object = static_cast<GuiObjectView*>(obj);
ret = object->setObjectModel(StringTable->insert(data));
return ret;
}
void onModelChanged();
TSShapeInstance* mModelInstance;
/// Name of skin to use on model. /// Name of skin to use on model.
String mSkinName; String mSkinName;
@ -103,8 +108,17 @@ class GuiObjectView : public GuiTSCtrl
/// @name Mounting /// @name Mounting
/// @{ /// @{
/// Name of model to mount to the primary model. ///Model to mount to the primary model.
String mMountedModelName; DECLARE_SHAPEASSET(GuiObjectView, MountedModel, onMountedModelChanged);
static bool _setMountedModelData(void* obj, const char* index, const char* data)\
{
bool ret = false;
GuiObjectView* object = static_cast<GuiObjectView*>(obj);
ret = object->setMountedObject(StringTable->insert(data));
return ret;
}
void onMountedModelChanged();
TSShapeInstance* mMountedModelInstance;
/// ///
String mMountSkinName; String mMountSkinName;
@ -115,9 +129,6 @@ class GuiObjectView : public GuiTSCtrl
/// Name of node to mount the secondary model to. Unset by default. /// Name of node to mount the secondary model to. Unset by default.
String mMountNodeName; String mMountNodeName;
/// Model mounted as an image to the primary model.
TSShapeInstance* mMountedModel;
/// ///
MatrixF mMountTransform; MatrixF mMountTransform;
@ -174,12 +185,6 @@ class GuiObjectView : public GuiTSCtrl
/// @name Model /// @name Model
/// @{ /// @{
///
const String& getModelName() const { return mModelName; }
/// Return the instance of the model being rendered in the view.
TSShapeInstance* getModel() const { return mModel; }
/// Return the name of the skin used on the primary model. /// Return the name of the skin used on the primary model.
const String& getSkin() const { return mSkinName; } const String& getSkin() const { return mSkinName; }
@ -187,7 +192,7 @@ class GuiObjectView : public GuiTSCtrl
void setSkin( const String& name ); void setSkin( const String& name );
/// Set the model to show in this view. /// Set the model to show in this view.
void setObjectModel( const String& modelName ); bool setObjectModel( const String& modelName );
/// @} /// @}
@ -207,12 +212,6 @@ class GuiObjectView : public GuiTSCtrl
/// @name Mounting /// @name Mounting
/// @{ /// @{
/// Return the model mounted to the current primary model; NULL if none.
TSShapeInstance* getMountedModel() const { return mMountedModel; }
///
const String& getMountedModelName() const { return mMountedModelName; }
/// Return the name of the skin used on the mounted model. /// Return the name of the skin used on the mounted model.
const String& getMountSkin() const { return mMountSkinName; } const String& getMountSkin() const { return mMountSkinName; }
@ -226,7 +225,7 @@ class GuiObjectView : public GuiTSCtrl
void setMountNode( const String& nodeName ); void setMountNode( const String& nodeName );
/// ///
void setMountedObject( const String& modelName ); bool setMountedObject( const String& modelName );
/// @} /// @}