changeset 8:b3d6670c4324

Use new resource management system.
author Matti Hamalainen <ccr@tnsp.org>
date Sat, 29 Sep 2012 05:31:17 +0300
parents 2ff53bcfe366
children ca2daec08204
files krapula.c
diffstat 1 files changed, 161 insertions(+), 94 deletions(-) [+]
line wrap: on
line diff
--- a/krapula.c	Fri Sep 28 10:59:05 2012 +0300
+++ b/krapula.c	Sat Sep 29 05:31:17 2012 +0300
@@ -13,29 +13,6 @@
 
 #define DM_COLORS (256)
 
-static BOOL dmDoLoadImage(SDL_Surface **img, const char *fname)
-{
-    DMResource *file = dmf_open(fname);
-    if (file == NULL)
-        return FALSE;
-
-    if ((*img = dmLoadImage(file)) == NULL)
-    {
-        dmf_close(file);
-        return FALSE;
-    }
-
-    dmf_close(file);
-    return TRUE;
-}
-
-#define LOADIMAGE(img, fname) \
-    do { \
-        if (!dmDoLoadImage(&(img), fname)) \
-            goto error_exit; \
-    } while (0)
-
-
 
 typedef struct
 {
@@ -437,7 +414,7 @@
 }
 
 
-void dmAudioCallback(void *userdata, Uint8 *stream, int len)
+void engineAudioCallback(void *userdata, Uint8 *stream, int len)
 {
     JSSMixer *d = (JSSMixer *) userdata;
 
@@ -484,15 +461,11 @@
 const int ncredits = sizeof(credits) / sizeof(credits[0]);
 
 
+
+
 DMEngineData engine;
 DMFrameData frame;
 
-SDL_Surface *nosfe[NOSFE_MAX - NOSFE_MIN + 1];
-
-SDL_Surface *logobg, *logolayer1, *logolayer2,
-            *anciat, *gay, *ruutu, *greets;
-
-
 int engineGetTick()
 {
     return (frame.startTime - engine.startTime) + DEBUG * 1000;
@@ -525,6 +498,86 @@
 int dmScaledBlitSurface32to32TransparentX(SDL_Surface *src, const int x0, const int y0, const int dwidth, const int dheight, SDL_Surface *dst);
 
 
+int engineResImageLoad(DMResource *res)
+{
+    SDL_Surface *img = dmLoadImage(res);
+    if (res != NULL)
+    {
+        res->rdata = img;
+        return DMERR_OK;
+    }
+    else
+        return dmferror(res);
+}
+
+void engineResImageFree(DMResource *res)
+{
+    SDL_FreeSurface((SDL_Surface *)res->rdata);
+}
+
+int engineResModuleLoad(DMResource *res)
+{
+    return jssLoadXM(res, (JSSModule **) &(res->rdata));
+}
+
+void engineResModuleFree(DMResource *res)
+{
+    jssFreeModule((JSSModule *) res->rdata);
+}
+
+
+static DMResourceDataOps engineResImage =
+{
+    engineResImageLoad,
+    engineResImageFree
+};
+
+static DMResourceDataOps engineResModule =
+{
+    engineResModuleLoad,
+    engineResModuleFree
+};
+
+
+int engineClassifier(DMResource *res)
+{
+    DMResourceDataOps *rops = NULL;
+    char *fext;
+
+    if (res == NULL)
+        return DMERR_NULLPTR;
+    
+    if ((fext = strrchr(res->filename, '.')) != NULL)
+    {
+        if (strcasecmp(fext, ".png") == 0 || strcasecmp(fext, ".jpg") == 0)
+            rops = &engineResImage;
+        else
+        if (strcasecmp(fext, ".xm") == 0 || strcasecmp(fext, ".jmod") == 0)
+            rops = &engineResModule;
+    }
+    
+    res->rops = rops;
+    
+    return DMERR_OK;
+}
+
+
+void *engineGetResource(const char *name)
+{
+    DMResource *res = dmres_find(name);
+    if (res != NULL && res->rdata != NULL)
+        return res->rdata;
+    else
+    {
+        dmError("Could not find resource '%s'.\n", name);
+        return NULL;
+    }
+}
+
+
+#define engineGetResImage(name) (SDL_Surface *) engineGetResource(name)
+#define engineGetResModule(name) (JSSModule *) engineGetResource(name)
+
 
 int main(int argc, char *argv[])
 {
@@ -532,8 +585,7 @@
     JSSModule *mod = NULL;
     JSSMixer *dev = NULL;
     JSSPlayer *plr = NULL;
-    int err, i;
-    DMResource *tfile;
+    int err, i, loaded, total;
     SDL_AudioSpec *a_desired = NULL, *a_obtained = NULL;
 
     memset(&frame, 0, sizeof(frame));
@@ -549,61 +601,14 @@
     dmPrint(0, "TNSP PIERUPASKA engine 2012 'passeli professional' loading.\n");
 
     // Open packfs
-    if ((err = dmres_init("orvellys.dat", NULL, DRF_USE_PACK)) != DMERR_OK)
+    if ((err = dmres_init("orvellys.dat", NULL, DRF_USE_PACK | DRF_PRELOAD_RES, engineClassifier)) != DMERR_OK)
     {
-        dmError("Could not initialize PACKFS: %d, %s.\n", err, dmErrorStr(err));
+        dmError("Could not initialize resource manager: %d, %s.\n", err, dmErrorStr(err));
         goto error_exit;
     }
 
-    dmMsg(0, "miniJSS audio kyrpe XD\n");
     jssInit();
 
-
-    // Dataa
-    dmPrint(0, "cachetaan motion jpeg videota (blz wait) ..");
-    for (i = 0; i < NOSFE_MAX; i++)
-    {
-        char fname[64];
-        snprintf(fname, sizeof(fname), "%08d.jpg", NOSFE_MIN + i);
-        dmPrint(0, ".");
-        
-        if (!dmDoLoadImage(&nosfe[i], fname))
-        {
-            dmError("Error uncompressing motion jpeg video.\n");
-            goto error_exit;
-        }
-    }
-    dmPrint(0,"ok\n");
-
-    dmPrint(0, "ogei, loput resurssit ..");
-    LOADIMAGE(logobg, "logobg.png");
-    LOADIMAGE(logolayer1, "logolayer1.png");
-    LOADIMAGE(logolayer2, "logolayer2.png");
-    LOADIMAGE(anciat, "anciat.png");
-    LOADIMAGE(gay, "gay.png");
-    LOADIMAGE(ruutu, "ruutu.png");
-    LOADIMAGE(greets, "greetings.png");
-
-    for (i = 0; i < ncredits; i++)
-        LOADIMAGE(credits[i].img, credits[i].filename);
-    
-    dmPrint(0, "joo\n");
-    
-    if ((tfile = dmf_open("krapula.xm")) == NULL)
-    {
-        dmError("EI VOINU MUSSIIKKIA LADATA!!!\n");
-        goto error_exit;
-    }
-    
-    err = jssLoadXM(tfile, &mod);
-    dmf_close(tfile);
-    if (err != DMERR_OK)
-    {
-        dmError("Joasdfok XM motuuli ei?? %d\n", err);
-        goto error_exit;
-    }
-
-
     // Initialize SDL components
     if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER) != 0)
     {
@@ -622,7 +627,7 @@
         return 3;
     }
 
-    a_desired->freq     = 48000;
+    a_desired->freq     = 44100;
     a_desired->format   = AUDIO_S16SYS;
     a_desired->channels = 2;
 
@@ -637,7 +642,7 @@
     }
 
     a_desired->samples  = 16*1024;
