Commit bc14c9dedaf210b5774c64a0fbf9d37bbf60e1ff
1 parent
3725ee1d
removed old rts files
Showing
93 changed files
with
9 additions
and
24162 deletions
Show diff stats
envi/envi.h
... | ... | @@ -47,7 +47,7 @@ struct envi |
47 | 47 | std::vector<std::string> band_names; //name for each band in the image |
48 | 48 | std::vector<double> wavelength; //wavelength for each band |
49 | 49 | |
50 | - envi(){ | |
50 | + void init(){ | |
51 | 51 | name = ""; |
52 | 52 | |
53 | 53 | //specify default values for a new or empty ENVI file |
... | ... | @@ -68,6 +68,14 @@ struct envi |
68 | 68 | z_plot_titles[0] = z_plot_titles[1] = "Unknown"; |
69 | 69 | } |
70 | 70 | |
71 | + envi(){ | |
72 | + init(); | |
73 | + } | |
74 | + envi(std::string name){ | |
75 | + init(); | |
76 | + load(name); | |
77 | + } | |
78 | + | |
71 | 79 | std::string trim(std::string line){ |
72 | 80 | //trims whitespace from the beginning and end of line |
73 | 81 | unsigned int start_i, end_i; | ... | ... |
legacy/CHECK_OPENGL_ERROR.h deleted
1 | -#ifndef RTS_OPENGL_ERROR | |
2 | -#define RTS_OPENGL_ERROR | |
3 | - | |
4 | -#include <stdio.h> | |
5 | -#include <GL/gl.h> | |
6 | -#include <GL/glu.h> | |
7 | - | |
8 | -#define CHECK_OPENGL_ERROR \ | |
9 | -{ GLenum error; \ | |
10 | - while ( (error = glGetError()) != GL_NO_ERROR) { \ | |
11 | - printf( "OpenGL ERROR: %s\nCHECK POINT: %s (line %d)\n", gluErrorString(error), __FILE__, __LINE__ ); \ | |
12 | - } \ | |
13 | -} | |
14 | - | |
15 | -#endif | |
16 | 0 | \ No newline at end of file |
legacy/PerformanceDataTemplate.h deleted
1 | -// add the following to a cpp file: | |
2 | -// PerformanceData PD; | |
3 | - | |
4 | - | |
5 | -#pragma once | |
6 | -#include <ostream> | |
7 | -using namespace std; | |
8 | - | |
9 | -enum PerformanceDataType | |
10 | -{ | |
11 | - PD_DISPLAY=0, | |
12 | - PD_SPS, | |
13 | - PD_UNUSED0, | |
14 | - | |
15 | - //my stuff | |
16 | - SIMULATE_SPECTRUM, | |
17 | - SIMULATE_GPU, | |
18 | - KRAMERS_KRONIG, | |
19 | - | |
20 | - | |
21 | - | |
22 | - //end my stuff | |
23 | - PERFORMANCE_DATA_TYPE_COUNT | |
24 | -}; | |
25 | - | |
26 | -static char PDTypeNames[][255] = { | |
27 | - "Display ", | |
28 | - "Simulation Total ", | |
29 | - " ----------------- ", | |
30 | - //my stuff | |
31 | - "Simulate Spectrum ", | |
32 | - " GPU Portion ", | |
33 | - "Kramers-Kronig ", | |
34 | - | |
35 | - //end my stuff | |
36 | - | |
37 | -}; | |
38 | -#ifdef WIN32 | |
39 | -#include <stdio.h> | |
40 | -#include <windows.h> | |
41 | -#include <float.h> | |
42 | - | |
43 | -#include <iostream> | |
44 | -#include <iomanip> | |
45 | - | |
46 | -//------------------------------------------------------------------------------- | |
47 | - | |
48 | -class PerformanceData | |
49 | -{ | |
50 | -public: | |
51 | - PerformanceData() { ClearAll(); QueryPerformanceFrequency(&cps); } | |
52 | - ~PerformanceData(){} | |
53 | - | |
54 | - void ClearAll() | |
55 | - { | |
56 | - for ( int i=0; i<PERFORMANCE_DATA_TYPE_COUNT; i++ ) { | |
57 | - for ( int j=0; j<256; j++ ) times[i][j] = 0; | |
58 | - pos[i] = 0; | |
59 | - minTime[i] = 0xFFFFFFFF; | |
60 | - maxTime[i] = 0; | |
61 | - totalTime[i] = 0; | |
62 | - dataReady[i] = false; | |
63 | - } | |
64 | - } | |
65 | - | |
66 | - void StartTimer( int type ) { QueryPerformanceCounter( &startTime[type] );} | |
67 | - void EndTimer( int type ) { | |
68 | - LARGE_INTEGER endTime; | |
69 | - QueryPerformanceCounter( &endTime ); | |
70 | - double t = (double)(endTime.QuadPart - startTime[type].QuadPart); | |
71 | - //unsigned int t = GetTickCount() - startTime[type]; | |
72 | - if ( t < minTime[type] ) minTime[type] = t; | |
73 | - if ( t > maxTime[type] ) maxTime[type] = t; | |
74 | - totalTime[type] -= times[type][ pos[type] ]; | |
75 | - times[type][ pos[type] ] = t; | |
76 | - totalTime[type] += t; | |
77 | - pos[type]++; | |
78 | - if ( pos[type] == 0 ) dataReady[type] = true; | |
79 | - } | |
80 | - | |
81 | - void PrintResult( ostream &os,int i=PERFORMANCE_DATA_TYPE_COUNT) | |
82 | - { | |
83 | - os.setf(ios::fixed); | |
84 | - if ((i<PERFORMANCE_DATA_TYPE_COUNT)&&(i>=0)){ | |
85 | - double a = GetAvrgTime(i); | |
86 | - if ( a ) | |
87 | - os<< PDTypeNames[i]<<" : avrg="<<setw(8)<<setprecision(3)<<a<<"\tmin="<<setw(8)<<setprecision(3)<< GetMinTime(i) <<"\tmax="<<setw(8)<<setprecision(3)<< GetMaxTime(i) <<endl ; | |
88 | - else | |
89 | - os<< PDTypeNames[i]<<" : avrg= -----\tmin= -----\tmax= -----"<<endl; | |
90 | - } | |
91 | - } | |
92 | - | |
93 | - void PrintResults( ostream &os) | |
94 | - { | |
95 | - for ( int i=0; i<PERFORMANCE_DATA_TYPE_COUNT; i++ ) | |
96 | - PrintResult(os,i); | |
97 | - } | |
98 | - | |
99 | - double GetLastTime( int type ) { return times[type][pos[type]]; } | |
100 | - double GetAvrgTime( int type ) { double a = 1000.0 * totalTime[type] / (float)cps.QuadPart / ( (dataReady[type]) ? 256.0 : (double)pos[type] ); return (_finite(a))? a:0; } | |
101 | - double GetMinTime( int type ) { return 1000.0 * minTime[type] / (float)cps.LowPart; } | |
102 | - double GetMaxTime( int type ) { return 1000.0 * maxTime[type] / (float)cps.LowPart; } | |
103 | - | |
104 | -private: | |
105 | - double times[PERFORMANCE_DATA_TYPE_COUNT][256]; | |
106 | - unsigned char pos[PERFORMANCE_DATA_TYPE_COUNT]; | |
107 | - LARGE_INTEGER startTime[PERFORMANCE_DATA_TYPE_COUNT]; | |
108 | - double minTime[ PERFORMANCE_DATA_TYPE_COUNT ]; | |
109 | - double maxTime[ PERFORMANCE_DATA_TYPE_COUNT ]; | |
110 | - double totalTime[ PERFORMANCE_DATA_TYPE_COUNT ]; | |
111 | - bool dataReady[ PERFORMANCE_DATA_TYPE_COUNT ]; | |
112 | - LARGE_INTEGER cps; | |
113 | -}; | |
114 | - | |
115 | -//------------------------------------------------------------------------------- | |
116 | -#else | |
117 | - | |
118 | -class PerformanceData{ | |
119 | -public: | |
120 | - PerformanceData() {;}; | |
121 | - ~PerformanceData(){;}; | |
122 | - void ClearAll(){;}; | |
123 | - void StartTimer( int type ) {;}; | |
124 | - void EndTimer( int type ) {;}; | |
125 | - void PrintResults( ostream &os){;}; | |
126 | - void PrintResult( ostream &os, int i=PERFORMANCE_DATA_TYPE_COUNT){;}; | |
127 | - double GetLastTime( int type ) { return 0.0; }; | |
128 | - double GetAvrgTime( int type ) { return 0.0; }; | |
129 | - double GetMinTime( int type ) { return 0.0; }; | |
130 | - double GetMaxTime( int type ) { return 0.0; }; | |
131 | -}; | |
132 | - | |
133 | -#endif | |
134 | -//------------------------------------------------------------------------------- | |
135 | - | |
136 | -extern PerformanceData PD; | |
137 | - | |
138 | -//------------------------------------------------------------------------------- |
legacy/README.md deleted
1 | -rts | |
2 | -=== | |
3 | - | |
4 | -Real-Time Scraps is my codebase. I use it for a lot of stuff. It mostly has a bunch of functions helpful for writing simulation, visualization, and GPU-based code. | |
5 | - | |
6 | -Revisions----- | |
7 | - | |
8 | -[2013-8-24] - Started re-writing this library. The new stuff will be in the rts subdirectory and I'll remove individual deprecated files over time as they are re-written. | |
9 | - | |
10 | -[2013-8-24] - Re-committed this repository. It was time for a nice refresh since I'm going to be re-building it. | |
11 | - | |
12 | -[2013-8-23] - Started using Boost for my command-line processing. |
legacy/cudaHandleError.h deleted
1 | -#include <stdio.h> | |
2 | -#include "cuda_runtime.h" | |
3 | -#include "device_launch_parameters.h" | |
4 | - | |
5 | -#ifndef CUDA_HANDLE_ERROR_H | |
6 | -#define CUDA_HANDLE_ERROR_H | |
7 | - | |
8 | -//handle error macro | |
9 | -static void HandleError( cudaError_t err, const char *file, int line ) { | |
10 | - if (err != cudaSuccess) { | |
11 | - FILE* outfile = fopen("cudaErrorLog.txt", "w"); | |
12 | - fprintf(outfile, "%s in %s at line %d\n", cudaGetErrorString( err ), file, line ); | |
13 | - fclose(outfile); | |
14 | - exit( EXIT_FAILURE ); | |
15 | - printf("%s in %s at line %d\n", cudaGetErrorString( err ), file, line ); | |
16 | - } | |
17 | -} | |
18 | -#define HANDLE_ERROR( err ) (HandleError( err, __FILE__, __LINE__ )) | |
19 | - | |
20 | -static cudaEvent_t tStartEvent; | |
21 | -static cudaEvent_t tStopEvent; | |
22 | -static void gpuStartTimer() | |
23 | -{ | |
24 | - //set up timing events | |
25 | - cudaEventCreate(&tStartEvent); | |
26 | - cudaEventCreate(&tStopEvent); | |
27 | - cudaEventRecord(tStartEvent, 0); | |
28 | -} | |
29 | - | |
30 | -static float gpuStopTimer() | |
31 | -{ | |
32 | - cudaEventRecord(tStopEvent, 0); | |
33 | - cudaEventSynchronize(tStopEvent); | |
34 | - float elapsedTime; | |
35 | - cudaEventElapsedTime(&elapsedTime, tStartEvent, tStopEvent); | |
36 | - cudaEventDestroy(tStartEvent); | |
37 | - cudaEventDestroy(tStopEvent); | |
38 | - return elapsedTime; | |
39 | -} | |
40 | - | |
41 | -#endif |
legacy/cuda_callable.h deleted
legacy/objJedi.cpp deleted
1 | -/*BUG NOTES | |
2 | -The standard function calls for inserting vertices don't work anymore. I've fixed points | |
3 | -but everything beyond that has to be updated. | |
4 | -*/ | |
5 | - | |
6 | -#include "objJedi.h" | |
7 | -#include "rtsvector3D.h" | |
8 | -#include "rtspoint3D.h" | |
9 | -#include <string> | |
10 | -//variable for use in global functions | |
11 | -rtsOBJ g_OBJ; | |
12 | - | |
13 | -/********UTILITY METHODS*******************************/ | |
14 | -void rtsOBJ::Scale(float scale_x, float scale_y, float scale_z) | |
15 | -{ | |
16 | - vector<vertex_position>::iterator i; | |
17 | - for(i = v_list.begin(); i!= v_list.end(); i++) | |
18 | - { | |
19 | - (*i).x *= scale_x; | |
20 | - (*i).y *= scale_y; | |
21 | - (*i).z *= scale_z; | |
22 | - } | |
23 | -} | |
24 | - | |
25 | -void rtsOBJ::Translate(float trans_x, float trans_y, float trans_z) | |
26 | -{ | |
27 | - vector<vertex_position>::iterator i; | |
28 | - for(i = v_list.begin(); i!= v_list.end(); i++) | |
29 | - { | |
30 | - (*i).x += trans_x; | |
31 | - (*i).y += trans_y; | |
32 | - (*i).z += trans_z; | |
33 | - } | |
34 | - | |
35 | -} | |
36 | - | |
37 | -float rtsOBJ::GetDistance(float x, float y, float z) | |
38 | -{ | |
39 | - //gets the distance between the specified point and the nearest surface of the OBJ | |
40 | - //currently only works for lines | |
41 | - | |
42 | - //cout<<"Primitives: "<<primitives.size()<<endl; | |
43 | - int num_primitives = primitives.size(); | |
44 | - point3D<double> p0, p1, p2; | |
45 | - double min_dist = 255; | |
46 | - double dist, numerator, denominator; | |
47 | - int p, l; | |
48 | - vector3D<double> v, w; | |
49 | - double c1, c2, b; | |
50 | - point3D<double> Pb; | |
51 | - | |
52 | - //for each line | |
53 | - for(l=0; l<num_primitives; l++) | |
54 | - { | |
55 | - if(primitives[l].type & OBJ_LINES) | |
56 | - { | |
57 | - //for each point | |
58 | - for(p = 1; p<primitives[l].p.size(); p++) | |
59 | - { | |
60 | - | |
61 | - vertex_position v1 = v_list[primitives[l].p[p-1].v]; | |
62 | - vertex_position v2 = v_list[primitives[l].p[p].v]; | |
63 | - p1.x = v1.x; | |
64 | - p1.y = v1.y; | |
65 | - p1.z = v1.z; | |
66 | - p2.x = v2.x; | |
67 | - p2.y = v2.y; | |
68 | - p2.z = v2.z; | |
69 | - | |
70 | - p0.x = x; | |
71 | - p0.y = y; | |
72 | - p0.z = z; | |
73 | - | |
74 | - v = p2 - p1; | |
75 | - w = p0 - p1; | |
76 | - if((c1 = w*v) <= 0) | |
77 | - dist = (p1 - p0).Length(); | |
78 | - else if((c2 = v*v) <= c1) | |
79 | - dist = (p2 - p0).Length(); | |
80 | - else | |
81 | - { | |
82 | - b = c1/c2; | |
83 | - Pb = p1 + b*v; | |
84 | - dist = (Pb - p0).Length(); | |
85 | - } | |
86 | - if(dist < min_dist) | |
87 | - min_dist = dist; | |
88 | - | |
89 | - | |
90 | - | |
91 | - } | |
92 | - } | |
93 | - } | |
94 | - //cout<<"---------------------------------------------"<<endl; | |
95 | - | |
96 | - return min_dist; | |
97 | - | |
98 | - | |
99 | -} | |
100 | - | |
101 | -/********CLASS METHOD DEFINITIONS**********************/ | |
102 | -//constructors | |
103 | - | |
104 | -//constructor | |
105 | -rtsOBJ::rtsOBJ() | |
106 | -{ | |
107 | - g_CurrentMode = OBJ_NONE; | |
108 | - g_NumVertices = 0; | |
109 | - g_AttributeMask = 0x0; | |
110 | - g_AttributeResetMask = 0x0; | |
111 | - g_LatestVT = 0; | |
112 | - g_LatestVN = 0; | |
113 | - | |
114 | - m_bounds.min.x = m_bounds.min.y = m_bounds.min.z = 99999; | |
115 | - m_bounds.max.x = m_bounds.max.y = m_bounds.max.z = -99999; | |
116 | - | |
117 | - current_primitive_mask = 0x0; | |
118 | -} | |
119 | - | |
120 | -void rtsOBJ::CopyOBJ(const rtsOBJ& obj) | |
121 | -{ | |
122 | - current_vt = obj.current_vt; | |
123 | - current_vn = obj.current_vn; | |
124 | - vt_changed = obj.vt_changed; //true if a new vt or vn was inserted since the last vertex | |
125 | - vn_changed = obj.vn_changed; | |
126 | - current_primitive_mask = obj.current_primitive_mask; //defines what coordinates are being used by the current primitive | |
127 | - //global variable storing the current render mode | |
128 | - g_CurrentMode = obj.g_CurrentMode; | |
129 | - //output file stream | |
130 | - //g_objFile = obj.g_objFile; | |
131 | - //obj file object | |
132 | - //objData g_OBJ; | |
133 | - //number of vertices since the last BEGIN | |
134 | - g_NumVertices = obj.g_NumVertices; | |
135 | - /*Attribute mask. This indicates what attributes are stored for each vertex. | |
136 | - Only a single mask applies to each vertex between objBegin() and objEnd(). The | |
137 | - attribute mask is flipped the first time an attribute is set but it is fixed after | |
138 | - the first vertex is passed.*/ | |
139 | - g_AttributeMask = obj.g_AttributeMask; | |
140 | - /*Attribute reset mask. This indicates whether or not an attribute has been | |
141 | - reset since the last vertex was rendered. This applies to OBJ_VT and OBJ_VN*/ | |
142 | - g_AttributeResetMask = obj.g_AttributeResetMask; | |
143 | - //latest texture coordinate sent | |
144 | - g_LatestVT = obj.g_LatestVT; | |
145 | - //latest vertex normal sent | |
146 | - g_LatestVN = obj.g_LatestVN; | |
147 | - m_bounds = obj.m_bounds; | |
148 | - | |
149 | - | |
150 | - v_list = obj.v_list; | |
151 | - vt_list = obj.vt_list; | |
152 | - vn_list = obj.vn_list; | |
153 | - primitives = obj.primitives; | |
154 | - | |
155 | - points = obj.points; | |
156 | - lines = obj.lines; | |
157 | - faces = obj.faces; | |
158 | -} | |
159 | - | |
160 | -//opens an obj file for rendering | |
161 | -OBJint rtsOBJ::objOpen(const char* filename) | |
162 | -{ | |
163 | - g_objFile.open(filename); | |
164 | - return OBJ_OK; | |
165 | -} | |
166 | - | |
167 | -//close the obj file | |
168 | -OBJint rtsOBJ::objClose() | |
169 | -{ | |
170 | - //TODO: write obj data | |
171 | - f_OutputVertices(); | |
172 | - f_OutputTextureCoordinates(); | |
173 | - f_OutputVertexNormals(); | |
174 | - f_OutputPoints(); | |
175 | - f_OutputLines(); | |
176 | - f_OutputFaces(); | |
177 | - | |
178 | - //close the file | |
179 | - g_objFile.close(); | |
180 | - | |
181 | - //delete all of the data from the global object | |
182 | - f_ClearAll(); | |
183 | - return OBJ_OK; | |
184 | -} | |
185 | - | |
186 | -OBJint rtsOBJ::objBegin(OBJint mode) | |
187 | -{ | |
188 | - //make sure that we aren't currently rendering | |
189 | - if(g_CurrentMode != OBJ_NONE) | |
190 | - return OBJ_ERROR; | |
191 | - //make sure that the given mode is valid | |
192 | - if(mode < OBJ_POINTS || mode > OBJ_POLYGON) | |
193 | - return OBJ_ERROR; | |
194 | - | |
195 | - //otherwise, go ahead and set the mode | |
196 | - g_CurrentMode = mode; | |
197 | - //set the number of vertices to zero | |
198 | - g_NumVertices = 0; | |
199 | - | |
200 | - //reset the current state primitive state | |
201 | - current_primitive_mask = 0x0; | |
202 | - | |
203 | - return OBJ_OK; | |
204 | -} | |
205 | - | |
206 | -OBJint rtsOBJ::objEnd() | |
207 | -{ | |
208 | - OBJint error = OBJ_OK; | |
209 | - //check to make sure the number of rendered vertices is valid for the current mode | |
210 | - switch(g_CurrentMode) | |
211 | - { | |
212 | - case OBJ_NONE: | |
213 | - //can't quit if we haven't started | |
214 | - error = OBJ_ERROR; | |
215 | - break; | |
216 | - case OBJ_LINES: | |
217 | - //if less than two vertices or an odd number of vertices | |
218 | - if(g_NumVertices < 2 || g_NumVertices%2 != 0) | |
219 | - { | |
220 | - //if there wasn't a vertex at all | |
221 | - if(g_NumVertices == 0) | |
222 | - error = OBJ_ERROR; | |
223 | - //if there was at least one vertex | |
224 | - else | |
225 | - { | |
226 | - //pop the last line off the list | |
227 | - primitives.pop_back(); | |
228 | - lines.pop_back(); | |
229 | - error = OBJ_ERROR; | |
230 | - } | |
231 | - } | |
232 | - break; | |
233 | - case OBJ_LINE_STRIP: | |
234 | - //if less than two vertices | |
235 | - if(g_NumVertices < 2) | |
236 | - { | |
237 | - //if there wasn't a vertex at all | |
238 | - if(g_NumVertices == 0) | |
239 | - error = OBJ_ERROR; | |
240 | - //if there was at least one vertex | |
241 | - else | |
242 | - { | |
243 | - //pop the last line off the list | |
244 | - primitives.pop_back(); | |
245 | - lines.pop_back(); | |
246 | - error = OBJ_ERROR; | |
247 | - } | |
248 | - } | |
249 | - break; | |
250 | - case OBJ_LINE_LOOP: | |
251 | - //if less than three vertices | |
252 | - if(g_NumVertices < 3) | |
253 | - { | |
254 | - //pop the last line off the list | |
255 | - primitives.pop_back(); | |
256 | - lines.pop_back(); | |
257 | - error = OBJ_ERROR; | |
258 | - } | |
259 | - //connect the first and last points | |
260 | - else | |
261 | - { | |
262 | - error = f_TerminateLineLoop(); | |
263 | - } | |
264 | - break; | |
265 | - case OBJ_TRIANGLES: | |
266 | - //if less than three vertices or not a power of three | |
267 | - if(g_NumVertices < 3 || g_NumVertices%3 !=0) | |
268 | - { | |
269 | - primitives.pop_back(); | |
270 | - faces.pop_back(); | |
271 | - error = OBJ_ERROR; | |
272 | - } | |
273 | - break; | |
274 | - case OBJ_TRIANGLE_STRIP: | |
275 | - //if less than three vertices | |
276 | - if(g_NumVertices < 3) | |
277 | - { | |
278 | - primitives.pop_back(); | |
279 | - faces.pop_back(); | |
280 | - error = OBJ_ERROR; | |
281 | - } | |
282 | - break; | |
283 | - case OBJ_TRIANGLE_FAN: | |
284 | - //if less than three vertices | |
285 | - if(g_NumVertices < 3) | |
286 | - { | |
287 | - primitives.pop_back(); | |
288 | - faces.pop_back(); | |
289 | - error = OBJ_ERROR; | |
290 | - } | |
291 | - break; | |
292 | - case OBJ_QUADS: | |
293 | - if(g_NumVertices < 4 || g_NumVertices%4 != 0) | |
294 | - { | |
295 | - primitives.pop_back(); | |
296 | - faces.pop_back(); | |
297 | - error = OBJ_ERROR; | |
298 | - } | |
299 | - break; | |
300 | - case OBJ_QUAD_STRIP: | |
301 | - //has to be at least 4 vertices and an even number | |
302 | - if(g_NumVertices < 4 || g_NumVertices%2 != 0) | |
303 | - { | |
304 | - primitives.pop_back(); | |
305 | - faces.pop_back(); | |
306 | - error = OBJ_ERROR; | |
307 | - } | |
308 | - break; | |
309 | - case OBJ_POLYGON: | |
310 | - //has to be at least three vertices | |
311 | - if(g_NumVertices < 3) | |
312 | - { | |
313 | - primitives.pop_back(); | |
314 | - faces.pop_back(); | |
315 | - error = OBJ_ERROR; | |
316 | - } | |
317 | - break; | |
318 | - } | |
319 | - | |
320 | - //reset the attribute mask | |
321 | - g_AttributeMask = 0x0; | |
322 | - //just for closure, reset the attribute reset mask | |
323 | - g_AttributeResetMask = 0x0; | |
324 | - //stop rendering | |
325 | - g_CurrentMode = OBJ_NONE; | |
326 | - return error; | |
327 | -} | |
328 | - | |
329 | -OBJint rtsOBJ::f_InsertVertexf(float x, float y, float z, float w, unsigned char mask) | |
330 | -{ | |
331 | - //make sure we're rendering | |
332 | - if(g_CurrentMode == OBJ_NONE) | |
333 | - return OBJ_ERROR; | |
334 | - | |
335 | - //insert the vertex into the vertex vector | |
336 | - vertex_position v; | |
337 | - v.x = x; v.y = y; v.z=z; v.w=w; v.mask = mask; | |
338 | - v_list.push_back(v); | |
339 | - f_AdjustExtents(v); //set the bounding box | |
340 | - //insert texture coordinate and normal if specified for this primitive | |
341 | - if((current_primitive_mask & OBJ_VT) && (vt_changed)) | |
342 | - vt_list.push_back(current_vt); | |
343 | - if((current_primitive_mask & OBJ_VN) && (vn_changed)) | |
344 | - vn_list.push_back(current_vn); | |
345 | - | |
346 | - | |
347 | - //increment the number of vertices inserted | |
348 | - g_NumVertices++; | |
349 | - | |
350 | - //handle each case of the vertex creation individually | |
351 | - OBJint error = OBJ_OK; | |
352 | - switch(g_CurrentMode) | |
353 | - { | |
354 | - case OBJ_POINTS: | |
355 | - error = f_InsertPointVertex(); | |
356 | - break; | |
357 | - case OBJ_LINES: | |
358 | - error = f_InsertLineVertex(); | |
359 | - break; | |
360 | - case OBJ_LINE_LOOP: | |
361 | - error = f_InsertLineLoopVertex(); | |
362 | - break; | |
363 | - case OBJ_LINE_STRIP: | |
364 | - error = f_InsertLineStripVertex(); | |
365 | - break; | |
366 | - case OBJ_TRIANGLES: | |
367 | - error = f_InsertTriangleVertex(); | |
368 | - break; | |
369 | - case OBJ_TRIANGLE_STRIP: | |
370 | - error = f_InsertTriangleStripVertex(); | |
371 | - break; | |
372 | - case OBJ_TRIANGLE_FAN: | |
373 | - error = f_InsertTriangleFanVertex(); | |
374 | - break; | |
375 | - case OBJ_QUADS: | |
376 | - error = f_InsertQuadVertex(); | |
377 | - break; | |
378 | - case OBJ_QUAD_STRIP: | |
379 | - error = f_InsertQuadStripVertex(); | |
380 | - break; | |
381 | - case OBJ_POLYGON: | |
382 | - error = f_InsertPolygonVertex(); | |
383 | - break; | |
384 | - } | |
385 | - //set the reset mask to zero | |
386 | - g_AttributeResetMask = 0x0; | |
387 | - | |
388 | - //set the attribute mask to include vertex position | |
389 | - g_AttributeMask = g_AttributeMask | OBJ_V; | |
390 | - | |
391 | - //return the result of the insertion | |
392 | - return error; | |
393 | -} | |
394 | - | |
395 | -OBJint rtsOBJ::objVertex1f(float x) | |
396 | -{ | |
397 | - return f_InsertVertexf(x, 0.0, 0.0, 0.0, OBJ_V_X); | |
398 | -} | |
399 | - | |
400 | -OBJint rtsOBJ::objVertex2f(float x, float y) | |
401 | -{ | |
402 | - return f_InsertVertexf(x, y, 0.0, 0.0, OBJ_V_X | OBJ_V_Y); | |
403 | -} | |
404 | - | |
405 | -OBJint rtsOBJ::objVertex3f(float x, float y, float z) | |
406 | -{ | |
407 | - return f_InsertVertexf(x, y, z, 0.0, OBJ_V_X | OBJ_V_Y | OBJ_V_Z); | |
408 | - | |
409 | -} | |
410 | - | |
411 | -OBJint rtsOBJ::objVertex4f(float x, float y, float z, float w) | |
412 | -{ | |
413 | - return f_InsertVertexf(x, y, z, w, OBJ_V_X | OBJ_V_Y | OBJ_V_Z | OBJ_V_W); | |
414 | -} | |
415 | - | |
416 | -OBJint rtsOBJ::objNormal3f(float i, float j, float k) | |
417 | -{ | |
418 | - return f_InsertNormalf(i, j, k, OBJ_VN_I | OBJ_VN_J | OBJ_VN_K); | |
419 | -} | |
420 | -OBJint rtsOBJ::objNormal2f(float i, float j) | |
421 | -{ | |
422 | - return f_InsertNormalf(i, j, 0.0, OBJ_VN_I | OBJ_VN_J); | |
423 | -} | |
424 | - | |
425 | -OBJint rtsOBJ::objNormal1f(float i) | |
426 | -{ | |
427 | - return f_InsertNormalf(i, 0.0, 0.0, OBJ_VN_I); | |
428 | -} | |
429 | - | |
430 | -OBJint rtsOBJ::f_InsertNormalf(float i, float j, float k, unsigned char mask) | |
431 | -{ | |
432 | - /*DEPRECATED | |
433 | - //if the mode is not rendering faces, there is an error | |
434 | - if(g_CurrentMode < OBJ_TRIANGLES) | |
435 | - return OBJ_ERROR; | |
436 | - //if the normal attribute flag is not set, set it (as long as a vertex hasn't been written) | |
437 | - if(!(g_AttributeMask & OBJ_VN)) | |
438 | - { | |
439 | - //if a vertex has been rendered, then we can't change the attribute, so exit | |
440 | - if(g_NumVertices > 0) | |
441 | - return OBJ_ERROR; | |
442 | - else | |
443 | - //otherwise, just set the attribute flag | |
444 | - g_AttributeMask = g_AttributeMask | OBJ_VN; | |
445 | - } | |
446 | - | |
447 | - | |
448 | - //insert the new normal into the normal list for the file | |
449 | - vertex_normal new_vn; | |
450 | - new_vn.i = i; new_vn.j = j; new_vn.k = k; | |
451 | - new_vn.mask = mask; | |
452 | - vn_list.push_back(new_vn); | |
453 | - */ | |
454 | - current_vn.i = i; //set the current texture state to the given coordinates | |
455 | - current_vn.j = j; | |
456 | - current_vn.k = k; | |
457 | - current_vn.mask = mask; //set the mask as appropriate | |
458 | - vn_changed = true; //the texture coordinate state has changed | |
459 | - current_primitive_mask = current_primitive_mask | OBJ_VN; //the current primitive now uses texture coordinates (if it didn't previously) | |
460 | - | |
461 | - return OBJ_OK; | |
462 | -} | |
463 | - | |
464 | -OBJint rtsOBJ::objTexCoord3f(float u, float v, float w) | |
465 | -{ | |
466 | - return f_InsertTexCoordf(u, v, w, OBJ_VT_U | OBJ_VT_V | OBJ_VT_W); | |
467 | -} | |
468 | - | |
469 | -OBJint rtsOBJ::objTexCoord2f(float u, float v) | |
470 | -{ | |
471 | - return f_InsertTexCoordf(u, v, 0.0, OBJ_VT_U | OBJ_VT_V); | |
472 | -} | |
473 | - | |
474 | -OBJint rtsOBJ::objTexCoord1f(float u) | |
475 | -{ | |
476 | - return f_InsertTexCoordf(u, 0.0, 0.0, OBJ_VT_U); | |
477 | -} | |
478 | - | |
479 | -OBJint rtsOBJ::f_InsertTexCoordf(float u, float v, float w, unsigned char mask) | |
480 | -{ | |
481 | - /* | |
482 | - DEPRECATED | |
483 | - //if the normal attribute flag is not set, set it (as long as a vertex hasn't been written) | |
484 | - if(!(g_AttributeMask & OBJ_VT)) | |
485 | - { | |
486 | - //if a vertex has been rendered, then we can't change the attribute, so exit | |
487 | - if(g_NumVertices > 0) | |
488 | - return OBJ_ERROR; | |
489 | - else | |
490 | - //otherwise, just set the attribute flag | |
491 | - g_AttributeMask = g_AttributeMask | OBJ_VT; | |
492 | - } | |
493 | - | |
494 | - //insert the new texture coordinate into the list for the file | |
495 | - vertex_texture new_vt; | |
496 | - new_vt.u = u; new_vt.v = v; new_vt.w = w; | |
497 | - new_vt.mask = mask; | |
498 | - vt_list.push_back(new_vt); | |
499 | - */ | |
500 | - current_vt.u = u; //set the current texture state to the given coordinates | |
501 | - current_vt.v = v; | |
502 | - current_vt.w = w; | |
503 | - current_vt.mask = mask; //set the mask as appropriate | |
504 | - vt_changed = true; //the texture coordinate state has changed | |
505 | - current_primitive_mask = current_primitive_mask | OBJ_VT; //the current primitive now uses texture coordinates (if it didn't previously) | |
506 | - | |
507 | - return OBJ_OK; | |
508 | -} | |
509 | - | |
510 | - | |
511 | -void rtsOBJ::insertVertexPosition(float x, float y, float z, unsigned char mask) | |
512 | -{ | |
513 | - vertex_position v; | |
514 | - v.x = x; | |
515 | - v.y = y; | |
516 | - v.z = z; | |
517 | - v.mask = mask; | |
518 | - | |
519 | - v_list.push_back(v); | |
520 | -} | |
521 | - | |
522 | -void rtsOBJ::insertLine(unsigned int num_points, unsigned int* pointlist, unsigned int* normallist, unsigned int* texturelist) | |
523 | -{ | |
524 | - //create the new primitive | |
525 | - primitive line; | |
526 | - line.type = OBJ_LINES; | |
527 | - line.mask = 0; | |
528 | - | |
529 | - //set the mask based on the passed data | |
530 | - if(pointlist != NULL) | |
531 | - line.mask = line.mask | OBJ_V; | |
532 | - if(normallist != NULL) | |
533 | - line.mask = line.mask | OBJ_VN; | |
534 | - if(texturelist != NULL) | |
535 | - line.mask = line.mask | OBJ_VT; | |
536 | - | |
537 | - //insert the line | |
538 | - int v; | |
539 | - vertex new_vert; | |
540 | - for(v=0; v<num_points; v++) | |
541 | - { | |
542 | - if(pointlist) | |
543 | - new_vert.v = pointlist[v]; | |
544 | - if(normallist) | |
545 | - new_vert.vn = normallist[v]; | |
546 | - if(texturelist) | |
547 | - new_vert.vt = texturelist[v]; | |
548 | - line.p.push_back(new_vert); | |
549 | - } | |
550 | - //insert the new primitive into the list | |
551 | - primitives.push_back(line); | |
552 | -} | |
553 | -OBJint rtsOBJ::f_InsertPointVertex() | |
554 | -{ | |
555 | - //insert the most recent point into the most recent point list | |
556 | - //if this is the first vertex, create the point list | |
557 | - if(g_NumVertices == 1) | |
558 | - { | |
559 | - primitive new_p; //create the new point | |
560 | - new_p.type = OBJ_POINTS; | |
561 | - new_p.mask = current_primitive_mask; | |
562 | - points.push_back(primitives.size()); //store the primitive id in the points list | |
563 | - primitives.push_back(new_p); | |
564 | - } | |
565 | - | |
566 | - //find the id of the most recent primitive | |
567 | - unsigned int p_index = primitives.size() - 1; | |
568 | - //find the index of the recent point | |
569 | - vertex p; | |
570 | - p.v = v_list.size() - 1; | |
571 | - //insert the indices for texture coordinates and normal if necessary | |
572 | - if(primitives[p_index].mask & OBJ_VT) | |
573 | - p.vt = vt_list.size() - 1; | |
574 | - if(primitives[p_index].mask & OBJ_VN) | |
575 | - p.vn = vn_list.size() - 1; | |
576 | - | |
577 | - //insert the vertex index into the primitive's point list | |
578 | - primitives[p_index].p.push_back(p); | |
579 | - | |
580 | - //push the point into the points list if it is not the only point in the primitive | |
581 | - if(g_NumVertices > 1) | |
582 | - points.push_back(p_index); | |
583 | - | |
584 | - return OBJ_OK; | |
585 | -} | |
586 | - | |
587 | -OBJint rtsOBJ::f_InsertLineVertex() | |
588 | -{ | |
589 | - //if this is an odd vertex, create a new line | |
590 | - if(g_NumVertices%2 == 1) | |
591 | - { | |
592 | - f_CreateNewLine(); | |
593 | - } | |
594 | - | |
595 | - f_InsertNewLineVertex(); | |
596 | - | |
597 | - return OBJ_OK; | |
598 | -} | |
599 | -OBJint rtsOBJ::f_InsertLineLoopVertex() | |
600 | -{ | |
601 | - //technically, this is the same as inserting a line strip vertex | |
602 | - f_InsertLineStripVertex(); | |
603 | - return OBJ_OK; | |
604 | -} | |
605 | - | |
606 | -OBJint rtsOBJ::f_InsertLineStripVertex() | |
607 | -{ | |
608 | - if(g_NumVertices == 1) | |
609 | - { | |
610 | - f_CreateNewLine(); | |
611 | - } | |
612 | - | |
613 | - f_InsertNewLineVertex(); | |
614 | - | |
615 | - return OBJ_OK; | |
616 | -} | |
617 | - | |
618 | -OBJint rtsOBJ::f_InsertTriangleVertex() | |
619 | -{ | |
620 | - //if this is the first vertex in a triangle, create a new triangle | |
621 | - if(g_NumVertices%3 == 1) | |
622 | - { | |
623 | - f_CreateNewFace(); | |
624 | - } | |
625 | - | |
626 | - | |
627 | - f_InsertNewFaceVertex(); | |
628 | - | |
629 | - return OBJ_OK; | |
630 | -} | |
631 | -OBJint rtsOBJ::f_InsertTriangleStripVertex() | |
632 | -{ | |
633 | - //in the special case of the first three vertices, just create a triangle | |
634 | - if(g_NumVertices <4) | |
635 | - f_InsertTriangleVertex(); | |
636 | - else | |
637 | - { | |
638 | - | |
639 | - //create a new face for the new triangle | |
640 | - f_CreateNewFace(); | |
641 | - | |
642 | - //insert the last two vertices from the previous triangle | |
643 | - f_InsertPreviousFaceVertex(1); | |
644 | - f_InsertPreviousFaceVertex(2); | |
645 | - //insert the new vertex | |
646 | - f_InsertNewFaceVertex(); | |
647 | - } | |
648 | - | |
649 | - return OBJ_OK; | |
650 | -} | |
651 | -OBJint rtsOBJ::f_InsertTriangleFanVertex() | |
652 | -{ | |
653 | - //in the special case of the first three vertices, just create a triangle | |
654 | - if(g_NumVertices <4) | |
655 | - f_InsertTriangleVertex(); | |
656 | - else | |
657 | - { | |
658 | - //create a new face for the new triangle | |
659 | - f_CreateNewFace(); | |
660 | - //add the previous vertices to the face | |
661 | - f_InsertFirstFaceVertex(0); | |
662 | - f_InsertPreviousFaceVertex(2); | |
663 | - //insert the current vertex | |
664 | - f_InsertNewFaceVertex(); | |
665 | - } | |
666 | - | |
667 | - return OBJ_OK; | |
668 | -} | |
669 | -OBJint rtsOBJ::f_InsertQuadVertex() | |
670 | -{ | |
671 | - //if this is the first vertex in a quad, create a new quad | |
672 | - if(g_NumVertices%4 == 1) | |
673 | - { | |
674 | - f_CreateNewFace(); | |
675 | - } | |
676 | - | |
677 | - f_InsertNewFaceVertex(); | |
678 | - | |
679 | - return OBJ_OK; | |
680 | -} | |
681 | -OBJint rtsOBJ::f_InsertQuadStripVertex() | |
682 | -{ | |
683 | - //in the case of one of the first four vertices, just create a quad | |
684 | - if(g_NumVertices < 5) | |
685 | - f_InsertQuadVertex(); | |
686 | - //if the vertex is odd (it will be the third vertex of a quad) | |
687 | - else if(g_NumVertices%2 == 1) | |
688 | - { | |
689 | - //create a new face for the new quad | |
690 | - f_CreateNewFace(); | |
691 | - //add the previous two vertices | |
692 | - f_InsertPreviousFaceVertex(2); | |
693 | - f_InsertPreviousFaceVertex(3); | |
694 | - //add the current vertex | |
695 | - f_InsertNewFaceVertex(); | |
696 | - } | |
697 | - else | |
698 | - { | |
699 | - //if this is the last vertex of the quad, just add it | |
700 | - f_InsertNewFaceVertex(); | |
701 | - | |
702 | - } | |
703 | - return OBJ_OK; | |
704 | -} | |
705 | -OBJint rtsOBJ::f_InsertPolygonVertex() | |
706 | -{ | |
707 | - //if this is the first vertex, create the quad | |
708 | - if(g_NumVertices == 1) | |
709 | - { | |
710 | - f_CreateNewFace(); | |
711 | - } | |
712 | - f_InsertNewFaceVertex(); | |
713 | - | |
714 | - return OBJ_OK; | |
715 | -} | |
716 | - | |
717 | -OBJint rtsOBJ::f_InsertPreviousFaceVertex(unsigned int v_index) | |
718 | -{ | |
719 | - /*Finds the vertex used in the previous face with the given index and | |
720 | - inserts it into the current face. This limits the redundancy in the file | |
721 | - for re-used vertices (in strips and fans). This also transfers texture | |
722 | - and normal information.*/ | |
723 | - | |
724 | - //find the index of the previous face | |
725 | - unsigned int prev_f_index = primitives.size() - 2; | |
726 | - //find the index of the current face | |
727 | - unsigned int f_index = prev_f_index +1; | |
728 | - //add the vertex information from the previous face to this face | |
729 | - primitives[f_index].p.push_back(primitives[prev_f_index].p[v_index]); | |
730 | - | |
731 | - return OBJ_OK; | |
732 | -} | |
733 | - | |
734 | -OBJint rtsOBJ::f_InsertFirstFaceVertex(unsigned int v_index) | |
735 | -{ | |
736 | - /*Finds the vertex used in the first face (since the last objBegin()) | |
737 | - with the given index and inserts it at the end of the current face. | |
738 | - This includes texture and normal information.*/ | |
739 | - | |
740 | - //The result depends on the type of face being rendered | |
741 | - //So far, this function only applies to triangle fans | |
742 | - if(g_CurrentMode != OBJ_TRIANGLE_FAN) | |
743 | - return OBJ_ERROR; | |
744 | - | |
745 | - //calculate the number of faces that have been rendered | |
746 | - unsigned int num_faces = g_NumVertices - 2; | |
747 | - //find the index of the first face | |
748 | - unsigned int first_f_index = primitives.size() - num_faces; | |
749 | - //find the index of the current face | |
750 | - unsigned int f_index = primitives.size() - 1; | |
751 | - //transfer the vertex information from the first face to this one | |
752 | - primitives[f_index].p.push_back(primitives[first_f_index].p[v_index]); | |
753 | - | |
754 | - | |
755 | - return OBJ_OK; | |
756 | -} | |
757 | - | |
758 | -OBJint rtsOBJ::f_InsertNewFaceVertex() | |
759 | -{ | |
760 | - /*This inserts information about the current vertex into the current face*/ | |
761 | - //find the new vertex index | |
762 | - vertex p; | |
763 | - p.v = v_list.size() -1; | |
764 | - p.vt = vt_list.size() - 1; | |
765 | - p.vn = vn_list.size() -1; | |
766 | - //find the face index | |
767 | - unsigned int f_index = primitives.size() -1; | |
768 | - //INSERT VERTEX AND ATTRIBUTE DATA | |
769 | - //just add the vertex to the face | |
770 | - primitives[f_index].p.push_back(p); | |
771 | - | |
772 | - return OBJ_OK; | |
773 | -} | |
774 | - | |
775 | -OBJint rtsOBJ::f_InsertNewLineVertex() | |
776 | -{ | |
777 | - /*This inserts information about the current vertex into the current line*/ | |
778 | - //find the new vertex index | |
779 | - vertex p; | |
780 | - p.v = v_list.size() -1; | |
781 | - p.vt = vt_list.size() - 1; | |
782 | - //find the line index | |
783 | - unsigned int l_index = primitives.size() -1; | |
784 | - | |
785 | - //ADD VERTEX AND ATTRIBUTE INFORMATION | |
786 | - //add the vertex to the line | |
787 | - primitives[l_index].p.push_back(p); | |
788 | - | |
789 | - return OBJ_OK; | |
790 | -} | |
791 | - | |
792 | -OBJint rtsOBJ::f_CreateNewFace() | |
793 | -{ | |
794 | - primitive new_f; | |
795 | - new_f.type = OBJ_FACE; | |
796 | - new_f.mask = g_AttributeMask; | |
797 | - faces.push_back(primitives.size()); | |
798 | - primitives.push_back(new_f); | |
799 | - | |
800 | - | |
801 | - return OBJ_OK; | |
802 | -} | |
803 | - | |
804 | -OBJint rtsOBJ::f_CreateNewLine() | |
805 | -{ | |
806 | - primitive new_l; | |
807 | - new_l.type = OBJ_LINES; | |
808 | - new_l.mask = g_AttributeMask; | |
809 | - lines.push_back(primitives.size()); | |
810 | - primitives.push_back(new_l); | |
811 | - | |
812 | - return OBJ_OK; | |
813 | -} | |
814 | - | |
815 | - | |
816 | -OBJint rtsOBJ::f_TerminateLineLoop() | |
817 | -{ | |
818 | - /*This function just terminates the line loop by setting the last vertex | |
819 | - to the first vertex.*/ | |
820 | - if(g_CurrentMode != OBJ_LINE_LOOP) | |
821 | - return OBJ_ERROR; | |
822 | - //find the index for the current line | |
823 | - unsigned int l_index = lines.size() -1; | |
824 | - //insert the first vertex as the last vertex | |
825 | - primitives[l_index].p.push_back(primitives[l_index].p[0]); | |
826 | - | |
827 | - return OBJ_OK; | |
828 | -} | |
829 | - | |
830 | -void rtsOBJ::f_OutputVertices() | |
831 | -{ | |
832 | - //get the number of vertices in the object | |
833 | - unsigned int v_num = v_list.size(); | |
834 | - for(unsigned int i=0; i<v_num; i++) | |
835 | - { | |
836 | - g_objFile<<"v"; | |
837 | - if(v_list[i].mask & OBJ_V_X) | |
838 | - g_objFile<<" "<<v_list[i].x; | |
839 | - if(v_list[i].mask & OBJ_V_Y) | |
840 | - g_objFile<<" "<<v_list[i].y; | |
841 | - if(v_list[i].mask & OBJ_V_Z) | |
842 | - g_objFile<<" "<<v_list[i].z; | |
843 | - if(v_list[i].mask & OBJ_V_W) | |
844 | - g_objFile<<" "<<v_list[i].w; | |
845 | - g_objFile<<endl; | |
846 | - } | |
847 | - | |
848 | -} | |
849 | - | |
850 | -void rtsOBJ::f_OutputVertexNormals() | |
851 | -{ | |
852 | - //get the number of normals in the object | |
853 | - unsigned int vn_num = vn_list.size(); | |
854 | - for(unsigned int i=0; i<vn_num; i++) | |
855 | - { | |
856 | - g_objFile<<"vn "; | |
857 | - if(vn_list[i].mask & OBJ_VN_I) | |
858 | - { | |
859 | - g_objFile<<vn_list[i].i; | |
860 | - if(vn_list[i].mask & OBJ_VN_J) | |
861 | - { | |
862 | - g_objFile<<" "<<vn_list[i].j; | |
863 | - if(vn_list[i].mask & OBJ_VN_K) | |
864 | - g_objFile<<" "<<vn_list[i].k; | |
865 | - } | |
866 | - } | |
867 | - g_objFile<<endl; | |
868 | - } | |
869 | -} | |
870 | - | |
871 | -void rtsOBJ::f_OutputTextureCoordinates() | |
872 | -{ | |
873 | - //get the number of vertices in the object | |
874 | - unsigned int vt_num = vt_list.size(); | |
875 | - for(unsigned int i=0; i<vt_num; i++) | |
876 | - { | |
877 | - g_objFile<<"vt "; | |
878 | - if(vt_list[i].mask & OBJ_VT_U) | |
879 | - { | |
880 | - g_objFile<<vt_list[i].u; | |
881 | - if(vt_list[i].mask & OBJ_VT_V) | |
882 | - { | |
883 | - g_objFile<<" "<<vt_list[i].v; | |
884 | - if(vt_list[i].mask & OBJ_VT_W) | |
885 | - g_objFile<<" "<<vt_list[i].w; | |
886 | - } | |
887 | - } | |
888 | - g_objFile<<endl; | |
889 | - } | |
890 | -} | |
891 | - | |
892 | -void rtsOBJ::f_OutputPoints() | |
893 | -{ | |
894 | - /* | |
895 | - //get the number of point vectors | |
896 | - unsigned int p_num = points.size(); | |
897 | - | |
898 | - //for each point vector, output the points | |
899 | - for(unsigned int i=0; i<p_num; i++) | |
900 | - { | |
901 | - g_objFile<<"p"; | |
902 | - unsigned int v_num = points[i].p.size(); | |
903 | - for(unsigned int j=0; j<v_num; j++) | |
904 | - { | |
905 | - g_objFile<<" "<<points[i].p[j].v+1; | |
906 | - } | |
907 | - g_objFile<<endl; | |
908 | - } | |
909 | - */ | |
910 | -} | |
911 | - | |
912 | -void rtsOBJ::f_OutputLines() | |
913 | -{ | |
914 | - /* | |
915 | - //get the number of line vectors | |
916 | - unsigned int l_num = lines.size(); | |
917 | - | |
918 | - //for each line vector, output the associated points | |
919 | - for(unsigned int i=0; i<l_num; i++) | |
920 | - { | |
921 | - g_objFile<<"l"; | |
922 | - unsigned int v_num = lines[i].p.size(); | |
923 | - for(unsigned int j=0; j<v_num; j++) | |
924 | - { | |
925 | - g_objFile<<" "<<lines[i].p[j].v+1; | |
926 | - //output texture coordinate if there are any | |
927 | - if(lines[i].mask & OBJ_VT) | |
928 | - g_objFile<<"/"<<lines[i].p[j].vt+1; | |
929 | - } | |
930 | - g_objFile<<endl; | |
931 | - } | |
932 | - */ | |
933 | -} | |
934 | - | |
935 | -void rtsOBJ::f_OutputFaces() | |
936 | -{ | |
937 | - /* | |
938 | - //get the number of faces | |
939 | - unsigned int f_num = faces.size(); | |
940 | - | |
941 | - //for each face, output the associated points | |
942 | - for(unsigned int i=0; i<f_num; i++) | |
943 | - { | |
944 | - g_objFile<<"f"; | |
945 | - //get the number of face vertices | |
946 | - unsigned int v_num = faces[i].p.size(); | |
947 | - for(unsigned int j=0; j<v_num; j++) | |
948 | - { | |
949 | - g_objFile<<" "<<faces[i].p[j].v+1; | |
950 | - //if there are texture coordinates | |
951 | - if(faces[i].mask & OBJ_VT) | |
952 | - g_objFile<<"/"<<faces[i].p[j].vt+1; | |
953 | - //if there is a normal | |
954 | - if(faces[i].mask & OBJ_VN) | |
955 | - { | |
956 | - //but no texture coordinates, put an extra slash | |
957 | - if(!(faces[i].mask & OBJ_VT)) | |
958 | - g_objFile<<"/"; | |
959 | - g_objFile<<"/"<<faces[i].p[j].vn+1; | |
960 | - } | |
961 | - | |
962 | - } | |
963 | - g_objFile<<endl; | |
964 | - } | |
965 | - */ | |
966 | -} | |
967 | - | |
968 | -void rtsOBJ::f_ClearAll() | |
969 | -{ | |
970 | - rtsOBJ(); | |
971 | - //clear all data from the global obj function | |
972 | - faces.clear(); | |
973 | - lines.clear(); | |
974 | - points.clear(); | |
975 | - v_list.clear(); | |
976 | - vn_list.clear(); | |
977 | - vt_list.clear(); | |
978 | - primitives.clear(); | |
979 | -} | |
980 | - | |
981 | -/*GLOBAL FUNCTION DEFINITIONS*/ | |
982 | -//initialize the OBJ file | |
983 | -OBJint objOpen(char* filename) | |
984 | -{ | |
985 | - return g_OBJ.objOpen(filename); | |
986 | -} | |
987 | -//close the obj file | |
988 | -OBJint objClose() | |
989 | -{ | |
990 | - return g_OBJ.objClose(); | |
991 | -} | |
992 | - | |
993 | -//start rendering in a certain mode | |
994 | -OBJint objBegin(OBJint mode) | |
995 | -{ | |
996 | - return g_OBJ.objBegin(mode); | |
997 | -} | |
998 | -//stop the current rendering sequence | |
999 | -OBJint objEnd(void) | |
1000 | -{ | |
1001 | - return g_OBJ.objEnd(); | |
1002 | -} | |
1003 | -//render a vertex to the file | |
1004 | -OBJint objVertex1f(float x) | |
1005 | -{ | |
1006 | - return g_OBJ.objVertex1f(x); | |
1007 | -} | |
1008 | - | |
1009 | -OBJint objVertex2f(float x, float y) | |
1010 | -{ | |
1011 | - return g_OBJ.objVertex2f(x, y); | |
1012 | -} | |
1013 | - | |
1014 | -OBJint objVertex3f(float x, float y, float z) | |
1015 | -{ | |
1016 | - return g_OBJ.objVertex3f(x, y, z); | |
1017 | -} | |
1018 | - | |
1019 | -OBJint objVertex4f(float x, float y, float z, float w) | |
1020 | -{ | |
1021 | - return g_OBJ.objVertex4f(x, y, z, w); | |
1022 | -} | |
1023 | -//set a normal vector for a vertex | |
1024 | -OBJint objNormal3f(float i, float j, float k) | |
1025 | -{ | |
1026 | - return g_OBJ.objNormal3f(i, j, k); | |
1027 | -} | |
1028 | -OBJint objNormal2f(float i, float j) | |
1029 | -{ | |
1030 | - return g_OBJ.objNormal2f(i, j); | |
1031 | -} | |
1032 | -OBJint objNormal1f(float i) | |
1033 | -{ | |
1034 | - return g_OBJ.objNormal1f(i); | |
1035 | -} | |
1036 | -//set a texture coordinate for a vertex | |
1037 | -OBJint objTexCoord3f(float u, float v, float w) | |
1038 | -{ | |
1039 | - return g_OBJ.objTexCoord3f(u, v, w); | |
1040 | -} | |
1041 | - | |
1042 | -OBJint objTexCoord2f(float u, float v) | |
1043 | -{ | |
1044 | - return g_OBJ.objTexCoord2f(u,v); | |
1045 | -} | |
1046 | - | |
1047 | -OBJint objTexCoord1f(float u) | |
1048 | -{ | |
1049 | - return g_OBJ.objTexCoord1f(u); | |
1050 | -} | |
1051 | - | |
1052 | -OBJint rtsOBJ::f_ReadPosition(ifstream &infile) | |
1053 | -{ | |
1054 | - vertex_position new_vertex; | |
1055 | - //get each coordinate | |
1056 | - infile>>new_vertex.x; | |
1057 | - new_vertex.mask = OBJ_V_X; | |
1058 | - | |
1059 | - if(infile.peek() == ' ') | |
1060 | - { | |
1061 | - infile>>new_vertex.y; | |
1062 | - new_vertex.mask = new_vertex.mask | OBJ_V_Y; | |
1063 | - } | |
1064 | - if(infile.peek() == ' ') | |
1065 | - { | |
1066 | - infile>>new_vertex.z; | |
1067 | - new_vertex.mask = new_vertex.mask | OBJ_V_Z; | |
1068 | - } | |
1069 | - if(infile.peek() == ' ') | |
1070 | - { | |
1071 | - infile>>new_vertex.w; | |
1072 | - new_vertex.mask = new_vertex.mask | OBJ_V_W; | |
1073 | - } | |
1074 | - int c = infile.peek(); | |
1075 | - //ignore the rest of the line | |
1076 | - infile.ignore(1000, '\n'); | |
1077 | - c = infile.peek(); | |
1078 | - | |
1079 | - //cout<<"vertex read: "<<new_vertex.x<<","<<new_vertex.y<<","<<new_vertex.z<<","<<new_vertex.w<<endl; | |
1080 | - //insert the vertex into the list | |
1081 | - v_list.push_back(new_vertex); | |
1082 | - | |
1083 | - //adjust the extents of the model | |
1084 | - f_AdjustExtents(new_vertex); | |
1085 | - | |
1086 | - return OBJ_OK; | |
1087 | -} | |
1088 | - | |
1089 | -OBJint rtsOBJ::f_ReadNormal(ifstream &infile) | |
1090 | -{ | |
1091 | - vertex_normal new_normal; | |
1092 | - infile>>new_normal.i; | |
1093 | - new_normal.mask = OBJ_VN_I; | |
1094 | - //get every other component | |
1095 | - if(infile.peek() == ' ') | |
1096 | - { | |
1097 | - infile>>new_normal.j; | |
1098 | - new_normal.mask = new_normal.mask | OBJ_VN_J; | |
1099 | - } | |
1100 | - if(infile.peek() == ' ') | |
1101 | - { | |
1102 | - infile>>new_normal.k; | |
1103 | - new_normal.mask = new_normal.mask | OBJ_VN_K; | |
1104 | - } | |
1105 | - //ignore the rest of the line | |
1106 | - infile.ignore(1000, '\n'); | |
1107 | - //insert the normal | |
1108 | - vn_list.push_back(new_normal); | |
1109 | - | |
1110 | - return OBJ_OK; | |
1111 | -} | |
1112 | - | |
1113 | -OBJint rtsOBJ::f_ReadTexCoord(ifstream &infile) | |
1114 | -{ | |
1115 | - vertex_texture new_texcoord; | |
1116 | - infile>>new_texcoord.u; | |
1117 | - new_texcoord.mask = OBJ_VT_U; | |
1118 | - //get every other component | |
1119 | - if(infile.peek() == ' ') | |
1120 | - { | |
1121 | - infile>>new_texcoord.v; | |
1122 | - new_texcoord.mask = new_texcoord.mask | OBJ_VT_V; | |
1123 | - } | |
1124 | - if(infile.peek() == ' ') | |
1125 | - { | |
1126 | - infile>>new_texcoord.w; | |
1127 | - new_texcoord.mask = new_texcoord.mask | OBJ_VT_W; | |
1128 | - } | |
1129 | - | |
1130 | - //ignore the rest of the line | |
1131 | - infile.ignore(1000, '\n'); | |
1132 | - //insert the texture coordinate | |
1133 | - vt_list.push_back(new_texcoord); | |
1134 | - | |
1135 | - return OBJ_OK; | |
1136 | - | |
1137 | -} | |
1138 | - | |
1139 | -OBJint rtsOBJ::f_ReadVertex(ifstream &infile, vertex &new_point, unsigned char &mask) | |
1140 | -{ | |
1141 | - //store the line vertex | |
1142 | - infile>>new_point.v; | |
1143 | - new_point.v--; | |
1144 | - mask = OBJ_V; | |
1145 | - //new_face.v.push_back(new_v - 1); | |
1146 | - if(infile.peek() == '/') | |
1147 | - { | |
1148 | - infile.get(); | |
1149 | - //if there actually is a texcoord | |
1150 | - if(infile.peek() != '/') | |
1151 | - { | |
1152 | - infile>>new_point.vt; //get the index | |
1153 | - new_point.vt--; | |
1154 | - mask = mask | OBJ_VT; //update the mask | |
1155 | - //new_face.vt.push_back(new_vt - 1); | |
1156 | - } | |
1157 | - } | |
1158 | - //check for a normal | |
1159 | - if(infile.peek() == '/') | |
1160 | - { | |
1161 | - infile.get(); | |
1162 | - infile>>new_point.vn; //get the index | |
1163 | - new_point.vn--; | |
1164 | - mask = mask | OBJ_VN; //update the mask | |
1165 | - } | |
1166 | - | |
1167 | - return OBJ_OK; | |
1168 | -} | |
1169 | - | |
1170 | -OBJint rtsOBJ::f_ReadPrimitive(ifstream &infile, primitive_type type) | |
1171 | -{ | |
1172 | - //create a new point list | |
1173 | - primitive new_primitive; | |
1174 | - new_primitive.type = type; | |
1175 | - //until the end of the line | |
1176 | - while(infile.peek() != '\n') | |
1177 | - { | |
1178 | - //read each point | |
1179 | - if(infile.peek() == ' ') | |
1180 | - infile.get(); | |
1181 | - else | |
1182 | - { | |
1183 | - vertex new_point; | |
1184 | - f_ReadVertex(infile, new_point, new_primitive.mask); | |
1185 | - new_primitive.p.push_back(new_point); | |
1186 | - } | |
1187 | - } | |
1188 | - //ignore the rest of the line | |
1189 | - infile.ignore(1000, '\n'); | |
1190 | - | |
1191 | - //push the id of the primitive into the new list | |
1192 | - //:DEBUG: | |
1193 | - if(type == OBJ_POINTS) | |
1194 | - points.push_back(primitives.size()); | |
1195 | - else if(type == OBJ_LINES) | |
1196 | - lines.push_back(primitives.size()); | |
1197 | - else if(type == OBJ_FACE) | |
1198 | - faces.push_back(primitives.size()); | |
1199 | - | |
1200 | - primitives.push_back(new_primitive); //push the new primitive | |
1201 | - | |
1202 | - return OBJ_OK; | |
1203 | -} | |
1204 | - | |
1205 | - | |
1206 | -OBJint rtsOBJ::f_AdjustExtents(vertex_position v) | |
1207 | -{ | |
1208 | - if(v.x < m_bounds.min.x) | |
1209 | - m_bounds.min.x = v.x; | |
1210 | - if(v.y < m_bounds.min.y) | |
1211 | - m_bounds.min.y = v.y; | |
1212 | - if(v.z < m_bounds.min.z) | |
1213 | - m_bounds.min.z = v.z; | |
1214 | - | |
1215 | - if(v.x > m_bounds.max.x) m_bounds.max.x = v.x; | |
1216 | - if(v.y > m_bounds.max.y) m_bounds.max.y = v.y; | |
1217 | - if(v.z > m_bounds.max.z) m_bounds.max.z = v.z; | |
1218 | - | |
1219 | - return OBJ_OK; | |
1220 | -} | |
1221 | - | |
1222 | -OBJint rtsOBJ::f_LoadOBJ(const char* filename) | |
1223 | -{ | |
1224 | - f_ClearAll(); | |
1225 | - //open the file as a stream | |
1226 | - ifstream infile; | |
1227 | - infile.open(filename); | |
1228 | - if(!infile.is_open()) | |
1229 | - return OBJ_ERROR; | |
1230 | - | |
1231 | - unsigned int vertices = 0; | |
1232 | - | |
1233 | - string token; | |
1234 | - infile>>token; | |
1235 | - while(!infile.eof()) | |
1236 | - { | |
1237 | - //if the token is some vertex property | |
1238 | - if(token == "v") | |
1239 | - f_ReadPosition(infile); | |
1240 | - else if(token == "vn") | |
1241 | - f_ReadNormal(infile); | |
1242 | - else if(token == "vt") | |
1243 | - f_ReadTexCoord(infile); | |
1244 | - else if(token == "p") | |
1245 | - f_ReadPrimitive(infile, OBJ_POINTS); | |
1246 | - else if(token == "l") | |
1247 | - f_ReadPrimitive(infile, OBJ_LINES); | |
1248 | - else if(token == "f") | |
1249 | - f_ReadPrimitive(infile, OBJ_FACE); | |
1250 | - else | |
1251 | - infile.ignore(9999, '\n'); | |
1252 | - //vertices++; | |
1253 | - | |
1254 | - infile>>token; | |
1255 | - } | |
1256 | - | |
1257 | -} | |
1258 | - | |
1259 | -OBJint rtsOBJ::f_LoadSWC(const char* filename) | |
1260 | -{ | |
1261 | - f_ClearAll(); | |
1262 | - //open the file as a stream | |
1263 | - ifstream infile; | |
1264 | - infile.open(filename); | |
1265 | - if(!infile.is_open()) | |
1266 | - return OBJ_ERROR; | |
1267 | - | |
1268 | - vector<vertex_position> swcVertices; | |
1269 | - float token; | |
1270 | - objBegin(OBJ_LINES); | |
1271 | - while(!infile.eof()) | |
1272 | - { | |
1273 | - vertex_position v; | |
1274 | - infile>>token; //get the id | |
1275 | - infile>>token; //get the fiber type | |
1276 | - infile>>v.x; //get the node position | |
1277 | - infile>>v.y; | |
1278 | - infile>>v.z; | |
1279 | - infile>>token; //get the radius | |
1280 | - infile>>token; //get the parent | |
1281 | - | |
1282 | - //insert the node into the swc vector | |
1283 | - swcVertices.push_back(v); | |
1284 | - //now draw the line from the parent to the current node | |
1285 | - if(token != -1) | |
1286 | - { | |
1287 | - objVertex3f(swcVertices[token-1].x, swcVertices[token-1].y, swcVertices[token-1].z); | |
1288 | - objVertex3f(v.x, v.y, v.z); | |
1289 | - } | |
1290 | - } | |
1291 | - objEnd(); | |
1292 | - | |
1293 | - | |
1294 | - return OBJ_OK; | |
1295 | - | |
1296 | -} | |
1297 | -OBJint rtsOBJ::LoadFile(const char* filename) | |
1298 | -{ | |
1299 | - string strFilename = filename; | |
1300 | - int length = strFilename.length(); | |
1301 | - string extension = strFilename.substr(strFilename.length() - 3, 3); | |
1302 | - if(!extension.compare(string("obj"))) | |
1303 | - return f_LoadOBJ(filename); | |
1304 | - else if(!extension.compare(string("swc"))) | |
1305 | - return f_LoadSWC(filename); | |
1306 | - else return f_LoadOBJ(filename); | |
1307 | - | |
1308 | -} | |
1309 | - | |
1310 | -OBJint rtsOBJ::SaveFile(const char* filename) | |
1311 | -{ | |
1312 | - //open the file as a stream | |
1313 | - ofstream outfile; | |
1314 | - outfile.open(filename); | |
1315 | - if(!outfile.is_open()) | |
1316 | - return OBJ_ERROR; | |
1317 | - | |
1318 | - //output vertex positions | |
1319 | - vector<vertex_position>::iterator v; | |
1320 | - for(v=v_list.begin(); v!= v_list.end(); v++) | |
1321 | - { | |
1322 | - outfile<<"v"; | |
1323 | - if((*v).mask & OBJ_V_X) | |
1324 | - { | |
1325 | - outfile<<' '<<(*v).x; | |
1326 | - if((*v).mask & OBJ_V_Y) | |
1327 | - { | |
1328 | - outfile<<' '<<(*v).y; | |
1329 | - if((*v).mask & OBJ_V_Z) | |
1330 | - { | |
1331 | - outfile<<' '<<(*v).z; | |
1332 | - if((*v).mask & OBJ_V_W) | |
1333 | - outfile<<' '<<(*v).w; | |
1334 | - } | |
1335 | - } | |
1336 | - } | |
1337 | - outfile<<'\n'; | |
1338 | - } | |
1339 | - | |
1340 | - //output vertex texture coordinates | |
1341 | - vector<vertex_texture>::iterator vt; | |
1342 | - for(vt=vt_list.begin(); vt!= vt_list.end(); vt++) | |
1343 | - { | |
1344 | - outfile<<"vt"; | |
1345 | - if((*vt).mask & OBJ_VT_U) | |
1346 | - { | |
1347 | - outfile<<' '<<(*vt).u; | |
1348 | - if((*vt).mask & OBJ_VT_V) | |
1349 | - { | |
1350 | - outfile<<' '<<(*vt).v; | |
1351 | - if((*vt).mask & OBJ_VT_W) | |
1352 | - outfile<<' '<<(*vt).w; | |
1353 | - } | |
1354 | - } | |
1355 | - outfile<<'\n'; | |
1356 | - } | |
1357 | - | |
1358 | - //output vertex normal coordinates | |
1359 | - vector<vertex_normal>::iterator vn; | |
1360 | - for(vn=vn_list.begin(); vn!= vn_list.end(); vn++) | |
1361 | - { | |
1362 | - outfile<<"vn"; | |
1363 | - if((*vn).mask & OBJ_VN_I) | |
1364 | - { | |
1365 | - outfile<<' '<<(*vn).i; | |
1366 | - if((*vn).mask & OBJ_VN_J) | |
1367 | - { | |
1368 | - outfile<<' '<<(*vn).j; | |
1369 | - if((*vn).mask & OBJ_VN_K) | |
1370 | - outfile<<' '<<(*vn).k; | |
1371 | - } | |
1372 | - } | |
1373 | - outfile<<'\n'; | |
1374 | - } | |
1375 | - | |
1376 | - //output each primitive | |
1377 | - vector<primitive>::iterator p; | |
1378 | - vector<vertex>::iterator vert; | |
1379 | - for(p=primitives.begin(); p!= primitives.end(); p++) | |
1380 | - { | |
1381 | - switch((*p).type) | |
1382 | - { | |
1383 | - case OBJ_POINTS: | |
1384 | - outfile<<"p"; //output the points token | |
1385 | - break; | |
1386 | - case OBJ_LINES: | |
1387 | - outfile<<"l"; //output the lines token | |
1388 | - break; | |
1389 | - case OBJ_FACE: | |
1390 | - outfile<<"f"; //output the face token | |
1391 | - break; | |
1392 | - } | |
1393 | - | |
1394 | - //for each vertex in the list for the primitive | |
1395 | - for(vert = (*p).p.begin(); vert != (*p).p.end(); vert++) | |
1396 | - { | |
1397 | - outfile<<' '<<(*vert).v + 1; | |
1398 | - if((*p).mask & OBJ_VT) | |
1399 | - outfile<<'/'<<(*vert).vt + 1; | |
1400 | - if((*p).mask & OBJ_VN) | |
1401 | - { | |
1402 | - if(!((*p).mask & OBJ_VT)) | |
1403 | - outfile<<'/'; | |
1404 | - outfile<<'/'<<(*vert).vn + 1; | |
1405 | - } | |
1406 | - } | |
1407 | - outfile<<'\n'; | |
1408 | - | |
1409 | - } | |
1410 | - | |
1411 | - | |
1412 | - | |
1413 | -} | |
1414 | - | |
1415 | -//get methods | |
1416 | -unsigned int rtsOBJ::getNumVertices(){return v_list.size();} | |
1417 | -unsigned int rtsOBJ::getNumLines(){return lines.size();} | |
1418 | -unsigned int rtsOBJ::getNumFaces(){return faces.size();} | |
1419 | -unsigned int rtsOBJ::getNumPointLists(){return points.size();} | |
1420 | -unsigned int rtsOBJ::getNumTexCoords(){return vt_list.size();} | |
1421 | -unsigned int rtsOBJ::getNumNormals(){return vn_list.size();} | |
1422 | - | |
1423 | -//these functions return the coordinate index as well as the value | |
1424 | -unsigned int rtsOBJ::getNumFaceVertices(unsigned int face){return primitives[face].p.size();} | |
1425 | -unsigned int rtsOBJ::getFaceVertex(unsigned int face, unsigned int vertex){return primitives[face].p[vertex].v;} | |
1426 | -unsigned int rtsOBJ::getFaceNormal(unsigned int face, unsigned int normal){return primitives[face].p[normal].vn;} | |
1427 | -unsigned int rtsOBJ::getFaceTexCoord(unsigned int face, unsigned int texcoord){return primitives[face].p[texcoord].vt;} | |
1428 | -unsigned int rtsOBJ::getNumLineVertices(unsigned int line){return primitives[line].p.size();} | |
1429 | -unsigned int rtsOBJ::getLineVertex(unsigned int line, unsigned int vertex){return primitives[line].p[vertex].v;} | |
1430 | -unsigned int rtsOBJ::getLineTexCoord(unsigned int line, unsigned int texcoord){return primitives[line].p[texcoord].vt;} | |
1431 | -point3D<float> rtsOBJ::getVertex3d(unsigned int index) | |
1432 | -{ | |
1433 | - return point3D<float>(v_list[index].x, v_list[index].y, v_list[index].z); | |
1434 | -} | |
1435 | -point3D<float> rtsOBJ::getTexCoord3d(unsigned int index) | |
1436 | -{ | |
1437 | - return point3D<float>(vt_list[index].u, vt_list[index].v, vt_list[index].w); | |
1438 | -} | |
1439 | -point3D<float> rtsOBJ::getNormal3d(unsigned int index) | |
1440 | -{ | |
1441 | - return point3D<float>(vn_list[index].i, vn_list[index].j, vn_list[index].k); | |
1442 | -} | |
1443 | -vertex_position rtsOBJ::getVertex(unsigned int index){return v_list[index];} | |
1444 | -vertex_texture rtsOBJ::getTexCoord(unsigned int index){return vt_list[index];} | |
1445 | -vertex_normal rtsOBJ::getNormal(unsigned int index){return vn_list[index];} | |
1446 | - | |
1447 | - | |
1448 | -unsigned int rtsOBJ::getPrimitiveType(unsigned int primitive) | |
1449 | -{ | |
1450 | - /* | |
1451 | - switch(primitives[i].type) | |
1452 | - { | |
1453 | - case OBJ_POINTS: | |
1454 | - return OBJ_POINTS; | |
1455 | - break; | |
1456 | - case OBJ_LINES: | |
1457 | - return OBJ_LINES; | |
1458 | - break; | |
1459 | - case OBJ_FACE: | |
1460 | - f_RenderFace(i); | |
1461 | - break; | |
1462 | - }*/ | |
1463 | - return 0; | |
1464 | -} | |
1465 | -/****************************************************/ | |
1466 | -/*******Iterator Methods*****************************/ | |
1467 | -/****************************************************/ | |
1468 | - | |
1469 | -rtsOBJ::iterator rtsOBJ::begin() | |
1470 | -{ | |
1471 | - //create an iterator that will be returned and assign it to this OBJ | |
1472 | - iterator result; | |
1473 | - result.obj = this; | |
1474 | - result.end_object = false; | |
1475 | - result.end_primitive = false; | |
1476 | - | |
1477 | - //if there are no primitives, return the end iterator | |
1478 | - if(primitives.size() == 0) | |
1479 | - return end(); | |
1480 | - | |
1481 | - //start at the beginning of the primitive array | |
1482 | - result.primitive_index = 0; | |
1483 | - | |
1484 | - return result; | |
1485 | -} | |
1486 | - | |
1487 | -rtsOBJ::iterator rtsOBJ::end() | |
1488 | -{ | |
1489 | - //create an end iterator to return | |
1490 | - iterator result; | |
1491 | - result.obj = this; | |
1492 | - result.end_primitive = true; | |
1493 | - result.primitive_index = result.obj->primitives.size(); | |
1494 | - | |
1495 | - return result; | |
1496 | -} | |
1497 | - | |
1498 | -void rtsOBJ::iterator::operator++() | |
1499 | -{ | |
1500 | - primitive_index++; | |
1501 | - if(primitive_index >= obj->primitives.size()) | |
1502 | - (*this) = obj->end(); | |
1503 | - | |
1504 | -} | |
1505 | - | |
1506 | -bool rtsOBJ::iterator::operator ==(rtsOBJ::iterator operand) | |
1507 | -{ | |
1508 | - if(operand.primitive_index == primitive_index) | |
1509 | - return true; | |
1510 | - else return false; | |
1511 | -} | |
1512 | - | |
1513 | -bool rtsOBJ::iterator::operator !=(rtsOBJ::iterator operand) | |
1514 | -{ | |
1515 | - if(operand.primitive_index != primitive_index) | |
1516 | - return true; | |