/* JVIV - JavaScript Voxel Image Viewer */ JVIV = function() { var state = 0; var vif_loader; var display; var boxels = []; // array of voxels represented by CBDL.Box(es) var events; var loop; var default_font; var debug_text; var debug_string = ''; var help_string = "left/right to rotate, up/down to pitch, z/x to zoom, q to quit"; this.Main = function() { viewport = CBDL.Graphics.getViewport(); display = new CBDL.Graphics.Display(document.body, new CBDL.Graphics.VideoMode(viewport.width, viewport.height, CBDL.Graphics.VM.FILL|CBDL.Graphics.VM.ABSOLUTE), CBDL.Graphics.BACKEND.DIV); display.Init(); display.Fill(25, 75, 25); default_font = new display.Font('courier'); debug_text = new display.String(debug_string, default_font, 9); debug_text.setColor("#FFFFFF"); help_text = new display.String(help_string, default_font, 9); help_text.setColor("#FFFFFF"); events = new CBDL.Event(["keydown", "keyup"], document.body); events.addEvent(["resize"], window); vif_loader = new VL.Loader('test.vif'); (loop = new CBDL.Loop(this, onLoop)).start(); }; var version = 0; var type = 0; var width = 0; var height = 0; var depth = 0; var palette_size = 0; var palettes = []; // array of palettes, ex.: palettes[1] = [0=red,1=green,2=blue,3=alpha] var voxels = []; // array of voxels, ex.: voxels[1] = [0=x,1=y,2=z,3=palette_entry] var scale_x = 1; var scale_y = 1; var camera_x = 0; var camera_y = 0; var current_red = 0; // for pointless background var current_green = 0; // ^ var current_blue = 0; // ^ var current_mod = 1; // ^ function onLoop(loop_time) { if (state == 0) { // start state if (vif_loader.state == 1) { display.Fill(100, 50, 50); loadVoxel(vif_loader.raw_data); // We're done with the vif_loader, remove it vif_loader = null; // create our voxels as CBDL.Box(es) for (var i=0;i 0) { if (current_red < 100) { current_red += current_mod; } else if (current_green < 100) { current_green += current_mod; } else if (current_blue < 100) { current_blue += current_mod; } else { current_mod *= -1 } } else if (current_mod < 0) { if (current_red > 0) { current_red += current_mod; } else if (current_green > 0) { current_green += current_mod; } else if (current_blue > 0) { current_blue += current_mod; } else { current_mod *= -1 } } display.Fill(current_red, current_green, current_blue); drawVoxels(); // handle our input events while(event = events.pollEvent()) { if (event.type == "keydown") { switch(event.keyCode) { case 81: // q loop.stop(); /* The following line enables window.close() in Chrome and < FF2.0 FF above that require explicit user action to enable: about:config -> dom.allow_scripts_to_close_windows=true */ window.open('', '_self', ''); // enables window.close() in Chrome and FF1.5 to enable FF1.5 window.close(); break; case 37: // left camera_x-=10; break; case 39: // right camera_x+=10; break; case 38: // up break; case 40: // down break; default: console.log(event.keyCode); break; } } else if (event.type == "resize") { viewport = CBDL.Graphics.getViewport(); display.setWidth(viewport.width); display.setHeight(viewport.height); scale_x = viewport.width/width; scale_y = viewport.height/height; for(var i=0;i= 0; i--) { palette_size = (palette_size * 256) + buffer[offset+i]; } palette_size += 1; // TODO: palette size in test.vif should be changed to 00 00 00 01, NOT absolutely 0 offset += 4; // move past pallete byte range debug_string += "p:"+palette_size+" "; palettes = []; for (var i=0;i= 0; j--) { voxels[i][3] = (voxels[i][3] * 256) + buffer[offset+j]; // pallete reference } offset += 4; // move past pallete byte range console.log("voxel("+i+"): "+voxels[i]); i++; voxel_count++; } debug_string += "v:"+voxel_count+" "; debug_text.setText(debug_string); }; }; CBDL.extend(CBDL.App, JVIV); /* VIF Library */ var VL = VL || {}; /** void Loader(vif_file) Properties: state: the loading state, 0=not loaded, 1=loaded data: the responseText of the XMLHttpRequest raw_data: the formatted byte array - USE THIS. Info: Requests the specified vif_file with an asynchronous XMLHttpRequest. The Loader's state property must be polled to test for completion **/ VL.Loader = function(vif_file) { this.state = 0; this.raw_data = []; // TODO: Chrome does not support local file requests per default - create an HTML5 FileAPI backend as well var req = new XMLHttpRequest(); req.open('GET', vif_file, true); req.overrideMimeType('text\/plain; charset=x-user-defined') CBDL.addEvent(req, 'load', (function(req, scope) { return function() { data = this.responseText; for(var i=0;i