source: GTP/trunk/Lib/Geom/shared/GTGeometry/src/libs/AdjPrims.h @ 1600

Revision 1600, 3.6 KB checked in by gumbau, 18 years ago (diff)

Fixed simplification bug when simplifying to extremely a low factor

Line 
1#ifndef NAUTILUS_ADJPRIMS_INCLUDED // -*- C++ -*-
2#define NAUTILUS_ADJPRIMS_INCLUDED
3
4/************************************************************************
5
6  Primitive entities for adjacency models (AdjModel).
7  $Id: AdjPrims.h,v 1.4 1997/03/18 18:39:34 garland Exp $
8
9  Adapted from:
10     mlab: (Id: primitives.h,v 1.7 1997/02/06 16:30:14 garland Exp)
11  via
12     simplif: (Id: primitives.h,v 1.3 1997/02/18 21:11:29 garland Exp)
13
14 ************************************************************************/
15
16//#include "Nautilus.h"
17#include "NPrim.h"
18#include <gfx/tools/Buffer.h>
19#include <gfx/math/Vec3.h>
20#include <gfx/math/Vec2.h>
21#include <gfx/geom/3D.h>
22
23namespace simplif
24{
25        class Vertex;
26        class Edge;
27        class Face;
28
29        typedef buffer<Vertex *> vert_buffer;
30        typedef buffer<Edge *> edge_buffer;
31        typedef buffer<Face *> face_buffer;
32        typedef buffer<Vec3> vec3_buffer;
33        typedef buffer<Vec2> vec2_buffer;
34
35        extern void untagFaceLoop(Vertex *v);
36        extern void collectFaceLoop(Vertex *v, face_buffer& faces);
37
38#define EDGE_BOGUS 0
39#define EDGE_BORDER 1
40#define EDGE_MANIFOLD 2
41#define EDGE_NONMANIFOLD 3
42        extern int classifyEdge(Edge *);
43
44#define VERTEX_INTERIOR 0
45#define VERTEX_BORDER 1
46#define VERTEX_BORDER_ONLY 2
47        extern int classifyVertex(Vertex *);
48
49        ////////////////////////////////////////////////////////////////////////
50        //
51        // The actual class definitions
52        //
53        ////////////////////////////////////////////////////////////////////////
54
55        class VProp
56        {
57                public:
58                        Vec3 color;
59        };
60
61        class FProp
62        {
63                public:
64                        Vec3 color;
65        };
66
67        class Vertex : public Vec3, public NTaggedPrim
68        {
69                edge_buffer edge_uses;
70
71                public:
72#ifdef SUPPORT_VCOLOR
73                VProp *props;
74#endif
75
76                Vertex(real x, real y, real z) : Vec3(x, y, z), edge_uses(6) {
77#ifdef SUPPORT_VCOLOR
78                        props = NULL;
79#endif                 
80                }
81                //
82                // Standard methods for all objects
83                //
84                void kill();
85                edge_buffer& edgeUses() { return edge_uses; }
86
87                //
88                // Basic primitives for manipulating model topology
89                //
90                void linkEdge(Edge *);
91                void unlinkEdge(Edge *);
92                void remapTo(Vertex *v);
93
94                // SUS
95                int vID;
96        };
97
98        class Edge : public NPrim
99        {
100                private:
101
102                        Vertex *v1;
103
104                        face_buffer *face_uses;
105                        Edge *twin;
106
107                        Edge(Edge *twin, Vertex *org); // the twin constructor
108
109                public:
110
111                        Edge(Vertex *, Vertex *);
112                        ~Edge();
113
114                        //
115                        // Fundamental Edge accessors
116                        //
117                        Vertex *org()  { return v1;       }
118                        Vertex *dest() { return twin->v1; }
119                        Edge *sym()    { return twin;     }
120
121                        //
122                        // Standard methods for all objects
123                        //
124                        void kill();
125                        face_buffer& faceUses() { return *face_uses; }
126
127                        //
128                        // Basic primitives for manipulating model topology
129                        //
130                        void linkFace(Face *);
131                        void unlinkFace(Face *);
132                        void remapEndpoint(Vertex *from, Vertex *to);
133                        void remapTo(Edge *);
134        };
135
136        class Face : public Face3, public NTaggedPrim
137        {
138                Edge *edges[3];
139
140                public:
141#ifdef SUPPORT_FCOLOR
142                FProp *props;
143#endif
144
145                Face(Edge *, Edge *, Edge *);
146
147                //
148                // Basic Face accessors
149                //
150                const Vec3& vertexPos(int i) const{return *edges[i]->org();}
151
152                void vertexPos(int, const Vec3&)
153                {
154                        fatal_error("Face: can't directly set vertex position.");
155                }
156
157                Vertex *vertex(int i){return edges[i]->org();}
158                const Vertex *vertex(int i) const{return edges[i]->org();}
159                Edge *edge(int i){return edges[i];}
160
161                //
162                // Standard methods for all objects
163                //
164                void kill();
165
166                void remapEdge(Edge *from, Edge *to);
167
168                int igeo; // SUS
169                Vec3 vertex_normals[3];         // SUS
170                Vec2 vertex_texts[3];           //Carlos
171                int normals[3];
172                int texcoords[3];
173        };
174}
175
176// NAUTILUS_ADJPRIMS_INCLUDED
177#endif
178
Note: See TracBrowser for help on using the repository browser.