Sort HDRi files by their image file size.

This commit is contained in:
Sybren A. Stüvel 2016-07-26 17:22:07 +02:00
parent a549934060
commit 2d72c96a45
3 changed files with 145 additions and 4 deletions

View File

@ -110,5 +110,38 @@ def has_texture_node(proj, return_hdri=True):
return count > 0 return count > 0
def sort_by_image_width(node, original=None):
"""Sort the files in an HDRi node by image file size."""
if node.get('node_type') != 'hdri':
return
if not node.get('properties', {}).get('files'):
return
# TODO: re-enable this once all current HDRis have been saved in correct order.
# # Don't bother sorting when the files haven't changed.
# if original is not None and \
# original.get('properties', {}).get('files') == node['properties']['files']:
# return
log.info('Sorting HDRi node %s', node.get('_id', 'NO-ID'))
files_coll = current_app.data.driver.db['files']
def sort_key(file_ref):
file_doc = files_coll.find_one(file_ref['file'], projection={'length': 1})
return file_doc['length']
node['properties']['files'].sort(key=sort_key)
def sort_nodes_by_image_width(nodes):
for node in nodes:
sort_by_image_width(node)
def setup_app(app, url_prefix): def setup_app(app, url_prefix):
app.on_replace_nodes += sort_by_image_width
app.on_insert_nodes += sort_nodes_by_image_width
app.register_blueprint(blueprint, url_prefix=url_prefix) app.register_blueprint(blueprint, url_prefix=url_prefix)

View File

@ -1113,11 +1113,11 @@ def hdri_sort(project_url):
for node in nodes: for node in nodes:
log.info('Processing node %s', node['name']) log.info('Processing node %s', node['name'])
def width(file_ref): def sort_key(file_ref):
file_doc = files_coll.find_one(file_ref['file'], projection={'width': 1}) file_doc = files_coll.find_one(file_ref['file'], projection={'length': 1})
return file_doc['width'] return file_doc['length']
files = sorted(node['properties']['files'], key=width) files = sorted(node['properties']['files'], key=sort_key)
log.info('Files pre-sort: %s', log.info('Files pre-sort: %s',
[file['resolution'] for file in node['properties']['files']]) [file['resolution'] for file in node['properties']['files']])

View File

@ -508,3 +508,111 @@ class TextureLibraryTest(AbstractHomeProjectTest):
library_project_ids = {proj['_id'] for proj in libs} library_project_ids = {proj['_id'] for proj in libs}
self.assertIn(unicode(self.hdri_proj_id), library_project_ids) self.assertIn(unicode(self.hdri_proj_id), library_project_ids)
self.assertIn(unicode(self.tex_proj_id), library_project_ids) self.assertIn(unicode(self.tex_proj_id), library_project_ids)
class HdriSortingTest(AbstractHomeProjectTest):
def setUp(self, **kwargs):
from manage_extra.node_types.hdri import node_type_hdri
AbstractHomeProjectTest.setUp(self, **kwargs)
self.user_id = self._create_user_with_token({u'subscriber'}, 'token')
self.hdri_proj_id, proj = self.ensure_project_exists(project_overrides={
'user': self.user_id,
'permissions': {'world': ['DELETE', 'GET', 'POST', 'PUT']},
'node_types': [node_type_hdri],
})
self.hdri_proj_id = ObjectId(self.hdri_proj_id)
self.assertIsNotNone(self.hdri_proj_id)
# Add some test files.
with self.app.test_request_context():
files_coll = self.app.data.driver.db['files']
self.file_256p = files_coll.insert_one({
'name': '96f1adf5330a4cadbf73c13d718ac163.hdr',
'format': 'radiance-hdr',
'filename': 'symmetrical_garden_256p.hdr',
'project': self.hdri_proj_id,
'length': 106435,
'user': self.user_id,
'content_type': 'application/octet-stream',
'file_path': '96f1adf5330a4cadbf73c13d718ac163.hdr'}).inserted_id
self.file_1k = files_coll.insert_one({
'name': '96f1adf5330a4cadbf73qweqwecqwev142v.hdr',
'format': 'radiance-hdr',
'filename': 'symmetrical_garden_1k.hdr',
'project': self.hdri_proj_id,
'length': 1431435,
'user': self.user_id,
'content_type': 'application/octet-stream',
'file_path': 'd13rfc13r1evadbf73c13d718ac163.hdr'}).inserted_id
self.file_2k = files_coll.insert_one({
'name': '34134df5330a4cadbf73qweqwecqwev142v.hdr',
'format': 'radiance-hdr',
'filename': 'symmetrical_garden_2k.hdr',
'project': self.hdri_proj_id,
'length': 2431435,
'user': self.user_id,
'content_type': 'application/octet-stream',
'file_path': 'd13rfc13r1evadbf73c13d718ac163.hdr'}).inserted_id
def test_hdri_sorting_on_create(self):
# Create node with files in wrong order
node = {'project': self.hdri_proj_id,
'node_type': 'hdri',
'user': self.user_id,
'properties': {
'files': [
{'resolution': '2k', 'file': self.file_2k},
{'resolution': '256p', 'file': self.file_256p},
{'resolution': '1k', 'file': self.file_1k},
],
'status': 'published',
},
'name': 'Symmetrical Garden'
}
resp = self.post('/nodes', json=node, expected_status=201, auth_token='token')
node_info = resp.json()
# Check that the node's files are in the right order
resp = self.get('/nodes/%s' % node_info['_id'], auth_token='token')
get_node = resp.json()
self.assertEqual(['256p', '1k', '2k'],
[file_info['resolution']
for file_info in get_node['properties']['files']])
def test_hdri_sorting_on_update(self):
# Create node with files in correct order
node = {'project': self.hdri_proj_id,
'node_type': 'hdri',
'user': self.user_id,
'properties': {
'files': [
{'resolution': '256p', 'file': self.file_256p},
{'resolution': '1k', 'file': self.file_1k},
{'resolution': '2k', 'file': self.file_2k},
],
'status': 'published',
},
'name': 'Symmetrical Garden'
}
resp = self.post('/nodes', json=node, expected_status=201, auth_token='token')
node_info = resp.json()
# Mess up the node's order
node['properties']['files'] = [
{'resolution': '2k', 'file': self.file_2k},
{'resolution': '1k', 'file': self.file_1k},
{'resolution': '256p', 'file': self.file_256p},
]
self.put('/nodes/%s' % node_info['_id'], json=node, auth_token='token',
headers={'If-Match': node_info['_etag']})
# Check that the node's files are in the right order
resp = self.get('/nodes/%s' % node_info['_id'], auth_token='token')
get_node = resp.json()
self.assertEqual(['256p', '1k', '2k'],
[file_info['resolution']
for file_info in get_node['properties']['files']])