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 } "$@"