aboutsummaryrefslogtreecommitdiff
path: root/tool_src/BspLib/VertexChunk.h
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 ( &copyobj != this ) {
		if ( --rep->ref_count == 0 ) {
			delete rep;
		}
		rep = copyobj.rep;
		rep->ref_count++;
	}
	return *this;
}


BSPLIB_NAMESPACE_END


#endif // _VERTEXCHUNK_H_