/***********************************************************/
/*                     The 3D-MovieMaker                   */
/*                 written by Wolf Dietrich                */
/*              especially for  KICKSTART  11/87           */
/***********************************************************/
#include <exec/types.h>
#include <graphics/gfxmacros.h>
#include <stdio.h>
#include <math.h>
#include <libraries/dos.h>
#include <exec/devices.h>
#include <exec/memory.h>
#include <intuition/intuition.h>
#include <ctype.h>
#include <fcntl.h>
#include <functions.h>

#define CONTINUE      for(;;)
#define MAXPPF        20       /* max. Anzahl Punkte pro Fläche */
#define MAXFL         40       /* max. Anzahl Flächen           */
#define MAXP          200      /* max. Anzahl Punkte            */
#define FAK           50000.0  /* Tiefenprojektionsfaktor       */
#define PI            3.1415926         /* die Ludolfsche Zahl  */

struct IntuitionBase *IntuitionBase;
struct GfxBase *GfxBase;
struct NewScreen graph_screen =
{ 0,0,320,200,4,0,1,NULL,CUSTOMSCREEN,NULL,NULL,NULL,NULL };      
struct Screen     *screen_1, *screen_2;
struct Window     *window_1, *window_2, *cont_wind;
struct RastPort   *rp_1, *rp_2, *rp_3;
struct TmpRas temp_ras;
struct AreaInfo area_info;

SHORT xyc1[] = {0,0,0,10,10,10,10,0,0,0};
SHORT xyc2[] = {-2,-2,-2,9,105,9,105,-2,-2,-2};
SHORT xyc3[] = {0,0,0,11,60,11,60,0,0,0};
SHORT xyc4[] = {0,0,0,11,40,11,40,0,0,0};
UBYTE buff_1[13],buff_2[13],buff_3[13],buff_4[13];

struct Border outline =
{ 0,0,(UBYTE)3,(UBYTE)1,JAM1,5,(SHORT*)xyc1,NULL };
struct Border outline2 =
{ 0,0,(UBYTE)5,(UBYTE)1,JAM1,5,(SHORT*)xyc1,NULL };
struct Border bigline =
{ 0,0,(UBYTE)6,(UBYTE)1,JAM1,5,(SHORT*)xyc2,NULL };
struct Border medline =
{ 0,0,(UBYTE)3,(UBYTE)1,JAM1,5,(SHORT*)xyc3,NULL };
struct Border quitline =
{ 0,0,(UBYTE)2,(UBYTE)1,JAM1,5,(SHORT*)xyc4,NULL };

struct IntuiText r_text8 =
{ (UBYTE)0,(UBYTE)1,JAM1,4,14,NULL,
  (UBYTE *)"wird geloescht!",NULL };
struct IntuiText r_text7 =
{ (UBYTE)0,(UBYTE)1,JAM1,4,4,NULL,
  (UBYTE *)"Aktueller Film",&r_text8 };
struct IntuiText r_text6 =
{ (UBYTE)0,(UBYTE)1,JAM1,4,14,NULL,
  (UBYTE *)"wirklich saven?",NULL };
struct IntuiText r_text5 =
{ (UBYTE)0,(UBYTE)1,JAM1,4,4,NULL,
  (UBYTE *)"  Wollen Sie",&r_text6 };
struct IntuiText r_text4 =
{ (UBYTE)0,(UBYTE)1,JAM1,4,14,NULL,
  (UBYTE *)"nicht oeffnen!",NULL };
struct IntuiText r_text3 =
{ (UBYTE)0,(UBYTE)1,JAM1,4,4,NULL,
  (UBYTE *)"Kann Datenfile",&r_text4 };
struct IntuiText r_text2 =
{ (UBYTE)0,(UBYTE)1,JAM1,21,14,NULL,(UBYTE *)"ist voll!",NULL };
struct IntuiText r_text1 =
{ (UBYTE)0,(UBYTE)1,JAM1,21,4,NULL,
  (UBYTE *)"Filmarray",&r_text2 };
struct IntuiText e_text =
{ (UBYTE)0,(UBYTE)1,JAM1,6,4,NULL,(UBYTE *)"Exit",NULL };
struct IntuiText s_text =
{ (UBYTE)0,(UBYTE)1,JAM1,6,4,NULL,(UBYTE *)"Save",NULL };
struct IntuiText o_text =
{ (UBYTE)0,(UBYTE)1,JAM1,6,4,NULL,(UBYTE *)"Load",NULL };
struct IntuiText n_text =
{ (UBYTE)0,(UBYTE)1,JAM1,6,4,NULL,(UBYTE *)"Nanu?!?",NULL };
struct IntuiText c_text =
{ (UBYTE)0,(UBYTE)1,JAM1,6,4,NULL,(UBYTE *)"So'n Pech",NULL };
struct IntuiText doit_text =
{ (UBYTE)1,(UBYTE)1,JAM1,2,2,NULL,(UBYTE *)" Do it!",NULL };
struct IntuiText load_text1 =
{ (UBYTE)1,(UBYTE)1,JAM1,2,2,NULL,(UBYTE *)"LoadObj",NULL };
struct IntuiText load_text2 =
{ (UBYTE)1,(UBYTE)1,JAM1,2,2,NULL,(UBYTE *)"LoadMov",NULL };
struct IntuiText save_text =
{ (UBYTE)1,(UBYTE)1,JAM1,2,2,NULL,(UBYTE *)"SaveMov",NULL };
struct IntuiText show_text =
{ (UBYTE)1,(UBYTE)1,JAM1,2,2,NULL,(UBYTE *)"ShowMov",NULL };
struct IntuiText quit_text =
{ (UBYTE)1,(UBYTE)1,JAM1,4,2,NULL,(UBYTE *)"Quit",NULL };
struct IntuiText reset_text3 =
{ (UBYTE)1,(UBYTE)1,JAM1,6,2,NULL,(UBYTE *)"RstInp",NULL };
struct IntuiText reset_text2 =
{ (UBYTE)1,(UBYTE)1,JAM1,6,2,NULL,(UBYTE *)"RstVal",NULL };
struct IntuiText reset_text1 =
{ (UBYTE)1,(UBYTE)1,JAM1,6,2,NULL,(UBYTE *)"RstMov",NULL };
struct IntuiText delete_text =
{ (UBYTE)1,(UBYTE)1,JAM1,6,2,NULL,(UBYTE *)"DelSeq",NULL };
struct IntuiText minus_text =
{ (UBYTE)1,(UBYTE)1,JAM1,2,2,NULL,(UBYTE *)"-",NULL };
struct IntuiText plus_text =
{ (UBYTE)1,(UBYTE)1,JAM1,2,2,NULL,(UBYTE *)"+",NULL };

