Commit: 4b721f42c87da00521798f36a121659fedbe1c6a
Author: Martin Felke
Date:   Mon Apr 8 10:41:53 2019 +0200
Branches: sculpt-mode-features
https://developer.blender.org/rB4b721f42c87da00521798f36a121659fedbe1c6a

use refactored functions for voxel remesh modifier, too

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

M       source/blender/blenkernel/BKE_remesh.h
M       source/blender/blenkernel/intern/remesh_voxel.c
M       source/blender/modifiers/intern/MOD_remesh.c

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

diff --git a/source/blender/blenkernel/BKE_remesh.h 
b/source/blender/blenkernel/BKE_remesh.h
index e51d92237ca..d3ea0a1c928 100644
--- a/source/blender/blenkernel/BKE_remesh.h
+++ b/source/blender/blenkernel/BKE_remesh.h
@@ -32,8 +32,12 @@ struct OpenVDBLevelSet 
*BKE_remesh_voxel_ovdb_mesh_to_level_set_create(Mesh *mes
 Mesh *BKE_remesh_voxel_ovdb_volume_to_mesh_nomain(struct OpenVDBLevelSet 
*level_set, double isovalue, double adaptivity,
                                                                                
                  bool relax_disoriented_triangles);
 
-/* Reprojection */
+/* MVertCol based Reprojection for remesh operator */
 void BKE_remesh_voxel_init_empty_vertex_color_layer(Mesh *mesh);
 void BKE_remesh_voxel_reproject_vertex_paint(Mesh *target, Mesh *source);
 
+/* MLoopCol remapping based Reprojection for remesh modifier */
+MLoopCol* BKE_remesh_remap_loop_vertex_color_layer(Mesh *mesh);
+void BKE_remesh_voxel_reproject_remapped_vertex_paint(Mesh* target, Mesh* 
source, MLoopCol *remap);
+
 #endif /* __BKE_REMESH_H__ */
diff --git a/source/blender/blenkernel/intern/remesh_voxel.c 
b/source/blender/blenkernel/intern/remesh_voxel.c
index 78de777493f..f79bb783238 100644
--- a/source/blender/blenkernel/intern/remesh_voxel.c
+++ b/source/blender/blenkernel/intern/remesh_voxel.c
@@ -90,9 +90,10 @@ Mesh *BKE_remesh_voxel_ovdb_volume_to_mesh_nomain(struct 
OpenVDBLevelSet *level_
                                                                                
                  bool relax_disoriented_triangles)
 {
        struct OpenVDBVolumeToMeshData output_mesh;
-       OpenVDBLevelSet_volume_to_mesh(level_set, &output_mesh, isovalue, 0.0, 
false);
+       OpenVDBLevelSet_volume_to_mesh(level_set, &output_mesh, isovalue, 
adaptivity, relax_disoriented_triangles);
 
-       Mesh *mesh = BKE_mesh_new_nomain(output_mesh.totvertices, 0, 
output_mesh.totquads, 0, 0);
+       Mesh *mesh = BKE_mesh_new_nomain(output_mesh.totvertices, 0, 
output_mesh.totquads + output_mesh.tottriangles, 0, 0);
+       int q = output_mesh.totquads;
 
        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]};
@@ -106,6 +107,13 @@ Mesh *BKE_remesh_voxel_ovdb_volume_to_mesh_nomain(struct 
OpenVDBLevelSet *level_
                mesh->mface[i].v1 = output_mesh.quads[i * 4 + 3];
        }
 
+       for(int i = 0; i < output_mesh.tottriangles; i++) {
+               mesh->mface[i+q].v4 = 0;
+               mesh->mface[i+q].v3 = output_mesh.triangles[i * 3];
+               mesh->mface[i+q].v2 = output_mesh.triangles[i * 3 + 1];
+               mesh->mface[i+q].v1 = output_mesh.triangles[i * 3 + 2];
+       }
+
        BKE_mesh_calc_edges_tessface(mesh);
        BKE_mesh_convert_mfaces_to_mpolys(mesh);
        BKE_mesh_calc_normals(mesh);
@@ -113,6 +121,10 @@ Mesh *BKE_remesh_voxel_ovdb_volume_to_mesh_nomain(struct 
OpenVDBLevelSet *level_
        MEM_freeN(output_mesh.quads);
        MEM_freeN(output_mesh.vertices);
 
+       if (output_mesh.tottriangles > 0) {
+               MEM_freeN(output_mesh.triangles);
+       }
+
        return mesh;
 }
 
@@ -150,3 +162,62 @@ void BKE_remesh_voxel_reproject_vertex_paint(Mesh *target, 
Mesh *source)
        }
        free_bvhtree_from_mesh(&bvhtree);
 }