-    a_desired->callback = dmAudioCallback;
+    a_desired->callback = engineAudioCallback;
     a_desired->userdata = (void *) dev;
 
     /* Open the audio device */
@@ -670,33 +675,79 @@
         goto error_exit;
     }
 
-    /* Set callback, init module */
-    jvmSetCallback(dev, jmpExec, plr);
-    jmpSetModule(plr, mod);
-    jmpPlayOrder(plr, 0);
-    jvmSetGlobalVol(dev, 55);
-    
+
     // Joo
     if (!dmInitializeVideo(&engine.screen))
         goto error_exit;
 
     SDL_WM_SetCaption(dmProgDesc, dmProgName);
 
+
+    // Load resources
+    err = dmres_preload(TRUE, &loaded, &total);
+    while ((err = dmres_preload(FALSE, &loaded, &total)) == DMERR_PROGRESS)
+    {
+        if (total > 0 && (loaded % 2) == 0)
+        {
+            if (SDL_MUSTLOCK(engine.screen) != 0 && SDL_LockSurface(engine.screen) != 0)
+            {
+                dmError("Can't lock surface.\n");
+                goto error_exit;
+            }
+            
+            dmClearSurface(engine.screen, dmMapRGBA(engine.screen, 0,0,0,0));
+
+            dmFillRect(engine.screen, 50, 220, 550, 240, dmMapRGB(engine.screen, 255,255,255));
+            dmFillRect(engine.screen, 51, 221, 549, 239, dmMapRGB(engine.screen, 0,0,0));
+
+            if (total > 0)
+            {
+                dmFillRect(engine.screen, 53, 223,
+                    53 + (547 - 53) * (float) loaded / (float) total,
+                    237, dmMapRGB(engine.screen, 200,200,200));
+            }
+
+            // Flip screen
+            if (SDL_MUSTLOCK(engine.screen) != 0)
+                SDL_UnlockSurface(engine.screen);
+
+            SDL_Flip(engine.screen);
+        }
+    }
+    if (err != DMERR_OK)
+    {
+        dmError("Error loading resources, %d: %s.\n",
+            err, dmErrorStr(err));
+        goto error_exit;
+    }
+
     // efut
     dmPerlinInit();
