mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-01-19 20:24:49 +00:00
Merge pull request #1601 from marauder2k9-torque/Asset-Networking
Some checks are pending
Linux Build / ${{matrix.config.name}} (map[build_type:Release cc:gcc cxx:g++ generator:Ninja name:Ubuntu Latest GCC]) (push) Waiting to run
MacOSX Build / ${{matrix.config.name}} (map[build_type:Release cc:clang cxx:clang++ generator:Ninja name:MacOSX Latest Clang]) (push) Waiting to run
Windows Build / ${{matrix.config.name}} (map[build_type:Release cc:cl cxx:cl environment_script:C:/Program Files (x86)/Microsoft Visual Studio/2022/Enterprise/VC/Auxiliary/Build/vcvars64.bat generator:Visual Studio 17 2022 name:Windows Latest MSVC]) (push) Waiting to run
Some checks are pending
Linux Build / ${{matrix.config.name}} (map[build_type:Release cc:gcc cxx:g++ generator:Ninja name:Ubuntu Latest GCC]) (push) Waiting to run
MacOSX Build / ${{matrix.config.name}} (map[build_type:Release cc:clang cxx:clang++ generator:Ninja name:MacOSX Latest Clang]) (push) Waiting to run
Windows Build / ${{matrix.config.name}} (map[build_type:Release cc:cl cxx:cl environment_script:C:/Program Files (x86)/Microsoft Visual Studio/2022/Enterprise/VC/Auxiliary/Build/vcvars64.bat generator:Visual Studio 17 2022 name:Windows Latest MSVC]) (push) Waiting to run
Asset data management
This commit is contained in:
commit
af73e79424
|
|
@ -536,52 +536,12 @@ if (m##name##AssetId[index] != StringTable->EmptyString())\
|
|||
}
|
||||
|
||||
#define PACKDATA_SOUNDASSET_ARRAY(name, index)\
|
||||
if (stream->writeFlag(AssetDatabase.isDeclaredAsset(m##name##AssetId[index])))\
|
||||
{\
|
||||
stream->writeString(m##name##AssetId[index]);\
|
||||
}\
|
||||
else\
|
||||
{\
|
||||
if(stream->writeFlag(Sim::findObject(m##name##Name[index])))\
|
||||
{\
|
||||
SFXTrack* sndTrack = get##name##Profile(index);\
|
||||
if(stream->writeFlag(sndTrack != nullptr))\
|
||||
{\
|
||||
stream->writeRangedU32(SimObjectId(sndTrack->getId()), DataBlockObjectIdFirst, DataBlockObjectIdLast);\
|
||||
sfxWrite(stream, sndTrack);\
|
||||
}\
|
||||
}\
|
||||
else\
|
||||
{\
|
||||
stream->writeString(m##name##Name[index]);\
|
||||
}\
|
||||
}
|
||||
|
||||
AssetDatabase.packDataAsset(stream, m##name##AssetId[index])
|
||||
|
||||
//network recieve - datablock
|
||||
#define UNPACKDATA_SOUNDASSET_ARRAY(name, index)\
|
||||
if (stream->readFlag())\
|
||||
{\
|
||||
m##name##AssetId[index] = stream->readSTString();\
|
||||
_set##name(m##name##AssetId[index], index);\
|
||||
}\
|
||||
else\
|
||||
{\
|
||||
if(stream->readFlag())\
|
||||
{\
|
||||
String errorStr;\
|
||||
if(stream->readFlag())\
|
||||
{\
|
||||
m##name##SFXId[index] = stream->readRangedU32( DataBlockObjectIdFirst, DataBlockObjectIdLast );\
|
||||
sfxReadAndResolve(stream, &m##name##Profile[index], errorStr);\
|
||||
}\
|
||||
}\
|
||||
else\
|
||||
{\
|
||||
m##name##Name[index] = stream->readSTString(); \
|
||||
_set##name(m##name##Name[index], index); \
|
||||
}\
|
||||
}
|
||||
m##name##AssetId[index] = AssetDatabase.unpackDataAsset(stream)
|
||||
|
||||
#pragma endregion
|
||||
|
||||
#endif // _ASSET_BASE_H_
|
||||
|
|
|
|||
|
|
@ -59,122 +59,46 @@ if (m##name##AssetId != StringTable->EmptyString())\
|
|||
|
||||
//network send - datablock refactor
|
||||
#define PACKDATA_ASSET_REFACTOR(name)\
|
||||
if (stream->writeFlag(m##name##Asset.notNull()))\
|
||||
{\
|
||||
stream->writeString(m##name##Asset.getAssetId());\
|
||||
}\
|
||||
else if (stream->writeFlag(m##name##File != StringTable->EmptyString()))\
|
||||
{\
|
||||
stream->writeString(m##name##File);\
|
||||
}\
|
||||
AssetDatabase.packDataAsset(stream, m##name##Asset.getAssetId())
|
||||
|
||||
//network recieve - datablock
|
||||
#define UNPACKDATA_ASSET_REFACTOR(name)\
|
||||
if (stream->readFlag())\
|
||||
{\
|
||||
_set##name(stream->readSTString());\
|
||||
}\
|
||||
else if (stream->readFlag())\
|
||||
{\
|
||||
_set##name(stream->readSTString());\
|
||||
}\
|
||||
else\
|
||||
{\
|
||||
_set##name(StringTable->EmptyString());\
|
||||
}\
|
||||
m##name##Asset = AssetDatabase.unpackDataAsset(stream)
|
||||
|
||||
//network send - object-instance
|
||||
#define PACK_ASSET_REFACTOR(netconn, name)\
|
||||
if (stream->writeFlag(m##name##Asset.notNull()))\
|
||||
{\
|
||||
NetStringHandle assetIdStr = m##name##Asset.getAssetId();\
|
||||
netconn->packNetStringHandleU(stream, assetIdStr);\
|
||||
}\
|
||||
else if (stream->writeFlag(m##name##File != StringTable->EmptyString()))\
|
||||
{\
|
||||
NetStringHandle fileStr = m##name##File;\
|
||||
netconn->packNetStringHandleU(stream, fileStr);\
|
||||
}\
|
||||
AssetDatabase.packUpdateAsset(netconn, mask, stream, m##name##Asset.getAssetId())
|
||||
|
||||
//network recieve - object-instance
|
||||
#define UNPACK_ASSET_REFACTOR(netconn, name)\
|
||||
if (stream->readFlag())\
|
||||
{\
|
||||
_set##name(netconn->unpackNetStringHandleU(stream).getString());\
|
||||
}\
|
||||
else if (stream->readFlag())\
|
||||
{\
|
||||
_set##name(netconn->unpackNetStringHandleU(stream).getString());\
|
||||
}\
|
||||
else\
|
||||
{\
|
||||
_set##name(StringTable->EmptyString());\
|
||||
}\
|
||||
_set##name(AssetDatabase.unpackUpdateAsset(netconn, stream))
|
||||
|
||||
//network send - datablock
|
||||
#define PACKDATA_ASSET_ARRAY_REFACTOR(name, max)\
|
||||
for (U32 i = 0; i < max; i++)\
|
||||
{\
|
||||
if (stream->writeFlag(m##name##Asset[i].notNull()))\
|
||||
{\
|
||||
stream->writeString(m##name##Asset[i].getAssetId()); \
|
||||
}\
|
||||
else if (stream->writeFlag(m##name##File[i] != StringTable->EmptyString()))\
|
||||
{\
|
||||
stream->writeString(m##name##File[i]);\
|
||||
}\
|
||||
AssetDatabase.packDataAsset(stream, m##name##Asset[i].getAssetId());\
|
||||
}
|
||||
|
||||
//network recieve - datablock
|
||||
#define UNPACKDATA_ASSET_ARRAY_REFACTOR(name, max)\
|
||||
for (U32 i = 0; i < max; i++)\
|
||||
{\
|
||||
if (stream->readFlag())\
|
||||
{\
|
||||
m##name##Asset[i] = stream->readSTString();\
|
||||
}\
|
||||
else if (stream->readFlag())\
|
||||
{\
|
||||
_set##name(stream->readSTString(), i);\
|
||||
}\
|
||||
else\
|
||||
{\
|
||||
_set##name(StringTable->EmptyString(), i);\
|
||||
}\
|
||||
m##name##Asset[i] = AssetDatabase.unpackDataAsset(stream);\
|
||||
}
|
||||
|
||||
//network send - object-instance
|
||||
#define PACK_ASSET_ARRAY_REFACTOR(netconn, name, max)\
|
||||
for (U32 i = 0; i < max; i++)\
|
||||
{\
|
||||
if (stream->writeFlag(m##name##Asset[i].notNull()))\
|
||||
{\
|
||||
NetStringHandle assetIdStr = m##name##Asset[i].getAssetId();\
|
||||
netconn->packNetStringHandleU(stream, assetIdStr);\
|
||||
}\
|
||||
else if (stream->writeFlag(m##name##File[i] != StringTable->EmptyString()))\
|
||||
{\
|
||||
NetStringHandle fileStr = m##name##File[i];\
|
||||
netconn->packNetStringHandleU(stream, fileStr);\
|
||||
}\
|
||||
AssetDatabase.packUpdateAsset(netconn, mask, stream, m##name##Asset[i].getAssetId());\
|
||||
}
|
||||
|
||||
//network recieve - object-instance
|
||||
#define UNPACK_ASSET_ARRAY_REFACTOR(netconn, name, max)\
|
||||
for (U32 i = 0; i < max; i++)\
|
||||
{\
|
||||
if (stream->readFlag())\
|
||||
{\
|
||||
m##name##Asset[i] = StringTable->insert(netconn->unpackNetStringHandleU(stream).getString());\
|
||||
}\
|
||||
else if (stream->readFlag())\
|
||||
{\
|
||||
_set##name(StringTable->insert(netconn->unpackNetStringHandleU(stream).getString()), i);\
|
||||
}\
|
||||
else\
|
||||
{\
|
||||
_set##name(StringTable->EmptyString(), i);\
|
||||
}\
|
||||
_set##name(AssetDatabase.unpackUpdateAsset(netconn, stream), i);\
|
||||
}
|
||||
|
||||
#define DEF_ASSET_BINDS_REFACTOR(className,name)\
|
||||
|
|
@ -348,61 +272,19 @@ if (m##name##AssetId[index] != StringTable->EmptyString())\
|
|||
}
|
||||
//network send - datablock
|
||||
#define PACKDATA_ASSET_ARRAY(name, index)\
|
||||
if (stream->writeFlag(m##name##Asset[index].notNull()))\
|
||||
{\
|
||||
stream->writeString(m##name##Asset[index].getAssetId());\
|
||||
}\
|
||||
else if (stream->writeFlag(m##name##Name[index] != StringTable->EmptyString()))\
|
||||
{\
|
||||
stream->writeString(m##name##Name[index].getAssetId());\
|
||||
}\
|
||||
AssetDatabase.packDataAsset(stream, m##name##Asset[index].getAssetId())
|
||||
|
||||
//network recieve - datablock
|
||||
#define UNPACKDATA_ASSET_ARRAY(name, index)\
|
||||
if (stream->readFlag())\
|
||||
{\
|
||||
m##name##AssetId[index] = stream->readSTString();\
|
||||
_set##name(m##name##AssetId[index], index);\
|
||||
}\
|
||||
else if (stream->readFlag())\
|
||||
{\
|
||||
m##name##Name[index] = stream->readSTString();\
|
||||
_set##name(m##name##Name[index], index);\
|
||||
}\
|
||||
else\
|
||||
{\
|
||||
_set##name(StringTable->EmptyString());\
|
||||
}\
|
||||
m##name##Asset[index] = AssetDatabase.unpackDataAsset(stream)
|
||||
|
||||
//network send - object-instance
|
||||
#define PACK_ASSET_ARRAY(netconn, name, index)\
|
||||
if (stream->writeFlag(m##name##Asset[index].notNull()))\
|
||||
{\
|
||||
NetStringHandle assetIdStr = m##name##Asset[index].getAssetId();\
|
||||
netconn->packNetStringHandleU(stream, assetIdStr);\
|
||||
}\
|
||||
else if (stream->writeFlag(m##name##Name[index] != StringTable->EmptyString()))\
|
||||
{\
|
||||
NetStringHandle fileStr = m##name##Name[index].getAssetId();\
|
||||
netconn->packNetStringHandleU(stream, fileStr);\
|
||||
}\
|
||||
AssetDatabase.packUpdateAsset(netconn, mask, stream, m##name##Asset[index].getAssetId());
|
||||
|
||||
//network recieve - object-instance
|
||||
#define UNPACK_ASSET_ARRAY(netconn, name, index)\
|
||||
if (stream->readFlag())\
|
||||
{\
|
||||
m##name##AssetId[index] = StringTable->insert(netconn->unpackNetStringHandleU(stream).getString());\
|
||||
_set##name(m##name##AssetId[index], index);\
|
||||
}\
|
||||
else if (stream->readFlag())\
|
||||
{\
|
||||
m##name##Name[index] = StringTable->insert(netconn->unpackNetStringHandleU(stream).getString());\
|
||||
_set##name(m##name##Name[index], index);\
|
||||
}\
|
||||
else\
|
||||
{\
|
||||
_set##name(StringTable->EmptyString(), index);\
|
||||
}
|
||||
_set##name(AssetDatabase.unpackUpdateAsset(netconn, stream), index);
|
||||
|
||||
//script methods for class.asset acces
|
||||
//declare general get<entry>, get<entry>Asset and set<entry> methods
|
||||
|
|
|
|||
|
|
@ -964,6 +964,55 @@ bool AssetManager::renameReferencedAsset( const char* pAssetIdFrom, const char*
|
|||
return true;
|
||||
}
|
||||
|
||||
void AssetManager::packDataAsset(BitStream* stream, const char* pAssetId)
|
||||
{
|
||||
if(stream->writeFlag(isDeclaredAsset(pAssetId)))
|
||||
{
|
||||
stream->write(mAssetToNetId.find(pAssetId)->value);
|
||||
}
|
||||
}
|
||||
|
||||
const char* AssetManager::unpackDataAsset(BitStream* stream)
|
||||
{
|
||||
if (stream->readFlag())
|
||||
{
|
||||
typeAssetNetId netId;
|
||||
stream->read(&netId);
|
||||
|
||||
typeNetIdToAssetMap::iterator netChar = mNetIdToAsset.find(netId);
|
||||
if (netChar != mNetIdToAsset.end())
|
||||
{
|
||||
return netChar->value;
|
||||
}
|
||||
}
|
||||
|
||||
return StringTable->EmptyString();
|
||||
}
|
||||
|
||||
void AssetManager::packUpdateAsset(NetConnection* con, U32 mask, BitStream* stream, const char* pAssetId)
|
||||
{
|
||||
if (stream->writeFlag(isDeclaredAsset(pAssetId)))
|
||||
{
|
||||
stream->write(mAssetToNetId.find(pAssetId)->value);
|
||||
}
|
||||
}
|
||||
|
||||
const char* AssetManager::unpackUpdateAsset(NetConnection* con, BitStream* stream)
|
||||
{
|
||||
if (stream->readFlag())
|
||||
{
|
||||
typeAssetNetId netId;
|
||||
stream->read(&netId);
|
||||
|
||||
typeNetIdToAssetMap::iterator netChar = mNetIdToAsset.find(netId);
|
||||
if (netChar != mNetIdToAsset.end())
|
||||
{
|
||||
return netChar->value;
|
||||
}
|
||||
}
|
||||
return StringTable->EmptyString();
|
||||
}
|
||||
|
||||
bool AssetManager::compileAllAssets(const bool compressed, const bool includeUnloaded)
|
||||
{
|
||||
// Debug Profiling.
|
||||
|
|
@ -2642,6 +2691,17 @@ const char* AssetManager::getAssetLooseFile(const char* pAssetId, const S32& ind
|
|||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
static U32 HashAssetId(const char* str)
|
||||
{
|
||||
U32 hash = 2166136261u;
|
||||
while (*str)
|
||||
{
|
||||
hash ^= (U8)*str++;
|
||||
hash *= 16777619u;
|
||||
}
|
||||
return hash;
|
||||
}
|
||||
|
||||
bool AssetManager::scanDeclaredAssets( const char* pPath, const char* pExtension, const bool recurse, ModuleDefinition* pModuleDefinition )
|
||||
{
|
||||
// Debug Profiling.
|
||||
|
|
@ -2763,6 +2823,24 @@ bool AssetManager::scanDeclaredAssets( const char* pPath, const char* pExtension
|
|||
continue;
|
||||
}
|
||||
|
||||
U32 netId = HashAssetId(assetIdBuffer);
|
||||
|
||||
// Collision detection
|
||||
typeNetIdToAssetMap::iterator netIterator = mNetIdToAsset.find(netId);
|
||||
if (netIterator != mNetIdToAsset.end())
|
||||
{
|
||||
Con::errorf(
|
||||
"AssetManager: Hash collision for '%s' and '%s'",
|
||||
assetIdBuffer,
|
||||
mNetIdToAsset.find(netId)->value
|
||||
);
|
||||
|
||||
AssertFatal(false, "Asset hash collision detected.");
|
||||
}
|
||||
|
||||
mNetIdToAsset.insert(netId, foundAssetDefinition.mAssetId);
|
||||
mAssetToNetId.insert(foundAssetDefinition.mAssetId, netId);
|
||||
|
||||
// Create new asset definition.
|
||||
AssetDefinition* pAssetDefinition = new AssetDefinition( foundAssetDefinition );
|
||||
|
||||
|
|
|
|||
|
|
@ -59,6 +59,10 @@
|
|||
#include "assets/assetFieldTypes.h"
|
||||
#endif
|
||||
|
||||
#ifndef _NETCONNECTION_H_
|
||||
#include "sim/netConnection.h"
|
||||
#endif
|
||||
|
||||
// Debug Profiling.
|
||||
#include "platform/profiler.h"
|
||||
|
||||
|
|
@ -84,6 +88,11 @@ public:
|
|||
typedef HashTable<typeAssetId, typeAssetId> typeAssetIsDependedOnHash;
|
||||
typedef HashMap<AssetPtrBase*, AssetPtrCallback*> typeAssetPtrRefreshHash;
|
||||
|
||||
// ASSET NETWORK PACK
|
||||
typedef U32 typeAssetNetId;
|
||||
typedef HashMap<typeAssetNetId, typeAssetId> typeNetIdToAssetMap;
|
||||
typedef HashMap<typeAssetId, typeAssetNetId> typeAssetToNetIdMap;
|
||||
// ASSET NETWORK PACK END
|
||||
private:
|
||||
/// Declared assets.
|
||||
typeDeclaredAssetsHash mDeclaredAssets;
|
||||
|
|
@ -91,6 +100,11 @@ private:
|
|||
/// Referenced assets.
|
||||
typeReferencedAssetsHash mReferencedAssets;
|
||||
|
||||
// ASSET NETWORK PACK
|
||||
typeNetIdToAssetMap mNetIdToAsset;
|
||||
typeAssetToNetIdMap mAssetToNetId;
|
||||
// ASSET NETWORK PACK END
|
||||
|
||||
/// Asset dependencies.
|
||||
typeAssetDependsOnHash mAssetDependsOn;
|
||||
typeAssetIsDependedOnHash mAssetIsDependedOn;
|
||||
|
|
@ -151,6 +165,14 @@ public:
|
|||
bool isReferencedAsset( const char* pAssetId );
|
||||
bool renameReferencedAsset( const char* pAssetIdFrom, const char* pAssetIdTo );
|
||||
|
||||
// ASSET NETWORK PACK
|
||||
void packDataAsset(BitStream* stream, const char* pAssetId);
|
||||
const char* unpackDataAsset(BitStream* stream);
|
||||
|
||||
void packUpdateAsset(NetConnection* con, U32 mask, BitStream* stream, const char* pAssetId);
|
||||
const char* unpackUpdateAsset(NetConnection* con, BitStream* stream);
|
||||
// ASSET NETWORK PACK END
|
||||
|
||||
/// <summary>
|
||||
/// Compile all assets.
|
||||
/// </summary>
|
||||
|
|
|
|||
Loading…
Reference in a new issue