+
+/*caller needs to free returned data */
+MLoopCol* BKE_remesh_remap_loop_vertex_color_layer(Mesh *mesh)
+{
+       MLoopCol *source_color = CustomData_get_layer(&mesh->ldata, 
CD_MLOOPCOL);
+       MLoopCol *remap = NULL;
+       if(source_color)
+       {
+               int i = 0;
+               remap = MEM_calloc_arrayN(mesh->totvert, sizeof(MLoopCol), 
"oldcolor");
+               /*map loopbased storage onto vertices*/
+               for (i = 0; i < mesh->totloop; i++) {
+                       MLoopCol c = source_color[i];
+                       //printf("COLOR %d %d %d %d %d \n", mesh->mloop[i].v, 
c.r, c.g, c.b, c.a);
+                       remap[mesh->mloop[i].v].r = c.r;
+                       remap[mesh->mloop[i].v].g = c.g;
+                       remap[mesh->mloop[i].v].b = c.b;
+                       remap[mesh->mloop[i].v].a = c.a;
+               }
+       }
+
+       return remap;
+}
+
+void BKE_remesh_voxel_reproject_remapped_vertex_paint(Mesh* target, Mesh* 
source, MLoopCol *remap)
+{
+       BVHTreeFromMesh bvhtree = {NULL};
+
+       if (remap) {
+               MVert* target_verts = target->mvert;
+               MLoop* target_loops = target->mloop;
+               MLoopCol *target_color = CustomData_add_layer(&target->ldata, 
CD_MLOOPCOL, CD_CALLOC, NULL, target->totloop);
+               BKE_bvhtree_from_mesh_get(&bvhtree, source, BVHTREE_FROM_VERTS, 
2);
+
+               for(int i = 0; i < target->totloop; i++) {
+                       float from_co[3];
+                       BVHTreeNearest nearest;
+                       nearest.index = -1;
+                       nearest.dist_sq = FLT_MAX;
+                       copy_v3_v3(from_co, target_verts[target_loops[i].v].co);
+                       BLI_bvhtree_find_nearest(bvhtree.tree, from_co, 
&nearest, bvhtree.nearest_callback, &bvhtree);
+
+                       if (nearest.index != -1) {
+                               MLoopCol c = remap[nearest.index];
+                               //printf("MAPPED %d %d %d %d %d %d \n", i, 
nearest.index, c.r, c.g, c.b, c.a);
+                               target_color[i].r = c.r;
+                               target_color[i].g = c.g;
+                               target_color[i].b = c.b;
+                               target_color[i].a = c.a;
+                       }
+                       else {
+                               target_color[i].r = 255;
+                               target_color[i].g = 255;
+                               target_color[i].b = 255;
+                               target_color[i].a = 255;
+                       }
+               }
+       }
+}
diff --git a/source/blender/modifiers/intern/MOD_remesh.c 
b/source/blender/modifiers/intern/MOD_remesh.c
index aa9118711e2..794576e02c4 100644
--- a/source/blender/modifiers/intern/MOD_remesh.c
+++ b/source/blender/modifiers/intern/MOD_remesh.c
@@ -36,8 +36,8 @@
 #include "BKE_mesh.h"
 #include "BKE_mesh_runtime.h"
 #include "BKE_library_query.h"
-#include "BKE_bvhutils.h"
 #include "BKE_object.h"
+#include "BKE_remesh.h"
 
 #include "DEG_depsgraph_query.h"
 
@@ -150,7 +150,7 @@ static void dualcon_add_quad(void *output_v, const int 
vert_indices[4])
        output->curface++;
 }
 
