home *** CD-ROM | disk | FTP | other *** search
/ HOT Scene Stuff / hotscenestuffzyklop1996.iso / demos / sunknown / morph.cpp < prev    next >
C/C++ Source or Header  |  1994-04-07  |  4KB  |  242 lines

  1. // MORPH.CPP ////////////////////////////////////////////////////////////////
  2.  
  3. // Thomas H.
  4.  
  5. // INCLUDES /////////////////////////////////////////////////////////////////
  6.  
  7. #include <stdio.h>
  8. #include <math.h>
  9. #include <dos.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12.  
  13. #include "dune.h"
  14. #include "template.h"
  15. #include "timer.h"
  16. #include "global.h"
  17. #include "seg.h"
  18. #include "xgraf.h"
  19.  
  20. // DEFINES //////////////////////////////////////////////////////////////////
  21.  
  22. #define SLACK 4500
  23. #define SPEEDFAC 0.50
  24.  
  25. // EXTERNALS ////////////////////////////////////////////////////////////////
  26.  
  27. // FUNCTIONS
  28.  
  29. extern "C" void gomorph(void);
  30. extern "C" void drawmorph(void);
  31. extern void quit(int errval);
  32.  
  33. // VARS
  34.  
  35. extern byte loop;
  36. extern timer_C timer;
  37. extern long far mo192,
  38.        far mobuffer;
  39. extern word far pixies;
  40. extern ulong musicstart;
  41. extern int relspeed;
  42. extern byte *pressed;
  43.  
  44. // FUNCTIONS ////////////////////////////////////////////////////////////////
  45.  
  46. // LOADDATA
  47.  
  48. void loaddata(byte *ptr, FILE *fp, int number)
  49. {
  50.     byte temp;
  51.     for (word w=0; w<number*3l; w++)
  52.     {
  53.         fread(&temp,1,1,fp);
  54.         ptr[w]=temp;
  55.     }
  56. }
  57.  
  58. // MAKEFIRST
  59.  
  60. void makefirst(byte *x,byte *y, byte *f, byte *raw,int pix)
  61. {
  62.   for (word count=0; count<pix; count++)
  63.     x[count]=y[count]=f[count]=0;
  64.  
  65.   for (count=0; count<pix; count++)
  66.   {
  67.     x[1]=*(raw++);
  68.     y[1]=*(raw++);
  69.     f[1]=*(raw++);
  70.         x+=4;
  71.         y+=4;
  72.         f+=4;
  73.     }
  74. }
  75.  
  76. // FINDDIFF
  77.  
  78. void finddiff(byte *x,byte *y, byte *f, byte *raw,int pix,int steps)
  79. {
  80.     word *ix=(word*)x;
  81.     word *iy=(word*)y;
  82.     word *iz=(word*)f;
  83.  
  84.     for (int count=0; count<pix; count++)
  85.     {
  86.         long tx=*(raw++);
  87.         long ty=*(raw++);
  88.         long tz=*(raw++);
  89.  
  90.     tx<<=8;
  91.     ty<<=8;
  92.     tz<<=8;
  93.  
  94.     tx+=128;
  95.     ty+=128;
  96.     tz+=128;
  97.  
  98.     tx-=ix[count*2];
  99.     ty-=iy[count*2];
  100.     tz-=iz[count*2];
  101.  
  102.         tx/=(float)steps;
  103.         ty/=(float)steps;
  104.         tz/=(float)steps;
  105.  
  106.     ix[count*2+1]=tx;
  107.     iy[count*2+1]=ty;
  108.     iz[count*2+1]=tz;
  109.   }
  110. }
  111.  
  112. // MORPH
  113.  
  114. void morph(void)
  115. {
  116.     seg_C buffer;
  117.     seg_C tri(3*65536l);
  118.   int steps;
  119.  
  120.     long lt1=(long)tri.ptr;
  121.     long lt2=lt1+65536l*4096;
  122.     long lt3=lt2+65536l*4096;
  123.  
  124.     byte *t1=(byte *)lt1;
  125.     byte *t2=(byte *)lt2;
  126.     byte *t3=(byte *)lt3;
  127.  
  128.     for (long lb=0; lb<65536l; lb++)
  129.         t1[lb]=t2[lb]=t3[lb]=buffer.ptr[lb]=0;
  130.  
  131.     mobuffer=(long)buffer.ptr;
  132.     mo192=lt1;
  133.  
  134.     setpalette(MORPHPAL);
  135.  
  136.   FILE *infile=fopen(MORPHDATA,"rb");
  137.   byte ant;
  138.   int pix;
  139.     fread(&ant,1,1,infile);
  140.     fread(&pix,2,1,infile);
  141.  
  142.     // First frame:
  143.     seg_C raw(3l*pix);
  144.  
  145.     loaddata(raw.ptr,infile,pix);
  146.     pixies=pix;
  147.     makefirst(t1,t2,t3,raw.ptr,pix);
  148.  
  149.     ulong estart=timer.readtimer();
  150.     float left=END_MORPH-timer.elapsed(musicstart,estart)-SLACK;
  151.     left/=10;
  152.     float acc=0;
  153.  
  154.     steps=SPEEDFAC*relspeed;
  155.     steps=min(steps,96);
  156.  
  157.     loaddata(raw.ptr,infile,pix);
  158.     finddiff(t1,t2,t3,raw.ptr,pix,steps);
  159.     long ttt[10];
  160.     long gaatt;
  161.     for (int count=1; count<=ant; count++)
  162.     {
  163.         for (int s=0; s<steps; s++)
  164.         {
  165.             asm pusha
  166.             asm push ds
  167.             gomorph();
  168.             drawmorph();
  169.             asm pop ds
  170.             asm popa
  171.         }
  172.         if (count<ant)
  173.         {
  174.              asm pusha
  175.              asm push ds
  176.              loaddata(raw.ptr,infile,pix);
  177.              finddiff(t1,t2,t3,raw.ptr,pix,steps);
  178.              asm pop ds
  179.              asm popa
  180.         }
  181.         acc+=left;
  182.         if (count==1 || count==ant-1)
  183.             acc+=left;
  184.  
  185.         do
  186.         {
  187.             ulong now=timer.readtimer();
  188.             gaatt=timer.elapsed(estart,now);
  189.         } while (gaatt<acc);
  190.     }
  191.     fclose(infile);
  192. }
  193.  
  194. // USEPARA
  195.  
  196. int usepara(int argc, char **argv,byte &guson)
  197. {
  198.   guson=0;
  199.   int testspeed=0;
  200.   for (int teller=1; teller<argc; teller++)
  201.   {
  202.     argv[teller][0]='-';
  203.     int len=strlen(argv[teller]);
  204.     for (int s=1; s<len; s++)
  205.       argv[teller][s]-=32*(argv[teller][s]>'Z');
  206.     testspeed|=
  207.      ((!strcmp(argv[teller],"-FINDSPEED") ||
  208.       (!strcmp(argv[teller],"-SPEED")) ||
  209.       (!strcmp(argv[teller],"-S"))));
  210.     loop|=
  211.      ((!strcmp(argv[teller],"-LOOP") ||
  212.       (!strcmp(argv[teller],"-L"))));
  213.     guson|=
  214.       (!strcmp(argv[teller],"-GUS"));
  215.   }
  216.   guson*=(!testspeed);
  217.   return testspeed;
  218. }
  219.  
  220. // SHOWSPEED
  221.  
  222. void showspeed(void)
  223. {
  224.   _AX=3;
  225.   VGAINT;
  226.   printf("Relative speed: %.2f\n\n",relspeed/100.0);
  227.   quit(0);
  228. }
  229.  
  230. // BYE
  231.  
  232. void bye(void)
  233. {
  234.     textmode();
  235.  
  236.     printf(
  237. "Thanks for watching SUPERUNKNOWN by Five, And Then Some. \n\n"
  238. "We hope you enjoyed watching it as much as we enjoyed finding\n"
  239. "that last (???) bug...\n\n");
  240. }
  241.  
  242.