struct StringInfo inp_str1 =
 { (UBYTE *)&buff_1,(UBYTE *)&buff_2,0,13,0,
   NULL,NULL,NULL,NULL,NULL,NULL,NULL };
struct StringInfo inp_str2 =
 { (UBYTE *)&buff_3,(UBYTE *)&buff_4,0,13,0,
   NULL,NULL,NULL,NULL,NULL,NULL,NULL };

struct Gadget read_gad2 =
 { NULL,78,187,105,9,GADGHCOMP,
   RELVERIFY|GADGIMMEDIATE,STRGADGET,(APTR)&bigline,
   NULL,NULL,0,(APTR)&inp_str2,NULL,NULL };
struct Gadget read_gad1 =
 { &read_gad2,78,172,105,9,GADGHCOMP,
   RELVERIFY|GADGIMMEDIATE,STRGADGET,(APTR)&bigline,
   NULL,NULL,0,(APTR)&inp_str1,NULL,NULL };
struct Gadget delete_gad =
 { &read_gad1,190,50,61,12,GADGHCOMP,
   RELVERIFY|GADGIMMEDIATE,BOOLGADGET,(APTR)&medline,
   NULL,&delete_text,0,NULL,35,NULL };
struct Gadget reset_gad3 =
 { &delete_gad,190,70,61,12,GADGHCOMP,
   RELVERIFY|GADGIMMEDIATE,BOOLGADGET,(APTR)&medline,
   NULL,&reset_text3,0,NULL,36,NULL };
struct Gadget reset_gad2 =
 { &reset_gad3,190,90,61,12,GADGHCOMP,
   RELVERIFY|GADGIMMEDIATE,BOOLGADGET,(APTR)&medline,
   NULL,&reset_text2,0,NULL,34,NULL };
struct Gadget reset_gad1 =
 { &reset_gad2,190,110,61,12,GADGHCOMP,
   RELVERIFY|GADGIMMEDIATE,BOOLGADGET,(APTR)&medline,
   NULL,&reset_text1,0,NULL,33,NULL };
struct Gadget super_minus2 =
 { &reset_gad1,162,138,11,11,GADGHCOMP,
   RELVERIFY|GADGIMMEDIATE,BOOLGADGET,(APTR)&outline2,
   NULL,&minus_text,0,NULL,32,NULL };
struct Gadget super_minus1 =
 { &super_minus2,162,126,11,11,GADGHCOMP,
   RELVERIFY|GADGIMMEDIATE,BOOLGADGET,(APTR)&outline2,
   NULL,&minus_text,0,NULL,31,NULL };
struct Gadget super_plus2 =
 { &super_minus1,68,138,11,11,GADGHCOMP,
   RELVERIFY|GADGIMMEDIATE,BOOLGADGET,(APTR)&outline2,
   NULL,&plus_text,0,NULL,30,NULL };
struct Gadget super_plus1 =
 { &super_plus2,68,126,11,11,GADGHCOMP,
   RELVERIFY|GADGIMMEDIATE,BOOLGADGET,(APTR)&outline2,
   NULL,&plus_text,0,NULL,29,NULL };
struct Gadget doit_gad =
 { &super_plus1,90,153,61,12,GADGHCOMP,
   RELVERIFY|GADGIMMEDIATE,BOOLGADGET,(APTR)&medline,
   NULL,&doit_text,0,NULL,28,NULL };
struct Gadget quit_gad =
 { &doit_gad,210,20,41,12,GADGHCOMP,
   RELVERIFY|GADGIMMEDIATE,BOOLGADGET,(APTR)&quitline,
   NULL,&quit_text,0,NULL,27,NULL };
struct Gadget show_gad =
 { &quit_gad,190,130,61,12,GADGHCOMP,
   RELVERIFY|GADGIMMEDIATE,BOOLGADGET,(APTR)&medline,
   NULL,&show_text,0,NULL,26,NULL };
struct Gadget save_gad =
 { &show_gad,190,185,61,12,GADGHCOMP,
   RELVERIFY|GADGIMMEDIATE,BOOLGADGET,(APTR)&medline,
   NULL,&save_text,0,NULL,25,NULL };
struct Gadget load_gad2 =
 { &save_gad,10,185,61,12,GADGHCOMP,
   RELVERIFY|GADGIMMEDIATE,BOOLGADGET,(APTR)&medline,
   NULL,&load_text2,0,NULL,24,NULL };
struct Gadget load_gad1 =
 { &load_gad2,10,170,61,12,GADGHCOMP,
   RELVERIFY|GADGIMMEDIATE,BOOLGADGET,(APTR)&medline,
   NULL,&load_text1,0,NULL,23,NULL };
struct Gadget plus_gad11 =
 { &load_gad1,80,138,11,11,GADGHCOMP,
   RELVERIFY|GADGIMMEDIATE,BOOLGADGET,(APTR)&outline,
   NULL,&plus_text,0,NULL,22,NULL };
struct Gadget plus_gad10 =
 { &plus_gad11,80,126,11,11,GADGHCOMP,
   RELVERIFY|GADGIMMEDIATE,BOOLGADGET,(APTR)&outline,
   NULL,&plus_text,0,NULL,21,NULL };
