FreeWRL/FreeX3D  3.0.0
sampleCompRight.cc
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 "gluos.h"
41 #include "glimports.h"
42 #include "zlassert.h"
43 #include "sampleCompRight.h"
44 
45 #define max(a,b) ((a>b)? a:b)
46 #define min(a,b) ((a>b)? b:a)
47 
48 
49 
50 #ifdef NOT_TAKEOUT
51 
52 /*notice that we need leftChain because the
53  *corners could be on the leftChain.
54  */
55 void sampleCompRight(Real* topVertex, Real* botVertex,
56  vertexArray* leftChain,
57  Int leftStartIndex, Int leftEndIndex,
58  vertexArray* rightChain,
59  Int rightStartIndex, Int rightEndIndex,
60  gridBoundaryChain* rightGridChain,
61  Int gridIndex1, Int gridIndex2,
62  Int up_rightCornerWhere,
63  Int up_rightCornerIndex,
64  Int down_rightCornerWhere,
65  Int down_rightCornerIndex,
66  primStream* pStream)
67 {
68  /*find out whether there is a trim vertex which is
69  *inbetween the top and bot grid lines or not.
70  */
71  Int midIndex1;
72  Int midIndex2;
73  Int gridMidIndex1 = 0, gridMidIndex2 = 0;
74  //midIndex1: array[i] <= v, array[i+1] > v
75  //midIndex2: array[i] >= v, array[i+1] < v
76  midIndex1 = rightChain->findIndexBelowGen(rightGridChain->get_v_value(gridIndex1),
77  rightStartIndex,
78  rightEndIndex);
79  midIndex2 = -1; //initilization
80  if(midIndex1 <= rightEndIndex && gridIndex1 < gridIndex2)
81  if(rightChain->getVertex(midIndex1)[1] >= rightGridChain->get_v_value(gridIndex2))
82  {
83  //midIndex2 must exist:
84  midIndex2 = rightChain->findIndexAboveGen(rightGridChain->get_v_value(gridIndex2),
85  midIndex1, //midIndex1<=midIndex2
86  rightEndIndex);
87  //find gridMidIndex1 so that either it=gridIndex1 when the gridline is
88  // at the same height as trim vertex midIndex1, or it is the last one
89  //which is strictly above midIndex1.
90  {
91  Real temp = rightChain->getVertex(midIndex1)[1];
92  if(rightGridChain->get_v_value(gridIndex1) == temp)
93  gridMidIndex1 = gridIndex1;
94  else
95  {
96  gridMidIndex1 = gridIndex1;
97  while(rightGridChain->get_v_value(gridMidIndex1) > temp)
98  gridMidIndex1++;
99  gridMidIndex1--;
100  }
101  }//end of find gridMindIndex1
102  //find gridMidIndex2 so that it is the (first one below or equal
103  //midIndex) last one above or equal midIndex2
104  {
105  Real temp = rightChain->getVertex(midIndex2)[1];
106  for(gridMidIndex2 = gridMidIndex1+1; gridMidIndex2 <= gridIndex2; gridMidIndex2++)
107  if(rightGridChain->get_v_value(gridMidIndex2) <= temp)
108  break;
109 
110  assert(gridMidIndex2 <= gridIndex2);
111  }//end of find gridMidIndex2
112  }
113 
114 
115 
116  //to interprete the corner information
117  Real* cornerTop;
118  Real* cornerBot;
119  Int cornerRightStart;
120  Int cornerRightEnd;
121  Int cornerLeftUpEnd;
122  Int cornerLeftDownStart;
123  if(up_rightCornerWhere == 2) //right corner is on right chain
124  {
125  cornerTop = rightChain->getVertex(up_rightCornerIndex);
126  cornerRightStart = up_rightCornerIndex+1;
127  cornerLeftUpEnd = -1; //no left
128  }
129  else if(up_rightCornerWhere == 1) //right corner is on top
130  {
131  cornerTop = topVertex;
132  cornerRightStart = rightStartIndex;
133  cornerLeftUpEnd = -1; //no left
134  }
135  else //right corner is on left chain
136  {
137  cornerTop = topVertex;
138  cornerRightStart = rightStartIndex;
139  cornerLeftUpEnd = up_rightCornerIndex;
140  }
141 
142  if(down_rightCornerWhere == 2) //right corner is on right chan
143  {
144  cornerBot = rightChain->getVertex(down_rightCornerIndex);
145  cornerRightEnd = down_rightCornerIndex-1;
146  cornerLeftDownStart = leftEndIndex+1; //no left
147  }
148  else if (down_rightCornerWhere == 1) //right corner is at bot
149  {
150  cornerBot = botVertex;
151  cornerRightEnd = rightEndIndex;
152  cornerLeftDownStart = leftEndIndex+1; //no left
153  }
154  else //right corner is on the left chain
155  {
156  cornerBot = botVertex;
157  cornerRightEnd = rightEndIndex;
158  cornerLeftDownStart = down_rightCornerIndex;
159  }
160 
161  //sample
162  if(midIndex2 >= 0) //there is a trm point between grid lines
163  {
164 
165  sampleRightSingleTrimEdgeRegionGen(cornerTop, rightChain->getVertex(midIndex1),
166  rightChain,
167  cornerRightStart,
168  midIndex1-1,
169  rightGridChain,
170  gridIndex1,
171  gridMidIndex1,
172  leftChain,
173  leftStartIndex,
174  cornerLeftUpEnd,
175  0, //no left down section,
176  -1,
177  pStream);
178 
179  sampleRightSingleTrimEdgeRegionGen(rightChain->getVertex(midIndex2),
180  cornerBot,
181  rightChain,
182  midIndex2+1,
183  cornerRightEnd,
184  rightGridChain,
185  gridMidIndex2,
186  gridIndex2,
187  leftChain,
188  0, //no left up section
189  -1,
190  cornerLeftDownStart,
191  leftEndIndex,
192  pStream);
193 
194  sampleRightStripRecF(rightChain,
195  midIndex1,
196  midIndex2,
197  rightGridChain,
198  gridMidIndex1,
199  gridMidIndex2,
200  pStream);
201 
202  }
203  else
204  {
205  sampleRightSingleTrimEdgeRegionGen(cornerTop, cornerBot,
206  rightChain,
207  cornerRightStart,
208  cornerRightEnd,
209  rightGridChain,
210  gridIndex1,
211  gridIndex2,
212  leftChain,
213  leftStartIndex,
214  cornerLeftUpEnd,
215  cornerLeftDownStart,
216  leftEndIndex,
217  pStream);
218  }
219 }
220 
221 void sampleRightSingleTrimEdgeRegionGen(Real topVertex[2], Real botVertex[2],
222  vertexArray* rightChain,
223  Int rightStart,
224  Int rightEnd,
225  gridBoundaryChain* gridChain,
226  Int gridBeginIndex,
227  Int gridEndIndex,
228  vertexArray* leftChain,
229  Int leftUpBegin,
230  Int leftUpEnd,
231  Int leftDownBegin,
232  Int leftDownEnd,
233  primStream* pStream)
234 {
235  Int i,k;
236  /*creat an array to store all the up and down secments of the left chain,
237  *and the right end grid points
238  *
239  *although vertex array is a dynamic array, but to gain efficiency,
240  *it is better to initiliza the exact array size
241  */
242  vertexArray vArray(gridEndIndex-gridBeginIndex+1 +
243  max(0,leftUpEnd - leftUpBegin+1)+
244  max(0,leftDownEnd - leftDownBegin+1));
245  //append the vertices on the up section of the left chain
246  for(i=leftUpBegin; i<= leftUpEnd; i++)
247  vArray.appendVertex(leftChain->getVertex(i));
248 
249  //append the vertices of the right extremal grid points,
250  //and at the same time, perform triangulation for the stair cases
251  vArray.appendVertex(gridChain->get_vertex(gridBeginIndex));
252 
253  for(k=1, i=gridBeginIndex+1; i<= gridEndIndex; i++, k++)
254  {
255  vArray.appendVertex(gridChain->get_vertex(i));
256 
257  //output the fan of the grid points of the (i)th and (i-1)th grid line.
258  gridChain->rightEndFan(i, pStream);
259  }
260 
261  //append all the vertices on the down section of the left chain
262  for(i=leftDownBegin; i<= leftDownEnd; i++)
263  vArray.appendVertex(leftChain->getVertex(i));
264  monoTriangulationRecGen(topVertex, botVertex,
265  &vArray, 0, vArray.getNumElements()-1,
266  rightChain, rightStart, rightEnd,
267  pStream);
268 }
269 
270 void sampleRightSingleTrimEdgeRegion(Real upperVert[2], Real lowerVert[2],
271  gridBoundaryChain* gridChain,
272  Int beginIndex,
273  Int endIndex,
274  primStream* pStream)
275 {
276  Int i,k;
277  vertexArray vArray(endIndex-beginIndex+1);
278  vArray.appendVertex(gridChain->get_vertex(beginIndex));
279  for(k=1, i=beginIndex+1; i<= endIndex; i++, k++)
280  {
281  vArray.appendVertex(gridChain->get_vertex(i));
282  //output the fan of the grid points of the (i)_th and i-1th gridLine
283  gridChain->rightEndFan(i, pStream);
284  }
285  monoTriangulation2(upperVert, lowerVert, &vArray, 0, endIndex-beginIndex,
286  1, //increase chain (to the left)
287  pStream);
288 }
289 
290 
291 /*the gridlines from rightGridChainStartIndex to
292  *rightGridChainEndIndex are assumed to form a
293  *connected componenet
294  *the trm vertex of topRightIndex is assumed to be below
295  *or equal the first gridLine, and the trm vertex of
296  *botRightIndex is assumed to be above or equal the last gridline
297  **there could be multipe trm vertices equal to the last gridline, but
298  **only one could be equal to top gridline. shape: ____| (recall that
299  **for left chain recF, we allow shape: |----
300  *if botRightIndex<topRightIndex, then no connected componenet exists, and
301  *no triangles are generated.
302  *Othewise, botRightIndex>= topRightIndex, there is at least one triangles to
303  *output
304  */
305 void sampleRightStripRecF(vertexArray* rightChain,
306  Int topRightIndex,
307  Int botRightIndex,
308  gridBoundaryChain* rightGridChain,
309  Int rightGridChainStartIndex,
310  Int rightGridChainEndIndex,
311  primStream* pStream
312  )
313 {
314 
315  //sstop conditionL: if topRightIndex > botRightIndex, then stop
316  if(topRightIndex > botRightIndex)
317  return;
318 
319  //if there is only one grid line, return
320  if(rightGridChainStartIndex >= rightGridChainEndIndex)
321  return;
322 
323 
324  assert(rightChain->getVertex(topRightIndex)[1] <= rightGridChain->get_v_value(rightGridChainStartIndex) &&
325  rightChain->getVertex(botRightIndex)[1] >= rightGridChain->get_v_value(rightGridChainEndIndex));
326 
327  //firstfind the first trim vertex which is strictly below the second top
328  //grid line: index1.
329  Real secondGridChainV = rightGridChain->get_v_value(rightGridChainStartIndex+1);
330  Int index1 = topRightIndex;
331  while(rightChain->getVertex(index1)[1] >= secondGridChainV){
332  index1++;
333  if(index1 > botRightIndex)
334  break;
335  }
336  //now rightChain->getVertex(index1-1)[1] >= secondGridChainV and
337  //rightChain->getVertex(index1)[1] < secondGridChainV and
338  //we should include index1-1 to perform a gridStep
339  index1--;
340 
341  //now we have rightChain->getVertex(index1)[1] >= secondGridChainV, and
342  //rightChain->getVertex(index1+1)[1] < secondGridChainV
343  sampleRightOneGridStep(rightChain, topRightIndex, index1, rightGridChain, rightGridChainStartIndex, pStream);
344 
345  //if rightChain->getVertex(index1)[1] ==secondGridChainV then we can
346  //recurvesively to the rest
347  if(rightChain->getVertex(index1)[1] == secondGridChainV)
348  {
349 
350 
351  sampleRightStripRecF(rightChain, index1, botRightIndex, rightGridChain, rightGridChainStartIndex+1, rightGridChainEndIndex, pStream);
352  }
353  else if(index1 < botRightIndex)
354  {
355  //otherwise, we have rightChain->getVertex(index1)[1] > secondV
356  //let the next trim vertex be nextTrimVertex, (which should be strictly
357  //below the second grid line). Find the last grid line index2 which is STRICTLY ABOVE
358  //nextTrimVertex.
359  //sample one trm edge region.
360  Real *uppervert, *lowervert;
361  uppervert = rightChain->getVertex(index1);
362  lowervert = rightChain->getVertex(index1+1); //okay since index1<botRightindex
363  Int index2 = rightGridChainStartIndex+1;
364  while(rightGridChain->get_v_value(index2) > lowervert[1])
365  {
366  index2++;
367  if(index2 > rightGridChainEndIndex)
368  break;
369  }
370  index2--;
371 
372  sampleRightSingleTrimEdgeRegion(uppervert, lowervert, rightGridChain, rightGridChainStartIndex+1, index2, pStream);
373 
374  //recursion
375  sampleRightStripRecF(rightChain, index1+1, botRightIndex, rightGridChain, index2, rightGridChainEndIndex, pStream);
376  }
377 }
378 
379 //the degenerate case of sampleRightOneGridStep
380 void sampleRightOneGridStepNoMiddle(vertexArray* rightChain,
381  Int beginRightIndex,
382  Int endRightIndex,
383  gridBoundaryChain* rightGridChain,
384  Int rightGridChainStartIndex,
385  primStream* pStream)
386 {
387  /*since there is no middle, there is at most one point which is on the
388  *second grid line, there could be multiple points on the first (top)
389  *grid line.
390  */
391  rightGridChain->rightEndFan(rightGridChainStartIndex+1, pStream);
392  monoTriangulation2(rightGridChain->get_vertex(rightGridChainStartIndex),
393  rightGridChain->get_vertex(rightGridChainStartIndex+1),
394  rightChain,
395  beginRightIndex,
396  endRightIndex,
397  0, //decrease chain
398  pStream);
399 }
400 
401 //sampling the right area in between two grid lines
402 //shape: _________|
403 void sampleRightOneGridStep(vertexArray* rightChain,
404  Int beginRightIndex,
405  Int endRightIndex,
406  gridBoundaryChain* rightGridChain,
407  Int rightGridChainStartIndex,
408  primStream* pStream)
409 {
410  if(checkMiddle(rightChain, beginRightIndex, endRightIndex,
411  rightGridChain->get_v_value(rightGridChainStartIndex),
412  rightGridChain->get_v_value(rightGridChainStartIndex+1))<0)
413  {
414  sampleRightOneGridStepNoMiddle(rightChain, beginRightIndex, endRightIndex, rightGridChain, rightGridChainStartIndex, pStream);
415  return;
416  }
417 
418  //copy into a polygn
419  {
420  directedLine* poly = NULL;
421  sampledLine* sline;
422  directedLine* dline;
423  gridWrap* grid = rightGridChain->getGrid();
424  float vert1[2];
425  float vert2[2];
426  Int i;
427 
428  Int innerInd = rightGridChain->getInnerIndex(rightGridChainStartIndex+1);
429  Int upperInd = rightGridChain->getUlineIndex(rightGridChainStartIndex);
430  Int lowerInd = rightGridChain->getUlineIndex(rightGridChainStartIndex+1);
431  Real upperV = rightGridChain->get_v_value(rightGridChainStartIndex);
432  Real lowerV = rightGridChain->get_v_value(rightGridChainStartIndex+1);
433 
434  //the upper gridline
435  vert1[1]=vert2[1]=upperV;
436  for(i=upperInd;
437  i>innerInd;
438  i--)
439  {
440  vert1[0]=grid->get_u_value(i);
441  vert2[0]=grid->get_u_value(i-1);
442  sline = new sampledLine(vert1, vert2);
443  dline = new directedLine(INCREASING, sline);
444  if(poly == NULL)
445  poly = dline;
446  else
447  poly->insert(dline);
448  }
449 
450  //the vertical grid line segment
451  vert1[0]=vert2[0] = grid->get_u_value(innerInd);
452  vert1[1]=upperV;
453  vert2[1]=lowerV;
454  sline=new sampledLine(vert1, vert2);
455  dline=new directedLine(INCREASING, sline);
456  if(poly == NULL)
457  poly = dline;
458  else
459  poly->insert(dline);
460 
461  //the lower grid line
462  vert1[1]=vert2[1]=lowerV;
463  for(i=innerInd; i<lowerInd; i++)
464  {
465  vert1[0] = grid->get_u_value(i);
466  vert2[0] = grid->get_u_value(i+1);
467  sline = new sampledLine(vert1, vert2);
468  dline = new directedLine(INCREASING, sline);
469  poly->insert(dline);
470  }
471 
472  //the edge connecting lower grid to right chain
473  vert1[0]=grid->get_u_value(lowerInd);
474  sline = new sampledLine(vert1, rightChain->getVertex(endRightIndex));
475  dline = new directedLine(INCREASING, sline);
476  poly->insert(dline);
477 
478 
479  //the right Chain
480  for(i=endRightIndex; i>beginRightIndex; i--)
481  {
482  sline = new sampledLine(rightChain->getVertex(i), rightChain->getVertex(i-1));
483  dline = new directedLine(INCREASING, sline);
484  poly->insert(dline);
485  }
486 
487  //the edge connecting right chain with upper grid
488  vert2[1]=upperV;
489  vert2[0]=grid->get_u_value(upperInd);
490  sline = new sampledLine(rightChain->getVertex(beginRightIndex), vert2);
491  dline = new directedLine(INCREASING, sline);
492  poly->insert(dline);
493  monoTriangulationOpt(poly, pStream);
494  //clean up
495  poly->deleteSinglePolygonWithSline();
496 
497  return;
498  }
499 
500  //this following code cannot be reached, but leave it for debuggig purpose.
501  Int i;
502  //find the maximal U-monotone chain of beginRightIndex, beginRightIndex+1,...
503  i=beginRightIndex;
504  Real prevU = rightChain->getVertex(i)[0];
505  for(i=beginRightIndex+1; i<= endRightIndex; i++){
506  Real thisU = rightChain->getVertex(i)[0];
507  if(thisU < prevU)
508  prevU = thisU;
509  else
510  break;
511  }
512  //from beginRightIndex to i-1 is strictly U-monotne
513  //if(i-1==beginRightIndex and the vertex of rightchain is on the first
514  //gridline, then we should use 2 vertices on the right chain. Of we only
515  //use one (begin), we would output degenrate triangles.
516  if(i-1 == beginRightIndex && rightChain->getVertex(beginRightIndex)[1] == rightGridChain->get_v_value(rightGridChainStartIndex))
517  i++;
518 
519  Int j = endRightIndex -1;
520  if(rightGridChain->getInnerIndex(rightGridChainStartIndex+1) < rightGridChain->getUlineIndex(rightGridChainStartIndex+1))
521  {
522  j = rightChain->findDecreaseChainFromEnd(i-1/*beginRightIndex*/, endRightIndex);
523  Int temp = endRightIndex;
524  //now from j+1 to end is strictly U-monotone.
525  //if j+1 is on the last grid line, then we wat to skip to the vertex
526  //whcih is strictly above the second grid line. This vertex must exist
527  //since there is a middle vertex
528  if(j+1 == endRightIndex)
529  {
530  while(rightChain->getVertex(j+1)[1] == rightGridChain->get_v_value(rightGridChainStartIndex+1))
531  j--;
532 
533  monoTriangulation2(rightChain->getVertex(j+1),
534  rightGridChain->get_vertex(rightGridChainStartIndex+1),
535  rightChain,
536  j+2,
537  endRightIndex,
538  0, //a decrease chain
539  pStream);
540 
541  temp = j+1;
542  }
543 
544  stripOfFanRight(rightChain, temp, j+1, rightGridChain->getGrid(),
545  rightGridChain->getVlineIndex(rightGridChainStartIndex+1),
546  rightGridChain->getInnerIndex(rightGridChainStartIndex+1),
547  rightGridChain->getUlineIndex(rightGridChainStartIndex+1),
548  pStream,
549  0 //the grid line is below the trim line
550  );
551 
552  }
553 
554 
555  stripOfFanRight(rightChain, i-1, beginRightIndex, rightGridChain->getGrid(),
556  rightGridChain->getVlineIndex(rightGridChainStartIndex),
557  rightGridChain->getInnerIndex(rightGridChainStartIndex+1),
558  rightGridChain->getUlineIndex(rightGridChainStartIndex),
559  pStream,
560  1 //the grid line is above the trm lines
561  );
562 
563  //monotone triangulate the remaining rightchain together with the
564  //two vertices on the two grid v-lines
565  Real vert[2][2];
566  vert[0][0] = vert[1][0] = rightGridChain->getInner_u_value(rightGridChainStartIndex+1);
567  vert[0][1] = rightGridChain->get_v_value(rightGridChainStartIndex);
568  vert[1][1] = rightGridChain->get_v_value(rightGridChainStartIndex+1);
569 
570  monoTriangulation2(&vert[0][0],
571  &vert[1][0],
572  rightChain,
573  i-1,
574  j+1,
575  0,
576  pStream);
577 }
578 
579 #endif
580 
581 void stripOfFanRight(vertexArray* rightChain,
582  Int largeIndex,
583  Int smallIndex,
584  gridWrap* grid,
585  Int vlineIndex,
586  Int ulineSmallIndex,
587  Int ulineLargeIndex,
588  primStream* pStream,
589  Int gridLineUp /*1 if the grid line is above the trim lines*/
590  )
591 {
592  assert(largeIndex >= smallIndex);
593 
594  Real grid_v_value;
595  grid_v_value = grid->get_v_value(vlineIndex);
596 
597  Real2* trimVerts=(Real2*) malloc(sizeof(Real2)* (largeIndex-smallIndex+1));
598  assert(trimVerts);
599 
600 
601  Real2* gridVerts=(Real2*) malloc(sizeof(Real2)* (ulineLargeIndex-ulineSmallIndex+1));
602  assert(gridVerts);
603 
604  Int k,i;
605  if(! gridLineUp) /*trim line is above grid line, so trim vertices are going right when index increases*/
606  for(k=0, i=smallIndex; i<=largeIndex; i++, k++)
607  {
608  trimVerts[k][0] = rightChain->getVertex(i)[0];
609  trimVerts[k][1] = rightChain->getVertex(i)[1];
610  }
611  else
612  for(k=0, i=largeIndex; i>=smallIndex; i--, k++)
613  {
614  trimVerts[k][0] = rightChain->getVertex(i)[0];
615  trimVerts[k][1] = rightChain->getVertex(i)[1];
616  }
617 
618  for(k=0, i=ulineSmallIndex; i<= ulineLargeIndex; i++, k++)
619  {
620  gridVerts[k][0] = grid->get_u_value(i);
621  gridVerts[k][1] = grid_v_value;
622  }
623 
624  if(gridLineUp)
625  triangulateXYMono(
626  ulineLargeIndex-ulineSmallIndex+1, gridVerts,
627  largeIndex-smallIndex+1, trimVerts,
628  pStream);
629  else
630  triangulateXYMono(largeIndex-smallIndex+1, trimVerts,
631  ulineLargeIndex-ulineSmallIndex+1, gridVerts,
632  pStream);
633  free(trimVerts);
634  free(gridVerts);
635 }
636 
637 
638 
639 
640 
641 
642 
643 
644