/*
** 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.
**
** $Date: 2012/03/29 17:22:17 $ $Revision: 1.1.1.1 $
*/
/*
** $Header: /cvs/bao-parsec/pkgs/libs/mesa/src/src/glu/sgi/libnurbs/nurbtess/gridWrap.cc,v 1.1.1.1 2012/03/29 17:22:17 uid42307 Exp $
*/

#include "gluos.h"
#include <stdlib.h>
#include <stdio.h>
#include <GL/gl.h>
#include "zlassert.h"
#include "gridWrap.h"


/*******************grid structure****************************/
void gridWrap::print()
{
  printf("n_ulines = %i\n", n_ulines);
  printf("n_vlines = %i\n", n_vlines);
  printf("u_min=%f, umax=%f, vmin=%f, vmax=%f\n", u_min, u_max, v_min, v_max);
}

gridWrap::gridWrap(Int nUlines, Real* uvals,
		   Int nVlines, Real* vvals)
{
  assert(nUlines>=2);
  assert(nVlines>=2);

  is_uniform = 0;
  n_ulines = nUlines;
  n_vlines = nVlines;
  u_min = uvals[0];
  u_max = uvals[nUlines-1];
  v_min = vvals[0];
  v_max = vvals[nVlines-1];
  u_values = (Real*) malloc(sizeof(Real) * n_ulines);
  assert(u_values);
  v_values = (Real*) malloc(sizeof(Real) * n_vlines);
  assert(v_values);  
  
  Int i;
  for(i=0; i<n_ulines; i++)
    u_values[i] = uvals[i];
  for(i=0; i<n_vlines; i++)
    v_values[i] = vvals[i];
}
  
gridWrap::gridWrap(Int nUlines, Int nVlines,
		   Real uMin, Real uMax,
		   Real vMin, Real vMax
		   )
{
  is_uniform = 1;
  n_ulines = nUlines;
  n_vlines = nVlines;
  u_min = uMin;
  u_max = uMax;
  v_min = vMin;
  v_max = vMax;
  u_values = (Real*) malloc(sizeof(Real) * n_ulines);
  assert(u_values);
  v_values = (Real*) malloc(sizeof(Real) * n_vlines);
  assert(v_values);
  
  Int i;
  assert(nUlines>=2);
  assert(nVlines>=2);
  Real du = (uMax-uMin)/(nUlines-1);
  Real dv = (vMax-vMin)/(nVlines-1);

  float tempu=uMin;
  u_values[0] = tempu;
  for(i=1; i<nUlines; i++)
    {
      tempu += du;
      u_values[i] = tempu;
    }
  u_values[nUlines-1] = uMax;

  float tempv=vMin;
  v_values[0] = tempv;
  for(i=1; i<nVlines; i++)
    {
      tempv += dv;
      v_values[i] = tempv;
    }
  v_values[nVlines-1] = vMax;
}

gridWrap::~gridWrap()
{
  free(u_values);
  free(v_values);
}

void gridWrap::draw()
{
  int i,j;
  glBegin(GL_POINTS);
  for(i=0; i<n_ulines; i++)
    for(j=0; j<n_vlines; j++)
      glVertex2f(get_u_value(i), get_v_value(j));
  glEnd();
}

void gridWrap::outputFanWithPoint(Int v, Int uleft, Int uright, Real vert[2], primStream* pStream)
{
  Int i;
  if(uleft >= uright) 
    return; //no triangles to output.
    
  pStream->begin();
  pStream->insert(vert);

  assert(vert[1] != v_values[v]); //don't output degenerate triangles

  if(vert[1] > v_values[v]) //vertex is above this grid line: notice the orientation
    {
      for(i=uleft; i<=uright; i++)
	pStream->insert(u_values[i], v_values[v]);
    }
  else //vertex is below the grid line
    {
      for(i=uright; i>= uleft; i--)
	pStream->insert(u_values[i], v_values[v]);
    }	
  
  pStream->end(PRIMITIVE_STREAM_FAN);
}



