void Interface::DeleteRwObject( RwObject *obj ) { EngineInterface *engineInterface = (EngineInterface*)this; // Delete it using the type system. GenericRTTI *rttiObj = engineInterface->typeSystem.GetTypeStructFromAbstractObject( obj ); if ( rttiObj ) { // By default, we can destroy. bool canDestroy = true; // If we have the refcount plugin, we want to handle things with it. if ( refCountManager *refMan = refCountRegister.GetPluginStruct( engineInterface ) ) { if ( refCountPlugin *refCountObj = RwTypeSystem::RESOLVE_STRUCT <refCountPlugin> ( engineInterface, rttiObj, engineInterface->rwobjTypeInfo, refMan->pluginOffset ) ) { canDestroy = refCountObj->RemoveRef(); } } if ( canDestroy ) { engineInterface->typeSystem.Destroy( engineInterface, rttiObj ); } } }
const TexDictionary* ToConstTexDictionary( Interface *intf, const RwObject *rwObj ) { EngineInterface *engineInterface = (EngineInterface*)intf; texDictionaryStreamPlugin *txdStream = texDictionaryStreamStore.GetPluginStruct( engineInterface ); if ( txdStream ) { return txdStream->ToConstTexDictionary( engineInterface, rwObj ); } return NULL; }
void ReleaseObject( RwObject *obj ) { EngineInterface *engineInterface = (EngineInterface*)obj->engineInterface; // Increase the reference count. if ( refCountManager *refMan = refCountRegister.GetPluginStruct( (EngineInterface*)engineInterface ) ) { if ( refCountPlugin *refCount = refMan->GetPluginStruct( engineInterface, obj ) ) { // We just delete the object. engineInterface->DeleteRwObject( obj ); } } }
TexDictionary* CreateTexDictionary( Interface *intf ) { EngineInterface *engineInterface = (EngineInterface*)intf; TexDictionary *texDictOut = NULL; texDictionaryStreamPlugin *txdStream = texDictionaryStreamStore.GetPluginStruct( engineInterface ); if ( txdStream ) { texDictOut = txdStream->CreateTexDictionary( engineInterface ); } return texDictOut; }
uint32 GetRefCount( RwObject *obj ) { uint32 refCountNum = 1; // If we do not support reference counting, this is actually a valid value. EngineInterface *engineInterface = (EngineInterface*)obj->engineInterface; // Increase the reference count. if ( refCountManager *refMan = refCountRegister.GetPluginStruct( engineInterface ) ) { if ( refCountPlugin *refCount = refMan->GetPluginStruct( engineInterface, obj ) ) { // We just delete the object. refCountNum = refCount->refCount; } } return refCountNum; }
// Acquisition routine for objects, so that reference counting is increased, if needed. // Can return NULL if the reference count could not be increased. RwObject* AcquireObject( RwObject *obj ) { EngineInterface *engineInterface = (EngineInterface*)obj->engineInterface; // Increase the reference count. if ( refCountManager *refMan = refCountRegister.GetPluginStruct( engineInterface ) ) { if ( refCountPlugin *refCount = refMan->GetPluginStruct( engineInterface, obj ) ) { // TODO: make sure that incrementing is actually possible. // we cannot increment if we would overflow the number, for instance. refCount->AddRef(); } } return obj; }
inline fsRandomGeneratorEnv* GetRandomEnv( CFileSystem *fsys ) { return fsRandomGeneratorRegister.GetPluginStruct( (CFileSystemNative*)fsys ); }