[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Gzz-commits] libvob/include/vob/vobs Fillet.hxx
From: |
Janne V. Kujala |
Subject: |
[Gzz-commits] libvob/include/vob/vobs Fillet.hxx |
Date: |
Wed, 02 Jul 2003 10:53:02 -0400 |
CVSROOT: /cvsroot/libvob
Module name: libvob
Branch:
Changes by: Janne V. Kujala <address@hidden> 03/07/02 10:53:02
Modified files:
include/vob/vobs: Fillet.hxx
Log message:
more triangulation code
CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/libvob/libvob/include/vob/vobs/Fillet.hxx.diff?tr1=1.38&tr2=1.39&r1=text&r2=text
Patches:
Index: libvob/include/vob/vobs/Fillet.hxx
diff -u libvob/include/vob/vobs/Fillet.hxx:1.38
libvob/include/vob/vobs/Fillet.hxx:1.39
--- libvob/include/vob/vobs/Fillet.hxx:1.38 Wed Jul 2 09:23:51 2003
+++ libvob/include/vob/vobs/Fillet.hxx Wed Jul 2 10:53:02 2003
@@ -39,9 +39,10 @@
#include <vob/glerr.hxx>
-#include <vob/geom/Fillets.hxx>
#include <vob/geom/Fillets2.hxx>
+#include <vob/poly/Dicer.hxx>
+
#ifndef VOB_DEFINED
#define VOB_DEFINED(t)
#endif
@@ -749,6 +750,16 @@
int N;
float r;
+ int append(ZVec v, bool b = false) {
+ int ind = size();
+ if (b)
+ push_back(Vert(v, b));
+ else
+ push_back(f.blend(conns, N, r, v));
+
+ return ind;
+ }
+
int operator() (int i, int j, float fract = .5) {
int ind = size();
push_back(f.blend(conns, N, r,
@@ -781,7 +792,24 @@
};
-
+ void addSpan(std::vector<int> &poly, Verts &verts, int i0, int i1, ZVec
d0, ZVec d1) const {
+ int i, k0 = i0, k1 = i0;
+ float d0min = 1E20;
+ float d1min = 1E20;
+ for (i = i0; i < i1; i++) {
+ float dist0 = (verts[i] - d0).length();
+ float dist1 = (verts[i] - d1).length();
+ if (dist0 < d0min) d0min = dist0, k0 = i;
+ if (dist1 < d1min) d1min = dist1, k1 = i;
+ }
+
+ i = k0;
+ do {
+ poly.push_back(i);
+ if (++i == i1) i = i0;
+ } while (i != k1);
+
+ }
void render(const Transform **t, int n) const {
const Transform &thick_t = *t[0];
@@ -854,6 +882,60 @@
glVertex(p0 + 3 * r * dirs[tri[i][2]]);
glEnd();
}
+
+
+ // Add the vertices of the diced midsections of the connectors
+ Verts verts(*this, conns, N, r);
+ for (i = 0; i < N; i++) {
+ float t = 0.5 * conns[i]->c.t;
+ float d = conns[i]->c.d;
+
+ ZVec e0 = conns[i]->dir;
+ ZVec e1 = e0.crossp(ZVec(0,0,1));
+ ZVec e2 = e0.crossp(e1);
+
+ ZVec p0 = d * e0;
+
+ for (j = 0; j < ndice; j++) {
+ float a = j * M_PI * 2 / ndice;
+ verts.append(p0 + t * (e1 * cos(a) + e2 * sin(a)), true);
+ }
+ }
+
+ // Add the dummy connector vertices
+ int dummy_i0 = verts.size();
+ for (i = N; i < (int)dirs.size(); i++) {
+ verts.append(dirs[i]);
+ }
+
+ // Triangulate the surface
+ ::Vob::Dicer::Triangles<Verts> triangler(verts);
+ for (i = 0; i < (int)tri.size(); i++) {
+ std::vector<int> poly;
+ for (j = 0; j < 3; j++) {
+ int k = tri[i][j];
+ if (k >= N) {
+ poly.push_back(dummy_i0 + k - N);
+ } else {
+ int k0 = tri[i][(j+1)%3];
+ int k1 = tri[i][(j+2)%3];
+ if ((dirs[k0] - dirs[k]).crossp(dirs[k1] -
dirs[k]).dot(dirs[k]) < 0)
+ k0 ^= k1 ^= k0 ^= k1; // Swap
+
+ addSpan(poly, verts, ndice * k, ndice * (k + 1), dirs[k0],
dirs[k1]);
+ }
+ }
+
+ // Triangulate as a star polygon
+ ZVec sum(0,0,0);
+ for (j = 0; j < (int)poly.size(); j++)
+ sum += verts[poly[j]];
+
+ int nvert = verts.append(sum);
+ for (j = 0; j < (int)poly.size(); j++)
+ triangler.add(nvert, poly[j], poly[(j+1) % poly.size()]);
+ }
+
ZVec pt[ndice + 1][ndice*2];