overte-HifiExperiments/interface/resources/qml/hifi/avatarapp/AvatarsModel.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);
}
}