struct Gadget plus_gad9 =
 { &plus_gad10,80,114,11,11,GADGHCOMP,
   RELVERIFY|GADGIMMEDIATE,BOOLGADGET,(APTR)&outline,
   NULL,&plus_text,0,NULL,20,NULL };
struct Gadget plus_gad8 =
 { &plus_gad9,80,102,11,11,GADGHCOMP,
   RELVERIFY|GADGIMMEDIATE,BOOLGADGET,(APTR)&outline,
   NULL,&plus_text,0,NULL,19,NULL };
struct Gadget plus_gad7 =
 { &plus_gad8,80,90,11,11,GADGHCOMP,
   RELVERIFY|GADGIMMEDIATE,BOOLGADGET,(APTR)&outline,
   NULL,&plus_text,0,NULL,18,NULL };
struct Gadget plus_gad6 =
 { &plus_gad7,80,78,11,11,GADGHCOMP,
   RELVERIFY|GADGIMMEDIATE,BOOLGADGET,(APTR)&outline,
   NULL,&plus_text,0,NULL,17,NULL };
struct Gadget plus_gad5 =
 { &plus_gad6,80,66,11,11,GADGHCOMP,
   RELVERIFY|GADGIMMEDIATE,BOOLGADGET,(APTR)&outline,
   NULL,&plus_text,0,NULL,16,NULL };
struct Gadget plus_gad4 =
 { &plus_gad5,80,54,11,11,GADGHCOMP,
   RELVERIFY|GADGIMMEDIATE,BOOLGADGET,(APTR)&outline,
   NULL,&plus_text,0,NULL,15,NULL };
struct Gadget plus_gad3 =
 { &plus_gad4,80,42,11,11,GADGHCOMP,
   RELVERIFY|GADGIMMEDIATE,BOOLGADGET,(APTR)&outline,
   NULL,&plus_text,0,NULL,14,NULL };
struct Gadget plus_gad2 =
 { &plus_gad3,80,30,11,11,GADGHCOMP,
   RELVERIFY|GADGIMMEDIATE,BOOLGADGET,(APTR)&outline,
   NULL,&plus_text,0,NULL,13,NULL };
struct Gadget plus_gad1 =
 { &plus_gad2,80,18,11,11,GADGHCOMP,
   RELVERIFY|GADGIMMEDIATE,BOOLGADGET,(APTR)&outline,
   NULL,&plus_text,0,NULL,12,NULL };
struct Gadget minus_gad11 =
 { &plus_gad1,150,138,11,11,GADGHCOMP,
   RELVERIFY|GADGIMMEDIATE,BOOLGADGET,(APTR)&outline,
   NULL,&minus_text,0,NULL,11,NULL };
struct Gadget minus_gad10 =
 { &minus_gad11,150,126,11,11,GADGHCOMP,
   RELVERIFY|GADGIMMEDIATE,BOOLGADGET,(APTR)&outline,
   NULL,&minus_text,0,NULL,10,NULL };
struct Gadget minus_gad9 =
 { &minus_gad10,150,114,11,11,GADGHCOMP,
   RELVERIFY|GADGIMMEDIATE,BOOLGADGET,(APTR)&outline,
   NULL,&minus_text,0,NULL,9,NULL };
struct Gadget minus_gad8 =
 { &minus_gad9,150,102,11,11,GADGHCOMP,
   RELVERIFY|GADGIMMEDIATE,BOOLGADGET,(APTR)&outline,
   NULL,&minus_text,0,NULL,8,NULL };
struct Gadget minus_gad7 =
 { &minus_gad8,150,90,11,11,GADGHCOMP,
   RELVERIFY|GADGIMMEDIATE,BOOLGADGET,(APTR)&outline,
   NULL,&minus_text,0,NULL,7,NULL };
struct Gadget minus_gad6 =
 { &minus_gad7,150,78,11,11,GADGHCOMP,
   RELVERIFY|GADGIMMEDIATE,BOOLGADGET,(APTR)&outline,
   NULL,&minus_text,0,NULL,6,NULL };
struct Gadget minus_gad5 =
 { &minus_gad6,150,66,11,11,GADGHCOMP,
   RELVERIFY|GADGIMMEDIATE,BOOLGADGET,(APTR)&outline,
   NULL,&minus_text,0,NULL,5,NULL };
struct Gadget minus_gad4 =
 { &minus_gad5,150,54,11,11,GADGHCOMP,
   RELVERIFY|GADGIMMEDIATE,BOOLGADGET,(APTR)&outline,
   NULL,&minus_text,0,NULL,4,NULL };
struct Gadget minus_gad3 =
 { &minus_gad4,150,42,11,11,GADGHCOMP,
   RELVERIFY|GADGIMMEDIATE,BOOLGADGET,(APTR)&outline,
   NULL,&minus_text,0,NULL,3,NULL };
struct Gadget minus_gad2 =
 { &minus_gad3,150,30,11,11,GADGHCOMP,
   RELVERIFY|GADGIMMEDIATE,BOOLGADGET,(APTR)&outline,
   NULL,&minus_text,0,NULL,2,NULL };
struct Gadget minus_gad1 =
 { &minus_gad2,150,18,11,11, GADGHCOMP,
   RELVERIFY|GADGIMMEDIATE,BOOLGADGET,(APTR)&outline,
   NULL,&minus_text,0,NULL,1,NULL };

struct NewWindow graph_window1 =
 { 0,0,320,200,0,1,MOUSEBUTTONS|GADGETUP,
   SIMPLE_REFRESH|BORDERLESS,NULL,NULL,NULL,
   NULL,NULL,320,200,320,200,CUSTOMSCREEN  };
struct NewWindow graph_window2 =
 { 0,0,320,200,0,1,MOUSEBUTTONS|GADGETUP,
   SIMPLE_REFRESH|BORDERLESS,NULL,NULL,NULL,
   NULL,NULL,320,200,320,200,CUSTOMSCREEN  };
