home *** CD-ROM | disk | FTP | other *** search
/ Trixter's Scene Collection / trixter.zip / trixter / Demos / KD_DREAM.ZIP / SRC.ZIP / PART6.C < prev    next >
C/C++ Source or Header  |  1996-12-30  |  7KB  |  322 lines

  1. #include <math.h>
  2. #include <malloc.h>
  3. #include <stdlib.h>
  4. #include <direct.h>
  5. #include <string.h>
  6.  
  7. #include <wgt5.h>
  8. #include <pr.h>
  9.  
  10. #ifdef __3DFX__
  11. #include <glide.h>
  12. #endif
  13.  
  14. #include "demo.h"
  15.  
  16.  
  17. /* Modified from Phred's Bump */
  18.  
  19. #define XLIGHT 256
  20. #define YLIGHT 256
  21. #define XMLIGHT 255
  22. #define YMLIGHT 255
  23. #define XHLIGHT 127
  24. #define YHLIGHT 127
  25.  
  26. void CalcLightSource (unsigned char *light);
  27. void BumpLight (unsigned char *dest, PR_DWORD lx, PR_DWORD ly,
  28.                 unsigned char *light);
  29. block part6_dest;
  30. unsigned char *bumpx;
  31. unsigned char *bumpy;
  32.  
  33. unsigned char *lightsource;
  34. unsigned char *bumpmap;
  35. PR_REAL p6_angle, p6_angle2;
  36. color p6pal[256];
  37.  
  38.  
  39.  
  40. void CalcLightSource (unsigned char *light)
  41. /* calculates the light source map */
  42. {
  43.   int   i,j;
  44.   float dist, tx, ty;
  45.  
  46.   for (i = 0; i < XLIGHT; i++)
  47.     for (j = 0; j < YLIGHT; j++)
  48.     {
  49.       tx = i - XHLIGHT;
  50.       ty = j - YHLIGHT;
  51.       dist = sqrt(tx*tx + ty*ty);
  52.       if (dist < 96)
  53.         light[i*XLIGHT+j] = (63 - (dist*0.66)) + 1;
  54.       else
  55.         light[i*XLIGHT+j] = 1;
  56.       if (light[i*XLIGHT+j] < 1)
  57.         light[i*XLIGHT+j] = 1;
  58.     }
  59. }
  60.  
  61.  
  62.  
  63. void PrecalcBump (unsigned char *bump)
  64. {
  65. int x, y;
  66.  
  67. int middle;
  68. int top;
  69. int bottom;
  70. int left;
  71. int right;
  72. int dx, dy;
  73.  
  74.   memset (bumpx, 0, 320*200);
  75.   memset (bumpy, 0, 320*200);
  76.  
  77.   for (x = 1; x < 319; x++)
  78.    for (y = 1; y < 198; y++)
  79.      {
  80.  
  81.       middle = bump[y*320 + x];
  82.       left   = ((int)bump[y*320 + x - 1] - middle);
  83.       right  = ((int)bump[y*320 + x + 1] - middle);
  84.       top    = ((int)bump[y*320 + x - 320] - middle);
  85.       bottom = ((int)bump[y*320 + x + 320] - middle);
  86.       dx  = (left - right) >> 1;
  87.       dy  = (top - bottom) >> 1;
  88.  
  89.       bumpx[y*320 + x] = dx;
  90.       bumpy[y*320 + x] = dy;
  91.      }
  92. }
  93.  
  94.  
  95.  
  96. void BumpLight (unsigned char *dest, PR_DWORD lx, PR_DWORD ly,
  97.                 unsigned char *light)
  98. {
  99. unsigned char *blutx, *bluty;
  100.  
  101. PR_DWORD lx1, ly1, lx2, ly2;
  102. PR_DWORD dx, dy;
  103. PR_DWORD dx1, dx2, dy1, dy2;
  104. PR_DWORD sofs;
  105. PR_DWORD tx;
  106. PR_DWORD slx, sly, x, y;
  107. PR_DWORD tlx, tly;
  108.  
  109.   lx1 = lx - 127;
  110.   ly1 = ly - 127;
  111.   lx2 = lx + 127;
  112.   ly2 = ly + 127;
  113.   slx = lx1;
  114.   sly = ly1;
  115.   if (lx1 < 1)   { slx = lx1; lx1 = 1; }
  116.   if (lx1 > 318) return;
  117.   if (ly1 < 1)   { sly = ly1; ly1 = 1; }
  118.   if (ly1 > 198) return;
  119.  
  120.   if (lx2 > 318) lx2 = 318;
  121.   if (lx2 < 1)   return;
  122.   if (ly2 > 198) ly2 = 198;
  123.   if (ly2 < 1)   return;
  124.  
  125.   y = ly1;
  126.   sofs = ly1 * 320;
  127.  
  128.   while (y < ly2)
  129.   {
  130.     x = lx1;
  131.     sofs += lx1;
  132.     tlx = x - slx;
  133.     tly = y - sly;
  134.  
  135.     blutx = &bumpx[sofs];
  136.     bluty = &bumpy[sofs];
  137.  
  138.     while (x++ < lx2)
  139.     {
  140.       dx = *(blutx++);
  141.       dy = *(bluty++);
  142.  
  143.       *(dest + sofs++) =
  144.          light[(((tly+dy) & YMLIGHT) << 8)+(((tlx++)+dx) & XMLIGHT)];
  145.     }
  146.     tly++;
  147.     sofs += (320-lx2);
  148.     y++;
  149.   }
  150. }
  151.  
  152.  
  153.  
  154.  
  155.  
  156. void Part6 (void)
  157. {
  158. PR_OBJECT *platform_shape;
  159. PR_OBJECT *light_shape;
  160. PR_ENTITY *platform_entity;
  161. PR_ENTITY *light_entity;
  162.  
  163. PR_REAL platx = -90, platy = 0, platz = 0;
  164. PR_DWORD past_ticks;
  165.  
  166. PR_REAL spin = -1.8;            /* Camera sine wave parameter */
  167. PR_REAL spin2 = -2.2;           /* Second camera sine wave parameter */
  168. PR_REAL spincos, spinsin;       /* Sine wave movement pattern vars */
  169. PR_REAL bounce;
  170. PR_REAL lightx, lightz;
  171.  
  172. PR_DWORD x, y;
  173. PR_DWORD bumptex;
  174. PR_DWORD i;
  175. PR_REAL spinz = 0;
  176.  
  177.   wnormscreen ();
  178.   wcls (0);
  179.   fading = 0;
  180.   PR_AllocMaterialList (256);
  181.   PR_AllocWorldTextures (64);
  182.   PR_AllocShadeTables (32);
  183.  
  184.   /* -------------- Load objects ----------------- */
  185.  
  186.   light_shape = LoadFile ("bmplight.pro");
  187.   platform_shape = LoadFile ("platform.pro");
  188.  
  189.   /* -------------- Initialize Entities ----------- */
  190.  
  191.   platform_entity = PR_CreateEntity (platform_shape, "Blue Platform");
  192.   PR_ScaleEntity (platform_entity, 1, 1, 1);
  193.   PR_PositionEntity (platform_entity, 0, 0, 0);
  194.  
  195.   light_entity = PR_CreateEntity (light_shape, "Bump light");
  196.   PR_ScaleEntity (light_entity, 0.1, 0.1, 0.1);
  197.   PR_PositionEntity (light_entity, 0, 0, 0);
  198.  
  199.   /* -------------- Misc Setup ----------- */
  200.  
  201.  
  202.   ticks = 0;
  203.   userlights.NumLights = 1;     /* This sets how many lights are actually used */
  204.   PR_SetLightType (&userlights, 0, DIRECTIONAL_LIGHT);
  205.   PR_SetLightStrength (&userlights, 0, 1.0);
  206.   PR_AmbientLight = 256;
  207.   PR_SetLightPosition (&userlights, 0,
  208.                        -200, 15000, -500);
  209.  
  210.   bumptex = PR_FindTexture ("bumpdum.pcx");
  211.  
  212.   lightsource = malloc (XLIGHT*YLIGHT);
  213.   bumpmap = wloadpcx ("bumpkos.pcx", p6pal);
  214.   bumpx = malloc (320 * 200);
  215.   bumpy = malloc (320 * 200);
  216.  
  217.   CalcLightSource (lightsource);
  218.   p6_angle = 0;
  219.   PrecalcBump (bumpmap + 4);
  220.  
  221.   for (i = 0; i < 30; i++)
  222.     {
  223.      lightx = (sin(p6_angle + p6_angle2)*100);
  224.      lightz = (cos(2*p6_angle + sin(p6_angle2))*80);
  225.  
  226.      x = 159 + lightx;
  227.      y = 99 + lightz;
  228.  
  229.      BumpLight (PR_WorldTextures[bumptex].image + 4, x, y, lightsource);
  230.  
  231.      p6_angle += 3.141592 / 256.0 * 6;
  232.      p6_angle2 += 0.02;
  233.     }
  234.  
  235.  
  236.   /* -------------- Loop ----------- */
  237.  
  238.   while (CheckSongPosition (0x2E, 60))
  239.     {
  240.      PR_OpenScreen (PR_BACKBUFFER);
  241.      past_ticks = ticks;
  242.      ticks = 0;
  243.  
  244.      /* -------------- Animation Parameters ----------- */
  245.  
  246.      spinz += past_ticks * 0.5;                /* Light spin */
  247.      spin += past_ticks * 0.0047;              /* Camera var 1 */
  248.      spin2 += past_ticks * 0.015;              /* Camera var 2 */
  249.      spinsin = sin (spin + spin2) * 2800;
  250.      spincos = cos (spin + sin(spin2)) * 2800;
  251.      bounce = sin (spin2) * 800;
  252.  
  253.      lightx = (sin(p6_angle + p6_angle2)*100);
  254.      lightz = (cos(2*p6_angle + sin(p6_angle2))*80);
  255.  
  256.      x = 159 + lightx;
  257.      y = 99 + lightz;
  258.  
  259.      lightx = (lightx * -11);
  260.      lightz *= 14;
  261.  
  262.      /* -------------- 3D Parameters ----------- */
  263.      PR_SetCameraSource (newcam, spinsin + 100, 400 + bounce, spincos);
  264.      PR_SetCameraTarget (newcam, 0, -500, 0);
  265.      PR_SetActiveCamera (newcam);
  266.  
  267.  
  268.      PR_PositionEntity (light_entity, lightx, -500, lightz);
  269.  
  270.      /* -------------- Bump Map ----------- */
  271.  
  272.      BumpLight (PR_WorldTextures[bumptex].image + 4, x, y, lightsource);
  273.  
  274.      p6_angle += 3.141592 / 256.0 * 3;
  275.      p6_angle2 += 0.01;
  276.  
  277.      /* -------------- Render Normal Frame ----------- */
  278.  
  279.      PR_NewFrame ();
  280.      wsetcolor (0);
  281.      PRGFX_ClearScreen ();
  282.      PR_AddLightsToScene (&userlights);
  283.  
  284.  
  285.      PR_RotateEntity (platform_entity, platx, platy, platz);
  286.      PR_TransformEntity (platform_entity);
  287.      PR_RenderEntity (platform_entity);
  288.  
  289.      PR_RotateEntity (light_entity, spinz, 0, 0);
  290.      PR_TransformEntity (light_entity);
  291.      PR_RenderEntity (light_entity);
  292.  
  293.      PRGFX_Clip (active_viewport.topx,
  294.                  active_viewport.topy,
  295.                  active_viewport.bottomx,
  296.                  active_viewport.bottomy);
  297.  
  298.    #ifndef __3DFX__
  299.      PR_RenderFrame ();
  300.    #endif
  301.  
  302.      PR_Flip ();
  303.     }
  304.  
  305.  
  306.   PR_FreeObject (platform_shape);
  307.   PR_FreeEntity (platform_entity);
  308.   PR_DeleteAllWorldTextures ();
  309.   PR_DeleteAllShadeTables ();
  310.   PR_DeleteAllMaterials ();
  311.  
  312.   free (lightsource);
  313.   free (bumpmap);
  314.   free (bumpx);
  315.   free (bumpy);
  316.  
  317.   PR_AmbientLight = 0;
  318. }
  319.  
  320.  
  321.  
  322.