gzz-commits
[Top][All Lists]
Advanced

[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();
 
        }
 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]