Water tight boundaries between tiles

pull/904/head
Piero Toffanin 2018-10-12 14:33:09 -04:00
rodzic 496cbf25f4
commit f85a8c92ec
2 zmienionych plików z 21 dodań i 14 usunięć

Wyświetl plik

@ -283,7 +283,7 @@ class SymetricMatrix {
namespace Simplify namespace Simplify
{ {
// Global Variables & Strctures // Global Variables & Strctures
struct Triangle { int v[3];double err[4];int deleted,dirty;vec3f n; }; struct Triangle { int v[3];double err[4];int8_t deleted,dirty;vec3f n; };
struct Vertex { vec3f p;int tstart,tcount;SymetricMatrix q;int border;}; struct Vertex { vec3f p;int tstart,tcount;SymetricMatrix q;int border;};
struct Ref { int tid,tvertex; }; struct Ref { int tid,tvertex; };
std::vector<Triangle> triangles; std::vector<Triangle> triangles;
@ -310,10 +310,10 @@ namespace Simplify
void simplify_mesh(int target_count, double agressiveness=7, bool verbose=false) void simplify_mesh(int target_count, double agressiveness=7, bool verbose=false)
{ {
// init // init
loopi(0,triangles.size()) // loopi(0,triangles.size())
{ // {
triangles[i].deleted=0; // triangles[i].deleted=0;
} // }
// main iteration loop // main iteration loop
int deleted_triangles=0; int deleted_triangles=0;
@ -352,7 +352,8 @@ namespace Simplify
{ {
Triangle &t=triangles[i]; Triangle &t=triangles[i];
if(t.err[3]>threshold) continue; if(t.err[3]>threshold) continue;
if(t.deleted) continue; if(t.deleted == 1) continue;
if(t.deleted == -1) continue;
if(t.dirty) continue; if(t.dirty) continue;
loopj(0,3)if(t.err[j]<threshold) loopj(0,3)if(t.err[j]<threshold)
@ -406,7 +407,7 @@ namespace Simplify
void simplify_mesh_lossless(bool verbose=false) void simplify_mesh_lossless(bool verbose=false)
{ {
// init // init
loopi(0,triangles.size()) triangles[i].deleted=0; // loopi(0,triangles.size()) triangles[i].deleted=0;
// main iteration loop // main iteration loop
int deleted_triangles=0; int deleted_triangles=0;
@ -436,8 +437,9 @@ namespace Simplify
{ {
Triangle &t=triangles[i]; Triangle &t=triangles[i];
if(t.err[3]>threshold) continue; if(t.err[3]>threshold) continue;
if(t.deleted) continue; if(t.deleted == 1) continue;
if(t.dirty) continue; if(t.deleted == -1) continue;
if(t.dirty) continue;
loopj(0,3)if(t.err[j]<threshold) loopj(0,3)if(t.err[j]<threshold)
{ {
@ -497,7 +499,7 @@ namespace Simplify
loopk(0,v0.tcount) loopk(0,v0.tcount)
{ {
Triangle &t=triangles[refs[v0.tstart+k].tid]; Triangle &t=triangles[refs[v0.tstart+k].tid];
if(t.deleted)continue; if(t.deleted == 1)continue;
int s=refs[v0.tstart+k].tvertex; int s=refs[v0.tstart+k].tvertex;
int id1=t.v[(s+1)%3]; int id1=t.v[(s+1)%3];
@ -530,7 +532,8 @@ namespace Simplify
{ {
Ref &r=refs[v.tstart+k]; Ref &r=refs[v.tstart+k];
Triangle &t=triangles[r.tid]; Triangle &t=triangles[r.tid];
if(t.deleted)continue; if(t.deleted == 1)continue;
if(deleted[k]) if(deleted[k])
{ {
t.deleted=1; t.deleted=1;
@ -555,7 +558,7 @@ namespace Simplify
{ {
int dst=0; int dst=0;
loopi(0,triangles.size()) loopi(0,triangles.size())
if(!triangles[i].deleted) if(triangles[i].deleted == 0 || triangles[i].deleted == -1)
{ {
triangles[dst++]=triangles[i]; triangles[dst++]=triangles[i];
} }
@ -677,7 +680,7 @@ namespace Simplify
vertices[i].tcount=0; vertices[i].tcount=0;
} }
loopi(0,triangles.size()) loopi(0,triangles.size())
if(!triangles[i].deleted) if(triangles[i].deleted == 0 || triangles[i].deleted == -1)
{ {
Triangle &t=triangles[i]; Triangle &t=triangles[i];
triangles[dst++]=t; triangles[dst++]=t;

Wyświetl plik

@ -128,7 +128,7 @@ int main(int argc, char **argv) {
// to remain within INT_MAX vertices. This does not happen often, // to remain within INT_MAX vertices. This does not happen often,
// but it's a safeguard to make sure we'll get an output and not // but it's a safeguard to make sure we'll get an output and not
// overflow. // overflow.
int stride = 4; int stride = 1;
while (vertex_count > INT_MAX){ while (vertex_count > INT_MAX){
stride *= 2; stride *= 2;
vertex_count = static_cast<int>(std::ceil((arr_height / static_cast<double>(stride))) * vertex_count = static_cast<int>(std::ceil((arr_height / static_cast<double>(stride))) *
@ -191,6 +191,8 @@ int main(int argc, char **argv) {
t1.v[0] = cols * (y + 1) + x; t1.v[0] = cols * (y + 1) + x;
t1.v[1] = cols * y + x + 1; t1.v[1] = cols * y + x + 1;
t1.v[2] = cols * y + x; t1.v[2] = cols * y + x;
/*if (y == 0 || x == 0 || y == rows - 1 || x == cols -1) t1.deleted = -1; // freeze
else */t1.deleted = 0;
Simplify::triangles.push_back(t1); Simplify::triangles.push_back(t1);
@ -198,6 +200,8 @@ int main(int argc, char **argv) {
t2.v[0] = cols * (y + 1) + x; t2.v[0] = cols * (y + 1) + x;
t2.v[1] = cols * (y + 1) + x + 1; t2.v[1] = cols * (y + 1) + x + 1;
t2.v[2] = cols * y + x + 1; t2.v[2] = cols * y + x + 1;
/*if (y == 0 || x == 0 || y == rows - 1 || x == cols -1) t2.deleted = -1; // freeze
else */t1.deleted = 0;
Simplify::triangles.push_back(t2); Simplify::triangles.push_back(t2);
} }