11#include <system_error>
54 depsgraph_ =
DEG_graph_new(bmain, scene, view_layer, eval_mode);
60 depsgraph_ =
DEG_graph_new(bmain, scene, view_layer, eval_mode);
90 CLOG_ERROR(&
LOG,
"[%s] %s", ex.code().category().name(), ex.what());
123 switch (object->type) {
128 r_exportable_meshes.
append(std::make_unique<OBJMesh>(
depsgraph, export_params,
object));
131 Curve *curve =
static_cast<Curve *
>(
object->data);
137 r_exportable_nurbs.
append(std::unique_ptr<IOBJCurve>(obj_curve));
144 r_exportable_nurbs.
append(std::unique_ptr<IOBJCurve>(obj_curve));
148 r_exportable_meshes.
append(std::make_unique<OBJMesh>(
depsgraph, export_params,
object));
158 return {std::move(r_exportable_meshes), std::move(r_exportable_nurbs)};
169 size_t count = exportable_as_mesh.size();
180 for (
const auto &obj_mesh : exportable_as_mesh) {
189 for (
const int i : range) {
192 obj.store_normal_coords_and_indices();
195 obj.store_uv_coords_and_indices();
205 for (
const auto &obj_mesh : exportable_as_mesh) {
207 index_offsets.append(offsets);
215 for (
const int i : range) {
222 if (
obj.tot_faces() > 0) {
227 obj.calc_face_order();
237 const auto *obj_mtlindices = mtlindices.
is_empty() ?
nullptr : &mtlindices[
i];
238 auto matname_fn = [&](
int s) ->
const char * {
239 if (!obj_mtlindices || s < 0 || s >= obj_mtlindices->size()) {
270 for (
const std::unique_ptr<IOBJCurve> &obj_curve : exportable_as_nurbs) {
277 const char *filepath,
278 std::unique_ptr<OBJWriter> &r_frame_writer,
279 std::unique_ptr<MTLWriter> &r_mtl_writer)
282 r_frame_writer = std::make_unique<OBJWriter>(filepath, export_params);
284 catch (
const std::system_error &ex) {
289 if (!r_frame_writer) {
295 r_mtl_writer = std::make_unique<MTLWriter>(filepath, export_params.
export_materials);
297 catch (
const std::system_error &ex) {
301 "OBJ Export: Cannot create mtl file for '%s'",
328 const Span<std::unique_ptr<OBJMesh>> meshes,
329 const Span<std::unique_ptr<IOBJCurve>> curves,
330 const char *filepath)
333 std::unique_ptr<OBJWriter> obj_writer;
334 std::unique_ptr<MTLWriter> mtl_writer;
340 obj_writer->write_header();
353 if (exportable_as_mesh.size() == 0 && exportable_as_nurbs.size() == 0) {
358 export_objects(export_params, exportable_as_mesh, exportable_as_nurbs, filepath);
363 char r_filepath_with_frames[1024])
383 "OBJ Export: Unable to find collection '%s'",
391 const char *filepath = export_params.
filepath;
395 fmt::println(
"Writing to {}", filepath);
400 char filepath_with_frames[
FILE_MAX];
402 const int original_frame = scene->
r.
cfra;
407 CLOG_ERROR(&
LOG,
"File Path too long: %s", filepath_with_frames);
411 scene->
r.
cfra = frame;
413 fmt::println(
"Writing to {}", filepath_with_frames);
414 export_frame(obj_depsgraph.
get(), export_params, filepath_with_frames);
416 scene->
r.
cfra = original_frame;
Depsgraph * CTX_data_ensure_evaluated_depsgraph(const bContext *C)
Scene * CTX_data_scene(const bContext *C)
Main * CTX_data_main(const bContext *C)
ViewLayer * CTX_data_view_layer(const bContext *C)
ID * BKE_libblock_find_name(Main *bmain, short type, const char *name, const std::optional< Library * > lib=std::nullopt) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
void BKE_reportf(ReportList *reports, eReportType type, const char *format,...) ATTR_PRINTF_FORMAT(3
void BKE_scene_graph_evaluated_ensure(Depsgraph *depsgraph, Main *bmain)
void BKE_scene_graph_update_for_newframe(Depsgraph *depsgraph)
#define BLI_assert_msg(a, msg)
bool bool BLI_path_extension_strip(char *path) ATTR_NONNULL(1)
bool BLI_path_extension_replace(char *path, size_t path_maxncpy, const char *ext) ATTR_NONNULL(1
void BLI_path_slash_native(char *path) ATTR_NONNULL(1)
int BLI_path_normalize(char *path) ATTR_NONNULL(1)
void void BLI_path_split_dir_part(const char *filepath, char *dir, size_t dir_maxncpy) ATTR_NONNULL(1
bool BLI_path_frame(char *path, size_t path_maxncpy, int frame, int digits) ATTR_NONNULL(1)
char * STRNCPY(char(&dst)[N], const char *src)
char * BLI_strncpy(char *__restrict dst, const char *__restrict src, size_t dst_maxncpy) ATTR_NONNULL(1
#define CLOG_ERROR(clg_ref,...)
Depsgraph * DEG_graph_new(Main *bmain, Scene *scene, ViewLayer *view_layer, eEvaluationMode mode)
void DEG_graph_free(Depsgraph *graph)
void DEG_graph_build_from_collection(Depsgraph *graph, Collection *collection)
void DEG_graph_build_for_all_objects(Depsgraph *graph)
#define DEG_OBJECT_ITER_BEGIN(settings_, instance_)
#define DEG_OBJECT_ITER_END
Scene * DEG_get_input_scene(const Depsgraph *graph)
@ DEG_ITER_OBJECT_FLAG_LINKED_DIRECTLY
@ DEG_ITER_OBJECT_FLAG_VISIBLE
@ DEG_ITER_OBJECT_FLAG_DUPLI
@ DEG_ITER_OBJECT_FLAG_LINKED_VIA_SET
Object groups, one object can be in many groups at once.
#define BASE_SELECTED(v3d, base)
BPy_StructRNA * depsgraph
void append(const T &value)
void reserve(const int64_t min_capacity)
Vector< int > add_materials(const OBJMesh &mesh_to_export)
void write_header(const char *blen_filepath)
void write_materials(const char *blen_filepath, ePathReferenceMode path_mode, const char *dest_dir, bool write_pbr)
StringRefNull mtl_file_path() const
const char * mtlmaterial_name(int index)
void update_for_newframe()
OBJDepsgraph(const bContext *C, eEvaluationMode eval_mode, Collection *collection)
FILE * get_outfile() const
void write_normals(FormatHandler &fh, OBJMesh &obj_mesh_data)
void write_mtllib_name(StringRefNull mtl_filepath) const
void write_uv_coords(FormatHandler &fh, OBJMesh &obj_mesh_data) const
void write_nurbs_curve(FormatHandler &fh, const IOBJCurve &obj_nurbs_data) const
void write_face_elements(FormatHandler &fh, const IndexOffsets &offsets, const OBJMesh &obj_mesh_data, FunctionRef< const char *(int)> matname_fn)
void write_vertex_coords(FormatHandler &fh, const OBJMesh &obj_mesh_data, bool write_colors) const
void write_edges_indices(FormatHandler &fh, const IndexOffsets &offsets, const OBJMesh &obj_mesh_data) const
void write_object_name(FormatHandler &fh, const OBJMesh &obj_mesh_data) const
bool mode_set(bContext *C, eObjectMode mode)
static void print_exception_error(const std::system_error &ex)
bool append_frame_to_filename(const char *filepath, const int frame, char r_filepath_with_frames[1024])
static void write_materials(MTLWriter *mtl_writer, const OBJExportParams &export_params)
void export_objects(const OBJExportParams &export_params, const Span< std::unique_ptr< OBJMesh > > meshes, const Span< std::unique_ptr< IOBJCurve > > curves, const char *filepath)
std::pair< Vector< std::unique_ptr< OBJMesh > >, Vector< std::unique_ptr< IOBJCurve > > > filter_supported_objects(Depsgraph *depsgraph, const OBJExportParams &export_params)
static bool open_stream_writers(const OBJExportParams &export_params, const char *filepath, std::unique_ptr< OBJWriter > &r_frame_writer, std::unique_ptr< MTLWriter > &r_mtl_writer)
static bool is_curve_nurbs_compatible(const Nurb *nurb)
static void write_mesh_objects(const Span< std::unique_ptr< OBJMesh > > exportable_as_mesh, OBJWriter &obj_writer, MTLWriter *mtl_writer, const OBJExportParams &export_params)
static void write_nurbs_curve_objects(const Span< std::unique_ptr< IOBJCurve > > exportable_as_nurbs, const OBJWriter &obj_writer)
void exporter_main(bContext *C, const OBJExportParams &export_params)
void export_frame(Depsgraph *depsgraph, const OBJExportParams &export_params, const char *filepath)
void parallel_for(const IndexRange range, const int64_t grain_size, const Function &function, const TaskSizeHints &size_hints=detail::TaskSizeHints_Static(1))
eEvaluationMode export_eval_mode
bool export_curves_as_nurbs
bool export_material_groups
bool smooth_groups_bitflags
const char * blen_filepath
bool export_selected_objects
char file_base_for_tests[FILE_MAX]
char collection[MAX_ID_NAME - 2]
bool export_pbr_extensions
ePathReferenceMode path_mode
bool export_smooth_groups