home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / hensa / graphics / a150_1 / !Demo4 / c / plot < prev    next >
Text File  |  1992-02-10  |  3KB  |  113 lines

  1. /******************************************************************************
  2. *                                                                             *
  3. *    plot.c                                                                   *
  4. *                                                                             *
  5. ******************************************************************************/
  6.  
  7. #include <stdlib.h>
  8. #include <stdio.h>
  9. #include <math.h>
  10. #include <swis.h>
  11. #include <os.h>
  12. #include <bbc.h>
  13. #include "GrpLib.h"
  14. #include "extern.h"
  15.  
  16. int ObjNb=0;
  17. Envi *enviobs;
  18.  
  19. /*****************************************************************************/
  20.  
  21. void RotVec(vec3 q,mat33 m,vec3 p)
  22. {
  23.   q[0] = ((m[0][0]*p[0] + m[1][0]*p[1] + m[2][0]*p[2])>>14);
  24.   q[1] = ((m[0][1]*p[0] + m[1][1]*p[1] + m[2][1]*p[2])>>14);
  25.   q[2] = ((m[0][2]*p[0] + m[1][2]*p[1] + m[2][2]*p[2])>>14);
  26. }
  27.  
  28. /*****************************************************************************/
  29.  
  30. ObjTab *(*InitPlot(int nb))
  31. {
  32.   enviobs = MakeEnvi(1, 0, 0x50);
  33.   ObjNb = 0;
  34.   return(malloc(nb*sizeof(void *)));
  35. }
  36.  
  37. /*****************************************************************************/
  38.  
  39. void AddObject(ObjTab *table[],Object *obj,void (*fp)(),
  40.                int (*fc)(),int type,void *desc)
  41. {
  42.   ObjTab *cell;
  43.  
  44.   cell = malloc(sizeof(ObjTab));
  45.   cell->object   = obj;
  46.   cell->plot     = fp;
  47.   cell->collision= fc;
  48.   cell->type     = type;
  49.   cell->desc     = desc;
  50.   table[ObjNb++] = cell;        
  51. }
  52.  
  53. /*****************************************************************************/
  54.  
  55. void Plot(ObjTab *table[],Envi *envi,Object *obs)
  56. {
  57.   Object  *obj;
  58.   ObjTab  *tmp;
  59.   int     i,j;
  60.   double  d;
  61.   mat33   inv;
  62.  
  63.   InvMat(inv,obs->Rep);
  64.   RotVec(enviobs->DirecSrc[0],inv,envi->DirecSrc[0]);
  65.  
  66.   for (i=0 ; i<ObjNb ; i++) {
  67.     obj         = table[i]->object;
  68.     d           = (double)(obj->Org[0] - obs->Org[0]) * 
  69.                   (double)(obj->Org[0] - obs->Org[0]);  
  70.     d          += (double)(obj->Org[1] - obs->Org[1]) *
  71.                   (double)(obj->Org[1] - obs->Org[1]);  
  72.     d          += (double)(obj->Org[2] - obs->Org[2]) *
  73.                   (double)(obj->Org[2] - obs->Org[2]);
  74.     table[i]->d = d;
  75.   }
  76.  
  77.   for (i=0 ; i<ObjNb-1 ; i++)
  78.     for (j=i+1 ; j<ObjNb ; j++)
  79.       if (table[i]->d < table[j]->d) {
  80.         tmp      = table[i];
  81.         table[i] = table[j];
  82.         table[j] = tmp;
  83.       }
  84.  
  85.   for (i=0 ; i<ObjNb ; i++)
  86.     if (obs != table[i]->object)
  87.     switch (table[i]->type) {
  88.       case 0 : (*table[i]->plot)(enviobs,obs,table[i]->object); break;
  89.       case 1 : (*table[i]->plot)(enviobs,obs,table[i]->object,table[i]->desc);
  90.                break;
  91.     }
  92. }
  93.  
  94. /*****************************************************************************/
  95.  
  96. int Collision(ObjTab *table[],Object *obs)
  97. {
  98.   int i,c,cmax=0;
  99.  
  100.   for (i=0 ; i<ObjNb ; i++)
  101.     if (obs != table[i]->object)
  102.     if (*table[i]->collision != NULL) {
  103.      switch (table[i]->type) {
  104.        case 0 : c = (*table[i]->collision)(obs,table[i]->object); break;
  105.        case 1 : c = (*table[i]->collision)(obs,table[i]->object,table[i]->desc);
  106.                 break;
  107.      }
  108.      if (c>=cmax) cmax=c;
  109.     }
  110.   return(cmax);
  111. }
  112.  
  113.