/*each chain stores a number of consecutive 
 *V-lines within a grid. 
 *There is one grid vertex on each V-line.
 * The total number of V-lines is:
 *   nVlines.
 * with respect to the grid, the index of the first V-line is 
 *   firstVlineIndex.
 * So with respect to the grid, the index of the ith V-line is 
 *   firstVlineIndex-i.
 * the grid-index of the uline at the ith vline (recall that each vline has one grid point)
 * is ulineIndices[i]. The u_value is cached in ulineValues[i], that is,
 *   ulineValues[i] = grid->get_u_value(ulineIndices[i]) 
 */
gridBoundaryChain::gridBoundaryChain(
				     gridWrap* gr, 
				     Int first_vline_index, 
				     Int n_vlines, 
				     Int* uline_indices,
				     Int* inner_indices
				     )
: grid(gr), firstVlineIndex(first_vline_index), nVlines(n_vlines)
{
  ulineIndices = (Int*) malloc(sizeof(Int) * n_vlines);
  assert(ulineIndices);

  innerIndices = (Int*) malloc(sizeof(Int) * n_vlines);
  assert(innerIndices);

  vertices = (Real2*) malloc(sizeof(Real2) * n_vlines);
  assert(vertices);
  


  Int i;
  for(i=0; i<n_vlines; i++){
    ulineIndices[i] = uline_indices[i];
    innerIndices[i] = inner_indices[i];
  }
  
  for(i=0; i<n_vlines; i++){
    vertices[i][0] = gr->get_u_value(ulineIndices[i]);
    vertices[i][1] = gr->get_v_value(first_vline_index-i);
  }
}
  
void gridBoundaryChain::draw()
{
  Int i;
  glBegin(GL_LINE_STRIP);
  for(i=0; i<nVlines; i++)
    {
      glVertex2fv(vertices[i]);
    }
  glEnd();
}

void gridBoundaryChain::drawInner()
{
  Int i;
  for(i=1; i<nVlines; i++)
    {
      glBegin(GL_LINE_STRIP);
      glVertex2f(grid->get_u_value(innerIndices[i]), get_v_value(i-1) );
      glVertex2f(grid->get_u_value(innerIndices[i]), get_v_value(i) );
      glEnd();
    }
}
  
Int gridBoundaryChain::lookfor(Real v, Int i1, Int i2)
{
  Int mid;
  while(i1 < i2-1)
    {
      mid = (i1+i2)/2;
      if(v > vertices[mid][1])
	{
	  i2 = mid;
	}
      else
	i1 = mid;
    }
  return i1;
}

/*output the fan of the right end between grid line i-1 and grid line i*/
void gridBoundaryChain::rightEndFan(Int i, primStream* pStream)
{
  Int j;
  if(getUlineIndex(i) > getUlineIndex(i-1))
    {
      pStream->begin();
      pStream->insert(get_vertex(i-1));
      for(j=getUlineIndex(i-1); j<= getUlineIndex(i); j++)
	pStream->insert(grid->get_u_value(j), get_v_value(i));
      pStream->end(PRIMITIVE_STREAM_FAN);
    }
  else if(getUlineIndex(i) < getUlineIndex(i-1))
    {
      pStream->begin();
      pStream->insert(get_vertex(i));
      for(j=getUlineIndex(i-1); j>= getUlineIndex(i); j--)
	pStream->insert(grid->get_u_value(j), get_v_value(i-1));
      pStream->end(PRIMITIVE_STREAM_FAN);
    }
  //otherside, the two are equal, so there is no fan to output
}
		      

/*output the fan of the left end between grid line i-1 and grid line i*/
void gridBoundaryChain::leftEndFan(Int i, primStream* pStream)
{
  Int j;
  if(getUlineIndex(i) < getUlineIndex(i-1))
    {
      pStream->begin();
      pStream->insert(get_vertex(i-1));
      for(j=getUlineIndex(i); j<= getUlineIndex(i-1); j++)
	pStream->insert(grid->get_u_value(j), get_v_value(i));
      pStream->end(PRIMITIVE_STREAM_FAN);
    }
  else if(getUlineIndex(i) > getUlineIndex(i-1))
    {
      pStream->begin();
      pStream->insert(get_vertex(i));
      for(j=getUlineIndex(i); j>= getUlineIndex(i-1); j--)
	pStream->insert(grid->get_u_value(j), get_v_value(i-1));
      pStream->end(PRIMITIVE_STREAM_FAN);
    }
  /*otherwisem, the two are equal, so there is no fan to outout*/	  
}