struct NewWindow control_window =
 { 30,0,260,200,1,4,MOUSEBUTTONS|GADGETDOWN|GADGETUP,
   SIMPLE_REFRESH|ACTIVATE|NOCAREREFRESH,&minus_gad1,NULL,
   (UBYTE *)"                  INPUT CONTROL",  
   NULL,NULL,260,200,260,200,CUSTOMSCREEN  };

USHORT farb_lst[]  = {0x000,0xfff,0xf00,0x0f0,0x00f,0x0a2,
0xf0f,0xff0,0xf6b,0x3a9,0x492,0x666,0xbbb,0x07c,0xc40,0x90a};
BYTE *area_plane,control_lst[12000];
char *filename, *zielchar, zielstring[10];
UWORD areabuf[500];
int seq_deleted = TRUE;
int xlst[16384],ylst[16384];
int pkt_zahl = 0,flaech_zahl = 0,zoom = 0;
int xturn,yturn,zturn,xdreher,ydreher,zdreher;
int xturn2,yturn2,zturn2,xdreher2,ydreher2,zdreher2;
int prev_xturn,prev_xturn2,prev_yturn,prev_yturn2;
int prev_zturn,prev_zturn2,xver,yver,zver;
int check_count = 4,pcnt = 0,bild_counter;
int prev_check_count, prev_pcnt;
int sichtbar[MAXFL],plst[MAXFL][MAXPPF],pkt_p_flaech[MAXFL];
long sp[MAXP],ze[MAXP],cx[MAXP],cz[MAXP],cy[MAXP];  
long afarbe[MAXFL],farbe[MAXFL];
float sinus[360],cosin[360];
float xmove,ymove,zmove,zoomer,prev_zoomer;
float prev_xmove,prev_ymove,prev_zmove;

main()
{ 
 init_trig();
 graph_screens();
 rp_1 = window_1->RPort;
 rp_2 = window_2->RPort;
 rp_3 = cont_wind->RPort;
 init_control();
 rp_1->Layer->ClipRect->bounds.MinX = (SHORT)0;
 rp_1->Layer->ClipRect->bounds.MinY = (SHORT)0;
 rp_1->Layer->ClipRect->bounds.MaxX = (SHORT)319;
 rp_1->Layer->ClipRect->bounds.MaxY = (SHORT)199;
 rp_2->Layer->ClipRect->bounds.MinX = (SHORT)0;
 rp_2->Layer->ClipRect->bounds.MinY = (SHORT)0;
 rp_2->Layer->ClipRect->bounds.MaxX = (SHORT)319;
 rp_2->Layer->ClipRect->bounds.MaxY = (SHORT)199;
 InitArea(&area_info,&areabuf[0],200L);
 rp_1->AreaInfo = &area_info;
 rp_2->AreaInfo = &area_info;
 rp_1->TmpRas   = &temp_ras;
 rp_2->TmpRas   = &temp_ras ;
 area_plane = AllocMem(25600L,MEMF_CHIP);
 rp_1->TmpRas->RasPtr = area_plane;
 rp_1->TmpRas->Size   = (long)RASSIZE(512,400);   
 rp_2->TmpRas->RasPtr = area_plane;
 rp_2->TmpRas->Size   = (long)RASSIZE(512,400);  
 input();
 ausstieg();  
}      
 
graph_screens()
{  
 int loop,wert;

  IntuitionBase=(struct IntuitionBase *)
   OpenLibrary("intuition.library",0L);
 GfxBase=(struct GfxBase *)
   OpenLibrary("graphics.library",0L);
 screen_1=(struct Screen *)OpenScreen(&graph_screen); 
 screen_2=(struct Screen *)OpenScreen(&graph_screen);
 LoadRGB4(&screen_1->ViewPort,farb_lst,16L);
 LoadRGB4(&screen_2->ViewPort,farb_lst,16L);
 graph_window1.Screen = screen_1;
 graph_window2.Screen = screen_2;
 control_window.Screen = screen_2;
 window_1=(struct Window *)OpenWindow(&graph_window1); 
 window_2=(struct Window *)OpenWindow(&graph_window2); 
 cont_wind=(struct Window *)OpenWindow(&control_window);
}

