Add Existing Import/Export Functionality to Collection Properties #100367
Open
opened 2022-08-12 10:04:18 +02:00 by Sonny Campbell
·
32 comments
No Branch/Tag Specified
main
temp-sculpt-dyntopo
asset-shelf
blender-v3.6-release
temp-sculpt-dyntopo-hive-alloc
brush-assets-project
tmp-usd-python-mtl
asset-browser-frontend-split
node-group-operators
blender-v2.93-release
blender-v3.3-release
universal-scene-description
temp-sculpt-attr-api
blender-v3.5-release
realtime-clock
sculpt-dev
gpencil-next
bevelv2
microfacet_hair
blender-projects-basics
principled-v2
v3.3.7
v2.93.18
v3.5.1
v3.3.6
v2.93.17
v3.5.0
v2.93.16
v3.3.5
v3.3.4
v2.93.15
v2.93.14
v3.3.3
v2.93.13
v2.93.12
v3.4.1
v3.3.2
v3.4.0
v3.3.1
v2.93.11
v3.3.0
v3.2.2
v2.93.10
v3.2.1
v3.2.0
v2.83.20
v2.93.9
v3.1.2
v3.1.1
v3.1.0
v2.83.19
v2.93.8
v3.0.1
v2.93.7
v3.0.0
v2.93.6
v2.93.5
v2.83.18
v2.93.4
v2.93.3
v2.83.17
v2.93.2
v2.93.1
v2.83.16
v2.93.0
v2.83.15
v2.83.14
v2.83.13
v2.92.0
v2.83.12
v2.91.2
v2.83.10
v2.91.0
v2.83.9
v2.83.8
v2.83.7
v2.90.1
v2.83.6.1
v2.83.6
v2.90.0
v2.83.5
v2.83.4
v2.83.3
v2.83.2
v2.83.1
v2.83
v2.82a
v2.82
v2.81a
v2.81
v2.80
v2.80-rc3
v2.80-rc2
v2.80-rc1
v2.79b
v2.79a
v2.79
v2.79-rc2
v2.79-rc1
v2.78c
v2.78b
v2.78a
v2.78
v2.78-rc2
v2.78-rc1
v2.77a
v2.77
v2.77-rc2
v2.77-rc1
v2.76b
v2.76a
v2.76
v2.76-rc3
v2.76-rc2
v2.76-rc1
v2.75a
v2.75
v2.75-rc2
v2.75-rc1
v2.74
v2.74-rc4
v2.74-rc3
v2.74-rc2
v2.74-rc1
v2.73a
v2.73
v2.73-rc1
v2.72b
2.72b
v2.72a
v2.72
v2.72-rc1
v2.71
v2.71-rc2
v2.71-rc1
v2.70a
v2.70
v2.70-rc2
v2.70-rc
v2.69
v2.68a
v2.68
v2.67b
v2.67a
v2.67
v2.66a
v2.66
v2.65a
v2.65
v2.64a
v2.64
v2.63a
v2.63
v2.61
v2.60a
v2.60
v2.59
v2.58a
v2.58
v2.57b
v2.57a
v2.57
v2.56a
v2.56
v2.55
v2.54
v2.53
v2.52
v2.51
v2.50
v2.49b
v2.49a
v2.49
v2.48a
v2.48
v2.47
v2.46
v2.45
v2.44
v2.43
v2.42a
v2.42
v2.41
v2.40
v2.37a
v2.37
v2.36
v2.35a
v2.35
v2.34
v2.33a
v2.33
v2.32
v2.31a
v2.31
v2.30
v2.28c
v2.28a
v2.28
v2.27
v2.26
v2.25
Labels
Clear labels
Issues relating to security: https://wiki.blender.org/wiki/Process/Vulnerability_Reports
Apply labels
Interest
Alembic
Interest
Animation & Rigging
Interest
Asset Browser
Interest
Asset Browser Project Overview
Interest
Audio
Interest
Automated Testing
Interest
Blender Asset Bundle
Interest
BlendFile
Interest
Collada
Interest
Compositing
Interest
Core
Interest
Cycles
Interest
Dependency Graph
Interest
Development Management
Interest
Eevee & Viewport
Interest
Freestyle
Interest
Geometry Nodes
Interest
Grease Pencil
Interest
ID Management
Interest
Images & Movies
Interest/Import
Export
Interest
Line Art
Interest
Masking
Interest
Metal
Interest
Modeling
Interest
Modifiers
Interest
Motion Tracking
Interest
Nodes & Physics
Interest
OpenGL
Interest
Overrides
Interest
Performance
Interest
Physics
Interest
Pipeline, Assets & IO
Interest
Platforms, Builds & Tests
Interest
Python API
Interest
Render & Cycles
Interest
Render Pipeline
Interest
Sculpt, Paint & Texture
Interest
Text Editor
Interest
Translations
Interest
Triaging
Interest
Undo
Interest
USD
Interest
User Interface
Interest
UV Editing
Interest
VFX & Video
Interest
Video Sequencer
Interest
Virtual Reality
Interest
Vulkan
Interest: Wayland
Legacy
Blender 2.8 Project
Legacy
Milestone 1: Basic, Local Asset Browser
Legacy
OpenGL Error
Meta
Good First Issue
Meta
Papercut
Meta
Retrospective
Meta
Security
Issues relating to security: https://wiki.blender.org/wiki/Process/Vulnerability_Reports
Module
Animation & Rigging
Module
Core
Module
Development Management
Module
Eevee & Viewport
Module
Grease Pencil
Module
Modeling
Module
Nodes & Physics
Module
Pipeline, Assets & IO
Module
Platforms, Builds & Tests
Module
Python API
Module
Render & Cycles
Module
Sculpt, Paint & Texture
Module
Triaging
Module
User Interface
Module
VFX & Video
Platform
FreeBSD
Platform
Linux
Platform
macOS
Platform
Windows
Priority
High
Priority
Low
Priority
Normal
Priority
Unbreak Now!
Status
Archived
Status
Confirmed
Status
Duplicate
Status
Needs Info from Developers
Status
Needs Information from User
Status
Needs Triage
Status
Resolved
Type
Bug
Type
Design
Type
Known Issue
Type
Patch
Type
Report
Type
To Do
No Label
Interest
Alembic
Interest
Animation & Rigging
Interest
Asset Browser
Interest
Asset Browser Project Overview
Interest
Audio
Interest
Automated Testing
Interest
Blender Asset Bundle
Interest
BlendFile
Interest
Collada
Interest
Compositing
Interest
Core
Interest
Cycles
Interest
Dependency Graph
Interest
Development Management
Interest
Eevee & Viewport
Interest
Freestyle
Interest
Geometry Nodes
Interest
Grease Pencil
Interest
ID Management
Interest
Images & Movies
Interest/Import
Export
Interest
Line Art
Interest
Masking
Interest
Metal
Interest
Modeling
Interest
Modifiers
Interest
Motion Tracking
Interest
Nodes & Physics
Interest
OpenGL
Interest
Overrides
Interest
Performance
Interest
Physics
Interest
Pipeline, Assets & IO
Interest
Platforms, Builds & Tests
Interest
Python API
Interest
Render & Cycles
Interest
Render Pipeline
Interest
Sculpt, Paint & Texture
Interest
Text Editor
Interest
Translations
Interest
Triaging
Interest
Undo
Interest
USD
Interest
User Interface
Interest
UV Editing
Interest
VFX & Video
Interest
Video Sequencer
Interest
Virtual Reality
Interest
Vulkan
Interest: Wayland
Legacy
Blender 2.8 Project
Legacy
Milestone 1: Basic, Local Asset Browser
Legacy
OpenGL Error
Meta
Good First Issue
Meta
Papercut
Meta
Retrospective
Meta
Security
Module
Animation & Rigging
Module
Core
Module
Development Management
Module
Eevee & Viewport
Module
Grease Pencil
Module
Modeling
Module
Nodes & Physics
Module
Pipeline, Assets & IO
Module
Platforms, Builds & Tests
Module
Python API
Module
Render & Cycles
Module
Sculpt, Paint & Texture
Module
Triaging
Module
User Interface
Module
VFX & Video
Platform
FreeBSD
Platform
Linux
Platform
macOS
Platform
Windows
Priority
High
Priority
Low
Priority
Normal
Priority
Unbreak Now!
Status
Archived
Status
Confirmed
Status
Duplicate
Status
Needs Info from Developers
Status
Needs Information from User
Status
Needs Triage
Status
Resolved
Type
Bug
Type
Design
Type
Known Issue
Type
Patch
Type
Report
Type
To Do
Milestone
Set milestone
Clear milestone
No items
No Milestone
Projects
Set Project
Clear projects
No project
Assignees
Assign users
Clear assignees
No Assignees
17 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.
No due date set.
Dependencies
No dependencies set.
Reference: blender/blender#100367
Reference in New Issue
There is no content yet.
Delete Branch "%!s(<nil>)"
Deleting a branch is permanent. Although the deleted branch may exist for a short time before cleaning up, in most cases it CANNOT be undone. Continue?
Problem Statement
Currently importing and exporting files like glTF, FBX, Alembic or USD is done through operators. This is fine for a one time export, but when re-importing or re-exporting the same asset many times it becomes cumbersome. We need to store relations to such files and settings permanently, so re-import and re-export is quick, and may even be done automatically on changes.
Collection Settings
The basic idea is that Collection datablock would get settings for import and export.
For export, a collection could have one or more associated exporters. Blender would natively support USD and Alembic exporters. However this could be an API that Python add-ons can plug into, to also support file formats like FBX and glTF. The settings would be defined by the exporter, and could be exactly the same as existing export operator properties. Once export settings are set up, re-exporting one (or all) collections would be a single click, much like rendering.
For import, the simplest case would be similar to export. A collection would have one associated importer and settings. Re-importing would be done with a single click as well. This would delete the objects in the collection and add new objects, however any changes to these objects would be lost.
Goal
The first step will be to wrap the existing import and export logic using Collection Properties.
Requirements
A user should be able to select the file for import/export
A user should be able to set the required import/export parameters
A user should be able to import all data from a supported file type as children of the selected Collection.
A user should be able to re-import all data from the selected file. This would delete the objects in the collection and add new objects, however any changes to these objects would be lost.
A user should be able to export all objects that are a child of the Collection back to the selected file.
A collection could have one or more associated exporters.
Design Goals
An initial thought for a UI design could be something like below (all the relevant import/export parameters have not been added to the list). Ideally we should be able to re-use the existing operator an UI logic as much as possible.

