blob: dd5274a9540cb4c58625cc5dbad8157f472e556b (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
//-----------------------------------------------------------------------------
// BSPLIB HEADER: VertexChunk.h
//
// Copyright (c) 1997 by Markus Hadwiger
// All Rights Reserved.
//-----------------------------------------------------------------------------
#ifndef _VERTEXCHUNK_H_
#define _VERTEXCHUNK_H_
// bsplib header files
#include "BspLibDefs.h"
#include "SystemIO.h"
BSPLIB_NAMESPACE_BEGIN
// chunk of 3-D vertices (actual representation) ------------------------------
//
class VertexChunkRep : public virtual SystemIO {
friend class VertexChunk;
private:
VertexChunkRep( int chunksize = 0 );
~VertexChunkRep();
Vertex3& FetchVertex( int index );
int AddVertex( Vertex3 vertex );
int FindVertex( const Vertex3& vertex );
int FindCloseVertex( const Vertex3& vertex, int skip = -1 );
int CheckVertices( int verbose );
int getNumElements() const;
private:
void ChangeAxis( char xchar, hprec_t src );
int VerticesEqual( Vertex3 v1, Vertex3 v2 );
private:
int ref_count;
int numvertices;
int maxnumvertices;
Vertex3* vertices;
VertexChunkRep* next;
int nummultvertices;
static int eliminatedoublets;
static const int CHUNK_SIZE;
};
// create new vertex chunk ----------------------------------------------------
inline VertexChunkRep::VertexChunkRep( int chunksize ) : ref_count( 0 )
{
int challocsize = chunksize > 0 ? chunksize : CHUNK_SIZE;
vertices = new Vertex3[ challocsize ];
maxnumvertices = challocsize;
numvertices = 0;
next = NULL;
}
// destroy list of vertex chunks recursively ----------------------------------
inline VertexChunkRep::~VertexChunkRep()
{
delete next;
delete[] vertices;
}
// check if two vertices are equal --------------------------------------------
inline int VertexChunkRep::VerticesEqual( Vertex3 v1, Vertex3 v2 )
{
// return v1.IsInVicinity( v2 );
return ( v1 == v2 );
}
// chunk of 3-D vertices (handle class) ---------------------------------------
//
class VertexChunk {
public:
VertexChunk( int chunksize = 0 ) { rep = new VertexChunkRep( chunksize ); rep->ref_count = 1; }
~VertexChunk() { if ( --rep->ref_count == 0 ) delete rep; }
VertexChunk( const VertexChunk& copyobj );
VertexChunk& operator =( const VertexChunk& copyobj );
Vertex3& operator []( int index ) { return rep->FetchVertex( index ); }
Vertex3& FetchVertex( int index ) { return rep->FetchVertex( index ); }
int AddVertex( const Vertex3 vertex ) { return rep->AddVertex( vertex ); }
int FindVertex( const Vertex3& vertex ) { return rep->FindVertex( vertex ); }
int FindCloseVertex( Vertex3 vertex, int skip = -1 ) { return rep->FindCloseVertex( vertex, skip ); }
int CheckVertices( int verbose ) { return rep->CheckVertices( verbose ); }
int getNumElements() const { return rep->getNumElements(); }
private:
VertexChunkRep* rep;
};
// copy constructor for VertexChunk -------------------------------------------
inline VertexChunk::VertexChunk( const VertexChunk& copyobj )
{
rep = copyobj.rep;
rep->ref_count++;
}
// assignment operator for VertexChunk ----------------------------------------
inline VertexChunk& VertexChunk::operator =( const VertexChunk& copyobj )
{
if ( ©obj != this ) {
if ( --rep->ref_count == 0 ) {
delete rep;
}
rep = copyobj.rep;
rep->ref_count++;
}
return *this;
}
BSPLIB_NAMESPACE_END
#endif // _VERTEXCHUNK_H_
|