input()
{
 struct IntuiMessage * inp_msg;
 struct Gadget * inp_gad;
 int abbruch = FALSE;

 CONTINUE
 {
  if(inp_msg=(struct IntuiMessage*)GetMsg(cont_wind->UserPort))
  {
   if((inp_msg->Class) == GADGETDOWN)
   {
    inp_gad = (struct Gadget *)inp_msg->IAddress;
    switch(inp_gad->GadgetID) 
    {
      case 27:abbruch = TRUE;
              break;
      case 12:xdreher+= 1;
              write_int(xdreher,26L,rp_3);
              break;
      case  1:xdreher-= 1;
              write_int(xdreher,26L,rp_3);
              break;
      case 13:ydreher+= 1;
              write_int(ydreher,38L,rp_3);
              break;
      case  2:ydreher-= 1;
              write_int(ydreher,38L,rp_3);
              break;
      case 14:zdreher+= 1;
              write_int(zdreher,50L,rp_3);
              break;
      case  3:zdreher-= 1;
              write_int(zdreher,50L,rp_3);
              break;
      case 18:xdreher2+= 1;
              write_int(xdreher2,98L,rp_3);
              break;
      case  7:xdreher2-= 1;
              write_int(xdreher2,98L,rp_3);
              break;
      case 19:ydreher2+= 1;
              write_int(ydreher2,110L,rp_3);
              break;
      case  8:ydreher2-= 1;
              write_int(ydreher2,110L,rp_3);
              break;
      case 20:zdreher2+= 1;
              write_int(zdreher2,122L,rp_3);
              break;
      case  9:zdreher2-= 1;
              write_int(zdreher2,122L,rp_3);
              break;
      case 15:if(xver<1500) xver+= 50;
              write_int(xver,62L,rp_3);
              break;
      case  4:if(xver>-1500) xver-= 50;
              write_int(xver,62L,rp_3);
              break;
      case 16:if(yver<1500) yver+= 50;
              write_int(yver,74L,rp_3);
              break;
      case  5:if(yver>-1500) yver-= 50;
              write_int(yver,74L,rp_3);
              break;
      case 17:if(zver<1500) zver+= 50;
              write_int(zver,86L,rp_3);
              break;
      case  6:if(zver>-1500) zver-= 50;
              write_int(zver,86L,rp_3);
              break;
      case 10:if(zoom>-1500) zoom-= 10;
              write_int(zoom,134L,rp_3);
              break;
      case 31:if(zoom>-1500) zoom-= 100;
              write_int(zoom,134L,rp_3);
              break;
      case 21:if(zoom<1500) zoom+= 10;
              write_int(zoom,134L,rp_3);
              break;
      case 29:if(zoom<1500) zoom+= 100;
              write_int(zoom,134L,rp_3);
              break;
      case 11:if(bild_counter>0) bild_counter-= 2;
              write_int(bild_counter,146L,rp_3);
              break;
      case 32:if(bild_counter>18) bild_counter-= 20;
              write_int(bild_counter,146L,rp_3);
              break;
      case 22:bild_counter+= 2;
              write_int(bild_counter,146L,rp_3);
              break;
      case 30:bild_counter+= 20;
              write_int(bild_counter,146L,rp_3);
              break;
      case 23:filename = (char *)&buff_1[0];
              object_loader();
              break;
      case 24:filename = (char *)&buff_3[0];
              film_loader();
              break;
      case 25:filename = (char *)&buff_3[0];
              film_save();
              break;
      case 26:movie();
              Delay(15L);
              init_control();
              break;
      case 28:object_drawer();
              Delay(15L);
              init_control();
              break;
      case 33:check_count = 4;
              pcnt = 0;
              break;
      case 34:reset_val();
              break;
      case 35:if(!seq_deleted) deleter();
              break;
      case 36:reset_inp();
              init_control();
              break;
      default:break;
    }
   }
  }
  if(abbruch) break;
 }
}

object_drawer()
{ 
 int loop,pind,breaker = FALSE,go_on = TRUE ;

 prev_xturn = xturn;
 prev_yturn = yturn;
 prev_zturn = zturn;
 prev_xturn2 = xturn2;
 prev_yturn2 = yturn2;
 prev_zturn2 = zturn2;
 prev_xmove = xmove;
 prev_ymove = ymove;
 prev_zmove = zmove;
 prev_zoomer = zoomer;
 prev_check_count = check_count;
 prev_pcnt = pcnt;
 seq_deleted = FALSE; 
 WindowToBack(cont_wind);
 while(bild_counter>0)
 {
  breaker = transform();
  if(breaker) go_on =
   AutoRequest(window_2,&r_text1,NULL,&c_text,NULL,NULL,130L,58L);
  if(!go_on) break;
  BltClear(rp_1->BitMap->Planes[0],8000L,0L);
  BltClear(rp_1->BitMap->Planes[1],8000L,0L);
  BltClear(rp_1->BitMap->Planes[2],8000L,0L);
  BltClear(rp_1->BitMap->Planes[3],8000L,0L);
  for(loop=0;loop<flaech_zahl;loop++)
  { 
   if(sichtbar[loop])
   {   
    SetAPen(rp_1,farbe[loop]); 
    SetOPen(rp_1,afarbe[loop]); 
    AreaMove(rp_1,sp[plst[loop][0]],ze[plst[loop][0]]);
    for(pind=1;pind<pkt_p_flaech[loop];pind++)
     AreaDraw(rp_1,sp[plst[loop][pind]],ze[plst[loop][pind]]);
    AreaEnd(rp_1);
    sichtbar[loop] = FALSE;
   }
  } 
  ScreenToFront(screen_1);
  breaker = transform();
  BltClear(rp_2->BitMap->Planes[0],8000L,0L);
  BltClear(rp_2->BitMap->Planes[1],8000L,0L);
  BltClear(rp_2->BitMap->Planes[2],8000L,0L);
  BltClear(rp_2->BitMap->Planes[3],8000L,0L);
  for(loop=0;loop<flaech_zahl;loop++)
  { 
   if(sichtbar[loop])
   {   
    SetAPen(rp_2,farbe[loop]);
    SetOPen(rp_2,afarbe[loop]); 
    AreaMove(rp_2,sp[plst[loop][0]],ze[plst[loop][0]]);
    for(pind=1;pind<pkt_p_flaech[loop];pind++)
     AreaDraw(rp_2 ,sp[plst[loop][pind]],ze[plst[loop][pind]]); 
    AreaEnd(rp_2  );
    sichtbar[loop] = FALSE;
   }
  } 
  ScreenToFront(screen_2);
  bild_counter-= 2;
 }
 BltClear(rp_2->BitMap->Planes[0],8000L,0L);
 BltClear(rp_2->BitMap->Planes[1],8000L,0L);
 BltClear(rp_2->BitMap->Planes[2],8000L,0L);
 BltClear(rp_2->BitMap->Planes[3],8000L,0L);
 WindowToFront(cont_wind);
}

init_trig()
{
 int loop;

 for(loop=0;loop<360;loop++)
 {
  sinus[loop] = (float)(sin(loop*PI/180));
  cosin[loop] = (float)(cos(loop*PI/180));
 } 
}
  
ausstieg()
{
 FreeMem(area_plane,25600L); 
 CloseWindow(window_1);
 CloseWindow(window_2);
 CloseWindow(cont_wind );
 CloseScreen(screen_1 );
 CloseScreen(screen_2);
 CloseLibrary(GfxBase);
 CloseLibrary(IntuitionBase);
 exit(TRUE);
}

