Exemple #1
0
void Set_Material_And_Light (int m, int l)
{
   Current_Material = l;
   Set_Light();
   Current_Material = m;
   Set_Material();
}
Exemple #2
0
int Next_Material_And_Light()
{
   Current_Material = (Current_Material + 1) % Num_Materials;
   Set_Material();
   Set_Light();

   return Current_Material+1;
}
void AD_Scene3D::do_efx2D(double pos)
// si suppone pos compreso tra [0..1]
{
  float4 frame, ft;
  AD_Tria3D *t;
  int j, m, num_tria;

  frame=(float)( ((pos-fstartpos)/(fendpos-fstartpos))
	              *(num_frame-1));

  // consideriamo la pos nel range [0;1]
  pos=(((float)(pos)-fstartpos)/(fendpos-fstartpos));

  num_to_paint_trasparent=0;
  list_to_paint_trasparent=list_trasparent;
  list_to_paint_trasparent_copy=list_trasparent;
  for (j=0; j<num_materials; j++) 
  {
	 ft=128;
     materials[j].my_tria_list=materials[j].my_tria_list_copy;
	 // se il materiale e' trasparente non additivo
	 if ((materials[j].flags & IS_TRASPARENT) &&
		 (materials[j].trasparencytype!=ALPHA_MAP))
	 {
		 if ((material_tracks) &&
			 (material_tracks[j].trasparency_track) &&
			 (material_tracks[j].trasparency_track->numkey>1)
			 )
		 {
           material_tracks[j].trasparency_track->get_data(frame, &ft);
		   if (ft<0) ft=0;
           if (ft>255) ft=255;
		   materials[j].trasparency=(int)ft;
		 }
	 }
  }
  for (j=num_materials; j<num_materials+2; j++) 
     materials[j].my_tria_list=materials[j].my_tria_list_copy;
  

  // PIPELINE GEOMETRICA
  screen_Xadd=((float)image->width)/2.0f;
  screen_Yadd=((float)image->height)/2.0f;
  choose_current_camera(frame);
  current_telecamera->build_cameramatrix(frame);
  
  // ADrender !!!
  Set_ZRanges(current_telecamera->znear, current_telecamera->zfar);

  for (j=0; j<num_omni; j++) omni[j].update(frame, current_telecamera);
  counter_for_resetting_vertex+=4;   // NB: cosi' non sovrascriviamo
                                     // i bit di zclip dei vertici

  for (j=0; j<num_objects; j++)
  {
    if (objects[j]->skinned_object==(AD_Object3D *)NULL)
	  objects[j]->build_objectmatrix(frame);
  }
  for (j=0; j<num_objects; j++)
  {
    if (objects[j]->skinned_object!=(AD_Object3D *)NULL)
	  objects[j]->build_objectmatrix(frame);
  }


  for (j=0; j<num_objects; j++)
  {
    objects[j]->paint(frame, current_telecamera, omni);
  }


  // ADrender !!!
  Begin_Scene();

  // FASE DI RASTERING
  for (j=0; j<num_materials+2; j++)
  {
	num_tria=(materials[j].my_tria_list - materials[j].my_tria_list_copy);
	if ((num_tria>0) && (materials[j].trasparencytype==OFF) && (!(materials[j].flags & IS_TRASPARENT)))
	{
	   if (materials[j].zsorting==ON)
	   {
	     list_to_paint=(AD_Tria3D **)materials[j].my_tria_list_copy;
         qsort_nontrasparent_tria (0, num_tria-1);
	   }

	   currentmaterial_flags=materials[j].flags;
	   // ADrender !!!
       currentmaterial_drawproc=Set_Material(&materials[j]);
	   for (m=0; m<num_tria; m++)
	   {
		  t=(AD_Tria3D *)materials[j].my_tria_list_copy[m];
	      if (((t->v1->flags + t->v2->flags + t->v3->flags) & 3)==0)
		  {
            currentmaterial_drawproc(t->sp1, t->sp2, t->sp3);
		  }
		  else
		  {
			tria_paint_general(t);
		  }
	   }
	}
  }


  // Ora disegno i triangoli trasparenti
  num_tria=(list_to_paint_trasparent-list_to_paint_trasparent_copy);
  if (num_tria>0)
  {
    Begin_ExclusiveTransparency();
    qsort_trasparent_tria(0, num_tria-1);
    for (j=0; j<num_tria; j++)
	{
      t=list_to_paint_trasparent_copy[j];
	  currentmaterial_flags=t->materiale->flags;
	  // ADrender !!!
      currentmaterial_drawproc=Set_Material(t->materiale);
      if (((t->v1->flags + t->v2->flags + t->v3->flags) & 3)==0)
	  {
	    currentmaterial_drawproc(t->sp1, t->sp2, t->sp3);
	  }
      else tria_paint_general(list_to_paint_trasparent_copy[j]);
	}
  }

  End_Scene();
  End_ExclusiveTransparency();
}