view mde/mde.d @ 53:f000d6cd0f74

Changes to paths, command line arguments and font LCD rendering. Use "./" instead of "" as default install dir on windows. Implemented a command-line argument parser. Changes to LCD filter/render-mode option handling after testing what actually happens. Changed some FontTexture messages and internals.
author Diggory Hardy <diggory.hardy@gmail.com>
date Thu, 05 Jun 2008 17:16:52 +0100
parents 0fd51d2c6c8a
children 66d555da083e
line wrap: on
line source

/* LICENSE BLOCK
Part of mde: a Modular D game-oriented Engine
Copyright © 2007-2008 Diggory Hardy

This program is free software: you can redistribute it and/or modify it under the terms
of the GNU General Public License as published by the Free Software Foundation, either
version 2 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>. */

/** Modular D Engine
 *
 * This module contains main(), which calls Init and runs the main loop.
 */
module mde.mde;

// Comment to show use, where only used minimally:

import mde.imde;                        // this module's interface for external modules
import mde.events;                      // pollEvents
import mde.Options;                     // pollInterval option

import gl = mde.gl.draw;                // gl.draw()
import mde.input.Input;                 // new Input()

import mde.scheduler.Init;
import mde.scheduler.Scheduler;         // Scheduler.run()
import mde.scheduler.exception;         // InitException

import tango.core.Thread : Thread;	// Thread.sleep()
import tango.time.Clock;                // Clock.now()
import tango.util.log.Log : Log, Logger;

int main(char[][] args)
{
    //BEGIN Initialisation
    Logger logger = Log.getLogger ("mde.mde");
    
    // Create instances now, so they can be used during init (if necessary)
    input = new Input();
    mainSchedule = new Scheduler;
    
    scope Init init;
    try {
        init = new Init(args);	// initialisation
    } catch (InitException e) {
        logger.fatal ("Initialisation failed: " ~ e.msg);
        return 1;
    }
    
    if (miscOpts.pollInterval !<= 1.0 || miscOpts.pollInterval !>= 0.0)
        Options.setDouble ("misc", "pollInterval", 0.01);
    //END Initialisation
    
    //BEGIN Main loop setup
    /* Note: the main loop is currently controlled by the scheduler. This is not really ideal,
     * since it provides no direct control of the order in which components are executed and does
     * not allow running components simultaeneously with threads.
     * Note: probably drawing should start at the beginning of the loop and glFlush()/swapBuffers
     * be called at the end to optimise. */
    mainSchedule.add (SCHEDULE.DRAW, &gl.draw); // Draw, per event only.
    mainSchedule.add (mainSchedule.getNewID, &mde.events.pollEvents).frame = true;
    //END Main loop setup
    
    while (run) {
        mainSchedule.execute (Clock.now());
        
        Thread.sleep (miscOpts.pollInterval);	// sleep this many seconds
    }
    
    return 0;		// cleanup handled by init's DTOR
}