transform()
 {
 int loop,anz_sichtbar,inloop,array_voll = FALSE;
 long horbuf,verbuf;
 float horpos,verpos,z,x,y,hz,hx,hy;
 float va_x,va_y,va_z,vb_x,vb_y,vb_z;
 float trans_x[MAXP],trans_y[MAXP],trans_z[MAXP];
 float normv_x,normv_y,normv_z,s_prod;
 float sichtv_x,sichtv_y,sichtv_z;

 xturn+= xdreher;
 if(xturn<0) xturn+= 360;
 if(xturn>359) xturn-= 360; 
 yturn+= ydreher;
 if(yturn<0) yturn+= 360;
 if(yturn>359) yturn-= 360; 
 zturn+= zdreher;
 if(zturn<0) zturn+= 360;
 if(zturn>359) zturn-= 360; 
 xmove+= (float)xver;
 ymove+= (float)yver;
 zmove+= (float)zver;
 xturn2+= xdreher2;
 if(xturn2<0) xturn2+= 360;
 if(xturn2>359) xturn2-= 360; 
 yturn2+= ydreher2;
 if(yturn2<0) yturn2+= 360;
 if(yturn2>359) yturn2-= 360; 
 zturn2+= zdreher2;
 if(zturn2<0) zturn2+= 360;
 if(zturn2>359) zturn2-= 360; 
 zoomer+= (float)zoom;
 anz_sichtbar = 0;
 for(loop=0;loop<pkt_zahl;loop++)
 {
  hx = (float)cx[loop];
  hy = (float)cosin[xturn]*cy[loop] - sinus[xturn]*cz[loop];
  hz = (float)sinus[xturn]*cy[loop] + cosin[xturn]*cz[loop];
  x  = cosin[yturn]*hx - sinus[yturn]*hz;
  y  = hy;
  z  = sinus[yturn]*hx + cosin[yturn]*hz;
  hx = cosin[zturn]*x - sinus[zturn]*y;
  hy = sinus[zturn]*x + cosin[zturn]*y;
  hz = z;
  hx+= (float)xmove;
  hy+= (float)ymove;
  hz+= (float)zmove;
  x = hx;
  y = cosin[xturn2]*hy - sinus[xturn2]*hz;
  z = sinus[xturn2]*hy + cosin[xturn2]*hz;
  hx  = cosin[yturn2]*x - sinus[yturn2]*z;
  hy  = y;
  hz  = sinus[yturn2]*x + cosin[yturn2]*z;
  x = cosin[zturn2]*hx - sinus[zturn2]*hy;
  y = sinus[zturn2]*hx + cosin[zturn2]*hy;
  z = hz;
  z = (z-(FAK-zoomer));
  if((z>-1.0) && (z<=0.0)) z = -1.0;
  if((z>0.0) && (z<1.0)) z = 1.0; 
  trans_x[loop] = x;
  trans_y[loop] = y;
  trans_z[loop] = z;
  horpos = (-x/z)*256.0;
  verpos = (-y/z)*256.0;
  sp[loop] = (long)(160.0+horpos);
  if(sp[loop]>414L) sp[loop] = 414L;
  if(sp[loop]<-94L) sp[loop] = -94L;
  ze[loop] = (long)(100.0+verpos);
  if(ze[loop]>298L) ze[loop] = 298L;
  if(ze[loop]<-98L) ze[loop] = -98L;
 }
 for(loop=0;loop<flaech_zahl;loop++)
 {
  va_x = trans_x[plst[loop][0]] - trans_x[plst[loop][1]];
  va_y = trans_y[plst[loop][0]] - trans_y[plst[loop][1]];
  va_z = trans_z[plst[loop][0]] - trans_z[plst[loop][1]];
  vb_x = trans_x[plst[loop][2]] - trans_x[plst[loop][1]];
  vb_y = trans_y[plst[loop][2]] - trans_y[plst[loop][1]];
  vb_z = trans_z[plst[loop][2]] - trans_z[plst[loop][1]];
  normv_x = ((va_y * vb_z) - (va_z * vb_y));  
  normv_y = ((va_x * vb_z) - (va_z * vb_x));
  normv_z = ((va_x * vb_y) - (va_y * vb_x));
  sichtv_x = -(trans_x[plst[loop][1]]);
  sichtv_y =  (trans_y[plst[loop][1]]);
  sichtv_z = -(trans_z[plst[loop][1]]);
  s_prod = ((sichtv_x*normv_x)+(sichtv_y*normv_y)+
           (sichtv_z*normv_z));
  if(s_prod<0.0) 
  {
   sichtbar[loop] = TRUE;
   anz_sichtbar+= 1;
  }
 }
 if((check_count<11900) && (pcnt<16184))
 { 
  control_lst[check_count] = anz_sichtbar;
  check_count+= 1;
  for(loop=0;loop<flaech_zahl;loop++)
  {
   if(sichtbar[loop])
   {
    control_lst[check_count] = pkt_p_flaech[loop];
    check_count+= 1;
    control_lst[check_count] = (int)farbe[loop];
    check_count+= 1;
    control_lst[check_count] = (int)afarbe[loop];
    check_count+= 1;
    for(inloop=0;inloop<pkt_p_flaech[loop];inloop++)
    {
     horbuf = (sp[plst[loop][inloop]]-160L);
     verbuf = (ze[plst[loop][inloop]]-100L);
     xlst[pcnt] = (int)horbuf;
     ylst[pcnt] = (int)verbuf;
     pcnt+= 1;
    }
   }
  }
 }
 else array_voll = TRUE;
 return(array_voll);
}

