Skip to content

Commit

Permalink
further fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
elalish committed Oct 12, 2024
1 parent 27017b8 commit 4a07da3
Show file tree
Hide file tree
Showing 4 changed files with 22 additions and 20 deletions.
4 changes: 4 additions & 0 deletions include/manifold/common.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ namespace la = linalg;
using vec2 = la::vec<double, 2>;
using vec3 = la::vec<double, 3>;
using vec4 = la::vec<double, 4>;
using bvec4 = la::vec<bool, 4>;
using mat2 = la::mat<double, 2, 2>;
using mat3x2 = la::mat<double, 3, 2>;
using mat4x2 = la::mat<double, 4, 2>;
Expand All @@ -50,6 +51,9 @@ constexpr double kHalfPi = 1.57079632679489661923132169163975144;
inline double radians(double a) { return a * kPi / 180; }
inline double degrees(double a) { return a * 180 / kPi; }

inline mat3x4 Identity3x4() { return mat3x4(mat3(la::identity), vec3(0.0)); }
inline mat2x3 Identity2x3() { return mat2x3(mat2(la::identity), vec2(0.0)); }

/**
* Sine function where multiples of 90 degrees come out exact.
*
Expand Down
12 changes: 6 additions & 6 deletions src/smoothing.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ struct InterpTri {
cosTheta = -cosTheta;
}

if (cosTheta > 1.0 - la::epsilon<double>()) {
if (cosTheta > 1.0 - std::numeric_limits<double>::epsilon()) {
return la::lerp(x, z, a); // for numerical stability
} else {
double angle = std::acos(cosTheta);
Expand Down Expand Up @@ -181,7 +181,7 @@ struct InterpTri {
impl->vertPos_[impl->halfedge_[halfedges[1]].startVert],
impl->vertPos_[impl->halfedge_[halfedges[2]].startVert],
halfedges[3] < 0
? vec3(0)
? vec3(0.0)
: impl->vertPos_[impl->halfedge_[halfedges[3]].startVert]};

for (const int i : {0, 1, 2, 3}) {
Expand All @@ -191,7 +191,7 @@ struct InterpTri {
}
}

vec4 posH(0);
vec4 posH(0.0);

if (halfedges[3] < 0) { // tri
const mat4x3 tangentR = {impl->halfedgeTangent_[halfedges[0]],
Expand Down Expand Up @@ -568,7 +568,7 @@ void Manifold::Impl::SetNormals(int normalIdx, double minSharpAngle) {
(triIsFlatFace[here.face] && triIsFlatFace[next.face] &&
!meshRelation_.triRef[here.face].SameFace(
meshRelation_.triRef[next.face]))) {
normals.push_back(vec3(0));
normals.push_back(vec3(0.0));
}
group.push_back(normals.size() - 1);
if (std::isfinite(next.edgeVec.x)) {
Expand Down Expand Up @@ -680,7 +680,7 @@ void Manifold::Impl::DistributeTangents(const Vec<bool>& fixedHalfedges) {
halfedge = NextHalfedge(halfedge_[halfedge].pairedHalfedge);
}

vec3 normal(0);
vec3 normal(0.0);
Vec<double> currentAngle;
Vec<double> desiredAngle;

Expand Down Expand Up @@ -812,7 +812,7 @@ void Manifold::Impl::CreateTangents(int normalIdx) {
vertPos_[halfedge_[halfedge].startVert];
const vec3 dir = la::cross(here.normal, next.normal);
tangent[halfedge] = CircularTangent(
la::sign(la::dot(dir, edgeVec)) * dir, edgeVec);
(la::dot(dir, edgeVec) < 0 ? -1.0 : 1.0) * dir, edgeVec);
} else {
tangent[halfedge] = TangentFromNormal(here.normal, halfedge);
}
Expand Down
23 changes: 12 additions & 11 deletions src/subdivision.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -89,15 +89,15 @@ class Partition {
return partition;
}

Vec<ivec3> Reindex(ivec4 triVerts, ivec4 edgeOffsets, la::bvec4 edgeFwd,
Vec<ivec3> Reindex(ivec4 triVerts, ivec4 edgeOffsets, bvec4 edgeFwd,
int interiorOffset) const {
Vec<int> newVerts;
newVerts.reserve(vertBary.size());
ivec4 triIdx = idx;
ivec4 outTri = {0, 1, 2, 3};
if (triVerts[3] < 0 && idx[1] != Next3(idx[0])) {
triIdx = {idx[2], idx[0], idx[1], idx[3]};
edgeFwd = la::not_(edgeFwd);
edgeFwd = !edgeFwd;
std::swap(outTri[0], outTri[1]);
}
for (const int i : {0, 1, 2, 3}) {
Expand Down Expand Up @@ -259,7 +259,7 @@ class Partition {
// are zero, in which case a terminal triangulation is performed.
static void PartitionQuad(Vec<ivec3>& triVert, Vec<vec4>& vertBary,
ivec4 cornerVerts, ivec4 edgeOffsets,
ivec4 edgeAdded, la::bvec4 edgeFwd) {
ivec4 edgeAdded, bvec4 edgeFwd) {
auto GetEdgeVert = [&](int edge, int idx) {
return edgeOffsets[edge] + (edgeFwd[edge] ? 1 : -1) * idx;
};
Expand Down Expand Up @@ -326,7 +326,7 @@ class Partition {
ivec4 newEdgeOffsets = {edgeOffsets[1], -1,
GetEdgeVert(3, edgeAdded[3] + 1), edgeOffsets[0]};
ivec4 newEdgeAdded = {0, -1, 0, edgeAdded[0]};
la::bvec4 newEdgeFwd = {edgeFwd[1], true, edgeFwd[3], edgeFwd[0]};
bvec4 newEdgeFwd = {edgeFwd[1], true, edgeFwd[3], edgeFwd[0]};

for (int i = 1; i < partitions; ++i) {
const int cornerOffset1 = (edgeAdded[1] * i) / partitions;
Expand Down Expand Up @@ -461,7 +461,7 @@ void Manifold::Impl::FillRetainedVerts(Vec<Barycentric>& vertBary) const {
for (const int i : {0, 1, 2}) {
const BaryIndices indices = GetIndices(3 * tri + i);
if (indices.start4 < 0) continue; // skip quad interiors
vec4 uvw(0);
vec4 uvw(0.0);
uvw[indices.start4] = 1;
vertBary[halfedge_[3 * tri + i].startVert] = {indices.tri, uvw};
}
Expand Down Expand Up @@ -505,11 +505,12 @@ Vec<Barycentric> Manifold::Impl::Subdivide(
return;
}
const vec3 vec = vertPos_[edge.first] - vertPos_[edge.second];
const vec4 tangent0 =
halfedgeTangent_.empty() ? vec4(0) : halfedgeTangent_[hIdx];
const vec4 tangent0 = halfedgeTangent_.empty()
? vec4(0.0)
: halfedgeTangent_[hIdx];
const vec4 tangent1 =
halfedgeTangent_.empty()
? vec4(0)
? vec4(0.0)
: halfedgeTangent_[halfedge_[hIdx].pairedHalfedge];
edgeAdded[i] = edgeDivisions(vec, tangent0, tangent1);
});
Expand Down Expand Up @@ -575,7 +576,7 @@ Vec<Barycentric> Manifold::Impl::Subdivide(
const double frac = 1.0 / (n + 1);

for (int i = 0; i < n; ++i) {
vec4 uvw(0);
vec4 uvw(0.0);
uvw[indices.end4] = (i + 1) * frac;
uvw[indices.start4] = 1 - uvw[indices.end4];
vertBary[offset + i].uvw = uvw;
Expand Down Expand Up @@ -624,7 +625,7 @@ Vec<Barycentric> Manifold::Impl::Subdivide(
if (halfedges[0] < 0) return;
ivec4 tri3;
ivec4 edgeOffsets;
la::bvec4 edgeFwd(false);
bvec4 edgeFwd(false);
for (const int i : {0, 1, 2, 3}) {
if (halfedges[i] < 0) {
tri3[i] = -1;
Expand Down Expand Up @@ -764,7 +765,7 @@ Vec<Barycentric> Manifold::Impl::Subdivide(
auto& rel = meshRelation_;
ivec4 tri3;
ivec4 edgeOffsets;
la::bvec4 edgeFwd(true);
bvec4 edgeFwd(true);
for (const int i : {0, 1, 2, 3}) {
if (halfedges[i] < 0) {
tri3[i] = -1;
Expand Down
3 changes: 0 additions & 3 deletions src/utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -249,9 +249,6 @@ inline mat4 Mat4(mat3x4 a) {
return mat4({a[0], 0}, {a[1], 0}, {a[2], 0}, {a[3], 1});
}

inline mat3x4 Identity3x4() { return mat3x4(mat3(la::identity), vec3(0.0)); }
inline mat2x3 Identity2x3() { return mat2x3(mat2(la::identity), vec2(0.0)); }

/** @} */

/** @defgroup Debug
Expand Down

0 comments on commit 4a07da3

Please sign in to comment.