Home | History | Annotate | Line # | Download | only in interface
      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 "gluos.h"
     39 #include <stdlib.h>
     40 #include <stdio.h>
     41 #include <assert.h>
     42 #include <GL/glu.h> /*for drawing bzier patch*/
     43 #include "bezierPatch.h"
     44 #include "bezierEval.h"
     45 
     46 /*
     47  *allocate an instance of bezierPatch. The control points are unknown. But
     48  *the space of this array is allocated with size of
     49  *   uorder*vorder*dimension
     50  *
     51  */
     52 bezierPatch* bezierPatchMake(float umin, float vmin, float umax, float vmax, int uorder, int vorder, int dimension)
     53 {
     54   bezierPatch* ret = (bezierPatch*) malloc(sizeof(bezierPatch));
     55   assert(ret);
     56   ret->umin = umin;
     57   ret->vmin = vmin;
     58   ret->umax = umax;
     59   ret->vmax = vmax;
     60   ret->uorder = uorder;
     61   ret->vorder = vorder;
     62   ret->dimension = dimension;
     63   ret->ctlpoints = (float*) malloc(sizeof(float) * dimension * uorder * vorder);
     64   assert(ret->ctlpoints);
     65 
     66   ret->next = NULL;
     67 
     68   return ret;
     69 }
     70 
     71 bezierPatch* bezierPatchMake2(float umin, float vmin, float umax, float vmax, int uorder, int vorder, int dimension, int ustride, int vstride,  float* ctlpoints)
     72 {
     73   bezierPatch* ret = (bezierPatch*) malloc(sizeof(bezierPatch));
     74   assert(ret);
     75   ret->umin = umin;
     76   ret->vmin = vmin;
     77   ret->umax = umax;
     78   ret->vmax = vmax;
     79   ret->uorder = uorder;
     80   ret->vorder = vorder;
     81   ret->dimension = dimension;
     82   ret->ctlpoints = (float*) malloc(sizeof(float) * dimension * uorder * vorder);
     83   assert(ret->ctlpoints);
     84 
     85   /*copy the control points there*/
     86   int the_ustride = vorder * dimension;
     87   int the_vstride = dimension;
     88   for(int i=0; i<uorder; i++)
     89     for(int j=0; j<vorder; j++)
     90       for(int k=0; k<dimension; k++)
     91 	ret->ctlpoints[i * the_ustride + j*the_vstride+k] = ctlpoints[i*ustride+j*vstride+k];
     92 
     93   ret->next = NULL;
     94 
     95   return ret;
     96 }
     97 
     98 /*
     99  *deallocate the space as allocated by Make
    100  */
    101 void bezierPatchDelete(bezierPatch *b)
    102 {
    103   free(b->ctlpoints);
    104   free(b);
    105 }
    106 
    107 /*delete the whole linked list
    108  */
    109 void bezierPatchDeleteList(bezierPatch *b)
    110 {
    111   bezierPatch *temp;
    112   while (b != NULL) {
    113     temp = b;
    114     b = b->next;
    115     bezierPatchDelete(temp);
    116   }
    117 }
    118 
    119 bezierPatch* bezierPatchInsert(bezierPatch *list, bezierPatch *b)
    120 {
    121   b->next = list;
    122   return b;
    123 }
    124 
    125 /*print the data stored in this patch*/
    126 void bezierPatchPrint(bezierPatch *b)
    127 {
    128   printf("bezierPatch:\n");
    129   printf("umin,umax=(%f,%f), (vmin, vmax)=(%f,%f)\n", b->umin, b->umax, b->vmin, b->vmax);
    130   printf("uorder=%i, vorder=%i\n", b->uorder, b->vorder);
    131   printf("idmension = %i\n", b->dimension);
    132 }
    133 
    134 /*print the whole list*/
    135 void bezierPatchPrintList(bezierPatch *list)
    136 {
    137   bezierPatch* temp;
    138   for(temp=list; temp != NULL; temp = temp->next)
    139     bezierPatchPrint(temp);
    140 }
    141 
    142 void bezierPatchEval(bezierPatch *b, float u, float v, float ret[])
    143 {
    144   if(   u >= b->umin && u<= b->umax
    145      && v >= b->vmin && v<= b->vmax)
    146     {
    147 
    148       bezierSurfEval(b->umin, b->umax, b->uorder, b->vmin, b->vmax, b->vorder, b->dimension, b->ctlpoints, b->dimension * b->vorder, b->dimension, u, v, ret);
    149 
    150      }
    151   else if(b->next != NULL)
    152     bezierPatchEval(b->next, u,v, ret);
    153   else
    154     bezierSurfEval(b->umin, b->umax, b->uorder, b->vmin, b->vmax, b->vorder, b->dimension, b->ctlpoints, b->dimension * b->vorder, b->dimension, u, v, ret);
    155 }
    156 
    157 /*the returned normal is normlized
    158  */
    159 void bezierPatchEvalNormal(bezierPatch *b, float u, float v, float ret[])
    160 {
    161   bezierSurfEvalNormal(b->umin, b->umax, b->uorder, b->vmin, b->vmax, b->vorder, b->dimension, b->ctlpoints, b->dimension * b->vorder, b->dimension, u, v, ret);
    162 
    163   if(   u >= b->umin && u<= b->umax
    164      && v >= b->vmin && v<= b->vmax)
    165     {
    166       bezierSurfEvalNormal(b->umin, b->umax, b->uorder, b->vmin, b->vmax, b->vorder, b->dimension, b->ctlpoints, b->dimension * b->vorder, b->dimension, u, v, ret);
    167      }
    168   else if(b->next != NULL)
    169     bezierPatchEvalNormal(b->next, u,v, ret);
    170   else
    171     bezierSurfEvalNormal(b->umin, b->umax, b->uorder, b->vmin, b->vmax, b->vorder, b->dimension, b->ctlpoints, b->dimension * b->vorder, b->dimension, u, v, ret);
    172 
    173 }
    174 
    175 void bezierPatchDraw(bezierPatch *bpatch, int u_reso, int v_reso)
    176 {
    177   if(bpatch->dimension == 3)
    178     glMap2f(GL_MAP2_VERTEX_3, bpatch->umin, bpatch->umax, 3*bpatch->vorder, bpatch->uorder, bpatch->vmin, bpatch->vmax,3, bpatch->vorder, (GLfloat*) bpatch->ctlpoints);
    179   else
    180     glMap2f(GL_MAP2_VERTEX_4, bpatch->umin, bpatch->umax, 4*bpatch->vorder, bpatch->uorder, bpatch->vmin, bpatch->vmax,3, bpatch->vorder, (GLfloat*) bpatch->ctlpoints);
    181 
    182   glMapGrid2f(u_reso, bpatch->umin, bpatch->umax,
    183 	      v_reso, bpatch->vmin, bpatch->vmax);
    184   glEvalMesh2(GL_LINE, 0, u_reso, 0, v_reso);
    185 }
    186 
    187 void bezierPatchListDraw(bezierPatch *list, int u_reso, int v_reso)
    188 {
    189   bezierPatch *temp;
    190 glEnable(GL_LIGHTING);
    191 glEnable(GL_LIGHT0);
    192 glEnable(GL_MAP2_VERTEX_3);
    193 glEnable(GL_AUTO_NORMAL);
    194 glEnable(GL_NORMALIZE);
    195 glColor3f(1,0,0);
    196 #ifdef DEBUG
    197 printf("mapmap\n");
    198 #endif
    199 
    200 
    201   for(temp = list; temp != NULL; temp = temp->next)
    202     bezierPatchDraw(temp, u_reso, v_reso);
    203 }
    204 
    205 
    206 
    207