home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 19 / AACD19.BIN / AACD / Programming / MCC_GLArea / MCC_GLArea_Dev / GLArea_Demo / Main.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-12-28  |  13.0 KB  |  365 lines

  1. /*-------------------------------------------------------------------------------
  2.   Main.c (GLArea_Demo)
  3.   Version 1.4
  4.   Date: 26.12.2000
  5.   Author: Bodmer Stephan [sbodmer@lsi-media.ch]
  6.   Note: MUI Demo application for testing GLArea.mcc/ImageDB.mcc  objects
  7.     GCC (EGCS) port *ONLY*
  8. ---------------------------------------------------------------------------------*/
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <math.h>
  12.  
  13. #include <exec/exec.h>
  14. #include <dos/dosextens.h>
  15. #include <dos/dostags.h>
  16. #include <intuition/intuition.h>
  17. #include <utility/tagitem.h>
  18. #include <libraries/mui.h>
  19.  
  20. #include <proto/graphics.h>
  21. #include <proto/asl.h>
  22. #include <proto/dos.h>
  23. #include <proto/alib.h>
  24. #include <proto/dos.h>
  25. #include <proto/muimaster.h>
  26.  
  27. #include <mui/GLArea_mcc.h>
  28. #include <mui/ImageDB_mcc.h>
  29.  
  30. #include "Main.h"
  31. #include "GLFunctions.h"
  32.  
  33. #include "MUI_GLArea_Demo.h"
  34.  
  35.  
  36. extern struct ExecBase *SysBase;
  37. struct Library *MUIMasterBase=NULL;
  38.  
  39. //--- GNU C specific
  40. int __openliberror;
  41. const unsigned long __stack=300000;
  42.  
  43. //--- Custom Shared variables (between GLArea objects used in the drawfuntions)
  44. struct GLImage *groundimage=NULL,*backimage=NULL,*objimage=NULL;
  45. struct GLTex *groundtex=NULL,*backtex=NULL,*objtex=NULL;
  46.  
  47. //--- MUI objects
  48. struct ObjApp *MyApp=NULL;
  49.  
  50. //--- Globals
  51. int object=CUBE;
  52. int rendering=SOLID;
  53. // ULONG displayid=0;
  54. // int displaydepth=16;
  55. // struct Screen *RenderScreen=NULL;
  56. ULONG glarea_version=0,glarea_revision=0,imdb_version=0,imdb_revision=0;
  57.  
  58. char dir[255],name[255],filename[255];
  59.  
  60. /*
  61. //--- Full screen option NOT YET USED
  62. //----------------- Return the display mode name -------------------------
  63. void ConvertDisplayID (char *st,int id) {
  64.    struct NameInfo ni;
  65.    if (GetDisplayInfoData(NULL,
  66.               (UBYTE *) &ni,
  67.               sizeof(struct NameInfo),
  68.               DTAG_NAME,
  69.               (ULONG) id)) {
  70.       strncpy(st,(char *) ni.Name,255);
  71.    };
  72. }
  73.  
  74.  
  75. ULONG StartScreen(Object *me __asm("a0"), Object *obj __asm("a2"), struct TagItem *tags __asm("a1")) {
  76.     // puts("StartScreen");
  77.     tags[0].ti_Tag=ASLSM_DoDepth;tags[0].ti_Data=TRUE;
  78.     tags[1].ti_Tag=ASLSM_InitialDisplayID;tags[1].ti_Data=displayid;
  79.     tags[2].ti_Tag=ASLSM_InitialDisplayDepth;tags[2].ti_Data=displaydepth;
  80.     tags[3].ti_Tag=TAG_DONE;tags[3].ti_Data=0L;
  81.  
  82.     return TRUE;
  83. }
  84.  
  85. ULONG StopScreen(Object *me __asm("a0"), Object *obj __asm("a2"), struct ScreenModeRequester *req __asm("a1")) {
  86.     char idname[255];
  87.  
  88.     // puts("StopScreen");
  89.     if (req==NULL) {
  90.     // puts("Req is NULL");
  91.     return 0;
  92.     };
  93.     displayid=(int) req->sm_DisplayID;
  94.     displaydepth=(int) req->sm_DisplayDepth;
  95.     // printf("DisplayID:%x\n",settings.displayID);
  96.     ConvertDisplayID(idname,displayid);
  97.     // printf("Name:%s\n",idname);
  98.     SetAttrs((Object *) MyApp->STR_PA_ScreenMode, MUIA_String_Contents, idname);
  99.     return TRUE;
  100. }
  101. */
  102.  
  103. //--- Open a simple ASL file requster for texture loading
  104. BOOL OpenASL (char *title, char *sdir, char *sname , char *filename, char *dir, char *name) {
  105.     BOOL rep=FALSE;
  106.     struct FileRequester *fr=NULL;
  107.     // puts("In OpenASL");
  108.  
  109.     struct TagItem FRTags[] = { {ASL_Hail, (ULONG) title},
  110.                 {ASL_Dir, (ULONG) sdir},
  111.                 {ASL_File, (ULONG) sname},
  112.                 {TAG_DONE} };
  113.     fr=AllocFileRequest();
  114.     rep=(BOOL) AslRequest(fr,FRTags);
  115.     // printf("rep=%d\n",rep);
  116.     // puts ("ok");
  117.     if (rep) {
  118.     strcpy(name,fr->rf_File);
  119.     strcpy(dir,fr->rf_Dir);
  120.     strcpy(filename,fr->rf_Dir);
  121.     AddPart(filename,name,255);
  122.     };
  123.     // printf("Load File Found:%s\n",filename);
  124.     FreeFileRequest(fr);
  125.     return rep;
  126. }
  127.  
  128.  
  129. /*-------------------------
  130.   MISC CALLBACKS
  131. --------------------------*/
  132. void MenuCmd (Object *obj) {
  133.     // puts("In SpecialCmd");
  134.     ULONG store=0;
  135.     BOOL rep=FALSE;
  136.     char *objname=NULL;
  137.  
  138.     struct GLImage *glimage=NULL;
  139.  
  140.     if (obj==MyApp->MNAbout) {
  141.     char temp[1000];
  142.     sprintf(temp,"\033cGLArea Demo\n\n"
  143.              "Version 1.4 (" __DATE__ ")\n"
  144.              "Written by Bodmer Stephan [sbodmer@lsi-media.ch]\n\n"
  145.              "GLArea.mcc V%d.%d & ImageDB.mcc V%d.%d\n"
  146.              "are Copyright 2000 by LSI Media SàRL\n"
  147.              "[http://www.lsi-media.ch]\n\n"
  148.              "These classes are freeware for non-commercial use\n\n"
  149.              "ImageDB.mcc uses guigfx.library copyright by Timm S. Mueller\n\n"
  150.              "Pawn object created by Stephan Bielmann\n"
  151.              "OpenGL code generated by software with VRMLEditor\n",glarea_version,glarea_revision,imdb_version,imdb_revision);
  152.     MUI_Request (MyApp->App,MyApp->WI_Main,0,"About","Ok",temp);
  153.     }
  154.     else if (obj==MyApp->MNAboutMUI) {
  155.      DoMethod((Object *) MyApp->App, MUIM_Application_AboutMUI, MyApp->WI_Main);
  156.     }
  157.     else if (obj==MyApp->MNOpen) {
  158.     rep=OpenASL("Load an Image",dir,name,filename,dir,name);
  159.     if (rep) {
  160.         char mini[255];
  161.  
  162.         //--- Load the texture via ImageDB.mcc
  163.         glimage=DoMethod((Object *) MyApp->IMDB_ImageDataBase, MUIM_ImageDB_LoadImage, filename, name, 128, 128, MUIF_ImageDB_FlipY);
  164.         //--- create a Stamp version of the texure for display purpose
  165.         sprintf(mini,"%s_mini",name);
  166.         DoMethod((Object *) MyApp->IMDB_ImageDataBase, MUIM_ImageDB_ScaleImage, name, mini, 60, 40, 0);
  167.         DoMethod((Object *) MyApp->GLAR_SimpleAnimation, MUIM_GLArea_Redraw);
  168.  
  169.         //--- retreive the pointer to the name of the image (needed to insert in the MUI listview)
  170.         //--- BTW it's the variable "name"
  171.         objname=(char *) DoMethod((Object *) MyApp->IMDB_ImageDataBase, MUIM_ImageDB_GetName, glimage);
  172.         DoMethod((Object *) MyApp->LV_Background, MUIM_List_InsertSingle, objname, MUIV_List_Insert_Bottom);
  173.         DoMethod((Object *) MyApp->LV_Ground, MUIM_List_InsertSingle, objname, MUIV_List_Insert_Bottom);
  174.         DoMethod((Object *) MyApp->LV_Texture, MUIM_List_InsertSingle, objname, MUIV_List_Insert_Bottom);
  175.  
  176.     };
  177.     };
  178. }
  179.  
  180. //--- Simple animation (left GLArea object) events
  181. void SACmd (Object *obj) {
  182.     ULONG store=0;
  183.  
  184.     if (obj==MyApp->CY_SAObject) {
  185.     DoMethod((Object *) MyApp->GLAR_SimpleAnimation, MUIM_GLArea_Break);
  186.     GetAttr(MUIA_Cycle_Active, (Object *) MyApp->CY_SAObject, &store);
  187.     object=(int) store;
  188.     DoMethod((Object *) MyApp->GLAR_SimpleAnimation, MUIM_GLArea_Redraw);
  189.     DoMethod((Object *) MyApp->GLAR_MouseMove, MUIM_GLArea_Redraw);
  190.     }
  191.     else if (obj==MyApp->CY_SARendering) {
  192.     DoMethod((Object *) MyApp->GLAR_SimpleAnimation, MUIM_GLArea_Break);
  193.     GetAttr(MUIA_Cycle_Active, (Object *) MyApp->CY_SARendering, &store);
  194.     rendering=(int) store;
  195.     DoMethod((Object *) MyApp->GLAR_SimpleAnimation, MUIM_GLArea_Redraw);
  196.     DoMethod((Object *) MyApp->GLAR_MouseMove, MUIM_GLArea_Redraw);
  197.     }
  198.     //--- Texture previews
  199.     else if (obj==MyApp->LV_Background) {
  200.     char mini[255];
  201.     DoMethod((Object *) MyApp->LV_Background,MUIM_List_GetEntry, MUIV_List_GetEntry_Active, &store);
  202.     SetAttrs((Object *) MyApp->STR_PO_Background, MUIA_String_Contents, store);
  203.     //--- Get the real texture
  204.     backtex=(struct GLImage *) DoMethod((Object *) MyApp->IMDB_ImageDataBase, MUIM_ImageDB_GetImage, (char *) store);
  205.     //--- Get the Stamp version
  206.     sprintf(mini,"%s_mini",store);
  207.     backimage=(struct GLImage *) DoMethod((Object *) MyApp->IMDB_ImageDataBase, MUIM_ImageDB_GetImage, mini);
  208.     DoMethod((Object *) MyApp->GLAR_Background, MUIM_GLArea_Redraw);
  209.     }
  210.     else if (obj==MyApp->LV_Ground) {
  211.     char mini[255];
  212.     DoMethod((Object *) MyApp->LV_Ground,MUIM_List_GetEntry, MUIV_List_GetEntry_Active, &store);
  213.     SetAttrs((Object *) MyApp->STR_PO_Ground, MUIA_String_Contents, store);
  214.     groundtex=(struct GLImage *) DoMethod((Object *) MyApp->IMDB_ImageDataBase, MUIM_ImageDB_GetImage, (char *) store);
  215.     sprintf(mini,"%s_mini",store);
  216.     groundimage=(struct GLImage *) DoMethod((Object *) MyApp->IMDB_ImageDataBase, MUIM_ImageDB_GetImage, mini);
  217.     DoMethod((Object *) MyApp->GLAR_Ground, MUIM_GLArea_Redraw);
  218.     }
  219.     else if (obj==MyApp->LV_Texture) {
  220.     char mini[255];
  221.     DoMethod((Object *) MyApp->LV_Texture,MUIM_List_GetEntry, MUIV_List_GetEntry_Active, &store);
  222.     SetAttrs((Object *) MyApp->STR_PO_Texture, MUIA_String_Contents, store);
  223.     objtex=(struct GLImage *) DoMethod((Object *) MyApp->IMDB_ImageDataBase, MUIM_ImageDB_GetImage, (char *) store);
  224.     sprintf(mini,"%s_mini",store);
  225.     objimage=(struct GLImage *) DoMethod((Object *) MyApp->IMDB_ImageDataBase, MUIM_ImageDB_GetImage, mini);
  226.     DoMethod((Object *) MyApp->GLAR_Texture, MUIM_GLArea_Redraw);
  227.     DoMethod((Object *) MyApp->GLAR_MouseMove, MUIM_GLArea_Redraw);
  228.     };
  229. }
  230.  
  231. //--- Long rendering events
  232. void LRCmd (Object *obj) {
  233.     ULONG store=0;
  234.  
  235.     if (obj==MyApp->BT_LRStart) {
  236.     //--- Set the drawing function
  237.     SetAttrs((Object *) MyApp->GLAR_LongRendering, MUIA_GLArea_DrawFunc, DrawLongRendering);
  238.     //--- Start drawing
  239.     DoMethod((Object *) MyApp->GLAR_LongRendering, MUIM_GLArea_Init);
  240.     DoMethod((Object *) MyApp->GLAR_LongRendering, MUIM_GLArea_Redraw);
  241.     //--- Set drawing function to NULL to prevent automatic drawing when window is resized
  242.     SetAttrs((Object *) MyApp->GLAR_LongRendering, MUIA_GLArea_DrawFunc, NULL);
  243.     }
  244.     else if (obj==MyApp->BT_LRBreak) {
  245.     //--- Only works in Threaded mode ;^)
  246.     DoMethod((Object *) MyApp->GLAR_LongRendering, MUIM_GLArea_Break);
  247.     }
  248.     else if (obj==MyApp->CH_LRThreaded) {
  249.     GetAttr(MUIA_Selected, (Object *) MyApp->CH_LRThreaded, &store);
  250.     SetAttrs((Object *) MyApp->GLAR_LongRendering, MUIA_GLArea_Threaded ,(BOOL) store);
  251.     }
  252.     else if (obj==MyApp->CH_LRBuffered) {
  253.     GetAttr(MUIA_Selected, (Object *) MyApp->CH_LRBuffered, &store);
  254.     DoMethod((Object *) MyApp->GLAR_LongRendering, MUIM_GLArea_Break);
  255.     SetAttrs((Object *) MyApp->GLAR_LongRendering, MUIA_GLArea_Buffered, (BOOL) store);
  256.     //--- I Need to destroy and recreate the GLContext when switching to non bufferer mode
  257.     SetAttrs((Object *) MyApp->WI_Main, MUIA_Window_Open, FALSE);
  258.     SetAttrs((Object *) MyApp->WI_Main, MUIA_Window_Open, TRUE);
  259.     // DoMethod((Object *) MyApp->GLAR_LongRendering, MUIM_Hide);
  260.     // DoMethod((Object *) MyApp->GLAR_LongRendering, MUIM_Show);
  261.     // DoMethod((Object *) MyApp->GLAR_LongRendering, MUIM_GLArea_Redraw);
  262.     };
  263. }
  264.  
  265. /*
  266. void FSCmd (Object *obj) {
  267.     if (obj==MyApp->BT_FullScreen) {
  268.     RenderScreen = OpenScreenTags (NULL,
  269.                     SA_DisplayID, (ULONG) displayid,
  270.                     SA_Depth, displaydepth,
  271.                     // SA_Type, PUBLICSCREEN,
  272.                     SA_SharePens,TRUE,
  273.                     // SA_Title, "OpenGL render Screen",
  274.                     TAG_DONE);
  275.     SetAttrs((Object *) MyApp->WI_FullScreen, MUIA_Window_Screen, RenderScreen);
  276.     SetAttrs((Object *) MyApp->WI_FullScreen, MUIA_Window_Width, RenderScreen->Width);
  277.     SetAttrs((Object *) MyApp->WI_FullScreen, MUIA_Window_Height, RenderScreen->Height);
  278.     SetAttrs((Object *) MyApp->WI_FullScreen, MUIA_Window_Open, TRUE);
  279.     }
  280.     else if (obj==MyApp->WI_FullScreen) {
  281.     SetAttrs((Object *) MyApp->WI_FullScreen, MUIA_Window_Open, FALSE);
  282.     CloseScreen (RenderScreen);
  283.     };
  284. }
  285. */
  286. //------------------------------------------------------------------------------------------------
  287. //-------------------------------------------MAIN PART--------------------------------------------
  288. //------------------------------------------------------------------------------------------------
  289.  
  290. /*------------------
  291.    Init functions
  292. ------------------*/
  293. void StartUp() {
  294.     //--- Get Workbench mode id
  295.     // char idname[255];
  296.     // struct Screen *wb=NULL;
  297.     ULONG store=0;
  298.  
  299.     /*
  300.     wb=LockPubScreen(NULL);
  301.     displayid= GetVPModeID( &wb->ViewPort);
  302.     displaydepth=wb->BitMap.Depth;
  303.     UnlockPubScreen(NULL,wb);
  304.     */
  305.  
  306.     //--- Check if ImageDB.mcc object is created
  307.     if (MyApp->IMDB_ImageDataBase==NULL) {
  308.     char temp[]={"If you want to have custom texture mapping enabled\n"
  309.              "you have to install ImageDB.mcc and guigfx.library !\n"};
  310.     SetAttrs((Object *) MyApp->MNOpen, MUIA_Menuitem_Enabled, FALSE);
  311.     SetAttrs((Object *) MyApp->PO_Background,MUIA_Disabled,TRUE);
  312.     SetAttrs((Object *) MyApp->PO_Ground,MUIA_Disabled,TRUE);
  313.     SetAttrs((Object *) MyApp->PO_Texture,MUIA_Disabled,TRUE);
  314.     imdb_version=0;
  315.     imdb_revision=0;
  316.     MUI_Request (MyApp->App,MyApp->WI_Main,0,"About","Ok",temp);
  317.     } else {
  318.     GetAttr(MUIA_Version, (Object *) MyApp->IMDB_ImageDataBase,&imdb_version);
  319.     GetAttr(MUIA_Revision, (Object *) MyApp->IMDB_ImageDataBase,&imdb_revision);
  320.     };
  321.     // ConvertDisplayID(idname,displayid);
  322.     // SetAttrs((Object *) MyApp->STR_PA_ScreenMode, MUIA_String_Contents, idname);
  323.     GetAttr(MUIA_Version, (Object *) MyApp->GLAR_SimpleAnimation,&glarea_version);
  324.     GetAttr(MUIA_Revision, (Object *) MyApp->GLAR_SimpleAnimation,&glarea_revision);
  325. }
  326.  
  327. void ClearAll() {
  328.     if (MUIMasterBase) CloseLibrary(MUIMasterBase);
  329. }
  330.  
  331. /*-----------------------------
  332.   ------MAIN FUNCTIONS ---------
  333.   -----------------------------*/
  334. int main(int argc, char **argv) {
  335.     ULONG sig=0,store;
  336.     
  337.     MUIMasterBase=(struct Library *) OpenLibrary ((UBYTE*)MUIMASTER_NAME,MUIMASTER_VLATEST);
  338.     if (MUIMasterBase==NULL) {
  339.     puts ("Can't open muimaster.library");
  340.     ClearAll();
  341.     return 1;
  342.     };
  343.  
  344.     //---  Creation of MUI Application
  345.     MyApp=CreateApp();
  346.     if (MyApp) {
  347.     StartUp();
  348.     //-- Main loop
  349.     while (DoMethod((Object *) MyApp->App,MUIM_Application_NewInput,&sig)!=MUIV_Application_ReturnID_Quit) {
  350.         if (sig) {
  351.         sig = Wait(sig | SIGBREAKF_CTRL_C);
  352.         if (sig & SIGBREAKF_CTRL_C) break;
  353.         };
  354.     }; // end while
  355.     DisposeApp(MyApp);
  356.     }
  357.     else {
  358.     MUI_Request (NULL,NULL,0,"MUI Error","Ok","Can't create MUI Application!!!\n"
  359.                           "Do you have installed GLArea.mcc ?");
  360.     };
  361.     ClearAll();
  362.     return 0;
  363. }
  364.  
  365.