mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-07-22 16:23:18 +02:00
127 lines
3.7 KiB
QML
127 lines
3.7 KiB
QML
import QtQuick 2.9
|
|
|
|
ListModel {
|
|
id: model
|
|
|
|
function makeThumbnailUrl(avatarUrl) {
|
|
var splittedUrl = avatarUrl.split('/');
|
|
var marketId = splittedUrl[splittedUrl.length - 2];
|
|
var indexOfVSuffix = marketId.indexOf('-v');
|
|
if(indexOfVSuffix !== -1) {
|
|
marketId = marketId.substring(0, indexOfVSuffix);
|
|
}
|
|
var avatarThumbnailUrl = "https://hifi-metaverse.s3-us-west-1.amazonaws.com/marketplace/previews/%marketId%/large/hifi-mp-%marketId%.jpg"
|
|
.split('%marketId%').join(marketId);
|
|
|
|
return avatarThumbnailUrl;
|
|
}
|
|
|
|
function populate(bookmarks) {
|
|
for(var avatarName in bookmarks) {
|
|
var avatarThumbnailUrl = makeThumbnailUrl(bookmarks[avatarName].avatarUrl);
|
|
|
|
var avatarEntry = {
|
|
'name' : avatarName,
|
|
'url' : avatarThumbnailUrl,
|
|
'wearables' : bookmarks[avatarName].avatarEntites ? bookmarks[avatarName].avatarEntites : [],
|
|
'entry' : bookmarks[avatarName],
|
|
'getMoreAvatars' : false
|
|
};
|
|
|
|
append(avatarEntry);
|
|
}
|
|
}
|
|
|
|
function arraysAreEqual(a1, a2, comparer) {
|
|
if(Array.isArray(a1) && Array.isArray(a2)) {
|
|
if(a1.length !== a2.length) {
|
|
return false;
|
|
}
|
|
|
|
for(var i = 0; i < a1.length; ++i) {
|
|
if(!comparer(a1[i], a2[i])) {
|
|
return false;
|
|
}
|
|
}
|
|
} else if(Array.isArray(a1)) {
|
|
return a1.length === 0;
|
|
} else if(Array.isArray(a2)) {
|
|
return a2.length === 0;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
function compareArrays(a1, a2, props) {
|
|
for(var prop in props) {
|
|
if(JSON.stringify(a1[prop]) !== JSON.stringify(a2[prop])) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
function compareWearables(w1, w2) {
|
|
return compareArrays(w1, w2, ['modelUrl', 'parentJointIndex', 'marketplaceID', 'itemName', 'script', 'rotation'])
|
|
}
|
|
|
|
function compareAttachments(a1, a2) {
|
|
return compareAttachments(a1, a2, ['position', 'orientation', 'parentJointIndex', 'modelurl'])
|
|
}
|
|
|
|
function findAvatarIndexByValue(avatar) {
|
|
|
|
var index = -1;
|
|
var avatarObject = avatar.entry;
|
|
|
|
// 2DO: find better way of determining selected avatar in bookmarks
|
|
console.debug('allAvatars.count: ', allAvatars.count);
|
|
for(var i = 0; i < allAvatars.count; ++i) {
|
|
var thesame = true;
|
|
var bookmarkedAvatarObject = allAvatars.get(i).entry;
|
|
|
|
if(bookmarkedAvatarObject.avatarUrl !== avatarObject.avatarUrl)
|
|
continue;
|
|
|
|
if(bookmarkedAvatarObject.avatarScale !== avatarObject.avatarScale)
|
|
continue;
|
|
|
|
if(!arraysAreEqual(bookmarkedAvatarObject.attachments, avatarObject.attachments, compareAttachments)) {
|
|
continue;
|
|
}
|
|
|
|
if(!arraysAreEqual(bookmarkedAvatarObject.avatarEntities, avatarObject.avatarEntities, compareWearables)) {
|
|
continue;
|
|
}
|
|
|
|
if(thesame) {
|
|
index = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
return index;
|
|
}
|
|
|
|
function findAvatarIndex(avatarName) {
|
|
for(var i = 0; i < count; ++i) {
|
|
if(get(i).name === avatarName) {
|
|
console.debug('avatar found by index: ', i)
|
|
return i;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
function findAvatar(avatarName) {
|
|
console.debug('AvatarsModel: find avatar by', avatarName);
|
|
|
|
var avatarIndex = findAvatarIndex(avatarName);
|
|
if(avatarIndex === -1)
|
|
return undefined;
|
|
|
|
return get(avatarIndex);
|
|
}
|
|
|
|
}
|