[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Gzz-commits] libvob/include/vob geom/Fillets2.hxx vobs/Fille...
From: |
Janne V. Kujala |
Subject: |
[Gzz-commits] libvob/include/vob geom/Fillets2.hxx vobs/Fille... |
Date: |
Fri, 04 Jul 2003 13:29:12 -0400 |
CVSROOT: /cvsroot/libvob
Module name: libvob
Branch:
Changes by: Janne V. Kujala <address@hidden> 03/07/04 13:29:12
Modified files:
include/vob/geom: Fillets2.hxx
include/vob/vobs: Fillet.hxx
Log message:
use glInterleavedArrays
CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/libvob/libvob/include/vob/geom/Fillets2.hxx.diff?tr1=1.29&tr2=1.30&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/libvob/libvob/include/vob/vobs/Fillet.hxx.diff?tr1=1.45&tr2=1.46&r1=text&r2=text
Patches:
Index: libvob/include/vob/geom/Fillets2.hxx
diff -u libvob/include/vob/geom/Fillets2.hxx:1.29
libvob/include/vob/geom/Fillets2.hxx:1.30
--- libvob/include/vob/geom/Fillets2.hxx:1.29 Fri Jul 4 09:57:30 2003
+++ libvob/include/vob/geom/Fillets2.hxx Fri Jul 4 13:29:12 2003
@@ -772,11 +772,10 @@
bool success;
float fract;
ZVec pt = f.point(dirVec(a), success, &fract, .0001);
- if (!success) {
- cout << "ERROR: Point failed for angle "
- << a << " (" << i << ")" << std::endl;
- }
- rtbl[i] = pt.length();
+ if (success)
+ rtbl[i] = pt.length();
+ else
+ rtbl[i] = node.r;
//cout << i << ": " << rtbl[i] << pt << fract << std::endl;
}
rtbl[0] = c.d / cos(a0);
Index: libvob/include/vob/vobs/Fillet.hxx
diff -u libvob/include/vob/vobs/Fillet.hxx:1.45
libvob/include/vob/vobs/Fillet.hxx:1.46
--- libvob/include/vob/vobs/Fillet.hxx:1.45 Fri Jul 4 09:57:30 2003
+++ libvob/include/vob/vobs/Fillet.hxx Fri Jul 4 13:29:12 2003
@@ -697,6 +697,7 @@
for (i = 0; i < N; i++) {
bool success;
float t = conns[i]->rad(pt, success);
+ if (t < r) t = r;
if (success) {
//cout << t << " ";
sum += x[num++] = (t - r) / r;
@@ -725,10 +726,11 @@
}
- struct Vert : ZVec {
- int id;
+ struct Vert {
ZVec norm;
- Vert(const ZVec &v, int id = 0) : ZVec(v), id(id) {}
+ ZVec vert;
+ int id;
+ Vert(const ZVec &v, int id = 0) : vert(v), id(id) {}
};
struct Verts : std::vector<Vert> {
@@ -738,7 +740,7 @@
float r;
bool noblend;
- int append(ZVec v, int id = 0) {
+ int append(const ZVec &v, int id = 0) {
int ind = size();
if (id || noblend)
push_back(Vert(v, id));
@@ -749,11 +751,22 @@
}
int operator() (int i, int j, float fract = .5) {
- return append(lerp(operator[](i), operator[](j), fract));
+ return append(lerp((*this)[i].vert, (*this)[j].vert, fract));
}
Verts(const Fillet3DBlend &f, Conn **conns, int N, float r) :
f(f), conns(conns), N(N), r(r), noblend(false) {}
+
+ void startN3V3Operation() {
+ glPushClientAttrib(GL_CLIENT_VERTEX_ARRAY_BIT);
+ glInterleavedArrays(GL_N3F_V3F, sizeof(Vert), &(operator[](0)));
+ glLockArraysEXT(0, size());
+ }
+ void endN3V3Operation() {
+ glUnlockArraysEXT();
+ glPopClientAttrib();
+ }
+
};
struct DiceCrit {
@@ -769,9 +782,9 @@
if (v[j].id && v[k].id && v[j].id != v[k].id) return 1;
if (v[k].id && v[i].id && v[k].id != v[i].id) return 2;
- float l0 = (v[i] - v[j]).length() * !(v[i].id && v[i].id ==
v[j].id);
- float l1 = (v[j] - v[k]).length() * !(v[j].id && v[j].id ==
v[k].id);
- float l2 = (v[k] - v[i]).length() * !(v[k].id && v[k].id ==
v[i].id);
+ float l0 = (v[i].vert - v[j].vert).length() * !(v[i].id && v[i].id
== v[j].id);
+ float l1 = (v[j].vert - v[k].vert).length() * !(v[j].id && v[j].id
== v[k].id);
+ float l2 = (v[k].vert - v[i].vert).length() * !(v[k].id && v[k].id
== v[i].id);
if (!(l0 < 1000 && l1 < 1000 && l2 < 1000))
return -1;
@@ -791,8 +804,8 @@
float d0min = 1E20;
float d1min = 1E20;
for (i = i0; i < i1; i++) {
- float dist0 = (verts[i] - d0).length();
- float dist1 = (verts[i] - d1).length();
+ float dist0 = (verts[i].vert - d0).length();
+ float dist1 = (verts[i].vert - d1).length();
if (dist0 < d0min) d0min = dist0, k0 = i;
if (dist1 < d1min) d1min = dist1, k1 = i;
}
@@ -928,7 +941,12 @@
}
std::vector<bool> clip(pt.size());
- for (i = 0; i <= ndice; i++) {
+ // note: not blending the connection mid-point
+ for (j = 0; j < ndice; j++) {
+ pt[j] += p0;
+ clip[j] = false;
+ }
+ for (i = 1; i <= ndice; i++) {
for (j = 0; j < ndice; j++) {
int ind = i * ndice + j;
int maxi;
@@ -1082,7 +1100,7 @@
// Triangulate as a star polygon
ZVec sum(0,0,0);
for (j = 0; j < (int)poly.size(); j++)
- sum += verts[poly[j]].normalized();
+ sum += verts[poly[j]].vert.normalized();
int nvert = verts.append(dirs[tri[i][0]] +
dirs[tri[i][1]] +
@@ -1092,7 +1110,7 @@
triangler.add(nvert, poly[j], poly[(j+1) % poly.size()]);
}
- } else if (mode == 4) {
+ } else if (mode == 4 || mode == 5) {
// icosahedron code adapted from sphere.c found in
// http://www.sgi.com/Technology/openGL/advanced/programs.html
@@ -1109,7 +1127,7 @@
#define X2_ (C2_*CZ_)
#define Y2_ (S2_*CZ_)
- verts.noblend = true;
+ if (mode == 5) verts.noblend = true;
int Ip0 = verts.append(ZVec( 0., 0., 1.));
int Ip1 = verts.append(ZVec(-X2_, -Y2_, SZ_));
int Ip2 = verts.append(ZVec( X2_, -Y2_, SZ_));
@@ -1161,14 +1179,16 @@
ZVec e2 = (t0.transform(ZVec(0,0,1)) - t0.transform(ZVec(0,0,0)));
for (i = 0; i < (int)verts.size(); i++)
verts[i] = blend(conns, N, r,
- e0 * verts[i].x + e1 * verts[i].y + e2 *
verts[i].z);
+ e0 * verts[i].vert.x +
+ e1 * verts[i].vert.y +
+ e2 * verts[i].vert.z);
}
// Compute normals
for(::Vob::Dicer::Triangles<Verts>::Titer x = triangler.tris.begin();
x != triangler.tris.end(); x++) {
- ZVec v0 = verts[x->v[1]] - verts[x->v[0]];
- ZVec v1 = verts[x->v[2]] - verts[x->v[1]];
+ ZVec v0 = verts[x->v[1]].vert - verts[x->v[0]].vert;
+ ZVec v1 = verts[x->v[2]].vert - verts[x->v[1]].vert;
ZVec norm = v0.crossp(v1).normalized();
verts[x->v[0]].norm += norm;
verts[x->v[1]].norm += norm;
@@ -1176,19 +1196,11 @@
}
for (i = 0; i < (int)verts.size(); i++)
- verts[i] += p0;
+ verts[i].vert += p0;
- glBegin(GL_TRIANGLES);
- for(::Vob::Dicer::Triangles<Verts>::Titer x = triangler.tris.begin();
- x != triangler.tris.end(); x++) {
- glNormal(verts[x->v[0]].norm);
- glVertex(verts[x->v[0]]);
- glNormal(verts[x->v[1]].norm);
- glVertex(verts[x->v[1]]);
- glNormal(verts[x->v[2]].norm);
- glVertex(verts[x->v[2]]);
- }
- glEnd();
+ verts.startN3V3Operation();
+ triangler.draw();
+ verts.endN3V3Operation();
}