⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bezierpatch.cc

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 CC
字号:
/*** 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: 2001/03/17 00:25:40 $ $Revision: 1.1 $*//*** $Header: /home/krh/git/sync/mesa-cvs-repo/Mesa/src/glu/sgi/libnurbs/interface/bezierPatch.cc,v 1.1 2001/03/17 00:25:40 brianp Exp $*/#include "gluos.h"#include <stdlib.h>#include <stdio.h>#include <assert.h>#include <GL/glu.h> /*for drawing bzier patch*/#include "bezierPatch.h"#include "bezierEval.h"/* *allocate an instance of bezierPatch. The control points are unknown. But *the space of this array is allocated with size of  *   uorder*vorder*dimension * */bezierPatch* bezierPatchMake(float umin, float vmin, float umax, float vmax, int uorder, int vorder, int dimension){  bezierPatch* ret = (bezierPatch*) malloc(sizeof(bezierPatch));  assert(ret);  ret->umin = umin;  ret->vmin = vmin;  ret->umax = umax;  ret->vmax = vmax;  ret->uorder = uorder;  ret->vorder = vorder;  ret->dimension = dimension;  ret->ctlpoints = (float*) malloc(sizeof(float) * dimension * uorder * vorder);  assert(ret->ctlpoints);  ret->next = NULL;  return ret;}bezierPatch* bezierPatchMake2(float umin, float vmin, float umax, float vmax, int uorder, int vorder, int dimension, int ustride, int vstride,  float* ctlpoints){  bezierPatch* ret = (bezierPatch*) malloc(sizeof(bezierPatch));  assert(ret);  ret->umin = umin;  ret->vmin = vmin;  ret->umax = umax;  ret->vmax = vmax;  ret->uorder = uorder;  ret->vorder = vorder;  ret->dimension = dimension;  ret->ctlpoints = (float*) malloc(sizeof(float) * dimension * uorder * vorder);  assert(ret->ctlpoints);  /*copy the control points there*/  int the_ustride = vorder * dimension;  int the_vstride = dimension;  for(int i=0; i<uorder; i++)    for(int j=0; j<vorder; j++)      for(int k=0; k<dimension; k++)	ret->ctlpoints[i * the_ustride + j*the_vstride+k] = ctlpoints[i*ustride+j*vstride+k];    ret->next = NULL;  return ret;}/* *deallocate the space as allocated by Make */void bezierPatchDelete(bezierPatch *b){  free(b->ctlpoints);  free(b);}/*delete the whole linked list */void bezierPatchDeleteList(bezierPatch *b){  bezierPatch *temp;  while (b != NULL) {    temp = b;    b = b->next;    bezierPatchDelete(temp);      }}bezierPatch* bezierPatchInsert(bezierPatch *list, bezierPatch *b){  b->next = list;  return b;}/*print the data stored in this patch*/void bezierPatchPrint(bezierPatch *b){  printf("bezierPatch:\n");  printf("umin,umax=(%f,%f), (vmin, vmax)=(%f,%f)\n", b->umin, b->umax, b->vmin, b->vmax);  printf("uorder=%i, vorder=%i\n", b->uorder, b->vorder);  printf("idmension = %i\n", b->dimension);}       /*print the whole list*/void bezierPatchPrintList(bezierPatch *list){  bezierPatch* temp;  for(temp=list; temp != NULL; temp = temp->next)    bezierPatchPrint(temp);}void bezierPatchEval(bezierPatch *b, float u, float v, float ret[]){  if(   u >= b->umin && u<= b->umax     && v >= b->vmin && v<= b->vmax)    {      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);     }  else if(b->next != NULL)    bezierPatchEval(b->next, u,v, ret);  else     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);    }/*the returned normal is normlized */void bezierPatchEvalNormal(bezierPatch *b, float u, float v, float ret[]){  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);    if(   u >= b->umin && u<= b->umax     && v >= b->vmin && v<= b->vmax)    {      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);     }  else if(b->next != NULL)    bezierPatchEvalNormal(b->next, u,v, ret);  else     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);    }void bezierPatchDraw(bezierPatch *bpatch, int u_reso, int v_reso){  if(bpatch->dimension == 3)    glMap2f(GL_MAP2_VERTEX_3, bpatch->umin, bpatch->umax, 3*bpatch->vorder, bpatch->uorder, bpatch->vmin, bpatch->vmax,3, bpatch->vorder, (GLfloat*) bpatch->ctlpoints);  else    glMap2f(GL_MAP2_VERTEX_4, bpatch->umin, bpatch->umax, 4*bpatch->vorder, bpatch->uorder, bpatch->vmin, bpatch->vmax,3, bpatch->vorder, (GLfloat*) bpatch->ctlpoints);      glMapGrid2f(u_reso, bpatch->umin, bpatch->umax, 	      v_reso, bpatch->vmin, bpatch->vmax);  glEvalMesh2(GL_LINE, 0, u_reso, 0, v_reso);}void bezierPatchListDraw(bezierPatch *list, int u_reso, int v_reso){  bezierPatch *temp;glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);glEnable(GL_MAP2_VERTEX_3);glEnable(GL_AUTO_NORMAL);glEnable(GL_NORMALIZE);glColor3f(1,0,0);#ifdef DEBUGprintf("mapmap\n");#endif  for(temp = list; temp != NULL; temp = temp->next)    bezierPatchDraw(temp, u_reso, v_reso);}	    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -