Commit: 7f9b00bd464df2f2abbeaf016fe6dc633a034691
Author: Pablo Dobarro
Date:   Mon Apr 8 01:22:39 2019 +0200
Branches: sculpt-mode-features
https://developer.blender.org/rB7f9b00bd464df2f2abbeaf016fe6dc633a034691

Refactor: Move remesher functions to blenderkernel

===================================================================

A       source/blender/blenkernel/BKE_remesh.h
M       source/blender/blenkernel/CMakeLists.txt
A       source/blender/blenkernel/intern/remesh_voxel.c
M       source/blender/editors/object/object_edit.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_remesh.h 
b/source/blender/blenkernel/BKE_remesh.h
new file mode 100644
index 00000000000..e51d92237ca
--- /dev/null
+++ b/source/blender/blenkernel/BKE_remesh.h
@@ -0,0 +1,39 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ */
+#ifndef __BKE_REMESH_H__
+#define __BKE_REMESH_H__
+
+/** \file
+ * \ingroup bke
+ */
+
+#include "DNA_mesh_types.h"
+
+#include "openvdb_capi.h"
+
+/* OpenVDB Voxel Remesher */
+struct OpenVDBLevelSet *BKE_remesh_voxel_ovdb_mesh_to_level_set_create(Mesh 
*mesh, struct OpenVDBTransform *transform);
+Mesh *BKE_remesh_voxel_ovdb_volume_to_mesh_nomain(struct OpenVDBLevelSet 
*level_set, double isovalue, double adaptivity,
+                                                                               
                  bool relax_disoriented_triangles);
