@@ -15,6 +15,11 @@ use gl;
use ui;
use math;
use super::{ State, Console };
use util::Log;

#[macro_escape]
#[path = "../../util/log_macros.rs"]
mod log_macros;

struct Console_Renderer
{
@@ -49,10 +54,10 @@ impl Console_Renderer
impl State for Console_Renderer
{
pub fn load(&mut self)
{ debug!("Loading console state."); }
{ log_debug!("Loading console renderer state"); }

pub fn unload(&mut self)
{ debug!("Unloading console state."); }
{ log_debug!("Unloading console renderer state"); }

pub fn update(&mut self, delta: f32) -> bool /* dt is in terms of seconds. */
{
@@ -20,6 +20,11 @@ use gl;
use ui;
use math;
use bsp;
use util::Log;

#[macro_escape]
#[path = "../../util/log_macros.rs"]
mod log_macros;

#[path = "../../gl/check.rs"]
mod check;
@@ -99,7 +104,7 @@ impl State for BSP_Renderer
{
pub fn load(&mut self)
{
debug!("Loading bsp renderer state.");
log_debug!("Loading bsp renderer state.");

self.game_renderer.camera.show_fps = true;

@@ -109,7 +114,7 @@ impl State for BSP_Renderer
}

pub fn unload(&mut self)
{ debug!("Unloading bsp renderer state."); }
{ log_debug!("Unloading bsp renderer state."); }

pub fn update(&mut self, delta: f32) -> bool /* dt is in terms of seconds. */
{
@@ -18,6 +18,11 @@ use extra;
use BSP_Map = bsp::Map;
use Voxel_Map = voxel::Map;
use super::State;
use util::Log;

#[macro_escape]
#[path = "../../util/log_macros.rs"]
mod log_macros;

pub struct Game
{
@@ -34,7 +39,7 @@ impl Game
let start_time = extra::time::precise_time_s();
let vmap = Voxel_Map::new(bmap.tris, 300);
let time = extra::time::precise_time_s() - start_time;
error!("Voxelization took %? seconds", time);
log_info!("Voxelization took %? seconds", time);

let game = @mut Game
{
@@ -49,9 +54,9 @@ impl Game
impl State for Game
{
pub fn load(&mut self)
{ debug!("Loading game state."); }
{ log_debug!("Loading game state."); }
pub fn unload(&mut self)
{ debug!("Unloading game state."); }
{ log_debug!("Unloading game state."); }

pub fn update(&mut self, _delta: f32) -> bool /* dt is in terms of seconds. */
{ false }
@@ -17,12 +17,17 @@ use gl;
use ui;
use math;
use self::map_renderer::Map_Renderer;
use util::Log;

mod map_renderer;

#[path = "../../gl/check.rs"]
mod check;

#[macro_escape]
#[path = "../../util/log_macros.rs"]
mod log_macros;

pub struct Game_Renderer
{
game: @mut Game,
@@ -62,14 +67,14 @@ impl State for Game_Renderer
{
pub fn load(&mut self)
{
debug!("Loading game renderer state.");
log_debug!("Loading game renderer state");

(self.map_renderer as @mut State).load();
}

pub fn unload(&mut self)
{
debug!("Unloading game renderer state.");
log_debug!("Unloading game renderer state");
(self.map_renderer as @mut State).unload();
}

@@ -19,10 +19,15 @@ use gl;
use ui;
use math;
use voxel;
use util::Log;

#[path = "../../gl/check.rs"]
mod check;

#[macro_escape]
#[path = "../../util/log_macros.rs"]
mod log_macros;

pub struct Map_Renderer
{
map: @mut voxel::Map,
@@ -243,7 +248,7 @@ impl State for Map_Renderer
{
pub fn load(&mut self)
{
debug!("Loading map renderer state.");
log_debug!("Loading map renderer state");

self.shader.bind();
self.proj_loc = self.shader.get_uniform_location("proj");
@@ -257,7 +262,7 @@ impl State for Map_Renderer
}

pub fn unload(&mut self)
{ debug!("Unloading map renderer state."); }
{ log_debug!("Unloading map renderer state"); }

pub fn update(&mut self, delta: f32) -> bool /* dt is in terms of seconds. */
{
@@ -0,0 +1,161 @@
/*
Copyright 2013 Jesse 'Jeaye' Wilkerson
See licensing in LICENSE file, or at:
http://www.opensource.org/licenses/BSD-3-Clause
File: util/log.rs
Author: Jesse 'Jeaye' Wilkerson
Description:
A general logging collection
with differen verbosity levels.
Use Q3_LOG=num where num matches:
0 => Disable all logging
1 => Enable only error logging
2 => Enable info logging (default)
3 => Enable debug logging (very verbose)
Usage of logging utilities is generally
by means of the macros: log_debug!() and
log_error!(). Logs can be owned/indented
using a log_push!(), which must have an
associated log_pop!().
*/

use std::{ u8, io, local_data, os };
use extra::term;
use extra::term::color;

/* Default is error. */
type Verbosity = u8;
static Verbosity_None: Verbosity = 0;
static Verbosity_Error: Verbosity = 1;
static Verbosity_Info: Verbosity = 2;
static Verbosity_Debug: Verbosity = 3;

static tls_key: local_data::Key<@mut Log> = &local_data::Key;

#[macro_escape]
mod log_macros;

struct Log
{
verbosity: Verbosity,
push_level: u8, /* The indentation level, for nested logs. */
terminal: term::Terminal,
}

impl Log
{
pub fn initialize()
{
let logger = @mut Log
{
verbosity: match os::getenv("Q3_LOG").take_unwrap()
{
~"0" => Verbosity_None,
~"1" => Verbosity_Error,
~"2" => Verbosity_Info,
~"3" => Verbosity_Debug,
_ => Verbosity_Info, /* default */
},
push_level: 0,
terminal: term::Terminal::new(io::stdout()).unwrap(),
};

local_data::set(tls_key, logger);

log_debug!("Logging system initialized");
}

priv fn get() -> @mut Log
{
local_data::get(tls_key,
|opt|
{
match opt
{
Some(x) => *x,
None => fail!("Singleton not available")
}
})
}

pub fn debug(module: &str, message: &str)
{
let logger = Log::get();
if logger.verbosity >= Verbosity_Debug
{ Log::log(module, message, Verbosity_Debug); }
}

pub fn info(module: &str, message: &str)
{
let logger = Log::get();
if logger.verbosity >= Verbosity_Info
{ Log::log(module, message, Verbosity_Info); }
}

pub fn error(module: &str, message: &str)
{
let logger = Log::get();
if logger.verbosity >= Verbosity_Error
{ Log::log(module, message, Verbosity_Error); }
}

pub fn get_module(file: &str) -> ~str
{
let i = file.find_str("src").unwrap();
file.slice_from(i + 4).replace(".rs", "") /* 4 is strlen("src/") */
}

pub fn push()
{
let logger = Log::get();
logger.push_level += 1;
}

pub fn pop()
{
let logger = Log::get();

assert!(logger.push_level > 0);
logger.push_level -= 1;
}

priv fn log(module: &str, message: &str, verbosity: Verbosity)
{
let logger = Log::get();

/* Display the current module. */
logger.terminal.fg(color::BRIGHT_WHITE);
print(module);
logger.terminal.reset();

/* Indent as per the push level. */
for u8::range(0, logger.push_level) |_|
{ print(" "); }

match verbosity
{
Verbosity_Debug =>
{
logger.terminal.fg(color::BRIGHT_GREEN);
print(" debug => ");
},
Verbosity_Info =>
{
logger.terminal.fg(color::BRIGHT_YELLOW);
print(" info => ");
},
Verbosity_Error =>
{
logger.terminal.fg(color::BRIGHT_RED);
print(" error => ");
},
val => fail!("Invalid verbosity for logging: %?", val)
}
logger.terminal.reset();
println(message);
}
}

@@ -0,0 +1,71 @@
/*
Copyright 2013 Jesse 'Jeaye' Wilkerson
See licensing in LICENSE file, or at:
http://www.opensource.org/licenses/BSD-3-Clause
File: util/log_macros.rs
Author: Jesse 'Jeaye' Wilkerson
Description:
Usage of logging utilities is generally
by means of the macros: log_debug!() and
log_error!().
*/

macro_rules! log_debug
(
($message:expr) =>
({
let module = Log::get_module(file!());
Log::debug(fmt!("[%s]:%?", module, line!()), $message);
});
($($message:expr),+) =>
({
let module = Log::get_module(file!());
Log::debug(fmt!("[%s]:%?", module, line!()), fmt!($($message),+));
});
)

macro_rules! log_info
(
($message:expr) =>
({
let module = Log::get_module(file!());
Log::info(fmt!("[%s]:%?", module, line!()), $message);
});
($($message:expr),+) =>
({
let module = Log::get_module(file!());
Log::info(fmt!("[%s]:%?", module, line!()), fmt!($($message),+));
});
)

macro_rules! log_error
(
($message:expr) =>
({
let module = Log::get_module(file!());
Log::error(fmt!("[%s]:%?", module, line!()), $message);
});
($($message:expr),+) =>
({
let module = Log::get_module(file!());
Log::error(fmt!("[%s]:%?", module, line!()), fmt!($($message),+));
});
)

macro_rules! log_push
(
() =>
({
Log::push();
});
)

macro_rules! log_pop
(
() =>
({
Log::pop();
});
)

@@ -0,0 +1,16 @@
/*
Copyright 2013 Jesse 'Jeaye' Wilkerson
See licensing in LICENSE file, or at:
http://www.opensource.org/licenses/BSD-3-Clause
File: util/mod.rs
Author: Jesse 'Jeaye' Wilkerson
Description:
An aggregator of misc util items.
*/

pub use self::log::Log;

#[macro_escape]
mod log;