Tutorial 3: Drag n Drop

Dans ce tutorial nous allons donc voir comment afficher la position de l'atomic sélectionné et comment ajouter un autre objet grâce au Drag n Drop.

Affichage de la position
Drag'n Drop

Affichage de la position

La première chose à faire c'est d'ajouter une variable ShowPos

static RwBool FPSOn = FALSE;
static RwBool ShowPos = FALSE;

Ensuite il faut ajouter ensuite la ligne dans InitializeMenu() qui permet d'indiquer qu'il y a une nouvelle ligne dans le menu:

static RwBool
InitializeMenu(void)
{
   static RwChar fpsLabel[] = RWSTRING("FPS_F");
   static RwChar nearLabel[] = RWSTRING("Near Clip");
   static RwChar farLabel[] = RWSTRING("Far Clip");
   static RwChar showLabel[] = RWSTRING("Show Position");

   if( MenuOpen(TRUE, &ForegroundColor, &BackgroundColor) )
   {
      MenuAddEntryBool(fpsLabel, &FPSOn, NULL);
      MenuAddEntryReal(nearLabel, &NearClip,NULL,0.1f,10.0f,0.1f);
      MenuAddEntryReal(farLabel, &FarClip,NULL,10.0f,100.0f,1.0f);
      MenuAddEntryBool(showLabel, &ShowPos, NULL);

      return TRUE;
   }

   return FALSE;
}

C'est la fonction DisplayOnScreenInfo() qui affiche ce qu'il faut à l'écran. Donc nous allons dire que si ShowPos est à true, on affiche la position de l'objet sélectionné.

static void
DisplayOnScreenInfo(RwCamera *camera)
{
   RwChar caption[256];
   RtCharsetDesc charsetDesc;
   RwInt32 crw, crh;

   crw = RwRasterGetWidth(RwCameraGetRaster(camera));
   crh = RwRasterGetHeight(RwCameraGetRaster(camera));

   RtCharsetGetDesc(Charset, &charsetDesc);

   if( FPSOn )
   {
      RsSprintf(caption, RWSTRING("FPS: %03d"), FramesPerSecond);

      RsCharsetPrint( Charset, caption, 0, 0, rsPRINTPOSTOPRIGHT );
   }

   if( ShowPos )
   {
      if(PickedAtomic) //si a cliqué sur un objet
      {
         RwFrame *f = RpAtomicGetFrame(PickedAtomic);
         //on recupère la matrice
         RwMatrix * m = RwFrameGetLTM(f);

         //on affiche la position
         RsSprintf(caption,RWSTRING("%4.2f,%4.2f,%4.2f"),m->pos.x,m->pos.y,m->pos.z);

         RsCharsetPrint( Charset,caption,0,2,rsPRINTPOSTOPRIGHT);
      }
   }

   return;
}

On compile, on exécute, on apûie sur F1, on met en place le cube et on affiche sa position.

 

Pour ajouter le [S], pour indiquer qu'il faut appuyer sur S pour afficher la position, il suffit d'ajouter "_S" à la suite du showLabel. Maintenant, on va apprendre le Drag'n Drop.

Le Drag'n Drop

La première étape est de rajouter le code qui va gérer l'événement rsFILELOAD dans AppEventHandler(). Pour se faire, il faut copier le code qui est ecécuté lors de l'appui de F1 dans cette partie du gestionnaire.

case rsFILELOAD:
{
   RpClump *clump = DffLoad("models/cube.dff");
   if (clump)
   {
      RwV3d v = {0.0f, 0.0f, 5.0f};

      RwFrameTranslate(RpClumpGetFrame(clump), &v, rwCOMBINEREPLACE);
      RpWorldAddClump(World, clump);
   }

   return rsEVENTPROCESSED;
}
default:

On compile et on exécute. Maintenant, à chaque fois qu'on clique dépose un fichier dans l'application, alors un cube est dessiné comme lorsqu'on appuie sur F1. C'est bien mais ça serait plus intéressant que ça affiche le fichier que l'on dépose!! En fait, le paramètre passé à AppEventHandler() contient le nom du fichier déposé. IL n'y a donc pas grand chose à rajouter:

case rsFILELOAD:
{
   RwChar * name = (RwChar*)param;
   RpClump *clump = DffLoad(name);

   if (clump)
   {
      RwV3d v = {0.0f, 0.0f, 5.0f};

      RwFrameTranslate(RpClumpGetFrame(clump), &v, rwCOMBINEREPLACE);
      RpWorldAddClump(World, clump);
   }

   return rsEVENTPROCESSED;
}
default:

Ainsi, à chaque fois qu'on lit un fichier .DFF, il s'affiche automatiquement dans l'application.
On compile, on exécute, et on dépose des fichiers dans l'application.

Nous avons fini avec les intéractions avec l'utilisateur. Nous allons voir dans le tutorial suivant comment créer des plug-ins. Tutorial4