mirror of
https://thingvellir.net/git/overte
synced 2025-03-27 23:52:03 +01:00
Merge branch 'master' of https://github.com/highfidelity/hifi
This commit is contained in:
commit
0a5302ce25
14 changed files with 115 additions and 89 deletions
|
@ -235,7 +235,8 @@ void updateConsumedCores() {
|
||||||
AssetServer::AssetServer(ReceivedMessage& message) :
|
AssetServer::AssetServer(ReceivedMessage& message) :
|
||||||
ThreadedAssignment(message),
|
ThreadedAssignment(message),
|
||||||
_transferTaskPool(this),
|
_transferTaskPool(this),
|
||||||
_bakingTaskPool(this)
|
_bakingTaskPool(this),
|
||||||
|
_filesizeLimit(MAX_UPLOAD_SIZE)
|
||||||
{
|
{
|
||||||
// store the current state of image compression so we can reset it when this assignment is complete
|
// store the current state of image compression so we can reset it when this assignment is complete
|
||||||
_wasColorTextureCompressionEnabled = image::isColorTexturesCompressionEnabled();
|
_wasColorTextureCompressionEnabled = image::isColorTexturesCompressionEnabled();
|
||||||
|
@ -343,8 +344,8 @@ void AssetServer::completeSetup() {
|
||||||
auto maxBandwidthValue = assetServerObject[MAX_BANDWIDTH_OPTION];
|
auto maxBandwidthValue = assetServerObject[MAX_BANDWIDTH_OPTION];
|
||||||
auto maxBandwidthFloat = maxBandwidthValue.toDouble(-1);
|
auto maxBandwidthFloat = maxBandwidthValue.toDouble(-1);
|
||||||
|
|
||||||
|
const int BITS_PER_MEGABITS = 1000 * 1000;
|
||||||
if (maxBandwidthFloat > 0.0) {
|
if (maxBandwidthFloat > 0.0) {
|
||||||
const int BITS_PER_MEGABITS = 1000 * 1000;
|
|
||||||
int maxBandwidth = maxBandwidthFloat * BITS_PER_MEGABITS;
|
int maxBandwidth = maxBandwidthFloat * BITS_PER_MEGABITS;
|
||||||
nodeList->setConnectionMaxBandwidth(maxBandwidth);
|
nodeList->setConnectionMaxBandwidth(maxBandwidth);
|
||||||
qCInfo(asset_server) << "Set maximum bandwith per connection to" << maxBandwidthFloat << "Mb/s."
|
qCInfo(asset_server) << "Set maximum bandwith per connection to" << maxBandwidthFloat << "Mb/s."
|
||||||
|
@ -406,6 +407,15 @@ void AssetServer::completeSetup() {
|
||||||
qCCritical(asset_server) << "Asset Server assignment will not continue because mapping file could not be loaded.";
|
qCCritical(asset_server) << "Asset Server assignment will not continue because mapping file could not be loaded.";
|
||||||
setFinished(true);
|
setFinished(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// get file size limit for an asset
|
||||||
|
static const QString ASSETS_FILESIZE_LIMIT_OPTION = "assets_filesize_limit";
|
||||||
|
auto assetsFilesizeLimitJSONValue = assetServerObject[ASSETS_FILESIZE_LIMIT_OPTION];
|
||||||
|
auto assetsFilesizeLimit = (uint64_t)assetsFilesizeLimitJSONValue.toInt(MAX_UPLOAD_SIZE);
|
||||||
|
|
||||||
|
if (assetsFilesizeLimit != 0 && assetsFilesizeLimit < MAX_UPLOAD_SIZE) {
|
||||||
|
_filesizeLimit = assetsFilesizeLimit * BITS_PER_MEGABITS;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void AssetServer::cleanupUnmappedFiles() {
|
void AssetServer::cleanupUnmappedFiles() {
|
||||||
|
@ -730,7 +740,7 @@ void AssetServer::handleAssetUpload(QSharedPointer<ReceivedMessage> message, Sha
|
||||||
if (senderNode->getCanWriteToAssetServer()) {
|
if (senderNode->getCanWriteToAssetServer()) {
|
||||||
qCDebug(asset_server) << "Starting an UploadAssetTask for upload from" << uuidStringWithoutCurlyBraces(senderNode->getUUID());
|
qCDebug(asset_server) << "Starting an UploadAssetTask for upload from" << uuidStringWithoutCurlyBraces(senderNode->getUUID());
|
||||||
|
|
||||||
auto task = new UploadAssetTask(message, senderNode, _filesDirectory);
|
auto task = new UploadAssetTask(message, senderNode, _filesDirectory, _filesizeLimit);
|
||||||
_transferTaskPool.start(task);
|
_transferTaskPool.start(task);
|
||||||
} else {
|
} else {
|
||||||
// this is a node the domain told us is not allowed to rez entities
|
// this is a node the domain told us is not allowed to rez entities
|
||||||
|
|
|
@ -127,6 +127,8 @@ private:
|
||||||
bool _wasGrayscaleTextureCompressionEnabled { false };
|
bool _wasGrayscaleTextureCompressionEnabled { false };
|
||||||
bool _wasNormalTextureCompressionEnabled { false };
|
bool _wasNormalTextureCompressionEnabled { false };
|
||||||
bool _wasCubeTextureCompressionEnabled { false };
|
bool _wasCubeTextureCompressionEnabled { false };
|
||||||
|
|
||||||
|
uint64_t _filesizeLimit;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -22,10 +22,11 @@
|
||||||
|
|
||||||
|
|
||||||
UploadAssetTask::UploadAssetTask(QSharedPointer<ReceivedMessage> receivedMessage, SharedNodePointer senderNode,
|
UploadAssetTask::UploadAssetTask(QSharedPointer<ReceivedMessage> receivedMessage, SharedNodePointer senderNode,
|
||||||
const QDir& resourcesDir) :
|
const QDir& resourcesDir, uint64_t filesizeLimit) :
|
||||||
_receivedMessage(receivedMessage),
|
_receivedMessage(receivedMessage),
|
||||||
_senderNode(senderNode),
|
_senderNode(senderNode),
|
||||||
_resourcesDir(resourcesDir)
|
_resourcesDir(resourcesDir),
|
||||||
|
_filesizeLimit(filesizeLimit)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -48,7 +49,7 @@ void UploadAssetTask::run() {
|
||||||
auto replyPacket = NLPacket::create(PacketType::AssetUploadReply, -1, true);
|
auto replyPacket = NLPacket::create(PacketType::AssetUploadReply, -1, true);
|
||||||
replyPacket->writePrimitive(messageID);
|
replyPacket->writePrimitive(messageID);
|
||||||
|
|
||||||
if (fileSize > MAX_UPLOAD_SIZE) {
|
if (fileSize > _filesizeLimit) {
|
||||||
replyPacket->writePrimitive(AssetServerError::AssetTooLarge);
|
replyPacket->writePrimitive(AssetServerError::AssetTooLarge);
|
||||||
} else {
|
} else {
|
||||||
QByteArray fileData = buffer.read(fileSize);
|
QByteArray fileData = buffer.read(fileSize);
|
||||||
|
|
|
@ -26,7 +26,8 @@ class Node;
|
||||||
|
|
||||||
class UploadAssetTask : public QRunnable {
|
class UploadAssetTask : public QRunnable {
|
||||||
public:
|
public:
|
||||||
UploadAssetTask(QSharedPointer<ReceivedMessage> message, QSharedPointer<Node> senderNode, const QDir& resourcesDir);
|
UploadAssetTask(QSharedPointer<ReceivedMessage> message, QSharedPointer<Node> senderNode,
|
||||||
|
const QDir& resourcesDir, uint64_t filesizeLimit);
|
||||||
|
|
||||||
void run() override;
|
void run() override;
|
||||||
|
|
||||||
|
@ -34,6 +35,7 @@ private:
|
||||||
QSharedPointer<ReceivedMessage> _receivedMessage;
|
QSharedPointer<ReceivedMessage> _receivedMessage;
|
||||||
QSharedPointer<Node> _senderNode;
|
QSharedPointer<Node> _senderNode;
|
||||||
QDir _resourcesDir;
|
QDir _resourcesDir;
|
||||||
|
uint64_t _filesizeLimit;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // hifi_UploadAssetTask_h
|
#endif // hifi_UploadAssetTask_h
|
||||||
|
|
|
@ -858,6 +858,14 @@
|
||||||
"help": "The path to the directory assets are stored in.<br/>If this path is relative, it will be relative to the application data directory.<br/>If you change this path you will need to manually copy any existing assets from the previous directory.",
|
"help": "The path to the directory assets are stored in.<br/>If this path is relative, it will be relative to the application data directory.<br/>If you change this path you will need to manually copy any existing assets from the previous directory.",
|
||||||
"default": "",
|
"default": "",
|
||||||
"advanced": true
|
"advanced": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "assets_filesize_limit",
|
||||||
|
"type": "int",
|
||||||
|
"label": "File Size Limit",
|
||||||
|
"help": "The file size limit of an asset that can be imported into the asset server in MBytes. 0 (default) means no limit on file size.",
|
||||||
|
"default": 0,
|
||||||
|
"advanced": true
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|
|
@ -2,14 +2,14 @@ name = mannequin
|
||||||
type = body+head
|
type = body+head
|
||||||
scale = 1
|
scale = 1
|
||||||
filename = mannequin/mannequin.baked.fbx
|
filename = mannequin/mannequin.baked.fbx
|
||||||
joint = jointEyeLeft = LeftEye
|
|
||||||
joint = jointRightHand = RightHand
|
|
||||||
joint = jointHead = Head
|
|
||||||
joint = jointEyeRight = RightEye
|
|
||||||
joint = jointLean = Spine
|
|
||||||
joint = jointNeck = Neck
|
|
||||||
joint = jointLeftHand = LeftHand
|
|
||||||
joint = jointRoot = Hips
|
joint = jointRoot = Hips
|
||||||
|
joint = jointLean = Spine
|
||||||
|
joint = jointLeftHand = LeftHand
|
||||||
|
joint = jointHead = Head
|
||||||
|
joint = jointEyeLeft = LeftEye
|
||||||
|
joint = jointEyeRight = RightEye
|
||||||
|
joint = jointRightHand = RightHand
|
||||||
|
joint = jointNeck = Neck
|
||||||
freeJoint = LeftArm
|
freeJoint = LeftArm
|
||||||
freeJoint = LeftForeArm
|
freeJoint = LeftForeArm
|
||||||
freeJoint = RightArm
|
freeJoint = RightArm
|
||||||
|
@ -18,72 +18,72 @@ bs = EyeBlink_L = blink = 1
|
||||||
bs = JawOpen = mouth_Open = 1
|
bs = JawOpen = mouth_Open = 1
|
||||||
bs = LipsFunnel = Oo = 1
|
bs = LipsFunnel = Oo = 1
|
||||||
bs = BrowsU_L = brow_Up = 1
|
bs = BrowsU_L = brow_Up = 1
|
||||||
jointIndex = RightHandIndex2 = 27
|
|
||||||
jointIndex = LeftHandIndex2 = 51
|
|
||||||
jointIndex = RightUpLeg = 6
|
|
||||||
jointIndex = RightToe_End = 10
|
|
||||||
jointIndex = RightEye = 65
|
|
||||||
jointIndex = LeftHandPinky1 = 42
|
|
||||||
jointIndex = RightHandRing1 = 22
|
|
||||||
jointIndex = face = 67
|
|
||||||
jointIndex = LeftUpLeg = 1
|
|
||||||
jointIndex = LeftHand = 41
|
|
||||||
jointIndex = LeftHandMiddle1 = 58
|
|
||||||
jointIndex = LeftHandIndex1 = 50
|
|
||||||
jointIndex = LeftEye = 64
|
|
||||||
jointIndex = RightHandIndex1 = 26
|
|
||||||
jointIndex = LeftHandPinky4 = 45
|
|
||||||
jointIndex = RightArm = 15
|
|
||||||
jointIndex = LeftShoulder = 38
|
|
||||||
jointIndex = RightHandPinky2 = 19
|
jointIndex = RightHandPinky2 = 19
|
||||||
jointIndex = RightHandThumb1 = 30
|
|
||||||
jointIndex = RightForeArm = 16
|
|
||||||
jointIndex = LeftHandMiddle3 = 60
|
|
||||||
jointIndex = Neck = 62
|
|
||||||
jointIndex = LeftHandThumb1 = 54
|
|
||||||
jointIndex = RightHandMiddle2 = 35
|
|
||||||
jointIndex = LeftHandMiddle4 = 61
|
jointIndex = LeftHandMiddle4 = 61
|
||||||
jointIndex = mannequin = 68
|
jointIndex = LeftHand = 41
|
||||||
jointIndex = Spine1 = 12
|
jointIndex = LeftHandRing4 = 49
|
||||||
|
jointIndex = RightHandMiddle3 = 36
|
||||||
|
jointIndex = LeftHandThumb4 = 57
|
||||||
|
jointIndex = RightToe_End = 10
|
||||||
|
jointIndex = LeftHandRing1 = 46
|
||||||
|
jointIndex = LeftForeArm = 40
|
||||||
|
jointIndex = RightHandIndex4 = 29
|
||||||
|
jointIndex = LeftShoulder = 38
|
||||||
|
jointIndex = RightHandMiddle4 = 37
|
||||||
|
jointIndex = RightShoulder = 14
|
||||||
|
jointIndex = LeftLeg = 2
|
||||||
|
jointIndex = LeftToe_End = 5
|
||||||
|
jointIndex = Hips = 0
|
||||||
jointIndex = RightFoot = 8
|
jointIndex = RightFoot = 8
|
||||||
|
jointIndex = RightHandThumb2 = 31
|
||||||
|
jointIndex = LeftHandMiddle3 = 60
|
||||||
|
jointIndex = RightHandThumb1 = 30
|
||||||
|
jointIndex = Neck = 62
|
||||||
|
jointIndex = Spine = 11
|
||||||
|
jointIndex = RightHandThumb4 = 33
|
||||||
|
jointIndex = RightHandMiddle1 = 34
|
||||||
|
jointIndex = LeftHandIndex4 = 53
|
||||||
|
jointIndex = face = 68
|
||||||
|
jointIndex = RightHandRing3 = 24
|
||||||
|
jointIndex = LeftHandPinky4 = 45
|
||||||
|
jointIndex = LeftHandMiddle2 = 59
|
||||||
|
jointIndex = RightHandThumb3 = 32
|
||||||
|
jointIndex = LeftHandPinky3 = 44
|
||||||
|
jointIndex = HeadTop_End = 66
|
||||||
|
jointIndex = Spine1 = 12
|
||||||
|
jointIndex = LeftHandRing3 = 48
|
||||||
|
jointIndex = mannequin1 = 67
|
||||||
|
jointIndex = RightEye = 65
|
||||||
|
jointIndex = RightHandRing4 = 25
|
||||||
|
jointIndex = RightHandPinky4 = 21
|
||||||
|
jointIndex = LeftHandRing2 = 47
|
||||||
|
jointIndex = RightHandIndex3 = 28
|
||||||
|
jointIndex = RightUpLeg = 6
|
||||||
|
jointIndex = LeftArm = 39
|
||||||
|
jointIndex = LeftHandThumb3 = 56
|
||||||
|
jointIndex = RightHandIndex2 = 27
|
||||||
|
jointIndex = RightForeArm = 16
|
||||||
|
jointIndex = RightArm = 15
|
||||||
|
jointIndex = RightHandRing2 = 23
|
||||||
|
jointIndex = LeftHandMiddle1 = 58
|
||||||
|
jointIndex = Spine2 = 13
|
||||||
|
jointIndex = LeftHandThumb2 = 55
|
||||||
|
jointIndex = RightHandMiddle2 = 35
|
||||||
|
jointIndex = RightHandPinky1 = 18
|
||||||
|
jointIndex = LeftUpLeg = 1
|
||||||
|
jointIndex = RightLeg = 7
|
||||||
|
jointIndex = LeftHandIndex2 = 51
|
||||||
jointIndex = RightHand = 17
|
jointIndex = RightHand = 17
|
||||||
jointIndex = LeftHandIndex3 = 52
|
jointIndex = LeftHandIndex3 = 52
|
||||||
jointIndex = RightHandIndex3 = 28
|
|
||||||
jointIndex = RightHandMiddle4 = 37
|
|
||||||
jointIndex = LeftLeg = 2
|
|
||||||
jointIndex = RightHandMiddle1 = 34
|
|
||||||
jointIndex = Spine2 = 13
|
|
||||||
jointIndex = LeftHandMiddle2 = 59
|
|
||||||
jointIndex = LeftHandPinky3 = 44
|
|
||||||
jointIndex = LeftHandThumb3 = 56
|
|
||||||
jointIndex = LeftHandRing4 = 49
|
|
||||||
jointIndex = RightHandThumb2 = 31
|
|
||||||
jointIndex = LeftHandRing3 = 48
|
|
||||||
jointIndex = HeadTop_End = 66
|
|
||||||
jointIndex = LeftHandThumb4 = 57
|
|
||||||
jointIndex = RightHandThumb3 = 32
|
|
||||||
jointIndex = RightHandPinky1 = 18
|
|
||||||
jointIndex = RightLeg = 7
|
|
||||||
jointIndex = RightHandMiddle3 = 36
|
|
||||||
jointIndex = RightHandPinky3 = 20
|
|
||||||
jointIndex = LeftToeBase = 4
|
|
||||||
jointIndex = LeftForeArm = 40
|
|
||||||
jointIndex = RightShoulder = 14
|
|
||||||
jointIndex = LeftHandRing2 = 47
|
|
||||||
jointIndex = LeftHandThumb2 = 55
|
|
||||||
jointIndex = Head = 63
|
|
||||||
jointIndex = RightHandRing4 = 25
|
|
||||||
jointIndex = LeftHandRing1 = 46
|
|
||||||
jointIndex = LeftFoot = 3
|
jointIndex = LeftFoot = 3
|
||||||
jointIndex = RightHandRing3 = 24
|
jointIndex = RightHandPinky3 = 20
|
||||||
jointIndex = RightHandThumb4 = 33
|
jointIndex = RightHandIndex1 = 26
|
||||||
jointIndex = LeftArm = 39
|
jointIndex = LeftHandPinky1 = 42
|
||||||
jointIndex = LeftToe_End = 5
|
|
||||||
jointIndex = RightToeBase = 9
|
jointIndex = RightToeBase = 9
|
||||||
jointIndex = RightHandPinky4 = 21
|
jointIndex = LeftHandIndex1 = 50
|
||||||
jointIndex = Spine = 11
|
jointIndex = LeftToeBase = 4
|
||||||
jointIndex = LeftHandIndex4 = 53
|
|
||||||
jointIndex = LeftHandPinky2 = 43
|
jointIndex = LeftHandPinky2 = 43
|
||||||
jointIndex = RightHandIndex4 = 29
|
jointIndex = RightHandRing1 = 22
|
||||||
jointIndex = Hips = 0
|
jointIndex = LeftHandThumb1 = 54
|
||||||
jointIndex = RightHandRing2 = 23
|
jointIndex = LeftEye = 64
|
||||||
|
jointIndex = Head = 63
|
||||||
|
|
BIN
interface/resources/meshes/mannequin/Eyes.ktx
Executable file → Normal file
BIN
interface/resources/meshes/mannequin/Eyes.ktx
Executable file → Normal file
Binary file not shown.
BIN
interface/resources/meshes/mannequin/lambert1_Base_Color.ktx
Executable file → Normal file
BIN
interface/resources/meshes/mannequin/lambert1_Base_Color.ktx
Executable file → Normal file
Binary file not shown.
BIN
interface/resources/meshes/mannequin/lambert1_Normal_OpenGL.ktx
Executable file → Normal file
BIN
interface/resources/meshes/mannequin/lambert1_Normal_OpenGL.ktx
Executable file → Normal file
Binary file not shown.
BIN
interface/resources/meshes/mannequin/lambert1_Roughness.ktx
Executable file → Normal file
BIN
interface/resources/meshes/mannequin/lambert1_Roughness.ktx
Executable file → Normal file
Binary file not shown.
BIN
interface/resources/meshes/mannequin/mannequin.baked.fbx
Executable file → Normal file
BIN
interface/resources/meshes/mannequin/mannequin.baked.fbx
Executable file → Normal file
Binary file not shown.
|
@ -237,19 +237,7 @@ void EntityTreeRenderer::update(bool simulate) {
|
||||||
EntityTreePointer tree = std::static_pointer_cast<EntityTree>(_tree);
|
EntityTreePointer tree = std::static_pointer_cast<EntityTree>(_tree);
|
||||||
tree->update(simulate);
|
tree->update(simulate);
|
||||||
|
|
||||||
if (simulate) {
|
// Update the rendereable entities as needed
|
||||||
// Handle enter/leave entity logic
|
|
||||||
checkEnterLeaveEntities();
|
|
||||||
|
|
||||||
// Even if we're not moving the mouse, if we started clicking on an entity and we have
|
|
||||||
// not yet released the hold then this is still considered a holdingClickOnEntity event
|
|
||||||
// and we want to simulate this message here as well as in mouse move
|
|
||||||
if (_lastPointerEventValid && !_currentClickingOnEntityID.isInvalidID()) {
|
|
||||||
emit holdingClickOnEntity(_currentClickingOnEntityID, _lastPointerEvent);
|
|
||||||
_entitiesScriptEngine->callEntityScriptMethod(_currentClickingOnEntityID, "holdingClickOnEntity", _lastPointerEvent);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
{
|
||||||
PerformanceTimer sceneTimer("scene");
|
PerformanceTimer sceneTimer("scene");
|
||||||
auto scene = _viewState->getMain3DScene();
|
auto scene = _viewState->getMain3DScene();
|
||||||
|
@ -269,6 +257,20 @@ void EntityTreeRenderer::update(bool simulate) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (simulate) {
|
||||||
|
// Handle enter/leave entity logic
|
||||||
|
checkEnterLeaveEntities();
|
||||||
|
|
||||||
|
// Even if we're not moving the mouse, if we started clicking on an entity and we have
|
||||||
|
// not yet released the hold then this is still considered a holdingClickOnEntity event
|
||||||
|
// and we want to simulate this message here as well as in mouse move
|
||||||
|
if (_lastPointerEventValid && !_currentClickingOnEntityID.isInvalidID()) {
|
||||||
|
emit holdingClickOnEntity(_currentClickingOnEntityID, _lastPointerEvent);
|
||||||
|
_entitiesScriptEngine->callEntityScriptMethod(_currentClickingOnEntityID, "holdingClickOnEntity", _lastPointerEvent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -37,7 +37,7 @@ PacketVersion versionForPacketType(PacketType packetType) {
|
||||||
case PacketType::AvatarData:
|
case PacketType::AvatarData:
|
||||||
case PacketType::BulkAvatarData:
|
case PacketType::BulkAvatarData:
|
||||||
case PacketType::KillAvatar:
|
case PacketType::KillAvatar:
|
||||||
return static_cast<PacketVersion>(AvatarMixerPacketVersion::AvatarIdentityLookAtSnapping);
|
return static_cast<PacketVersion>(AvatarMixerPacketVersion::UpdatedMannequinDefaultAvatar);
|
||||||
case PacketType::MessagesData:
|
case PacketType::MessagesData:
|
||||||
return static_cast<PacketVersion>(MessageDataVersion::TextOrBinaryData);
|
return static_cast<PacketVersion>(MessageDataVersion::TextOrBinaryData);
|
||||||
case PacketType::ICEServerHeartbeat:
|
case PacketType::ICEServerHeartbeat:
|
||||||
|
|
|
@ -301,6 +301,7 @@ enum class AvatarMixerPacketVersion : PacketVersion {
|
||||||
AvatarIdentitySequenceFront,
|
AvatarIdentitySequenceFront,
|
||||||
IsReplicatedInAvatarIdentity,
|
IsReplicatedInAvatarIdentity,
|
||||||
AvatarIdentityLookAtSnapping,
|
AvatarIdentityLookAtSnapping,
|
||||||
|
UpdatedMannequinDefaultAvatar
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class DomainConnectRequestVersion : PacketVersion {
|
enum class DomainConnectRequestVersion : PacketVersion {
|
||||||
|
|
Loading…
Reference in a new issue