Commit: 8189fb9542b733ea24446393154963473fa78dc7
Author: Jacques Lucke
Date:   Mon Jan 28 22:47:21 2019 +0100
Branches: rigid_deform
https://developer.blender.org/rB8189fb9542b733ea24446393154963473fa78dc7

big cleanup

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

M       source/blender/modifiers/CMakeLists.txt
M       source/blender/modifiers/intern/MOD_rigiddeform.c
M       source/blender/modifiers/intern/MOD_rigiddeform_system.cc
M       source/blender/modifiers/intern/MOD_rigiddeform_system.h
A       source/blender/modifiers/intern/MOD_rigiddeform_system.hpp
A       source/blender/modifiers/intern/MOD_rigiddeform_system_wrapper.cc

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

diff --git a/source/blender/modifiers/CMakeLists.txt 
b/source/blender/modifiers/CMakeLists.txt
index 0e8ac3759e7..5dc11daae3c 100644
--- a/source/blender/modifiers/CMakeLists.txt
+++ b/source/blender/modifiers/CMakeLists.txt
@@ -85,6 +85,7 @@ set(SRC
        intern/MOD_remesh.c
        intern/MOD_rigiddeform.c
        intern/MOD_rigiddeform_system.cc
+       intern/MOD_rigiddeform_system_wrapper.cc
        intern/MOD_screw.c
        intern/MOD_shapekey.c
        intern/MOD_shrinkwrap.c
@@ -114,6 +115,7 @@ set(SRC
        intern/MOD_fluidsim_util.h
        intern/MOD_meshcache_util.h
        intern/MOD_rigiddeform_system.h
+       intern/MOD_rigiddeform_system.hpp
        intern/MOD_util.h
        intern/MOD_weightvg_util.h
 )
diff --git a/source/blender/modifiers/intern/MOD_rigiddeform.c 
b/source/blender/modifiers/intern/MOD_rigiddeform.c
index 8844e576723..bef02da1339 100644
--- a/source/blender/modifiers/intern/MOD_rigiddeform.c
+++ b/source/blender/modifiers/intern/MOD_rigiddeform.c
@@ -53,7 +53,7 @@ typedef RigidDeformModifierBindData BindData;
 /* ************* Cache **************** */
 
 typedef struct Cache {
-       struct RigidDeformSystem *system;
+       RigidDeformSystemRef system;
 } Cache;
 
 static Cache *cache_new(void)
@@ -200,11 +200,14 @@ static void deform_vertices(RigidDeformModifierData 
*rdmd, Mesh *mesh, VectorArr
        Cache *cache = (Cache *)rdmd->cache;
 
        if (cache->system == NULL) {
-               cache->system = RigidDeformSystem_new(mesh);
-               RigidDeformSystem_setAnchors(cache->system, 
rdmd->bind_data->anchor_indices, rdmd->bind_data->anchor_amount);
+               cache->system = RigidDeformSystem_from_mesh(mesh);
+               RigidDeformSystem_set_anchors(
+                       cache->system,
+                       (uint *)rdmd->bind_data->anchor_indices,
+                       (uint)rdmd->bind_data->anchor_amount);
        }
 
-       RigidDeformSystem_correctNonAnchors(cache->system, vertex_cos, 
rdmd->iterations);
+       RigidDeformSystem_correct_inner(cache->system, vertex_cos, 
rdmd->iterations);
 }
 
 static RigidDeformModifierData *get_original_modifier_data(
diff --git a/source/blender/modifiers/intern/MOD_rigiddeform_system.cc 
b/source/blender/modifiers/intern/MOD_rigiddeform_system.cc
index 9e9ce1e2072..63873a14767 100644
--- a/source/blender/modifiers/intern/MOD_rigiddeform_system.cc
+++ b/source/blender/modifiers/intern/MOD_rigiddeform_system.cc
@@ -23,166 +23,14 @@
  *
  */
 
-#include "Eigen/Sparse"
-#include "Eigen/Dense"
-
-#include "DNA_mesh_types.h"
-#include "DNA_meshdata_types.h"
-
-#include "BKE_mesh_runtime.h"
-
+#include "MOD_rigiddeform_system.hpp"
 #include "BLI_math.h"
 
-#include "MOD_rigiddeform_system.h"
-
-#include <iostream>
-#include <vector>
-#include <set>
-#include <unordered_set>
-
-#include <chrono>
-#include <iostream>
-
-/* ************** Timer ***************** */
-
-class Timer {
-    const char *name;
-    std::chrono::high_resolution_clock::time_point start, end;
-    std::chrono::duration<float> duration;
-
-public:
-    Timer(const char *name = "");
-    ~Timer();
-};
-
-Timer::Timer(const char *name) {
-    this->name = name;
-    this->start = std::chrono::high_resolution_clock::now();
-}
-
-Timer::~Timer() {
-    end = std::chrono::high_resolution_clock::now();
-    duration = end - start;
-    double ms = duration.count() * 1000.0f;
-    std::cout << "Timer '" << name << "' took " << ms << " ms" << std::endl;
-}
-
-#define TIMEIT(name) Timer t(name);
-
-/* ************ Timer End *************** */
-
-
-typedef Eigen::Map<Eigen::VectorXf, 0, Eigen::InnerStride<3>> StridedVector;
-typedef Eigen::SparseMatrix<float, Eigen::ColMajor> SparseMatrixF;
-typedef Eigen::SparseMatrix<double, Eigen::ColMajor> SparseMatrixD;
-typedef Eigen::Triplet<float> Triplet;
-
-struct WeightedEdge {
-       int v1, v2;
-       float weight;
-};
-
-
-class Vectors {
-       Eigen::VectorXf data;
-
-public:
-       Vectors() {}
-
-       Vectors(int size)
-       {
-               this->data = Eigen::VectorXf(size * 3);
-       }
-
-       Vectors(std::vector<Eigen::Vector3f> &vectors)
-               : Vectors((Vector3Ds)&vectors[0][0], vectors.size()) {}
-
-       Vectors(Vector3Ds vectors, int amount)
-       {
-               this->data = Eigen::VectorXf(3 * amount);
-               memcpy(&this->data[0], vectors, this->byte_size());
-       }
-
-       void set_zero()
-       {
-               this->data.setZero();
-       }
-
-       StridedVector get_coord(int coord)
-       {
-               return StridedVector(this->data.data() + coord, this->size());
-       }
-
-       void set_coord(int coord, Eigen::VectorXf &values)
-       {
-               BLI_assert(values.size() == this->size());
-               this->get_coord(coord) = values;
-       }
-
-       void copy_to(Vector3Ds dst)
-       {
-               memcpy(dst, &this->data[0], this->byte_size());
-       }
-
-       float *get_vector_ptr(int index)
-       {
-               return this->ptr() + (3 * index);
-       }
-
-       void set_vector_ptr(int index, float *vector)
-       {
-               memcpy(this->ptr() + (3 * index), vector, sizeof(float) * 3);
-       }
-
-       Eigen::Map<Eigen::Vector3f> operator [](int index)
-       {
-               return Eigen::Map<Eigen::Vector3f>(this->get_vector_ptr(index));
-       }
-
-       float *ptr()
-       {
-               return &this->data[0];
-       }
-
-       int size()
-       {
-               return this->data.size() / 3;
-       }
-
-       int byte_size()
-       {
-               return this->size() * 3 * sizeof(float);
-       }
-
-       void print(std::string name){
-               std::cout << name << ":" << std::endl;
-               for (int i = 0; i < this->size(); i++) {
-                       float *vector = this->get_vector_ptr(i);
-                       printf("  %7.3f %7.3f %7.3f\n", vector[0], vector[1], 
vector[2]);
-               }
-       }
-};
-
-static std::vector<float> calcTotalWeigthPerVertex(std::vector<WeightedEdge> 
&edges, int vertex_amount)
-{
-       std::vector<float> total_weights(vertex_amount, 0);
-       for (WeightedEdge edge : edges) {
-               total_weights[edge.v1] += edge.weight;
-               total_weights[edge.v2] += edge.weight;
-       }
-       return total_weights;
-}
-
-static void printSparseMatrix(SparseMatrixF &matrix)
-{
-       std::cout << std::endl << Eigen::MatrixXf(matrix) << std::endl << 
std::endl;
-}
-
 /* expects the anchor indices to be sorted */
 /* (6, [1, 4]) -> [0, 2, 3, 5,  1, 4] */
-static std::vector<int> sortVerticesByAnchors(int vertex_amount, 
std::vector<int> &anchors)
+static std::vector<uint> sort_vertices_by_anchors(const std::vector<uint> 
&anchors, uint vertex_amount)
 {
-       std::vector<int> sorted;
+       std::vector<uint> sorted;
 
        int anchor_index = 0;
        for (int i = 0; i < vertex_amount; i++) {
@@ -197,116 +45,61 @@ static std::vector<int> sortVerticesByAnchors(int 
vertex_amount, std::vector<int
        return sorted;
 }
 
-static Vectors getVertexPositions(Mesh *mesh)
-{
-       std::vector<Eigen::Vector3f> positions;
-
-       for (int i = 0; i < mesh->totvert; i++) {
-               Eigen::Vector3f position;
-               copy_v3_v3(&position[0], mesh->mvert[i].co);
-               positions.push_back(position);
-       }
-
-       return positions;
-}
+/* Build Laplace Matrix
+ ******************************************/
 
-static std::vector<std::array<int, 3>> getTriangleIndices(Mesh *mesh)
+static std::vector<double> calc_total_weight_per_vertex(
+               const std::vector<WeightedEdge> &edges,
+               uint vertex_amount)
 {
-       std::vector<std::array<int, 3>> indices;
-
-       const MLoopTri *triangles = BKE_mesh_runtime_looptri_ensure(mesh);
-       int triangle_amount = BKE_mesh_runtime_looptri_len(mesh);
-
-       for (int i = 0; i < triangle_amount; i++) {
-               int v1 = mesh->mloop[triangles[i].tri[0]].v;
-               int v2 = mesh->mloop[triangles[i].tri[1]].v;
-               int v3 = mesh->mloop[triangles[i].tri[2]].v;
-               indices.push_back({v1, v2, v3});
+       std::vector<double> total_weights(vertex_amount, 0);
+       for (WeightedEdge edge : edges) {
+               total_weights[edge.v1] += edge.weight;
+               total_weights[edge.v2] += edge.weight;
        }
-
-       return indices;
+       return total_weights;
 }
 
-struct ReorderData
+static std::array<double, 3> triangle_angles(
+       Eigen::Vector3d v1, Eigen::Vector3d v2, Eigen::Vector3d v3)
 {
-private:
-       std::vector<int> orig_to_new;
-       std::vector<int> new_to_orig;
-       int _inner_amount;
-
-public:
-
-       ReorderData() {}
-
-       ReorderData(std::vector<int> &anchors, int vertex_amount)
-       {
-               this->new_to_orig = sortVerticesByAnchors(vertex_amount, 
anchors);
-
-               this->orig_to_new.resize(vertex_amount);
-               for (int i = 0; i < vertex_amount; i++) {
-                       orig_to_new[new_to_orig[i]] = i;
-               }
-
-               this->_inner_amount = vertex_amount - anchors.size();
-       }
-
-       int inner_amount()
-       {
-               return this->_inner_amount;
-       }
-
-       bool is_inner__orig(int index)
-       {
-               return this->orig_to_new[index] < this->_inner_amount;
-       }
-
-       bool is_inner__new(int index)
-       {
-               return index < this->_inner_amount;
-       }
+       Eigen::Vector3f v1_f = v1.cast<float>();
+       Eigen::Vector3f v2_f = v2.cast<float>();
+       Eigen::Vector3f v3_f = v3.cast<float>();
 
-       int to_orig(int index)
-       {
-               return this->new_to_orig[index];
-       }
-
-       int to_new(int index)
-       {
-               return this->orig_to_new[index];
-       }
-
-       int to_new_anchor(int index)
-       {
-               return this->to_new(index) - this->inner_amount();
-       }
-};
+       float angles[3];
+       angle_tri_v3(angles, v1_f.data(), v2_f.data(), v3_f.data());
+       return {angles[0], angles[1], angles[2]};
+}
 
-static std::vector<WeightedEdge> calculateEdgeWeights_FromTriangles_Cotan(
-        Vectors &positions, std::vector<std::array<int, 3>> &triangles)
+static std::vector<WeightedEdge> calculate_cotan_weights(
+       const Vectors &positions,
+       const std::vector<std::array<uint, 3>> &triangles)
 {
-       std::vector<WeightedEdge> edges(triangles.size() * 3);
+       std::vector<WeightedEdge> edges;
+       edges.reserve(triangles.size() * 3);
 
        for (auto verts : triangles) {
-               float angles[3];
-               angle_tri_v3(angles,
-                       positions.get_vector_ptr(verts[0]),
-                       positions.get_vector_ptr(verts[1]),
-                       positions.get_vector_ptr(verts[2]));
-
-#define cotan(x) cos((x))/sin((x))
-               edges.push_back((WeightedEdge){verts[1], verts[2], 
cotan(angles[0]) / 2.0f});
-               edges.push_back((WeightedEdge){verts[0], verts[2], 
cotan(angles[1]) / 2.0f});
-               edges.push_back((WeightedEdge){verts[0], verts[1], 
cotan(angles[2]) / 2.0f});
+               std::cout << verts[0] << " " << verts[1] << " " << verts[2] << 
std::endl;
+               std::array<double, 3> angles = triangle_angles(
+                       positions[verts[0]],
+                       positions[verts[1]],
+                       positions[verts[2]]);
+
+#define cotan(x) std::cos((x))/std::sin((x))
+               edges.push_back(WeightedEdge(verts[1], verts[2], 
cotan(angles[0]) / 2.0));
+               edges.push_back(WeightedEdge(verts[0], verts[2], 
cotan(angles[1]) / 2.0));
+               edges.push_back(WeightedEdge(verts[0], verts[1], 
cotan(angles[2]) / 2.0));
 #undef cotan
        }
 
        return edges;
 }
 
-static std::vector<Triplet> getLaplaceMatrixTr

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