ReactOS  0.4.13-dev-257-gfabbd7c
sampleComp.cc
Go to the documentation of this file.
1 /*
2 ** License Applicability. Except to the extent portions of this file are
3 ** made subject to an alternative license as permitted in the SGI Free
4 ** Software License B, Version 1.1 (the "License"), the contents of this
5 ** file are subject only to the provisions of the License. You may not use
6 ** this file except in compliance with the License. You may obtain a copy
7 ** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600
8 ** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at:
9 **
10 ** http://oss.sgi.com/projects/FreeB
11 **
12 ** Note that, as provided in the License, the Software is distributed on an
13 ** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS
14 ** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND
15 ** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A
16 ** PARTICULAR PURPOSE, AND NON-INFRINGEMENT.
17 **
18 ** Original Code. The Original Code is: OpenGL Sample Implementation,
19 ** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics,
20 ** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc.
21 ** Copyright in any portions created by third parties is as indicated
22 ** elsewhere herein. All Rights Reserved.
23 **
24 ** Additional Notice Provisions: The application programming interfaces
25 ** established by SGI in conjunction with the Original Code are The
26 ** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released
27 ** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version
28 ** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X
29 ** Window System(R) (Version 1.3), released October 19, 1998. This software
30 ** was created using the OpenGL(R) version 1.2.1 Sample Implementation
31 ** published by SGI, but has not been independently verified as being
32 ** compliant with the OpenGL(R) version 1.2.1 Specification.
33 **
34 */
35 /*
36 */
37 
38 //#include <stdlib.h>
39 //#include <stdio.h>
40 //#include "glimports.h"
41 #include "sampleComp.h"
42 #include "sampleCompTop.h"
43 #include "sampleCompBot.h"
44 #include "sampleCompRight.h"
45 
46 
47 
48 #define max(a,b) ((a>b)? a:b)
49 #define min(a,b) ((a>b)? b:a)
50 
51 void sampleConnectedComp(Real* topVertex, Real* botVertex,
52  vertexArray* leftChain,
53  Int leftStartIndex, Int leftEndIndex,
54  vertexArray* rightChain,
55  Int rightStartIndex, Int rightEndIndex,
56  gridBoundaryChain* leftGridChain,
57  gridBoundaryChain* rightGridChain,
58  Int gridIndex1, Int gridIndex2,
59  Int up_leftCornerWhere,
60  Int up_leftCornerIndex,
61  Int up_rightCornerWhere,
62  Int up_rightCornerIndex,
63  Int down_leftCornerWhere,
64  Int down_leftCornerIndex,
65  Int down_rightCornerWhere,
66  Int down_rightCornerIndex,
67  primStream* pStream,
68  rectBlockArray* rbArray
69  )
70 {
71 
72  sampleCompLeft(topVertex, botVertex,
73  leftChain,
74  leftStartIndex, leftEndIndex,
75  rightChain,
76  rightStartIndex, rightEndIndex,
77  leftGridChain,
78  gridIndex1,
79  gridIndex2,
80  up_leftCornerWhere,
81  up_leftCornerIndex,
82  down_leftCornerWhere,
83  down_leftCornerIndex,
84  pStream);
85 
86 
87  sampleCompRight(topVertex, botVertex,
88  leftChain,
89  leftStartIndex, leftEndIndex,
90  rightChain,
91  rightStartIndex,
92  rightEndIndex,
93  rightGridChain,
94  gridIndex1, gridIndex2,
95  up_rightCornerWhere,
96  up_rightCornerIndex,
97  down_rightCornerWhere,
98  down_rightCornerIndex,
99  pStream);
100 
101 
102  sampleCompTop(topVertex,
103  leftChain,
104  leftStartIndex,
105  rightChain,
106  rightStartIndex,
107  leftGridChain,
108  rightGridChain,
109  gridIndex1,
110  up_leftCornerWhere,
111  up_leftCornerIndex,
112  up_rightCornerWhere,
113  up_rightCornerIndex,
114  pStream);
115 
116  sampleCompBot(botVertex,
117  leftChain,
118  leftEndIndex,
119  rightChain,
120  rightEndIndex,
121  leftGridChain,
122  rightGridChain,
123  gridIndex2,
124  down_leftCornerWhere,
125  down_leftCornerIndex,
126  down_rightCornerWhere,
127  down_rightCornerIndex,
128  pStream);
129 
130 
131  //the center
132 
133  rbArray->insert(new rectBlock(leftGridChain, rightGridChain, gridIndex1, gridIndex2));
134 
135 
136 }
137 
138 /*notice that we need rightChain because the
139  *corners could be on the rightChain.
140  *here comp means component.
141  */
142 void sampleCompLeft(Real* topVertex, Real* botVertex,
143  vertexArray* leftChain,
144  Int leftStartIndex, Int leftEndIndex,
145  vertexArray* rightChain,
146  Int rightStartIndex, Int rightEndIndex,
147  gridBoundaryChain* leftGridChain,
148  Int gridIndex1, Int gridIndex2,
149  Int up_leftCornerWhere,
150  Int up_leftCornerIndex,
151  Int down_leftCornerWhere,
152  Int down_leftCornerIndex,
153  primStream* pStream)
154 {
155  /*find out whether there is a trim vertex which is
156  *inbetween the top and bot grid lines or not.
157  */
158  Int midIndex1;
159  Int midIndex2;
160  Int gridMidIndex1 = 0, gridMidIndex2 = 0;
161  //midIndex1: array[i] <= v, array[i-1] > v
162  //midIndex2: array[i] >= v, array[i+1] < v
163  // v(gridMidIndex1) >= v(midindex1) > v(gridMidIndex1+1)
164  // v(gridMidIndex2-1) >= v(midIndex2) > v(gridMidIndex2) ??
165  midIndex1 = leftChain->findIndexBelowGen(
166  leftGridChain->get_v_value(gridIndex1),
167  leftStartIndex,
168  leftEndIndex);
169 
170  midIndex2 = -1; /*initilization*/
171  if(midIndex1<= leftEndIndex && gridIndex1<gridIndex2)
172  if(leftChain->getVertex(midIndex1)[1] >= leftGridChain->get_v_value(gridIndex2))
173  {
174  midIndex2 = leftChain->findIndexAboveGen(
175  leftGridChain->get_v_value(gridIndex2),
176  midIndex1, //midIndex1 <= midIndex2.
177  leftEndIndex);
178  gridMidIndex1 = leftGridChain->lookfor(leftChain->getVertex(midIndex1)[1],
179  gridIndex1, gridIndex2);
180  gridMidIndex2 = 1+leftGridChain->lookfor(leftChain->getVertex(midIndex2)[1],
181  gridMidIndex1, gridIndex2);
182  }
183 
184 
185  /*to interprete the corner information*/
186  Real* cornerTop;
187  Real* cornerBot;
188  Int cornerLeftStart;
189  Int cornerLeftEnd;
190  Int cornerRightUpEnd;
191  Int cornerRightDownStart;
192  if(up_leftCornerWhere == 0) /*left corner is on left chain*/
193  {
194  cornerTop = leftChain->getVertex(up_leftCornerIndex);
195  cornerLeftStart = up_leftCornerIndex+1;
196  cornerRightUpEnd = -1; /*no right*/
197  }
198  else if(up_leftCornerWhere == 1) /*left corner is on top*/
199  {
200  cornerTop = topVertex;
201  cornerLeftStart = leftStartIndex;
202  cornerRightUpEnd = -1; /*no right*/
203  }
204  else /*left corner is on right chain*/
205  {
206  cornerTop = topVertex;
207  cornerLeftStart = leftStartIndex;
208  cornerRightUpEnd = up_leftCornerIndex;
209  }
210 
211  if(down_leftCornerWhere == 0) /*left corner is on left chain*/
212  {
213  cornerBot = leftChain->getVertex(down_leftCornerIndex);
214  cornerLeftEnd = down_leftCornerIndex-1;
215  cornerRightDownStart = rightEndIndex+1; /*no right*/
216  }
217  else if(down_leftCornerWhere == 1) /*left corner is on bot*/
218  {
219  cornerBot = botVertex;
220  cornerLeftEnd = leftEndIndex;
221  cornerRightDownStart = rightEndIndex+1; /*no right*/
222  }
223  else /*left corner is on the right chian*/
224  {
225  cornerBot = botVertex;
226  cornerLeftEnd = leftEndIndex;
227  cornerRightDownStart = down_leftCornerIndex;
228  }
229 
230 
231 
232 
233  /*sample*/
234  if(midIndex2 >= 0) /*there is a trim point inbewteen grid lines*/
235  {
236 
237  sampleLeftSingleTrimEdgeRegionGen(cornerTop, leftChain->getVertex(midIndex1),
238  leftChain,
239  cornerLeftStart,
240  midIndex1-1,
241  leftGridChain,
242  gridIndex1,
243  gridMidIndex1,
244  rightChain,
245  rightStartIndex,
246  cornerRightUpEnd,
247  0, //no right down section
248  -1,
249  pStream);
250 
251  sampleLeftSingleTrimEdgeRegionGen(leftChain->getVertex(midIndex2),
252  cornerBot,
253  leftChain,
254  midIndex2+1,
255  cornerLeftEnd,
256  leftGridChain,
257  gridMidIndex2,
258  gridIndex2,
259  rightChain,
260  0, //no right up section
261  -1,
262  cornerRightDownStart,
263  rightEndIndex,
264  pStream);
265 
266 
267  sampleLeftStripRecF(leftChain,
268  midIndex1,
269  midIndex2,
270  leftGridChain,
271  gridMidIndex1,
272  gridMidIndex2,
273  pStream);
274  }
275  else
276  {
277  sampleLeftSingleTrimEdgeRegionGen(cornerTop, cornerBot,
278  leftChain,
279  cornerLeftStart,
280  cornerLeftEnd,
281  leftGridChain,
282  gridIndex1,
283  gridIndex2,
284  rightChain,
285  rightStartIndex,
286  cornerRightUpEnd,
287  cornerRightDownStart,
288  rightEndIndex,
289  pStream);
290  }
291 }
292 
293 void sampleLeftSingleTrimEdgeRegionGen(Real topVert[2], Real botVert[2],
294  vertexArray* leftChain,
295  Int leftStart,
296  Int leftEnd,
297  gridBoundaryChain* gridChain,
298  Int gridBeginIndex,
299  Int gridEndIndex,
300  vertexArray* rightChain,
301  Int rightUpBegin,
302  Int rightUpEnd,
303  Int rightDownBegin,
304  Int rightDownEnd,
305  primStream* pStream)
306 {
307  Int i,j,k;
308 
309  /*creat an array to store all the up and down secments of the right chain,
310  *and the left end grid points
311  *
312  *although vertex array is a dynamic array, but to gain efficiency,
313  *it is better to initiliza the exact array size
314  */
315  vertexArray vArray(gridEndIndex-gridBeginIndex+1 +
316  max(0,rightUpEnd - rightUpBegin+1)+
317  max(0,rightDownEnd - rightDownBegin+1));
318 
319  /*append the vertices on the up section of thr right chain*/
320  for(i=rightUpBegin; i<= rightUpEnd; i++)
321  vArray.appendVertex(rightChain->getVertex(i));
322 
323  /*append the vertices of the left extremal grid points,
324  *and at the same time, perform triangulation for the stair cases
325  */
326  vArray.appendVertex(gridChain->get_vertex(gridBeginIndex));
327 
328  for(k=1, i=gridBeginIndex+1; i<=gridEndIndex; i++, k++)
329  {
330  vArray.appendVertex(gridChain->get_vertex(i));
331 
332  /*output the fan of the grid points of the (i)th and (i-1)th grid line.
333  */
334  if(gridChain->getUlineIndex(i) < gridChain->getUlineIndex(i-1))
335  {
336  pStream->begin();
337  pStream->insert(gridChain->get_vertex(i-1));
338  for(j=gridChain->getUlineIndex(i); j<= gridChain->getUlineIndex(i-1); j++)
339  pStream->insert(gridChain->getGrid()->get_u_value(j), gridChain->get_v_value(i));
340  pStream->end(PRIMITIVE_STREAM_FAN);
341  }
342  else if(gridChain->getUlineIndex(i) > gridChain->getUlineIndex(i-1))
343  {
344  pStream->begin();
345  pStream->insert(gridChain->get_vertex(i));
346  for(j=gridChain->getUlineIndex(i); j>= gridChain->getUlineIndex(i-1); j--)
347  pStream->insert(gridChain->getGrid()->get_u_value(j), gridChain->get_v_value(i-1));
348  pStream->end(PRIMITIVE_STREAM_FAN);
349  }
350  /*otherwisem, the two are equal, so there is no fan to outout*/
351  }
352 
353  /*then append all the vertices on the down section of the right chain*/
354  for(i=rightDownBegin; i<= rightDownEnd; i++)
355  vArray.appendVertex(rightChain->getVertex(i));
356 
357  monoTriangulationRecGen(topVert, botVert,
358  leftChain, leftStart, leftEnd,
359  &vArray, 0, vArray.getNumElements()-1,
360  pStream);
361 
362 }
363 
364 
365 
366 
367 
368 
369 
370 
371 
void monoTriangulationRecGen(Real *topVertex, Real *botVertex, vertexArray *inc_chain, Int inc_current, Int inc_end, vertexArray *dec_chain, Int dec_current, Int dec_end, primStream *pStream)
void sampleConnectedComp(Real *topVertex, Real *botVertex, vertexArray *leftChain, Int leftStartIndex, Int leftEndIndex, vertexArray *rightChain, Int rightStartIndex, Int rightEndIndex, gridBoundaryChain *leftGridChain, gridBoundaryChain *rightGridChain, Int gridIndex1, Int gridIndex2, Int up_leftCornerWhere, Int up_leftCornerIndex, Int up_rightCornerWhere, Int up_rightCornerIndex, Int down_leftCornerWhere, Int down_leftCornerIndex, Int down_rightCornerWhere, Int down_rightCornerIndex, primStream *pStream, rectBlockArray *rbArray)
Definition: sampleComp.cc:51
void appendVertex(Real *ptr)
void sampleLeftStripRecF(vertexArray *leftChain, Int topLeftIndex, Int botLeftIndex, gridBoundaryChain *leftGridChain, Int leftGridChainStartIndex, Int leftGridChainEndIndex, primStream *pStream)
void insert(Real u, Real v)
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
Int lookfor(Real v, Int i1, Int i2)
Definition: gridWrap.cc:232
Real * get_vertex(Int i)
Definition: gridWrap.h:127
Real get_u_value(Int i)
Definition: gridWrap.h:78
Int findIndexBelowGen(Real v, Int startIndex, Int EndIndex)
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250
Int getUlineIndex(Int i)
Definition: gridWrap.h:120
void sampleCompTop(Real *topVertex, vertexArray *leftChain, Int leftStartIndex, vertexArray *rightChain, Int rightStartIndex, gridBoundaryChain *leftGridChain, gridBoundaryChain *rightGridChain, Int gridIndex1, Int up_leftCornerWhere, Int up_leftCornerIndex, Int up_rightCornerWhere, Int up_rightCornerIndex, primStream *pStream)
void sampleCompLeft(Real *topVertex, Real *botVertex, vertexArray *leftChain, Int leftStartIndex, Int leftEndIndex, vertexArray *rightChain, Int rightStartIndex, Int rightEndIndex, gridBoundaryChain *leftGridChain, Int gridIndex1, Int gridIndex2, Int up_leftCornerWhere, Int up_leftCornerIndex, Int down_leftCornerWhere, Int down_leftCornerIndex, primStream *pStream)
Definition: sampleComp.cc:142
gridWrap * getGrid()
Definition: gridWrap.h:128
#define max(a, b)
Definition: sampleComp.cc:48
Real get_v_value(Int i)
Definition: gridWrap.h:122
void sampleCompRight(Real *topVertex, Real *botVertex, vertexArray *leftChain, Int leftStartIndex, Int leftEndIndex, vertexArray *rightChain, Int rightStartIndex, Int rightEndIndex, gridBoundaryChain *rightGridChain, Int gridIndex1, Int gridIndex2, Int up_rightCornerWhere, Int up_rightCornerIndex, Int down_rightCornerWhere, Int down_rightCornerIndex, primStream *pStream)
void sampleLeftSingleTrimEdgeRegionGen(Real topVert[2], Real botVert[2], vertexArray *leftChain, Int leftStart, Int leftEnd, gridBoundaryChain *gridChain, Int gridBeginIndex, Int gridEndIndex, vertexArray *rightChain, Int rightUpBegin, Int rightUpEnd, Int rightDownBegin, Int rightDownEnd, primStream *pStream)
Definition: sampleComp.cc:293
float Real
Definition: definitions.h:36
void end(Int type)
void insert(rectBlock *newBlock)
Definition: rectBlock.cc:152
Real * getVertex(Int i)
void sampleCompBot(Real *botVertex, vertexArray *leftChain, Int leftEnd, vertexArray *rightChain, Int rightEnd, gridBoundaryChain *leftGridChain, gridBoundaryChain *rightGridChain, Int gridIndex, Int down_leftCornerWhere, Int down_leftCornerIndex, Int down_rightCornerWhere, Int down_rightCornerIndex, primStream *pStream)
int k
Definition: mpi.c:3369
Int findIndexAboveGen(Real v, Int startIndex, Int EndIndex)
int Int
Definition: definitions.h:37