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

📄 bezierpatchmesh.cc

📁 winNT技术操作系统,国外开放的原代码和LIUX一样
💻 CC
📖 第 1 页 / 共 2 页
字号:
	  temp[i] = bpm->UVarray[i];
	}
      
      /*deallocate old array*/
      free(bpm->UVarray);
      
      /*pointing to the new arrays*/
      bpm->UVarray = temp;
    }
  /*insert the new UV*/
  bpm->UVarray[bpm->index_UVarray] = u;
  bpm->index_UVarray++;
  bpm->UVarray[bpm->index_UVarray] = v;
  bpm->index_UVarray++;

  /*update counter: one more vertex*/
  bpm->counter++;


}

void bezierPatchMeshPrint(bezierPatchMesh *bpm)
{
  int i;
  printf("the bezier patch is\n");
  bezierPatchPrint(bpm->bpatch);
  printf("index_length_array= %i\n", bpm->index_length_array);
  printf("size_length_array =%i\n", bpm->size_length_array);
  printf("index_UVarray =%i\n", bpm->index_UVarray);
  printf("size_UVarray =%i\n", bpm->size_UVarray);
  printf("UVarray is\n");
  for(i=0; i<bpm->index_UVarray; i++)
    printf("%f ", bpm->UVarray[i]);

  printf("length_array is\n");
  for(i=0; i<bpm->index_length_array; i++)
    printf("%i ", bpm->length_array[i]);
  printf("\n");

}

/*insert a new patch in front of the current linked list and return the new list*/
bezierPatchMesh* bezierPatchMeshListInsert(bezierPatchMesh* list, bezierPatchMesh* bpm)
{
  bpm->next=list;
  return bpm;
}

/*print all the patches*/
void bezierPatchMeshListPrint(bezierPatchMesh* list)
{
  bezierPatchMesh *temp;
  for(temp = list; temp != NULL; temp = temp->next)
    {
      bezierPatchMeshPrint(temp);
    }
}

int bezierPatchMeshListTotalStrips(bezierPatchMesh* list)
{
  int sum=0;
  bezierPatchMesh *temp;
  for(temp=list; temp != NULL; temp = temp->next)
    {
      sum += temp->index_length_array;
    }
  return sum;
}

int bezierPatchMeshListTotalVert(bezierPatchMesh* list)
{
  int sum=0;
  bezierPatchMesh *temp;
  for(temp=list; temp != NULL; temp = temp->next)
    {
      sum += temp->index_UVarray;
    }
  return sum/2;
}

int bezierPatchMeshListNumTriangles(bezierPatchMesh* list)
{
  int sum=0;
  bezierPatchMesh* temp;
  for(temp=list; temp != NULL; temp = temp->next)
    {
      sum +=  bezierPatchMeshNumTriangles(temp);
    }
  return sum;
}

int bezierPatchMeshNumTriangles(bezierPatchMesh* bpm)
{
  int i;
  int sum=0;
  for(i=0; i<bpm->index_length_array; i++)
    {
      switch(bpm->type_array[i])
	{
	case GL_TRIANGLES:
	  sum += bpm->length_array[i]/3;
	  break;
	case GL_TRIANGLE_FAN:
	  if(bpm->length_array[i] > 2)
	    sum += bpm->length_array[i]-2;
	  break;
	case GL_TRIANGLE_STRIP:
	  if(bpm->length_array[i] > 2)
	    sum += bpm->length_array[i]-2;
	  break;
	case GL_QUAD_STRIP:
	  if(bpm->length_array[i]>2)
	    sum += (bpm->length_array[i]-2);
	  break;
	default:
	  fprintf(stderr,"error in bezierPatchMeshListNumTriangles, type invalid\n");
	}
    }
  return sum;
}

/*delete degenerate triangles*/
void bezierPatchMeshDelDeg(bezierPatchMesh* bpm)
{
  if(bpm == NULL) return;
  int i,j,k;
  int *new_length_array;
  GLenum *new_type_array;
  int index_new_length_array;
  float *new_UVarray;
  int index_new_UVarray;

  new_length_array = (int*)malloc(sizeof(int) * bpm->index_length_array);
  assert(new_length_array);
  new_type_array = (GLenum*)malloc(sizeof(GLenum) * bpm->index_length_array);
  assert(new_length_array);
  new_UVarray = (float*) malloc(sizeof(float) * bpm->index_UVarray);
  assert(new_UVarray);

  index_new_length_array = 0;
  index_new_UVarray=0;
  k=0;
  for(i=0; i<bpm->index_length_array; i++){
    
    /*(if not degenerate, we have to copy*/
    if( (bpm->length_array[i] != 3) || (!isDegenerate(bpm->UVarray+k, bpm->UVarray+k+2, bpm->UVarray+k+4)))
	  {
	    for(j=0; j<2* bpm->length_array[i]; j++)
	      new_UVarray[index_new_UVarray++] = bpm->UVarray[k++];

	    new_length_array[index_new_length_array] = bpm->length_array[i];
	    new_type_array[index_new_length_array] = bpm->type_array[i];
	    index_new_length_array++;
	  }
    else
      {
	k += 6;
      }
  }  
  free(bpm->UVarray);
  free(bpm->length_array);
  free(bpm->type_array);
  bpm->UVarray=new_UVarray;
  bpm->length_array=new_length_array;
  bpm->type_array=new_type_array;
  bpm->index_UVarray = index_new_UVarray;
  bpm->index_length_array = index_new_length_array;
  
}

