This implements the ability to have file exporters added and configured on Collections. Exporting is reachable from several locations: - Individually on each exporter configuration: The `Export` button in each panel header - For all exporters on the collection: The `Export All` button in the main panel interface - For all exporters on all collections in the scene: The `File`->`Export All Collections` button Visibility of which collections currently have exporters configured is done by ways of an icon added to the Collection row in the Outliner. Adding multiple exporters for the same file type is permitted. The user is free to setup several exports of the same format but with different file locations or settings etc. Notes: Only USD and Wavefront OBJ are enabled for the initial commit. Additional formats, including those implemented in Python will be added as separate commits after this. Ref #115690 Pull Request: https://projects.blender.org/blender/blender/pulls/116646
223 lines
6.4 KiB
C++
223 lines
6.4 KiB
C++
/* SPDX-FileCopyrightText: 2019 Blender Authors
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
|
|
#pragma once
|
|
|
|
#include <memory>
|
|
|
|
#include "DEG_depsgraph.hh"
|
|
|
|
#include "RNA_types.hh"
|
|
|
|
struct bContext;
|
|
struct CacheArchiveHandle;
|
|
struct CacheReader;
|
|
struct ListBase;
|
|
struct Mesh;
|
|
struct Object;
|
|
struct ReportList;
|
|
struct wmJobWorkerStatus;
|
|
|
|
namespace blender::bke {
|
|
struct GeometrySet;
|
|
}
|
|
|
|
namespace blender::io::usd {
|
|
|
|
/**
|
|
* Behavior when the name of an imported material
|
|
* conflicts with an existing material.
|
|
*/
|
|
enum eUSDMtlNameCollisionMode {
|
|
USD_MTL_NAME_COLLISION_MAKE_UNIQUE = 0,
|
|
USD_MTL_NAME_COLLISION_REFERENCE_EXISTING = 1,
|
|
};
|
|
|
|
/**
|
|
* Behavior when importing textures from a package
|
|
* (e.g., USDZ archive) or from a URI path.
|
|
*/
|
|
enum eUSDTexImportMode {
|
|
USD_TEX_IMPORT_NONE = 0,
|
|
USD_TEX_IMPORT_PACK,
|
|
USD_TEX_IMPORT_COPY,
|
|
};
|
|
|
|
/**
|
|
* Behavior when the name of an imported texture
|
|
* file conflicts with an existing file.
|
|
*/
|
|
enum eUSDTexNameCollisionMode {
|
|
USD_TEX_NAME_COLLISION_USE_EXISTING = 0,
|
|
USD_TEX_NAME_COLLISION_OVERWRITE = 1,
|
|
};
|
|
|
|
enum eSubdivExportMode {
|
|
/** Subdivision scheme = None, export base mesh without subdivision. */
|
|
USD_SUBDIV_IGNORE = 0,
|
|
/** Subdivision scheme = None, export subdivided mesh. */
|
|
USD_SUBDIV_TESSELLATE = 1,
|
|
/**
|
|
* Apply the USD subdivision scheme that is the closest match to Blender.
|
|
* Reverts to #USD_SUBDIV_TESSELLATE if the subdivision method is not supported.
|
|
*/
|
|
USD_SUBDIV_BEST_MATCH = 2,
|
|
};
|
|
|
|
struct USDExportParams {
|
|
bool export_animation = false;
|
|
bool export_hair = true;
|
|
bool export_uvmaps = true;
|
|
bool export_normals = true;
|
|
bool export_mesh_colors = true;
|
|
bool export_materials = true;
|
|
bool export_armatures = true;
|
|
bool export_shapekeys = true;
|
|
bool only_deform_bones = false;
|
|
eSubdivExportMode export_subdiv = USD_SUBDIV_BEST_MATCH;
|
|
bool selected_objects_only = false;
|
|
bool visible_objects_only = true;
|
|
bool use_instancing = false;
|
|
enum eEvaluationMode evaluation_mode = DAG_EVAL_VIEWPORT;
|
|
bool generate_preview_surface = true;
|
|
bool export_textures = true;
|
|
bool overwrite_textures = true;
|
|
bool relative_paths = true;
|
|
char root_prim_path[1024] = ""; /* FILE_MAX */
|
|
char collection[MAX_IDPROP_NAME] = "";
|
|
|
|
/** Communication structure between the wmJob management code and the worker code. Currently used
|
|
* to generate safely reports from the worker thread. */
|
|
wmJobWorkerStatus *worker_status;
|
|
};
|
|
|
|
struct USDImportParams {
|
|
float scale;
|
|
bool is_sequence;
|
|
bool set_frame_range;
|
|
int sequence_len;
|
|
int offset;
|
|
bool validate_meshes;
|
|
char mesh_read_flag;
|
|
bool import_cameras;
|
|
bool import_curves;
|
|
bool import_lights;
|
|
bool import_materials;
|
|
bool import_meshes;
|
|
bool import_volumes;
|
|
bool import_shapes;
|
|
bool import_skeletons;
|
|
bool import_blendshapes;
|
|
char *prim_path_mask;
|
|
bool import_subdiv;
|
|
bool support_scene_instancing;
|
|
bool create_collection;
|
|
bool import_guide;
|
|
bool import_proxy;
|
|
bool import_render;
|
|
bool import_visible_only;
|
|
bool use_instancing;
|
|
bool import_usd_preview;
|
|
bool set_material_blend;
|
|
float light_intensity_scale;
|
|
eUSDMtlNameCollisionMode mtl_name_collision_mode;
|
|
eUSDTexImportMode import_textures_mode;
|
|
char import_textures_dir[768]; /* FILE_MAXDIR */
|
|
eUSDTexNameCollisionMode tex_name_collision_mode;
|
|
bool import_all_materials;
|
|
|
|
/**
|
|
* Communication structure between the wmJob management code and the worker code. Currently used
|
|
* to generate safely reports from the worker thread.
|
|
*/
|
|
wmJobWorkerStatus *worker_status;
|
|
};
|
|
|
|
/**
|
|
* This struct is in place to store the mesh sequence parameters needed when reading a data from a
|
|
* USD file for the mesh sequence cache.
|
|
*/
|
|
struct USDMeshReadParams {
|
|
double motion_sample_time; /* USD TimeCode in frames. */
|
|
int read_flags; /* MOD_MESHSEQ_xxx value that is set from MeshSeqCacheModifierData.read_flag. */
|
|
};
|
|
|
|
USDMeshReadParams create_mesh_read_params(double motion_sample_time, int read_flags);
|
|
|
|
/**
|
|
* The USD_export takes a `as_background_job` parameter, and returns a boolean.
|
|
*
|
|
* When `as_background_job=true`, returns false immediately after scheduling
|
|
* a background job.
|
|
*
|
|
* When `as_background_job=false`, performs the export synchronously, and returns
|
|
* true when the export was ok, and false if there were any errors.
|
|
*/
|
|
bool USD_export(bContext *C,
|
|
const char *filepath,
|
|
const USDExportParams *params,
|
|
bool as_background_job,
|
|
ReportList *reports);
|
|
|
|
bool USD_import(bContext *C,
|
|
const char *filepath,
|
|
const USDImportParams *params,
|
|
bool as_background_job,
|
|
ReportList *reports);
|
|
|
|
int USD_get_version();
|
|
|
|
/* USD Import and Mesh Cache interface. */
|
|
|
|
CacheArchiveHandle *USD_create_handle(Main *bmain, const char *filepath, ListBase *object_paths);
|
|
|
|
void USD_free_handle(CacheArchiveHandle *handle);
|
|
|
|
void USD_get_transform(CacheReader *reader, float r_mat[4][4], float time, float scale);
|
|
|
|
/** Either modifies current_mesh in-place or constructs a new mesh. */
|
|
void USD_read_geometry(CacheReader *reader,
|
|
Object *ob,
|
|
blender::bke::GeometrySet &geometry_set,
|
|
USDMeshReadParams params,
|
|
const char **err_str);
|
|
|
|
bool USD_mesh_topology_changed(CacheReader *reader,
|
|
const Object *ob,
|
|
const Mesh *existing_mesh,
|
|
double time,
|
|
const char **err_str);
|
|
|
|
CacheReader *CacheReader_open_usd_object(CacheArchiveHandle *handle,
|
|
CacheReader *reader,
|
|
Object *object,
|
|
const char *object_path);
|
|
|
|
void USD_CacheReader_incref(CacheReader *reader);
|
|
void USD_CacheReader_free(CacheReader *reader);
|
|
|
|
/** Data for registering USD IO hooks. */
|
|
struct USDHook {
|
|
|
|
/* Identifier used for class name. */
|
|
char idname[64];
|
|
/* Identifier used as label. */
|
|
char name[64];
|
|
/* Short help/description. */
|
|
char description[1024]; /* #RNA_DYN_DESCR_MAX */
|
|
|
|
/* rna_ext.data points to the USDHook class PyObject. */
|
|
ExtensionRNA rna_ext;
|
|
};
|
|
|
|
void USD_register_hook(std::unique_ptr<USDHook> hook);
|
|
/**
|
|
* Remove the given entry from the list of registered hooks and
|
|
* free the allocated memory for the hook instance.
|
|
*/
|
|
void USD_unregister_hook(USDHook *hook);
|
|
USDHook *USD_find_hook_name(const char idname[]);
|
|
|
|
}; // namespace blender::io::usd
|