[Bf-blender-cvs] [13b331e0896] refactor-mesh-corners-generic: Merge branch 'refactor-mesh-position-generic' into refactor-mesh-corners-generic
Hans Goudey
noreply at git.blender.org
Tue Dec 6 23:01:56 CET 2022
Commit: 13b331e08965ae64c6b7e3d695656d2087e366e3
Author: Hans Goudey
Date: Tue Dec 6 15:53:30 2022 -0600
Branches: refactor-mesh-corners-generic
https://developer.blender.org/rB13b331e08965ae64c6b7e3d695656d2087e366e3
Merge branch 'refactor-mesh-position-generic' into refactor-mesh-corners-generic
===================================================================
===================================================================
diff --cc source/blender/io/wavefront_obj/exporter/obj_export_mesh.cc
index 148485b3919,1fc5f08675e..230a740709d
--- a/source/blender/io/wavefront_obj/exporter/obj_export_mesh.cc
+++ b/source/blender/io/wavefront_obj/exporter/obj_export_mesh.cc
@@@ -33,12 -33,16 +33,16 @@@ OBJMesh::OBJMesh(Depsgraph *depsgraph,
/* We need to copy the object because it may be in temporary space. */
Object *obj_eval = DEG_get_evaluated_object(depsgraph, mesh_object);
export_object_eval_ = dna::shallow_copy(*obj_eval);
- export_mesh_eval_ = export_params.apply_modifiers ?
- BKE_object_get_evaluated_mesh(&export_object_eval_) :
- BKE_object_get_pre_modified_mesh(&export_object_eval_);
- mesh_eval_needs_free_ = false;
-
- if (!export_mesh_eval_) {
+ export_mesh_ = export_params.apply_modifiers ?
+ BKE_object_get_evaluated_mesh(&export_object_eval_) :
+ BKE_object_get_pre_modified_mesh(&export_object_eval_);
+ if (export_mesh_) {
+ mesh_positions_ = export_mesh_->positions();
+ mesh_edges_ = export_mesh_->edges();
+ mesh_polys_ = export_mesh_->polys();
- mesh_loops_ = export_mesh_->loops();
++ mesh_corner_verts_ = export_mesh_->corner_verts();
+ }
+ else {
/* Curves and NURBS surfaces need a new mesh when they're
* exported in the form of vertices and edges.
*/
@@@ -60,13 -62,17 +62,17 @@@ OBJMesh::~OBJMesh(
clear();
}
- void OBJMesh::free_mesh_if_needed()
+ void OBJMesh::set_mesh(Mesh *mesh)
{
- if (mesh_eval_needs_free_ && export_mesh_eval_) {
- BKE_id_free(nullptr, export_mesh_eval_);
- export_mesh_eval_ = nullptr;
- mesh_eval_needs_free_ = false;
+ if (owned_export_mesh_) {
+ BKE_id_free(nullptr, owned_export_mesh_);
}
+ owned_export_mesh_ = mesh;
+ export_mesh_ = owned_export_mesh_;
+ mesh_positions_ = mesh->positions();
+ mesh_edges_ = mesh->edges();
+ mesh_polys_ = mesh->polys();
- mesh_loops_ = mesh->loops();
++ mesh_corner_verts_ = mesh->corner_verts();
}
void OBJMesh::clear()
@@@ -180,15 -189,12 +189,12 @@@ void OBJMesh::ensure_mesh_normals() con
void OBJMesh::calc_smooth_groups(const bool use_bitflags)
{
- const Span<MEdge> edges = export_mesh_eval_->edges();
- const Span<MPoly> polys = export_mesh_eval_->polys();
- const Span<int> corner_edges = export_mesh_eval_->corner_edges();
- poly_smooth_groups_ = BKE_mesh_calc_smoothgroups(edges.data(),
- edges.size(),
- polys.data(),
- polys.size(),
- corner_edges.data(),
- corner_edges.size(),
+ poly_smooth_groups_ = BKE_mesh_calc_smoothgroups(mesh_edges_.data(),
+ mesh_edges_.size(),
+ mesh_polys_.data(),
+ mesh_polys_.size(),
- mesh_loops_.data(),
- mesh_loops_.size(),
++ export_mesh_->corner_edges().data(),
++ export_mesh_->totloop,
&tot_smooth_groups_,
use_bitflags);
}
@@@ -269,16 -272,14 +272,8 @@@ float3 OBJMesh::calc_vertex_coords(cons
Vector<int> OBJMesh::calc_poly_vertex_indices(const int poly_index) const
{
- const Span<MPoly> polys = export_mesh_eval_->polys();
- const Span<MLoop> loops = export_mesh_eval_->loops();
- const MPoly &mpoly = polys[poly_index];
- const MLoop *mloop = &loops[mpoly.loopstart];
- const int totloop = mpoly.totloop;
- Vector<int> r_poly_vertex_indices(totloop);
- for (int loop_index = 0; loop_index < totloop; loop_index++) {
- r_poly_vertex_indices[loop_index] = mloop[loop_index].v;
- }
- return r_poly_vertex_indices;
+ const MPoly &mpoly = mesh_polys_[poly_index];
- const MLoop *mloop = &mesh_loops_[mpoly.loopstart];
- const int totloop = mpoly.totloop;
- Vector<int> r_poly_vertex_indices(totloop);
- for (int loop_index = 0; loop_index < totloop; loop_index++) {
- r_poly_vertex_indices[loop_index] = mloop[loop_index].v;
- }
- return r_poly_vertex_indices;
++ return mesh_corner_verts_.slice(mpoly.loopstart, mpoly.totloop);
}
void OBJMesh::store_uv_coords_and_indices()
@@@ -294,12 -293,12 +287,12 @@@
}
const float limit[2] = {STD_UV_CONNECT_LIMIT, STD_UV_CONNECT_LIMIT};
- UvVertMap *uv_vert_map = BKE_mesh_uv_vert_map_create(polys.data(),
+ UvVertMap *uv_vert_map = BKE_mesh_uv_vert_map_create(mesh_polys_.data(),
nullptr,
nullptr,
- loops.data(),
- mesh_loops_.data(),
++ mesh_corner_verts_.data(),
mloopuv,
- polys.size(),
+ mesh_polys_.size(),
totvert,
limit,
false,
@@@ -347,13 -346,10 +340,10 @@@ Span<int> OBJMesh::calc_poly_uv_indices
float3 OBJMesh::calc_poly_normal(const int poly_index) const
{
float3 r_poly_normal;
- const Span<float3> positions = export_mesh_eval_->positions();
- const Span<MPoly> polys = export_mesh_eval_->polys();
- const Span<MLoop> loops = export_mesh_eval_->loops();
- const MPoly &poly = polys[poly_index];
+ const MPoly &poly = mesh_polys_[poly_index];
BKE_mesh_calc_poly_normal(&poly,
- &loops[poly.loopstart],
- reinterpret_cast<const float(*)[3]>(positions.data()),
- &mesh_loops_[poly.loopstart],
++ &mesh_corner_verts_[poly.loopstart],
+ reinterpret_cast<const float(*)[3]>(mesh_positions_.data()),
r_poly_normal);
mul_m3_v3(world_and_axes_normal_transform_, r_poly_normal);
normalize_v3(r_poly_normal);
@@@ -472,10 -463,10 +457,9 @@@ int16_t OBJMesh::get_poly_deform_group_
group_weights.fill(0);
bool found_any_group = false;
- const MPoly &mpoly = polys[poly_index];
- const MLoop *mloop = &loops[mpoly.loopstart];
- for (int loop_i = 0; loop_i < mpoly.totloop; ++loop_i, ++mloop) {
- const MDeformVert &dv = dverts[mloop->v];
+ const MPoly &mpoly = mesh_polys_[poly_index];
- const MLoop *mloop = &mesh_loops_[mpoly.loopstart];
- for (int loop_i = 0; loop_i < mpoly.totloop; ++loop_i, ++mloop) {
- const MDeformVert &dv = dverts[mloop->v];
++ for (const int vert_i : mesh_corner_verts_.slice(mpoly.loopstart, mpoly.totloop)) {
++ const MDeformVert &dv = dverts[vert_i];
for (int weight_i = 0; weight_i < dv.totweight; ++weight_i) {
const auto group = dv.dw[weight_i].def_nr;
if (group < group_weights.size()) {
diff --cc source/blender/io/wavefront_obj/exporter/obj_export_mesh.hh
index f45dda338ee,5039a0388fb..403fce07c9b
--- a/source/blender/io/wavefront_obj/exporter/obj_export_mesh.hh
+++ b/source/blender/io/wavefront_obj/exporter/obj_export_mesh.hh
@@@ -35,11 -35,15 +35,15 @@@ class OBJMesh : NonCopyable
* sometimes builds an Object in a temporary space that doesn't persist.
*/
Object export_object_eval_;
- Mesh *export_mesh_eval_;
- /**
- * For curves which are converted to mesh, and triangulated meshes, a new mesh is allocated.
- */
- bool mesh_eval_needs_free_ = false;
+ /** A pointer to #owned_export_mesh_ or the object'ed evaluated/original mesh. */
+ const Mesh *export_mesh_;
+ /** A mesh owned here, if created or modified for the export. May be null. */
+ Mesh *owned_export_mesh_ = nullptr;
+ Span<float3> mesh_positions_;
+ Span<MEdge> mesh_edges_;
+ Span<MPoly> mesh_polys_;
- Span<MLoop> mesh_loops_;
++ Span<int> mesh_corner_verts_;
+
/**
* Final transform of an object obtained from export settings (up_axis, forward_axis) and the
* object's world transform matrix.
More information about the Bf-blender-cvs
mailing list