summaryrefslogtreecommitdiff
path: root/src/glu/sgi/libnurbs/nurbtess/sampleCompRight.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/glu/sgi/libnurbs/nurbtess/sampleCompRight.cc')
-rw-r--r--src/glu/sgi/libnurbs/nurbtess/sampleCompRight.cc644
1 files changed, 0 insertions, 644 deletions
diff --git a/src/glu/sgi/libnurbs/nurbtess/sampleCompRight.cc b/src/glu/sgi/libnurbs/nurbtess/sampleCompRight.cc
deleted file mode 100644
index d01e50018bf..00000000000
--- a/src/glu/sgi/libnurbs/nurbtess/sampleCompRight.cc
+++ /dev/null
@@ -1,644 +0,0 @@
-/*
-** License Applicability. Except to the extent portions of this file are
-** made subject to an alternative license as permitted in the SGI Free
-** Software License B, Version 1.1 (the "License"), the contents of this
-** file are subject only to the provisions of the License. You may not use
-** this file except in compliance with the License. You may obtain a copy
-** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600
-** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at:
-**
-** http://oss.sgi.com/projects/FreeB
-**
-** Note that, as provided in the License, the Software is distributed on an
-** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS
-** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND
-** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A
-** PARTICULAR PURPOSE, AND NON-INFRINGEMENT.
-**
-** Original Code. The Original Code is: OpenGL Sample Implementation,
-** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics,
-** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc.
-** Copyright in any portions created by third parties is as indicated
-** elsewhere herein. All Rights Reserved.
-**
-** Additional Notice Provisions: The application programming interfaces
-** established by SGI in conjunction with the Original Code are The
-** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released
-** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version
-** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X
-** Window System(R) (Version 1.3), released October 19, 1998. This software
-** was created using the OpenGL(R) version 1.2.1 Sample Implementation
-** published by SGI, but has not been independently verified as being
-** compliant with the OpenGL(R) version 1.2.1 Specification.
-**
-*/
-/*
-*/
-
-#include <stdlib.h>
-#include <stdio.h>
-#include "gluos.h"
-#include "glimports.h"
-#include "zlassert.h"
-#include "sampleCompRight.h"
-
-#define max(a,b) ((a>b)? a:b)
-#define min(a,b) ((a>b)? b:a)
-
-
-
-#ifdef NOT_TAKEOUT
-
-/*notice that we need leftChain because the
- *corners could be on the leftChain.
- */
-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)
-{
- /*find out whether there is a trim vertex which is
- *inbetween the top and bot grid lines or not.
- */
- Int midIndex1;
- Int midIndex2;
- Int gridMidIndex1 = 0, gridMidIndex2 = 0;
- //midIndex1: array[i] <= v, array[i+1] > v
- //midIndex2: array[i] >= v, array[i+1] < v
- midIndex1 = rightChain->findIndexBelowGen(rightGridChain->get_v_value(gridIndex1),
- rightStartIndex,
- rightEndIndex);
- midIndex2 = -1; //initilization
- if(midIndex1 <= rightEndIndex && gridIndex1 < gridIndex2)
- if(rightChain->getVertex(midIndex1)[1] >= rightGridChain->get_v_value(gridIndex2))
- {
- //midIndex2 must exist:
- midIndex2 = rightChain->findIndexAboveGen(rightGridChain->get_v_value(gridIndex2),
- midIndex1, //midIndex1<=midIndex2
- rightEndIndex);
- //find gridMidIndex1 so that either it=gridIndex1 when the gridline is
- // at the same height as trim vertex midIndex1, or it is the last one
- //which is strictly above midIndex1.
- {
- Real temp = rightChain->getVertex(midIndex1)[1];
- if(rightGridChain->get_v_value(gridIndex1) == temp)
- gridMidIndex1 = gridIndex1;
- else
- {
- gridMidIndex1 = gridIndex1;
- while(rightGridChain->get_v_value(gridMidIndex1) > temp)
- gridMidIndex1++;
- gridMidIndex1--;
- }
- }//end of find gridMindIndex1
- //find gridMidIndex2 so that it is the (first one below or equal
- //midIndex) last one above or equal midIndex2
- {
- Real temp = rightChain->getVertex(midIndex2)[1];
- for(gridMidIndex2 = gridMidIndex1+1; gridMidIndex2 <= gridIndex2; gridMidIndex2++)
- if(rightGridChain->get_v_value(gridMidIndex2) <= temp)
- break;
-
- assert(gridMidIndex2 <= gridIndex2);
- }//end of find gridMidIndex2
- }
-
-
-
- //to interprete the corner information
- Real* cornerTop;
- Real* cornerBot;
- Int cornerRightStart;
- Int cornerRightEnd;
- Int cornerLeftUpEnd;
- Int cornerLeftDownStart;
- if(up_rightCornerWhere == 2) //right corner is on right chain
- {
- cornerTop = rightChain->getVertex(up_rightCornerIndex);
- cornerRightStart = up_rightCornerIndex+1;
- cornerLeftUpEnd = -1; //no left
- }
- else if(up_rightCornerWhere == 1) //right corner is on top
- {
- cornerTop = topVertex;
- cornerRightStart = rightStartIndex;
- cornerLeftUpEnd = -1; //no left
- }
- else //right corner is on left chain
- {
- cornerTop = topVertex;
- cornerRightStart = rightStartIndex;
- cornerLeftUpEnd = up_rightCornerIndex;
- }
-
- if(down_rightCornerWhere == 2) //right corner is on right chan
- {
- cornerBot = rightChain->getVertex(down_rightCornerIndex);
- cornerRightEnd = down_rightCornerIndex-1;
- cornerLeftDownStart = leftEndIndex+1; //no left
- }
- else if (down_rightCornerWhere == 1) //right corner is at bot
- {
- cornerBot = botVertex;
- cornerRightEnd = rightEndIndex;
- cornerLeftDownStart = leftEndIndex+1; //no left
- }
- else //right corner is on the left chain
- {
- cornerBot = botVertex;
- cornerRightEnd = rightEndIndex;
- cornerLeftDownStart = down_rightCornerIndex;
- }
-
- //sample
- if(midIndex2 >= 0) //there is a trm point between grid lines
- {
-
- sampleRightSingleTrimEdgeRegionGen(cornerTop, rightChain->getVertex(midIndex1),
- rightChain,
- cornerRightStart,
- midIndex1-1,
- rightGridChain,
- gridIndex1,
- gridMidIndex1,
- leftChain,
- leftStartIndex,
- cornerLeftUpEnd,
- 0, //no left down section,
- -1,
- pStream);
-
- sampleRightSingleTrimEdgeRegionGen(rightChain->getVertex(midIndex2),
- cornerBot,
- rightChain,
- midIndex2+1,
- cornerRightEnd,
- rightGridChain,
- gridMidIndex2,
- gridIndex2,
- leftChain,
- 0, //no left up section
- -1,
- cornerLeftDownStart,
- leftEndIndex,
- pStream);
-
- sampleRightStripRecF(rightChain,
- midIndex1,
- midIndex2,
- rightGridChain,
- gridMidIndex1,
- gridMidIndex2,
- pStream);
-
- }
- else
- {
- sampleRightSingleTrimEdgeRegionGen(cornerTop, cornerBot,
- rightChain,
- cornerRightStart,
- cornerRightEnd,
- rightGridChain,
- gridIndex1,
- gridIndex2,
- leftChain,
- leftStartIndex,
- cornerLeftUpEnd,
- cornerLeftDownStart,
- leftEndIndex,
- pStream);
- }
-}
-
-void sampleRightSingleTrimEdgeRegionGen(Real topVertex[2], Real botVertex[2],
- vertexArray* rightChain,
- Int rightStart,
- Int rightEnd,
- gridBoundaryChain* gridChain,
- Int gridBeginIndex,
- Int gridEndIndex,
- vertexArray* leftChain,
- Int leftUpBegin,
- Int leftUpEnd,
- Int leftDownBegin,
- Int leftDownEnd,
- primStream* pStream)
-{
- Int i,k;
- /*creat an array to store all the up and down secments of the left chain,
- *and the right end grid points
- *
- *although vertex array is a dynamic array, but to gain efficiency,
- *it is better to initiliza the exact array size
- */
- vertexArray vArray(gridEndIndex-gridBeginIndex+1 +
- max(0,leftUpEnd - leftUpBegin+1)+
- max(0,leftDownEnd - leftDownBegin+1));
- //append the vertices on the up section of the left chain
- for(i=leftUpBegin; i<= leftUpEnd; i++)
- vArray.appendVertex(leftChain->getVertex(i));
-
- //append the vertices of the right extremal grid points,
- //and at the same time, perform triangulation for the stair cases
- vArray.appendVertex(gridChain->get_vertex(gridBeginIndex));
-
- for(k=1, i=gridBeginIndex+1; i<= gridEndIndex; i++, k++)
- {
- vArray.appendVertex(gridChain->get_vertex(i));
-
- //output the fan of the grid points of the (i)th and (i-1)th grid line.
- gridChain->rightEndFan(i, pStream);
- }
-
- //append all the vertices on the down section of the left chain
- for(i=leftDownBegin; i<= leftDownEnd; i++)
- vArray.appendVertex(leftChain->getVertex(i));
- monoTriangulationRecGen(topVertex, botVertex,
- &vArray, 0, vArray.getNumElements()-1,
- rightChain, rightStart, rightEnd,
- pStream);
-}
-
-void sampleRightSingleTrimEdgeRegion(Real upperVert[2], Real lowerVert[2],
- gridBoundaryChain* gridChain,
- Int beginIndex,
- Int endIndex,
- primStream* pStream)
-{
- Int i,k;
- vertexArray vArray(endIndex-beginIndex+1);
- vArray.appendVertex(gridChain->get_vertex(beginIndex));
- for(k=1, i=beginIndex+1; i<= endIndex; i++, k++)
- {
- vArray.appendVertex(gridChain->get_vertex(i));
- //output the fan of the grid points of the (i)_th and i-1th gridLine
- gridChain->rightEndFan(i, pStream);
- }
- monoTriangulation2(upperVert, lowerVert, &vArray, 0, endIndex-beginIndex,
- 1, //increase chain (to the left)
- pStream);
-}
-
-
-/*the gridlines from rightGridChainStartIndex to
- *rightGridChainEndIndex are assumed to form a
- *connected componenet
- *the trm vertex of topRightIndex is assumed to be below
- *or equal the first gridLine, and the trm vertex of
- *botRightIndex is assumed to be above or equal the last gridline
- **there could be multipe trm vertices equal to the last gridline, but
- **only one could be equal to top gridline. shape: ____| (recall that
- **for left chain recF, we allow shape: |----
- *if botRightIndex<topRightIndex, then no connected componenet exists, and
- *no triangles are generated.
- *Othewise, botRightIndex>= topRightIndex, there is at least one triangles to
- *output
- */
-void sampleRightStripRecF(vertexArray* rightChain,
- Int topRightIndex,
- Int botRightIndex,
- gridBoundaryChain* rightGridChain,
- Int rightGridChainStartIndex,
- Int rightGridChainEndIndex,
- primStream* pStream
- )
-{
-
- //sstop conditionL: if topRightIndex > botRightIndex, then stop
- if(topRightIndex > botRightIndex)
- return;
-
- //if there is only one grid line, return
- if(rightGridChainStartIndex >= rightGridChainEndIndex)
- return;
-
-
- assert(rightChain->getVertex(topRightIndex)[1] <= rightGridChain->get_v_value(rightGridChainStartIndex) &&
- rightChain->getVertex(botRightIndex)[1] >= rightGridChain->get_v_value(rightGridChainEndIndex));
-
- //firstfind the first trim vertex which is strictly below the second top
- //grid line: index1.
- Real secondGridChainV = rightGridChain->get_v_value(rightGridChainStartIndex+1);
- Int index1 = topRightIndex;
- while(rightChain->getVertex(index1)[1] >= secondGridChainV){
- index1++;
- if(index1 > botRightIndex)
- break;
- }
- //now rightChain->getVertex(index1-1)[1] >= secondGridChainV and
- //rightChain->getVertex(index1)[1] < secondGridChainV and
- //we should include index1-1 to perform a gridStep
- index1--;
-
- //now we have rightChain->getVertex(index1)[1] >= secondGridChainV, and
- //rightChain->getVertex(index1+1)[1] < secondGridChainV
- sampleRightOneGridStep(rightChain, topRightIndex, index1, rightGridChain, rightGridChainStartIndex, pStream);
-
- //if rightChain->getVertex(index1)[1] ==secondGridChainV then we can
- //recurvesively to the rest
- if(rightChain->getVertex(index1)[1] == secondGridChainV)
- {
-
-
- sampleRightStripRecF(rightChain, index1, botRightIndex, rightGridChain, rightGridChainStartIndex+1, rightGridChainEndIndex, pStream);
- }
- else if(index1 < botRightIndex)
- {
- //otherwise, we have rightChain->getVertex(index1)[1] > secondV
- //let the next trim vertex be nextTrimVertex, (which should be strictly
- //below the second grid line). Find the last grid line index2 which is STRICTLY ABOVE
- //nextTrimVertex.
- //sample one trm edge region.
- Real *uppervert, *lowervert;
- uppervert = rightChain->getVertex(index1);
- lowervert = rightChain->getVertex(index1+1); //okay since index1<botRightindex
- Int index2 = rightGridChainStartIndex+1;
- while(rightGridChain->get_v_value(index2) > lowervert[1])
- {
- index2++;
- if(index2 > rightGridChainEndIndex)
- break;
- }
- index2--;
-
- sampleRightSingleTrimEdgeRegion(uppervert, lowervert, rightGridChain, rightGridChainStartIndex+1, index2, pStream);
-
- //recursion
- sampleRightStripRecF(rightChain, index1+1, botRightIndex, rightGridChain, index2, rightGridChainEndIndex, pStream);
- }
-}
-
-//the degenerate case of sampleRightOneGridStep
-void sampleRightOneGridStepNoMiddle(vertexArray* rightChain,
- Int beginRightIndex,
- Int endRightIndex,
- gridBoundaryChain* rightGridChain,
- Int rightGridChainStartIndex,
- primStream* pStream)
-{
- /*since there is no middle, there is at most one point which is on the
- *second grid line, there could be multiple points on the first (top)
- *grid line.
- */
- rightGridChain->rightEndFan(rightGridChainStartIndex+1, pStream);
- monoTriangulation2(rightGridChain->get_vertex(rightGridChainStartIndex),
- rightGridChain->get_vertex(rightGridChainStartIndex+1),
- rightChain,
- beginRightIndex,
- endRightIndex,
- 0, //decrease chain
- pStream);
-}
-
-//sampling the right area in between two grid lines
-//shape: _________|
-void sampleRightOneGridStep(vertexArray* rightChain,
- Int beginRightIndex,
- Int endRightIndex,
- gridBoundaryChain* rightGridChain,
- Int rightGridChainStartIndex,
- primStream* pStream)
-{
- if(checkMiddle(rightChain, beginRightIndex, endRightIndex,
- rightGridChain->get_v_value(rightGridChainStartIndex),
- rightGridChain->get_v_value(rightGridChainStartIndex+1))<0)
- {
- sampleRightOneGridStepNoMiddle(rightChain, beginRightIndex, endRightIndex, rightGridChain, rightGridChainStartIndex, pStream);
- return;
- }
-
- //copy into a polygn
- {
- directedLine* poly = NULL;
- sampledLine* sline;
- directedLine* dline;
- gridWrap* grid = rightGridChain->getGrid();
- float vert1[2];
- float vert2[2];
- Int i;
-
- Int innerInd = rightGridChain->getInnerIndex(rightGridChainStartIndex+1);
- Int upperInd = rightGridChain->getUlineIndex(rightGridChainStartIndex);
- Int lowerInd = rightGridChain->getUlineIndex(rightGridChainStartIndex+1);
- Real upperV = rightGridChain->get_v_value(rightGridChainStartIndex);
- Real lowerV = rightGridChain->get_v_value(rightGridChainStartIndex+1);
-
- //the upper gridline
- vert1[1]=vert2[1]=upperV;
- for(i=upperInd;
- i>innerInd;
- i--)
- {
- vert1[0]=grid->get_u_value(i);
- vert2[0]=grid->get_u_value(i-1);
- sline = new sampledLine(vert1, vert2);
- dline = new directedLine(INCREASING, sline);
- if(poly == NULL)
- poly = dline;
- else
- poly->insert(dline);
- }
-
- //the vertical grid line segment
- vert1[0]=vert2[0] = grid->get_u_value(innerInd);
- vert1[1]=upperV;
- vert2[1]=lowerV;
- sline=new sampledLine(vert1, vert2);
- dline=new directedLine(INCREASING, sline);
- if(poly == NULL)
- poly = dline;
- else
- poly->insert(dline);
-
- //the lower grid line
- vert1[1]=vert2[1]=lowerV;
- for(i=innerInd; i<lowerInd; i++)
- {
- vert1[0] = grid->get_u_value(i);
- vert2[0] = grid->get_u_value(i+1);
- sline = new sampledLine(vert1, vert2);
- dline = new directedLine(INCREASING, sline);
- poly->insert(dline);
- }
-
- //the edge connecting lower grid to right chain
- vert1[0]=grid->get_u_value(lowerInd);
- sline = new sampledLine(vert1, rightChain->getVertex(endRightIndex));
- dline = new directedLine(INCREASING, sline);
- poly->insert(dline);
-
-
- //the right Chain
- for(i=endRightIndex; i>beginRightIndex; i--)
- {
- sline = new sampledLine(rightChain->getVertex(i), rightChain->getVertex(i-1));
- dline = new directedLine(INCREASING, sline);
- poly->insert(dline);
- }
-
- //the edge connecting right chain with upper grid
- vert2[1]=upperV;
- vert2[0]=grid->get_u_value(upperInd);
- sline = new sampledLine(rightChain->getVertex(beginRightIndex), vert2);
- dline = new directedLine(INCREASING, sline);
- poly->insert(dline);
- monoTriangulationOpt(poly, pStream);
- //clean up
- poly->deleteSinglePolygonWithSline();
-
- return;
- }
-
- //this following code cannot be reached, but leave it for debuggig purpose.
- Int i;
- //find the maximal U-monotone chain of beginRightIndex, beginRightIndex+1,...
- i=beginRightIndex;
- Real prevU = rightChain->getVertex(i)[0];
- for(i=beginRightIndex+1; i<= endRightIndex; i++){
- Real thisU = rightChain->getVertex(i)[0];
- if(thisU < prevU)
- prevU = thisU;
- else
- break;
- }
- //from beginRightIndex to i-1 is strictly U-monotne
- //if(i-1==beginRightIndex and the vertex of rightchain is on the first
- //gridline, then we should use 2 vertices on the right chain. Of we only
- //use one (begin), we would output degenrate triangles.
- if(i-1 == beginRightIndex && rightChain->getVertex(beginRightIndex)[1] == rightGridChain->get_v_value(rightGridChainStartIndex))
- i++;
-
- Int j = endRightIndex -1;
- if(rightGridChain->getInnerIndex(rightGridChainStartIndex+1) < rightGridChain->getUlineIndex(rightGridChainStartIndex+1))
- {
- j = rightChain->findDecreaseChainFromEnd(i-1/*beginRightIndex*/, endRightIndex);
- Int temp = endRightIndex;
- //now from j+1 to end is strictly U-monotone.
- //if j+1 is on the last grid line, then we wat to skip to the vertex
- //whcih is strictly above the second grid line. This vertex must exist
- //since there is a middle vertex
- if(j+1 == endRightIndex)
- {
- while(rightChain->getVertex(j+1)[1] == rightGridChain->get_v_value(rightGridChainStartIndex+1))
- j--;
-
- monoTriangulation2(rightChain->getVertex(j+1),
- rightGridChain->get_vertex(rightGridChainStartIndex+1),
- rightChain,
- j+2,
- endRightIndex,
- 0, //a decrease chain
- pStream);
-
- temp = j+1;
- }
-
- stripOfFanRight(rightChain, temp, j+1, rightGridChain->getGrid(),
- rightGridChain->getVlineIndex(rightGridChainStartIndex+1),
- rightGridChain->getInnerIndex(rightGridChainStartIndex+1),
- rightGridChain->getUlineIndex(rightGridChainStartIndex+1),
- pStream,
- 0 //the grid line is below the trim line
- );
-
- }
-
-
- stripOfFanRight(rightChain, i-1, beginRightIndex, rightGridChain->getGrid(),
- rightGridChain->getVlineIndex(rightGridChainStartIndex),
- rightGridChain->getInnerIndex(rightGridChainStartIndex+1),
- rightGridChain->getUlineIndex(rightGridChainStartIndex),
- pStream,
- 1 //the grid line is above the trm lines
- );
-
- //monotone triangulate the remaining rightchain together with the
- //two vertices on the two grid v-lines
- Real vert[2][2];
- vert[0][0] = vert[1][0] = rightGridChain->getInner_u_value(rightGridChainStartIndex+1);
- vert[0][1] = rightGridChain->get_v_value(rightGridChainStartIndex);
- vert[1][1] = rightGridChain->get_v_value(rightGridChainStartIndex+1);
-
- monoTriangulation2(&vert[0][0],
- &vert[1][0],
- rightChain,
- i-1,
- j+1,
- 0, ///a decreae chain
- pStream);
-}
-
-#endif
-
-void stripOfFanRight(vertexArray* rightChain,
- Int largeIndex,
- Int smallIndex,
- gridWrap* grid,
- Int vlineIndex,
- Int ulineSmallIndex,
- Int ulineLargeIndex,
- primStream* pStream,
- Int gridLineUp /*1 if the grid line is above the trim lines*/
- )
-{
- assert(largeIndex >= smallIndex);
-
- Real grid_v_value;
- grid_v_value = grid->get_v_value(vlineIndex);
-
- Real2* trimVerts=(Real2*) malloc(sizeof(Real2)* (largeIndex-smallIndex+1));
- assert(trimVerts);
-
-
- Real2* gridVerts=(Real2*) malloc(sizeof(Real2)* (ulineLargeIndex-ulineSmallIndex+1));
- assert(gridVerts);
-
- Int k,i;
- if(! gridLineUp) /*trim line is above grid line, so trim vertices are going right when index increases*/
- for(k=0, i=smallIndex; i<=largeIndex; i++, k++)
- {
- trimVerts[k][0] = rightChain->getVertex(i)[0];
- trimVerts[k][1] = rightChain->getVertex(i)[1];
- }
- else
- for(k=0, i=largeIndex; i>=smallIndex; i--, k++)
- {
- trimVerts[k][0] = rightChain->getVertex(i)[0];
- trimVerts[k][1] = rightChain->getVertex(i)[1];
- }
-
- for(k=0, i=ulineSmallIndex; i<= ulineLargeIndex; i++, k++)
- {
- gridVerts[k][0] = grid->get_u_value(i);
- gridVerts[k][1] = grid_v_value;
- }
-
- if(gridLineUp)
- triangulateXYMono(
- ulineLargeIndex-ulineSmallIndex+1, gridVerts,
- largeIndex-smallIndex+1, trimVerts,
- pStream);
- else
- triangulateXYMono(largeIndex-smallIndex+1, trimVerts,
- ulineLargeIndex-ulineSmallIndex+1, gridVerts,
- pStream);
- free(trimVerts);
- free(gridVerts);
-}
-
-
-
-
-
-
-
-
-