home *** CD-ROM | disk | FTP | other *** search
/ Amiga Developer CD 1.2 / amidev_cd_12.iso / contrib / cgx3dvirge / examples / virgindemo_clipped.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-02-16  |  25.8 KB  |  899 lines

  1. /*
  2. **    $VER: VirginDemo.c 1.1 (02-Feb-1998)
  3. **
  4. **    This is an example program for cgx3dvirgin.library
  5. **
  6. **      Written by Frank Mariak
  7. **  This f***ed triangle clipping done by Michal Bartczak
  8. **
  9. **    Copyright © 1996-1998 by phase5 digital products
  10. **      All Rights reserved.
  11. **
  12. */
  13.  
  14. #define ADDING 3.14/64
  15.  
  16. #include <math.h>
  17. #include <stdio.h>
  18. #include <stdlib.h>
  19.  
  20. #include <cybergraphics/cybergraphics.h>
  21. #include <cybergraphics/cgx3dvirgin.h>
  22. #include <dos/dos.h>
  23. #include <exec/execbase.h>
  24. #include <exec/memory.h>
  25. #include <intuition/intuition.h>
  26. #include <libraries/lowlevel.h>
  27.  
  28. #include <proto/cybergraphics.h>
  29. #include <proto/cgx3dvirgin.h>
  30. #include <proto/dos.h>
  31. #include <proto/exec.h>
  32. #include <proto/graphics.h>
  33. #include <proto/lowlevel.h>
  34.  
  35. #define DEMO2
  36.  
  37. #ifndef DEMO1 // textured demo with z-buffering
  38. #ifndef DEMO2 // textured demo without z-buffering
  39. #ifndef DEMO3 // lit textured demo without z-buffering
  40. #ifndef DEMO4 // goroud shaded demo without z-buffering
  41.         You need to specify at least one of the above defines!
  42. #else
  43. #ifdef LUTMODE
  44.         Demo4 does not work in LUTMODE !
  45. #endif
  46. #endif
  47. #else
  48. #ifdef LUTMODE
  49.         Demo3 does not work in LUTMODE !
  50. #endif
  51. #endif
  52. #endif
  53. #endif
  54.  
  55.  
  56. #define DISPLAYWIDTH    640
  57. #define DISPLAYHEIGHT   480
  58. #define WINX    DISPLAYWIDTH
  59. #define WINY    DISPLAYHEIGHT
  60. #define FOCUS 400.0 // 400.0
  61.  
  62. #define Up      0x4c
  63. #define Left    0x4f
  64. #define Down    0x4d
  65. #define Right   0x4e
  66.  
  67. #define AUp     0x3e
  68. #define ALeft   0x2d
  69. #define ADown   0x1e
  70. #define ARight  0x2f
  71. #define AAxUp   0x1d
  72. #define AAxDown 0x3f
  73. #define Plus    0x5e
  74. #define Minus   0x4a
  75. #define Help    0x5f
  76. #define esc     0x45
  77.  
  78. #ifdef LUTMODE
  79. #define TEXMAPNAME      (STRPTR)"tex128.lut8"
  80. #define TEXMAPSIZE      128*128
  81. #else
  82. #define TEXMAPNAME      (STRPTR)"tex128.argb8888"
  83. #define TEXMAPSIZE      128*128*4
  84. #endif
  85.  
  86. void CloseAll(void);
  87. void LocalWorld(Triangle3D *,int,float,float,float,int);
  88.  
  89.  
  90. Triangle3D    polydata[] =
  91.         {
  92. #ifdef DEMO1
  93. #include    "obj_ring.cdat"
  94. #else
  95. #include        "obj_cylinder.cdat"
  96. #endif
  97.         };
  98.  
  99. #ifdef LUTMODE
  100.  
  101. ULONG PaletteRGB32[770] =
  102. {
  103.     0x01000000,
  104.     0x00000000,0x00000000,0x00000000,
  105.     0x08888888,0x00000000,0x00000000,
  106.     0x04444444,0x08888888,0x00000000,
  107.     0x08888888,0x08888888,0x08888888,
  108.     0x10000000,0x08888888,0x00000000,
  109.     0x10000000,0x0CCCCCCC,0x08888888,
  110.     0x18888888,0x08888888,0x04444444,
  111.     0x08888888,0x18888888,0x0CCCCCCC,
  112.     0x18888888,0x10000000,0x08888888,
  113.     0x14444444,0x18888888,0x08888888,
  114.     0x20000000,0x14444444,0x08888888,
  115.     0x10000000,0x20000000,0x0CCCCCCC,
  116.     0x1CCCCCCC,0x18888888,0x10000000,
  117.     0x28888888,0x10000000,0x08888888,
  118.     0x1CCCCCCC,0x20000000,0x10000000,
  119.     0x1CCCCCCC,0x20000000,0x14444444,
  120.     0x2DDDDDDD,0x18888888,0x08888888,
  121.     0x31111111,0x10000000,0x08888888,
  122.     0x2DDDDDDD,0x18888888,0x10000000,
  123.     0x18888888,0x28888888,0x1CCCCCCC,
  124.     0x28888888,0x20000000,0x10000000,
  125.     0x2DDDDDDD,0x24444444,0x10000000,
  126.     0x24444444,0x28888888,0x18888888,
  127.     0x20000000,0x31111111,0x18888888,
  128.     0x39999999,0x18888888,0x08888888,
  129.     0x24444444,0x28888888,0x20000000,
  130.     0x35555555,0x20000000,0x0CCCCCCC,
  131.     0x31111111,0x28888888,0x14444444,
  132.     0x28888888,0x31111111,0x18888888,
  133.     0x39999999,0x20000000,0x10000000,
  134.     0x41111111,0x18888888,0x0CCCCCCC,
  135.     0x39999999,0x28888888,0x10000000,
  136.     0x31111111,0x31111111,0x18888888,
  137.     0x39999999,0x2DDDDDDD,0x18888888,
  138.     0x35555555,0x31111111,0x20000000,
  139.     0x49999999,0x18888888,0x0CCCCCCC,
  140.     0x45555555,0x20000000,0x10000000,
  141.     0x41111111,0x28888888,0x10000000,
  142.     0x31111111,0x31111111,0x28888888,
  143.     0x35555555,0x39999999,0x1CCCCCCC,
  144.     0x41111111,0x31111111,0x18888888,
  145.     0x39999999,0x39999999,0x24444444,
  146.     0x51111111,0x18888888,0x0CCCCCCC,
  147.     0x51111111,0x20000000,0x10000000,
  148.     0x4DDDDDDD,0x28888888,0x10000000,
  149.     0x4DDDDDDD,0x2DDDDDDD,0x18888888,
  150.     0x45555555,0x35555555,0x1CCCCCCC,
  151.     0x41111111,0x39999999,0x24444444,
  152.     0x59999999,0x18888888,0x0CCCCCCC,
  153.     0x41111111,0x39999999,0x28888888,
  154.     0x49999999,0x39999999,0x18888888,
  155.     0x39999999,0x41111111,0x28888888,
  156.     0x59999999,0x20000000,0x10000000,
  157.     0x51111111,0x31111111,0x14444444,
  158.     0x49999999,0x39999999,0x20000000,
  159.     0x59999999,0x28888888,0x14444444,
  160.     0x51111111,0x39999999,0x18888888,
  161.     0x41111111,0x41111111,0x2DDDDDDD,
  162.     0x51111111,0x3DDDDDDD,0x20000000,
  163.     0x59999999,0x31111111,0x14444444,
  164.     0x51111111,0x39999999,0x2DDDDDDD,
  165.     0x61111111,0x28888888,0x10000000,
  166.     0x65555555,0x20000000,0x10000000,
  167.     0x51111111,0x41111111,0x24444444,
  168.     0x41111111,0x45555555,0x39999999,
  169.     0x4DDDDDDD,0x45555555,0x31111111,
  170.     0x59999999,0x39999999,0x20000000,
  171.     0x61111111,0x31111111,0x18888888,
  172.     0x5DDDDDDD,0x39999999,0x18888888,
  173.     0x51111111,0x41111111,0x31111111,
  174.     0x5DDDDDDD,0x3DDDDDDD,0x20000000,
  175.     0x6DDDDDDD,0x28888888,0x14444444,
  176.     0x4DDDDDDD,0x49999999,0x31111111,
  177.     0x59999999,0x41111111,0x28888888,
  178.     0x71111111,0x20000000,0x14444444,
  179.     0x69999999,0x31111111,0x14444444,
  180.     0x59999999,0x41111111,0x31111111,
  181.     0x59999999,0x49999999,0x28888888,
  182.     0x71111111,0x28888888,0x18888888,
  183.     0x61111111,0x41111111,0x24444444,
  184.     0x51111111,0x4DDDDDDD,0x39999999,
  185.     0x71111111,0x31111111,0x18888888,
  186.     0x6DDDDDDD,0x39999999,0x18888888,
  187.     0x59999999,0x49999999,0x35555555,
  188.     0x79999999,0x20000000,0x14444444,
  189.     0x65555555,0x49999999,0x24444444,
  190.     0x6DDDDDDD,0x39999999,0x20000000,
  191.     0x79999999,0x28888888,0x14444444,
  192.     0x61111111,0x49999999,0x31111111,
  193.     0x71111111,0x41111111,0x18888888,
  194.     0x51111111,0x51111111,0x45555555,
  195.     0x79999999,0x31111111,0x10000000,
  196.     0x79999999,0x31111111,0x18888888,
  197.     0x59999999,0x51111111,0x3DDDDDDD,
  198.     0x71111111,0x41111111,0x24444444,
  199.     0x69999999,0x49999999,0x28888888,
  200.     0x51111111,0x59999999,0x3DDDDDDD,
  201.     0x79999999,0x39999999,0x1CCCCCCC,
  202.     0x61111111,0x4DDDDDDD,0x39999999,
  203.     0x69999999,0x4DDDDDDD,0x31111111,
  204.     0x86666666,0x28888888,0x18888888,
  205.     0x79999999,0x41111111,0x20000000,
  206.     0x75555555,0x49999999,0x28888888,
  207.     0x86666666,0x31111111,0x18888888,
  208.     0x86666666,0x2DDDDDDD,0x20000000,
  209.     0x65555555,0x51111111,0x3DDDDDDD,
  210.     0x5DDDDDDD,0x59999999,0x45555555,
  211.     0x82222222,0x39999999,0x18888888,
  212.     0x82222222,0x39999999,0x28888888,
  213.     0x79999999,0x4DDDDDDD,0x28888888,
  214.     0x71111111,0x51111111,0x31111111,
  215.     0x65555555,0x59999999,0x3DDDDDDD,
  216.     0x69999999,0x51111111,0x45555555,
  217.     0x82222222,0x41111111,0x20000000,
  218.     0x8EEEEEEE,0x31111111,0x1CCCCCCC,
  219.     0x7DDDDDDD,0x51111111,0x28888888,
  220.     0x69999999,0x59999999,0x45555555,
  221.     0x5DDDDDDD,0x59999999,0x51111111,
  222.     0x8EEEEEEE,0x39999999,0x1CCCCCCC,
  223.     0x75555555,0x51111111,0x35555555,
  224.     0x82222222,0x49999999,0x24444444,
  225.     0x75555555,0x59999999,0x31111111,
  226.     0x8AAAAAAA,0x41111111,0x20000000,
  227.     0x8EEEEEEE,0x39999999,0x28888888,
  228.     0x75555555,0x59999999,0x35555555,
  229.     0x75555555,0x51111111,0x41111111,
  230.     0x61111111,0x61111111,0x4DDDDDDD,
  231.     0x6DDDDDDD,0x59999999,0x49999999,
  232.     0x86666666,0x51111111,0x2DDDDDDD,
  233.     0x75555555,0x59999999,0x3DDDDDDD,
  234.     0x96666666,0x3DDDDDDD,0x1CCCCCCC,
  235.     0x8EEEEEEE,0x49999999,0x20000000,
  236.     0x92222222,0x3DDDDDDD,0x28888888,
  237.     0x8EEEEEEE,0x49999999,0x28888888,
  238.     0x8AAAAAAA,0x51111111,0x20000000,
  239.     0x96666666,0x41111111,0x20000000,
  240.     0x69999999,0x61111111,0x4DDDDDDD,
  241.     0x86666666,0x59999999,0x35555555,
  242.     0x92222222,0x49999999,0x20000000,
  243.     0x79999999,0x61111111,0x41111111,
  244.     0x92222222,0x51111111,0x24444444,
  245.     0x79999999,0x61111111,0x49999999,
  246.     0x8EEEEEEE,0x59999999,0x28888888,
  247.     0x71111111,0x61111111,0x51111111,
  248.     0x92222222,0x51111111,0x28888888,
  249.     0x9AAAAAAA,0x49999999,0x24444444,
  250.     0x86666666,0x61111111,0x35555555,
  251.     0x92222222,0x59999999,0x2DDDDDDD,
  252.     0x75555555,0x69999999,0x51111111,
  253.     0x86666666,0x61111111,0x45555555,
  254.     0x92222222,0x59999999,0x35555555,
  255.     0x79999999,0x61111111,0x55555555,
  256.     0x8AAAAAAA,0x61111111,0x39999999,
  257.     0x9EEEEEEE,0x51111111,0x20000000,
  258.     0x71111111,0x69999999,0x59999999,
  259.     0x9EEEEEEE,0x49999999,0x2DDDDDDD,
  260.     0x9EEEEEEE,0x51111111,0x28888888,
  261.     0x8AAAAAAA,0x65555555,0x41111111,
  262.     0x7DDDDDDD,0x65555555,0x51111111,
  263.     0x96666666,0x59999999,0x39999999,
  264.     0x96666666,0x61111111,0x2DDDDDDD,
  265.     0x9EEEEEEE,0x59999999,0x28888888,
  266.     0x79999999,0x69999999,0x59999999,
  267.     0x8AAAAAAA,0x69999999,0x45555555,
  268.     0x82222222,0x69999999,0x51111111,
  269.     0x79999999,0x69999999,0x61111111,
  270.     0x9EEEEEEE,0x61111111,0x2DDDDDDD,
  271.     0x9AAAAAAA,0x69999999,0x2DDDDDDD,
  272.     0x8AAAAAAA,0x69999999,0x4DDDDDDD,
  273.     0x82222222,0x69999999,0x59999999,
  274.     0x9AAAAAAA,0x69999999,0x35555555,
  275.     0x9EEEEEEE,0x69999999,0x31111111,
  276.     0x9AAAAAAA,0x69999999,0x3DDDDDDD,
  277.     0x75555555,0x71111111,0x69999999,
  278.     0x8AAAAAAA,0x71111111,0x51111111,
  279.     0x8EEEEEEE,0x69999999,0x59999999,
  280.     0x9AAAAAAA,0x71111111,0x31111111,
  281.     0x86666666,0x71111111,0x61111111,
  282.     0x9AAAAAAA,0x69999999,0x45555555,
  283.     0xA6666666,0x6DDDDDDD,0x28888888,
  284.     0x9EEEEEEE,0x71111111,0x39999999,
  285.     0x8EEEEEEE,0x71111111,0x59999999,
  286.     0x9AAAAAAA,0x71111111,0x45555555,
  287.     0x82222222,0x79999999,0x65555555,
  288.     0xA2222222,0x75555555,0x31111111,
  289.     0x8EEEEEEE,0x71111111,0x5DDDDDDD,
  290.     0x9AAAAAAA,0x71111111,0x4DDDDDDD,
  291.     0xA2222222,0x75555555,0x39999999,
  292.     0x9EEEEEEE,0x79999999,0x3DDDDDDD,
  293.     0x82222222,0x79999999,0x6DDDDDDD,
  294.     0x8AAAAAAA,0x79999999,0x65555555,
  295.     0x9AAAAAAA,0x79999999,0x49999999,
  296.     0x9AAAAAAA,0x79999999,0x51111111,
  297.     0x96666666,0x79999999,0x59999999,
  298.     0xA6666666,0x79999999,0x3DDDDDDD,
  299.     0x8EEEEEEE,0x79999999,0x6DDDDDDD,
  300.     0x96666666,0x79999999,0x61111111,
  301.     0x92222222,0x86666666,0x5DDDDDDD,
  302.     0xA2222222,0x82222222,0x49999999,
  303.     0xA6666666,0x79999999,0x4DDDDDDD,
  304.     0x96666666,0x79999999,0x6DDDDDDD,
  305.     0xA6666666,0x86666666,0x41111111,
  306.     0x92222222,0x82222222,0x69999999,
  307.     0x9EEEEEEE,0x82222222,0x59999999,
  308.     0xA6666666,0x86666666,0x49999999,
  309.     0xA2222222,0x86666666,0x51111111,
  310.     0x92222222,0x82222222,0x6DDDDDDD,
  311.     0xAAAAAAAA,0x8AAAAAAA,0x41111111,
  312.     0x9EEEEEEE,0x86666666,0x5DDDDDDD,
  313.     0x92222222,0x7DDDDDDD,0x79999999,
  314.     0x96666666,0x86666666,0x71111111,
  315.     0xAAAAAAAA,0x8AAAAAAA,0x45555555,
  316.     0x9EEEEEEE,0x86666666,0x69999999,
  317.     0x92222222,0x86666666,0x79999999,
  318.     0xAAAAAAAA,0x8AAAAAAA,0x4DDDDDDD,
  319.     0xA2222222,0x8EEEEEEE,0x59999999,
  320.     0x9EEEEEEE,0x86666666,0x6DDDDDDD,
  321.     0x92222222,0x8EEEEEEE,0x7DDDDDDD,
  322.     0xAAAAAAAA,0x96666666,0x4DDDDDDD,
  323.     0xA2222222,0x8EEEEEEE,0x65555555,
  324.     0x9EEEEEEE,0x8AAAAAAA,0x75555555,
  325.     0xAAAAAAAA,0x92222222,0x59999999,
  326.     0xAAAAAAAA,0x9AAAAAAA,0x51111111,
  327.     0x9EEEEEEE,0x8EEEEEEE,0x79999999,
  328.     0xA6666666,0x92222222,0x69999999,
  329.     0x92222222,0x8EEEEEEE,0x86666666,
  330.     0xA6666666,0x9AAAAAAA,0x61111111,
  331.     0x9EEEEEEE,0x8EEEEEEE,0x7DDDDDDD,
  332.     0xA2222222,0x96666666,0x71111111,
  333.     0xAAAAAAAA,0x9AAAAAAA,0x69999999,
  334.     0x9EEEEEEE,0x92222222,0x86666666,
  335.     0xA6666666,0x96666666,0x7DDDDDDD,
  336.     0xA6666666,0x9EEEEEEE,0x75555555,
  337.     0xAEEEEEEE,0x9EEEEEEE,0x69999999,
  338.     0xAAAAAAAA,0x9EEEEEEE,0x75555555,
  339.     0xA2222222,0x9AAAAAAA,0x8AAAAAAA,
  340.     0xAAAAAAAA,0xA6666666,0x75555555,
  341.     0xB2222222,0xA6666666,0x69999999,
  342.     0xAAAAAAAA,0x9AAAAAAA,0x8AAAAAAA,
  343.     0xB2222222,0xA6666666,0x75555555,
  344.     0xAAAAAAAA,0xA6666666,0x82222222,
  345.     0xA2222222,0x9EEEEEEE,0x96666666,
  346.     0xAEEEEEEE,0x9EEEEEEE,0x8EEEEEEE,
  347.     0xAAAAAAAA,0xA6666666,0x8AAAAAAA,
  348.     0xAAAAAAAA,0xA6666666,0x96666666,
  349.     0xA2222222,0xAEEEEEEE,0xA6666666,
  350.     0xAEEEEEEE,0xAEEEEEEE,0x9AAAAAAA,
  351.     0xB6666666,0xAAAAAAAA,0x96666666,
  352.     0xAEEEEEEE,0xAEEEEEEE,0xA6666666,
  353.     0xB6666666,0xB2222222,0x9EEEEEEE,
  354.     0xB2222222,0xB2222222,0xA6666666,
  355.     0xAEEEEEEE,0xB6666666,0xAEEEEEEE,
  356.     0xB2222222,0xBEEEEEEE,0xAEEEEEEE,
  357.     0xB2222222,0xBEEEEEEE,0xB2222222,
  358.     0xB6666666,0xC6666666,0xB6666666,
  359.     0xBAAAAAAA,0xC6666666,0xBEEEEEEE,
  360.     0x00000000
  361. };
  362. #endif
  363.  
  364. #define NPOLY   ((sizeof(polydata)/sizeof(Triangle3D)))
  365.  
  366.  
  367. struct  IntuitionBase   *IntuitionBase = NULL;
  368. struct  GfxBase         *GfxBase = NULL;
  369. struct  Library         *CyberGfxBase = NULL;
  370. struct  Library         *CGX3DVirginBase=0;
  371. struct  Library         *LowLevelBase=0;
  372. View3D          v3d=0;
  373. TexHandle       th=0;
  374. UBYTE           BufNum=0;
  375. APTR            TexelMap=0;
  376.  
  377.  
  378.  
  379. void    main(int argc,char *argv[])
  380. {
  381.         float wz=0.0,wx=0.0,wy=0.0;
  382.         int    gz = 2000;
  383.         struct  ExecBase *ExecBase=(struct ExecBase *)*((ULONG *)4L);
  384.         struct MsgPort *eventmp;
  385.         BOOL Update=FALSE;
  386.         struct IntuiMessage *msg = NULL;
  387.  
  388. #ifdef _M68881
  389.         if(!(ExecBase->AttnFlags & AFF_68881))
  390.         {
  391.          printf("You need at least a 68881 floating point unit !\n");
  392.          return;
  393.         }
  394. #endif
  395.  
  396.     if (!(IntuitionBase=(struct IntuitionBase *)OpenLibrary("intuition.library",39L)))
  397.         { printf ("ERROR: Couldn't open intuition.library\n"); CloseAll(); }
  398.  
  399.       if (!(GfxBase=(struct GfxBase *)OpenLibrary("graphics.library",39L)))
  400.         { printf ("ERROR: Couldn't open graphics.library\n"); CloseAll(); }
  401.  
  402.  
  403.       if (!(CyberGfxBase=(struct Library *)OpenLibrary("cybergraphics.library",41L)))
  404.         { printf ("ERROR: Couldn't open cybergraphics.library\n"); CloseAll(); }
  405.  
  406.  
  407.     if (!(CGX3DVirginBase=(struct Library *)OpenLibrary("cgx3dvirgin.library",2L)))
  408.         { printf ("ERROR: Couldn't open cgx3dvirgin.library v2\n"); CloseAll(); }
  409.  
  410.         if(LowLevelBase = OpenLibrary("lowlevel.library",40L))
  411.         {
  412.          SetJoyPortAttrs(1L,
  413.                           SJA_Type, SJA_TYPE_GAMECTLR,
  414.                           TAG_DONE);
  415.         }
  416.  
  417. #ifndef DEMO4
  418.         if(TexelMap = AllocVec(TEXMAPSIZE,MEMF_CLEAR))
  419.         {
  420.          BPTR fh;
  421.          ULONG i;
  422.  
  423.      if(fh=Open(TEXMAPNAME,MODE_OLDFILE))
  424.       {
  425.       Read(fh,TexelMap,TEXMAPSIZE);
  426.       Close(fh);
  427.      }
  428.          else
  429.          {
  430.           printf("Unable to load texture datafile !\n");
  431.           CloseAll();
  432.          }
  433.  
  434.     for (i=0;i<NPOLY;i++)
  435.     {
  436.          polydata[i].p1.u *= 2;
  437.          polydata[i].p2.u *= 2;
  438.          polydata[i].p3.u *= 2;
  439. #ifdef DEMO1
  440.          polydata[i].p1.v *= 2;
  441.          polydata[i].p2.v *= 2;
  442.          polydata[i].p3.v *= 2;
  443. #else
  444.          polydata[i].p1.v *= 4;
  445.          polydata[i].p2.v *= 4;
  446.          polydata[i].p3.v *= 4;
  447. #endif
  448.         }
  449.  
  450.         }
  451. #endif
  452.  
  453.  
  454.         if(!(v3d=V3D_OpenViewTags(DISPLAYWIDTH,
  455.                                   DISPLAYHEIGHT,
  456. #ifdef LUTMODE
  457.                                   8,
  458.                                   V3DVA_Colors32,     PaletteRGB32,
  459. #else
  460.                                   15,
  461. #endif                               
  462.  
  463. #ifdef DEMO1
  464.                                   V3DVA_UseZBuffer,   TRUE,          // Demo1 needs zbuffering
  465. #else
  466.                                   V3DVA_UseZBuffer,   FALSE,
  467. #endif
  468.                                   TAG_DONE)))
  469.         {
  470.          printf("Unable to open a 3D view !\n");
  471.          CloseAll();
  472.         }
  473.  
  474.  
  475.         if(!(eventmp=V3D_CreateEventPort(v3d,IDCMP_RAWKEY|IDCMP_INTUITICKS)))
  476.         {
  477.          printf("Unable to create event port for idcmp messages !\n");
  478.          CloseAll();
  479.         }
  480.  
  481. #ifndef DEMO4
  482.         if(!(th=V3D_CreateTexHandleTags(v3d,
  483.                                         V3DTHA_TexelMap,     TexelMap,
  484.                                         V3DTHA_MapSize,      128,
  485. #ifdef LUTMODE
  486.                                         V3DTHA_TexClrFmt,    TEXFMT_LUT8,
  487.                                         V3DTHA_FilterMode,   FLTRMD_1TPP,
  488. #else
  489.                                         V3DTHA_TexClrFmt,    TEXFMT_ARGB8888,
  490.                                         V3DTHA_FilterMode,   FLTRMD_1TPP,
  491. #endif
  492.                                         V3DTHA_TexWrap,      TRUE,
  493. #ifdef DEMO3
  494.                                         V3DTHA_LitTexture,   TRUE,
  495. #else
  496.                                         V3DTHA_LitTexture,   FALSE,
  497. #endif
  498.                                         TAG_DONE)))
  499.         {
  500.          printf("Unable to create texture handle !\n");
  501.          CloseAll();
  502.         }
  503. #endif
  504.                          
  505.     LocalWorld(polydata,NPOLY,wx,wy,wz,gz);
  506.  
  507.     while(1)
  508.     {
  509. //         Wait(1L<<eventmp->mp_SigBit);
  510.  
  511.                      if(LowLevelBase)
  512.                       {
  513.                        ULONG state;
  514.  
  515.                        state=ReadJoyPort(1L);
  516.  
  517.                        if(state & JP_TYPE_GAMECTLR)
  518.                         {
  519.                          if(state & (JP_BUTTON_MASK|JP_DIRECTION_MASK))
  520.                          {
  521.  
  522.                          if(state & JPF_JOY_UP)
  523.                          {
  524.                           wx+= ADDING;
  525.                           Update = TRUE;
  526.                          }
  527.  
  528.                          if(state & JPF_JOY_DOWN)
  529.                          {
  530.                           wx-= ADDING;
  531.                           Update = TRUE;
  532.                          }
  533.  
  534.                          if(state & JPF_JOY_LEFT)
  535.                          {
  536.                           wy-= ADDING;
  537.                           Update = TRUE;
  538.                          }
  539.  
  540.                          if(state & JPF_JOY_RIGHT)
  541.                          {
  542.                           wy+= ADDING;
  543.                           Update = TRUE;
  544.                          }
  545.  
  546.                          if(state & JPF_BUTTON_FORWARD)
  547.                          {
  548.                           if( gz > 600)
  549.                           { gz-= 50;
  550.                             Update = TRUE;
  551.                           }
  552.                          }
  553.  
  554.                          if(state & JPF_BUTTON_REVERSE)
  555.                          {
  556.                           gz+= 50;
  557.                           Update = TRUE;
  558.                          }
  559.  
  560.  
  561.                          if(state & JPF_BUTTON_GREEN)
  562.                          {
  563.                           wz+= ADDING;
  564.                           Update = TRUE;
  565.                          }
  566.  
  567.                          if(state & JPF_BUTTON_YELLOW)
  568.                          {
  569.                           wz-= ADDING;
  570.                           Update = TRUE;
  571.                          }
  572.                          }
  573.                         }
  574.                         
  575.                       }
  576.  
  577.             while(msg=(struct IntuiMessage *)GetMsg(eventmp))
  578.             {
  579.              switch(msg->Class)
  580.              {
  581.                 case IDCMP_INTUITICKS:
  582.                      {
  583.                      }
  584.                      break;
  585.                 case IDCMP_RAWKEY:
  586.                      {
  587.                         int Code=msg->Code;
  588.  
  589.                         if(!(Code & 0x80))
  590.                         {
  591.                          Code&=0x7f;
  592.                        switch(Code)
  593.                        {
  594.                          case Up   : wx+= ADDING; Update=TRUE; break;
  595.                          case Down : wx-= ADDING; Update=TRUE; break;
  596.                          case Right: wy+= ADDING; Update=TRUE; break;
  597.                          case Left : wy-= ADDING; Update=TRUE; break;
  598.                          case AUp   : wx+= ADDING; Update=TRUE; break;
  599.                          case ADown : wx-= ADDING; Update=TRUE; break;
  600.                          case ARight: wy+= ADDING; Update=TRUE; break;
  601.                          case ALeft : wy-= ADDING; Update=TRUE; break;
  602.                          case AAxUp   : wz+= ADDING; Update=TRUE; break;
  603.                          case AAxDown : wz-= ADDING; Update=TRUE; break;
  604.                          case Plus   : if( gz > 200)
  605.                                         { gz-= 50; Update=TRUE; }
  606.                                        break;
  607.                          case Minus  : gz+= 50; Update=TRUE; break;
  608.         
  609.                          case esc:   CloseAll();
  610.                        }
  611.                      }
  612.                      break;
  613.              };
  614.  
  615.              }
  616.                ReplyMsg((struct Message *)msg);
  617.  
  618.     }
  619.          if(Update==TRUE) LocalWorld(polydata,NPOLY,wx,wy,wz,gz);
  620.          Update=FALSE;
  621.         }
  622.  
  623.     CloseAll();
  624. }
  625.  
  626.  
  627. /***********************************************************************************\
  628. *                                                                                                                *
  629. *        CloseAll                                                                                                *
  630. *                                                                                                                *
  631. \***********************************************************************************/
  632.  
  633. void CloseAll()
  634. {
  635.         if(th)  V3D_DeleteTexHandle(th);
  636.         if(TexelMap) FreeVec(TexelMap);
  637.         if(v3d) V3D_CloseView(v3d);
  638.     if (IntuitionBase) CloseLibrary ((struct Library *)IntuitionBase);
  639.     if (GfxBase) CloseLibrary ((struct Library *)GfxBase);
  640.     if (CGX3DVirginBase) CloseLibrary ((struct Library *)CGX3DVirginBase);
  641.     if (CyberGfxBase) CloseLibrary ((struct Library *)CyberGfxBase);
  642.         if (LowLevelBase) CloseLibrary ((struct Library *)LowLevelBase);
  643.     exit(0);
  644. }
  645.  
  646.  
  647. /* Most important function AT ALL ;) */
  648.  
  649. /* Returns TRUE if line was clipped, elsewhere returns false */
  650.  
  651. BOOL LeftClipping(long *xs, long *ys, long *xe, long *ye, long *us, long *vs, long *ue, long *ve)
  652. {
  653.     LONG     adding;
  654.     if(*xs<0) {
  655.         if(*xe>0) {
  656.             if(*xe-*xs) {
  657.                 adding = ((*ue-*us)<<20) / (*xe-*xs);
  658.                 *us += (-*xs * adding)>>20;
  659.  
  660.                 adding = ((*ve-*vs)<<20) / (*xe-*xs);
  661.                 *vs += (-*xs * adding)>>20;
  662.  
  663.  
  664.                 adding = ((*ye-*ys)<<20) / (*xe-*xs);
  665.                 *ys += (-*xs * adding)>>20;
  666.  
  667.                 *xs = 0;
  668.             }
  669.  
  670.             return(TRUE);
  671.         } else {
  672.             return(FALSE);
  673.         }
  674.     }
  675. }
  676.  
  677.  
  678. /* Whole wizardry ;) */
  679.  
  680. long V3D_DrawClippedTriangle3D(View3D v3d,
  681.                          Triangle3D *t3d,
  682.                          ULONG blendmd)
  683. {
  684.     long hx,hy,hu,hv;
  685.     if((t3d->p1.x<0) && (t3d->p2.x<0) && (t3d->p3.x>=0)) {
  686.         LeftClipping(&t3d->p1.x, &t3d->p1.y, &t3d->p3.x, &t3d->p3.y, &t3d->p1.u, &t3d->p1.v, &t3d->p3.u, &t3d->p3.v);
  687.         LeftClipping(&t3d->p2.x, &t3d->p2.y, &t3d->p3.x, &t3d->p3.y, &t3d->p2.u, &t3d->p2.v, &t3d->p3.u, &t3d->p3.v);
  688.         V3D_DrawTriangle3D(v3d, t3d, blendmd);
  689.         return(0);
  690.     }
  691.  
  692.     if((t3d->p2.x<0) && (t3d->p3.x<0) && (t3d->p1.x>=0)) {
  693.         LeftClipping(&t3d->p2.x, &t3d->p2.y, &t3d->p1.x, &t3d->p1.y, &t3d->p2.u, &t3d->p2.v, &t3d->p1.u, &t3d->p1.v);
  694.         LeftClipping(&t3d->p3.x, &t3d->p3.y, &t3d->p1.x, &t3d->p1.y, &t3d->p3.u, &t3d->p3.v, &t3d->p1.u, &t3d->p1.v);
  695.         V3D_DrawTriangle3D(v3d, t3d, blendmd);
  696.         return(0);
  697.     }
  698.  
  699.     if((t3d->p1.x<0) && (t3d->p3.x<0) && (t3d->p2.x>=0)) {
  700.         LeftClipping(&t3d->p1.x, &t3d->p1.y, &t3d->p2.x, &t3d->p2.y, &t3d->p1.u, &t3d->p1.v, &t3d->p2.u, &t3d->p2.v);
  701.         LeftClipping(&t3d->p3.x, &t3d->p3.y, &t3d->p2.x, &t3d->p2.y, &t3d->p3.u, &t3d->p3.v, &t3d->p2.u, &t3d->p2.v);
  702.         V3D_DrawTriangle3D(v3d, t3d, blendmd);
  703.         return(0);
  704.     }
  705.  
  706.     if((t3d->p1.x>=0) && (t3d->p3.x>=0) && (t3d->p2.x>=0)) {
  707.         V3D_DrawTriangle3D(v3d, t3d, blendmd);
  708.         return(0);
  709.     }
  710.  
  711.  
  712.     if((t3d->p1.x<0) && (t3d->p2.x>=0) && (t3d->p3.x>=0)) {
  713.         hx = t3d->p1.x;
  714.         hy = t3d->p1.y;
  715.         hu = t3d->p1.u;
  716.         hv = t3d->p1.v;
  717.  
  718.         LeftClipping(&t3d->p1.x, &t3d->p1.y, &t3d->p2.x, &t3d->p2.y, &t3d->p1.u, &t3d->p1.v, &t3d->p2.u, &t3d->p2.v);        
  719.         V3D_DrawTriangle3D(v3d, t3d, blendmd);
  720.  
  721.         t3d->p2.x = hx;
  722.         t3d->p2.y = hy;
  723.         t3d->p2.u = hu;
  724.         t3d->p2.v = hv;
  725.         LeftClipping(&t3d->p2.x, &t3d->p2.y, &t3d->p3.x, &t3d->p3.y, &t3d->p2.u, &t3d->p2.v, &t3d->p3.u, &t3d->p3.v);
  726.         V3D_DrawTriangle3D(v3d, t3d, blendmd);
  727.  
  728.         return(0);
  729.     }
  730.  
  731.     if((t3d->p1.x>=0) && (t3d->p2.x<0) && (t3d->p3.x>=0)) {
  732.         hx = t3d->p2.x;
  733.         hy = t3d->p2.y;
  734.         hu = t3d->p2.u;
  735.         hv = t3d->p2.v;
  736.  
  737.         LeftClipping(&t3d->p2.x, &t3d->p2.y, &t3d->p1.x, &t3d->p1.y, &t3d->p2.u, &t3d->p2.v, &t3d->p1.u, &t3d->p1.v);        
  738.         V3D_DrawTriangle3D(v3d, t3d, blendmd);
  739.  
  740.         t3d->p1.x = hx;
  741.         t3d->p1.y = hy;
  742.         t3d->p1.u = hu;
  743.         t3d->p1.v = hv;
  744.         LeftClipping(&t3d->p1.x, &t3d->p1.y, &t3d->p3.x, &t3d->p3.y, &t3d->p1.u, &t3d->p1.v, &t3d->p3.u, &t3d->p3.v);
  745.         V3D_DrawTriangle3D(v3d, t3d, blendmd);
  746.  
  747.         return(0);
  748.     }
  749.  
  750.     if((t3d->p1.x>=0) && (t3d->p2.x>=0) && (t3d->p3.x<0)) {
  751.         hx = t3d->p3.x;
  752.         hy = t3d->p3.y;
  753.         hu = t3d->p3.u;
  754.         hv = t3d->p3.v;
  755.  
  756.         LeftClipping(&t3d->p3.x, &t3d->p3.y, &t3d->p1.x, &t3d->p1.y, &t3d->p3.u, &t3d->p3.v, &t3d->p1.u, &t3d->p1.v);        
  757.         V3D_DrawTriangle3D(v3d, t3d, blendmd);
  758.  
  759.         t3d->p1.x = hx;
  760.         t3d->p1.y = hy;
  761.         t3d->p1.u = hu;
  762.         t3d->p1.v = hv;
  763.         LeftClipping(&t3d->p1.x, &t3d->p1.y, &t3d->p2.x, &t3d->p2.y, &t3d->p1.u, &t3d->p1.v, &t3d->p2.u, &t3d->p2.v);
  764.         V3D_DrawTriangle3D(v3d, t3d, blendmd);
  765.  
  766.         return(0);
  767.     }
  768. }
  769.  
  770.  
  771. void LocalWorld(Triangle3D in[],int cnt,float wx,float wy,float wz,int z)
  772. {
  773.         int        i;
  774.         float        cosx,sinx,cosy,siny,cosz,sinz;
  775.         Triangle3D    zws1,zws2,zws3;
  776.  
  777.     cosx = cos(wx);
  778.     sinx = sin(wx);
  779.  
  780.     cosy = cos(wy);
  781.     siny = sin(wy);
  782.  
  783.     cosz = cos(wz);
  784.     sinz = sin(wz);
  785.  
  786.         if(V3D_LockView(v3d))
  787.         {
  788.  
  789.          V3D_ClearBuffer(v3d,BufNum);
  790.  
  791. #ifdef DEMO1
  792.          V3D_ClearZBuffer(v3d);
  793. #endif
  794.  
  795.      for (i=0;i<cnt;i++)                /* Index of In  Poligons */
  796.      {
  797.         /* rotate in Y  */
  798.  
  799.         zws1.p1.x    =    cosy*in[i].p1.x-siny*in[i].p1.z;
  800.         zws1.p2.x    =    cosy*in[i].p2.x-siny*in[i].p2.z;
  801.         zws1.p3.x    =    cosy*in[i].p3.x-siny*in[i].p3.z;
  802.  
  803.         zws1.p1.y    =    in[i].p1.y;
  804.         zws1.p2.y    =    in[i].p2.y;
  805.         zws1.p3.y    =    in[i].p3.y;
  806.  
  807.         zws1.p1.z    =    siny*in[i].p1.x+cosy*in[i].p1.z;
  808.         zws1.p2.z    =    siny*in[i].p2.x+cosy*in[i].p2.z;
  809.         zws1.p3.z    =    siny*in[i].p3.x+cosy*in[i].p3.z;
  810.  
  811.  
  812.         /* rotate in X  */
  813.  
  814.         zws2.p1.x    =    zws1.p1.x;
  815.         zws2.p2.x    =    zws1.p2.x;
  816.         zws2.p3.x    =    zws1.p3.x;
  817.  
  818.         zws2.p1.y    =    cosx*zws1.p1.y+sinx*zws1.p1.z;
  819.         zws2.p2.y    =    cosx*zws1.p2.y+sinx*zws1.p2.z;
  820.         zws2.p3.y    =    cosx*zws1.p3.y+sinx*zws1.p3.z;
  821.  
  822.         zws2.p1.z    =    -sinx*zws1.p1.y+cosx*zws1.p1.z;
  823.         zws2.p2.z    =    -sinx*zws1.p2.y+cosx*zws1.p2.z;
  824.         zws2.p3.z    =    -sinx*zws1.p3.y+cosx*zws1.p3.z;
  825.  
  826.  
  827.         /* rotate in Z  */
  828.  
  829.         zws1.p1.x    =    cosz*zws2.p1.x+sinz*zws2.p1.y;
  830.         zws1.p2.x    =    cosz*zws2.p2.x+sinz*zws2.p2.y;
  831.         zws1.p3.x    =    cosz*zws2.p3.x+sinz*zws2.p3.y;
  832.  
  833.         zws1.p1.y    =    -sinz*zws2.p1.x+cosz*zws2.p1.y;
  834.         zws1.p2.y    =    -sinz*zws2.p2.x+cosz*zws2.p2.y;
  835.         zws1.p3.y    =    -sinz*zws2.p3.x+cosz*zws2.p3.y;
  836.  
  837.         zws1.p1.z    =    zws2.p1.z;
  838.         zws1.p2.z    =    zws2.p2.z;
  839.         zws1.p3.z    =    zws2.p3.z;
  840.  
  841.  
  842.         /* move */
  843.  
  844.         zws3.p1.z    =    zws1.p1.z + z ;
  845.         zws3.p2.z    =    zws1.p2.z + z ;
  846.         zws3.p3.z    =    zws1.p3.z + z ;
  847.  
  848.         zws3.p1.x    =    ((zws1.p1.x*FOCUS)/(zws3.p1.z*1.0)+.5) + WINX/2;
  849.         zws3.p2.x    =    ((zws1.p2.x*FOCUS)/(zws3.p2.z*1.0)+.5) + WINX/2;
  850.         zws3.p3.x    =    ((zws1.p3.x*FOCUS)/(zws3.p3.z*1.0)+.5) + WINX/2;
  851.  
  852.         zws3.p1.y    =    ((zws1.p1.y*FOCUS)/(zws3.p1.z*1.0)+.5) + WINY/2;
  853.         zws3.p2.y    =    ((zws1.p2.y*FOCUS)/(zws3.p2.z*1.0)+.5) + WINY/2;
  854.         zws3.p3.y    =    ((zws1.p3.y*FOCUS)/(zws3.p3.z*1.0)+.5) + WINY/2;
  855.  
  856.  
  857.         zws3.p1.u    =    ((in[i].p1.u*1.0)+.5);
  858.         zws3.p2.u    =    ((in[i].p2.u*1.0)+.5);
  859.         zws3.p3.u    =    ((in[i].p3.u*1.0)+.5);
  860.  
  861.         zws3.p1.v    =    ((in[i].p1.v*1.0)+.5);
  862.         zws3.p2.v    =    ((in[i].p2.v*1.0)+.5);
  863.         zws3.p3.v    =    ((in[i].p3.v*1.0)+.5);
  864.  
  865.                 zws3.p1.color = in[i].p1.color;
  866.                 zws3.p2.color = in[i].p2.color;
  867.                 zws3.p3.color = in[i].p3.color;
  868.  
  869. /* #ifndef DEMO1 */
  870.         //       only draw visible triangle (area normal to viewer)
  871. /* This is needed always ;) */
  872.         if (  ( (zws3.p2.x-zws3.p1.x) * (zws3.p3.y-zws3.p2.y) -
  873.             (zws3.p3.x-zws3.p2.x) * (zws3.p2.y-zws3.p1.y)
  874.                       ) <0)
  875. /* #endif */
  876.         {
  877.                  zws3.th = th;
  878.  
  879.                  V3D_DrawClippedTriangle3D(v3d,
  880.                                     &zws3,
  881. #ifndef DEMO3
  882.                                     BLENDMD_DECAL
  883. #else
  884.                                     BLENDMD_MODULATE
  885. #endif
  886.                                    );
  887.  
  888.          }
  889.      }
  890.  
  891.          V3D_UnLockView(v3d);
  892.         }
  893.         BufNum++;
  894.         BufNum&=1;
  895.  
  896.         V3D_FlipBuffer(v3d,BufNum);
  897. }
  898.  
  899.