object_loader()
{
 int count,loop,length;
 char diskfile[18], *append = ".3d\0";
 struct FileHandle *load_point;  

 length = strlen(filename);
 for(loop=0;loop<13;loop++)
  diskfile[loop] = filename[loop];
 for(loop=length;loop<(length+4);loop++)
  diskfile[loop] = append[loop-length];
 load_point = Open(&diskfile[0],MODE_OLDFILE);
 if(load_point)
 { 
  pkt_zahl = lies_int(load_point);
  flaech_zahl = lies_int(load_point);
  for(count=0;count<pkt_zahl;count++)
  {
   cx[count] = (long)lies_int(load_point);
   cy[count] = (long)lies_int(load_point);
   cz[count] = (long)lies_int(load_point);
  }
  for(count=0;count<flaech_zahl;count++)
   pkt_p_flaech[count] = lies_int(load_point); 
  for(count=0;count<flaech_zahl;count++)
   for(loop=0;loop<pkt_p_flaech[count];loop++)
    plst [count][loop] = lies_int(load_point);
  for(count=0;count<flaech_zahl;count++)
   farbe[count] = (long)lies_int(load_point);
  for(count=0;count<flaech_zahl;count++)
   afarbe[count] = (long)lies_int(load_point);
  Close(load_point);
 }
 else
 {
  AutoRequest(cont_wind,&r_text3,NULL,&n_text,NULL,NULL,140L,58L);
  init_control();
 }
}
 
int lies_int(file_point)
 struct FileHandle *file_point;
{
 int wert,loop,pos_zaehl;
 pos_zaehl = 0;

 do
 {
  Read(file_point,zielchar,1L);
  if(zielchar[0] == '-')
  {
   zielstring[pos_zaehl] = zielchar[0];
   ++pos_zaehl;
  }
  if(isdigit((int)zielchar[0]))
  { 
   zielstring[pos_zaehl] = zielchar[0];
   ++pos_zaehl;
  }
 } 
 while((zielchar[0] != ';') && (zielchar[0] != '\0'));
 wert = atoi(zielstring);
 for(loop=0;loop<10;loop++)
  zielstring[loop] = '\0';
 return(wert);
}

write_int(int_wert,output_ypos,ziel_port)
int int_wert;
long output_ypos;
struct RastPort *ziel_port;
{
 char output_string[8];
 int int_wert_buffer,zahl,s_factor,dcnt;
 int pos_zaehl,int_wert_stellen;
 pos_zaehl = 0;
 int_wert_stellen = 5;
 if(int_wert<0) 
 {
  output_string[pos_zaehl++] = '-';  
  int_wert_buffer = -int_wert;
 }
 else
  int_wert_buffer =  int_wert;
 for(dcnt=10000;dcnt>=1;dcnt/=10)
 {  
  if(int_wert_buffer/dcnt)break;
  int_wert_stellen -= 1;
 }
 switch(int_wert_stellen)
 {
  case 5:s_factor = int_wert_buffer / 10000;
         output_string[pos_zaehl++] = 48 + s_factor;
         int_wert_buffer -= s_factor * 10000;
  case 4:s_factor = int_wert_buffer / 1000;
         output_string[pos_zaehl++] = 48 + s_factor;
         int_wert_buffer -= s_factor * 1000;
  case 3:s_factor = int_wert_buffer / 100;
         output_string[pos_zaehl++] = 48 + s_factor;
         int_wert_buffer -= s_factor * 100;
  case 2:s_factor = int_wert_buffer / 10;
         output_string[pos_zaehl++] = 48 + s_factor;
         int_wert_buffer -= s_factor * 10;
  case 1:s_factor = int_wert_buffer;
         output_string[pos_zaehl++] = 48 + s_factor;
         int_wert_buffer -= s_factor;
         break;
  case 0:output_string[pos_zaehl++] = 48; 
 }  
 output_string[pos_zaehl] = '\0';
 Move(ziel_port,95L,output_ypos);
 Text(ziel_port,"      ",6L); 
 Move(ziel_port,(long)(143-(8*pos_zaehl)),output_ypos);
 Text(ziel_port,&output_string[0],(long)pos_zaehl);
}   

film_save()
{
 int *checkpoint,length,loop,save_it;
 char diskfile[19], *append = ".mov\0";
 struct FileHandle* save_pnt;

 save_it = AutoRequest(cont_wind,&r_text5,&s_text,&e_text,
                       NULL,NULL,145L,58L);
 init_control();
 if(save_it)
 {
  length = strlen(filename);
  for(loop=0;loop<13;loop++)
   diskfile[loop] = filename[loop];
  for(loop=length;loop<(length+5);loop++)
   diskfile[loop] = append[loop-length];
  checkpoint = (int *)&control_lst[0];
  *checkpoint = check_count;
  checkpoint = (int *)&control_lst[2];
  *checkpoint = pcnt;
  save_pnt = Open(&diskfile[0],MODE_NEWFILE);
  length = Write(save_pnt,&control_lst[0],(long)check_count);
  length = Write(save_pnt,&xlst[0],(long)pcnt*2);
  length = Write(save_pnt,&ylst[0],(long)pcnt*2);
  Close(save_pnt);
 }
}

film_loader()
{
 int length,loop,load_it;
 char diskfile[19 ], *append = ".mov\0";
 struct FileHandle *load_pnt;

 load_it = AutoRequest(cont_wind,&r_text7,&o_text,&e_text,
                       NULL,NULL,145L,58L);
 init_control();
 if(load_it)
 {
  length = strlen(filename);
  for(loop=0;loop<13;loop++)
   diskfile[loop] = filename[loop];
  for(loop=length;loop<(length+5);loop++)
   diskfile[loop] = append[loop-length];
  load_pnt = Open(&diskfile[0],MODE_OLDFILE);
  if(load_pnt)
  {
   length = Read(load_pnt,&check_count,2L);
   length = Read(load_pnt,&pcnt,2L);
   length = Read(load_pnt,&control_lst[4],(long)(check_count-4));
   length = Read(load_pnt,&xlst[0],(long)pcnt*2);
   length = Read(load_pnt,&ylst[0],(long)pcnt*2);
   Close(load_pnt);
   seq_deleted = TRUE;
  }
  else
  {
   AutoRequest(cont_wind,&r_text3,NULL,&n_text,
               NULL,NULL,140L,58L);
   init_control();
  }
 }
}

