~ubuntu-branches/ubuntu/quantal/mesa/quantal-proposed

« back to all changes in this revision

Viewing changes to src/glu/sgi/libnurbs/nurbtess/sampleComp.cc

  • Committer: Package Import Robot
  • Author(s): Timo Aaltonen
  • Date: 2012-09-17 13:24:35 UTC
  • mfrom: (1.7.9)
  • Revision ID: package-import@ubuntu.com-20120917132435-fqt9q6beebhc8t9r
Tags: 9.0~git20120917.7cfd42ce-0ubuntu1
Merge from unreleased debian git. (LP: #1047306)

Show diffs side-by-side

added added

removed removed

Lines of Context:
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