diff --git a/src/.init.lua b/src/.init.lua
index bf5879d..1bf3c8a 100644
--- a/src/.init.lua
+++ b/src/.init.lua
@@ -14,7 +14,7 @@ HidePath('/usr/share/ssl/')
-- create
app = require("soakbean") {
- cache = { items = {}, url = {}, shared = require('sharedcache') },
+ cache = {}, -- populated by reset()
plugin = {},
opts = {},
forkpids = {},
@@ -25,37 +25,47 @@ app = require("soakbean") {
createplugin = {file="cmd/createplugin.lua", info="generates skeleton plugin"},
generate = {file="cmd/generate.lua", info="generate www-folder with XR experiences"},
test = {file="cmd/test.lua", info="run testsuite (selftest)"}
- },
-
- addPlugin = function(file)
- local p = require(file)
- table.insert(app.plugin,p)
- -- ensure plugin config-defaults
- foreach( app.plugin, function(name,plugin)
- foreach( plugin.opts, function(k,opt)
- local key = opt.key:gsub("app.opts.","")
- if not app.opts[ key ] then
- app.opts[ key ] = opt.default
- end
- end)
- end)
- app.set('app.opts', app.opts)
- return p
- end,
-
- addExperience = function(experience, ino)
- if app.cache.items[ino] then -- handle duplicate symlinks, symlinks to symlinks e.g.
- app.cache.items[ino .. ' ' .. experience.parent.id ] = experience
- else
- app.cache.items[ino] = experience
- end
- end
+ }
}
+app.reset = function()
+ app.cache = { items = {}, url = {}, shared = require('sharedcache'), dirs={} }
+end
+
+app.addPlugin = function(file)
+ local p = require(file)
+ table.insert(app.plugin,p)
+ -- ensure plugin config-defaults
+ foreach( app.plugin, function(name,plugin)
+ foreach( plugin.opts, function(k,opt)
+ local key = opt.key:gsub("app.opts.","")
+ if not app.opts[ key ] then
+ app.opts[ key ] = opt.default
+ end
+ end)
+ end)
+ app.set('app.opts', app.opts)
+ return p
+end
+
+app.addExperience = function(experience, ino)
+ if app.cache.items[ino] then -- handle duplicate symlinks, symlinks to symlinks e.g.
+ app.cache.items[ino .. ' ' .. experience.parent.id ] = experience
+ else
+ app.cache.items[ino] = experience
+ end
+end
+
+app.markViewable = function(exp)
+ exp.view3D = true
+ exp.parent.redirect = exp.url -- mark parent to redirect to this standalone url instead (not glb assets e.g.)
+end
-- api skeleton (implemented via soakbean's app.on(...))
app.set = function(k,v) end
-app.init = function() end
+app.init = function()
+ app.reset()
+end
-- load config
app.opts = require('config')(app)
@@ -80,7 +90,7 @@ app.plugin.git = app.addPlugin('plugin/git')
app.plugin.webhook = app.addPlugin('plugin/webhook')
app.plugin.archive = app.addPlugin('plugin/archive')
app.plugin.openbrush = app.addPlugin('plugin/openbrush')
---app.plugin.scheduler = app.addPlugin('plugin/scheduler') -- should always be second last
+app.plugin.scheduler = app.addPlugin('plugin/scheduler') -- should always be second last
app.plugin.staticwebgen = app.addPlugin('plugin/staticwebgen') -- should always be last
if unix.getpid() == 0 then unix.exit(0) end -- child-threads shall not pass beyond here
diff --git a/src/.lua/apiSync.lua b/src/.lua/apiSync.lua
new file mode 100644
index 0000000..bcbce85
--- /dev/null
+++ b/src/.lua/apiSync.lua
@@ -0,0 +1,24 @@
+local apiSync = {
+
+ syncHashtags = function(opts)
+ local synced = 0
+ local tags = opts.tags
+ if #tags == 0 then table.insert(tags,'') end
+ foreach( tags, function(k,tag)
+ local url = opts.apiCall( #tag > 0 and tag or nil)
+ opts.body = nil -- erase previous url result
+ print('🤞 fetch ' .. url)
+ local t = opts.fetch(url,opts)
+ if t then
+ synced = synced + opts.download(t,tag)
+ end
+ end, true)
+ if synced > 0 then
+ app.plugin.diskscan.scan(app.opts.plugin_diskscan_dir)
+ end
+ return synced
+ end
+
+}
+
+return apiSync
diff --git a/src/.lua/util.lua b/src/.lua/util.lua
index 3e76852..619a607 100644
--- a/src/.lua/util.lua
+++ b/src/.lua/util.lua
@@ -234,9 +234,15 @@ util.call = function(fn,a,b,c,d,e,f)
end
end
-function foreach(t, f, sort)
+function foreach(t, f, alwayscontinue)
if t ~= nil then
- for k, v in pairs(t) do f(k, v) end
+ for k, v in pairs(t) do
+ if alwayscontinue then
+ local success, err = pcall(f, k, v)
+ else
+ f(k, v)
+ end
+ end
end
end
@@ -410,5 +416,41 @@ function util.traverseXML( parsedXml, cb)
)
end
+util.hyphenate = function(str)
+ local str,match = str:lower()
+ :gsub("[^%w]", "-")
+ :gsub("%-+", "-")
+ :gsub("^%-", "")
+ :gsub("%-$", "")
+ return str
+end
+
+util.dehyphenate = function(str)
+ local str,match = str:gsub("_[a-zA-Z0-9]+","") -- remove ids starting with _
+ :gsub("%-%-","-") -- remove double dash
+ :gsub("-"," ") -- convert to spaces
+ :gsub("^%s*(.-)%s*$", "%1") -- trim
+ return str
+end
+
+util.stripId = function(path)
+ return path:gsub("_[a-zA-Z0-9]+",""), path:match("_[a-zA-Z0-9]+")
+end
+
+util.parseIsoDate = function(iso_str)
+ --local iso_str = "2017-11-03T08:04:45.076Z"
+ local year, month, day, hour, min, sec, ms = iso_str:match("(%d+)-(%d+)-(%d+)T(%d+):(%d+):(%d+)%.(%d+)Z")
+
+ year, month, day = tonumber(year), tonumber(month), tonumber(day)
+ hour, min, sec = tonumber(hour), tonumber(min), tonumber(sec)
+ ms = tonumber("0." .. ms) -- Optional: keep as decimal seconds fraction
+
+ local local_time = os.time({year=year, month=month, day=day, hour=hour, min=min, sec=sec})
+ local utc_offset = os.difftime(local_time, os.time(os.date("!*t", local_time)))
+ local timestamp = local_time + utc_offset
+
+ return timestamp, ms
+end
+
return util
diff --git a/src/img/banner.jpg b/src/img/banner.jpg
new file mode 100644
index 0000000..07e13eb
Binary files /dev/null and b/src/img/banner.jpg differ
diff --git a/src/img/layout_grid.jpg b/src/img/layout_grid.jpg
new file mode 100644
index 0000000..551040c
Binary files /dev/null and b/src/img/layout_grid.jpg differ
diff --git a/src/img/layout_portal.jpg b/src/img/layout_portal.jpg
new file mode 100644
index 0000000..c92fed4
Binary files /dev/null and b/src/img/layout_portal.jpg differ
diff --git a/src/page/about.html b/src/page/about.html
index 21ab790..40cf089 100644
--- a/src/page/about.html
+++ b/src/page/about.html
@@ -109,6 +109,7 @@ div#xrecosystem{
end}
-->
+
Why people want XRForge
@@ -216,12 +217,50 @@ div#xrecosystem{
+
+
+
+
Auto-compose virtual worlds
+
+ Instead of manually composing virtual worlds from multiple assets, XRForge's philosophy is
auto-layout and
interoperability .
+ This means that assets produced in
OpenBlocks or
OpenBrush can
(in)directly get imported (via online 3D stores like
icosa.gallery- and
manyfold.app ).
+ This allows for infinitely scalable virtual worlds, yet completely downloadable and portable.
+ XRForge features
layout-engines which allows
crowdsourcing virtual worlds via assets using various apps/platforms:
+
+
+
+
+
+
+
+ An example:
+
+
+ 1. designers agree on a hashtag (#myproject e.g)
+ 2. add the hashtag to the asset-title (in openbrush/openblocks/manyfold e.g.)
+ 3. add the hashtag to XRForge (in the respective plugin)
+ 4. specify the layout (grid, portals e.g.) for rendering the assets
+ 4. XRForge will pull or reference all hashtag-related assets
+ 5. Profit! XRForge will now automatically render a virtual world
+
+
+
+ By default all scenes are layered on top of eachother, which is great for horizon, sky etc.
+ However, auto-placement in a grid (buildings e.g.) is possible by adding a dimensional hashtag (
#2x2 e.g.) to the asset-title.
+
+
+
+
+
+
- Comparison
+ Comparison
diff --git a/src/page/dir.lua b/src/page/dir.lua
index 7dc8080..87eb25a 100644
--- a/src/page/dir.lua
+++ b/src/page/dir.lua
@@ -52,7 +52,7 @@ return {
if v.dir or v.view3D then
local parent = app.cache.items[ v.parent.id ]
res.items[ v.id ] = v
- res.itemdir = v
+ res.itemdir = v.parent
res.parent = parent
end
if isroot then
@@ -68,6 +68,7 @@ return {
local data = util.merge({
janusurl = req.param.url, -- query hint to render janus.url in iframe (index.html)
items = {},
+ itemdir = res.itemdir,
isroot = isroot,
referrer = referrer,
req = req,
@@ -98,6 +99,7 @@ return {
-- what to do here? no generated portals?
data.janusxr = app.tpl( util.readfile(v.path), data )
end
+ print_r(data.item)
end
end
end)
diff --git a/src/page/janusxr.html b/src/page/janusxr.html
index 6df6cd5..d5f34e8 100644
--- a/src/page/janusxr.html
+++ b/src/page/janusxr.html
@@ -1,6 +1,6 @@
{if true then
- sidecarfile = (parent and parent.path or '') .. '/' .. app.opts.plugin_janusxr_wrap_custom
- hasSidecarfile = util.fileExist(sidecarfile) and true or false
+ wrapperfile = (parent and parent.path or '') .. '/' .. app.opts.plugin_janusxr_wrap_custom
+ hasWrapperfile = util.fileExist(wrapperfile) and true or false
showfediportals = app.opts.plugin_federation_strategy == 'always' or
(app.opts.plugin_federation_strategy == 'homepage' and urlpath == '/')
@@ -47,11 +47,17 @@ end}
if not defined(item) and defined(items) then
room = app.opts.plugin_janusxr_portalroom
end
- if defined(item) and item.janusxr and item.janusxr.wrap then
- pos = '0 0 2'
- room = app.plugin.janusxr.wrapRoomAroundFile(item)
+
+ function initRoom(i)
+ if i.janusxr and i.janusxr.room then
+ pos = '0 0 1' -- todo make startup location configurable
+ room = i.janusxr.room
+ end
end
- if hasSidecarfile or (defined(item) and item.tag.xrfragments and item.tag.xrfragments.href) then
+ initRoom(item or {})
+ initRoom(itemdir or {})
+
+ if (hasWrapperfile == true) or (defined(item) and item.tag.xrfragments and item.tag.xrfragments.href) then
room = '' -- xrfragments 3D files dont need to be wrapped with room
end
print(' ')
@@ -60,50 +66,27 @@ end}
end
end}
- {if true then
- function addPortal(id,x,v,url,i,z,thumb,rotation,scale)
- local title = v.title
- print('\t')
- print('\t ')
- print('\t ')
- --TODO: fix janusweb paragraph for markdown urls
- --if v.README ~= nil then
- -- print('\t ')
- --end
- print('\t ')
- end
- end}
{if not defined(item) and defined(items) and #items > 0 then
- for i,v in pairs(items) do
- local width = 3.2
- local center = -((#items*width)/1.3) + (i*width)
- local url = v.url
- local thumb = ' shader_id="defaultportal"'
- if #v.thumbnail > 0 then
- thumb = ' thumb_id="img' .. i .. '" '
- end
- if v.dir then url = url .. "/" end
- if v.redirect then url = v.redirect end -- dont wrap standalone glb's in janusxr
- addPortal('dir',center, v, url,i, -4, thumb, '0 0 0', '0.2 0.2 0.2')
+ local layout = itemdir.layout or ''
+ if #layout > 0 and app.plugin.janusxr.layout[ layout ] then
+ print( app.plugin.janusxr.layout[ layout ].render(items) )
+ else
+ print( app.plugin.janusxr.layout.portals.render(items) )
end
end}
{if not defined(item) and defined(itemsremote) and #itemsremote > 0 then
for i,v in pairs(itemsremote) do
- local width = 3.2
+ local width = v.portal_width or tonumber( app.opts.plugin_global_portal_width )
local center = -((#itemsremote*width)/1.3) + (i*width)
local url = v.url
- --if url:match("://") then
- -- url = url .. ( url:match("#") and '&' or '#' ) .. 'janus.referrer=' ..
- -- EscapeFragment( util.getURL() )
- --end
- local thumb = ' shader_id="defaultportal"'
+ local thumb = ' shader_id="defaultportal"'
if #v.thumbnail > 0 then
thumb = ' thumb_id="imgremote' .. i .. '" '
end
if v.dir then url = url .. "/" end
if v.redirect then url = v.redirect end -- dont wrap standalone glb's in janusxr
- addPortal('remote',center, v, url,i, 4, thumb, '0 180 0', '0.2 0.2 0.2')
+ print( app.plugin.janusxr.addPortal('remote',center, v, url,i, 4, thumb, '0 180 0', '0.2 0.2 0.2') )
end
print([[
@@ -116,10 +99,10 @@ end}
url = referrer,
title = app.opts.plugin_janusxr_portal_up,
}
- addPortal('parent',5, v, v.url, 0, 0, ' shader_id="defaultportal"', '0 -90 0', '0.2 0.2 0.2')
+ print( app.plugin.janusxr.addPortal('parent',5, v, v.url, 0, 0, ' shader_id="defaultportal"', '0 -90 0', '0.2 0.2 0.2') )
end}
- {if isroot then
+ {if os.getenv('DEBUG') then
local plugins = {}
foreach(app.plugin, function(name,p)
@@ -150,12 +133,13 @@ end}
end}
- {if not defined(item) and not hasSidecarfile then
+ {if not defined(item) and hasWrapperfile == false then
print('${janusxr_jml_deco}')
end}
- {if hasSidecarfile then
+ {if hasWrapperfile == true then
+ local wrapperURL = util.stripPath( parent.path .. '/' .. app.opts.plugin_janusxr_wrap_custom)
print(' ')
- print(' ')
+ print(' ')
end}
diff --git a/src/plugin/archive.lua b/src/plugin/archive.lua
index 22ed085..1f27bbf 100644
--- a/src/plugin/archive.lua
+++ b/src/plugin/archive.lua
@@ -45,13 +45,13 @@ local plugin = {
title='When to trigger',
info='when should archive.org check this xrforge?',
default = "boot",
- values={disabled="disabled", daily="daily"}
+ values={disabled="disabled", boot="on boot", daily="daily"}
},
{
key='app.opts.plugin_archive_url',
title='Startingpoint URL',
info='absolute URL which archive.org (waybackmachine) should start with',
- default = "/myverse",
+ default = "",
placeholder = "/myverse",
values=''
},
@@ -104,6 +104,7 @@ local plugin = {
start = function()
local me = app.plugin.archive.scraper
+ os.execute('rm scraper.txt 2>&1')
me.scraperStart = os.time()
util.fetchServer('/', nil, function(req,res)
me.scrapeLinks( req,res, 0 )
@@ -127,7 +128,7 @@ local plugin = {
:gsub("#.*",'')
)
if not util.fileExist( newdir ) then
- util.execute('janusxr scrape "' .. node.prop.url .. '" "' .. newdir .. '" 1>&2')
+ util.execute('janusxr scrape "' .. node.prop.url .. '" "' .. newdir .. '" 1>&2 | tee -a scraper.txt')
else
print("already scraped: " .. node.prop.url )
end
@@ -136,7 +137,6 @@ local plugin = {
end,
scan = {
-
JML = function(req,res)
local me = app.plugin.archive.scraper
-- JML heuristic
diff --git a/src/plugin/diskscan.lua b/src/plugin/diskscan.lua
index 0ec142d..113632b 100644
--- a/src/plugin/diskscan.lua
+++ b/src/plugin/diskscan.lua
@@ -43,6 +43,7 @@ return {
end,
scan = function(scandir)
+ app.reset() -- flush cache
local me = app.plugin.diskscan
local seen = {symlinks={}}
-- ensure rootdir as experience
@@ -51,7 +52,7 @@ return {
url = "/" .. util.stripPath(scandir),
name = scandir:gsub(".*/",""),
thumbnail = "",
- title = scandir:gsub(".*/",""):gsub("-"," "),
+ title = util.dehyphenate( scandir:gsub(".*/","") ),
file = { ino = scandir },
id = scandir
},scandir)
@@ -79,11 +80,14 @@ return {
v.file.state = nil
end
end)
+ table.sort( app.cache.dirs)
end,
scanDir = function(scandir,parent,seen)
local me = app.plugin.diskscan
parent = parent or app.cache.items[scandir]
+ app.cache.dirs[ scandir ] = util.stripPath(scandir)
+
-- scan dirs
local scanFile = function(path,stat,state,name,kind,ino,off,attr,fullpath)
@@ -91,7 +95,7 @@ return {
path = fullpath,
url = "/" .. util.stripPath(fullpath),
name = name,
- title = name:gsub("-"," "),
+ title = util.dehyphenate( name ),
sidecarfile = {},
thumbnail = '',
tag = {},
diff --git a/src/plugin/global.lua b/src/plugin/global.lua
index 79f910f..8439721 100644
--- a/src/plugin/global.lua
+++ b/src/plugin/global.lua
@@ -198,6 +198,14 @@ You've got this!
default="Remote / Federated",
values=''
},
+ {
+ key='app.opts.plugin_global_portal_width',
+ title='Portal spacing',
+ info='Adjust spacing between portals (prevent thumbnail-overlap)',
+ placeholder = "3.2",
+ default = "3.2",
+ values=''
+ },
{
key='app.opts.plugin_global_backup_trigger',
title='Backup',
diff --git a/src/plugin/janusxr.lua b/src/plugin/janusxr.lua
index 3fd931f..8d6815e 100644
--- a/src/plugin/janusxr.lua
+++ b/src/plugin/janusxr.lua
@@ -29,14 +29,16 @@ app.on('scan_experience_file', function(exp)
end
end)
if wrap then
- exp.view3D = true
+ app.markViewable(exp)
exp.janusxr = { wrap = { object = true }}
+ exp.janusxr.room = me.wrapRoomAroundFile( exp )
+ app.pub("scan_experience_janusxr", nil, {exp=exp, item=item}) -- be nice to other plugins
app.addExperience( exp, exp.file.ino )
print("✅ └─ plugin/janusxr: wrapping " .. exp.path)
end
end
- if me.isWrapFile(exp.path) and size < 100000 then -- skip large binary files > 100kb
+ if (not me.isWrapFile(exp.path)) and size < 100000 then -- skip large binary files > 100kb
local data = util.readfile( exp.file.fullpath)
if data then
if data:match(pattern_fireboxroom) or
@@ -45,16 +47,15 @@ app.on('scan_experience_file', function(exp)
if title then
exp.title = title:gsub("<.*","")
end
- app.pub("scan_experience_janusxr", nil, {exp=exp, item=item}) -- be nice to other plugins
- app.addExperience( exp, exp.file.ino )
- exp.view3D = true
- exp.parent.redirect = exp.url -- mark parent to redirect to this standalone url instead (not glb assets e.g.)
+ app.markViewable(exp)
exp.janusxr = exp.janusxr or {}
print("✅ └─ plugin/janusxr: " .. exp.file.name)
if data:match(pattern_aframe) and app.opts.plugin_janusxr_wrap_aframe == 'enabled' then
exp.janusxr.wrap = {aframe = true }
print("✅ └─ plugin/janusxr: AFRAME markup detected")
end
+ app.pub("scan_experience_janusxr", nil, {exp=exp, item=item}) -- be nice to other plugins
+ app.addExperience( exp, exp.file.ino )
end
else
-- symlink to directory
@@ -65,7 +66,7 @@ end)
app.on('set', function(k,v) end)
-- this registers the plugin UI
-local rooms = {random="random room",randomurl="random room (URL-deterministic)",room_plane="wirefloor",room1="room1",room2="room2",room3="room3",room4="room4",room5="room5",room6="room6",room7="room7"}
+local rooms = { [""]="empty",random="random room",randomurl="random room (URL-deterministic)",room_plane="wirefloor",room1="room1",room2="room2",room3="room3",room4="room4",room5="room5",room6="room6",room7="room7"}
local plugin = {
name = "JanusXR",
@@ -91,44 +92,44 @@ local plugin = {
{
key='app.opts.plugin_janusxr_wrap_custom',
title='VR wrap custom',
- info='include "index.jml" files (if found) in generated JML',
- default="index.jml",
- values={ ["index.jml"] = "index.jml"}
+ info='include "wrapper.jml" file (if present) in generated JML',
+ default="wrapper.jml",
+ values={ ["wrapper.jml"] = "wrapper.jml"}
},
{
key='app.opts.plugin_janusxr_wrap_3dfile',
title='VR wrap 3D file',
info='render 3D files in janusxr.xml room',
default="randomurl",
- values=util.merge(rooms,{disabled="-- disabled --"})
+ values=rooms
},
{
key='app.opts.plugin_janusxr_wrap_image',
title='VR wrap images',
info='render images in janusxr.xml room',
default="randomurl",
- values=util.merge(rooms,{disabled="-- disabled --"})
+ values=rooms
},
{
key='app.opts.plugin_janusxr_wrap_video',
title='VR wrap videos',
info='render videos in janusxr.xml room',
default="randomurl",
- values=util.merge(rooms,{disabled="-- disabled --"})
+ values=rooms
},
{
key='app.opts.plugin_janusxr_wrap_aframe',
title='AFRAME support',
info='render AFRAME (geometry) markup when detected in URLs',
default="room_plane",
- values=util.merge(rooms,{disabled="-- disabled --"})
+ values=rooms
},
{
key='app.opts.plugin_janusxr_portalroom',
title='Directory room',
info='What kind of space should directories be rendered into?',
default="room_plane",
- values={random="random room",room_plane="wirefloor",room1="room1",room2="room2",room3="room3",room4="room4",room5="room5",room6="room6",room7="room7"}
+ values=rooms
},
{
key='app.opts.plugin_janusxr_portal_up',
@@ -178,9 +179,27 @@ local plugin = {
}
},
+ layout = {
+ portals = require('plugin/janusxr/layout/portals'),
+ grid = require('plugin/janusxr/layout/grid')
+ },
+
+ addPortal = function(id,x,v,url,i,z,thumb,rotation,scale)
+ local title = v.title
+ local jml = ''
+ jml = jml .. '\t\n'
+ jml = jml .. '\t \n'
+ jml = jml .. '\t \n'
+ --TODO: fix janusweb paragraph for markdown urls
+ if v.README ~= nil then
+ jml = jml .. '\t \n'
+ end
+ jml = jml .. '\t \n'
+ return jml
+ end,
+
isWrapFile = function(path)
- return tostring(path):match("/" .. app.opts.plugin_janusxr_wrap_custom:gsub("%.",".") .. "jml$")
- and true or false
+ return tostring(path):match( app.opts.plugin_janusxr_wrap_custom )
end,
wrapRoomAroundFile = function(item)
@@ -194,6 +213,7 @@ local plugin = {
if room == 'randomurl' then
room = app.plugin.janusxr.getRandomRoom(item.url)
end
+ if room == 'disabled' then room = '' end
return room
end,
diff --git a/src/plugin/janusxr/layout/grid.lua b/src/plugin/janusxr/layout/grid.lua
new file mode 100644
index 0000000..68cb450
--- /dev/null
+++ b/src/plugin/janusxr/layout/grid.lua
@@ -0,0 +1,69 @@
+local grid = {
+
+ --render = function(items)
+ -- local jml = ''
+ -- local gridsize = tonumber( app.opts.plugin_openbrush_layout_grid_size )
+ -- for i,v in pairs(items) do
+ -- local url = v.redirect and v.redirect or v.url
+ -- local pos = {x=0,y=0,z=0}
+ -- local posStr = pos.x .. ' ' .. pos.y .. ' ' .. pos.z
+ -- jml = jml .. ' \n'
+ -- end
+ -- return jml
+ --end
+
+ render = function(items)
+ local jml = ''
+ -- Distance between items in meters. gridsize = 5 means 5m x 5m spacing.
+ local gridsize = tonumber(app.opts.plugin_openbrush_layout_grid_size) or 5
+ -- Square spiral: Start at (0, 0) right, up, left, down, increasing the step length
+ local x = 0
+ local z = 0
+ local dx = 1
+ local dz = 0
+ local steps = 1
+ local stepsTaken = 0
+ local turns = 0
+ local index = 0
+ for i, v in pairs(items) do
+ local url = v.redirect and v.redirect or v.url
+ -- Position current item
+ local pos = {
+ x = v.title:match("#overlay") and 0 or x * gridsize,
+ y = 0,
+ z = v.title:match("#overlay") and 0 or z * gridsize
+ }
+ local posStr = pos.x .. ' ' .. pos.y .. ' ' .. pos.z
+ local is_nested_room = false
+ if is_nested_room then
+ jml = jml .. ' \n'
+ else
+ jml = jml .. ' \n'
+ end
+ index = index + 1
+ -- Move to next position in the spiral
+ if index < #items then
+ x = x + dx
+ z = z + dz
+ stepsTaken = stepsTaken + 1
+ if stepsTaken == steps then
+ stepsTaken = 0
+ -- Rotate clockwise: right -> up -> left -> down
+ local oldDx = dx
+ dx = -dz
+ dz = oldDx
+ turns = turns + 1
+ -- Increase the length after every second turn
+ if turns % 2 == 0 then
+ steps = steps + 1
+ end
+ end
+ end
+ end
+ return jml
+ end
+
+}
+
+return grid
diff --git a/src/plugin/janusxr/layout/portals.lua b/src/plugin/janusxr/layout/portals.lua
new file mode 100644
index 0000000..fdcfbf2
--- /dev/null
+++ b/src/plugin/janusxr/layout/portals.lua
@@ -0,0 +1,22 @@
+local portals = {
+ render = function(items)
+ local jml = ''
+ for i,v in pairs(items) do
+ local width = v.portal_width or tonumber(app.opts.plugin_global_portal_width )
+ local center = -((#items*width)/1.3) + (i*width)
+ local url = v.url
+ local thumb = ' shad..er_id="defaultportal"'
+ if #v.thumbnail > 0 then
+ thumb = ' thumb_id="img' .. i .. '" '
+ end
+ if v.dir then url = url .. "/" end
+ if v.redirect then url = v.redirect end -- dont wrap standalone glb's in janusxr
+ jml = jml
+ .. app.plugin.janusxr.addPortal('dir',center, v, url,i, -4, thumb, '0 0 0', '0.2 0.2 0.2')
+ .. '\n'
+ end
+ return jml
+ end
+}
+
+return portals
diff --git a/src/plugin/openbrush.lua b/src/plugin/openbrush.lua
index 8997a41..1ce884c 100644
--- a/src/plugin/openbrush.lua
+++ b/src/plugin/openbrush.lua
@@ -1,21 +1,69 @@
local util = require('util')
+local apiSync = require('apiSync')
+
+local syncIcosaGallery = function()
+ if #app.opts.plugin_openbrush_sync_URL > 0 then
+ local synced = apiSync.syncHashtags({
+ tags = util.split( app.opts.plugin_openbrush_sync_hashtag or '', ' '),
+ apiCall = app.plugin.openbrush.apiCall,
+ fetch = app.plugin.openbrush.fetch,
+ download = app.plugin.openbrush.download
+ })
+ end
+end
app.on('init', function()
-end)
-
-app.on('scan_experience', function(exp)
-end)
-
-app.on('scan_experience_file', function(exp)
-end)
-
-app.on('set', function(k,v)
+ foreach( app.plugin.openbrush.opts, function(k,opt)
+ if opt.key == 'app.opts.plugin_openbrush_sync_folder' then
+ opt.values = app.cache.dirs
+ end
+ end)
+ if util.contains(argv, 'generate') then
+ syncIcosaGallery()
+ end
end)
app.on('scheduler', function(opts)
--- if opts.interval == app.opts.plugin_archive_when then
---
--- end
+ if util.contains(argv, 'server') then
+ if util.cmdExist('wget') and opts.interval == app.opts.plugin_openbrush_sync_when then
+ syncIcosaGallery()
+ end
+ end
+end)
+
+local function scanTiltFile(exp)
+ if exp.path:lower():match(".tilt$") then
+ app.markViewable(exp)
+ end
+end
+
+local function scanForOpenBrush(exp)
+ local tags = app.plugin.openbrush.tags
+ if not tags then
+ tags = util.split( app.opts.plugin_openbrush_sync_hashtag, ' ')
+ table.insert( tags,"openbrush")
+ app.plugin.openbrush.tags = tags
+ end
+ foreach( tags, function(k,tag)
+ tag = tag:gsub("#","")
+ if exp.path:match('/' .. tag .. '/') then -- might not be precise enough
+ if not exp.parent.janusxr then
+ exp.parent.janusxr = {}
+ end
+ exp.parent.janusxr.room = app.opts.plugin_openbrush_wrap_room
+ exp.parent.portal_width = tonumber( app.opts.plugin_openbrush_portal_width )
+ exp.parent.layout = app.opts.plugin_openbrush_layout
+ end
+ end)
+ scanTiltFile(exp)
+end
+
+
+app.on('scan_experience', scanForOpenBrush )
+app.on('scan_experience_file', scanForOpenBrush )
+app.on("scan_experience_janusxr", function(opts) scanForOpenBrush(opts.exp) end)
+
+app.on('set', function(k,v)
end)
local sync_URL = app.opts_plugin_openbrush_sync_URL or ''
@@ -28,38 +76,91 @@ local plugin = {
OpenBrush lets you paint in 3D space with virtual reality.
XRForge's webviewer (JanusWeb ) supports interconnecting OpenBrush projects via 3D portals.
- OpenBrush projects are stored in a (selfhosted) icosa.gallery instance, which can be configured below.
+ OpenBrush projects are stored in a (selfhosted) icosa.gallery instance, which can be configured below.
+ NOTE: for collective virtualworld building use hashtags in project-titles . Each hashtag will become its own folder, which allows for crowdsourcing/combining scenes designed in openbrush.
]],
opts = {
{
- key='app.opts.plugin_openbrush_sync_when',
- title='When to sync',
- info='when to check for new experiences?',
- default = "hourly",
- values={disabled="disabled", daily="daily", hourly="hourly"}
+ key='app.opts.plugin_openbrush_wrap_room',
+ title='Wrap VR space',
+ info='render 3D files in janusxr.xml room',
+ default="room_plane",
+ values= app.plugin.janusxr.opts[4].values -- reuse rooms from janusxr plugin
},
{
- key='app.opts.plugin_openbrush_sync_folder_thumbnail',
- title='Sync to folder',
- info='openbrush (icosa.gallery) assets will be saved here',
- placeholder = "openbrush",
- default = "openbrush",
+ key='app.opts.plugin_openbrush_layout',
+ title='Layout assets',
+ info='NOTE: use #overlay in asset-title to skip layout (sky/floor/e.g.)',
+ default="portals",
+ values={portals="As portals", grid="As grid"}
+ },
+ {
+ key='app.opts.plugin_openbrush_layout_grid_size',
+ title='Grid size',
+ info='in square meters (unused for non-grid layout)',
+ default="3",
+ placeholder="3",
values=''
},
+ {
+ key='app.opts.plugin_openbrush_sync_strategy',
+ title='How to sync',
+ info='mirroring = most resilient; references = instant updates',
+ default = "mirror",
+ values={mirror="mirror locally",reference="reference remote URL"}
+ },
+ {
+ key='app.opts.plugin_openbrush_sync_when',
+ title='Sync interval',
+ info='when to sync?',
+ default = "boot",
+ values={disabled="disabled", boot="on boot", hourly="hourly", daily="daily"}
+ },
+ {
+ key='app.opts.plugin_openbrush_sync_bruteforce',
+ title='Sync anyways',
+ info='ignore timestamps',
+ default = "enabled",
+ values={disabled="disabled", enabled="enabled"}
+ },
{
key='app.opts.plugin_openbrush_sync_folder',
+ title='Sync to folder',
+ info='openbrush (icosa.gallery) assets will be saved here',
+ placeholder = "openbrush",
+ default = app.opts.plugin_diskscan_dir,
+ values = {}
+ },
+ {
+ key='app.opts.plugin_openbrush_sync_folder_thumbnail',
title='Thumbnail',
info='URL of Thumbnail for folder/portal',
placeholder = "img/openbrush.png",
default = "img/openbrush.png",
values=''
},
+ {
+ key='app.opts.plugin_openbrush_portal_width',
+ title='Portal spacing',
+ info='Adjust spacing between portals (prevent thumbnail-overlap)',
+ placeholder = "4.2",
+ default = "4.2",
+ values=''
+ },
{
key='app.opts.plugin_openbrush_sync_URL',
title='Icosa gallery URL',
info='public/selfhosted icosa.gallery server-instance',
- placeholder = "https://icosa.gallery",
- default = "https://icosa.gallery",
+ placeholder = "icosa.gallery",
+ default = "icosa.gallery",
+ values=''
+ },
+ {
+ key='app.opts.plugin_openbrush_sync_hashtag',
+ title='tags',
+ info=( sync_URL and 'space-separated tags will generate their own folders' or ''),
+ default = "#1 #xrforge",
+ placeholder = "#1 #xrforge",
values=''
},
{
@@ -78,14 +179,6 @@ local plugin = {
default = "",
values=''
},
- {
- key='app.opts.plugin_openbrush_sync_tag',
- title='tags',
- info=( sync_URL and 'space-separated, leave empty or see API docs ' or ''),
- placeholder = "xrforge",
- default = "",
- values=''
- },
{
key='app.opts.plugin_openbrush_sync_triangle_max',
title='Polygons maximum',
@@ -97,7 +190,7 @@ local plugin = {
{
key='app.opts.plugin_openbrush_sync_author',
title='Author name',
- info='filter assets on specific Author name',
+ info='space-separated: filter assets on specific Author name',
placeholder='sarah',
default = "",
values=""
@@ -105,19 +198,132 @@ local plugin = {
{
key='app.opts.plugin_openbrush_sync_authorid',
title='Author id',
- info='filter assets on specific Author id',
+ info='space-separated: filter assets on specific Author id',
placeholder='9e8b98fbe',
default = "",
values=""
},
+ {
+ key='app.opts.plugin_openbrush_sync_maxitems',
+ title='Max latest items',
+ info='limit the total amount of result',
+ placeholder='3',
+ default = "3",
+ values=""
+ },
{
key='app.opts.plugin_openbrush_sync_collection',
- title='Collection required',
+ title='In collection',
info='should assets be part of a collection?',
- default = "enabled",
- values={enabled="enabled", disabled="disabled"}
+ default = "disabled",
+ values={enabled="yes", disabled="no"}
}
- }
+ },
+
+ apiCall = function(tag)
+ return 'https://api.' .. app.opts.plugin_openbrush_sync_URL .. '/v1/assets?xrforge=' .. EscapeFragment(app.host)
+ .. '&xrforge_strategy=' .. EscapeFragment(app.opts.plugin_openbrush_sync_strategy)
+ .. (tag and #tag > 0 and '&keywords=' .. EscapeFragment(tag) or '')
+ .. (#app.opts.plugin_openbrush_sync_category > 0 and '&category=' .. EscapeFragment(app.opts.plugin_openbrush_sync_category) or '')
+ .. (#app.opts.plugin_openbrush_sync_keywords > 0 and '&keywords=' .. EscapeFragment(app.opts.plugin_openbrush_sync_keywords) or '')
+ .. (#app.opts.plugin_openbrush_sync_triangle_max > 0 and '&triangleCountMax=' .. EscapeFragment(app.opts.plugin_openbrush_sync_triangle_max) or '')
+ .. (app.opts.plugin_openbrush_sync_strategy == 'mirror' and '&license=ALL_CC' or '' )
+ .. (app.opts.plugin_openbrush_sync_collection == 'enabled' and '&inCollection=true' or '' )
+ .. (#app.opts.plugin_openbrush_sync_maxitems > 0 and '&pageSize=' .. EscapeFragment(app.opts.plugin_openbrush_sync_maxitems) or '' )
+ -- TODO: filter AFTER the request
+ -- .. (#app.opts.plugin_openbrush_sync_author > 0 and '&authorName=' .. EscapeFragment(app.opts.plugin_openbrush_sync_author) or '')
+ -- .. (#app.opts.plugin_openbrush_sync_authorid > 0 and '&authorId=' .. EscapeFragment(app.opts.plugin_openbrush_sync_authorid) or '')
+ end,
+
+ getFolder = function(tag)
+ local folder = app.opts.plugin_openbrush_sync_folder
+ if tag then
+ folder = folder .. '/' .. util.hyphenate(tag)
+ end
+ return folder
+ end,
+
+ fetch = function(url,opts)
+ opts = opts or {}
+ if not opts.body then
+ local ok, headers, body = Fetch( url )
+ if not ok then
+ return print("[openbrush.lua] error: could not fetch: " .. app.plugin.openbrush.apiCall(tag))
+ end
+ opts.body = body
+ end
+ return DecodeJson(opts.body)
+ end,
+
+ download = function(t,tag)
+ local me = app.plugin.openbrush
+ local synced = 0
+ foreach( t.assets, function(k,asset)
+ if type(asset) == 'table' then
+ local dirname = '_' .. asset.assetId .. '-' .. util.hyphenate( asset.displayName)
+ local dirnameFull = me.getFolder(tag) .. '/' .. dirname
+ local jsonfile = dirnameFull .. '/asset.json'
+ local sync = true
+ local assetPrevious = false
+ local f = false
+
+ function preferFormat(f)
+ local found = false
+ foreach( asset.formats, function(k,v)
+ if v.formatType == f then
+ found = v
+ end
+ end)
+ return found
+ end
+
+ f = preferFormat('TILT')
+ if not f then f = preferFormat('GLTF2') end
+ if not f then f = preferFormat('GLTF1') end
+ if not f then f = preferFormat('OBJ') end
+ if f then
+ if not util.fileExist( dirnameFull ) then
+ os.execute("mkdir -p " .. dirnameFull)
+ end
+
+ if util.fileExist(jsonfile) then
+ assetPrevious = DecodeJson( util.readfile(jsonfile) )
+ if util.parseIsoDate(asset.updateTime) == util.parseIsoDate(assetPrevious.updateTime) then
+ sync = false -- already finished
+ end
+ end
+ if sync or app.opts.plugin_openbrush_sync_bruteforce == 'enabled' then
+ util.writefile( jsonfile, EncodeJson(asset) )
+ local rootfile = dirnameFull .. '/' .. f.root.url:gsub(".*/","")
+ local thumbnailfile = dirnameFull .. '.' .. asset.thumbnail.url:gsub(".*%.",'')
+ if app.opts.plugin_openbrush_layout == 'portals' then
+ print('🤞 fetch ' .. asset.thumbnail.url)
+ os.execute('wget "' ..asset.thumbnail.url .. '" -O "' .. thumbnailfile .. '"')
+ end
+ print('🤞 fetch ' .. f.root.url)
+ os.execute('wget "' .. f.root.url .. '" -O "' .. rootfile .. '"')
+ if #f.resources > 0 then
+ foreach( f.resources, function(k,resource)
+ local file = dirnameFull .. '/' .. resource.url:gsub(".*/","")
+ print('🤞 fetch ' .. resource.url)
+ os.execute('wget "' .. resource.url .. '" -O "' .. file .. '"')
+ end)
+ end
+ synced = synced + 1
+ else
+ print('[openbrush.lua] ' .. asset.displayName .. ' is up to date')
+ end
+ else
+ print('[openbrush.lua] error: no suitable format found for ' .. asset.displayName .. ' ' .. asset.assetId)
+ end
+ end
+ end, true)
+ return synced
+ end
}
+if not util.cmdExist('wget') then
+ plugin.info = plugin.info .. 'NOTE: wget command not installed..plugin is disabled'
+end
+
return plugin
diff --git a/src/plugin/scheduler.lua b/src/plugin/scheduler.lua
index a3ac1b9..df79ed4 100644
--- a/src/plugin/scheduler.lua
+++ b/src/plugin/scheduler.lua
@@ -16,8 +16,9 @@ return {
if pid == 0 then -- child has zero pid
function periodically()
local check_step = os.getenv('DEBUG') and 1 or 5
- local elapsed = { min5 = 0, hourly = 0, daily = 0, daily2 = 0, weekly = 0}
+ local elapsed = { boot = 0, min5 = 0, hourly = 0, daily = 0, daily2 = 0, weekly = 0}
local intervals = {
+ boot = 1,
min5 = 60*5, -- 5 mins worth seconds
hourly = 60*60, -- 1 hours worth of seconds
daily = 60*60*24, -- 24 hours worth of seconds
diff --git a/src/plugin/xrfragments.lua b/src/plugin/xrfragments.lua
index 1c6fcbe..1090c64 100644
--- a/src/plugin/xrfragments.lua
+++ b/src/plugin/xrfragments.lua
@@ -11,9 +11,15 @@ app.on('scan_experience_file', function(exp)
foreach( util.split( app.opts.plugin_xrfragments_filetypes, ' '), function(k,ext)
if exp.path:lower():match("."..ext.."$") then
local hasHref = false
+ local tree = false
+ -- detect XR Fragment exp https://xrfragment.org/#%F0%9F%93%9C%20level0%3A%20File
if ext == 'glb' then
- -- detect XR Fragment exp https://xrfragment.org/#%F0%9F%93%9C%20level0%3A%20File
- local tree = me.extract_glb_json( exp.path ) --util.stripPath(exp.path) )
+ tree = me.extract_glb_json( exp.path ) --util.stripPath(exp.path) )
+ end
+ if ext == 'gltf' then
+ tree = DecodeJson( util.readfile( exp.path ) )
+ end
+ if three then
hasHref = me.detectHrefInStruct(tree)
end
-- check sidecarfiles: https://xrfragment.org/#sidecar%20files
@@ -39,7 +45,7 @@ app.on('scan_experience_file', function(exp)
href = hasHref
}
if exp.tag.xrfragments.qualify then
- exp.view3D = true
+ app.markViewable(exp)
print("✅ └─ plugin/xrfragments: detected xrfragments experience")
end
if exp.tag.xrfragments.href then
@@ -66,7 +72,7 @@ return {
key='app.opts.plugin_xrfragments_filetypes',
title='Filetypes',
info='Space-separated 3D filetypes, lua patterns are allowed',
- default="glb gltf obj dae",
+ default="glb gltf obj dae tilt",
values=''
}
},
diff --git a/src/test/json/icosagallery.json b/src/test/json/icosagallery.json
new file mode 100644
index 0000000..4b2c285
--- /dev/null
+++ b/src/test/json/icosagallery.json
@@ -0,0 +1 @@
+{"assets": [{"authorId": "bP4he_oE_bR", "authorName": "Anders Fray", "name": "assets/4RpdzBs2C8E", "description": "I pushed one of my character sketches a ways further, developing it into a larger scene which I've recently added to my VR Chat world. It fits quite nicely within my dark and abstract environment. \n\nMy world should be live in VR Chat next week (PC Steam game). If you want to jump and climb on it, join the \"Surreal Hazard\" world within the game. You can find this Blocks model near the foot of the largest mountain.", "createTime": "2017-08-03T00:40:02.538Z", "updateTime": "2017-08-03T00:40:02.538Z", "url": "http://api.icosa.gallery/v1/assets/4RpdzBs2C8E", "assetId": "4RpdzBs2C8E", "displayName": "Kraken vs Robots", "visibility": "PUBLIC", "tags": ["blocks", "curated", "scenes"], "isCurated": true, "thumbnail": {"relativePath": "thumbnail.png", "contentType": "image/png", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/4RpdzBs2C8E/thumbnail.png"}, "triangleCount": 74960, "license": "CREATIVE_COMMONS_BY", "licenseVersion": "3.0", "isIcosaGalleryCompatible": true, "presentationParams": {"camera": {"type": "perspective", "rotation": [-0.1655235607895388, 0.7990477338722931, -0.2549503381027893, -0.5187725849718531], "perspective": {"yfov": 0.7853981633974483, "znear": 0.1000000014901161}, "translation": [-1.878848075866699, -2.586259365081787, -1.562291383743286], "GOOGLE_camera_settings": {}}, "colorSpace": "LINEAR", "backgroundColor": "#ff5722", "GOOGLE_hemi_light": {"groundColor": [1, 0.3411764705882353, 0.1333333333333333]}, "orientingRotation": {"w": 1}, "GOOGLE_backgrounds": {"color": [1, 0.3411764705882353, 0.1333333333333333]}, "GOOGLE_lighting_rig": {"disableShadows": false}, "GOOGLE_geometry_data": {"stats": {"stdev": 1.373308142648786, "radius": 5.649833800763839, "centroid": [1.128485715815241, 0.0555408759756035, 0.3779676161745271]}, "visualCenterPoint": [0.873869619861308, -0.1509583078239911, 0.2999104682929013]}, "GOOGLE_scene_rotation": null, "GOOGLE_lights_image_based": null, "GOOGLE_real_world_transform": null, "GOOGLE_initial_camera_motion": {"motionPath": "FULL_ROTATION"}}, "formats": [{"root": {"relativePath": "model.gltf", "contentType": "model/gltf+json", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1600249447435014/4RpdzBs2C8E/dBhzgf1gvkI/model.gltf"}, "resources": [{"relativePath": "model.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1600249447435014/4RpdzBs2C8E/dBhzgf1gvkI/model.bin"}], "formatComplexity": {"triangleCount": 0}, "formatType": "GLTF2", "zip_archive_url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1600249447435014/4RpdzBs2C8E/dBhzgf1gvkI/archive.zip", "role": "UPDATED_GLTF_FORMAT", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "model.gltf", "contentType": "model/gltf+json", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1600249447435014/4RpdzBs2C8E/cXU04_JCIqZ/model.gltf"}, "resources": [{"relativePath": "model.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1600249447435014/4RpdzBs2C8E/cXU04_JCIqZ/model.bin"}], "formatComplexity": {"triangleCount": 74960}, "formatType": "GLTF1", "zip_archive_url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1600249447435014/4RpdzBs2C8E/cXU04_JCIqZ/model_gltf_4RpdzBs2C8E_cXU04_JCIqZ.zip", "role": "ORIGINAL_GLTF_FORMAT", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "model.usdz", "contentType": "", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1600249447435014/4RpdzBs2C8E/bmJ0AEfXgGW/model.usdz"}, "resources": [], "formatComplexity": {"triangleCount": 0}, "formatType": "USDZ", "role": "USDZ_FORMAT", "isPreferredForDownload": true, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "model.blocks", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1600249447435014/4RpdzBs2C8E/4oc_hsMXbDp/model.blocks"}, "resources": [], "formatComplexity": {"triangleCount": 0}, "formatType": "BLOCKS", "role": "BLOCKS_FORMAT", "isPreferredForDownload": true, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"contentType": "model/gltf+json", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/4RpdzBs2C8E/model_(GLTFupdated).gltf"}, "resources": [{"contentType": "application/octet-stream", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/4RpdzBs2C8E/model.bin"}], "formatComplexity": {"triangleCount": 74960}, "formatType": "GLTF2", "role": "POLYGONE_GLTF_FORMAT", "isPreferredForDownload": false, "isPreferredForGalleryViewer": true, "isCorsAllowed": true}, {"root": {"relativePath": "model.gltf", "contentType": "model/gltf+json", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1600249447435014/4RpdzBs2C8E/6SsP7kEIe07/model.gltf"}, "resources": [{"relativePath": "model.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1600249447435014/4RpdzBs2C8E/6SsP7kEIe07/model.bin"}], "formatComplexity": {"triangleCount": 74960}, "formatType": "GLTF1", "role": "UNKNOWN_GLTF_FORMAT_A", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "model.gltf", "contentType": "model/gltf+json", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1600249447435014/4RpdzBs2C8E/36GkEGRYeY7/model.gltf"}, "resources": [{"relativePath": "model.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1600249447435014/4RpdzBs2C8E/36GkEGRYeY7/model.bin"}], "formatComplexity": {"triangleCount": 0}, "formatType": "GLTF1", "role": "UNKNOWN_GLTF_FORMAT_B", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "model.glb", "contentType": "model/gltf-binary", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1600249447435014/4RpdzBs2C8E/7h1EfT3bZl3/model.glb"}, "resources": [], "formatComplexity": {"triangleCount": 0}, "formatType": "GLB", "role": "UNKNOWN_GLB_FORMAT_B", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}]}, {"authorId": "9AxxBFnnx8O", "authorName": "Avery XR", "name": "assets/a0_pjmT_q0x", "description": "I painted \"The Birth of Venus\" by Sandro Botticelli in Tilt Brush a couple month ago and it is the biggest and the most detailed painting I have ever done.\r\n\r\nI know it is really slow to view but oh well.. art requires sacrifice!", "createTime": "2018-01-29T02:54:51.540Z", "updateTime": "2026-07-01T12:16:26.629Z", "url": "http://api.icosa.gallery/v1/assets/a0_pjmT_q0x", "assetId": "a0_pjmT_q0x", "displayName": "The Birth of Venus", "visibility": "PUBLIC", "tags": ["art", "curated", "tilt"], "isCurated": true, "thumbnail": {"relativePath": "thumbnail.png", "contentType": "image/png", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/a0_pjmT_q0x/thumbnail.png"}, "triangleCount": 3868752, "license": "CREATIVE_COMMONS_BY", "licenseVersion": "3.0", "isIcosaGalleryCompatible": true, "presentationParams": {"camera": {"type": "perspective", "rotation": [-0.187407263821763, 0.0652939546162807, 0.0124859015305192, 0.9800302644410412], "perspective": {"yfov": 0, "znear": 0.1}, "translation": [-0.1165709832582051, 1.727332310771822, 0.4060526784010321], "GOOGLE_camera_settings": null}, "colorSpace": "GAMMA", "backgroundColor": "#000000", "GOOGLE_hemi_light": null, "orientingRotation": {"w": 1}, "GOOGLE_backgrounds": {"color": [0, 0, 0]}, "GOOGLE_lighting_rig": null, "GOOGLE_geometry_data": null, "GOOGLE_scene_rotation": {"rotation": [0, 0, 0, 1]}, "GOOGLE_lights_image_based": null, "GOOGLE_real_world_transform": {"scaling_factor": 1}, "GOOGLE_initial_camera_motion": null}, "formats": [{"root": {"relativePath": "sketch_(GLTFupdated).gltf", "contentType": "model/gltf+json", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/a0_pjmT_q0x/sketch_(GLTFupdated).gltf"}, "resources": [{"relativePath": "sketch.bin", "contentType": "application/octet-stream", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/a0_pjmT_q0x/sketch.bin"}], "formatComplexity": {"triangleCount": 3868752}, "formatType": "GLTF1", "role": "POLYGONE_GLTF_FORMAT", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": true}, {"root": {"relativePath": "sketch.gltf", "contentType": "model/gltf+json", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1619166156333675/a0_pjmT_q0x/3S_wuvuXfab/sketch.gltf"}, "resources": [{"relativePath": "sketch.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1619166156333675/a0_pjmT_q0x/3S_wuvuXfab/sketch.bin"}], "formatComplexity": {"triangleCount": 0}, "formatType": "GLTF2", "role": "UPDATED_GLTF_FORMAT", "isPreferredForDownload": true, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "sketch.tilt", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1619166156333675/a0_pjmT_q0x/0fRDD77PPHA/sketch.tilt"}, "resources": [], "formatComplexity": {"triangleCount": 0}, "formatType": "TILT", "role": "TILT_FORMAT", "isPreferredForDownload": true, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "sketch.tilt", "contentType": "application/vnd-tiltbrush", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/a0_pjmT_q0x/sketch.tilt"}, "resources": [], "formatComplexity": {}, "formatType": "TILT", "role": "POLYGONE_TILT_FORMAT", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": true}, {"root": {"relativePath": "sketch.gltf", "contentType": "model/gltf+json", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/a0_pjmT_q0x/sketch.gltf"}, "resources": [{"relativePath": "sketch.bin", "contentType": "application/octet-stream", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/a0_pjmT_q0x/sketch.bin"}], "formatComplexity": {"triangleCount": 3868752}, "formatType": "GLTF1", "role": "POLYGONE_GLTF_FORMAT", "isPreferredForDownload": false, "isPreferredForGalleryViewer": true, "isCorsAllowed": true}, {"root": {"relativePath": "sketch.gltf", "contentType": "model/gltf+json", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1619166156333675/a0_pjmT_q0x/7hO9QJ4WvDU/sketch.gltf"}, "resources": [{"relativePath": "sketch.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1619166156333675/a0_pjmT_q0x/7hO9QJ4WvDU/sketch.bin"}], "formatComplexity": {"triangleCount": 3868752}, "formatType": "GLTF1", "role": "UNKNOWN_GLTF_FORMAT_A", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "sketch.gltf", "contentType": "model/gltf+json", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1619166156333675/a0_pjmT_q0x/5Y2PyCk0yfD/sketch.gltf"}, "resources": [{"relativePath": "sketch.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1619166156333675/a0_pjmT_q0x/5Y2PyCk0yfD/sketch.bin"}], "formatComplexity": {"triangleCount": 0}, "formatType": "GLTF1", "role": "UNKNOWN_GLTF_FORMAT_C", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}]}, {"authorId": "7mO_tLge_HS", "authorName": "Dave Edwards", "name": "assets/cESakghhV9X", "description": "FormFonts 3D has been making LOW POLY 3D models for professionals for 12 years. Our 3D model library has more than 75,000 professionally made 3D models - all available by subscription for $199/year single user license. \nGo to www.formfonts.com", "createTime": "2025-03-24T18:15:07.341Z", "updateTime": "2018-02-15T02:07:58.073Z", "url": "http://api.icosa.gallery/v1/assets/cESakghhV9X", "assetId": "cESakghhV9X", "displayName": "Mech", "visibility": "PUBLIC", "isCurated": false, "thumbnail": {"relativePath": "thumbnail.png", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/cESakghhV9X/thumbnail.png"}, "triangleCount": 7126, "license": "CREATIVE_COMMONS_BY_ND", "licenseVersion": "3.0", "isIcosaGalleryCompatible": true, "presentationParams": {"camera": {"type": "perspective", "rotation": [-0.1722413059373293, -0.2645482249212459, -0.04808343584881122, 0.9476471666274292], "perspective": {"yfov": 0.7853981633974483, "znear": 0.1000000014901161}, "translation": [-248.9597939847746, 241.1476232556435, 223.1496179013675], "GOOGLE_camera_settings": {"pivot": [0, 0, 0]}}, "colorSpace": "LINEAR", "backgroundColor": "#37474f", "GOOGLE_hemi_light": {"groundColor": [0.2156862745098039, 0.2784313725490196, 0.3098039215686275]}, "orientingRotation": {"w": 1}, "GOOGLE_backgrounds": {"color": [0.2156862745098039, 0.2784313725490196, 0.3098039215686275]}, "GOOGLE_lighting_rig": {"disableShadows": false}, "GOOGLE_geometry_data": {"stats": {"stdev": 72.98593554913798, "radius": 154.251343771777, "centroid": [-71.11047517709702, 130.8493827383226, -53.18552316731027]}, "visualCenterPoint": [-67.65836520624299, 132.2673469715047, -55.89105491835365]}, "GOOGLE_scene_rotation": null, "GOOGLE_lights_image_based": null, "GOOGLE_real_world_transform": null, "GOOGLE_initial_camera_motion": {"motionPath": "FULL_ROTATION"}}, "formats": [{"root": {"relativePath": "VF-1SSU3.gltf", "contentType": "model/gltf+json", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/cESakghhV9X/VF-1SSU3.gltf"}, "resources": [{"relativePath": "VF-1SSU3.bin", "contentType": "application/octet-stream", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/cESakghhV9X/VF-1SSU3.bin"}], "formatComplexity": {"triangleCount": 0}, "formatType": "GLTF2", "zip_archive_url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1601634095714284/cESakghhV9X/b0WxvED65BY/archive.zip", "role": "UPDATED_GLTF_FORMAT", "isPreferredForDownload": true, "isPreferredForGalleryViewer": true, "isCorsAllowed": true}, {"root": {"relativePath": "VF-1SSU3.gltf", "contentType": "model/gltf+json", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1601634095714284/cESakghhV9X/eixeEAf6smY/VF-1SSU3.gltf"}, "resources": [{"relativePath": "VF-1SSU3.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1601634095714284/cESakghhV9X/eixeEAf6smY/VF-1SSU3.bin"}], "formatComplexity": {"triangleCount": 7126}, "formatType": "GLTF1", "zip_archive_url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1601634095714284/cESakghhV9X/eixeEAf6smY/archive.zip", "role": "ORIGINAL_GLTF_FORMAT", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "VF-1SSU3.usdz", "contentType": "", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1601634095714284/cESakghhV9X/9D2IAGLTf5D/VF-1SSU3.usdz"}, "resources": [], "formatComplexity": {"triangleCount": 0}, "formatType": "USDZ", "role": "USDZ_FORMAT", "isPreferredForDownload": true, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "VF-1SSU3.gltf", "contentType": "model/gltf+json", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1601634095714284/cESakghhV9X/89XD7MPXyvP/VF-1SSU3.gltf"}, "resources": [{"relativePath": "VF-1SSU3.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1601634095714284/cESakghhV9X/89XD7MPXyvP/VF-1SSU3.bin"}], "formatComplexity": {"triangleCount": 0}, "formatType": "GLTF1", "role": "UNKNOWN_GLTF_FORMAT_B", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "VF-1SSU3.glb", "contentType": "model/gltf-binary", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1601634095714284/cESakghhV9X/4H8DOAlSyeB/VF-1SSU3.glb"}, "resources": [], "formatComplexity": {"triangleCount": 0}, "formatType": "GLB", "role": "UNKNOWN_GLB_FORMAT_B", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}]}, {"authorId": "axCOZrx3oD3", "authorName": "Emma Bittman", "name": "assets/aXFCUvibNxv", "description": "Made this one last august, but these new features make it look so goooooood", "createTime": "2017-04-27T22:18:23.287Z", "updateTime": "2017-04-27T22:18:23.287Z", "url": "http://api.icosa.gallery/v1/assets/aXFCUvibNxv", "assetId": "aXFCUvibNxv", "displayName": "Auto Aubundance", "visibility": "PUBLIC", "tags": ["curated", "tech", "tilt"], "isCurated": true, "thumbnail": {"relativePath": "thumbnail.png", "contentType": "image/png", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/aXFCUvibNxv/thumbnail.png"}, "triangleCount": 310834, "license": "CREATIVE_COMMONS_BY", "licenseVersion": "3.0", "isIcosaGalleryCompatible": true, "presentationParams": {"camera": {"type": "perspective", "rotation": [0.03356437250637734, -0.4914280183163643, 0.0189577551356827, 0.8700646753156456], "perspective": {"yfov": 0, "znear": 0.1}, "translation": [-3.249236106872559, 0.743713915348053, 1.412418246269226], "GOOGLE_camera_settings": null}, "colorSpace": "GAMMA", "backgroundColor": "#4fc3f7", "GOOGLE_hemi_light": null, "orientingRotation": {"w": 1}, "GOOGLE_backgrounds": {"color": [0.3098039215686275, 0.7647058823529411, 0.9686274509803922]}, "GOOGLE_lighting_rig": null, "GOOGLE_geometry_data": null, "GOOGLE_scene_rotation": null, "GOOGLE_lights_image_based": null, "GOOGLE_real_world_transform": {"scaling_factor": 0}, "GOOGLE_initial_camera_motion": null}, "formats": [{"root": {"relativePath": "tmp69d7a98a_(GLTFupdated).gltf", "contentType": "model/gltf+json", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/aXFCUvibNxv/tmp69d7a98a_(GLTFupdated).gltf"}, "resources": [{"relativePath": "tmp69d7a98a.bin", "contentType": "application/octet-stream", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/aXFCUvibNxv/tmp69d7a98a.bin"}], "formatComplexity": {"triangleCount": 310834}, "formatType": "GLTF1", "role": "POLYGONE_GLTF_FORMAT", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": true}, {"root": {"relativePath": "tmp69d7a98a.gltf", "contentType": "model/gltf+json", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1623494915856675/aXFCUvibNxv/cIS8vs-cges/tmp69d7a98a.gltf"}, "resources": [{"relativePath": "tmp69d7a98a.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1623494915856675/aXFCUvibNxv/cIS8vs-cges/tmp69d7a98a.bin"}], "formatComplexity": {"triangleCount": 0}, "formatType": "GLTF2", "role": "UPDATED_GLTF_FORMAT", "isPreferredForDownload": true, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "tmp4ddadb07.tilt", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1623494915856675/aXFCUvibNxv/1d1jTNZHwAS/tmp4ddadb07.tilt"}, "resources": [], "formatComplexity": {"triangleCount": 0}, "formatType": "TILT", "role": "TILT_FORMAT", "isPreferredForDownload": true, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "tmp4ddadb07.tilt", "contentType": "application/vnd-tiltbrush", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/aXFCUvibNxv/tmp4ddadb07.tilt"}, "resources": [], "formatComplexity": {}, "formatType": "TILT", "role": "POLYGONE_TILT_FORMAT", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": true}, {"root": {"relativePath": "tmp69d7a98a.gltf", "contentType": "model/gltf+json", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1623494915856675/aXFCUvibNxv/4tyuPzc-FAL/tmp69d7a98a.gltf"}, "resources": [{"relativePath": "tmp69d7a98a.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1623494915856675/aXFCUvibNxv/4tyuPzc-FAL/tmp69d7a98a.bin"}], "formatComplexity": {"triangleCount": 310834}, "formatType": "GLTF1", "role": "UNKNOWN_GLTF_FORMAT_A", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "tmp69d7a98a.gltf", "contentType": "model/gltf+json", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1623494915856675/aXFCUvibNxv/0PpZGQp1sa_/tmp69d7a98a.gltf"}, "resources": [{"relativePath": "tmp69d7a98a.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1623494915856675/aXFCUvibNxv/0PpZGQp1sa_/tmp69d7a98a.bin"}], "formatComplexity": {"triangleCount": 0}, "formatType": "GLTF1", "role": "UNKNOWN_GLTF_FORMAT_C", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "tmp69d7a98a.gltf", "contentType": "model/gltf+json", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/aXFCUvibNxv/tmp69d7a98a.gltf"}, "resources": [{"relativePath": "tmp69d7a98a.bin", "contentType": "application/octet-stream", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/aXFCUvibNxv/tmp69d7a98a.bin"}], "formatComplexity": {"triangleCount": 310834}, "formatType": "GLTF1", "role": "POLYGONE_GLTF_FORMAT", "isPreferredForDownload": false, "isPreferredForGalleryViewer": true, "isCorsAllowed": true}]}, {"authorId": "8ri62AdjHrC", "authorName": "Tipatat Chennavasin", "name": "assets/26x_0PKFg-l", "description": "I wanted to push my blocks skills a bit more so I remixed my low poly MS Gundam to match the Master Grade Ver 3.0 spec #anime #robot", "createTime": "2019-05-30T13:29:00.222Z", "updateTime": "2019-05-30T13:29:00.222Z", "url": "http://api.icosa.gallery/v1/assets/26x_0PKFg-l", "assetId": "26x_0PKFg-l", "displayName": "MS Gundam RX-78-2 MG Ver 3.0", "visibility": "PUBLIC", "tags": ["anime", "blocks", "curated", "people", "robot"], "isCurated": true, "thumbnail": {"relativePath": "thumbnail.png", "contentType": "image/png", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/26x_0PKFg-l/thumbnail.png"}, "triangleCount": 12810, "license": "CREATIVE_COMMONS_BY", "licenseVersion": "3.0", "isIcosaGalleryCompatible": true, "presentationParams": {"camera": {"type": "perspective", "rotation": [-0.007623663781935175, 0.2066462139112352, 0.001610206343200097, 0.9783847041231912], "perspective": {"yfov": 0.7853981633974483, "znear": 0.1000000014901161}, "translation": [3.079166095708869, -1.596739750774646, 6.306811686137987], "GOOGLE_camera_settings": {"pivot": [-0.06038748436226715, -1.717739612521874, -0.7938797229708792]}}, "colorSpace": "LINEAR", "backgroundColor": "#000000", "GOOGLE_hemi_light": {"groundColor": [0, 0, 0]}, "orientingRotation": {"w": 1}, "GOOGLE_backgrounds": {"color": [0, 0, 0]}, "GOOGLE_lighting_rig": {"disableShadows": false}, "GOOGLE_geometry_data": {"stats": {"stdev": 1.661786687704645, "radius": 3.611567220077908, "centroid": [-0.02598312533503769, -1.318565714426015, -0.914527739811096]}, "visualCenterPoint": [-0.0434169991843211, -1.554126828497813, -0.8043779547307813]}, "GOOGLE_scene_rotation": null, "GOOGLE_lights_image_based": null, "GOOGLE_real_world_transform": null, "GOOGLE_initial_camera_motion": {"motionPath": "FULL_ROTATION"}}, "formats": [{"root": {"relativePath": "model_(GLTFupdated).gltf", "contentType": "model/gltf+json", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/26x_0PKFg-l/model_(GLTFupdated).gltf"}, "resources": [{"relativePath": "model.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1622659948926368/26x_0PKFg-l/crBUhvk7wuC/model.bin"}], "formatComplexity": {"triangleCount": 0}, "formatType": "GLTF2", "zip_archive_url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1622659948926368/26x_0PKFg-l/crBUhvk7wuC/archive.zip", "role": "UPDATED_GLTF_FORMAT", "isPreferredForDownload": false, "isPreferredForGalleryViewer": true, "isCorsAllowed": false}, {"root": {"relativePath": "model-triangulated.obj", "contentType": "text/plain", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1622659948926368/26x_0PKFg-l/90SkXt_LpRz/model-triangulated.obj"}, "resources": [{"relativePath": "materials.mtl", "contentType": "text/plain", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1622659948926368/26x_0PKFg-l/90SkXt_LpRz/materials.mtl"}], "formatComplexity": {"triangleCount": 12810}, "formatType": "OBJ", "zip_archive_url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1622659948926368/26x_0PKFg-l/90SkXt_LpRz/archive.zip", "role": "ORIGINAL_TRIANGULATED_OBJ_FORMAT", "isPreferredForDownload": true, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "model.usdz", "contentType": "", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1622659948926368/26x_0PKFg-l/4awxblS6_os/model.usdz"}, "resources": [], "formatComplexity": {"triangleCount": 0}, "formatType": "USDZ", "role": "USDZ_FORMAT", "isPreferredForDownload": true, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "model.blocks", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1622659948926368/26x_0PKFg-l/0Rdn-_VPXhs/model.blocks"}, "resources": [], "formatComplexity": {"triangleCount": 0}, "formatType": "BLOCKS", "role": "BLOCKS_FORMAT", "isPreferredForDownload": true, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "model.fbx", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1622659948926368/26x_0PKFg-l/2mH3spVSI0h/model.fbx"}, "resources": [], "formatComplexity": {"triangleCount": 0}, "formatType": "FBX", "role": "ORIGINAL_FBX_FORMAT", "isPreferredForDownload": true, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "model.fbx", "contentType": "application/octet-stream", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/26x_0PKFg-l/model.fbx"}, "resources": [], "formatComplexity": {}, "formatType": "FBX", "role": "POLYGONE_FBX_FORMAT", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": true}, {"root": {"relativePath": "model.gltf", "contentType": "model/gltf+json", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/26x_0PKFg-l/model.gltf"}, "resources": [{"relativePath": "model.bin", "contentType": "application/octet-stream", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/26x_0PKFg-l/model.bin"}], "formatComplexity": {"triangleCount": 12810}, "formatType": "GLTF1", "role": "POLYGONE_GLTF_FORMAT", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": true}, {"root": {"relativePath": "model.gltf", "contentType": "model/gltf+json", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1622659948926368/26x_0PKFg-l/c18nT85k9et/model.gltf"}, "resources": [{"relativePath": "model.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1622659948926368/26x_0PKFg-l/c18nT85k9et/model.bin"}], "formatComplexity": {"triangleCount": 0}, "formatType": "GLTF1", "role": "UNKNOWN_GLTF_FORMAT_B", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "model.gltf", "contentType": "model/gltf+json", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1622659948926368/26x_0PKFg-l/e8ZiNbyXbcz/model.gltf"}, "resources": [{"relativePath": "model.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1622659948926368/26x_0PKFg-l/e8ZiNbyXbcz/model.bin"}], "formatComplexity": {"triangleCount": 12810}, "formatType": "GLTF1", "role": "UNKNOWN_GLTF_FORMAT_A", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "model.gltf", "contentType": "model/gltf+json", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1622659948926368/26x_0PKFg-l/7334aCPfTKL/model.gltf"}, "resources": [{"relativePath": "model.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1622659948926368/26x_0PKFg-l/7334aCPfTKL/model.bin"}], "formatComplexity": {"triangleCount": 12810}, "formatType": "GLTF1", "zip_archive_url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1622659948926368/26x_0PKFg-l/7334aCPfTKL/archive.zip", "role": "ORIGINAL_GLTF_FORMAT", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "model.glb", "contentType": "model/gltf-binary", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1622659948926368/26x_0PKFg-l/5Hjd433jyUN/model.glb"}, "resources": [], "formatComplexity": {"triangleCount": 0}, "formatType": "GLB", "role": "UNKNOWN_GLB_FORMAT_B", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}]}, {"authorId": "a9RoJZgoxv2", "authorName": "Sara Phinn", "name": "assets/bfdNVrU9yIV", "description": "Coral Reef in Tiltbrush\nby Sara Phinn", "createTime": "2019-06-07T22:22:38.811Z", "updateTime": "2019-06-07T22:22:38.811Z", "url": "http://api.icosa.gallery/v1/assets/bfdNVrU9yIV", "assetId": "bfdNVrU9yIV", "displayName": "Coral Reef", "visibility": "PUBLIC", "tags": ["art", "curated", "tilt"], "isCurated": true, "thumbnail": {"relativePath": "thumbnail.png", "contentType": "image/png", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/bfdNVrU9yIV/thumbnail.png"}, "triangleCount": 4635022, "license": "CREATIVE_COMMONS_BY", "licenseVersion": "3.0", "isIcosaGalleryCompatible": true, "presentationParams": {"camera": {"type": "perspective", "rotation": [0.05380062925405529, 0.9304735605208247, 0.1522197106346888, -0.32886715427032], "perspective": {"yfov": 0.7853981633974483, "znear": 0.1000000014901161}, "translation": [3.794897115265632, 7.496046280925794, -0.7749583962382656], "GOOGLE_camera_settings": null}, "colorSpace": "GAMMA", "backgroundColor": "#000000", "GOOGLE_hemi_light": null, "orientingRotation": {"w": 1}, "GOOGLE_backgrounds": {"color": [0, 0, 0]}, "GOOGLE_lighting_rig": {"disableShadows": false}, "GOOGLE_geometry_data": {"stats": {"stdev": 0.3267867390581266, "radius": 8.063159376682147, "centroid": [3.960551697262566, 7.417566892104358, -0.676103069014658]}, "visualCenterPoint": [3.652534603156126, 9.448086255339621, -0.7024887485261038]}, "GOOGLE_scene_rotation": null, "GOOGLE_lights_image_based": null, "GOOGLE_real_world_transform": null, "GOOGLE_initial_camera_motion": {"motionPath": "FULL_ROTATION"}}, "formats": [{"root": {"relativePath": "sketch_(GLTFupdated).gltf", "contentType": "model/gltf+json", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/bfdNVrU9yIV/sketch_(GLTFupdated).gltf"}, "resources": [{"relativePath": "sketch.bin", "contentType": "application/octet-stream", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/bfdNVrU9yIV/sketch.bin"}], "formatComplexity": {"triangleCount": 4635022}, "formatType": "GLTF1", "role": "POLYGONE_GLTF_FORMAT", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": true}, {"root": {"relativePath": "sketch.gltf", "contentType": "model/gltf+json", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1623288747899424/bfdNVrU9yIV/0Qym_reYbBj/sketch.gltf"}, "resources": [{"relativePath": "sketch.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1623288747899424/bfdNVrU9yIV/0Qym_reYbBj/sketch.bin"}], "formatComplexity": {"triangleCount": 0}, "formatType": "GLTF2", "role": "UPDATED_GLTF_FORMAT", "isPreferredForDownload": true, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "sketch.tilt", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1623288747899424/bfdNVrU9yIV/0f912oQH_tE/sketch.tilt"}, "resources": [], "formatComplexity": {"triangleCount": 0}, "formatType": "TILT", "role": "TILT_FORMAT", "isPreferredForDownload": true, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "sketch.tilt", "contentType": "application/vnd-tiltbrush", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/bfdNVrU9yIV/sketch.tilt"}, "resources": [], "formatComplexity": {}, "formatType": "TILT", "role": "POLYGONE_TILT_FORMAT", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": true}, {"root": {"relativePath": "sketch.gltf", "contentType": "model/gltf+json", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1623288747899424/bfdNVrU9yIV/6g3WaCNeYLV/sketch.gltf"}, "resources": [{"relativePath": "sketch.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1623288747899424/bfdNVrU9yIV/6g3WaCNeYLV/sketch.bin"}], "formatComplexity": {"triangleCount": 4635022}, "formatType": "GLTF1", "role": "UNKNOWN_GLTF_FORMAT_A", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "sketch.gltf", "contentType": "model/gltf+json", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1623288747899424/bfdNVrU9yIV/6k0VSfoXsyJ/sketch.gltf"}, "resources": [{"relativePath": "sketch.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1623288747899424/bfdNVrU9yIV/6k0VSfoXsyJ/sketch.bin"}], "formatComplexity": {"triangleCount": 0}, "formatType": "GLTF1", "role": "UNKNOWN_GLTF_FORMAT_C", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "sketch.gltf", "contentType": "model/gltf+json", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/bfdNVrU9yIV/sketch.gltf"}, "resources": [{"relativePath": "sketch.bin", "contentType": "application/octet-stream", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/bfdNVrU9yIV/sketch.bin"}], "formatComplexity": {"triangleCount": 4635022}, "formatType": "GLTF1", "role": "POLYGONE_GLTF_FORMAT", "isPreferredForDownload": false, "isPreferredForGalleryViewer": true, "isCorsAllowed": true}]}, {"authorId": "5yf9AkE7EtK", "authorName": "sterling osment", "name": "assets/19hA9ChVwO7", "description": "YAY MECH", "createTime": "2017-05-06T03:56:14.825Z", "updateTime": "2017-05-06T03:56:14.825Z", "url": "http://api.icosa.gallery/v1/assets/19hA9ChVwO7", "assetId": "19hA9ChVwO7", "displayName": "TLITMECH_2547", "visibility": "PUBLIC", "tags": ["animals", "curated", "tilt"], "isCurated": true, "thumbnail": {"relativePath": "thumbnail.png", "contentType": "image/png", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/19hA9ChVwO7/thumbnail.png"}, "triangleCount": 225772, "license": "CREATIVE_COMMONS_BY", "licenseVersion": "3.0", "isIcosaGalleryCompatible": true, "presentationParams": {"camera": {"type": "perspective", "rotation": [-0.003773198858497623, 0.2771028901389188, 0.00108818613711999, 0.960832226300702], "perspective": {"yfov": 0, "znear": 0.1}, "translation": [0.5525891184806824, 1.396848559379578, 0.8853461146354675], "GOOGLE_camera_settings": null}, "colorSpace": "GAMMA", "GOOGLE_hemi_light": null, "orientingRotation": {"w": 1}, "GOOGLE_backgrounds": null, "GOOGLE_lighting_rig": null, "GOOGLE_geometry_data": null, "GOOGLE_scene_rotation": null, "GOOGLE_lights_image_based": null, "GOOGLE_real_world_transform": {"scaling_factor": 0}, "GOOGLE_initial_camera_motion": null}, "formats": [{"root": {"relativePath": "tmp61ed3f96_(GLTFupdated).gltf", "contentType": "model/gltf+json", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/19hA9ChVwO7/tmp61ed3f96_(GLTFupdated).gltf"}, "resources": [{"relativePath": "tmp61ed3f96.bin", "contentType": "application/octet-stream", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/19hA9ChVwO7/tmp61ed3f96.bin"}], "formatComplexity": {"triangleCount": 225772}, "formatType": "GLTF1", "role": "POLYGONE_GLTF_FORMAT", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": true}, {"root": {"relativePath": "tmp61ed3f96.gltf", "contentType": "model/gltf+json", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1599471001964123/19hA9ChVwO7/azzmPr88z_v/tmp61ed3f96.gltf"}, "resources": [{"relativePath": "tmp61ed3f96.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1599471001964123/19hA9ChVwO7/azzmPr88z_v/tmp61ed3f96.bin"}], "formatComplexity": {"triangleCount": 0}, "formatType": "GLTF2", "role": "UPDATED_GLTF_FORMAT", "isPreferredForDownload": true, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "Untitled_13.tilt", "contentType": "application/vnd-tiltbrush", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/19hA9ChVwO7/Untitled_13.tilt"}, "resources": [], "formatComplexity": {}, "formatType": "TILT", "role": "POLYGONE_TILT_FORMAT", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": true}, {"root": {"relativePath": "Untitled_13.tilt", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1599471001964123/19hA9ChVwO7/9azEJKNU3P4/Untitled_13.tilt"}, "resources": [], "formatComplexity": {"triangleCount": 0}, "formatType": "TILT", "role": "TILT_FORMAT", "isPreferredForDownload": true, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "tmp61ed3f96.gltf", "contentType": "model/gltf+json", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/19hA9ChVwO7/tmp61ed3f96.gltf"}, "resources": [{"relativePath": "tmp61ed3f96.bin", "contentType": "application/octet-stream", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/19hA9ChVwO7/tmp61ed3f96.bin"}], "formatComplexity": {"triangleCount": 225772}, "formatType": "GLTF1", "role": "POLYGONE_GLTF_FORMAT", "isPreferredForDownload": false, "isPreferredForGalleryViewer": true, "isCorsAllowed": true}, {"root": {"relativePath": "tmp61ed3f96.gltf", "contentType": "model/gltf+json", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1599471001964123/19hA9ChVwO7/aPH1n-JjQ6f/tmp61ed3f96.gltf"}, "resources": [{"relativePath": "tmp61ed3f96.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1599471001964123/19hA9ChVwO7/aPH1n-JjQ6f/tmp61ed3f96.bin"}], "formatComplexity": {"triangleCount": 225772}, "formatType": "GLTF1", "role": "UNKNOWN_GLTF_FORMAT_A", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "tmp61ed3f96.gltf", "contentType": "model/gltf+json", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1599471001964123/19hA9ChVwO7/bW8HOHN2z70/tmp61ed3f96.gltf"}, "resources": [{"relativePath": "tmp61ed3f96.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1599471001964123/19hA9ChVwO7/bW8HOHN2z70/tmp61ed3f96.bin"}], "formatComplexity": {"triangleCount": 0}, "formatType": "GLTF1", "role": "UNKNOWN_GLTF_FORMAT_C", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}]}, {"authorId": "ds00DbnZFEb", "authorName": "Riley Whitta", "name": "assets/1J8DjUdCg4-", "description": "I saw some of the trailers and was inspired to draw Venom. I know Im not the best at VR art but its something", "createTime": "2018-08-10T00:55:31.830Z", "updateTime": "2018-08-10T00:55:31.830Z", "url": "http://api.icosa.gallery/v1/assets/1J8DjUdCg4-", "assetId": "1J8DjUdCg4-", "displayName": "Venom Fan Art", "visibility": "PUBLIC", "tags": ["people", "tilt"], "isCurated": false, "thumbnail": {"relativePath": "thumbnail.png", "contentType": "image/png", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/1J8DjUdCg4-/thumbnail.png"}, "triangleCount": 416806, "license": "CREATIVE_COMMONS_BY", "licenseVersion": "3.0", "isIcosaGalleryCompatible": true, "presentationParams": {"camera": {"type": "perspective", "rotation": [0.1037910505440541, -0.4826402380473415, 0.05772972280038847, 0.867728700430012], "perspective": {"yfov": 0, "znear": 0.1}, "translation": [-0.04164940118789684, 0.7936739325523376, -0.2750977575778962], "GOOGLE_camera_settings": null}, "colorSpace": "GAMMA", "backgroundColor": "#000000", "GOOGLE_hemi_light": null, "orientingRotation": {"w": 1}, "GOOGLE_backgrounds": {"color": [0, 0, 0]}, "GOOGLE_lighting_rig": null, "GOOGLE_geometry_data": null, "GOOGLE_scene_rotation": {"rotation": [0, 0, 0, 1]}, "GOOGLE_lights_image_based": null, "GOOGLE_real_world_transform": {"scaling_factor": 0}, "GOOGLE_initial_camera_motion": null}, "formats": [{"root": {"relativePath": "sketch_(GLTFupdated).gltf", "contentType": "model/gltf+json", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/1J8DjUdCg4-/sketch_(GLTFupdated).gltf"}, "resources": [{"relativePath": "sketch.bin", "contentType": "application/octet-stream", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/1J8DjUdCg4-/sketch.bin"}], "formatComplexity": {"triangleCount": 416806}, "formatType": "GLTF1", "role": "POLYGONE_GLTF_FORMAT", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": true}, {"root": {"relativePath": "sketch.tilt", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1598261540762795/1J8DjUdCg4-/8pQsJ_E_NAH/sketch.tilt"}, "resources": [], "formatComplexity": {"triangleCount": 0}, "formatType": "TILT", "role": "TILT_FORMAT", "isPreferredForDownload": true, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "sketch.tilt", "contentType": "application/vnd-tiltbrush", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/1J8DjUdCg4-/sketch.tilt"}, "resources": [], "formatComplexity": {}, "formatType": "TILT", "role": "POLYGONE_TILT_FORMAT", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": true}, {"root": {"relativePath": "sketch.gltf", "contentType": "model/gltf+json", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1598261540762795/1J8DjUdCg4-/cSho-8dRQhA/sketch.gltf"}, "resources": [{"relativePath": "sketch.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1598261540762795/1J8DjUdCg4-/cSho-8dRQhA/sketch.bin"}], "formatComplexity": {"triangleCount": 0}, "formatType": "GLTF2", "role": "UPDATED_GLTF_FORMAT", "isPreferredForDownload": true, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "sketch.gltf", "contentType": "model/gltf+json", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/1J8DjUdCg4-/sketch.gltf"}, "resources": [{"relativePath": "sketch.bin", "contentType": "application/octet-stream", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/1J8DjUdCg4-/sketch.bin"}], "formatComplexity": {"triangleCount": 416806}, "formatType": "GLTF1", "role": "POLYGONE_GLTF_FORMAT", "isPreferredForDownload": false, "isPreferredForGalleryViewer": true, "isCorsAllowed": true}, {"root": {"relativePath": "sketch.gltf", "contentType": "model/gltf+json", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1598261540762795/1J8DjUdCg4-/fPacpsU_u6x/sketch.gltf"}, "resources": [{"relativePath": "sketch.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1598261540762795/1J8DjUdCg4-/fPacpsU_u6x/sketch.bin"}], "formatComplexity": {"triangleCount": 416806}, "formatType": "GLTF1", "role": "UNKNOWN_GLTF_FORMAT_A", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "sketch.gltf", "contentType": "model/gltf+json", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1598261540762795/1J8DjUdCg4-/8QwgRRHlOzM/sketch.gltf"}, "resources": [{"relativePath": "sketch.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1598261540762795/1J8DjUdCg4-/8QwgRRHlOzM/sketch.bin"}], "formatComplexity": {"triangleCount": 0}, "formatType": "GLTF1", "role": "UNKNOWN_GLTF_FORMAT_C", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}]}, {"authorId": "5yf9AkE7EtK", "authorName": "sterling osment", "name": "assets/0OEviggxpdF", "description": "Man VR is so much fun - freedom on a whole new level. It looks good in the gallery but so much better in Vreal life .", "createTime": "2017-05-05T14:11:43.124Z", "updateTime": "2017-05-05T14:11:43.124Z", "url": "http://api.icosa.gallery/v1/assets/0OEviggxpdF", "assetId": "0OEviggxpdF", "displayName": "TILTMECH_7562", "visibility": "PUBLIC", "tags": ["curated", "people", "tilt"], "isCurated": true, "thumbnail": {"relativePath": "thumbnail.png", "contentType": "image/png", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/0OEviggxpdF/thumbnail.png"}, "triangleCount": 222472, "license": "CREATIVE_COMMONS_BY", "licenseVersion": "3.0", "isIcosaGalleryCompatible": true, "presentationParams": {"camera": {"type": "perspective", "rotation": [-0.03262316051645919, -0.33821795562198, -0.01173266536125605, 0.9404289917140616], "perspective": {"yfov": 0, "znear": 0.1}, "translation": [-1.11176335811615, 1.141022682189941, 1.371872901916504], "GOOGLE_camera_settings": null}, "colorSpace": "GAMMA", "GOOGLE_hemi_light": null, "orientingRotation": {"w": 1}, "GOOGLE_backgrounds": null, "GOOGLE_lighting_rig": null, "GOOGLE_geometry_data": null, "GOOGLE_scene_rotation": null, "GOOGLE_lights_image_based": null, "GOOGLE_real_world_transform": {"scaling_factor": 0}, "GOOGLE_initial_camera_motion": null}, "formats": [{"root": {"relativePath": "tmp3b6af405_(GLTFupdated).gltf", "contentType": "model/gltf+json", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/0OEviggxpdF/tmp3b6af405_(GLTFupdated).gltf"}, "resources": [{"relativePath": "tmp3b6af405.bin", "contentType": "application/octet-stream", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/0OEviggxpdF/tmp3b6af405.bin"}], "formatComplexity": {"triangleCount": 222472}, "formatType": "GLTF1", "role": "POLYGONE_GLTF_FORMAT", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": true}, {"root": {"relativePath": "tmp5378d520.tilt", "contentType": "application/vnd-tiltbrush", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/0OEviggxpdF/tmp5378d520.tilt"}, "resources": [], "formatComplexity": {}, "formatType": "TILT", "role": "POLYGONE_TILT_FORMAT", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": true}, {"root": {"relativePath": "tmp5378d520.tilt", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1618380131493230/0OEviggxpdF/7Co_tMYfR9h/tmp5378d520.tilt"}, "resources": [], "formatComplexity": {"triangleCount": 0}, "formatType": "TILT", "role": "TILT_FORMAT", "isPreferredForDownload": true, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "tmp3b6af405.gltf", "contentType": "model/gltf+json", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1618380131493230/0OEviggxpdF/3zlmiOajwjS/tmp3b6af405.gltf"}, "resources": [{"relativePath": "tmp3b6af405.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1618380131493230/0OEviggxpdF/3zlmiOajwjS/tmp3b6af405.bin"}], "formatComplexity": {"triangleCount": 0}, "formatType": "GLTF1", "role": "UNKNOWN_GLTF_FORMAT_C", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "tmp3b6af405.gltf", "contentType": "model/gltf+json", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/0OEviggxpdF/tmp3b6af405.gltf"}, "resources": [{"relativePath": "tmp3b6af405.bin", "contentType": "application/octet-stream", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/0OEviggxpdF/tmp3b6af405.bin"}], "formatComplexity": {"triangleCount": 222472}, "formatType": "GLTF1", "role": "POLYGONE_GLTF_FORMAT", "isPreferredForDownload": false, "isPreferredForGalleryViewer": true, "isCorsAllowed": true}, {"root": {"relativePath": "tmp3b6af405.gltf", "contentType": "model/gltf+json", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1618380131493230/0OEviggxpdF/3PsCn41UA6A/tmp3b6af405.gltf"}, "resources": [{"relativePath": "tmp3b6af405.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1618380131493230/0OEviggxpdF/3PsCn41UA6A/tmp3b6af405.bin"}], "formatComplexity": {"triangleCount": 0}, "formatType": "GLTF2", "role": "UPDATED_GLTF_FORMAT", "isPreferredForDownload": true, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "tmp3b6af405.gltf", "contentType": "model/gltf+json", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1618380131493230/0OEviggxpdF/d3-7CZdidB8/tmp3b6af405.gltf"}, "resources": [{"relativePath": "tmp3b6af405.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1618380131493230/0OEviggxpdF/d3-7CZdidB8/tmp3b6af405.bin"}], "formatComplexity": {"triangleCount": 222472}, "formatType": "GLTF1", "role": "UNKNOWN_GLTF_FORMAT_A", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}]}, {"authorId": "dwj2VpIj_i4", "authorName": "Yogoshimo 2.0", "name": "assets/9vAFsDAtFLm", "description": "3D practice of a species series - Learn more @:\n\nhttps://www.deviantart.com/yogosimo/art/Bio-Mech-Creatures-Concept-Theories-755197564\n\nAlso, More @: https://goo.gl/fganLy", "createTime": "2019-02-12T01:22:39.047Z", "updateTime": "2019-02-12T01:22:39.047Z", "url": "http://api.icosa.gallery/v1/assets/9vAFsDAtFLm", "assetId": "9vAFsDAtFLm", "displayName": "Creature Bio-Mech - Base.1", "visibility": "PUBLIC", "tags": ["animals", "curated"], "isCurated": true, "thumbnail": {"relativePath": "thumbnail.png", "contentType": "image/png", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/9vAFsDAtFLm/thumbnail.png"}, "triangleCount": 1418, "license": "CREATIVE_COMMONS_BY", "licenseVersion": "3.0", "isIcosaGalleryCompatible": true, "presentationParams": {"camera": {"type": "perspective", "rotation": [-0.04855484842463176, 0.9434130852008723, 0.159930432134881, 0.2864200311489806], "perspective": {"yfov": 0.7853981633974483, "znear": 0.1000000014901161}, "translation": [-0.3973506360552627, 1.677690193241633, -0.7067515159889298], "GOOGLE_camera_settings": {"pivot": [-0.9956274358039445, 1.30203887523542, 0.1877350952115819]}}, "colorSpace": "LINEAR", "backgroundColor": "#fafafa", "GOOGLE_hemi_light": {"groundColor": [0.9803921568627451, 0.9803921568627451, 0.9803921568627451]}, "orientingRotation": {"w": 1}, "GOOGLE_backgrounds": {"color": [0.9803921568627451, 0.9803921568627451, 0.9803921568627451]}, "GOOGLE_lighting_rig": {"disableShadows": false}, "GOOGLE_geometry_data": {"stats": {"stdev": 0.2353702943394693, "radius": 0.6820525032982269, "centroid": [-0.9925326605092039, 1.280900166748644, 0.1206982020513741]}, "visualCenterPoint": [-0.9956207928200979, 1.30203701708615, 0.1879201374596848]}, "GOOGLE_scene_rotation": null, "GOOGLE_lights_image_based": null, "GOOGLE_real_world_transform": null, "GOOGLE_initial_camera_motion": {"motionPath": "FULL_ROTATION"}}, "formats": [{"root": {"relativePath": "model.gltf", "contentType": "model/gltf+json", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1623067975941638/9vAFsDAtFLm/fTUpuRVGbhk/model.gltf"}, "resources": [{"relativePath": "model.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1623067975941638/9vAFsDAtFLm/fTUpuRVGbhk/model.bin"}], "formatComplexity": {"triangleCount": 0}, "formatType": "GLTF2", "zip_archive_url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1623067975941638/9vAFsDAtFLm/fTUpuRVGbhk/archive.zip", "role": "UPDATED_GLTF_FORMAT", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "model.gltf", "contentType": "model/gltf+json", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1623067975941638/9vAFsDAtFLm/2DiM63v6rBd/model.gltf"}, "resources": [{"relativePath": "model.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1623067975941638/9vAFsDAtFLm/2DiM63v6rBd/model.bin"}], "formatComplexity": {"triangleCount": 1418}, "formatType": "GLTF1", "zip_archive_url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1623067975941638/9vAFsDAtFLm/2DiM63v6rBd/archive.zip", "role": "ORIGINAL_GLTF_FORMAT", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "model-triangulated.obj", "contentType": "text/plain", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1623067975941638/9vAFsDAtFLm/4gM0DGJgNWs/model-triangulated.obj"}, "resources": [{"relativePath": "materials.mtl", "contentType": "text/plain", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1623067975941638/9vAFsDAtFLm/4gM0DGJgNWs/materials.mtl"}], "formatComplexity": {"triangleCount": 1418}, "formatType": "OBJ", "zip_archive_url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1623067975941638/9vAFsDAtFLm/4gM0DGJgNWs/archive.zip", "role": "ORIGINAL_TRIANGULATED_OBJ_FORMAT", "isPreferredForDownload": true, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "model.blocks", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1623067975941638/9vAFsDAtFLm/40TQMSCE1wB/model.blocks"}, "resources": [], "formatComplexity": {"triangleCount": 0}, "formatType": "BLOCKS", "role": "BLOCKS_FORMAT", "isPreferredForDownload": true, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "model.usdz", "contentType": "", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1623067975941638/9vAFsDAtFLm/eF7i2wHve1u/model.usdz"}, "resources": [], "formatComplexity": {"triangleCount": 0}, "formatType": "USDZ", "role": "USDZ_FORMAT", "isPreferredForDownload": true, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "model.fbx", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1623067975941638/9vAFsDAtFLm/3L-ln-UK2yN/model.fbx"}, "resources": [], "formatComplexity": {"triangleCount": 0}, "formatType": "FBX", "role": "ORIGINAL_FBX_FORMAT", "isPreferredForDownload": true, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"contentType": "model/gltf+json", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/9vAFsDAtFLm/model_(GLTFupdated).gltf"}, "resources": [{"contentType": "application/octet-stream", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/9vAFsDAtFLm/model.bin"}], "formatComplexity": {"triangleCount": 1418}, "formatType": "GLTF2", "role": "POLYGONE_GLTF_FORMAT", "isPreferredForDownload": false, "isPreferredForGalleryViewer": true, "isCorsAllowed": true}, {"root": {"relativePath": "model.fbx", "contentType": "application/octet-stream", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/9vAFsDAtFLm/model.fbx"}, "resources": [], "formatComplexity": {}, "formatType": "FBX", "role": "POLYGONE_FBX_FORMAT", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": true}, {"root": {"relativePath": "model.gltf", "contentType": "model/gltf+json", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1623067975941638/9vAFsDAtFLm/44cFuw5iqCg/model.gltf"}, "resources": [{"relativePath": "model.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1623067975941638/9vAFsDAtFLm/44cFuw5iqCg/model.bin"}], "formatComplexity": {"triangleCount": 0}, "formatType": "GLTF1", "role": "UNKNOWN_GLTF_FORMAT_B", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "model.gltf", "contentType": "model/gltf+json", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1623067975941638/9vAFsDAtFLm/7dB_AcYXLOt/model.gltf"}, "resources": [{"relativePath": "model.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1623067975941638/9vAFsDAtFLm/7dB_AcYXLOt/model.bin"}], "formatComplexity": {"triangleCount": 1418}, "formatType": "GLTF1", "role": "UNKNOWN_GLTF_FORMAT_A", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "model.glb", "contentType": "model/gltf-binary", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1623067975941638/9vAFsDAtFLm/1gRoSZlmGF8/model.glb"}, "resources": [], "formatComplexity": {"triangleCount": 0}, "formatType": "GLB", "role": "UNKNOWN_GLB_FORMAT_B", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}]}, {"authorId": "eN_W2BsIBF8", "authorName": "pasta sauce", "name": "assets/0GEmm5SkdhR", "description": "this is not mine just made tweaks", "createTime": "2017-07-08T17:20:58.514Z", "updateTime": "2017-07-08T17:20:58.514Z", "url": "http://api.icosa.gallery/v1/assets/0GEmm5SkdhR", "assetId": "0GEmm5SkdhR", "displayName": "giant mech v2", "visibility": "PUBLIC", "tags": ["tech"], "isCurated": false, "thumbnail": {"relativePath": "thumbnail.png", "contentType": "image/png", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/0GEmm5SkdhR/thumbnail.png"}, "triangleCount": 18852, "license": "CREATIVE_COMMONS_BY", "licenseVersion": "3.0", "isIcosaGalleryCompatible": true, "presentationParams": {"camera": {"type": "perspective", "rotation": [-0.01307852968678055, -0.5720748079647041, -0.009123747740518509, 0.8200464153818041], "perspective": {"yfov": 0.7853981633974483, "znear": 0.1000000014901161}, "translation": [-5.545609951019287, -0.5929307341575623, 1.498178124427795], "GOOGLE_camera_settings": {}}, "colorSpace": "LINEAR", "backgroundColor": "#eeeeee", "GOOGLE_hemi_light": {"groundColor": [0.9333333333333333, 0.9333333333333333, 0.9333333333333333]}, "orientingRotation": {"w": 1}, "GOOGLE_backgrounds": {"color": [0.9333333333333333, 0.9333333333333333, 0.9333333333333333]}, "GOOGLE_lighting_rig": {"disableShadows": false}, "GOOGLE_geometry_data": {"stats": {"stdev": 0.9583683963825941, "radius": 4.463047870696757, "centroid": [-1.186148916797837, -0.7465505615210978, -0.1053463548998305]}, "visualCenterPoint": [-0.6570762837335037, -0.0242517212648838, 0.1710199489646934]}, "GOOGLE_scene_rotation": null, "GOOGLE_lights_image_based": null, "GOOGLE_real_world_transform": null, "GOOGLE_initial_camera_motion": {"motionPath": "FULL_ROTATION"}}, "formats": [{"root": {"relativePath": "model_(GLTFupdated).gltf", "contentType": "model/gltf+json", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/0GEmm5SkdhR/model_(GLTFupdated).gltf"}, "resources": [{"relativePath": "model.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1613589265798709/0GEmm5SkdhR/7BTDNOS4iOL/model.bin"}], "formatComplexity": {"triangleCount": 0}, "formatType": "GLTF2", "zip_archive_url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1613589265798709/0GEmm5SkdhR/7BTDNOS4iOL/archive.zip", "role": "UPDATED_GLTF_FORMAT", "isPreferredForDownload": false, "isPreferredForGalleryViewer": true, "isCorsAllowed": false}, {"root": {"relativePath": "model.gltf", "contentType": "model/gltf+json", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1613589265798709/0GEmm5SkdhR/eRAdl3sTwqZ/model.gltf"}, "resources": [{"relativePath": "model.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1613589265798709/0GEmm5SkdhR/eRAdl3sTwqZ/model.bin"}], "formatComplexity": {"triangleCount": 18852}, "formatType": "GLTF1", "zip_archive_url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1613589265798709/0GEmm5SkdhR/eRAdl3sTwqZ/model_gltf_0GEmm5SkdhR_eRAdl3sTwqZ.zip", "role": "ORIGINAL_GLTF_FORMAT", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "model.usdz", "contentType": "", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1613589265798709/0GEmm5SkdhR/bVkMjkc1ixx/model.usdz"}, "resources": [], "formatComplexity": {"triangleCount": 0}, "formatType": "USDZ", "role": "USDZ_FORMAT", "isPreferredForDownload": true, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "model.blocks", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1613589265798709/0GEmm5SkdhR/9Xzd1rgq9H7/model.blocks"}, "resources": [], "formatComplexity": {"triangleCount": 0}, "formatType": "BLOCKS", "role": "BLOCKS_FORMAT", "isPreferredForDownload": true, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "model.gltf", "contentType": "model/gltf+json", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/0GEmm5SkdhR/model.gltf"}, "resources": [{"relativePath": "model.bin", "contentType": "application/octet-stream", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/0GEmm5SkdhR/model.bin"}], "formatComplexity": {"triangleCount": 18852}, "formatType": "GLTF1", "role": "POLYGONE_GLTF_FORMAT", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": true}, {"root": {"relativePath": "model.gltf", "contentType": "model/gltf+json", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1613589265798709/0GEmm5SkdhR/dSgVvbLh5zc/model.gltf"}, "resources": [{"relativePath": "model.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1613589265798709/0GEmm5SkdhR/dSgVvbLh5zc/model.bin"}], "formatComplexity": {"triangleCount": 18852}, "formatType": "GLTF1", "role": "UNKNOWN_GLTF_FORMAT_A", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "model.gltf", "contentType": "model/gltf+json", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1613589265798709/0GEmm5SkdhR/fKjRdkKK0Ph/model.gltf"}, "resources": [{"relativePath": "model.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1613589265798709/0GEmm5SkdhR/fKjRdkKK0Ph/model.bin"}], "formatComplexity": {"triangleCount": 0}, "formatType": "GLTF1", "role": "UNKNOWN_GLTF_FORMAT_B", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "model.glb", "contentType": "model/gltf-binary", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1613589265798709/0GEmm5SkdhR/5nunD8EkCIG/model.glb"}, "resources": [], "formatComplexity": {"triangleCount": 0}, "formatType": "GLB", "role": "UNKNOWN_GLB_FORMAT_B", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}]}, {"authorId": "8P22GWd28Na", "authorName": "Joshua", "name": "assets/bpVSWyGiKAv", "description": "Inspired by Kurosawa films", "createTime": "2018-10-02T16:59:23.400Z", "updateTime": "2018-10-02T16:59:23.400Z", "url": "http://api.icosa.gallery/v1/assets/bpVSWyGiKAv", "assetId": "bpVSWyGiKAv", "displayName": "Ronin", "visibility": "PUBLIC", "tags": ["curated", "people", "tilt"], "isCurated": true, "thumbnail": {"relativePath": "thumbnail.png", "contentType": "image/png", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/bpVSWyGiKAv/thumbnail.png"}, "triangleCount": 44526, "license": "CREATIVE_COMMONS_BY", "licenseVersion": "3.0", "isIcosaGalleryCompatible": true, "presentationParams": {"camera": {"type": "perspective", "rotation": [-0.01018230265629344, -0.1383037032414425, -0.001421991579738807, 0.990336500550326], "perspective": {"yfov": 0, "znear": 0.1}, "translation": [-0.5943136811256421, 1.387442946434021, 0.555174648761749], "GOOGLE_camera_settings": null}, "colorSpace": "GAMMA", "backgroundColor": "#000000", "GOOGLE_hemi_light": null, "orientingRotation": {"w": 1}, "GOOGLE_backgrounds": {"color": [0, 0, 0]}, "GOOGLE_lighting_rig": null, "GOOGLE_geometry_data": null, "GOOGLE_scene_rotation": {"rotation": [0, 0, 0, 1]}, "GOOGLE_lights_image_based": null, "GOOGLE_real_world_transform": {"scaling_factor": 0}, "GOOGLE_initial_camera_motion": null}, "formats": [{"root": {"relativePath": "sketch_(GLTFupdated).gltf", "contentType": "model/gltf+json", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/bpVSWyGiKAv/sketch_(GLTFupdated).gltf"}, "resources": [{"relativePath": "sketch.bin", "contentType": "application/octet-stream", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/bpVSWyGiKAv/sketch.bin"}], "formatComplexity": {"triangleCount": 44526}, "formatType": "GLTF1", "role": "POLYGONE_GLTF_FORMAT", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": true}, {"root": {"relativePath": "sketch.gltf", "contentType": "model/gltf+json", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1605046269729105/bpVSWyGiKAv/6ydGZfC1uWv/sketch.gltf"}, "resources": [{"relativePath": "sketch.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1605046269729105/bpVSWyGiKAv/6ydGZfC1uWv/sketch.bin"}], "formatComplexity": {"triangleCount": 0}, "formatType": "GLTF2", "role": "UPDATED_GLTF_FORMAT", "isPreferredForDownload": true, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "sketch.tilt", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1605046269729105/bpVSWyGiKAv/csFBpY7TFBT/sketch.tilt"}, "resources": [], "formatComplexity": {"triangleCount": 0}, "formatType": "TILT", "role": "TILT_FORMAT", "isPreferredForDownload": true, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "sketch.tilt", "contentType": "application/vnd-tiltbrush", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/bpVSWyGiKAv/sketch.tilt"}, "resources": [], "formatComplexity": {}, "formatType": "TILT", "role": "POLYGONE_TILT_FORMAT", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": true}, {"root": {"relativePath": "sketch.gltf", "contentType": "model/gltf+json", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1605046269729105/bpVSWyGiKAv/bPaFSgo9CIG/sketch.gltf"}, "resources": [{"relativePath": "sketch.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1605046269729105/bpVSWyGiKAv/bPaFSgo9CIG/sketch.bin"}], "formatComplexity": {"triangleCount": 44526}, "formatType": "GLTF1", "role": "UNKNOWN_GLTF_FORMAT_A", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "sketch.gltf", "contentType": "model/gltf+json", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1605046269729105/bpVSWyGiKAv/3S5I3s0wdVD/sketch.gltf"}, "resources": [{"relativePath": "sketch.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1605046269729105/bpVSWyGiKAv/3S5I3s0wdVD/sketch.bin"}], "formatComplexity": {"triangleCount": 0}, "formatType": "GLTF1", "role": "UNKNOWN_GLTF_FORMAT_C", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "sketch.gltf", "contentType": "model/gltf+json", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/bpVSWyGiKAv/sketch.gltf"}, "resources": [{"relativePath": "sketch.bin", "contentType": "application/octet-stream", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/bpVSWyGiKAv/sketch.bin"}], "formatComplexity": {"triangleCount": 44526}, "formatType": "GLTF1", "role": "POLYGONE_GLTF_FORMAT", "isPreferredForDownload": false, "isPreferredForGalleryViewer": true, "isCorsAllowed": true}]}, {"authorId": "7bmlTAiZPhz", "authorName": "felix stief", "name": "assets/0dUMpp1Aa0C", "description": "plane sky fly", "createTime": "2018-02-18T13:15:07.326Z", "updateTime": "2018-02-18T13:15:07.326Z", "url": "http://api.icosa.gallery/v1/assets/0dUMpp1Aa0C", "assetId": "0dUMpp1Aa0C", "displayName": "f18 jet", "visibility": "PUBLIC", "tags": ["curated", "tilt", "transport"], "isCurated": true, "thumbnail": {"relativePath": "thumbnail.png", "contentType": "image/png", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/0dUMpp1Aa0C/thumbnail.png"}, "triangleCount": 19344, "license": "CREATIVE_COMMONS_BY", "licenseVersion": "3.0", "isIcosaGalleryCompatible": true, "presentationParams": {"camera": {"type": "perspective", "rotation": [-0.2389924390645182, -0.4627094500249914, -0.1310917355022967, 0.8435624077746462], "perspective": {"yfov": 0, "znear": 0.1}, "translation": [-0.5260525880955913, 1.285871720991651, -0.08657941687295445], "GOOGLE_camera_settings": null}, "colorSpace": "GAMMA", "backgroundColor": "#000000", "GOOGLE_hemi_light": null, "orientingRotation": {"w": 1}, "GOOGLE_backgrounds": {"color": [0, 0, 0]}, "GOOGLE_lighting_rig": null, "GOOGLE_geometry_data": null, "GOOGLE_scene_rotation": {"rotation": [0, 0, 0, 1]}, "GOOGLE_lights_image_based": null, "GOOGLE_real_world_transform": {"scaling_factor": 1}, "GOOGLE_initial_camera_motion": null}, "formats": [{"root": {"relativePath": "sketch_(GLTFupdated).gltf", "contentType": "model/gltf+json", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/0dUMpp1Aa0C/sketch_(GLTFupdated).gltf"}, "resources": [{"relativePath": "sketch.bin", "contentType": "application/octet-stream", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/0dUMpp1Aa0C/sketch.bin"}], "formatComplexity": {"triangleCount": 19344}, "formatType": "GLTF1", "role": "POLYGONE_GLTF_FORMAT", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": true}, {"root": {"relativePath": "sketch.gltf", "contentType": "model/gltf+json", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1622741042049789/0dUMpp1Aa0C/92IRYmfJSlf/sketch.gltf"}, "resources": [{"relativePath": "sketch.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1622741042049789/0dUMpp1Aa0C/92IRYmfJSlf/sketch.bin"}], "formatComplexity": {"triangleCount": 0}, "formatType": "GLTF2", "role": "UPDATED_GLTF_FORMAT", "isPreferredForDownload": true, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "sketch.tilt", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1622741042049789/0dUMpp1Aa0C/1ucJYY4vv9F/sketch.tilt"}, "resources": [], "formatComplexity": {"triangleCount": 0}, "formatType": "TILT", "role": "TILT_FORMAT", "isPreferredForDownload": true, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "sketch.tilt", "contentType": "application/vnd-tiltbrush", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/0dUMpp1Aa0C/sketch.tilt"}, "resources": [], "formatComplexity": {}, "formatType": "TILT", "role": "POLYGONE_TILT_FORMAT", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": true}, {"root": {"relativePath": "sketch.gltf", "contentType": "model/gltf+json", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/0dUMpp1Aa0C/sketch.gltf"}, "resources": [{"relativePath": "sketch.bin", "contentType": "application/octet-stream", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/0dUMpp1Aa0C/sketch.bin"}], "formatComplexity": {"triangleCount": 19344}, "formatType": "GLTF1", "role": "POLYGONE_GLTF_FORMAT", "isPreferredForDownload": false, "isPreferredForGalleryViewer": true, "isCorsAllowed": true}, {"root": {"relativePath": "sketch.gltf", "contentType": "model/gltf+json", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1622741042049789/0dUMpp1Aa0C/5htP--3Dz3J/sketch.gltf"}, "resources": [{"relativePath": "sketch.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1622741042049789/0dUMpp1Aa0C/5htP--3Dz3J/sketch.bin"}], "formatComplexity": {"triangleCount": 19344}, "formatType": "GLTF1", "role": "UNKNOWN_GLTF_FORMAT_A", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "sketch.gltf", "contentType": "model/gltf+json", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1622741042049789/0dUMpp1Aa0C/fdBBXJuw8f9/sketch.gltf"}, "resources": [{"relativePath": "sketch.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1622741042049789/0dUMpp1Aa0C/fdBBXJuw8f9/sketch.bin"}], "formatComplexity": {"triangleCount": 0}, "formatType": "GLTF1", "role": "UNKNOWN_GLTF_FORMAT_C", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}]}, {"authorId": "dD50HmlquKn", "authorName": "Sferovery Art", "name": "assets/cjykqWH7FPc", "description": "submarine", "createTime": "2020-03-13T02:40:09.629Z", "updateTime": "2020-03-13T02:40:09.629Z", "url": "http://api.icosa.gallery/v1/assets/cjykqWH7FPc", "assetId": "cjykqWH7FPc", "displayName": "submarine", "visibility": "PUBLIC", "tags": ["curated", "tech", "tilt"], "isCurated": true, "thumbnail": {"relativePath": "thumbnail.png", "contentType": "image/png", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/cjykqWH7FPc/thumbnail.png"}, "triangleCount": 235454, "license": "CREATIVE_COMMONS_BY", "licenseVersion": "3.0", "isIcosaGalleryCompatible": true, "presentationParams": {"camera": {"type": "perspective", "rotation": [-0.02221805005359108, 0.9310140711793904, 0.0575007532291365, 0.3597399350862718], "perspective": {"yfov": 0.7853981633974483, "znear": 0.1000000014901161}, "translation": [0.2068478597949655, 1.725428056657535, -1.257008446713089], "GOOGLE_camera_settings": {"pivot": [-0.3678157905954052, 1.619455737587985, -0.6244118098781005]}}, "colorSpace": "GAMMA", "backgroundColor": "#000000", "GOOGLE_hemi_light": null, "orientingRotation": {"w": 1}, "GOOGLE_backgrounds": {"color": [0, 0, 0]}, "GOOGLE_lighting_rig": {"disableShadows": false}, "GOOGLE_geometry_data": {"stats": {"stdev": 0.1418490210385429, "radius": 0.9716727582447213, "centroid": [-0.001009329916543091, 1.685161198643198, -0.9795386815918877]}, "visualCenterPoint": [-0.003000119630519667, 1.693729112079821, -0.9502179277057623]}, "GOOGLE_scene_rotation": null, "GOOGLE_lights_image_based": null, "GOOGLE_real_world_transform": null, "GOOGLE_initial_camera_motion": {"motionPath": "FULL_ROTATION"}}, "formats": [{"root": {"relativePath": "sketch_(GLTFupdated).gltf", "contentType": "model/gltf+json", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/cjykqWH7FPc/sketch_(GLTFupdated).gltf"}, "resources": [{"relativePath": "sketch.bin", "contentType": "application/octet-stream", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/cjykqWH7FPc/sketch.bin"}], "formatComplexity": {"triangleCount": 235454}, "formatType": "GLTF1", "role": "POLYGONE_GLTF_FORMAT", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": true}, {"root": {"relativePath": "sketch.gltf", "contentType": "model/gltf+json", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1621015490533414/cjykqWH7FPc/8IosV6O85VE/sketch.gltf"}, "resources": [{"relativePath": "sketch.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1621015490533414/cjykqWH7FPc/8IosV6O85VE/sketch.bin"}], "formatComplexity": {"triangleCount": 0}, "formatType": "GLTF2", "role": "UPDATED_GLTF_FORMAT", "isPreferredForDownload": true, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "sketch.tilt", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1621015490533414/cjykqWH7FPc/eToUiIV9yXU/sketch.tilt"}, "resources": [], "formatComplexity": {"triangleCount": 0}, "formatType": "TILT", "role": "TILT_FORMAT", "isPreferredForDownload": true, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "sketch.tilt", "contentType": "application/vnd-tiltbrush", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/cjykqWH7FPc/sketch.tilt"}, "resources": [], "formatComplexity": {}, "formatType": "TILT", "role": "POLYGONE_TILT_FORMAT", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": true}, {"root": {"relativePath": "sketch.glb", "contentType": "model/gltf-binary", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1621015490533414/cjykqWH7FPc/6pEp2jyDo8v/sketch.glb"}, "resources": [], "formatComplexity": {"triangleCount": 0}, "formatType": "GLB", "role": "UNKNOWN_GLB_FORMAT_B", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "sketch.gltf", "contentType": "model/gltf+json", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1621015490533414/cjykqWH7FPc/eYyl6cJ9wJD/sketch.gltf"}, "resources": [{"relativePath": "sketch.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1621015490533414/cjykqWH7FPc/eYyl6cJ9wJD/sketch.bin"}], "formatComplexity": {"triangleCount": 235454}, "formatType": "GLTF1", "role": "UNKNOWN_GLTF_FORMAT_A", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "sketch.gltf", "contentType": "model/gltf+json", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1621015490533414/cjykqWH7FPc/cJ67-iZ5AY_/sketch.gltf"}, "resources": [{"relativePath": "sketch.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1621015490533414/cjykqWH7FPc/cJ67-iZ5AY_/sketch.bin"}], "formatComplexity": {"triangleCount": 0}, "formatType": "GLTF1", "role": "UNKNOWN_GLTF_FORMAT_C", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "sketch.gltf", "contentType": "model/gltf+json", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/cjykqWH7FPc/sketch.gltf"}, "resources": [{"relativePath": "sketch.bin", "contentType": "application/octet-stream", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/cjykqWH7FPc/sketch.bin"}], "formatComplexity": {"triangleCount": 235454}, "formatType": "GLTF1", "role": "POLYGONE_GLTF_FORMAT", "isPreferredForDownload": false, "isPreferredForGalleryViewer": true, "isCorsAllowed": true}]}, {"authorId": "a0J-I9_aKgH", "authorName": "Oliver \u201cPaperpyro\u201d Kretschmer", "name": "assets/2RMJ4BtZSum", "description": "\"I will guide them beyond the brink of infinity.\"", "createTime": "2020-03-30T15:26:39.778Z", "updateTime": "2020-03-30T15:26:39.778Z", "url": "http://api.icosa.gallery/v1/assets/2RMJ4BtZSum", "assetId": "2RMJ4BtZSum", "displayName": "Dark Star Thresh Splash art", "visibility": "PUBLIC", "tags": ["curated", "scenes", "tilt"], "isCurated": true, "thumbnail": {"relativePath": "thumbnail.png", "contentType": "image/png", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/2RMJ4BtZSum/thumbnail.png"}, "triangleCount": 258704, "license": "CREATIVE_COMMONS_BY", "licenseVersion": "3.0", "isIcosaGalleryCompatible": true, "presentationParams": {"camera": {"type": "perspective", "rotation": [0.03725810993557312, 0.2120234045758189, -0.008089528651716917, 0.976520593066168], "perspective": {"yfov": 0.7853981633974483, "znear": 0.1000000014901161}, "translation": [0.9654972634613566, 1.005561542793941, 3.89163092583465], "GOOGLE_camera_settings": {"pivot": [-1.097806062458537, 1.385784383343212, -0.6358750075433021]}}, "colorSpace": "GAMMA", "backgroundColor": "#000000", "GOOGLE_hemi_light": null, "orientingRotation": {"w": 1}, "GOOGLE_backgrounds": {"color": [0, 0, 0]}, "GOOGLE_lighting_rig": {"disableShadows": false}, "GOOGLE_geometry_data": {"stats": {"stdev": 1.91087365132215, "radius": 8.439734510445444, "centroid": [-1.361882932031403, 1.899329812194989, -1.316738528340381]}, "visualCenterPoint": [-1.03622301470117, 0.6481188402760666, -0.7683241938779414]}, "GOOGLE_scene_rotation": null, "GOOGLE_lights_image_based": null, "GOOGLE_real_world_transform": null, "GOOGLE_initial_camera_motion": {"motionPath": "FULL_ROTATION"}}, "formats": [{"root": {"relativePath": "sketch_(GLTFupdated).gltf", "contentType": "model/gltf+json", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/2RMJ4BtZSum/sketch_(GLTFupdated).gltf"}, "resources": [{"relativePath": "sketch.bin", "contentType": "application/octet-stream", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/2RMJ4BtZSum/sketch.bin"}], "formatComplexity": {"triangleCount": 258704}, "formatType": "GLTF1", "role": "POLYGONE_GLTF_FORMAT", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": true}, {"root": {"relativePath": "sketch.gltf", "contentType": "model/gltf+json", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1620410158829561/2RMJ4BtZSum/fQ6jeBLN5uG/sketch.gltf"}, "resources": [{"relativePath": "sketch.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1620410158829561/2RMJ4BtZSum/fQ6jeBLN5uG/sketch.bin"}], "formatComplexity": {"triangleCount": 0}, "formatType": "GLTF2", "role": "UPDATED_GLTF_FORMAT", "isPreferredForDownload": true, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "sketch.tilt", "contentType": "application/vnd-tiltbrush", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/2RMJ4BtZSum/sketch.tilt"}, "resources": [], "formatComplexity": {}, "formatType": "TILT", "role": "POLYGONE_TILT_FORMAT", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": true}, {"root": {"relativePath": "sketch.gltf", "contentType": "model/gltf+json", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/2RMJ4BtZSum/sketch.gltf"}, "resources": [{"relativePath": "sketch.bin", "contentType": "application/octet-stream", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/2RMJ4BtZSum/sketch.bin"}], "formatComplexity": {"triangleCount": 258704}, "formatType": "GLTF1", "role": "POLYGONE_GLTF_FORMAT", "isPreferredForDownload": false, "isPreferredForGalleryViewer": true, "isCorsAllowed": true}, {"root": {"relativePath": "sketch.tilt", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1620410158829561/2RMJ4BtZSum/9z0OG8LON3J/sketch.tilt"}, "resources": [], "formatComplexity": {"triangleCount": 0}, "formatType": "TILT", "role": "TILT_FORMAT", "isPreferredForDownload": true, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "sketch.gltf", "contentType": "model/gltf+json", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1620410158829561/2RMJ4BtZSum/8h7VG7xrxDO/sketch.gltf"}, "resources": [{"relativePath": "sketch.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1620410158829561/2RMJ4BtZSum/8h7VG7xrxDO/sketch.bin"}], "formatComplexity": {"triangleCount": 258704}, "formatType": "GLTF1", "role": "UNKNOWN_GLTF_FORMAT_A", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "sketch.gltf", "contentType": "model/gltf+json", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1620410158829561/2RMJ4BtZSum/7VwFFuHkdms/sketch.gltf"}, "resources": [{"relativePath": "sketch.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1620410158829561/2RMJ4BtZSum/7VwFFuHkdms/sketch.bin"}], "formatComplexity": {"triangleCount": 0}, "formatType": "GLTF1", "role": "UNKNOWN_GLTF_FORMAT_C", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "sketch.glb", "contentType": "model/gltf-binary", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1620410158829561/2RMJ4BtZSum/fTNpu8Sl45s/sketch.glb"}, "resources": [], "formatComplexity": {"triangleCount": 0}, "formatType": "GLB", "role": "UNKNOWN_GLB_FORMAT_B", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}]}, {"authorId": "1wwbLoYs4U4", "authorName": "Pepper Media", "name": "assets/cQFoSfuK7Tf", "description": "My first play around in Blocks! <3", "createTime": "2018-03-19T16:13:52.747Z", "updateTime": "2018-03-19T16:13:52.747Z", "url": "http://api.icosa.gallery/v1/assets/cQFoSfuK7Tf", "assetId": "cQFoSfuK7Tf", "displayName": "Mechsuit", "visibility": "PUBLIC", "tags": ["animals", "blocks", "curated"], "isCurated": true, "thumbnail": {"relativePath": "thumbnail.png", "contentType": "image/png", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/cQFoSfuK7Tf/thumbnail.png"}, "triangleCount": 30797, "license": "CREATIVE_COMMONS_BY", "licenseVersion": "3.0", "isIcosaGalleryCompatible": true, "presentationParams": {"camera": {"type": "perspective", "rotation": [-0.01434221550160069, 0.05002548670144498, 0.0007184500266958875, 0.9986446992621292], "perspective": {"yfov": 0.7853981633974483, "znear": 0.1000000014901161}, "translation": [-1.004448491180467, 2.290200952888793, 0.9770049702236825], "GOOGLE_camera_settings": {"pivot": [0, 0, 0]}}, "colorSpace": "LINEAR", "backgroundColor": "#2196f3", "GOOGLE_hemi_light": {"groundColor": [0.1294117647058824, 0.5882352941176471, 0.9529411764705882]}, "orientingRotation": {"w": 1}, "GOOGLE_backgrounds": {"color": [0.1294117647058824, 0.5882352941176471, 0.9529411764705882]}, "GOOGLE_lighting_rig": {"disableShadows": false}, "GOOGLE_geometry_data": {"stats": {"stdev": 0.3478780634622591, "radius": 0.7736955506697863, "centroid": [-1.148130856098027, 2.251624247337253, -1.023323937194805]}, "visualCenterPoint": [-1.193172414899098, 2.235776853603556, -0.9038653248898595]}, "GOOGLE_scene_rotation": null, "GOOGLE_lights_image_based": null, "GOOGLE_real_world_transform": null, "GOOGLE_initial_camera_motion": {"motionPath": "FULL_ROTATION"}}, "formats": [{"root": {"relativePath": "model_(GLTFupdated).gltf", "contentType": "model/gltf+json", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/cQFoSfuK7Tf/model_(GLTFupdated).gltf"}, "resources": [{"relativePath": "model.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1623013726730152/cQFoSfuK7Tf/9av0SyaHLnA/model.bin"}], "formatComplexity": {"triangleCount": 0}, "formatType": "GLTF2", "zip_archive_url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1623013726730152/cQFoSfuK7Tf/9av0SyaHLnA/archive.zip", "role": "UPDATED_GLTF_FORMAT", "isPreferredForDownload": false, "isPreferredForGalleryViewer": true, "isCorsAllowed": false}, {"root": {"relativePath": "model.gltf", "contentType": "model/gltf+json", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1623013726730152/cQFoSfuK7Tf/bedVlaRbLSl/model.gltf"}, "resources": [{"relativePath": "model.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1623013726730152/cQFoSfuK7Tf/bedVlaRbLSl/model.bin"}], "formatComplexity": {"triangleCount": 30797}, "formatType": "GLTF1", "zip_archive_url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1623013726730152/cQFoSfuK7Tf/bedVlaRbLSl/model_gltf_cQFoSfuK7Tf_bedVlaRbLSl.zip", "role": "ORIGINAL_GLTF_FORMAT", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "model.usdz", "contentType": "", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1623013726730152/cQFoSfuK7Tf/cXLiHVAsIrJ/model.usdz"}, "resources": [], "formatComplexity": {"triangleCount": 0}, "formatType": "USDZ", "role": "USDZ_FORMAT", "isPreferredForDownload": true, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "model.blocks", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1623013726730152/cQFoSfuK7Tf/2XniAnlWTgp/model.blocks"}, "resources": [], "formatComplexity": {"triangleCount": 0}, "formatType": "BLOCKS", "role": "BLOCKS_FORMAT", "isPreferredForDownload": true, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "model.fbx", "contentType": "application/octet-stream", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/cQFoSfuK7Tf/model.fbx"}, "resources": [], "formatComplexity": {}, "formatType": "FBX", "role": "POLYGONE_FBX_FORMAT", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": true}, {"root": {"relativePath": "model.gltf", "contentType": "model/gltf+json", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/cQFoSfuK7Tf/model.gltf"}, "resources": [{"relativePath": "model.bin", "contentType": "application/octet-stream", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/cQFoSfuK7Tf/model.bin"}], "formatComplexity": {"triangleCount": 30797}, "formatType": "GLTF1", "role": "POLYGONE_GLTF_FORMAT", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": true}, {"root": {"relativePath": "model.fbx", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1623013726730152/cQFoSfuK7Tf/9Qzod5YIysf/model.fbx"}, "resources": [], "formatComplexity": {"triangleCount": 0}, "formatType": "FBX", "role": "ORIGINAL_FBX_FORMAT", "isPreferredForDownload": true, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "model-triangulated.obj", "contentType": "text/plain", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1623013726730152/cQFoSfuK7Tf/2HZNyRc5nu6/model-triangulated.obj"}, "resources": [{"relativePath": "materials.mtl", "contentType": "text/plain", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1623013726730152/cQFoSfuK7Tf/2HZNyRc5nu6/materials.mtl"}], "formatComplexity": {"triangleCount": 30797}, "formatType": "OBJ", "zip_archive_url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1623013726730152/cQFoSfuK7Tf/2HZNyRc5nu6/model-triangulated_obj_cQFoSfuK7Tf_2HZNyRc5nu6.zip", "role": "ORIGINAL_TRIANGULATED_OBJ_FORMAT", "isPreferredForDownload": true, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "model.gltf", "contentType": "model/gltf+json", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1623013726730152/cQFoSfuK7Tf/6BGJzGsS3Bt/model.gltf"}, "resources": [{"relativePath": "model.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1623013726730152/cQFoSfuK7Tf/6BGJzGsS3Bt/model.bin"}], "formatComplexity": {"triangleCount": 0}, "formatType": "GLTF1", "role": "UNKNOWN_GLTF_FORMAT_B", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "model.gltf", "contentType": "model/gltf+json", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1623013726730152/cQFoSfuK7Tf/as5QRhBPOZR/model.gltf"}, "resources": [{"relativePath": "model.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1623013726730152/cQFoSfuK7Tf/as5QRhBPOZR/model.bin"}], "formatComplexity": {"triangleCount": 30797}, "formatType": "GLTF1", "role": "UNKNOWN_GLTF_FORMAT_A", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "model.glb", "contentType": "model/gltf-binary", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1623013726730152/cQFoSfuK7Tf/2g5BSA9eiDq/model.glb"}, "resources": [], "formatComplexity": {"triangleCount": 0}, "formatType": "GLB", "role": "UNKNOWN_GLB_FORMAT_B", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}]}, {"authorId": "0tIzfdtDCW1", "authorName": "Paul Laulhe", "name": "assets/c3Ibh9I3udk", "description": "", "createTime": "2017-11-02T01:02:25.426Z", "updateTime": "2017-11-02T01:02:25.426Z", "url": "http://api.icosa.gallery/v1/assets/c3Ibh9I3udk", "assetId": "c3Ibh9I3udk", "displayName": "Animated Human", "visibility": "PUBLIC", "tags": ["curated", "people"], "isCurated": true, "thumbnail": {"relativePath": "thumbnail.png", "contentType": "image/png", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/c3Ibh9I3udk/thumbnail.png"}, "triangleCount": 1578, "license": "CREATIVE_COMMONS_BY", "licenseVersion": "3.0", "isIcosaGalleryCompatible": true, "presentationParams": {"camera": {"type": "perspective", "rotation": [-0.1348008153864803, -0.06221510493699248, -0.008480944514471756, 0.9888812337530538], "perspective": {"yfov": 0.7853981633974483, "znear": 0.1000000014901161}, "translation": [-1.208240262326131, 5.214685556562332, 9.284832053458729], "GOOGLE_camera_settings": {}}, "colorSpace": "LINEAR", "backgroundColor": "#424242", "GOOGLE_hemi_light": {"groundColor": [0.2588235294117647, 0.2588235294117647, 0.2588235294117647]}, "orientingRotation": {"w": 1}, "GOOGLE_backgrounds": {"color": [0.2588235294117647, 0.2588235294117647, 0.2588235294117647]}, "GOOGLE_lighting_rig": {"disableShadows": false}, "GOOGLE_geometry_data": {"stats": {"stdev": 1.977994734807182, "radius": 3.711165197924362, "centroid": [-0.1357705567585319, 3.122913607005929, 0.3177057212363043]}, "visualCenterPoint": [-0.05495515169615663, 2.658466823666111, 0.1550265531913133]}, "GOOGLE_scene_rotation": null, "GOOGLE_lights_image_based": null, "GOOGLE_real_world_transform": null, "GOOGLE_initial_camera_motion": {"motionPath": "FULL_ROTATION"}}, "formats": [{"root": {"relativePath": "Animated%20Human.gltf", "contentType": "model/gltf+json", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1621783855977594/c3Ibh9I3udk/daeu41t5Nqv/Animated%20Human.gltf"}, "resources": [{"relativePath": "Animated%20Human.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1621783855977594/c3Ibh9I3udk/daeu41t5Nqv/Animated%20Human.bin"}], "formatComplexity": {"triangleCount": 0}, "formatType": "GLTF2", "zip_archive_url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1621783855977594/c3Ibh9I3udk/daeu41t5Nqv/archive.zip", "role": "UPDATED_GLTF_FORMAT", "isPreferredForDownload": true, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "Animated%20Human.usdz", "contentType": "", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1621783855977594/c3Ibh9I3udk/9KkGtJpLxQy/Animated%20Human.usdz"}, "resources": [], "formatComplexity": {"triangleCount": 0}, "formatType": "USDZ", "role": "USDZ_FORMAT", "isPreferredForDownload": true, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "Animated Human.gltf", "contentType": "model/gltf+json", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/c3Ibh9I3udk/Animated Human.gltf"}, "resources": [{"relativePath": "Animated Human.bin", "contentType": "application/octet-stream", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/c3Ibh9I3udk/Animated Human.bin"}], "formatComplexity": {"triangleCount": 1578}, "formatType": "GLTF2", "role": "POLYGONE_GLTF_FORMAT", "isPreferredForDownload": false, "isPreferredForGalleryViewer": true, "isCorsAllowed": true}, {"root": {"relativePath": "Animated%20Human.gltf", "contentType": "model/gltf+json", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1621783855977594/c3Ibh9I3udk/1GcFHBfYpLK/Animated%20Human.gltf"}, "resources": [{"relativePath": "Animated%20Human.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1621783855977594/c3Ibh9I3udk/1GcFHBfYpLK/Animated%20Human.bin"}], "formatComplexity": {"triangleCount": 0}, "formatType": "GLTF1", "role": "UNKNOWN_GLTF_FORMAT_B", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "Animated%20Human.gltf", "contentType": "model/gltf+json", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1621783855977594/c3Ibh9I3udk/8ccAyhoYChf/Animated%20Human.gltf"}, "resources": [{"relativePath": "Animated%20Human.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1621783855977594/c3Ibh9I3udk/8ccAyhoYChf/Animated%20Human.bin"}], "formatComplexity": {"triangleCount": 1578}, "formatType": "GLTF1", "zip_archive_url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1621783855977594/c3Ibh9I3udk/8ccAyhoYChf/archive.zip", "role": "ORIGINAL_GLTF_FORMAT", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "Animated%20Human.glb", "contentType": "model/gltf-binary", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1621783855977594/c3Ibh9I3udk/6zG_cINP8v-/Animated%20Human.glb"}, "resources": [], "formatComplexity": {"triangleCount": 0}, "formatType": "GLB", "role": "UNKNOWN_GLB_FORMAT_B", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}]}, {"authorId": "foNCuGl5HUf", "authorName": "Nexus Arc", "name": "assets/49EkB1H2VPf", "description": "", "createTime": "2020-01-15T05:31:18.308Z", "updateTime": "2020-01-15T05:31:18.308Z", "url": "http://api.icosa.gallery/v1/assets/49EkB1H2VPf", "assetId": "49EkB1H2VPf", "displayName": "Venom Slightly adjusted eyes.", "visibility": "PUBLIC", "tags": ["tilt"], "isCurated": false, "thumbnail": {"relativePath": "thumbnail.png", "contentType": "image/png", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/49EkB1H2VPf/thumbnail.png"}, "triangleCount": 103928, "license": "CREATIVE_COMMONS_BY", "licenseVersion": "3.0", "isIcosaGalleryCompatible": true, "presentationParams": {"camera": {"type": "perspective", "rotation": [-0.1298833977518889, 0.03325427271837479, 0.004358571194451673, 0.9909618858420033], "perspective": {"yfov": 0.7853981633974483, "znear": 0.1000000014901161}, "translation": [-0.01811765675442964, 1.467090398525397, 1.367407588888911], "GOOGLE_camera_settings": {"pivot": [-0.0994030311703682, 1.143695712089539, 0.1576382517814636]}}, "colorSpace": "GAMMA", "backgroundColor": "#000000", "GOOGLE_hemi_light": null, "orientingRotation": {"w": 1}, "GOOGLE_backgrounds": {"color": [0, 0, 0]}, "GOOGLE_lighting_rig": {"disableShadows": false}, "GOOGLE_geometry_data": {"stats": {"stdev": 0.5195530459370995, "radius": 1.244078022076019, "centroid": [-0.008497137887414555, 0.9863303216814606, -0.06630803235417368]}, "visualCenterPoint": [0.0006867182993315867, 0.9204410111835738, -0.08059573943860318]}, "GOOGLE_scene_rotation": null, "GOOGLE_lights_image_based": null, "GOOGLE_real_world_transform": null, "GOOGLE_initial_camera_motion": {"motionPath": "FULL_ROTATION"}}, "formats": [{"root": {"relativePath": "sketch_(GLTFupdated).gltf", "contentType": "model/gltf+json", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/49EkB1H2VPf/sketch_(GLTFupdated).gltf"}, "resources": [{"relativePath": "sketch.bin", "contentType": "application/octet-stream", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/49EkB1H2VPf/sketch.bin"}], "formatComplexity": {"triangleCount": 103928}, "formatType": "GLTF1", "role": "POLYGONE_GLTF_FORMAT", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": true}, {"root": {"relativePath": "sketch.gltf", "contentType": "model/gltf+json", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1606413526430476/49EkB1H2VPf/0JbWPV_50n7/sketch.gltf"}, "resources": [{"relativePath": "sketch.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1606413526430476/49EkB1H2VPf/0JbWPV_50n7/sketch.bin"}], "formatComplexity": {"triangleCount": 0}, "formatType": "GLTF2", "role": "UPDATED_GLTF_FORMAT", "isPreferredForDownload": true, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "sketch.tilt", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1606413526430476/49EkB1H2VPf/4TbFLx4JDvt/sketch.tilt"}, "resources": [], "formatComplexity": {"triangleCount": 0}, "formatType": "TILT", "role": "TILT_FORMAT", "isPreferredForDownload": true, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "sketch.tilt", "contentType": "application/vnd-tiltbrush", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/49EkB1H2VPf/sketch.tilt"}, "resources": [], "formatComplexity": {}, "formatType": "TILT", "role": "POLYGONE_TILT_FORMAT", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": true}, {"root": {"relativePath": "sketch.glb", "contentType": "model/gltf-binary", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1606413526430476/49EkB1H2VPf/4poZYluW3Bh/sketch.glb"}, "resources": [], "formatComplexity": {"triangleCount": 0}, "formatType": "GLB", "role": "UNKNOWN_GLB_FORMAT_B", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "sketch.gltf", "contentType": "model/gltf+json", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1606413526430476/49EkB1H2VPf/9eauIVqRony/sketch.gltf"}, "resources": [{"relativePath": "sketch.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1606413526430476/49EkB1H2VPf/9eauIVqRony/sketch.bin"}], "formatComplexity": {"triangleCount": 0}, "formatType": "GLTF1", "role": "UNKNOWN_GLTF_FORMAT_C", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "sketch.gltf", "contentType": "model/gltf+json", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1606413526430476/49EkB1H2VPf/7Tn2-KPTCxQ/sketch.gltf"}, "resources": [{"relativePath": "sketch.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1606413526430476/49EkB1H2VPf/7Tn2-KPTCxQ/sketch.bin"}], "formatComplexity": {"triangleCount": 103928}, "formatType": "GLTF1", "role": "UNKNOWN_GLTF_FORMAT_A", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "sketch.gltf", "contentType": "model/gltf+json", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/49EkB1H2VPf/sketch.gltf"}, "resources": [{"relativePath": "sketch.bin", "contentType": "application/octet-stream", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/49EkB1H2VPf/sketch.bin"}], "formatComplexity": {"triangleCount": 103928}, "formatType": "GLTF1", "role": "POLYGONE_GLTF_FORMAT", "isPreferredForDownload": false, "isPreferredForGalleryViewer": true, "isCorsAllowed": true}]}, {"authorId": "fqKcjIxoEXW", "authorName": "Vas Pupin", "name": "assets/c2RH5lX5hWL", "description": "", "createTime": "2018-02-17T12:24:15.711Z", "updateTime": "2018-02-17T12:24:15.711Z", "url": "http://api.icosa.gallery/v1/assets/c2RH5lX5hWL", "assetId": "c2RH5lX5hWL", "displayName": "Mechanic arm", "visibility": "PUBLIC", "tags": ["tech"], "isCurated": false, "thumbnail": {"relativePath": "thumbnail.png", "contentType": "image/png", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/c2RH5lX5hWL/thumbnail.png"}, "triangleCount": 104213, "license": "CREATIVE_COMMONS_BY", "licenseVersion": "3.0", "isIcosaGalleryCompatible": true, "presentationParams": {"camera": {"type": "perspective", "rotation": [0.05080476357288963, 0.8757192278624565, 0.09451094348021502, -0.4707466319717704], "perspective": {"yfov": 0.7853981633974483, "znear": 0.1000000014901161}, "translation": [-4.248891266668171, 4.059495781292449, -3.64919194630886], "GOOGLE_camera_settings": {"pivot": [0, 0, 0]}}, "colorSpace": "LINEAR", "backgroundColor": "#eeeeee", "GOOGLE_hemi_light": {"groundColor": [0.9333333333333333, 0.9333333333333333, 0.9333333333333333]}, "orientingRotation": {"w": 1}, "GOOGLE_backgrounds": {"color": [0.9333333333333333, 0.9333333333333333, 0.9333333333333333]}, "GOOGLE_lighting_rig": {"disableShadows": false}, "GOOGLE_geometry_data": {"stats": {"stdev": 1.015694867389827, "radius": 2.746079935882227, "centroid": [-1.653058848530308, 3.603640125233263, -1.163064652627007]}, "visualCenterPoint": [-0.9661055357007838, 2.788782571775241, -1.164389502067879]}, "GOOGLE_scene_rotation": null, "GOOGLE_lights_image_based": null, "GOOGLE_real_world_transform": null, "GOOGLE_initial_camera_motion": {"motionPath": "FULL_ROTATION"}}, "formats": [{"root": {"relativePath": "model_(GLTFupdated).gltf", "contentType": "model/gltf+json", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/c2RH5lX5hWL/model_(GLTFupdated).gltf"}, "resources": [{"relativePath": "model.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1601979871214920/c2RH5lX5hWL/ezO7izMaI90/model.bin"}], "formatComplexity": {"triangleCount": 0}, "formatType": "GLTF2", "zip_archive_url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1601979871214920/c2RH5lX5hWL/ezO7izMaI90/archive.zip", "role": "UPDATED_GLTF_FORMAT", "isPreferredForDownload": false, "isPreferredForGalleryViewer": true, "isCorsAllowed": false}, {"root": {"relativePath": "model-triangulated.obj", "contentType": "text/plain", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1601979871214920/c2RH5lX5hWL/6jOPs8Y6xB1/model-triangulated.obj"}, "resources": [{"relativePath": "materials.mtl", "contentType": "text/plain", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1601979871214920/c2RH5lX5hWL/6jOPs8Y6xB1/materials.mtl"}], "formatComplexity": {"triangleCount": 104213}, "formatType": "OBJ", "zip_archive_url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1601979871214920/c2RH5lX5hWL/6jOPs8Y6xB1/model-triangulated_obj_c2RH5lX5hWL_6jOPs8Y6xB1.zip", "role": "ORIGINAL_TRIANGULATED_OBJ_FORMAT", "isPreferredForDownload": true, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "model.usdz", "contentType": "", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1601979871214920/c2RH5lX5hWL/2tUNMVAj8cw/model.usdz"}, "resources": [], "formatComplexity": {"triangleCount": 0}, "formatType": "USDZ", "role": "USDZ_FORMAT", "isPreferredForDownload": true, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "model.fbx", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1601979871214920/c2RH5lX5hWL/4Errfb7iFNr/model.fbx"}, "resources": [], "formatComplexity": {"triangleCount": 0}, "formatType": "FBX", "role": "ORIGINAL_FBX_FORMAT", "isPreferredForDownload": true, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "model.blocks", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1601979871214920/c2RH5lX5hWL/dNCjAek1r-z/model.blocks"}, "resources": [], "formatComplexity": {"triangleCount": 0}, "formatType": "BLOCKS", "role": "BLOCKS_FORMAT", "isPreferredForDownload": true, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "model.fbx", "contentType": "application/octet-stream", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/c2RH5lX5hWL/model.fbx"}, "resources": [], "formatComplexity": {}, "formatType": "FBX", "role": "POLYGONE_FBX_FORMAT", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": true}, {"root": {"relativePath": "model.gltf", "contentType": "model/gltf+json", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/c2RH5lX5hWL/model.gltf"}, "resources": [{"relativePath": "model.bin", "contentType": "application/octet-stream", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/c2RH5lX5hWL/model.bin"}], "formatComplexity": {"triangleCount": 104213}, "formatType": "GLTF1", "role": "POLYGONE_GLTF_FORMAT", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": true}, {"root": {"relativePath": "model.gltf", "contentType": "model/gltf+json", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1601979871214920/c2RH5lX5hWL/1oR1jH79_HA/model.gltf"}, "resources": [{"relativePath": "model.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1601979871214920/c2RH5lX5hWL/1oR1jH79_HA/model.bin"}], "formatComplexity": {"triangleCount": 104213}, "formatType": "GLTF1", "role": "UNKNOWN_GLTF_FORMAT_A", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "model.gltf", "contentType": "model/gltf+json", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1601979871214920/c2RH5lX5hWL/eOpwLVb2UuB/model.gltf"}, "resources": [{"relativePath": "model.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1601979871214920/c2RH5lX5hWL/eOpwLVb2UuB/model.bin"}], "formatComplexity": {"triangleCount": 104213}, "formatType": "GLTF1", "zip_archive_url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1601979871214920/c2RH5lX5hWL/eOpwLVb2UuB/model_gltf_c2RH5lX5hWL_eOpwLVb2UuB.zip", "role": "ORIGINAL_GLTF_FORMAT", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "model.glb", "contentType": "model/gltf-binary", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1601979871214920/c2RH5lX5hWL/bwsMG3CXLg6/model.glb"}, "resources": [], "formatComplexity": {"triangleCount": 0}, "formatType": "GLB", "role": "UNKNOWN_GLB_FORMAT_B", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}]}, {"authorId": "b8QoyjR2-kF", "authorName": "Marr Chal", "name": "assets/6IL8FMcduiE", "description": "Model : 3dsMax \nPolygon : ~ 4310 Polygon \nTexture : Handpaint Photoshop CS Texture Size : 1x512x512 pixel 72 dpi", "createTime": "2017-11-03T08:04:45.076Z", "updateTime": "2017-11-03T08:04:45.076Z", "url": "http://api.icosa.gallery/v1/assets/6IL8FMcduiE", "assetId": "6IL8FMcduiE", "displayName": "Minotour_Test001", "visibility": "PUBLIC", "tags": ["animals", "curated"], "isCurated": true, "thumbnail": {"relativePath": "thumbnail.png", "contentType": "image/png", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/6IL8FMcduiE/thumbnail.png"}, "triangleCount": 4302, "license": "CREATIVE_COMMONS_BY", "licenseVersion": "3.0", "isIcosaGalleryCompatible": true, "presentationParams": {"camera": {"type": "perspective", "rotation": [-0.1005683711463377, 0.3208194048428457, 0.03428133388665343, 0.9411618895536551], "perspective": {"yfov": 0.7853981633974483, "znear": 0.1000000014901161}, "translation": [6530.353441161131, 4513.647249097087, 4273.315500061639], "GOOGLE_camera_settings": {}}, "colorSpace": "LINEAR", "backgroundColor": "#000000", "GOOGLE_hemi_light": {"groundColor": [0, 0, 0]}, "orientingRotation": {"w": 1}, "GOOGLE_backgrounds": {"color": [0, 0, 0]}, "GOOGLE_lighting_rig": {"disableShadows": false}, "GOOGLE_geometry_data": {"stats": {"stdev": 1629.428961066183, "radius": 3614.585711154086, "centroid": [1824.557689785782, 2976.206966353107, -1671.846443807946]}, "visualCenterPoint": [1833.208174267455, 2852.120505219514, -1815.513959274061]}, "GOOGLE_scene_rotation": null, "GOOGLE_lights_image_based": null, "GOOGLE_real_world_transform": null, "GOOGLE_initial_camera_motion": {"motionPath": "FULL_ROTATION"}}, "formats": [{"root": {"relativePath": "minotour001.gltf", "contentType": "model/gltf+json", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1622978346931828/6IL8FMcduiE/demJDYn0OZC/minotour001.gltf"}, "resources": [{"relativePath": "minotour001.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1622978346931828/6IL8FMcduiE/demJDYn0OZC/minotour001.bin"}, {"relativePath": "mino01.jpg", "contentType": "image/jpeg", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1622978346931828/6IL8FMcduiE/demJDYn0OZC/mino01.jpg"}], "formatComplexity": {"triangleCount": 0}, "formatType": "GLTF2", "zip_archive_url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1622978346931828/6IL8FMcduiE/demJDYn0OZC/archive.zip", "role": "UPDATED_GLTF_FORMAT", "isPreferredForDownload": true, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "minotour001.usdz", "contentType": "", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1622978346931828/6IL8FMcduiE/01XKCKO-dk7/minotour001.usdz"}, "resources": [], "formatComplexity": {"triangleCount": 0}, "formatType": "USDZ", "role": "USDZ_FORMAT", "isPreferredForDownload": true, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "minotour001.gltf", "contentType": "model/gltf+json", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/6IL8FMcduiE/minotour001.gltf"}, "resources": [{"relativePath": "minotour001.bin", "contentType": "application/octet-stream", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/6IL8FMcduiE/minotour001.bin"}, {"relativePath": "mino01.jpg", "contentType": "image/jpeg", "url": "https://s3.us-east-005.backblazeb2.com/icosa-gallery/poly/6IL8FMcduiE/mino01.jpg"}], "formatComplexity": {"triangleCount": 4302}, "formatType": "GLTF2", "role": "POLYGONE_GLTF_FORMAT", "isPreferredForDownload": false, "isPreferredForGalleryViewer": true, "isCorsAllowed": true}, {"root": {"relativePath": "minotour001.gltf", "contentType": "model/gltf+json", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1622978346931828/6IL8FMcduiE/4Z9EvMF9mIM/minotour001.gltf"}, "resources": [{"relativePath": "minotour001.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1622978346931828/6IL8FMcduiE/4Z9EvMF9mIM/minotour001.bin"}, {"relativePath": "mino01.jpg", "contentType": "image/jpeg", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1622978346931828/6IL8FMcduiE/4Z9EvMF9mIM/mino01.jpg"}], "formatComplexity": {"triangleCount": 0}, "formatType": "GLTF1", "role": "UNKNOWN_GLTF_FORMAT_B", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "minotour001.gltf", "contentType": "model/gltf+json", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1622978346931828/6IL8FMcduiE/68dUahQGzBF/minotour001.gltf"}, "resources": [{"relativePath": "minotour001.bin", "contentType": "application/octet-stream", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1622978346931828/6IL8FMcduiE/68dUahQGzBF/minotour001.bin"}, {"relativePath": "mino01.jpg", "contentType": "image/jpeg", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1622978346931828/6IL8FMcduiE/68dUahQGzBF/mino01.jpg"}], "formatComplexity": {"triangleCount": 4302}, "formatType": "GLTF1", "zip_archive_url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1622978346931828/6IL8FMcduiE/68dUahQGzBF/archive.zip", "role": "ORIGINAL_GLTF_FORMAT", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}, {"root": {"relativePath": "minotour001.glb", "contentType": "model/gltf-binary", "url": "https://web.archive.org/web/20250101010101id_/https://poly.googleusercontent.com/downloads/c/fp/1622978346931828/6IL8FMcduiE/876SSTVdEx2/minotour001.glb"}, "resources": [], "formatComplexity": {"triangleCount": 0}, "formatType": "GLB", "role": "UNKNOWN_GLB_FORMAT_B", "isPreferredForDownload": false, "isPreferredForGalleryViewer": false, "isCorsAllowed": false}]}], "totalSize": 141092, "nextPageToken": "2"}
\ No newline at end of file
diff --git a/src/test/main.lua b/src/test/main.lua
index b772149..655feea 100644
--- a/src/test/main.lua
+++ b/src/test/main.lua
@@ -5,10 +5,12 @@ local describe, it, expect = lust.describe, lust.it, lust.expect
lust.queueServerRequest = util.queueServerRequest
-require('test/plugin_global')(lust)
-require('test/plugin_git')(lust)
-require('test/plugin_diskscan')(lust)
-require('test/plugin_xrfragment')(lust)
+--require('test/plugin_global')(lust)
+--require('test/plugin_git')(lust)
+--require('test/plugin_diskscan')(lust)
+--require('test/plugin_xrfragment')(lust)
+require('test/plugin_openbrush')(lust)
+require('test/util')(lust)
if lust.errors == 0 then
print("✅ all tests passed")
diff --git a/src/test/plugin_openbrush.lua b/src/test/plugin_openbrush.lua
new file mode 100644
index 0000000..8ed6cce
--- /dev/null
+++ b/src/test/plugin_openbrush.lua
@@ -0,0 +1,31 @@
+return function(lust)
+
+
+ local describe, it, expect = lust.describe, lust.it, lust.expect
+
+ describe('src/plugin/openbrush.lua', function()
+
+ describe('get API url', function() -- Can be nested
+ local url = app.plugin.openbrush.apiCall()
+ expect( url:match('https://') ).to.be.truthy()
+ end)
+
+ describe('parse icosa.gallery json', function() -- Can be nested
+ local json = util.readfile('/zip/test/json/icosagallery.json')
+ local opts = {body=json}
+ local t = app.plugin.openbrush.fetch('',opts)
+ expect( t.assets and #t.assets > 0 ).to.be.truthy()
+ end)
+
+ --describe('download icosa.gallery assets', function() -- Can be nested
+ -- local json = util.readfile('/zip/test/json/icosagallery.json')
+ -- local opts = {body=json}
+ -- foreach( app.plugin.openbrush.fetch(opts), function(i,t)
+ -- local res = app.plugin.openbrush.download(t)
+ -- expect( res ).to.be.truthy()
+ -- end)
+ --end)
+
+ end)
+
+end
diff --git a/src/test/util.lua b/src/test/util.lua
new file mode 100644
index 0000000..2cd8cd5
--- /dev/null
+++ b/src/test/util.lua
@@ -0,0 +1,18 @@
+return function(lust)
+
+
+ local describe, it, expect = lust.describe, lust.it, lust.expect
+
+ describe('src/.lua/util.lua', function()
+
+ describe('hyphenate()', function() -- Can be nested
+ expect( util.hyphenate(" foo bar") == "foo-bar" ).to.be.truthy()
+ end)
+
+ describe('dehyphenate()', function() -- Can be nested
+ expect( util.dehyphenate("_e3f55-foo-bar-_438394") == "foo bar" ).to.be.truthy()
+ end)
+
+ end)
+
+end
diff --git a/src/util/build.sh b/src/util/build.sh
index 2c34c2e..e3b8623 100755
--- a/src/util/build.sh
+++ b/src/util/build.sh
@@ -54,7 +54,7 @@ build(){
rebuild(){
cd src
- zip -yr ../result/bin/xrforge.com .lua js shader img middleware page plugin cmd css .init.lua .args test myverse
+ zip -yr ../result/bin/xrforge.com .lua js shader img layout middleware page plugin cmd css .init.lua .args test myverse
}
"$@"