[Bf-blender-cvs] [7be027075fb] temp_bmesh_multires: Add this file

Joseph Eagar noreply at git.blender.org
Fri Mar 26 22:23:40 CET 2021


Commit: 7be027075fb12f99370f86d731753c2d229db883
Author: Joseph Eagar
Date:   Fri Mar 26 14:23:31 2021 -0700
Branches: temp_bmesh_multires
https://developer.blender.org/rB7be027075fb12f99370f86d731753c2d229db883

Add this file

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

A	source/blender/editors/sculpt_paint/sculpt_curvature.c

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

diff --git a/source/blender/editors/sculpt_paint/sculpt_curvature.c b/source/blender/editors/sculpt_paint/sculpt_curvature.c
new file mode 100644
index 00000000000..82c46538317
--- /dev/null
+++ b/source/blender/editors/sculpt_paint/sculpt_curvature.c
@@ -0,0 +1,193 @@
+/*
+ * 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) 2021 by Joseph Eagar
+ * All rights reserved.
+ * Implements curvature analysis for sculpt tools
+ */
+
+/** \file
+ * \ingroup edsculpt
+ */
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_blenlib.h"
+#include "BLI_dial_2d.h"
+#include "BLI_ghash.h"
+#include "BLI_gsqueue.h"
+#include "BLI_hash.h"
+#include "BLI_math.h"
+#include "BLI_math_color_blend.h"
+#include "BLI_task.h"
+#include "BLI_utildefines.h"
+
+#include "BLT_translation.h"
+
+#include "PIL_time.h"
+
+#include "DNA_brush_types.h"
+#include "DNA_customdata_types.h"
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_node_types.h"
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+
+#include "BKE_brush.h"
+#include "BKE_ccg.h"
+#include "BKE_colortools.h"
+#include "BKE_context.h"
+#include "BKE_image.h"
+#include "BKE_kelvinlet.h"
+#include "BKE_key.h"
+#include "BKE_lib_id.h"
+#include "BKE_main.h"
+#include "BKE_mesh.h"
+#include "BKE_mesh_mapping.h"
+#include "BKE_mesh_mirror.h"
+#include "BKE_modifier.h"
+#include "BKE_multires.h"
+#include "BKE_node.h"
+#include "BKE_object.h"
+#include "BKE_paint.h"
+#include "BKE_particle.h"
+#include "BKE_pbvh.h"
+#include "BKE_pointcache.h"
+#include "BKE_report.h"
+#include "BKE_scene.h"
+#include "BKE_screen.h"
+#include "BKE_subdiv_ccg.h"
+#include "BKE_subsurf.h"
+
+#include "DEG_depsgraph.h"
+
+#include "IMB_colormanagement.h"
+
+#include "GPU_immediate.h"
+#include "GPU_immediate_util.h"
+#include "GPU_matrix.h"
+#include "GPU_state.h"
+
+#include "WM_api.h"
+#include "WM_message.h"
+#include "WM_toolsystem.h"
+#include "WM_types.h"
+
+#include "ED_object.h"
+#include "ED_screen.h"
+#include "ED_sculpt.h"
+#include "ED_space_api.h"
+#include "ED_view3d.h"
+#include "paint_intern.h"
+#include "sculpt_intern.h"
+
+#include "RNA_access.h"
+#include "RNA_define.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "bmesh.h"
+#include "bmesh_tools.h"
+
+#include <math.h>
+#include <stdlib.h>
+#include <string.h>
+
+/*
+If you're working with uniform triangle tesselations, the math for
+calculating principle curvatures reduces to doing an eigen decomposition
+of the smoothed normal covariance matrix.
+
+The normal covariance matrix is just:
+
+nx*nx nx*ny nx*nz
+ny*nx ny*ny ny*nz
+nz*nx nz*ny nz*nz
+
+To find principle curvatures, simply subtract neighboring covariance matrices.
+You can do this over any number of neighborhood rings to get more accurate result
+
+*/
+
+BLI_INLINE void normal_covariance(float mat[3][3], float no[3])
+{
+  mat[0][0] = no[0] * no[0];
+  mat[0][1] = no[0] * no[1];
+  mat[0][2] = no[0] * no[2];
+  mat[1][0] = no[1] * no[0];
+  mat[1][1] = no[1] * no[1];
+  mat[1][2] = no[1] * no[2];
+  mat[2][0] = no[2] * no[0];
+  mat[2][1] = no[2] * no[1];
+  mat[2][2] = no[2] * no[2];
+}
+
+bool SCULPT_calc_principle_curvatures(SculptSession *ss,
+                                      SculptVertRef vertex,
+                                      SculptCurvatureData *out)
+{
+  SculptVertexNeighborIter ni;
+  float nmat[3][3], nmat2[3][3];
+  float no[3], no2[3];
+
+  memset(out, 0, sizeof(SculptCurvatureData));
+
+  SCULPT_vertex_normal_get(ss, vertex, no);
+  normal_covariance(nmat, no);
+
+  SCULPT_VERTEX_NEIGHBORS_ITER_BEGIN (ss, vertex, ni) {
+    SCULPT_vertex_normal_get(ss, ni.vertex, no2);
+    sub_v3_v3(no2, no);
+
+    normal_covariance(nmat2, no2);
+
+    add_m3_m3m3(nmat, nmat, nmat2);
+  }
+  SCULPT_VERTEX_NEIGHBORS_ITER_END(ni);
+
+  if (true || !BLI_eigen_solve_selfadjoint_m3(nmat, out->ks, out->principle)) {
+    //do simple power solve in one direction
+
+    float t[3];
+    float t2[3];
+
+    SCULPT_vertex_normal_get(ss, vertex, no);
+    copy_v3_v3(t, no);
+
+    for (int i = 0; i < 15; i++) {
+      if (i > 0) {
+        normalize_v3(t);
+
+        if (i > 1 && len_squared_v3v3(t, t2) < 0.0001) {
+          break;
+        }
+
+        copy_v3_v3(t2, t);
+      }
+
+      mul_m3_v3(nmat, t);
+    }
+
+    out->ks[1] = normalize_v3(t);
+    copy_v3_v3(out->principle[1], t);
+
+    cross_v3_v3v3(out->principle[0], out->principle[1], no);
+    normalize_v3(out->principle[0]);
+  }
+
+  return true;
+}



More information about the Bf-blender-cvs mailing list