예제 #1
0
파일: Box.cpp 프로젝트: berkus/grayzer
box::box( Vector& l, Vector& s1, Vector& s2, Vector& s3	)
: loc( l )
, e1( s1 )
, e2( s2 )
, e3( s3 )
{
	center = loc + (e1 + e2	+ e3) *	0.5;

	init_normals();
}
예제 #2
0
파일: Box.cpp 프로젝트: berkus/grayzer
box::box( Vector& l, double	a, double b, double	c )
: loc( l )
, e1( Vector(a,0,0)	)
, e2( Vector(0,b,0)	)
, e3( Vector(0,0,c)	)
{
	center = loc + (e1 + e2	+ e3) *	0.5;

	init_normals();
}
예제 #3
0
void AD_Object3D::init_vertex(void)
{
  int i, j;
  AD_VectUV *uv1, *uv2, *uv3;

  // se l'oggetto ha degli OSM o bonez allegate è inutile allocare il
  // triplo di punti2D e normali, perkè nel caso specifico gli
  // smoothing groups non venogno rispettati e c'è una corrispondenza
  // 1-1 tra vertice3D, normale e vertice2D
  if (
	  (num_OSMmods > 0) ||
	  (bones_matrix!=(AD_Matrix **)NULL) ||
	  (skin_modifier!=(Skin_Bone **)NULL)
     )
  {
     num_vertex2D=num_vertex3D;
     num_normals=num_vertex3D;
     vertex2D=new AD_Vertex2D[num_vertex2D];
	 normals=new AD_Vect3D[num_normals];
	 for (i=0; i<num_tria; i++)
	 {
       uv1=(AD_VectUV *)(tria[i].sp1);
       uv2=(AD_VectUV *)(tria[i].sp2);
       uv3=(AD_VectUV *)(tria[i].sp3);
       j=get_vertex_index_from_pointer(tria[i].v1);
	   tria[i].sp1=&vertex2D[j];
	   tria[i].n1=&normals[j];
       j=get_vertex_index_from_pointer(tria[i].v2);
	   tria[i].sp2=&vertex2D[j];
	   tria[i].n2=&normals[j];
       j=get_vertex_index_from_pointer(tria[i].v3);
	   tria[i].sp3=&vertex2D[j];
	   tria[i].n3=&normals[j];
	   if ((uv1) && (uv2) && (uv3) && (vertexUV))
	   {
          tria[i].sp1->u=uv1->u;
          tria[i].sp1->v=uv1->v;
          tria[i].sp2->u=uv2->u;
          tria[i].sp2->v=uv2->v;
          tria[i].sp3->u=uv3->u;
          tria[i].sp3->v=uv3->v;
	   }
	 }
	 for (i=0; i<num_normals; i++) get_vertex_normal(i, &normals[i]);
  }
  else
  {
     num_vertex2D=num_tria*3;
     vertex2D=new AD_Vertex2D[num_vertex2D];
	 for (i=0; i<num_tria; i++)
	 {
       uv1=(AD_VectUV *)(tria[i].sp1);
       uv2=(AD_VectUV *)(tria[i].sp2);
       uv3=(AD_VectUV *)(tria[i].sp3);
	   tria[i].sp1=&vertex2D[i*3];
       tria[i].sp2=&vertex2D[i*3+1];
       tria[i].sp3=&vertex2D[i*3+2];
	   if ((uv1) && (uv2) && (uv3) && (vertexUV))
	   {
	      tria[i].sp1->u=uv1->u;
	      tria[i].sp1->v=uv1->v;
	      tria[i].sp2->u=uv2->u;
	      tria[i].sp2->v=uv2->v;
	      tria[i].sp3->u=uv3->u;
	      tria[i].sp3->v=uv3->v;
		  // incorporiamo lo scaling UV
		  if (tria[i].materiale)
		  {
             tria[i].sp1->u*=tria[i].materiale->tile_u;
             tria[i].sp1->v*=tria[i].materiale->tile_v;
             tria[i].sp2->u*=tria[i].materiale->tile_u;
             tria[i].sp2->v*=tria[i].materiale->tile_v;
             tria[i].sp3->u*=tria[i].materiale->tile_u;
             tria[i].sp3->v*=tria[i].materiale->tile_v;
		  }
	   }
	 }
     init_normals(); // calcola e alloca l'array di normali tenendo conto
                     // degli smoothing groups; assegna in modo opportuno
                     // i campi n1, n2, n3 dei triangoli
  }

  // inizializzazione dei vertici (flag)
  for (i=0; i<num_vertex3D; i++) vertex3D[i].flags=0;
}