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(); }
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(); }
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; }