dust3d/thirdparty/instant-meshes/instant-meshes-dust3d/src/adjacency.h

78 lines
2.4 KiB
C++

/*
aabb.h -- functionality for creating adjacency matrices together with
uniform or cotangent weights. Also contains data structures
used to store integer variables.
This file is part of the implementation of
Instant Field-Aligned Meshes
Wenzel Jakob, Daniele Panozzo, Marco Tarini, and Olga Sorkine-Hornung
In ACM Transactions on Graphics (Proc. SIGGRAPH Asia 2015)
All rights reserved. Use of this source code is governed by a
BSD-style license that can be found in the LICENSE.txt file.
*/
#pragma once
#include "common.h"
/* Stores integer jumps between nodes of the adjacency matrix */
struct IntegerVariable {
unsigned short rot : 2;
signed short translate_u : 7;
signed short translate_v : 7;
Vector2i shift() const {
return Vector2i(translate_u, translate_v);
}
void setShift(Vector2i &v) {
translate_u = v.x();
translate_v = v.y();
}
};
/* Stores a weighted adjacency matrix entry together with integer variables */
struct Link {
uint32_t id;
float weight;
union {
IntegerVariable ivar[2];
uint32_t ivar_uint32;
};
inline Link() { }
inline Link(uint32_t id) : id(id), weight(1.0f), ivar_uint32(0u) { }
inline Link(uint32_t id, float weight) : id(id), weight(weight), ivar_uint32(0u) { }
inline bool operator<(const Link &link) const { return id < link.id; }
} ;
typedef Link** AdjacencyMatrix;
extern AdjacencyMatrix generate_adjacency_matrix_uniform(
const MatrixXu &F, const VectorXu &V2E,
const VectorXu &E2E, const VectorXb &nonManifold,
const ProgressCallback &progress = ProgressCallback());
extern AdjacencyMatrix generate_adjacency_matrix_cotan(
const MatrixXu &F, const MatrixXf &V, const VectorXu &V2E,
const VectorXu &E2E, const VectorXb &nonManifold,
const ProgressCallback &progress = ProgressCallback());
inline Link &search_adjacency(AdjacencyMatrix &adj, uint32_t i, uint32_t j) {
for (Link* l = adj[i]; l != adj[i+1]; ++l)
if (l->id == j)
return *l;
throw std::runtime_error("search_adjacency: failure!");
}
class BVH;
struct MeshStats;
extern AdjacencyMatrix generate_adjacency_matrix_pointcloud(
MatrixXf &V, MatrixXf &N, const BVH *bvh, MeshStats &stats,
uint32_t knn_points, bool deterministic = false,
const ProgressCallback &progress = ProgressCallback());