/*(u,v) to XYZ
 *the xyz and normals are stored in vertex_array, 
 *and normal_array. the spaces of both are allocated here
 */
void bezierPatchMeshEval(bezierPatchMesh* bpm)
{
  int i,j,k,l;
  float u,v;
  float u0 = bpm->bpatch->umin;
  float u1 = bpm->bpatch->umax;
  int uorder = bpm->bpatch->uorder;
  float v0 = bpm->bpatch->vmin;
  float v1 = bpm->bpatch->vmax;
  int vorder = bpm->bpatch->vorder;
  int dimension = bpm->bpatch->dimension;
  int ustride = dimension * vorder;
  int vstride = dimension;
  float *ctlpoints = bpm->bpatch->ctlpoints;
  
  bpm->vertex_array = (float*) malloc(sizeof(float)* (bpm->index_UVarray/2) * 3);
  assert(bpm->vertex_array);
  bpm->normal_array = (float*) malloc(sizeof(float)* (bpm->index_UVarray/2) * 3);
  assert(bpm->normal_array);

  k=0;
  l=0;
  for(i=0; i<bpm->index_length_array; i++)
    {
      for(j=0; j<bpm->length_array[i]; j++)
	{
	  u = bpm->UVarray[k];
	  v = bpm->UVarray[k+1];
	  bezierSurfEval(u0,u1,uorder, v0, v1, vorder, dimension, ctlpoints, ustride, vstride, u,v, bpm->vertex_array+l);
	  bezierSurfEvalNormal(u0,u1,uorder, v0, v1, vorder, dimension, ctlpoints, ustride, vstride, u,v, bpm->normal_array+l);
	  k += 2;
	  l += 3;
	}
    }
}
    
void bezierPatchMeshListEval(bezierPatchMesh* list)
{
  bezierPatchMesh* temp;
  for(temp = list; temp != NULL; temp = temp->next)
    {
      bezierPatchMeshEval(temp);
    }
}

void bezierPatchMeshDraw(bezierPatchMesh* bpm)
{
  int i,j,k;
  k=0;
  /*k is the index of the first component of the current vertex*/
  for(i=0; i<bpm->index_length_array; i++)
    {
      glBegin(bpm->type_array[i]);
      for(j=0; j<bpm->length_array[i]; j++)
	{
	  glNormal3fv(bpm->normal_array+k);
	  glVertex3fv(bpm->vertex_array+k);
	  k+= 3;
	}
      glEnd();
    }
}

void bezierPatchMeshListDraw(bezierPatchMesh* list)
{
  bezierPatchMesh* temp;
  for(temp = list; temp != NULL; temp = temp->next)
    {
      bezierPatchMeshDraw(temp);
    }
}

void bezierPatchMeshListCollect(bezierPatchMesh* list, float **vertex_array, float **normal_array, int **length_array, GLenum **type_array, int *num_strips)
{
  int i,j,k,l;
  bezierPatchMesh *temp;
  int total_num_vertices = bezierPatchMeshListTotalVert(list);
  (*vertex_array) = (float *) malloc(sizeof(float) * total_num_vertices*3);
  assert(*vertex_array);
  (*normal_array) = (float *) malloc(sizeof(float) * total_num_vertices*3);
  assert(*normal_array);

  *num_strips = bezierPatchMeshListTotalStrips(list);
   
  *length_array = (int*) malloc(sizeof(int) * (*num_strips));
  assert(*length_array);

  *type_array = (GLenum*) malloc(sizeof(GLenum) * (*num_strips));
  assert(*type_array);
  
  k=0;
  l=0;
  for(temp = list; temp != NULL; temp = temp->next)
    {
      int x=0;
      for(i=0; i<temp->index_length_array; i++)
	{
	  for(j=0; j<temp->length_array[i]; j++)
	    {
	      (*vertex_array)[k] = temp->vertex_array[x];
	      (*vertex_array)[k+1] = temp->vertex_array[x+1];
	      (*vertex_array)[k+2] = temp->vertex_array[x+2];

	      (*normal_array)[k] = temp->normal_array[x];
	      (*normal_array)[k+1] = temp->normal_array[x+1];
	      (*normal_array)[k+2] = temp->normal_array[x+2];

	      x += 3;
	      k += 3;
	    }
	  (*type_array)[l]  = temp->type_array[i];
	  (*length_array)[l++] = temp->length_array[i];
	}
    }
}



static int isDegenerate(float A[2], float B[2], float C[2])
{
  if( (A[0] == B[0] && A[1]==B[1]) ||
      (A[0] == C[0] && A[1]==C[1]) ||
      (B[0] == C[0] && B[1]==C[1])
     )
    return 1;
  else
    return 0;
}




⌨️ 快捷键说明

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