[Bf-blender-cvs] [aff190c14a3] soc-2019-fast-io: [Fast import/export] Refactoring, using DEG_OBJECT_ITER, fixed crash when UVs don't exist for object, fixed applying scale and axis remap
Hugo Sales
noreply at git.blender.org
Fri Jun 28 15:47:24 CEST 2019
Commit: aff190c14a3ffdf3d50ddc62ad5ad52845225a59
Author: Hugo Sales
Date: Fri Jun 28 14:45:27 2019 +0100
Branches: soc-2019-fast-io
https://developer.blender.org/rBaff190c14a3ffdf3d50ddc62ad5ad52845225a59
[Fast import/export] Refactoring, using DEG_OBJECT_ITER, fixed crash when UVs don't exist for object, fixed applying scale and axis remap
===================================================================
M source/blender/depsgraph/DEG_depsgraph_query.h
M source/blender/editors/io/intern/common.cpp
M source/blender/editors/io/intern/common.hpp
M source/blender/editors/io/intern/iterators.hpp
M source/blender/editors/io/intern/obj.cpp
M source/blender/editors/io/intern/stl.cpp
M source/blender/editors/io/io_common.c
M source/blender/editors/io/io_common.h
M source/blender/editors/io/io_obj.c
M source/blender/editors/io/io_stl.c
===================================================================
diff --git a/source/blender/depsgraph/DEG_depsgraph_query.h b/source/blender/depsgraph/DEG_depsgraph_query.h
index 4148529d3f8..e612a58c410 100644
--- a/source/blender/depsgraph/DEG_depsgraph_query.h
+++ b/source/blender/depsgraph/DEG_depsgraph_query.h
@@ -26,6 +26,8 @@
#ifndef __DEG_DEPSGRAPH_QUERY_H__
#define __DEG_DEPSGRAPH_QUERY_H__
+#include "BLI_iterator.h"
+
#include "DEG_depsgraph.h"
#include "DEG_depsgraph_build.h"
diff --git a/source/blender/editors/io/intern/common.cpp b/source/blender/editors/io/intern/common.cpp
index 0b19bfd9912..98c2602b005 100644
--- a/source/blender/editors/io/intern/common.cpp
+++ b/source/blender/editors/io/intern/common.cpp
@@ -106,11 +106,9 @@ bool should_export_object(const ExportSettings *const settings, const Object *co
/* These tests only make sense when the object isn't being instanced
* into the scene. When it is, its exportability is determined by
* its dupli-object and the DupliObject::no_draw property. */
- return (settings->selected_only && (ob->flag & BASE_SELECTED) != 0) ||
- // FIXME Sybren: handle these cleanly (maybe just remove code),
- // now using active scene layer instead.
- (settings->visible_only && (ob->flag & BASE_VISIBLE) != 0) ||
- (settings->renderable_only && (ob->flag & BASE_ENABLED_RENDER) != 0);
+ return (settings->selected_only ? ((ob->base_flag & BASE_SELECTED) != 0) : true) &&
+ (settings->visible_only ? ((ob->base_flag & BASE_VISIBLE) != 0) : true) &&
+ (settings->renderable_only ? ((ob->base_flag & BASE_ENABLED_RENDER) != 0) : true);
}
else if (!(ob->parent != NULL && ob->parent->transflag & OB_DUPLI))
return should_export_object(settings, ob->parent);
@@ -161,45 +159,25 @@ float get_unit_scale(const Scene *const scene)
bool get_final_mesh(const ExportSettings *const settings,
const Scene *const escene,
- const Object *ob,
- Mesh **mesh /* out */)
+ const Object *eob,
+ Mesh **mesh /* out */,
+ float (*mat)[4][4] /* out */)
{
- /* Based on abc_mesh.cc */
+ scale_m4_fl(*mat, settings->global_scale * get_unit_scale(escene));
- /* Temporarily disable modifiers if we shouldn't apply them */
- if (!settings->apply_modifiers)
- for (ModifierData &md : common::modifier_iter{ob})
- md.mode |= eModifierMode_DisableTemporary;
-
- float scale_mat[4][4];
- scale_m4_fl(scale_mat, settings->global_scale * get_unit_scale(escene));
-
- change_orientation(scale_mat, settings->axis_forward, settings->axis_up);
+ change_orientation(*mat, settings->axis_forward, settings->axis_up);
// TODO someone Unsure if necessary
- // scale_mat[3][3] = m_settings.global_scale; /* also scale translation */
+ // mat[3][3] = m_settings.global_scale; /* also scale translation */
// TODO someone Doesn't seem to do anyhing. Is it necessary to update the object somehow?
- mul_m4_m4m4((float(*)[4])ob->obmat, ob->obmat, scale_mat);
+ // mul_m4_m4m4((float(*)[4])eob->obmat, eob->obmat, mat);
// yup_mat[3][3] /= m_settings.global_scale; /* normalise the homogeneous component */
- if (determinant_m4(ob->obmat) < 0.0)
+ if (determinant_m4(*mat) < 0.0)
; /* TODO someone flip normals */
- /* Object *ob = DEG_get_evaluated_object(settings->depsgraph, ob); */
- // *mesh = mesh_get_eval_final(settings->depsgraph, (Scene *) escene,
- // (Object *) ob, &CD_MASK_MESH);
-
- if (settings->render_modifiers) // vv Depends on depsgraph type
- *mesh = mesh_create_eval_final_render(
- settings->depsgraph, (Scene *)escene, (Object *)ob, &CD_MASK_MESH);
- else
- *mesh = mesh_create_eval_final_view(
- settings->depsgraph, (Scene *)escene, (Object *)ob, &CD_MASK_MESH);
-
- if (!settings->apply_modifiers)
- for (ModifierData &md : common::modifier_iter{ob})
- md.mode &= ~eModifierMode_DisableTemporary;
+ *mesh = eob->runtime.mesh_eval;
if (settings->triangulate) {
struct BMeshCreateParams bmcp = {false};
@@ -245,6 +223,11 @@ void export_start(bContext *UNUSED(C), ExportSettings *const settings)
*/
G.is_rendering = true; // TODO someone Should use BKE_main_lock(bmain);?
BKE_spacedata_draw_locks(true);
+ // If render_modifiers use render depsgraph, to get render modifiers
+ settings->depsgraph = DEG_graph_new(settings->scene,
+ settings->view_layer,
+ settings->render_modifiers ? DAG_EVAL_RENDER :
+ DAG_EVAL_VIEWPORT);
DEG_graph_build_from_view_layer(
settings->depsgraph, settings->main, settings->scene, settings->view_layer);
BKE_scene_graph_update_tagged(settings->depsgraph, settings->main);
@@ -259,7 +242,6 @@ bool export_end(bContext *UNUSED(C), ExportSettings *const settings)
return true;
}
-/* clang-format off */
bool time_export(bContext *C,
ExportSettings *const settings,
void (*start)(bContext *C, ExportSettings *const settings),
@@ -269,11 +251,12 @@ bool time_export(bContext *C,
start(C, settings);
auto ret = end(C, settings);
std::cout << "Took "
- << std::chrono::duration_cast<std::chrono::milliseconds>
- (std::chrono::steady_clock::now() - f).count() << "ms\n";
+ << std::chrono::duration_cast<std::chrono::milliseconds>(
+ std::chrono::steady_clock::now() - f)
+ .count()
+ << "ms\n";
return ret;
}
-/* clang-format on */
const std::array<float, 3> calculate_normal(const Mesh *const mesh, const MPoly &mp)
{
diff --git a/source/blender/editors/io/intern/common.hpp b/source/blender/editors/io/intern/common.hpp
index cfc4a625d91..fcaad8fbf67 100644
--- a/source/blender/editors/io/intern/common.hpp
+++ b/source/blender/editors/io/intern/common.hpp
@@ -69,8 +69,9 @@ void change_orientation(float (&mat)[4][4], int forward, int up);
bool get_final_mesh(const ExportSettings *const settings,
const Scene *const escene,
- const Object *ob,
- Mesh **mesh /* out */);
+ const Object *eob,
+ Mesh **mesh /* out */,
+ float (*mat)[4][4] /* out */);
void free_mesh(Mesh *mesh, bool needs_free);
diff --git a/source/blender/editors/io/intern/iterators.hpp b/source/blender/editors/io/intern/iterators.hpp
index 60ec3752f23..c3bc3bf9f29 100644
--- a/source/blender/editors/io/intern/iterators.hpp
+++ b/source/blender/editors/io/intern/iterators.hpp
@@ -108,6 +108,22 @@ struct vert_iter : pointer_iterator<MVert> {
vert_iter(const Mesh *const m) : pointer_iterator(m->mvert, m->totvert) {}
};
+struct transformed_vertex_iter : pointer_iterator_base<MVert> {
+ using Mat = const float(*)[4]; // Must actually be float[4][4]
+ transformed_vertex_iter(const Mesh *const m, Mat &mat)
+ : pointer_iterator_base(m->mvert, m->totvert), mat(mat) {}
+ transformed_vertex_iter(MVert * const mvert, size_t size, Mat &mat)
+ : pointer_iterator_base(mvert, size), mat(mat) {}
+ transformed_vertex_iter begin() const { return {this->first, this->size, mat}; }
+ transformed_vertex_iter end() const { return {this->first + this->size, this->size, mat}; }
+ const std::array<float, 3> operator*() const {
+ float co[3];
+ mul_v3_m4v3(co, mat, this->curr->co);
+ return {co[0], co[1], co[2]};
+ }
+ Mat &mat;
+};
+
// Iterator over the vertices of a polygon
struct vert_of_poly_iter : pointer_iterator_base<MLoop, std::random_access_iterator_tag> {
// TODO someone What order are the vertices stored in? Clockwise?
@@ -238,8 +254,8 @@ struct points_of_nurbs_iter : pointer_iterator_base<BPoint> {
// Iterator over the UVs of a mesh (as `const std::array<float, 2>`)
struct uv_iter : pointer_iterator_base<MLoopUV> {
- uv_iter(const Mesh *const m) : pointer_iterator_base(m->mloopuv, m->totloop) {}
- uv_iter(MLoopUV * const uv, size_t size) : pointer_iterator_base(uv, size) {}
+ uv_iter(const Mesh *const m) : pointer_iterator_base(m->mloopuv, m->mloopuv ? m->totloop : 0) {}
+ uv_iter(MLoopUV * const uv, size_t size) : pointer_iterator_base(uv, uv ? size : 0) {}
uv_iter begin() const { return {this->first, this->size}; }
uv_iter end() const { return {this->first + this->size, this->size}; }
inline const std::array<float, 2> operator*() {
@@ -365,9 +381,11 @@ struct deduplicated_iterator {
// Reserve space so we don't constantly allocate
dedup_pair.second.reserve(reserve);
// Need to insert the first element, because we need to dereference before incrementing
- auto p = dedup_pair.first.insert(std::make_pair(*this->it, total++));
- dedup_pair.second.push_back(p.first);
- ++this->it;
+ if (this->it != this->it.end()) {
+ auto p = dedup_pair.first.insert(std::make_pair(*this->it, total++));
+ dedup_pair.second.push_back(p.first);
+ ++this->it;
+ }
}
deduplicated_iterator begin() const {
return deduplicated_iterator(mesh, dedup_pair, total, it.begin());
diff --git a/source/blender/editors/io/intern/obj.cpp b/source/blender/editors/io/intern/obj.cpp
index 598d8eba8c4..053c485d9cb 100644
--- a/source/blender/editors/io/intern/obj.cpp
+++ b/source/blender/editors/io/intern/obj.cpp
@@ -12,15 +12,17 @@ extern "C" {
#include "BKE_library.h"
#include "BKE_customdata.h"
+#include "DNA_curve_types.h"
#include "DNA_ID.h"
+#include "DNA_layer_types.h"
#include "DNA_material_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_mesh_types.h"
#include "DNA_object_types.h"
#include "DNA_space_types.h"
-#include "DNA_curve_types.h"
#include "DEG_depsgraph.h"
+#include "DEG_depsgraph_query.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -144,7 +146,8 @@ bool OBJ_export_materials(bContext *C,
ss << (mat->id.name + 2) << '"';
}
- ss << "], '" << path_reference_mode[((OBJExportSettings *)settings->extra)->path_mode].identifier
+ ss << "], '"
+ << path_reference_mode[((OBJExportSettings *)settings->format_specific)
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list