home *** CD-ROM | disk | FTP | other *** search
/ Virtual Reality Homebrewer's Handbook / vr.iso / avril / example4.c < prev    next >
C/C++ Source or Header  |  1996-03-19  |  3KB  |  102 lines

  1. /* EXAMPLE4 -- simple object behaviours */
  2.  
  3. /* Written by Bernie Roehl, April 1994 */
  4.  
  5. #include "avril.h"
  6. #include <stdlib.h>  /* needed for rand() */
  7.  
  8. static vrl_Angle spinrate;
  9. static vrl_Time bounce_period;
  10. static vrl_Scalar maxheight;
  11. static vrl_Time pulse_period;
  12.  
  13. static void spin(void)
  14.     {
  15.     vrl_ObjectRotY(vrl_TaskGetData(), vrl_TaskGetElapsed() * spinrate);
  16.     vrl_SystemRequestRefresh();
  17.     }
  18.  
  19. static void bounce(void)
  20.     {
  21.     vrl_Object *obj = vrl_TaskGetData();
  22.     unsigned long off;
  23.     vrl_Scalar height;
  24.     off = (360 * (vrl_TaskGetTimeNow() % bounce_period)) / bounce_period;
  25.     height = vrl_FactorMultiply(vrl_Sine(float2angle(off)), maxheight);
  26.     vrl_ObjectMove(obj, vrl_ObjectGetWorldX(obj), height, vrl_ObjectGetWorldZ(obj));
  27.     vrl_SystemRequestRefresh();
  28.     }
  29.  
  30. static void pulsate(void)
  31.     {
  32.     vrl_Surface *surf = vrl_SurfacemapGetSurface((vrl_Surfacemap *) vrl_TaskGetData(), 0);
  33.     unsigned long off;
  34.     int brightness;
  35.     off = (360 * (vrl_TaskGetTimeNow() % pulse_period)) / pulse_period;
  36.     brightness = abs(vrl_FactorMultiply(vrl_Sine(float2angle(off)), 255));
  37.     vrl_SurfaceSetBrightness(surf, brightness);
  38.     vrl_SystemRequestRefresh();
  39.     }
  40.  
  41. void main()
  42.     {
  43.     vrl_Light *light;
  44.     vrl_Camera *camera;
  45.     vrl_Shape *cube, *sphere, *cylinder;
  46.     vrl_Surfacemap *cubemap, *pulsemap;
  47.     int i;
  48.  
  49.     vrl_SystemStartup();
  50.     
  51.     cube = vrl_PrimitiveBox(100, 100, 100, NULL);
  52.     sphere = vrl_PrimitiveSphere(100, 6, 6, NULL);
  53.     cylinder = vrl_PrimitiveCylinder(100, 50, 100, 8, NULL);
  54.  
  55.     cubemap = vrl_SurfacemapCreate(1);
  56.     vrl_SurfacemapSetSurface(cubemap, 0, vrl_SurfaceCreate(5));
  57.     pulsemap = vrl_SurfacemapCreate(1);
  58.     vrl_SurfacemapSetSurface(pulsemap, 0, vrl_SurfaceCreate(14));
  59.  
  60.     spinrate = float2angle(72.0 / vrl_TimerGetTickRate());  /* deg per tick */
  61.     bounce_period = 4 * vrl_TimerGetTickRate();  /* four-second period */
  62.     maxheight = float2scalar(400);    /* maximum height in units */
  63.     pulse_period =  2 * vrl_TimerGetTickRate();  /* two-second period */
  64.  
  65.     light = vrl_LightCreate();
  66.     vrl_LightRotY(light, float2angle(45));
  67.     vrl_LightRotX(light, float2angle(45));
  68.  
  69.     camera = vrl_CameraCreate();
  70.     vrl_CameraRotY(camera, float2angle(5));
  71.     vrl_CameraMove(camera, 0, 200, -4400);
  72.  
  73.     for (i = 0; i < 10; ++i)
  74.         {
  75.         vrl_Object *obj = vrl_ObjectCreate(NULL);
  76.         vrl_ObjectMove(obj, rand() % 1000, rand() % 1000, rand() % 1000);
  77.         switch (i & 3)
  78.             {
  79.             case 0:
  80.                 vrl_ObjectSetShape(obj, cube);
  81.                 break;
  82.             case 1:
  83.                 vrl_ObjectSetShape(obj, cube);
  84.                 vrl_ObjectSetSurfacemap(obj, cubemap);
  85.                 vrl_TaskCreate(spin, obj, 10);
  86.                 break;
  87.             case 2:
  88.                 vrl_ObjectSetShape(obj, sphere);
  89.                 vrl_TaskCreate(bounce, obj, 10);
  90.                 break;
  91.             case 3:
  92.                 vrl_ObjectSetShape(obj, cylinder);
  93.                 vrl_ObjectSetSurfacemap(obj, pulsemap);
  94.                 break;
  95.             }
  96.         vrl_TaskCreate(pulsate, pulsemap, 10);
  97.         }
  98.  
  99.     vrl_SystemRun();
  100.     }
  101.  
  102.