Exemple #1
0
//���������������������������������������������������������������������������
// WinMain
//���������������������������������������������������������������������������
int APIENTRY WinMain (HINSTANCE hInstance,
                      HINSTANCE hPrevInstance,
                      LPSTR     lpCmdLine,
                      int       nCmdShow)
{
    ushort      width  = 640;
    ushort      height = 480;
    int         bpp = 16;
    screen_type scrndevice = SCREEN_DIB;
    dword       scrnflags = 0;
    float       gamma = 1.0f;
    BOOL        use_dinput = FALSE;
    char        palname[256];

    strcpy(palname,"DEFAULT.PAL");

//��� Process INI
    {
        XFParseINI ini;

        if (!ini.open("VIEWER.INI",XF_OPEN_READ))
        {
            char buff[256];

            //��� Screen parameters
            if (!ini.section("Screen"))
            {
                if (!ini.read("FullScreen",buff))
                {
                    strlwr(buff);
                    if (strstr(buff,"yes"))
                        scrnflags |= VNGO_SET_RESOLUTION;
                }

                if (!ini.read("Device",buff))
                {
                    strlwr(buff);
                    if (strstr(buff,"ddraw"))
                        scrndevice = SCREEN_DDRAW;
                    else if (strstr(buff,"d3d"))
                        scrndevice = SCREEN_D3D;
                    else
                        scrndevice = SCREEN_DIB;
                }

                if (!ini.read("Resolution",buff))
                {
                    strlwr(buff);
                    if (strstr(buff,"320x240x8"))
                    {
                        width = 320;
                        height = 240;
                        bpp = 8;
                    }
                    else if (strstr(buff,"640x480x8"))
                    {
                        width = 640;
                        height = 480;
                        bpp = 8;
                    }
                    else if (strstr(buff,"640x480x15"))
                    {
                        width = 640;
                        height = 480;
                        bpp = 15;
                    }
                    else if (strstr(buff,"640x480x16"))
                    {
                        width = 640;
                        height = 480;
                        bpp = 16;
                    }
                }

                if (!ini.read("Palette",buff))
                    strncpy(palname,buff,sizeof(palname));

                if (!ini.read("Gamma",buff))
                {
                    gamma = float(atof(buff));
                    if (gamma < 0.5f)
                        gamma = 0.5f;
                    else if (gamma > 2.0f)
                        gamma = 2.0f;
                }
            }

            //��� Startup parameters
            if (!ini.section("Startup"))
            {
                if (!ini.read("DirectInput",buff))
                {
                    strlwr(buff);
                    if (strstr(buff,"yes"))
                        use_dinput = TRUE;
                }
            }
        }
    }

//��� Initialize Windows

    //��� If we are already running, this routine will reactivate the older
    //��� application and return failure.
    if (!InitApplication (hInstance, nCmdShow, width, height))
        return 1;

//��� Initializes MythOS

    //��� Initialize the MythOS system
    MythOS = new MythosSystem (MYTHOS_MEM_SIZE);
    if (!MythOS)
        return 1;

    //��� Create the devices
    if (use_dinput)
    {
        Devs = new MaxDevicesDirectX (hWndClient);

        if (!Devs)
            return 1;

        if (!Devs->is_mouse_present() || !Devs->is_keyboard_present())
        {
            delete Devs;
            Devs = new MaxDevicesWin32 (hWndClient);
        }
    }
    else
        Devs = new MaxDevicesWin32 (hWndClient);

    if (!Devs)
        return 1;

    //��� Finish MythOS initialization
    if (MythOS->init (MYTHOS_ESCHER_ARENA_SIZE, MYTHOS_ESCHER_SORT_SIZE, 0))
        return 1;

    MythOS->Vangogh.set_gamma(gamma);

//��� Install Fonts
    if (gberg_install_font("ARIAL-15.IFF", 0))
        return 1;

//��� Setup palette and screen manager

    for(;;)
    {
        if (Palette)
        {
            delete Palette;
            Palette = 0;
        }
        if (Screen)
        {
            delete Screen;
            Screen = 0;
        }

        //��� Create palette

        switch (bpp)
        {
            case 8:
                Palette = new VngoPal8;
                break;
            case 15:
                Palette = new VngoPal15;
                break;
            case 16:
                Palette = new VngoPal16;
                break;
        }

        if (!Palette
            || Palette->init(0,palname))
            return 1;

        //��� Create screen manager

        switch (scrndevice)
        {
            case SCREEN_DIB:
                Screen = new VngoDIB(hWndClient);
                break;
            case SCREEN_DDRAW:
                Screen = new VngoDirectDraw(hWndClient);
                break;
            case SCREEN_D3D:
                Screen = new VngoDirect3D(hWndClient);
                scrnflags |= VNGO_3DDEVICE | VNGO_ALLOC_ZBUFFER;
                break;
        }

        if (!Screen
            || Screen->get_initstate())
            return 1;

        VNGError err = Screen->set_mode (width, height, (bpp == 8) ? 8 : 16,
                                         Palette, scrnflags);
        if (err == VNGO_NO_ERROR)
            break;
        else if (err == VNGO_NEEDS_PAL8)
            bpp = 8;
        else if (err == VNGO_NEEDS_PAL15)
            bpp = 15;
        else if (err == VNGO_NEEDS_PAL16)
            bpp = 16;
        else
            return 1;
    }

//��� Create viewport

    switch (scrndevice)
    {
        case SCREEN_DIB:
            if (bpp == 8)
            {
                Vport = new VngoVportDB8(width,height,
                                         ((VngoDIB*)Screen)->gmap,0,Palette,
                                         VNGO_ZBUFFER_DEV);
            }
            else
            {
                Vport = new VngoVportDB16(width,height,
                                          ((VngoDIB*)Screen)->gmap,0,Palette,
                                          VNGO_ZBUFFER_DEV);
            }
            break;
        case SCREEN_DDRAW:
            if (bpp == 8)
            {
                Vport = new VngoVportDD8(((VngoDirectDraw*)Screen)->SurfaceManager,
                                         0, Palette,
                                         VNGO_ZBUFFER_DEV);
            }
            else
            {
                Vport = new VngoVportDD16(((VngoDirectDraw*)Screen)->SurfaceManager,
                                          0, Palette,
                                          VNGO_ZBUFFER_DEV);
            }
            break;
        case SCREEN_D3D:
            {
                VngoRect rct(0,0,width,height);
                Vport = new VngoVportD3D(rct, Palette,
                                         VNGO_ZBUFFER_DEV, Screen);
            }
            break;
    }

    if (!Vport)
        return 1;

    gberg_color(Palette->get_index(VngoColor24bit(255,255,255)),
                VNGO_TRANSPARENT);

//��� Create viewer application instance
    Viewer *view = new Viewer;
    if (!view
        || !view->create())
        return 1;

//��� Main Loop
    while (PumpWindows())
    {
        Devs->update();
        view->process_events();
        view->render();
        Screen->flip();
    }

//��� Destroy viewer application
    delete view;

    //����������������������������������������������������������� Termination
    if (Vport)
    {
        delete Vport;
        Vport=0;
    }

    if (Palette)
    {
        delete Palette;
        Palette=0;
    }

    if (Screen)
    {
        delete Screen;
        Screen=0;
    }

    if (Devs)
    {
        delete Devs;
        Devs=0;
    }

    if (MythOS)
    {
        delete MythOS;
        MythOS=0;
    }

    return 0;
}