home *** CD-ROM | disk | FTP | other *** search
/ Collection of Hack-Phreak Scene Programs / cleanhpvac.zip / cleanhpvac / 3DTOSHI2.ZIP / myapp / 3d / 3dw386 / 3dwin.cpp < prev    next >
C/C++ Source or Header  |  1996-05-01  |  29KB  |  989 lines

  1.  
  2. // 3dw386.cpp
  3.  
  4. #include "stdgfx.h"
  5. #include "mpgui.h"
  6. #include "mpg3d.h"
  7. #include "dlgs.h"
  8.  
  9. #define MENU_FILE_OPEN  101
  10. #define MENU_FILE_EXIT  102
  11.  
  12. #define MENU_DETAIL_FACE 210
  13.   #define MENU_DETAIL_FACE_TEXTURE   211
  14.   #define MENU_DETAIL_FACE_SOLID     212
  15.   #define MENU_DETAIL_FACE_WIREFRAME 213
  16.  
  17. #define MENU_DETAIL_SHADE 220
  18.   #define MENU_DETAIL_SHADE_GOURAUD  221
  19.   #define MENU_DETAIL_SHADE_FLAT     222
  20.   #define MENU_DETAIL_SHADE_NONE     223
  21.  
  22. #define MENU_MATERIAL_LOAD             310
  23.   #define MENU_MATERIAL_LOAD_STATIC    311
  24.   #define MENU_MATERIAL_LOAD_ANIMATED  312
  25.   
  26. #define MENU_MATERIAL_TRANSPARENCY      320
  27.   #define MENU_MATERIAL_TRANSPARENCY_10 321  
  28.   #define MENU_MATERIAL_TRANSPARENCY_20 322
  29.   #define MENU_MATERIAL_TRANSPARENCY_30 323  
  30.   #define MENU_MATERIAL_TRANSPARENCY_40 324  
  31.   #define MENU_MATERIAL_TRANSPARENCY_50 325  
  32.   #define MENU_MATERIAL_TRANSPARENCY_60 326  
  33.   #define MENU_MATERIAL_TRANSPARENCY_70 327  
  34.   #define MENU_MATERIAL_TRANSPARENCY_80 328  
  35.   #define MENU_MATERIAL_TRANSPARENCY_90 329  
  36.   #define MENU_MATERIAL_TRANSPARENCY_00 330
  37.     
  38. #define MENU_MATERIAL_AMBIENT           331 
  39.  
  40. #define MENU_ENVIRONMENT_BACKGROUND     
  41.   #define MENU_ENVIRONMENT_BACKGROUND_LOAD    411
  42.   #define MENU_ENVIRONMENT_BACKGROUND_STATIC  412
  43.   
  44. #define MENU_ENVIRONMENT_DEPTH_CUE   421
  45. #define MENU_ENVIRONMENT_FOG         431
  46.  
  47. #define MENU_ROTATION_X  510
  48.   #define MENU_ROTATION_X_INC          511
  49.   #define MENU_ROTATION_X_DEC          512
  50.   #define MENU_ROTATION_X_STOP         513
  51. #define MENU_ROTATION_Y  520
  52.   #define MENU_ROTATION_Y_INC          521
  53.   #define MENU_ROTATION_Y_DEC          522
  54.   #define MENU_ROTATION_Y_STOP         523
  55. #define MENU_ROTATION_Z  530
  56.   #define MENU_ROTATION_Z_INC          531
  57.   #define MENU_ROTATION_Z_DEC          532
  58.   #define MENU_ROTATION_Z_STOP         533
  59.  
  60. #define MENU_HELP_ABOUT              601
  61.  
  62. //************************************
  63. //
  64. // Main Frame Class
  65. //
  66. //************************************
  67.  
  68. class MAINFRAME : public GUIFRAME
  69.   {
  70.     protected :
  71.       GUIMENU *Menu;
  72.       G3DSYSTEM *G3D;
  73.       G3DCAMERA *Camera;
  74.       COLORTABLE *ShadeTable;
  75.       COLORTABLE *HazeTable;
  76.       COLORTABLE *BlendTable;
  77.       RGBPALETTE *Pal;
  78.       IMAGE *VScreen;
  79.       IMAGE *BGImage;
  80.       LONG BGColor;
  81.       float NearClipZ;
  82.       float ViewDistance;
  83.       float MaxVisibleDistance;
  84.       float U0,V0;
  85.       float U1,V1;
  86.       float U2,V2;
  87.       float ObjPosX,ObjPosY,ObjPosZ;
  88.       float ObjRotX,ObjRotY,ObjRotZ;
  89.       float LightPosX,LightPosY,LightPosZ;
  90.       INT AmbientRed,AmbientGreen,AmbientBlue;
  91.       INT BGRed,BGGreen,BGBlue;
  92.       LONG NumAnimatedFrames;
  93.       LONG CurAnimatedFrame;
  94.       
  95.       BOOLEAN MapTexture;
  96.       BOOLEAN Initialized;
  97.       BOOLEAN TimerOn;
  98.       BOOLEAN ObjectLoaded;
  99.       BOOLEAN UseBG;
  100.       BOOLEAN AnimatedTexture;
  101.  
  102.       BOOLEAN Init3D ();
  103.       
  104.       BOOLEAN Load3DFile ( STRING FileName );
  105.       VOID OnFileLoad ();
  106.       VOID OnFog ();
  107.       VOID OnTransparent ( LONG Code );
  108.       
  109.       VOID OnDetail ( LONG Code );
  110.       
  111.       VOID OnLoadTextureStatic ();
  112.       VOID OnLoadTextureAnimated ();
  113.       VOID OnAmbient ();
  114.  
  115.       VOID OnLoadBG ();
  116.       VOID OnBGStatic ();
  117.  
  118.       VOID OnDepthCue ();
  119.  
  120.       VOID OnRotation ( LONG Code );
  121.  
  122.       VOID OnAbout ();
  123.       
  124.       VOID HandleInput ();
  125.       
  126.       virtual LONG OnCreate ();
  127.       virtual LONG OnCommand ( LONG Command );
  128.       virtual LONG OnClose ();
  129.       virtual LONG OnTimer ();
  130.       virtual LONG OnPosChanging ( WINPOSCHANGE *WinPosChange );
  131.       virtual LONG OnSize ( LONG Width, LONG Height );
  132.       virtual LONG OnPaint ( HDISPLAY hDisplay );
  133.       
  134.     public :
  135.       MAINFRAME ();        
  136.       virtual ~MAINFRAME ();
  137.   }; // Ebd of MAINFRAME
  138.  
  139. MAINFRAME::MAINFRAME ()
  140.   {
  141.     Menu = new GUIMENU ();
  142.     AddClassStyle ( CS_OWNDC );
  143.     G3D = NULL;
  144.     Camera = NULL;
  145.     ShadeTable = NULL;
  146.     BlendTable = NULL;
  147.     HazeTable = NULL;
  148.     BGImage = NULL;
  149.  
  150.     NearClipZ = (float)10;
  151.     ViewDistance = (float)200;
  152.     MaxVisibleDistance = (float)3000;
  153.  
  154.     U0 = (float)0; V0 = (float)0;
  155.     U1 = (float)0; V1 = (float)0.5;
  156.     U2 = (float)0.5; V2 = (float)0.5;
  157.  
  158.     ObjPosX = (float)0;
  159.     ObjPosY = (float)0; 
  160.     ObjPosZ = (float)500;
  161.  
  162.     ObjRotX = (float)3;
  163.     ObjRotY = (float)3;
  164.     ObjRotZ = (float)3;
  165.  
  166.     LightPosX = (float)0;
  167.     LightPosY = (float)0;
  168.     LightPosZ = (float)0;
  169.  
  170.     AmbientRed = 255;
  171.     AmbientGreen = 0;
  172.     AmbientBlue = 0;
  173.     
  174.     BGRed = 128;
  175.     BGGreen = 128;
  176.     BGBlue = 128;
  177.     
  178.     TimerOn = FALSE;
  179.     MapTexture = FALSE;
  180.     ObjectLoaded = FALSE;
  181.     Initialized = FALSE;
  182.     UseBG = FALSE;
  183.  
  184.     BGColor = 0;
  185.  
  186.     NumAnimatedFrames = 0;
  187.     CurAnimatedFrame = 0;
  188.     AnimatedTexture = FALSE;
  189.   } // End of Constructor for MAINFRAME
  190.  
  191. MAINFRAME::~MAINFRAME ()
  192.   {
  193.     if (G3D!=NULL)
  194.       delete G3D;
  195.     G3D = NULL;
  196.  
  197.     if (Camera!=NULL)
  198.       delete Camera;
  199.     Camera = NULL;
  200.     
  201.     if (ShadeTable!=NULL)
  202.       delete ShadeTable;
  203.     ShadeTable = NULL;
  204.  
  205.     if (VScreen!=NULL)
  206.       delete VScreen;
  207.     VScreen = NULL;
  208.  
  209.     if (BGImage!=NULL)
  210.       delete BGImage;
  211.     BGImage = NULL;    
  212.   } // End of Destructor for MAINFRAME
  213.  
  214. BOOLEAN MAINFRAME::Init3D ()
  215.   {
  216.     G3D = new G3DSYSTEM ();
  217.     Camera = new G3DCAMERA ();
  218.     
  219.     ShadeTable = new COLORTABLE ();  
  220.     BlendTable = new COLORTABLE ();  
  221.     HazeTable = new COLORTABLE ();
  222.     VScreen = new IMAGE ( IMAGE_BOTTOMUP );
  223.  
  224.     if (ShadeTable->Load ( "..\\data\\color.tbl" )==FAILURE)
  225.       {
  226.         ShowMessageBox("Error", "Error loading Shade Table", MB_OK);
  227.         return FAILURE;
  228.       } // End if
  229.     if (BlendTable->Load ( "..\\data\\blend.tbl" )==FAILURE)
  230.       {
  231.         ShowMessageBox("Error", "Error loading Blend Table", MB_OK);
  232.         return FAILURE;
  233.       } // End if
  234.     if (HazeTable->Load ( "..\\data\\whaze.tbl" )==FAILURE)
  235.       {
  236.         ShowMessageBox("Error", "Error loading Haze Table", MB_OK);
  237.         return FAILURE;
  238.       } // End if
  239.  
  240.     Pal = ShadeTable->GetPalette ();
  241.     RGBCOLOR Col;
  242.     Col.Red = (BYTE)BGRed;
  243.     Col.Green = (BYTE)BGGreen;
  244.     Col.Blue = (BYTE)BGBlue;
  245.     BGColor = Pal->GetClosestColor ( Col );
  246.     
  247.     G3D->SetBlendTable ( BlendTable );
  248.     G3D->SetHazing ( FALSE, (float)100, HazeTable );
  249.     G3D->SetNearClipZ ( NearClipZ );
  250.     G3D->SetViewDistance ( ViewDistance );
  251.  
  252.     G3DMATERIALLIB *MaterialLib = new G3DMATERIALLIB ();
  253.     MaterialLib->CreateTextures ( 1 );
  254.     MaterialLib->CreateMaterials ( 1 );    
  255.     G3D->SetMaterialLib ( MaterialLib );
  256.     
  257.     // Add Material to this Material Library
  258.     G3DMATERIAL *Material;
  259.     Material = MaterialLib->GetMaterial ( 0 );
  260.     Material->SetID ( 0 );
  261.     RGBCOLOR AmbientColor;
  262.     AmbientColor.Red = (BYTE)AmbientRed;
  263.     AmbientColor.Green = (BYTE)AmbientGreen;
  264.     AmbientColor.Blue = (BYTE)AmbientBlue;
  265.     Material->Transparency = 0;
  266.     Material->Ambient = Pal->GetClosestColor ( AmbientColor );
  267.  
  268.     // Add Texture to this Material
  269.     MaterialLib->LoadTexture ( 0, "..\\data\\checker.pcx", TEXTURE_STATIC, ShadeTable->GetPalette() );      
  270.     Material->SetTexture ( MaterialLib->GetTexture(0) );
  271.  
  272.     // Set Camera
  273.     Camera->SetPosition ( (float)0, (float)0, (float)0 );
  274.     Camera->SetAngle ( (float)0, (float)0, (float)0 );
  275.  
  276.     Initialized = TRUE;
  277.     return SUCCESS;
  278.   } // End of Init3D for MAINFRAME
  279.  
  280. BOOLEAN MAINFRAME::Load3DFile ( STRING FileName )
  281.   {      
  282.     G3DWORLD *World = new G3DWORLD;            
  283.     if (World==NULL)
  284.       return FAILURE;
  285.     
  286.     LINKEDLIST<G3DOBJECT*> *ObjectList = new LINKEDLIST<G3DOBJECT*> ();
  287.     if (G3D->Load3DFile ( FileName, ObjectList, FALSE, 1.0 )==FAILURE)
  288.       {
  289.         ShowMessageBox("Error loading 3D", "Error occured at loading this file", MB_OK);
  290.         delete ObjectList;
  291.         delete World;
  292.         return FAILURE;
  293.       } // End if
  294.       
  295.     G3DLIGHT *Light = new G3DLIGHT ();
  296.  
  297.     Light->SetName ( "Light01" );
  298.     Light->SetPosition ( LightPosX, LightPosY, LightPosZ );
  299.     Light->SetShadeTable ( ShadeTable );
  300.     Light->SetMaxIntensity ( (float)63 );
  301.     Light->SetMinIntensity ( (float)0 );
  302.  
  303.     World->AddObject ( Light );
  304.  
  305.     G3DMATERIAL *Material = G3D->FindMaterialByIndex ( 0 );
  306.     
  307.     LISTOBJECT<G3DOBJECT*> *ObjectNode;
  308.     G3DOBJECT *Object;
  309.     G3DPOLYHEDRON *PolyObject;
  310.     
  311.     ObjectNode = ObjectList->GetHead ();
  312.     while (ObjectNode!=NULL)
  313.       {
  314.         Object = ObjectNode->Data;
  315.         
  316.         if (Object->GetObjectType()==OBJECT_TYPE_POLYHEDRON)
  317.           {
  318.             Object->SetMaxVisibleDistance ( MaxVisibleDistance );
  319.             Object->SetPosition ( ObjPosX, ObjPosY, ObjPosZ );
  320.             Object->SetID ( 1 );
  321.  
  322.             PolyObject = (G3DPOLYHEDRON*)Object;  
  323.             PolyObject->SetLightSource ( Light );
  324.  
  325.             PolyObject->SetShadeFlags ( MAX_DETAIL, SHADE_GOURAUD );
  326.             PolyObject->SetFaceFlags ( MAX_DETAIL, FACE_TEXTURE );
  327.             PolyObject->ComputeCenter ();
  328.             PolyObject->ComputeRadius ();
  329.  
  330.             float Radius;
  331.             float ScaleFactor;
  332.             Radius = PolyObject->GetRadius ();
  333.             if (Radius==0)
  334.               Radius = (float)1;
  335.             ScaleFactor = (float)(250 / Radius);
  336.             PolyObject->SetScaleFactor ( ScaleFactor );
  337.             PolyObject->SetMaterial ( Material );
  338.             if (PolyObject->TextureMapped!=TRUE)
  339.               PolyObject->MapTexture ( U0, V0, U1, V1, U2, V2 );
  340.             
  341.             World->AddObject ( PolyObject );
  342.             ObjectNode->Data = NULL;
  343.             break;
  344.           } // End if
  345.         ObjectNode = ObjectNode->NextObject;  
  346.       } // End while
  347.       
  348.     ObjectList->ClearAllNode ();  
  349.     delete ObjectList;
  350.  
  351.     G3D->SetWorld ( World, TRUE );
  352.     G3D->Init ();
  353.     return SUCCESS;
  354.   } // End of Load3DFile for MAINFRAME 
  355.  
  356. VOID MAINFRAME::OnFileLoad ()
  357.   {
  358.     if (TimerOn)
  359.       KillTimer ();
  360.         
  361.     GUIFILEDIALOG *FileDialog;
  362.     FileDialog = new GUIFILEDIALOG ( FD_OPEN );
  363.     FileDialog->CreateExtensions ( 5 );
  364.     FileDialog->SetExtension ( 0, "*.3DS", "Autodesk 3D Studio files (*.3DS)" );
  365.     FileDialog->SetExtension ( 1, "*.ASC", "ASCII files (*.ASC)" );
  366.     FileDialog->SetExtension ( 2, "*.GEO", "View Space files (*.GEO)" );
  367.     FileDialog->SetExtension ( 3, "*.GEM", "Geometry files (*.GEM)" );
  368.     FileDialog->SetExtension ( 4, "*.*", "All files (*.*)" );
  369.  
  370.     LONG Result;    
  371.     Result = FileDialog->Execute ( this, "File Open" );
  372.     if (Result)
  373.       {
  374.         CHAR FileName[128];
  375.         FileDialog->GetFileName ( FileName );  
  376.         if (Load3DFile ( FileName )==SUCCESS)
  377.           {
  378.             TimerOn = TRUE;
  379.             ObjectLoaded = TRUE;
  380.             SetTimer ( 0 );  
  381.           } // End if
  382.       } // End if
  383.       
  384.     delete FileDialog;
  385.   } // End of Load3DFile for MAINFRAME
  386.  
  387. VOID MAINFRAME::OnDetail ( LONG Code )
  388.   {
  389.     switch (Code)
  390.       {
  391.         case MENU_DETAIL_FACE_TEXTURE :
  392.           G3D->SetFaceFlags ( FACE_TEXTURE );
  393.           break;  
  394.         case MENU_DETAIL_FACE_SOLID :
  395.           G3D->SetFaceFlags ( FACE_SOLID );
  396.           break;  
  397.         case MENU_DETAIL_FACE_WIREFRAME :
  398.           G3D->SetFaceFlags ( FACE_WIREFRAME );
  399.           break;  
  400.  
  401.         case MENU_DETAIL_SHADE_GOURAUD :
  402.           G3D->SetShadeFlags ( SHADE_GOURAUD );
  403.           break;  
  404.         case MENU_DETAIL_SHADE_FLAT :
  405.           G3D->SetShadeFlags ( SHADE_FLAT );
  406.           break;  
  407.         case MENU_DETAIL_SHADE_NONE :
  408.           G3D->SetShadeFlags ( SHADE_NONE );
  409.           break;  
  410.       } // End switch  
  411.   } // End of OnDetail for MAINFRAME
  412.  
  413. VOID MAINFRAME::OnLoadTextureStatic ()
  414.   {
  415.     if (TimerOn)
  416.       KillTimer ();
  417.         
  418.     GUIFILEDIALOG *FileDialog;
  419.     FileDialog = new GUIFILEDIALOG ( FD_OPEN );
  420.     FileDialog->CreateExtensions ( 4 );
  421.     FileDialog->SetExtension ( 0, "*.BMP", "Windows BMP (*.BMP)" );
  422.     FileDialog->SetExtension ( 1, "*.GIF", "CompuServ GIF (*.GIF)" );
  423.     FileDialog->SetExtension ( 2, "*.PCX", "Z Soft PCX (*.PCX)" );
  424.     FileDialog->SetExtension ( 3, "*.*", "All files (*.*)" );
  425.  
  426.     LONG Result;    
  427.     Result = FileDialog->Execute ( this, "File Open" );
  428.     if (Result)
  429.       {
  430.         CHAR FileName[128];
  431.         FileDialog->GetFileName ( FileName );
  432.  
  433.         G3DMATERIALLIB *MaterialLib = G3D->GetMaterialLib ();
  434.         
  435.         // Add Texture to this Material
  436.         if (MaterialLib->LoadTexture ( 0, FileName, TEXTURE_STATIC, Pal )==SUCCESS)
  437.           {
  438.             AnimatedTexture = FALSE;    
  439.             NumAnimatedFrames = 0;
  440.             CurAnimatedFrame = 0;
  441.           } // End if
  442.         else  
  443.           {
  444.             ShowMessageBox ( "Error", "Can not load this Texture!", MB_OK );
  445.           } // End else
  446.       } // End if
  447.       
  448.     if (TimerOn)
  449.       SetTimer ( 0 );  
  450.     delete FileDialog;      
  451.   } // End of OnLoadTextureStatic for MAINFRAME
  452.  
  453. VOID MAINFRAME::OnLoadTextureAnimated ()
  454.   {
  455.     if (TimerOn)
  456.       KillTimer ();
  457.         
  458.     GUIFILEDIALOG *FileDialog;
  459.     FileDialog = new GUIFILEDIALOG ( FD_OPEN );
  460.     FileDialog->CreateExtensions ( 3 );
  461.     FileDialog->SetExtension ( 0, "*.FLI", "Autodesk FLI (*.FLI)" );
  462.     FileDialog->SetExtension ( 1, "*.FLC", "Autodesk FLC (*.FLC)" );
  463.     FileDialog->SetExtension ( 2, "*.*", "All files (*.*)" );
  464.  
  465.     LONG Result;    
  466.     Result = FileDialog->Execute ( this, "File Open" );
  467.     if (Result)
  468.       {
  469.         CHAR FileName[128];
  470.         FileDialog->GetFileName ( FileName );
  471.  
  472.         G3DMATERIALLIB *MaterialLib = G3D->GetMaterialLib ();
  473.         
  474.         // Add Texture to this Material
  475.         if (MaterialLib->LoadTexture ( 0, FileName, TEXTURE_FLIC, Pal )==SUCCESS)
  476.           {
  477.             AnimatedTexture = TRUE;    
  478.             NumAnimatedFrames = (MaterialLib->GetTexture(0))->GetNumFrames();
  479.             CurAnimatedFrame = 0;
  480.           } // End if
  481.         else  
  482.           {
  483.             ShowMessageBox ( "Error", "Can not load this Texture!", MB_OK );
  484.           } // End else
  485.       } // End if
  486.       
  487.     if (TimerOn)
  488.       SetTimer ( 0 );  
  489.     delete FileDialog;      
  490.   } // End of OnLoadTextureAnimated for MAINFRAME
  491.  
  492. VOID MAINFRAME::OnAmbient ()
  493.   {
  494.     AMBIENTDLG *AmbientDlg;
  495.  
  496.     if (TimerOn)
  497.       KillTimer ();
  498.       
  499.     AmbientDlg = new AMBIENTDLG ();
  500.     if (AmbientDlg->Execute ( this, "AMBIENT_DLG" ))
  501.       {
  502.         RGBCOLOR Col;
  503.         AmbientDlg->GetRGB ( &Col );
  504.         G3DMATERIAL *Material = G3D->FindMaterialByID ( 0 );
  505.         
  506.         Material->Ambient = Pal->GetClosestColor ( Col );  
  507.       } // End if
  508.       
  509.     if (TimerOn)
  510.       SetTimer (0);
  511.       
  512.     delete AmbientDlg;
  513.   } // End of OnAmbient for MAINFRAME
  514.  
  515. VOID MAINFRAME::OnTransparent ( LONG Code )
  516.   {
  517.     LONG Transparency;
  518.     G3DMATERIAL *Material = G3D->FindMaterialByID ( 0 );
  519.  
  520.     if (Material==NULL)
  521.       return;
  522.       
  523.     if (Code==MENU_MATERIAL_TRANSPARENCY_00)
  524.       {
  525.         Material->Attributes &= ~MATERIAL_TRANSPARENT;
  526.       } // End if
  527.     else
  528.       {
  529.         Transparency = Code - MENU_MATERIAL_TRANSPARENCY;
  530.  
  531.         Material->Attributes |= MATERIAL_TRANSPARENT;
  532.         Material->Transparency = Transparency;  
  533.       } // End else  
  534.   } // End of OnTransparent for MAINFRAME
  535.  
  536. VOID MAINFRAME::OnFog ()
  537.   {
  538.     FOGDLG *FogDlg;
  539.  
  540.     if (TimerOn)
  541.       KillTimer ();
  542.       
  543.     FogDlg = new FOGDLG ();
  544.     if (FogDlg->Execute ( this, "FOG_DLG" ))
  545.       {
  546.         G3D->SetHazing ( FogDlg->IsFogOn (), FogDlg->GetFogScale(), HazeTable );
  547.         RGBCOLOR Col;
  548.         Col.Red = 255;
  549.         Col.Green = 255;
  550.         Col.Blue = 255;
  551.         BGColor = Pal->GetClosestColor ( Col );
  552.         if (FogDlg->IsFogOn())
  553.           UseBG = FALSE;
  554.         else
  555.           {
  556.             if (BGImage!=NULL)
  557.               UseBG = TRUE;
  558.             else
  559.               {
  560.                 RGBCOLOR Col;
  561.                 Col.Red = (BYTE)BGRed;
  562.                 Col.Green = (BYTE)BGGreen;
  563.                 Col.Blue = (BYTE)BGBlue;
  564.                 BGColor = Pal->GetClosestColor ( Col );  
  565.               } // End else  
  566.           } // End else  
  567.       } // End if
  568.       
  569.     if (TimerOn)
  570.       SetTimer (0);
  571.       
  572.     delete FogDlg;
  573.   } // End of OnFog for MAINFRAME
  574.  
  575. VOID MAINFRAME::OnLoadBG ()
  576.   {
  577.     if (TimerOn)
  578.       KillTimer ();
  579.  
  580.     if (BGImage==NULL)
  581.       BGImage = new IMAGE ( IMAGE_TOPDOWN );
  582.           
  583.     GUIFILEDIALOG *FileDialog;
  584.     FileDialog = new GUIFILEDIALOG ( FD_OPEN );
  585.     FileDialog->CreateExtensions ( 4 );
  586.     FileDialog->SetExtension ( 0, "*.BMP", "Windows BMP (*.BMP)" );
  587.     FileDialog->SetExtension ( 1, "*.GIF", "CompuServ GIF (*.GIF)" );
  588.     FileDialog->SetExtension ( 2, "*.PCX", "Z Soft PCX (*.PCX)" );
  589.     FileDialog->SetExtension ( 3, "*.*", "All files (*.*)" );
  590.  
  591.     LONG Result;    
  592.     Result = FileDialog->Execute ( this, "File Open" );
  593.     if (Result)
  594.       {
  595.         CHAR FileName[128];
  596.         FileDialog->GetFileName ( FileName );
  597.  
  598.         // Add Texture to this Material
  599.         RGBPALETTE *NewPal = new RGBPALETTE ();
  600.         if (Grafix.LoadImage ( FileName, BGImage, NewPal )==SUCCESS)
  601.           {
  602.             UseBG = TRUE;  
  603.             HDISPLAY hDisplay = GetDisplay ( hClient );  
  604.             Grafix.AdjustImageSize ( BGImage, Grafix.GetWidth(hDisplay), Grafix.GetHeight(hDisplay) );                                   
  605.             ReleaseDisplay ( hClient, hDisplay );
  606.  
  607.             if (Pal->IsIdentical(NewPal)!=TRUE)
  608.               {
  609.                 COLORTABLE *MatchTable = new COLORTABLE ();
  610.                 MatchTable->CopyPalette ( Pal );            
  611.                 MatchTable->CreateMatchTable ( NewPal );
  612.                 Grafix.ConvertImage ( BGImage, MatchTable );
  613.                 delete MatchTable;
  614.               } // End if
  615.           } // End if
  616.         else  
  617.           {
  618.             ShowMessageBox ( "Error", "Can not load this Image!", MB_OK );
  619.           } // End else
  620.         delete NewPal;  
  621.       } // End if
  622.  
  623.     if (TimerOn)
  624.       SetTimer ( 0 );
  625.     delete FileDialog;      
  626.   } // End of OnLoadBG for MAINFRAME
  627.  
  628. VOID MAINFRAME::OnBGStatic ()
  629.   {
  630.     BGCOLORDLG *BGColorDlg;
  631.  
  632.     if (TimerOn)
  633.       KillTimer ();
  634.       
  635.     BGColorDlg = new BGCOLORDLG ();
  636.     if (BGColorDlg->Execute ( this, "BGRGB_DLG" ))
  637.       {
  638.         if (BGImage!=NULL)
  639.           delete BGImage;
  640.         BGImage = NULL;
  641.         UseBG = FALSE;
  642.         RGBCOLOR Col;
  643.         BGColorDlg->GetRGB ( &Col );
  644.         BGRed = Col.Red;
  645.         BGGreen = Col.Green;
  646.         BGBlue = Col.Blue;
  647.         BGColor = Pal->GetClosestColor ( Col );  
  648.       } // End if
  649.       
  650.     if (TimerOn)
  651.       SetTimer (0);
  652.       
  653.     delete BGColorDlg;
  654.   } // End of OnBGStatic for MAINFRAME
  655.  
  656. VOID MAINFRAME::OnDepthCue ()
  657.   {
  658.     DEPTHDLG *DepthDlg;
  659.  
  660.     if (TimerOn)
  661.       KillTimer ();
  662.       
  663.     DepthDlg = new DEPTHDLG ();
  664.     if (DepthDlg->Execute ( this, "DEPTH_DLG" ))
  665.       {
  666.         G3D->SetDepthCueing ( DepthDlg->IsDepthCueOn (), DepthDlg->GetDepthCueScale() );  
  667.       } // End if
  668.       
  669.     if (TimerOn)
  670.       SetTimer (0);
  671.       
  672.     delete DepthDlg;
  673.   } // End of OnDepthCue for MAINFRAME
  674.   
  675. VOID MAINFRAME::OnRotation ( LONG Code )
  676.   {
  677.     switch (Code)
  678.       {
  679.         case MENU_ROTATION_X_INC :
  680.           ObjRotX += (float)1.0;
  681.           break;  
  682.         case MENU_ROTATION_X_DEC :
  683.           ObjRotX -= (float)1.0;
  684.           break;  
  685.         case MENU_ROTATION_X_STOP :
  686.           ObjRotX = (float)0;
  687.           break;
  688.           
  689.         case MENU_ROTATION_Y_INC :
  690.           ObjRotY += (float)1.0;
  691.           break;          
  692.         case MENU_ROTATION_Y_DEC :
  693.           ObjRotY -= (float)1.0;
  694.           break;  
  695.         case MENU_ROTATION_Y_STOP :
  696.           ObjRotY = (float)0;
  697.           break;
  698.           
  699.         case MENU_ROTATION_Z_INC :
  700.           ObjRotZ += (float)1.0;
  701.           break;  
  702.         case MENU_ROTATION_Z_DEC :
  703.           ObjRotZ -= (float)1.0;
  704.           break;  
  705.         case MENU_ROTATION_Z_STOP :
  706.           ObjRotZ = (float)0;
  707.           break;  
  708.       } // End switch
  709.   } // End of OnRotation for MAINFRAME
  710.  
  711. VOID MAINFRAME::OnAbout ()
  712.   {
  713.     if (TimerOn)
  714.       KillTimer ();
  715.       
  716.     ABOUTDLG *AboutDlg;
  717.     AboutDlg = new ABOUTDLG ();
  718.     AboutDlg->Execute ( this, "ABOUT_DLG" );
  719.     
  720.     if (TimerOn)
  721.       SetTimer (0);
  722.       
  723.     delete AboutDlg;  
  724.   } // End of OnAbout for MAINFRAME
  725.  
  726. LONG MAINFRAME::OnCreate ()
  727.   {
  728.     Menu->Load ( "MAIN_MENU" );
  729.     SetMenu ( Menu );
  730.  
  731.     if (Init3D()!=SUCCESS)
  732.       {
  733.         ShowMessageBox("Error Initializing 3D", "Error occured at initialization", MB_OK);
  734.         ExitApplication (-1);
  735.       } // End if
  736.     return 0;  
  737.   } // End of OnCreate for MAINFRAME
  738.  
  739. LONG MAINFRAME::OnCommand ( LONG Command )
  740.   {
  741.     switch (Command)
  742.       {
  743.         case MENU_FILE_OPEN :
  744.           OnFileLoad ();
  745.           break;  
  746.         case MENU_FILE_EXIT :
  747.           SendMessage ( hWindow, WM_CLOSE, 0, 0 );
  748.           break;
  749.  
  750.         case MENU_DETAIL_FACE_TEXTURE :
  751.         case MENU_DETAIL_FACE_SOLID :
  752.         case MENU_DETAIL_FACE_WIREFRAME :
  753.         case MENU_DETAIL_SHADE_GOURAUD :
  754.         case MENU_DETAIL_SHADE_FLAT :
  755.         case MENU_DETAIL_SHADE_NONE :
  756.           OnDetail ( Command );
  757.           break;
  758.                     
  759.         case MENU_MATERIAL_LOAD_STATIC :
  760.           OnLoadTextureStatic ();
  761.           break;  
  762.         case MENU_MATERIAL_LOAD_ANIMATED :          
  763.           OnLoadTextureAnimated ();
  764.           break;
  765.           
  766.         case MENU_MATERIAL_TRANSPARENCY_10 :          
  767.         case MENU_MATERIAL_TRANSPARENCY_20 :          
  768.         case MENU_MATERIAL_TRANSPARENCY_30 :          
  769.         case MENU_MATERIAL_TRANSPARENCY_40 :          
  770.         case MENU_MATERIAL_TRANSPARENCY_50 :          
  771.         case MENU_MATERIAL_TRANSPARENCY_60 :          
  772.         case MENU_MATERIAL_TRANSPARENCY_70 :          
  773.         case MENU_MATERIAL_TRANSPARENCY_80 :          
  774.         case MENU_MATERIAL_TRANSPARENCY_90 :          
  775.         case MENU_MATERIAL_TRANSPARENCY_00 :
  776.           OnTransparent ( Command );
  777.           break;
  778.  
  779.         case MENU_MATERIAL_AMBIENT :
  780.           OnAmbient ();
  781.           break;
  782.           
  783.         case MENU_ENVIRONMENT_BACKGROUND_LOAD :
  784.           OnLoadBG ();
  785.           break;  
  786.         case MENU_ENVIRONMENT_BACKGROUND_STATIC :
  787.           OnBGStatic ();
  788.           break;  
  789.         case MENU_ENVIRONMENT_DEPTH_CUE :
  790.           OnDepthCue ();
  791.           break;  
  792.         case MENU_ENVIRONMENT_FOG :
  793.           OnFog ();
  794.           break;
  795.  
  796.         case MENU_ROTATION_X_INC :
  797.         case MENU_ROTATION_X_DEC :
  798.         case MENU_ROTATION_X_STOP :
  799.         case MENU_ROTATION_Y_INC :
  800.         case MENU_ROTATION_Y_DEC :
  801.         case MENU_ROTATION_Y_STOP :
  802.         case MENU_ROTATION_Z_INC :
  803.         case MENU_ROTATION_Z_DEC :
  804.         case MENU_ROTATION_Z_STOP :
  805.           OnRotation ( Command );
  806.           break;
  807.         case MENU_HELP_ABOUT :
  808.           OnAbout ();
  809.           break;  
  810.       } // End switch  
  811.     return 0;  
  812.   } // End of OnCommand for MAINFRAME
  813.  
  814. LONG MAINFRAME::OnClose ()
  815.   {
  816.     if (TimerOn)      
  817.       KillTimer ();  
  818.       
  819.     if (ShowMessageBox("Exit Demo", "Exit this demo?", MB_OKCANCEL)==IDOK)
  820.       {
  821.         return 0;
  822.       } // End if
  823.       
  824.     if (TimerOn)
  825.       SetTimer (0);
  826.       
  827.     return SKIPDEFPROC;  
  828.   } // End of OnClose for MAINFRAME
  829.  
  830. VOID MAINFRAME::HandleInput ()
  831.   {
  832.     BOOLEAN IsShift;
  833.     IsShift = Input.IsKeyDown(SC_LSHIFT) || Input.IsKeyDown(SC_RSHIFT);
  834.     
  835.     float SpeedRatio = (float)1.0;
  836.     if (IsShift)
  837.       {
  838.         SpeedRatio = (float)2.0;  
  839.       } // End if
  840.     
  841.     COLLIDEDATA CollideList[5];
  842.     FLPVECTOR3D Position,EndPt;
  843.     FLPVECTOR3D Dir;
  844.  
  845.     Position = Camera->GetWorldPosition();
  846.     
  847.     if (Input.IsKeyDown(SC_RIGHT))
  848.       {
  849.         Camera->Rotate ( (float)0, (float)(-3*SpeedRatio), (float)0 );  
  850.       } // End if       
  851.     if (Input.IsKeyDown(SC_LEFT))
  852.       {
  853.         Camera->Rotate ( (float)0, (float)(3*SpeedRatio), (float)0 );  
  854.       } // End if
  855.     if (Input.IsKeyDown(SC_UP))
  856.       {
  857.         Camera->Rotate ( (float)(-3*SpeedRatio), (float)0, (float)0 );  
  858.       } // End if       
  859.     if (Input.IsKeyDown(SC_DOWN))
  860.       {
  861.         Camera->Rotate ( (float)(3*SpeedRatio), (float)0, (float)0 );  
  862.       } // End if
  863.  
  864.     LONG CollisionCount;
  865.       
  866.     if (Input.IsKeyDown(SC_A))
  867.       {
  868.         Dir.x = (float)0;
  869.         Dir.y = (float)0;
  870.         Dir.z = (float)(1*20);
  871.  
  872.         EndPt = G3D->ComputeNextPos ( Position, Camera->GetAngle(), Dir );
  873.         CollisionCount = G3D->CheckCollision ( Position, EndPt, CollideList, (LONG)5, 
  874.                                                                              (float)1.6, (float)10 );
  875.         if (CollisionCount==0)
  876.           Camera->Move ( EndPt.x-Position.x, EndPt.y-Position.y, EndPt.z-Position.z );
  877.       } // End if       
  878.     if (Input.IsKeyDown(SC_Z))
  879.       {
  880.         Dir.x = (float)0;
  881.         Dir.y = (float)0;
  882.         Dir.z = (float)(-1*20);
  883.  
  884.         EndPt = G3D->ComputeNextPos ( Position, Camera->GetAngle(), Dir );  
  885.         CollisionCount = G3D->CheckCollision ( Position, EndPt, CollideList, (LONG)5, 
  886.                                                                              (float)1.6, (float)10 );
  887.         if (CollisionCount==0)
  888.           Camera->Move ( EndPt.x-Position.x, EndPt.y-Position.y, EndPt.z-Position.z );
  889.       } // End if
  890.   } // End of HandleInput for MAINFRAME
  891.  
  892. LONG MAINFRAME::OnTimer ()
  893.   {
  894.     if (ObjectLoaded)
  895.       {
  896.         G3DMATERIALLIB *MaterialLib = G3D->GetMaterialLib();
  897.         ANIMIMAGE *Texture = MaterialLib->GetTexture ( 0 );
  898.  
  899.         if ((BGImage!=NULL)&&(UseBG))
  900.           {
  901.             Grafix.CopyImage ( BGImage, 0, 0, BGImage->GetWidth(), BGImage->GetHeight(),
  902.                                VScreen, 0, 0 );
  903.           } // End if
  904.         else
  905.           {
  906.             VScreen->Clear ( BGColor );
  907.           } // End else
  908.           
  909.         G3DOBJECT *Object = G3D->FindObjectByID ( 1 );
  910.         if (Object!=NULL)
  911.           {
  912.             Object->Rotate ( ObjRotX, ObjRotY, ObjRotZ );
  913.             if (AnimatedTexture)
  914.               {
  915.                 Texture->SetFrame ( CurAnimatedFrame );  
  916.                 CurAnimatedFrame++;
  917.                 if (CurAnimatedFrame>=NumAnimatedFrames)
  918.                   CurAnimatedFrame = 0;
  919.               } // End if
  920.           } // End if
  921.         HandleInput ();  
  922.         G3D->ShowView ( Camera );
  923.         HDISPLAY hDisplay = GetDisplay ( hClient );
  924.         Grafix.DisplayImage ( hDisplay, VScreen, 0, 0, VScreen->GetWidth(), VScreen->GetHeight(),
  925.                               0, 0 );
  926.         ReleaseDisplay ( hClient, hDisplay ); 
  927.       } // End if  
  928.     return 0;  
  929.   } // End of OnTimer for MAINFRAME
  930.  
  931. LONG MAINFRAME::OnPosChanging ( WINPOSCHANGE *WinPosChange )
  932.   {
  933.     LONG Wd;
  934.     Wd = WinPosChange->Width;
  935.     Wd = ((Wd+3)/4)*4;
  936.     WinPosChange->Width = Wd;  
  937.     return 0;  
  938.   } // End of OnPosChanging for MAINFRAME
  939.  
  940. LONG MAINFRAME::OnSize ( LONG Width, LONG Height )
  941.   {
  942.     if (Width&&Height)
  943.       {}  
  944.     if (Initialized)
  945.       {
  946.         HDISPLAY hDisplay = GetDisplay ( hClient );
  947.         Grafix.SetPalette ( hDisplay, Pal );  
  948.         VScreen->Create ( hDisplay, IMAGE_8BIT,
  949.                           Grafix.GetWidth(hDisplay), Grafix.GetHeight(hDisplay) );
  950.         G3D->SetDestination ( VScreen );
  951.         G3D->SetScreenCenter ( VScreen->GetWidth()/2, VScreen->GetHeight()/2 );
  952.         if (BGImage!=NULL)
  953.           {
  954.             Grafix.AdjustImageSize ( BGImage, Grafix.GetWidth(hDisplay), Grafix.GetHeight(hDisplay) );                                   
  955.           } // End if
  956.         ReleaseDisplay ( hClient, hDisplay ); 
  957.       } // End if  
  958.     return 0;  
  959.   } // End of OnWinPosChanging for MAINFRAME
  960.  
  961. LONG MAINFRAME::OnPaint ( HDISPLAY hDisplay )
  962.   {
  963.     Grafix.SetPalette ( hDisplay, Pal );  
  964.     return 0;      
  965.   } // End of OnPaint for MAINFRAME
  966.  
  967. //************************************
  968. //
  969. // Main Program
  970. //
  971. //************************************
  972.  
  973. MAINPROGRAM
  974.   BEGIN
  975.     MAINFRAME *MainFrame = new MAINFRAME ();
  976.     MainFrame->Create ( "Multi-Platform 3D Demo", WINPOS_DEFAULT, WINPOS_DEFAULT,
  977.                         WINPOS_DEFAULT, WINPOS_DEFAULT, GUI_DESKTOP );
  978.     DISPLAYDATA Data;
  979.     Data.UseDirectDraw = FALSE;
  980.     Data.hMainWindow = MainFrame->GetHandle ();
  981.  
  982.     GUIAPP DemoApp;
  983.     DemoApp.Run ( &Data, MainFrame );
  984.     return 0;
  985.   END // End of Main Program
  986.  
  987.   
  988.   
  989.