[Bf-blender-cvs] [d82bda7b447] soc-2021-porting-modifiers-to-nodes-decimate: initially working node
Fabian Schempp
noreply at git.blender.org
Fri Jul 2 21:56:49 CEST 2021
Commit: d82bda7b44743ed1d92ebc25e89a1d6d1a438852
Author: Fabian Schempp
Date: Wed May 26 00:45:40 2021 +0200
Branches: soc-2021-porting-modifiers-to-nodes-decimate
https://developer.blender.org/rBd82bda7b44743ed1d92ebc25e89a1d6d1a438852
initially working node
===================================================================
M source/blender/nodes/geometry/nodes/node_geo_decimate.cc
===================================================================
diff --git a/source/blender/nodes/geometry/nodes/node_geo_decimate.cc b/source/blender/nodes/geometry/nodes/node_geo_decimate.cc
index ee0aa0d6c81..6cd779a3c31 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_decimate.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_decimate.cc
@@ -16,6 +16,13 @@
#include "UI_interface.h"
#include "UI_resources.h"
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
+#include "BKE_mesh.h"
+#include "BKE_mesh_types.h"
+#include "BKE_deform.h"
+#include "bmesh.h"
+#include "bmesh_tools.h"
#include "node_geometry_util.hh"
@@ -38,11 +45,183 @@ static bNodeSocketTemplate geo_node_decimate_out[] = {
{-1, ""},
};
-namespace blender::nodes {
+namespace blender::nodes{
+
+typedef struct DecimateNodeData {
+ /** (mode == MOD_DECIM_MODE_COLLAPSE). */
+ float percent;
+ /** (mode == MOD_DECIM_MODE_UNSUBDIV). */
+ short iter;
+ /** (mode == MOD_DECIM_MODE_DISSOLVE). */
+ char delimit;
+ /** (mode == MOD_DECIM_MODE_COLLAPSE). */
+ char symmetry_axis;
+ /** (mode == MOD_DECIM_MODE_DISSOLVE). */
+ float angle;
+
+ /** MAX_VGROUP_NAME. */
+ char defgrp_name[64];
+ float defgrp_factor;
+ short flag, mode;
+
+ /* runtime only */
+ int face_count;
+} DecimateNodeData;
+
+static Mesh *decimateMesh(DecimateNodeData *dmd, Mesh *meshData)
+{
+ printf("RUNNING - A\n");
+
+ Mesh *mesh = meshData, *result = NULL;
+ BMesh *bm;
+ bool calc_face_normal;
+ float *vweights = NULL;
+
+#ifdef USE_TIMEIT
+ TIMEIT_START(decim);
+#endif
+
+ /* Set up front so we don't show invalid info in the UI. */
+ //updateFaceCount(ctx, dmd, mesh->totpoly);
+
+ switch (dmd->mode) {
+ case MOD_DECIM_MODE_COLLAPSE:
+ if (dmd->percent == 1.0f) {
+ return mesh;
+ }
+ calc_face_normal = true;
+ break;
+ case MOD_DECIM_MODE_UNSUBDIV:
+ if (dmd->iter == 0) {
+ return mesh;
+ }
+ calc_face_normal = false;
+ break;
+ case MOD_DECIM_MODE_DISSOLVE:
+ if (dmd->angle == 0.0f) {
+ return mesh;
+ }
+ calc_face_normal = true;
+ break;
+ default:
+ return mesh;
+ }
+ printf("RUNNING - B\n");
+ if (dmd->face_count <= 3) {
+ //BKE_modifier_set_error(ctx->object, md, "Modifier requires more than 3 input faces");
+ return mesh;
+ }
+ printf("RUNNING - C\n");
+ if (dmd->mode == MOD_DECIM_MODE_COLLAPSE) {
+ if (dmd->defgrp_name[0] && (dmd->defgrp_factor > 0.0f)) {
+ MDeformVert *dvert;
+ int defgrp_index;
+
+ //MOD_get_vgroup(ctx->object, mesh, dmd->defgrp_name, &dvert, &defgrp_index);
+
+ if (dvert) {
+ const uint vert_tot = mesh->totvert;
+ uint i;
+
+ vweights = (float*)MEM_malloc_arrayN(vert_tot, sizeof(float), __func__);
+
+ if (dmd->flag & MOD_DECIM_FLAG_INVERT_VGROUP) {
+ for (i = 0; i < vert_tot; i++) {
+ vweights[i] = 1.0f - BKE_defvert_find_weight(&dvert[i], defgrp_index);
+ }
+ }
+ else {
+ for (i = 0; i < vert_tot; i++) {
+ vweights[i] = BKE_defvert_find_weight(&dvert[i], defgrp_index);
+ }
+ }
+ }
+ }
+ }
+ printf("RUNNING - D\n");
+ BMeshCreateParams bmesh_create_params = {0};
+ BMeshFromMeshParams bmesh_from_mesh_params = {calc_face_normal,0,0,0,{CD_MASK_ORIGINDEX,CD_MASK_ORIGINDEX,CD_MASK_ORIGINDEX}};
+ bm = BKE_mesh_to_bmesh_ex(mesh, &bmesh_create_params, &bmesh_from_mesh_params);
+
+ switch (dmd->mode) {
+ case MOD_DECIM_MODE_COLLAPSE: {
+ const bool do_triangulate = (dmd->flag & MOD_DECIM_FLAG_TRIANGULATE) != 0;
+ const int symmetry_axis = (dmd->flag & MOD_DECIM_FLAG_SYMMETRY) ? dmd->symmetry_axis : -1;
+ const float symmetry_eps = 0.00002f;
+ BM_mesh_decimate_collapse(bm,
+ dmd->percent,
+ vweights,
+ dmd->defgrp_factor,
+ do_triangulate,
+ symmetry_axis,
+ symmetry_eps);
+ printf("RUNNING - E\n");
+ break;
+ }
+ case MOD_DECIM_MODE_UNSUBDIV: {
+ BM_mesh_decimate_unsubdivide(bm, dmd->iter);
+ break;
+ }
+ case MOD_DECIM_MODE_DISSOLVE: {
+ const bool do_dissolve_boundaries = (dmd->flag & MOD_DECIM_FLAG_ALL_BOUNDARY_VERTS) != 0;
+ BM_mesh_decimate_dissolve(bm, dmd->angle, do_dissolve_boundaries, (BMO_Delimit)dmd->delimit);
+ break;
+ }
+ }
+
+ printf("RUNNING - F\n");
+ if (vweights) {
+ MEM_freeN(vweights);
+ }
+
+ //updateFaceCount(ctx, dmd, bm->totface);
+
+ result = BKE_mesh_from_bmesh_for_eval_nomain(bm, NULL, mesh);
+ /* make sure we never alloc'd these */
+ BLI_assert(bm->vtoolflagpool == NULL && bm->etoolflagpool == NULL && bm->ftoolflagpool == NULL);
+ BLI_assert(bm->vtable == NULL && bm->etable == NULL && bm->ftable == NULL);
+
+ BM_mesh_free(bm);
+
+#ifdef USE_TIMEIT
+ TIMEIT_END(decim);
+#endif
+
+ result->runtime.cd_dirty_vert |= CD_MASK_NORMAL;
+ printf("RUNNING - G\n");
+
+ return result;
+}
+
static void geo_node_decimate_exec(GeoNodeExecParams params)
{
GeometrySet geometry_set = params.extract_input<GeometrySet>("Geometry");
+ if(geometry_set.has_mesh()){
+ Mesh *input_mesh = geometry_set.get_mesh_for_write();
+ DecimateNodeData dmd = {
+ /** (mode == MOD_DECIM_MODE_COLLAPSE). */
+ 0.5f,
+ /** (mode == MOD_DECIM_MODE_UNSUBDIV). */
+ 2,
+ /** (mode == MOD_DECIM_MODE_DISSOLVE). */
+ 5,
+ /** (mode == MOD_DECIM_MODE_COLLAPSE). */
+ 0,
+ /** (mode == MOD_DECIM_MODE_DISSOLVE). */
+ 30,
+
+ /** MAX_VGROUP_NAME. */
+ "",
+ 0.5f,
+ 0,
+ MOD_DECIM_MODE_COLLAPSE,
+ input_mesh->totpoly,
+ };
+ Mesh *result = decimateMesh(&dmd, input_mesh);
+ geometry_set.replace_mesh(result);
+ printf("RUNNING\n");
+ }
params.set_output("Geometry", std::move(geometry_set));
}
} // namespace blender::nodes
More information about the Bf-blender-cvs
mailing list