Implementation Notes
Questions
Technical Design
To support import, the Collection data-block would need to be updated to store the import filepath and the import parameters. If we want to keep this as generic as possible, what would be the best way to store these parameters? Obviously each format will have a different set of parameters, and we want to keep it generic enough to be easy to add other formats in the future. Currently the import parameters are contained entirely in their respective modules (
USDImportParams
used only in../io/usd
and.../io/editors/usd
), how should the parameters be exposed at a lower level?To support a single file export, the same technical requirements and questions apply regarding best way to make generic. To support multiple file export, Collection will need to store a list of export parameter blocks.
Added subscribers: @SonnyCampbell_Unity, @makowalski
Added subscriber: @thomasmcs
Added subscriber: @satishgoda1
Added subscriber: @Zhen-Dai
Added subscriber: @lichtwerk
Changed status from 'Needs Triage' to: 'Needs Developer To Reproduce'
Not sure if this has been discussed in the module(s)? Will reflect in the task status (to get it out of the triaging queue)
Added subscriber: @mont29
Changed status from 'Needs Developer To Reproduce' to: 'Confirmed'
Yes this has been, still need to actually read on this though...
Added subscriber: @BrianSavery
Hi @SonnyCampbell_Unity we have a similar proposal https://developer.blender.org/T100569 here. The main difference is we propose being able to load a USD via "Reference" in which you could override the location, material, etc of linked objects. You would just scan the USD for the prims, and load their geometry at render time. Otherwise I think we came to similar ideas on using collections for this.
Hey @BrianSavery - thanks a million for creating that design task! That is esentially the plan for this work too. In the design discussion for this work we laid out a couple of steps for this work is to be integrated.
The first task is adding the existing import/export functionality to collections in a generic way, so that you can import from one file type and possibly export to any file type. There were design decisions that needed to be made and this design task was created for that discussion.
The step after that would be to add the functionality for importing via "reference", but again needs to be approach in a generic way to apply to a format like Alembic too. It looks like you have solved it the way we were planning with the library data, which is great because you'll be able to point out and potential headaches and pitfalls with it. I haven't dug into that code much yet, so if you have code already doing that it will be a massive headstart when we get to implementing it.
After that the plan was to think about USD-specific features and we would design and integrate them in a sensible way (like with the prim_path in your screenshots).
The guidance from the Blender team has been that it needs to be introduced in as generic a way as possible at first so that the design isn't tied to any specific format.
Would be great if you could join the regular pipelines meetings so we could plan this out together. Ideally we'd be able to spend most of our effort helping to convert the work you've already done into a design that the Blender Foundation is happy to integrate, rather than starting from scratch, but the team have a lot of design and implementation requirements that need to be thought out and solved first.
Added subscriber: @Plyro
Sorry for the delay, finally had time off from overrides...
Design is fine, reflects what we discussed during the meetings.
Regarding raised questions:
Having several exporters in a collection: I do not see any technical issue with it, implementing it should be trivial. Whether this is a real need for users is another question... Should be trivial to add later anyway if needed, so we can definitely go without it for a start.
Once the specs are clear for IO code for how to hook into the 'Collection I/O' system, think it should be up for each maintainer of our various formats to decide whether they want to support it, and add this support to their code. Would expect required changes to be very minimal and easy to do though.
Technical Design
I would recommend to keep our Operator system here, with some minor tweaks. that way, Collection can simply store a set of IDProperties matching the relevant operator, in a similar way as what is done for e.g. the 'redo' panel in window manager code (see
wmOperatorType.last_properties
usages,WM_operator_last_properties_store
function, etc.).Then we can have a specific registering of those operators to declare themselves as supporting the Collection I/O feature, also requiring a minimal subset of common properties (would think about e.g. at least a numeric field to store the collection
session_uuid
, maybe a boolean one to tell the operator it is being called from Collection I/O code, etc.).Added subscriber: @AlexeyAdamitsky
Added subscriber: @RedMser
Added subscriber: @DagerD
Added subscriber: @hadrien
Added subscriber: @CharlesWardlaw
Hey folks,
I've been working with Michael and Sonny on a demo prototype and I think we're at a good point. Please find the video attached, understanding that the code is just an attempt to explore the problem. Implementation details are certainly open for discussion.
collections_03.mp4
The short version:
I'm curious what people think of this workflow example.
Added subscriber: @scurest
How will "versioning" of the operator parameters work? eg. what should happen if a property changes type or name?
Added subscriber: @codeloadgame
Hey all, as @CharlesWardlaw mentioned we've been working on some prototypes for this functionality, and I've been working on a prototype to implement this functionality through native code.
2022-09-27 15-47-31.mp4
Some of the questions I have:
collection->import_properties
to theop->ptr
in thewm_usd_import_exec
callback of the existing USD importer logic. If that can be easily solved, and the same solution works for setting the operator properties of python importers, it's pretty trivial to extend this to any importer.import_export_type
enum on each operator type feels a bit hacky, but it might be the correct way to maintain that dropdown across each of the operator types.If these things are fairly easy to resolve, it's overall a pretty small amount of code to implement. Appreciate any feedback.
Here's a follow-up to the preview video that resolves the first issue I was having where I was unable to map the
collection->import_properties
to theop->ptr
in thewm_usd_import_exec
callback.It also resolves the second point of having to set the
import_export_type
enum on each operator type by adding it to thewrapper_ot
instead.The other three points are fairly minor UI things that I'm sure can be resolved, but this at least functionally achieves what we're trying to do in a completely generic way for all importers.
Again any feedback is really appreciated.
2022-09-30 13-38-38.mp4
So how does this work if you have two collections that import the same object (maybe with different material or color for example). Is two objects created or is there some override being calculated?
Still thinking ahead to us being able to import objects by reference. Otherwise looks ok.
For the minute there is no reference kept to anything outside the Blender scene. This change just exposes the existing importer/exporter logic as an option for the collection, so if you import something multiple times it will create that many duplicates in the scene.
As you have mentioned, the longer term goal will be to get to a point of importing things by reference. This is setting up some of the groudwork to allow us to do that. We want to be sure Blender is happy with the implementation details at each step.
@mont29 here is the related prototype code https://developer.blender.org/D16176
Added subscriber: @JulienDuroure
Added subscriber: @brecht
Regarding how to store properties or reuse operators, I think this is the direction we should go in: #68935 (Unified object and geometry I/O handling)
An initial implementation can be internal and not exposed in the Python API, while we figure out the right interface.