[Bf-blender-cvs] [4b721f42c87] sculpt-mode-features: use refactored functions for voxel remesh modifier, too
Martin Felke
noreply at git.blender.org
Mon Apr 8 10:42:33 CEST 2019
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. @@
More information about the Bf-blender-cvs
mailing list