+
+/* Reprojection */
+void BKE_remesh_voxel_init_empty_vertex_color_layer(Mesh *mesh);
+void BKE_remesh_voxel_reproject_vertex_paint(Mesh *target, Mesh *source);
+
+#endif /* __BKE_REMESH_H__ */
diff --git a/source/blender/blenkernel/CMakeLists.txt 
b/source/blender/blenkernel/CMakeLists.txt
index c882be972f5..86b403d1f1f 100644
--- a/source/blender/blenkernel/CMakeLists.txt
+++ b/source/blender/blenkernel/CMakeLists.txt
@@ -220,6 +220,7 @@ set(SRC
        intern/workspace.c
        intern/world.c
        intern/writeavi.c
+       intern/remesh_voxel.c
 
        BKE_DerivedMesh.h
        BKE_action.h
@@ -341,6 +342,7 @@ set(SRC
        BKE_workspace.h
        BKE_world.h
        BKE_writeavi.h
+       BKE_remesh.h
 
        nla_private.h
        particle_private.h
diff --git a/source/blender/blenkernel/intern/remesh_voxel.c 
b/source/blender/blenkernel/intern/remesh_voxel.c
new file mode 100644
index 00000000000..78de777493f
--- /dev/null
+++ b/source/blender/blenkernel/intern/remesh_voxel.c
@@ -0,0 +1,152 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ */
+
+/** \file
+ * \ingroup bke
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+#include <time.h>
+#include <float.h>
+#include <ctype.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_blenlib.h"
+#include "BLI_math.h"
+#include "BLI_utildefines.h"
+
+#include "DNA_object_types.h"
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
+
+#include "BKE_mesh.h"
+#include "BKE_mesh_runtime.h"
+#include "BKE_library.h"
+#include "BKE_customdata.h"
+#include "BKE_bvhutils.h"
+#include "BKE_remesh.h"
+
+#ifdef WITH_OPENVDB
+       #include "openvdb_capi.h"
+#endif
+
+
+struct OpenVDBLevelSet *BKE_remesh_voxel_ovdb_mesh_to_level_set_create(Mesh 
*mesh, struct OpenVDBTransform *transform)
+{
+       BKE_mesh_runtime_looptri_recalc(mesh);
+       const MLoopTri *looptri = BKE_mesh_runtime_looptri_ensure(mesh);
+       MVertTri *verttri = MEM_callocN(sizeof(*verttri) * 
BKE_mesh_runtime_looptri_len(mesh), "remesh_looptri");
+       BKE_mesh_runtime_verttri_from_looptri(verttri, mesh->mloop, looptri, 
BKE_mesh_runtime_looptri_len(mesh));
+
+       int totfaces = BKE_mesh_runtime_looptri_len(mesh);
+       unsigned int totverts = mesh->totvert;
+       float *verts = (float *)MEM_calloc_arrayN(totverts * 3, sizeof(float), 
"remesh_input_verts");
+       unsigned int *faces = (unsigned int *)MEM_calloc_arrayN(totfaces * 3, 
sizeof(unsigned int), "remesh_intput_faces");
+
+       for(int i = 0; i < totverts; i++) {
+               MVert mvert = mesh->mvert[i];
+               verts[i * 3] = mvert.co[0];
+               verts[i * 3 + 1] = mvert.co[1];
+               verts[i * 3 + 2] = mvert.co[2];
+       }
+
+       for(int i = 0; i < totfaces; i++) {
+               MVertTri vt = verttri[i];
+               faces[i * 3] = vt.tri[0];
+               faces[i * 3 + 1] = vt.tri[1];
+               faces[i * 3 + 2] = vt.tri[2];
+       }
+
+       struct OpenVDBLevelSet *level_set = OpenVDBLevelSet_create(false, NULL);
+       OpenVDBLevelSet_mesh_to_level_set(level_set, verts, faces, totverts, 
totfaces, transform);
+
+       MEM_freeN(verts);
+       MEM_freeN(faces);
+       MEM_freeN(verttri);
+
+       return level_set;
+}
+
+Mesh *BKE_remesh_voxel_ovdb_volume_to_mesh_nomain(struct OpenVDBLevelSet 
*level_set, double isovalue, double adaptivity,
+                                                                               
                  bool relax_disoriented_triangles)
+{
+       struct OpenVDBVolumeToMeshData output_mesh;
+       OpenVDBLevelSet_volume_to_mesh(level_set, &output_mesh, isovalue, 0.0, 
false);
+
+       Mesh *mesh = BKE_mesh_new_nomain(output_mesh.totvertices, 0, 
output_mesh.totquads, 0, 0);
+
+       for(int i = 0; i < output_mesh.totvertices; i++) {
+               float vco[3] = { output_mesh.vertices[i * 3], 
output_mesh.vertices[i * 3 + 1], output_mesh.vertices[i * 3 + 2]};
+               copy_v3_v3(mesh->mvert[i].co, vco);
+       }
+
+       for(int i = 0; i < output_mesh.totquads; i++) {
+               mesh->mface[i].v4 = output_mesh.quads[i * 4];
+               mesh->mface[i].v3 = output_mesh.quads[i * 4 + 1];
+               mesh->mface[i].v2 = output_mesh.quads[i * 4 + 2];
+               mesh->mface[i].v1 = output_mesh.quads[i * 4 + 3];
+       }
+
+       BKE_mesh_calc_edges_tessface(mesh);
+       BKE_mesh_convert_mfaces_to_mpolys(mesh);
+       BKE_mesh_calc_normals(mesh);
+
+       MEM_freeN(output_mesh.quads);
+       MEM_freeN(output_mesh.vertices);
+
+       return mesh;
+}
+
+void BKE_remesh_voxel_init_empty_vertex_color_layer(Mesh *mesh)
+{
+       MVertCol *color = CustomData_add_layer_named(&mesh->vdata, CD_MVERTCOL, 
CD_CALLOC, NULL, mesh->totvert, "vcols");
+       for (int i = 0; i < mesh->totvert; i++) {
+               color[i].r = 255;
+               color[i].g = 255;
+               color[i].b = 255;
+               color[i].a = 255;
+       }
+}
+
+void BKE_remesh_voxel_reproject_vertex_paint(Mesh *target, Mesh *source)
+{
+       BVHTreeFromMesh bvhtree = {NULL};
+       BKE_bvhtree_from_mesh_get(&bvhtree, source, BVHTREE_FROM_VERTS, 2);
+       MVertCol *target_color = CustomData_get_layer(&target->vdata, 
CD_MVERTCOL);
+       MVert *target_verts =  CustomData_get_layer(&target->vdata, CD_MVERT);
+       MVertCol *source_color  = CustomData_get_layer(&source->vdata, 
CD_MVERTCOL);
+       for(int i = 0; i < target->totvert; i++) {
+               float from_co[3];
+               BVHTreeNearest nearest;
+               nearest.index = -1;
+               nearest.dist_sq = FLT_MAX;
+               copy_v3_v3(from_co, target_verts[i].co);
+               BLI_bvhtree_find_nearest(bvhtree.tree, from_co, &nearest, 
bvhtree.nearest_callback, &bvhtree);
+               if (nearest.index != -1) {
+                       target_color[i].r = source_color[nearest.index].r;
+                       target_color[i].g = source_color[nearest.index].g;
+                       target_color[i].b = source_color[nearest.index].b;
+                       target_color[i].a = source_color[nearest.index].a;
+               }
+       }
+       free_bvhtree_from_mesh(&bvhtree);
+}
diff --git a/source/blender/editors/object/object_edit.c 
b/source/blender/editors/object/object_edit.c
index 35e8935016d..d87327f0277 100644
--- a/source/blender/editors/object/object_edit.c
+++ b/source/blender/editors/object/object_edit.c
@@ -84,6 +84,7 @@
 #include "BKE_library.h"
 #include "BKE_customdata.h"
 #include "BKE_bvhutils.h"
+#include "BKE_remesh.h"
 
 #include "DEG_depsgraph.h"
 #include "DEG_depsgraph_build.h"
@@ -1751,6 +1752,7 @@ void OBJECT_OT_link_to_collection(wmOperatorType *ot)
        RNA_def_property_flag(prop, PROP_SKIP_SAVE);
 }
 
+
 static int remesh_exec(bContext *C, wmOperator *op)
 {
        bool linked_data = false;
@@ -1764,11 +1766,10 @@ static int remesh_exec(bContext *C, wmOperator *op)
                linked_data = true;
                return OPERATOR_CANCELLED;
        }
-
        if (ob->type == OB_MESH) {
                Mesh *mesh = ob->data;
-               BVHTreeFromMesh bvhtree = {NULL};
-               Mesh *bvhMesh;
+               Mesh *newMesh;
+
                if (mesh->voxel_size <= 0.0f) {
                        return OPERATOR_CANCELLED;
                }
@@ -1786,98 +1787,31 @@ static int remesh_exec(bContext *C, wmOperator *op)
                        sculpt_undo_push_begin("voxel remesh");
                        sculpt_undo_push_node(ob, nodes[0], SCULPT_UNDO_REMESH);
                }
-               BKE_mesh_runtime_looptri_recalc(mesh);
-               const MLoopTri *looptri = BKE_mesh_runtime_looptri_ensure(mesh);
-               MVertTri *verttri = MEM_callocN(sizeof(*verttri) * 
BKE_mesh_runtime_looptri_len(mesh), "remesh_looptri");
-               BKE_mesh_runtime_verttri_from_looptri(verttri, mesh->mloop, 
looptri, BKE_mesh_runtime_looptri_len(mesh));
-
-               int totfaces = BKE_mesh_runtime_looptri_len(mesh);
-               int totverts = mesh->totvert;
-               float *verts = (float *)MEM_calloc_arrayN(totverts * 3, 
sizeof(float), "remesh_input_verts");
-               unsigned int *faces = (unsigned int 
*)MEM_calloc_arrayN(totfaces * 3, sizeof(unsigned int), "remesh_intput_faces");
-               float voxel_size = mesh->voxel_size;
-               float isovalue = 0.0f;
-
-               for(int i = 0; i < totverts; i++) {
-                       MVert mvert = mesh->mvert[i];
-                       verts[i * 3] = mvert.co[0];
-                       verts[i * 3 + 1] = mvert.co[1];
-                       verts[i * 3 + 2] = mvert.co[2];
-               }
-
-               for(int i = 0; i < totfaces; i++) {
-                       MVertTri vt = verttri[i];
-                       faces[i * 3] = vt.tri[0];
-                       faces[i * 3 + 1] = vt.tri[1];
-                       faces[i * 3 + 2] = vt.tri[2];
-               }
 
+               struct OpenVDBLevelSet *level_set;
                struct OpenVDBTransform *xform = OpenVDBTransform_create();
-               OpenVDBTransform_create_linear_transform(xform, voxel_size);
-               struct OpenVDBLevelSet *level_set = 
OpenVDBLevelSet_create(false, NULL);
-               struct OpenVDBVolumeToMeshData output_mesh;
-               OpenVDBLevelSet_mesh_to_level_set(level_set, verts,

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to