movie()
{
 int control_cnt = 4 , pcnt = 0; 
 int loop, inloop, flaechen, punkte;
 long fill_color,outline_color;

 WindowToBack(cont_wind);
 Delay(50L);
 while(control_cnt<check_count)
 {
  BltClear(rp_1->BitMap->Planes[0],8000L,0L);
  BltClear(rp_1->BitMap->Planes[1],8000L,0L);
  BltClear(rp_1->BitMap->Planes[2],8000L,0L);
  BltClear(rp_1->BitMap->Planes[3],8000L,0L);
  flaechen = control_lst[control_cnt];
  control_cnt+=1;
  for(loop=0;loop<flaechen;loop ++)
  { 
   punkte = control_lst[control_cnt];
   control_cnt+= 1;
   fill_color = (long)control_lst[control_cnt];
   control_cnt+= 1;
   outline_color = (long)control_lst[control_cnt];
   control_cnt+= 1;
   SetAPen(rp_1,fill_color);
   SetOPen(rp_1,outline_color);
   AreaMove(rp_1,(long)(xlst[pcnt]+160),(long)(ylst[pcnt]+100));
   pcnt+= 1;   
   for(inloop=0;inloop<(punkte-1);inloop++)
   {
    AreaDraw(rp_1,(long)(xlst[pcnt]+160L),(long)(ylst[pcnt]+100));
    pcnt+= 1;    
   }
   AreaEnd(rp_1);
  } 
  ScreenToFront(screen_1);
  BltClear(rp_2->BitMap->Planes[0],8000L,0L);
  BltClear(rp_2->BitMap->Planes[1],8000L,0L);
  BltClear(rp_2->BitMap->Planes[2],8000L,0L);
  BltClear(rp_2->BitMap->Planes[3],8000L,0L);
  flaechen = control_lst[control_cnt];
  control_cnt+=1;
  for(loop=0;loop<flaechen;loop++)
  { 
   punkte = control_lst[control_cnt];
   control_cnt+= 1;
   fill_color = (long)control_lst[control_cnt];
   control_cnt+= 1;
   outline_color = (long)control_lst[control_cnt];
   control_cnt+= 1;
   SetAPen(rp_2,fill_color);
   SetOPen(rp_2,outline_color);
   AreaMove(rp_2,(long)(xlst[pcnt]+160L),(long)(ylst[pcnt]+100));
   pcnt+= 1;
   for(inloop=0;inloop<(punkte-1);inloop++)
   {
    AreaDraw(rp_2,(long)(xlst[pcnt]+160L),(long)(ylst[pcnt]+100));
    pcnt+= 1;
   } 
   AreaEnd(rp_2);
  } 
  ScreenToFront(screen_2);
 }  
 Delay(50L);
 BltClear(rp_2->BitMap->Planes[0],8000L,0L);
 BltClear(rp_2->BitMap->Planes[1],8000L,0L);
 BltClear(rp_2->BitMap->Planes[2],8000L,0L);
 BltClear(rp_2->BitMap->Planes[3],8000L,0L);
 WindowToFront(cont_wind);
}
 
init_control()
{
 SetAPen(rp_3,1L);
 Move(rp_3,10L,26L);
 Text(rp_3,"x-Turn:",7L);
 Move(rp_3,10L,38L);
 Text(rp_3,"y-Turn:",7L);
 Move(rp_3,10L,50L);
 Text(rp_3,"z-Turn:",7L);
 Move(rp_3,10L,62L);
 Text(rp_3,"x-Move:",7L);
 Move(rp_3,10L,74L);
 Text(rp_3,"y-Move:",7L);
 Move(rp_3,10L,86L);
 Text(rp_3,"z-Move:",7L);
 Move(rp_3,10L,98L);
 Text(rp_3,"x-Cent:",7L);
 Move(rp_3,10L,110L);
 Text(rp_3,"y-Cent:",7L);
 Move(rp_3,10L,122L);
 Text(rp_3,"z-Cent:",7L);
 Move(rp_3,10L,134L);
 Text(rp_3,"Zoom:",5L);
 Move(rp_3,10L,146L);
 Text(rp_3,"Bilder:",7L);
 write_int(xdreher,26L,rp_3); 
 write_int(ydreher,38L,rp_3); 
 write_int(zdreher,50L,rp_3); 
 write_int(xver,62L,rp_3);
 write_int(yver,74L,rp_3);
 write_int(zver,86L,rp_3);
 write_int(xdreher2,98L,rp_3); 
 write_int(ydreher2,110L,rp_3); 
 write_int(zdreher2,122L,rp_3); 
 write_int(zoom,134L,rp_3);
 write_int(bild_counter,146L,rp_3);
}

reset_val()
{
 xturn = 0;
 yturn = 0;
 zturn = 0;
 xturn2 = 0;
 yturn2 = 0;
 zturn2 = 0;
 xmove = 0;
 ymove = 0;
 zmove = 0;
 zoomer = 0;
}

reset_inp()
{
 xdreher =0;
 ydreher = 0;
 zdreher = 0;
 xdreher2 =0;
 ydreher2 = 0;
 zdreher2 = 0;
 xver = 0;
 yver = 0;
 zver = 0;
 zoom = 0;
}

deleter()
{
 xturn = prev_xturn;
 yturn = prev_yturn;
 zturn = prev_zturn;
 xturn2 = prev_xturn2;
 yturn2 = prev_yturn2;
 zturn2 = prev_zturn2;
 xmove = prev_xmove;
 ymove = prev_ymove;
 zmove = prev_zmove;
 zoomer = prev_zoomer;
 check_count = prev_check_count;
 pcnt = prev_pcnt;
 seq_deleted = TRUE;
}