+    SDL_Surface *nosfe[NOSFE_MAX - NOSFE_MIN + 1];
+    for (i = 0; i < NOSFE_MAX; i++)
+    {
+        char fname[64];
+        snprintf(fname, sizeof(fname), "%08d.jpg", NOSFE_MIN + i);
+        nosfe[i] = engineGetResImage(fname);
+    }
+
+    for (i = 0; i < ncredits; i++)
+        credits[i].img = engineGetResImage(credits[i].filename);
 
     SDL_Surface *bmap = SDL_CreateRGBSurface(SDL_SWSURFACE, QWIDTH, QHEIGHT, 8, 0, 0, 0, 0);
 
+    /* Set callback, init module */
+    jvmSetCallback(dev, jmpExec, plr);
+    jmpSetModule(plr, engineGetResModule("krapula.xm"));
+    jmpPlayOrder(plr, 0);
+    jvmSetGlobalVol(dev, 55);
+    SDL_PauseAudio(0);
 
-    dmMsg(0, "We are go.\n");
-    SDL_PauseAudio(0);
 
     engine.startTime = SDL_GetTicks();
 
-
     while (!engine.exitFlag)
     {
-        
         while (SDL_PollEvent(&engine.event))
         switch (engine.event.type)
         {
@@ -748,6 +799,7 @@
 
         if (t < 5)
         {
+            SDL_Surface *anciat;
             int dt = engineGetTime(0);
             static DMLerpContext lerpX, lerpY, lerpD;
             static DMScaledBlitFunc nblit;
@@ -755,6 +807,7 @@
             static BOOL nollattu = FALSE;
             if (!nollattu)
             {
+                anciat = engineGetResImage("anciat.png");
                 nblit = dmGetScaledBlitFunc(bmap->format, engine.screen->format, DMD_NONE);
                 dmMakePalette(bmap);
                 dmLerpInit(&lerpX, 0, QWIDTH, 5000);
@@ -773,6 +826,7 @@
         else
         if (t < 10)
         {
+            SDL_Surface *logobg, *logolayer1, *logolayer2;
             int dt = engineGetTime(5);
             static DMScaledBlitFunc nblit, kblit;
             static DMLerpContext lerpD;
@@ -780,6 +834,10 @@
 
             if (!nollattu)
             {
+                logobg = engineGetResImage("logobg.png");
+                logolayer1 = engineGetResImage("logolayer1.png");
+                logolayer2 = engineGetResImage("logolayer2.png");
+
                 nblit = dmGetScaledBlitFunc(logobg->format, engine.screen->format, DMD_TRANSPARENT);
                 kblit = dmGetScaledBlitFunc(logobg->format, engine.screen->format, DMD_NONE);
                 dmLerpInit(&lerpD, 0.01, 500, 10000);
@@ -802,6 +860,7 @@
         else
         if (t < 20)
         {
+            SDL_Surface *gay, *logobg;
             int dt = engineGetTime(10);
             static DMLerpContext lerpX, lerpY, lerpD;
             static DMScaledBlitFunc nblit, kblit;
@@ -811,6 +870,8 @@
 
             if (!nollattu)
             {
+                gay = engineGetResImage("gay.png");
+                logobg = engineGetResImage("logobg.png");
                 nblit = dmGetScaledBlitFunc(bmap->format, engine.screen->format, DMD_NONE);
                 kblit = dmGetScaledBlitFunc(logobg->format, engine.screen->format, DMD_TRANSPARENT);
                 dmMakePalette(bmap);
@@ -838,6 +899,7 @@
         else
         if (t < 45)
         {
+            SDL_Surface *ruutu;
             static int currState, currCredit, creditStartTime;
             static DMLerpContext lerpX, lerpY, lerpZ;
             static DMScaledBlitFunc nblit, kblit;
@@ -845,6 +907,7 @@
             int currFrame = engineGetTime(20) * 15 / 1000;
             if (!nollattu)
             {
+                ruutu = engineGetResImage("ruutu.png");
                 dmClearSurface(ruutu, dmMapRGBA(ruutu, 0,0,0,0));
                 nblit = dmGetScaledBlitFunc(nosfe[0]->format, engine.screen->format, DMD_NONE);
                 kblit = dmGetScaledBlitFunc(credits[0].img->format, engine.screen->format, DMD_TRANSPARENT);
@@ -939,6 +1002,7 @@
         else
         if (t < 60)
         {
+            SDL_Surface *logobg, *greets;
             int dt = engineGetTime(45);
             static DMScaledBlitFunc nblit, kblit;
             static DMLerpContext lerpD;
@@ -946,6 +1010,8 @@
 
             if (!nollattu)
             {
+                logobg = engineGetResImage("logobg.png");
+                greets = engineGetResImage("greetings.png");
                 nblit = dmGetScaledBlitFunc(logobg->format, engine.screen->format, DMD_TRANSPARENT);
                 kblit = dmGetScaledBlitFunc(logobg->format, engine.screen->format, DMD_NONE);
                 dmLerpInit(&lerpD, 0.01, 500, 10000);
@@ -969,8 +1035,9 @@
 
         SDL_Flip(engine.screen);
         SDL_Delay(20);
+
+        // Get frame time, etc
         frame.endTime = SDL_GetTicks();
-
         engine.currFrame++;
         engine.totalFrameTime += frame.endTime - frame.startTime;
     }