-#if 1
+#if WITH_OPENVDB
 static struct OpenVDBLevelSet *mesh_to_levelset(Mesh* mesh, struct 
OpenVDBTransform *xform)
 {
        float* verts;
@@ -196,27 +196,14 @@ static Mesh* voxel_remesh(Mesh* mesh, Mesh* csg_operand, 
char operation, float v
                           int filter_bias, int filter_width, int 
filter_iterations, bool reproject_vertex_paint,
                           float *csg_transform)
 {
-       int f = 0;
-       BVHTreeFromMesh bvhtree = {NULL};
-       MLoopCol *oldMesh_col = CustomData_get_layer(&mesh->ldata, CD_MLOOPCOL);
-       MLoopCol *oldMesh_color = NULL;
+       MLoopCol *remap = NULL;
+       Mesh* newMesh = NULL;
 
-       if (reproject_vertex_paint && oldMesh_col)
+       if (reproject_vertex_paint)
        {
-               int i = 0;
-               BKE_bvhtree_from_mesh_get(&bvhtree, mesh, BVHTREE_FROM_VERTS, 
2);
-               oldMesh_color = MEM_calloc_arrayN(mesh->totvert, 
sizeof(MLoopCol), "oldcolor");
-               for (i = 0; i < mesh->totloop; i++) {
-                       MLoopCol c = oldMesh_col[i];
-                       //printf("COLOR %d %d %d %d %d \n", mesh->mloop[i].v, 
c.r, c.g, c.b, c.a);
-                       oldMesh_color[mesh->mloop[i].v].r = c.r;
-                       oldMesh_color[mesh->mloop[i].v].g = c.g;
-                       oldMesh_color[mesh->mloop[i].v].b = c.b;
-                       oldMesh_color[mesh->mloop[i].v].a = c.a;
-               }
+               remap = BKE_remesh_remap_loop_vertex_color_layer(mesh);
        }
 
-       struct OpenVDBVolumeToMeshData output_mesh;
        struct OpenVDBLevelSet *level_set;
        struct OpenVDBLevelSet *level_setA;
        struct OpenVDBLevelSet *level_setB;
@@ -224,8 +211,8 @@ static Mesh* voxel_remesh(Mesh* mesh, Mesh* csg_operand, 
char operation, float v
        OpenVDBTransform_create_linear_transform(xform, voxel_size);
 
        if (csg_operand) {
-               level_setA = mesh_to_levelset(mesh, xform);
-               level_setB = mesh_to_levelset(csg_operand, xform);
+               level_setA = 
BKE_remesh_voxel_ovdb_mesh_to_level_set_create(mesh, xform);
+               level_setB = 
BKE_remesh_voxel_ovdb_mesh_to_level_set_create(csg_operand, xform);
                level_set = OpenVDBLevelSet_create(true, xform);
                OpenVDBLevelSet_CSG_operation(level_set, level_setA, 
level_setB, (OpenVDBLevelSet_CSGOperation)operation );
 
@@ -233,71 +220,22 @@ static Mesh* voxel_remesh(Mesh* mesh, Mesh* csg_operand, 
char operation, float v
                OpenVDBLevelSet_free(level_setB);
        }
        else {
-               level_set = mesh_to_levelset(mesh, xform);
+               level_set = 
BKE_remesh_voxel_ovdb_mesh_to_level_set_create(mesh, xform);
        }
 
        OpenVDBLevelSet_filter(level_set, filter_type, filter_width, 
filter_iterations, filter_bias);
-       OpenVDBLevelSet_volume_to_mesh(level_set, &output_mesh, isovalue, 
adaptivity, relax_triangles);
-
-       Mesh *newMesh = BKE_mesh_new_nomain(output_mesh.totvertices, 0, 
output_mesh.totquads + output_mesh.tottriangles, 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(newMesh->mvert[i].co, vco);
-
-       }
-       for(int i = 0; i < output_mesh.totquads; i++) {
-               newMesh->mface[i].v4 = output_mesh.quads[i * 4];
-               newMesh->mface[i].v3 = output_mesh.quads[i * 4 + 1];
-               newMesh->mface[i].v2 = output_mesh.quads[i * 4 + 2];
-               newMesh->mface[i].v1 = output_mesh.quads[i * 4 + 3];
-       }
-
-       f = output_mesh.totquads;
-       for(int i = 0; i < output_mesh.tottriangles; i++) {
-               newMesh->mface[i+f].v4 = 0; //output_mesh.triangles[i * 3];
-               newMesh->mface[i+f].v3 = output_mesh.triangles[i * 3];
-               newMesh->mface[i+f].v2 = output_mesh.triangles[i * 3 + 1];
-               newMesh->mface[i+f].v1 = output_mesh.triangles[i * 3 + 2];
-       }
+       newMesh = BKE_remesh_voxel_ovdb_volume_to_mesh_nomain(level_set, 
isovalue, adaptivity, relax_triangles);
 
        OpenVDBLevelSet_free(level_set);
        OpenVDBTransform_free(xform);
 
-       BKE_mesh_calc_edges_tessface(newMesh);
-       BKE_mesh_convert_mfaces_to_mpolys(newMesh);
-       BKE_mesh_calc_normals(newMesh);
-
-       if (reproject_vertex_paint && oldMesh_color) {
-               MVert *newMesh_verts =  newMesh->mvert;
-               MLoop* loops = newMesh->mloop;
-               MLoopCol *newMesh_color = CustomData_add_layer(&newMesh->ldata, 
CD_MLOOPCOL, CD_CALLOC, NULL, newMesh->totloop);
-
-               for(int i = 0; i < newMesh->totloop; i++) {
-                       float from_co[3];
-                       BVHTreeNearest nearest;
-                       nearest.index = -1;
-                       nearest.dist_sq = FLT_MAX;
-                       copy_v3_v3(from_co, newMesh_verts[loops[i].v].co);
-                       BLI_bvhtree_find_nearest(bvhtree.tree, from_co, 
&nearest, bvhtree.nearest_callback, &bvhtree);
-
-                       if (nearest.index != -1) {
-                               MLoopCol c = oldMesh_color[nearest.index];
-                               //printf("MAPPED %d %d %d %d %d %d \n", i, 
nearest.index, c.r, c.g, c.b, c.a);
-                               newMesh_color[i].r = c.r;
-                               newMesh_color[i].g = c.g;
-                               newMesh_color[i].b = c.b;
-                               newMesh_color[i].a = c.a;
-                       }
-                       else {
-                               newMesh_color[i].r = 255;
-                               newMesh_color[i].g = 255;
-                               newMesh_color[i].b = 255;
-                               newMesh_color[i].a = 255;
-                       }
+       if (reproject_vertex_paint)
+       {
+               BKE_remesh_voxel_reproje

@@ 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