testrumenter
Version:
Command-line utility to test JavaScript code instrumenter
1,904 lines (1,612 loc) • 5 MB
JavaScript
// Portions copyright 2012 Google, Inc.
// Copyright 2012 Onan Games. All rights reserved.
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following
// disclaimer in the documentation and/or other materials provided
// with the distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived
// from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
var MandreelBenchmark = new BenchmarkSuite('Mandreel', [16831872, 49852],
[new Benchmark('Mandreel',
false,
false,
15,
runMandreel,
setupMandreel,
tearDownMandreel,
RMSMandreel,
4)]);
var mandreelSumSquaredPauses = 0;
var mandreelSamples = 0;
var mandreelSampleTimeStart = 0.0;
function setupMandreel() {
// Check for Typed Arrays support, throw error if not.
if (!(typeof Uint8Array != "undefined" &&
typeof Float64Array != "undefined" &&
typeof (new Uint8Array(0)).subarray != "undefined")) {
throw "TypedArrayUnsupported";
}
my_old_constructors = mandreel_call_constructors;
mandreel_call_constructors = my_mandreel_call_constructors;
startMandreelTimer();
startApp();
_mandreelAppAudioReady();
}
function runMandreel() {
Mandreel_currentTime = 0;
var sp = g_stack_pointer+800*1024;
for (var i=0;i<mandreel_total_memory/4;i++) {
heap32[i] = my_heap32[i];
}
tlsf_ptr = 0;
heapNewPos = my_heapNewPos;
my_old_constructors(llvm_2E_global_ctors,5,sp);
heapU32[sp>>2] = 640;
heapU32[(sp+4)>>2] = 480;
__mandreel_internal_SetResolution(sp);
__mandreel_internal_init(g_stack_pointer+800*1024);
__init(g_stack_pointer+800*1024);
for (var i = 0; i < 20; i++) {
render();
Mandreel_flushTimeouts();
updateMandreelStats(performance.now());
}
Mandreel_checkState();
}
function updateMandreelStats(time) {
var pause = time - mandreelSampleTimeStart;
mandreelSampleTimeStart = time;
mandreelSumSquaredPauses += (pause * pause);
mandreelSamples++;
}
function startMandreelTimer() {
mandreelSampleTimeStart = performance.now();
}
function RMSMandreel() {
return Math.round(Math.sqrt(mandreelSumSquaredPauses / mandreelSamples) * 100);
}
function tearDownMandreel() {
my_old_constructors = null;
my_heap = null;
my_heap8 = null;
my_heap32 = null;
heap = null;
heap8 = null;
heapU8 = null;
heap16 = null;
heapU16 = null;
heap32 = null;
heapU32 = null;
heapFloat = null;
heapDouble = null;
mandreelAppUsePackAsyncTexture = null;
mandreelSumSquaredPauses = 0;
mandreelSamples = 0;
}
// Mocks for browser functions.
function Mandreel_setTimeout(cmd, delay) {
timeouts.push(cmd);
}
function Mandreel_flushTimeouts() {
while (Mandreel_timeouts.length != 0) {
var next = Mandreel_timeouts.pop();
eval(next);
}
}
Mandreel_timeouts = new Array();
Mandreel_XMLHttpRequest = function() {
this.open = function(type, url, some_bool) {
this.url = url;
}
this.overrideMimeType = function() {
}
this.send = function() {
this.response = null;
this.readyState = 4;
this.status = 0;
this.onreadystatechange();
}
};
function Mandreel_Element(type) {
this.element_type = type;
this.insertBefore = function() {
}
}
function Mandreel_Context() {
}
function Mandreel_Canvas() {
}
function Mandreel_CanvasDiv() {
}
Mandreel_document = {
createElement : function(element_type) {
var element = new Mandreel_Element(element_type);
element.parentNode = new Mandreel_Element("dummy_parent");
return element;
},
getElementById : function(name) {
if (name === "canvas") {
return new Mandreel_Canvas();
} else if (name === "canvasDiv") {
return new Mandreel_CanvasDiv();
} else {
return undefined;
}
},
getElementsByTagName : function(element) {
if (element === "script") {
return new Array(new this.createElement(element));
}
}
};
Mandreel_window = {
WebGLRenderingContext: {},
Float64Array: Float64Array,
Float32Array: Float32Array,
Int32Array: Int32Array,
Uint32Array: Uint32Array,
Int16Array: Int16Array,
Uint16Array: Uint16Array,
Int8Array: Int8Array,
Uint8Array: Uint8Array,
setTimeout: Mandreel_setTimeout,
addEventListener : function () {},
document: Mandreel_document
};
function dump(x) { }
alert = typeof alert != "undefined" ? alert : function(x) {
print(x);
}
var my_old_constructors;
var my_heap;
var my_heap8;
var my_heap32;
var my_heapNewPos;
function my_mandreel_call_constructors(_ptr, size,stackPos) {
my_heapNewPos = heapNewPos;
my_heap = new ArrayBuffer(mandreel_total_memory);
my_heap8 = new Int8Array(my_heap);
my_heap32 = new Int32Array(my_heap);
for (var i=0;i<mandreel_total_memory/4;i++) {
my_heap32[i] = heap32[i];
}
my_old_constructors(_ptr,size,stackPos);
}
var Mandreel_currentTime = 0;
function Date_now() {
Mandreel_currentTime += 16;
return Mandreel_currentTime;
}
function Mandreel_checkState() {
var sum = 0;
for (var i = 0; i < heap32.length; i += 100) {
sum = (sum * 3 + heap32[i]) & 0xFFFFFF;
}
if (sum != 8001026) {
alert("Check sum mismatch: expected ???, actual " + sum);
}
}
// Original Mandreel code follows.
// Modifications for benchmarking are marked in comments.
// Start of js/main.js file:
////////////////////////////////////////////
function startApp(_platform)
{
// Start mandreel
var params =
{
platform : _platform,
width : 1024,
height : 768,
webglCanvas : "canvas",
flashCanvas : "FlashDiv",
workingFolderFlash : "data/as3/",
workingFolderWebgl : "data/js/",
swfFlash : "mandreel.swf",
log : true
};
mandreelAppStart(appStartState,params);
}
////////////////////////////////////////////
function appStartState(state,param)
{
// mandreel.js program is been loaded
if ( state == "loadingScript" )
{
}
// mandreel.js program has been loaded
if ( state == "scriptLoaded" )
{
}
// loading pack data file
if (state == "loadingData")
{
// param bytes loaded
}
// Audio system is been started
if ( state == "loadingAudio" )
{
}
// Audio system is ready and the default audio preloading has been done
if ( state == "audioLoaded" )
{
}
// Mandreel has been started, render will start automatically
if ( state == "ready" )
{
// Hide loading image
var canvasElement = Mandreel_document.getElementById('loading');
if ( canvasElement != null )
canvasElement.style.visibility = "hidden";
}
// An error has been produced during the start process and the app must quit
if ( state == "error" )
{
if ( param == "webgl_not_found" )
{
window.location = "http://get.webgl.org";
return;
}
alert(param);
}
}
// End of js/main.js file.
// Start of js/mandreelapp.js file.
var mandreelAppMandreelJs = "mandreel.js";
var mandreelAppMandreelJsCompressed = false;
var mandreelAppWorkingFolder = "data/js/";
var mandreelAppLog = false;
var mandreelAppLocalHost = "http://localhost";
var mandreelAppReadDataFromLocalHost = false;
var mandreelAppReadMandreelJsFromLocalHost = false;
var mandreelAppHostedAudioServer = null;
var mandreelAppHostedAudioUrl = null;
var mandrelCurrentFatVersion = "1.4";
var mandreelAppPlatform = "webgl";
var mandreelAppCanvasWidth = 1024;
var mandreelAppCanvasHeight = 768;
var mandreelAppWidthSrc = 1024;
var mandreelAppHeightSrc = 768;
var mandreelAppCanvasName = "canvas";
var mandreelAppCanvasDiv = "canvasDiv";
var mandreelAppUseFlashSockets = false;
var mandreelAppUsePackAsyncTexture = new Array();
//var mandreelBufferPackAsyncTexture = null;
var mandreelAppForceFocus = true;
var _imandreel_pause_game = false;
/* The following code was removed for benchmarking:
navigator.pointer = navigator.pointer || navigator.webkitPointer || navigator.mozPointer || null;*/
/* The following code was removed for benchmarking:
if (!Date_now) {
Date_now = function() {
return +new Date();
};
};*/
////////////////////////////////////////////
if (Mandreel_window["console"])
{
if (!Mandreel_window["dump"]) Mandreel_window["dump"] = function dump(str){ if ( mandreelAppLog ) console.log(str) };
}
else
{
if (!Mandreel_window["dump"]) Mandreel_window["dump"] = function dump(str){ };
}
/* The following code is removed for benchmarking:
var mandreel_BrowserDetect = {
init: function () {
this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
this.version = this.searchVersion(navigator.userAgent)
|| this.searchVersion(navigator.appVersion)
|| "an unknown version";
this.OS = this.searchString(this.dataOS) || "an unknown OS";
},
searchString: function (data) {
for (var i=0;i<data.length;i++) {
var dataString = data[i].string;
var dataProp = data[i].prop;
this.versionSearchString = data[i].versionSearch || data[i].identity;
if (dataString) {
if (dataString.indexOf(data[i].subString) != -1)
return data[i].identity;
}
else if (dataProp)
return data[i].identity;
}
},
searchVersion: function (dataString) {
var index = dataString.indexOf(this.versionSearchString);
if (index == -1) return;
return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
},
dataBrowser: [
{
string: navigator.userAgent,
subString: "Chrome",
identity: "Chrome"
},
{ string: navigator.userAgent,
subString: "OmniWeb",
versionSearch: "OmniWeb/",
identity: "OmniWeb"
},
{
string: navigator.vendor,
subString: "Apple",
identity: "Safari",
versionSearch: "Version"
},
{
prop: window.opera,
identity: "Opera",
versionSearch: "Version"
},
{
string: navigator.vendor,
subString: "iCab",
identity: "iCab"
},
{
string: navigator.vendor,
subString: "KDE",
identity: "Konqueror"
},
{
string: navigator.userAgent,
subString: "Firefox",
identity: "Firefox"
},
{
string: navigator.vendor,
subString: "Camino",
identity: "Camino"
},
{ // for newer Netscapes (6+)
string: navigator.userAgent,
subString: "Netscape",
identity: "Netscape"
},
{
string: navigator.userAgent,
subString: "MSIE",
identity: "Explorer",
versionSearch: "MSIE"
},
{
string: navigator.userAgent,
subString: "Gecko",
identity: "Mozilla",
versionSearch: "rv"
},
{ // for older Netscapes (4-)
string: navigator.userAgent,
subString: "Mozilla",
identity: "Netscape",
versionSearch: "Mozilla"
}
],
dataOS : [
{
string: navigator.platform,
subString: "Win",
identity: "Windows"
},
{
string: navigator.platform,
subString: "Mac",
identity: "Mac"
},
{
string: navigator.userAgent,
subString: "iPhone",
identity: "iPhone/iPod"
},
{
string: navigator.platform,
subString: "Linux",
identity: "Linux"
}
]
};
mandreel_BrowserDetect.init(); */
////////////////////////////////////////////
var mandreel_packfiledata_name = null;
var mandreel_packfiledata_compressed = false;
var mandreel_packfiledata_size = 0;
var mandreel_total_packtexture_size = 0;
var mandreel_total_pogfile_size = 0;
var mandreel_loaded_packtexture_size = 0;
var mandreel_jslzma_size = 0;
var mandreel_swf_size = 0;
var mandreelJsScriptLoaded_loaded = false;
var mandreel_swf_last_total_size = 0;
function mandreel_swf_size_updated(str)
{
var params = str.split(',');
if ( mandreel_swf_size == 0 )
{
mandreel_swf_last_loaded_size = 0;
}
mandreel_swf_size = parseInt(params[0]);
var loaded = parseInt(params[1]);
var delta_size = loaded - mandreel_swf_last_loaded_size;
mandreel_swf_last_loaded_size = loaded;
var percentage = ((100*loaded)/mandreel_swf_size)|0;
if (percentage>100)
percentage = 100;
if ( mandreelAppStartStateFunc )
mandreelAppStartStateFunc("loadingScriptUpdate",percentage);
imandreel_update_load(delta_size,0);
}
function mandreel_swf_size_loaded(str)
{
if ( mandreelAppStartStateFunc )
mandreelAppStartStateFunc("scriptLoaded","");
}
function mandreelNextDecompress(mandreel_result_lzma)
{
if ( mandreelAppStartStateFunc )
{
var totalBytesLeft = mandreel_result_lzma.totalSize - mandreel_result_lzma.remainingBytes;
var percentage;
if (totalBytesLeft == 0)
percentage = 0;
else
percentage = ((100*totalBytesLeft)/mandreel_result_lzma.totalSize)|0;
mandreelAppStartStateFunc("uncompressingDataUpdate",percentage);
}
var old_result = mandreel_result_lzma;
mandreel_result_lzma = LZMA.decompress2(mandreel_result_lzma.inStream,mandreel_result_lzma.inStream,mandreel_result_lzma.outStream,mandreel_result_lzma);
if (mandreel_result_lzma == null)
{
//setTimeout(mandreelLoadScript,10,old_result.my_outStream.data);
//mandreel_fs_saveFile('data.bin', old_result.my_outStream.arrayBuffer);
//callback(old_result.my_outStream.arrayBuffer);
//alert('done');
mandreelLoadPackData(old_result.my_outStream.arrayBuffer,true);
}
else
{
Mandreel_setTimeout(mandreelNextDecompress,10,mandreel_result_lzma);
}
}
function mandreel_load_packfile(array_buffer)
{
if (array_buffer)
{
mandreelLoadPackData(array_buffer,false);
return;
}
var working_folder = mandreelAppWorkingFolder;
if ( mandreelAppReadDataFromLocalHost )
working_folder = mandreelAppLocalHost+"/"+mandreelAppWorkingFolder;
var packdata_request = new XMLHttpRequest();
var url = working_folder+mandreel_packfiledata_name;
packdata_request.open("GET", url, true);
if("responseType" in packdata_request)
packdata_request.responseType="arraybuffer";
else
packdata_request.overrideMimeType('text/plain; charset=x-user-defined');
var last_loaded_size = 0;
packdata_request.onreadystatechange = function()
{
if (packdata_request.readyState != 4) return;
if (packdata_request.status == 200)
{
var buffer;
if (packdata_request.responseType=="arraybuffer")
buffer=packdata_request.response;
else if (packdata_request.mozResponseArrayBuffer != null)
buffer = packdata_request.mozResponseArrayBuffer;
else
buffer=packdata_request.response;
if (mandreel_packfiledata_compressed)
{
var inStream = {
data: new Uint8Array(buffer),
offset: 0,
readByte: function(){
return this.data[this.offset ++];
}
};
var outStream = {
data: null,
offset: 0,
binary_mode : true,
writeByte: function(value){
this.data[this.offset ++] = value;
}
};
var result = LZMA.decompress2(inStream,inStream,outStream,null);
if (result == null)
mandreelLoadPackData(outStream.arrayBuffer,true);
else
Mandreel_setTimeout(mandreelNextDecompress,10,result);
}
else
mandreelLoadPackData(buffer,true);
}
else
{
if ( mandreelAppStartStateFunc )
mandreelAppStartStateFunc("error","can't load packfile data");
}
}
packdata_request.onprogress = function(e)
{
var delta_size = e.loaded - last_loaded_size;
last_loaded_size = e.loaded;
var percentage = ((100*e.loaded)/mandreel_packfiledata_size)|0;
imandreel_update_load(delta_size,0);
if (percentage>100)
percentage = 100;
if ( mandreelAppStartStateFunc )
mandreelAppStartStateFunc("loadingData",percentage);
}
packdata_request.send();
}
function mandreelJsScriptLoaded()
{
if (mandreelJsScriptLoaded_loaded)
return;
if (typeof(mandreel_cache_files)=="undefined")
{
Mandreel_setTimeout(mandreelJsScriptLoaded,10);
return;
}
mandreelJsScriptLoaded_loaded = true;
if ( mandreelAppStartStateFunc )
mandreelAppStartStateFunc("scriptLoaded","");
if (mandreel_packfiledata_name)
{
mandreel_fs_load_binary(mandreel_packfiledata_name, mandreel_load_packfile);
}
else
{
mandreelCacheMandreelFat();
imandreelJsScriptLoaded();
}
}
function imandreelLoadAudio()
{
g_mandreel_working_folder = mandreelAppWorkingFolder;
if ( mandreelAppReadDataFromLocalHost )
g_mandreel_working_folder = mandreelAppLocalHost+"/"+mandreelAppWorkingFolder;
// load audio
if ( mandreelAppStartStateFunc )
mandreelAppStartStateFunc("loadingAudio","");
mandreel_start_audio(mandreelAppHostedAudioServer,mandreelAppHostedAudioUrl,_mandreelAppAudioReady);
}
var _mandreel_currentPackTexture = '';
function imandreel_packasynctexture_loaded(buffer,save_file)
{
if (save_file)
mandreel_fs_saveFile(_mandreel_currentPackTexture,buffer);
//mandreelBufferPackAsyncTexture = buffer;
Mandreel_TextureAsync_PackBufferData[_mandreel_currentPackTexture] = buffer;
imandreelLoadNextTexturePack();
}
var mandreel_update_total_size = 0;
function imandreel_update_load(size, total)
{
if (total == 0)
total = mandreel_packfiledata_size + mandreel_total_packtexture_size + mandreel_total_pogfile_size + mandreel_jslzma_size + mandreel_swf_size;
mandreel_update_total_size+=size;
var percentage = ((100*mandreel_update_total_size)/total)|0;
if (percentage>100)
percentage = 100;
if (mandreelAppStartStateFunc)
mandreelAppStartStateFunc("loadingProgress",percentage);
}
function imandreel_packasynctexture_load(array_buffer)
{
if (array_buffer)
{
imandreel_packasynctexture_loaded(array_buffer, false);
return;
}
var working_folder = mandreelAppWorkingFolder;
if ( mandreelAppReadDataFromLocalHost )
working_folder = mandreelAppLocalHost+"/"+mandreelAppWorkingFolder;
var packdata_request = new XMLHttpRequest();
var url = working_folder+_mandreel_currentPackTexture;
packdata_request.open("GET", url, true);
if("responseType" in packdata_request)
packdata_request.responseType="arraybuffer";
else
packdata_request.overrideMimeType('text/plain; charset=x-user-defined');
var last_loaded_size = 0;
packdata_request.onreadystatechange = function()
{
if (packdata_request.readyState != 4) return;
if (packdata_request.status == 200)
{
var buffer;
if (packdata_request.responseType=="arraybuffer")
buffer=packdata_request.response;
else if (packdata_request.mozResponseArrayBuffer != null)
buffer = packdata_request.mozResponseArrayBuffer;
else
buffer=packdata_request.response;
imandreel_packasynctexture_loaded(buffer, true);
}
else
{
if ( mandreelAppStartStateFunc )
mandreelAppStartStateFunc("error","can't load textureasync pack data");
}
}
packdata_request.onprogress = function(e)
{
var delta_size = e.loaded - last_loaded_size;
last_loaded_size = e.loaded;
mandreel_loaded_packtexture_size+=delta_size;
imandreel_update_load(delta_size,0);
var percentage = ((100*mandreel_loaded_packtexture_size)/mandreel_total_packtexture_size)|0;
if (percentage>100)
percentage = 100;
if ( mandreelAppStartStateFunc )
mandreelAppStartStateFunc("loadingTextureAsyncPack",percentage);
}
packdata_request.send();
}
function imandreelLoadNextTexturePack()
{
if (mandreelAppUsePackAsyncTexture.length)
{
_mandreel_currentPackTexture = mandreelAppUsePackAsyncTexture.pop();
mandreel_fs_load_binary(_mandreel_currentPackTexture, imandreel_packasynctexture_load);
}
else
imandreelLoadAudio();
}
function imandreelJsScriptLoaded()
{
imandreelLoadNextTexturePack();
}
////////////////////////////////////////////
function mandreelDecompressJSReady(code, save_file)
{
if (save_file)
mandreel_fs_saveFile(mandreelAppMandreelJs + ".lzma", code);
var ga = Mandreel_document.createElement('script');
ga.type = "text/javascript";
ga.text = code;
var s = Mandreel_document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
s.parentNode.removeChild(ga);
mandreelJsScriptLoaded();
}
function mandreelNextDecompressJS(mandreel_result_lzma)
{
if ( mandreelAppStartStateFunc )
{
var totalBytesLeft = mandreel_result_lzma.totalSize - mandreel_result_lzma.remainingBytes;
var percentage;
if (totalBytesLeft == 0)
percentage = 0;
else
percentage = ((100*totalBytesLeft)/mandreel_result_lzma.totalSize)|0;
mandreelAppStartStateFunc("uncompressingScriptUpdate",percentage);
}
var old_result = mandreel_result_lzma;
mandreel_result_lzma = LZMA.decompress2(mandreel_result_lzma.inStream,mandreel_result_lzma.inStream,mandreel_result_lzma.outStream,mandreel_result_lzma);
if (mandreel_result_lzma == null)
{
mandreelDecompressJSReady(old_result.my_outStream.data,true);
}
else
{
Mandreel_setTimeout(mandreelNextDecompressJS,10,mandreel_result_lzma);
}
}
function mandreel_load_compressed_js(code_js)
{
if (code_js)
{
mandreelDecompressJSReady(code_js,false);
return;
}
var xmlhttp_get = new XMLHttpRequest();
var url = mandreelAppMandreelJs + ".lzma";
if ( mandreelAppReadMandreelJsFromLocalHost )
url = mandreelAppLocalHost+"/"+url;
xmlhttp_get.open('GET',url);
if("responseType" in xmlhttp_get)
xmlhttp_get.responseType="arraybuffer";
else
xmlhttp_get.overrideMimeType('text/plain; charset=x-user-defined');
var last_loaded_size = 0;
xmlhttp_get.onreadystatechange = function()
{
if (xmlhttp_get.readyState==4)
{
if (xmlhttp_get.status==200 || xmlhttp_get.status==0)
{
var inStream = {
data: new Uint8Array(xmlhttp_get.response),
offset: 0,
readByte: function(){
return this.data[this.offset ++];
}
};
var outStream = {
data: new String(""),
offset: 0,
binary_mode : false,
writeByte: function(value){
this.data+=String.fromCharCode(value);
}
};
var result = LZMA.decompress2(inStream,inStream,outStream,null);
if (result == null)
mandreelDecompressJSReady(outStream.data,true);
else
Mandreel_setTimeout(mandreelNextDecompressJS,10,result);
}
else
{
alert('error ' + xmlhttp_get.status);
}
}
}
xmlhttp_get.onprogress = function(e)
{
var delta_size = e.loaded - last_loaded_size;
last_loaded_size = e.loaded;
var percentage = ((100*e.loaded)/e.total)|0;
mandreel_jslzma_size = e.total;
imandreel_update_load(delta_size,0);
if (percentage>100)
percentage = 100;
if ( mandreelAppStartStateFunc )
mandreelAppStartStateFunc("loadingScriptUpdate",percentage);
}
xmlhttp_get.send();
}
function mandreelLoadMandreelJsScript()
{
if (mandreelAppMandreelJsCompressed)
{
mandreel_fs_load_text(mandreelAppMandreelJs + ".lzma", mandreel_load_compressed_js);
}
else
{
var ga = Mandreel_document.createElement('script');
ga.type = 'text/javascript';
ga.async = true;
ga.onload = ga.onreadystatechange = mandreelJsScriptLoaded;
var url = mandreelAppMandreelJs;
if ( mandreelAppReadMandreelJsFromLocalHost )
ga.src = mandreelAppLocalHost+"/"+url;
else
ga.src = url;
var s = Mandreel_document.getElementsByTagName('script')[0];
if ( mandreelAppStartStateFunc )
mandreelAppStartStateFunc("loadingScript","");
s.parentNode.insertBefore(ga, s);
}
}
////////////////////////////////////////////
function mandreelFatLoaded()
{
if ( mandreelAppPlatform == "nacl" )
{
g_mandreel_working_folder = mandreelAppWorkingFolder;
if ( mandreelAppReadDataFromLocalHost )
g_mandreel_working_folder = mandreelAppLocalHost+"/"+mandreelAppWorkingFolder;
// load audio
if ( mandreelAppStartStateFunc )
mandreelAppStartStateFunc("loadingAudio","");
_mandreelAppAudioReady();
}
else
mandreelLoadMandreelJsScript();
}
var mandreelFatData = "";
var mandreelFatPreloadRequest = 0;
////////////////////////////////////////////
function mandreel_chanka_fixfile(fileName)
{
var fileNameNoExt = fileName.toLowerCase();
fileNameNoExt = fileNameNoExt.replace(/\\/g,"/");
fileNameNoExt = fileNameNoExt.substr(1);
var new_fileName = '';
for(var j = 0; j < fileNameNoExt.length; j++)
{
var data = fileNameNoExt.charCodeAt(j);
if (data != 13)
{
var t = String.fromCharCode(data);
new_fileName+=t;
}
}
return new_fileName;
}
function mandreel_removecr(my_string)
{
var new_string = '';
for(var j = 0; j < my_string.length; j++)
{
var data = my_string.charCodeAt(j);
if (data != 13)
{
var t = String.fromCharCode(data);
new_string+=t;
}
}
return new_string;
}
function mandreelCacheMandreelFat()
{
var array_mandreel_fat = new ArrayBuffer(mandreelFatData.length+1);
{
var j;
var len = mandreelFatData.length;
var data_char;
var my_bytes = new Uint8Array(array_mandreel_fat);
for(j = 0; j < len; j++)
{
data_char = mandreelFatData.charCodeAt(j);
my_bytes[j] = data_char;
}
my_bytes[j] = 0;
}
mandreel_cache_files['mandreel.fat'] = array_mandreel_fat;
}
function mandreelLoadPackData(data, save_pack)
{
var files = mandreelFatData.split('\n');
var current_dir = '';
var current_offset = 0;
if (save_pack)
mandreel_fs_saveFile(mandreel_packfiledata_name,data);
for (var i=0;i<files.length;++i)
{
var file_data = files[i].split(',');
if (file_data[0] == 'dir')
{
current_dir = file_data[1];
//current_dir = current_dir.substr(0,current_dir.lengh-1);
}
else if (file_data[0] == 'file')
{
var file_name = current_dir + file_data[1];
file_name = mandreel_chanka_fixfile(file_name) ;
//dump('new file ' + file_name + ' ' + current_offset);
//dump(file_name);
var file_size = parseInt(file_data[2]);
var my_array = new ArrayBuffer(file_size);
var my_bytes = new Uint8Array(my_array);
var data_bytes = new Uint8Array(data,current_offset,file_size);
my_bytes.set(data_bytes);
mandreel_cache_files[file_name] = my_array;
current_offset+=file_size;
}
}
g_mandreel_datafiles_sufix = '';
mandreelCacheMandreelFat();
imandreelJsScriptLoaded();
}
var preCreatedWebAudioContext = null;
function mandreelLoadFat()
{
mandreelFatPreloadRequest = new Mandreel_XMLHttpRequest();
var working_folder = mandreelAppWorkingFolder;
if ( mandreelAppReadDataFromLocalHost )
working_folder = mandreelAppLocalHost+"/"+mandreelAppWorkingFolder;
var url = working_folder+"mandreel.fat.dat";
if ( mandreelAppPlatform == "nacl" )
url = working_folder+"mandreel.fat";
mandreelFatPreloadRequest.open("GET", url, true);
mandreelFatPreloadRequest.onreadystatechange = function()
{
if (mandreelFatPreloadRequest.readyState != 4) return;
if ( mandreelFatPreloadRequest.status != 404 && mandreelFatPreloadRequest.response != null )
{
mandreelFatData = mandreelFatPreloadRequest.response;
}
if ( mandreelFatData == "" )
{
dump("error loading mandreel.fat file, Maybe the working folder is not correctly set???");
}
var packfiledata = null;
var compressed = false;
var packfiledata_size = 0;
var total_packtexture_size = 0;
var pogsize = 0;
// Check version
var FatLines = mandreelFatData.split('\n');
for ( var i=0;i<FatLines.length;++i )
{
var line = mandreel_removecr(FatLines[i]);
var params = line.split(',');
if ( params[0] == "version" )
{
if ( params[1] != mandrelCurrentFatVersion )
dump("warning: mandreel.fat version number is ("+params[1]+") and it should be ("+mandrelCurrentFatVersion+")");
}
else if ( params[0] == "platform" && params[1] != "js" && (mandreelAppPlatform == "webgl" || mandreelAppPlatform == "canvas") )
dump("warning: mandreel.fat platform is ("+params[1]+") and it should be (js)");
else if ( params[0] == "platform" && params[1] != "nacl" && mandreelAppPlatform == "nacl" )
dump("warning: mandreel.fat platform is ("+params[1]+") and it should be (nacl)");
else if (params[0] == 'packdata')
{
packfiledata = params[1];
compressed = params[2].charAt(0) == '1';
packfiledata_size = parseInt(params[3], 10);
}
else if (params[0] == 'flashsockets')
{
mandreelAppUseFlashSockets = true;
}
else if (params[0] == 'packtexture')
{
var filename = params[1];
var size_packtexture = parseInt(params[3], 10);
total_packtexture_size+=size_packtexture;
mandreelAppUsePackAsyncTexture.push(filename);
}
else if (params[0] == 'audiopreloadfile')
{
pogsize = parseInt(params[2],10);
}
else if (params[0] == 'audiodriver' && params[1] == 'webaudio')
{
try { preCreatedWebAudioContext = new webkitAudioContext(); } catch(err) { preCreatedWebAudioContext = null; }
}
}
if ( preCreatedWebAudioContext != null )
mandreel_total_pogfile_size = pogsize;
mandreel_packfiledata_name = packfiledata;
mandreel_packfiledata_compressed = compressed;
mandreel_packfiledata_size = packfiledata_size;
mandreel_total_packtexture_size = total_packtexture_size;
mandreelFatLoaded();
}
mandreelFatPreloadRequest.send();
}
var mandreelAppStartStateFunc = 0;
var mandreelDisableSpaceKey = true;
////////////////////////////////////////////
function mandreelAppStart(startStateFunc,params)
{
mandreelAppStartStateFunc = startStateFunc;
if ( typeof(params.log) != 'undefined' )
mandreelAppLog = params.log;
if ( typeof(params.platform) != 'undefined' )
mandreelAppPlatform = params.platform;
if (typeof(params.mandreelJSCompressed) != 'undefined' )
mandreelAppMandreelJsCompressed = params.mandreelJSCompressed;
/* The following code is removed for benchmarking:
if ((mandreel_BrowserDetect.browser == 'Chrome' || mandreel_BrowserDetect.browser == 'Safari') && mandreel_BrowserDetect.OS == 'Mac' && mandreelAppPlatform == "flash")
mandreelDisableSpaceKey = false; */
if ( mandreelAppPlatform != "webgl" && mandreelAppPlatform != "flash" && mandreelAppPlatform != "nacl" && mandreelAppPlatform != "canvas" && mandreelAppPlatform != "plugin")
{
mandreelAppStartStateFunc("error",'platform ('+mandreelAppPlatform+') not supported');
return;
}
if ( mandreelAppPlatform == "webgl" || mandreelAppPlatform == "canvas" )
{
mandreelAppWorkingFolder = "data/js/";
if ( typeof(params.workingFolderWebgl) != 'undefined' )
mandreelAppWorkingFolder = params.workingFolderWebgl;
// Check Float64Array availability
if ( !Mandreel_window["Float64Array"] )
{
mandreelAppStartStateFunc("error",'Browser unsupported: Float64Array not available');
return;
}
var flashElement = Mandreel_document.getElementById('FlashWrapper');
if ( flashElement != null )
{
flashElement.style.visibility = "hidden";
flashElement.style.width = "0px";
flashElement.style.height = "0px";
}
var flashElement = Mandreel_document.getElementById('FlashDiv');
if ( flashElement != null )
{
flashElement.style.visibility = "hidden";
flashElement.style.width = "0px";
flashElement.style.height = "0px";
}
// Setup WebGL
if ( typeof(params.webglCanvas) == 'undefined' )
{
mandreelAppStartStateFunc("error",'canvas parameter not found');
return;
}
var canvas = Mandreel_document.getElementById(params.webglCanvas);
if ( canvas == null )
{
mandreelAppStartStateFunc("error",'canvas object ('+params.webglCanvas+') not found');
return;
}
if ( params.width != null )
{
canvas.width = params.width;
mandreelAppWidthSrc = params.width;
}
if ( params.height != null )
{
canvas.height = params.height;
mandreelAppHeightSrc = params.height;
}
if ( mandreelAppPlatform == "webgl" )
{
// The following code is removed for benchmarking:
// imandreel_gl = WebGLUtils.setupWebGL(canvas,{premultipliedAlpha:false,alpha:false});
// if (imandreel_gl == null)
// {
// mandreelAppStartStateFunc("error","webgl_not_found");
// return;
// }
}
if ( mandreelAppPlatform == "canvas" )
{
imandreel_ctx_canvas = canvas.getContext('2d');
if ( imandreel_ctx_canvas == null )
{
mandreelAppStartStateFunc("error","canvas context 2d not found");
return;
}
}
if (params.cache != null)
{
//alert( params.cache.size + params.cache.url);
mandreel_fs_init(function() { if ( mandreelAppStartStateFunc )
mandreelAppStartStateFunc("loadingFat","");
mandreelLoadFat();}, params.cache.size,params.cache.url);
}
else
{
// load Fat
if ( mandreelAppStartStateFunc )
mandreelAppStartStateFunc("loadingFat","");
mandreelLoadFat();
}
}
if ( mandreelAppPlatform == "flash" )
{
mandreelAppWorkingFolder = "data/as3/";
if ( typeof(params.workingFolderFlash) != 'undefined' )
mandreelAppWorkingFolder = params.workingFolderFlash;
if (!swfobject.hasFlashPlayerVersion('11.2.0'))
{
mandreelAppStartStateFunc("error","flash 11 not found");
return;
}
if ( typeof(params.flashCanvas) == 'undefined' )
{
mandreelAppStartStateFunc("error",'canvas parameter not found');
return;
}
if ( true ) // hide webgl canvas
{
var canvas = Mandreel_document.getElementById(mandreelAppCanvasDiv);
if ( canvas != null )
{
canvas.style.visibility = "hidden";
canvas.style.width = "0px";
canvas.style.height = "0px";
}
}
if ( params.width != null )
{
mandreelAppCanvasWidth = params.width;
}
if ( params.height != null )
{
mandreelAppCanvasHeight = params.height;
}
mandreelAppCanvasDiv = params.flashCanvas;
try
{
var mandreelSocketsSwf = "mandreel.swf";
if ( typeof(params.swfFlash) != 'undefined' )
mandreelSocketsSwf = params.swfFlash;
var my_flashvars = "workingFolder=" + encodeURIComponent(mandreelAppWorkingFolder);
if ( typeof(params.log) != 'undefined' && params.log == true)
my_flashvars += "&log=true"
my_flashvars += "&width=" + params.width;
my_flashvars += "&height=" + params.height;
my_flashvars += "&swfloader=" + mandreelSocketsSwf;
if (typeof(params.restore_context) != 'undefined' && params.restore_context == true)
my_flashvars += "&restore_context=1";
if (typeof(params.antialiasing) != 'undefined')
my_flashvars += "&antialiasing=" + params.antialiasing;
if (typeof(params.right_click_enable) != 'undefined' && params.right_click_enable == true)
my_flashvars += "&right_click=1";
if (typeof(params.disable_depth) != 'undefined' && params.disable_depth == true)
my_flashvars += "&disable_depth=1";
var swfname = "mandreelloader.swf";
if ( typeof(params.swfPreloader) != 'undefined' && params.swfPreloader == false)
swfname = mandreelSocketsSwf;
var swf = swfobject.createSWF({ data:swfname, width:"100%", height:"100%" }, { menu:"false",allowScriptAccess:"always",allowFullScreen:"true",wmode:"direct",scale:"noscale",salign :"tl",bgcolor:"#000000",flashvars:my_flashvars}, params.flashCanvas);
if ( !swf )
{
mandreelAppStartStateFunc("error","error loading " + swfname);
return;
}
else
{
if ( mandreelAppStartStateFunc )
mandreelAppStartStateFunc("loadingScript","");
}
}
catch(err)
{
mandreelAppStartStateFunc("error","exception " + err + " while loading " + mandreelSocketsSwf);
return;
}
appStartState('loadingScript');
}
if ( mandreelAppPlatform == "nacl" )
{
mandreelAppWorkingFolder = "data/nacl/";
// load Fat
if ( mandreelAppStartStateFunc )
mandreelAppStartStateFunc("loadingFat","");
mandreelLoadFat();
}
if ( mandreelAppPlatform == "plugin" )
{
mandreelInitPluginPlatform(params);
}
}
////////////////////////////////////////////
function MandreelAudioStartedNacl()
{
var helloWorldModule = null;
helloWorldModule = Mandreel_document.getElementById('hello_world');
helloWorldModule.postMessage('init');
var flashElement = Mandreel_document.getElementById('FlashWrapper');
if ( flashElement != null )
flashElement.style.visibility = "hidden";
mandreelAppStartStateFunc("ready",mandreelAppCanvasWidth,mandreelAppCanvasHeight);
}
////////////////////////////////////////////
function _mandreelAppStartReady()
{
if ( mandreelAppPlatform == "nacl" )
{
wa_initWebAudio();
mandreel_webAudio_PreloadAssets();
}
else
{
if ( mandreelAppStartStateFunc )
{
mandreelAppStartRenderWebGL();
mandreelAppStartStateFunc("ready",mandreelAppCanvasWidth,mandreelAppCanvasHeight);
}
}
}
////////////////////////////////////////////
function _mandreelAppAudioReady()
{
if ( mandreelAppStartStateFunc )
mandreelAppStartStateFunc("audioLoaded","");
if ( mandreelAppUseFlashSockets )
mandreel_flash_sockets_load_flash(_mandreelAppStartReady);
else
_mandreelAppStartReady();
}
////////////////////////////////////////////
function mandreelAppInit()
{
if ( mandreelAppPlatform == "webgl" || mandreelAppPlatform == "canvas" )
{
global_init(g_stack_pointer+800*1024);
//Mandreel_TextureAsync_PackBufferData[_mandreel_currentPackTexture] = mandreelBufferPackAsyncTexture;
//mandreelBufferPackAsyncTexture = null;
var sp = g_stack_pointer+800*1024;
heapU32[sp>>2] = mandreelAppCanvasWidth;
heapU32[(sp+4)>>2] = mandreelAppCanvasHeight;
__mandreel_internal_SetResolution(sp);
__mandreel_internal_init(g_stack_pointer+800*1024);
__init(g_stack_pointer+800*1024);
}
}
////////////////////////////////////////////
function mandreelAppDraw(elapsed)
{
if ( mandreelAppPlatform == "webgl" || mandreelAppPlatform == "canvas" )
{
if ( mandreelAppPlatform == "canvas" && imandreel_ctx_canvas != null )
{
var canvas = Mandreel_document.getElementById(mandreelAppCanvasName);
imandreel_ctx_canvas.clearRect(0,0,canvas.width,canvas.height);
}
var sp = g_stack_pointer+800*1024;
__mandreel_internal_preupdate(sp);
heapU32[sp>>2] = elapsed;
__draw(sp);
__mandreel_internal_update(sp);
__mandreel_process_async_calls();
}
}
////////////////////////////////////////////
function mandreelAppMouseWheel(delta)
{
if ( mandreelAppPlatform == "webgl" || mandreelAppPlatform == "canvas" )
{
var i7 = MandreelLockFrame();
heap32[(i7+0)>>2] = delta;
__mouseWheelDelta(i7);
MandreelUnlockFrame();
}
}
////////////////////////////////////////////
function mandreelAppMouseMove(x,y)
{
if ( mandreelAppPlatform == "webgl" || mandreelAppPlatform == "canvas" )
{
var i7 = MandreelLockFrame();
heap32[(i7+0)>>2] = x;
heap32[(i7+4)>>2] = y;
__mouseMove(i7);
MandreelUnlockFrame();
}
}
////////////////////////////////////////////
function mandreelAppResize(x,y)
{
if ( mandreelAppPlatform == "webgl" || mandreelAppPlatform == "canvas" )
{
var i7 = MandreelLockFrame();
heap32[(i7+0)>>2] = x;
heap32[(i7+4)>>2] = y;
__resize(i7);
heap32[(i7+0)>>2] = x;
heap32[(i7+4)>>2] = y;
__mandreel_internal_SetResolution(i7);
MandreelUnlockFrame();
}
}
////////////////////////////////////////////
function mandreelAppMouseButton(down,x,y)
{
if ( mandreelAppPlatform == "webgl" || mandreelAppPlatform == "canvas" )
{
var i7 = MandreelLockFrame();
heap32[(i7+0)>>2] = down;
heap32[(i7+4)>>2] = x;
heap32[(i7+8)>>2] = y;
__mouseButton(i7);
MandreelUnlockFrame();
}
}
////////////////////////////////////////////
function mandreelAppMouseDblClick(x,y)
{
if ( mandreelAppPlatform == "webgl" || mandreelAppPlatform == "canvas" )
{
var i7 = MandreelLockFrame();
heap32[(i7+0)>>2] = x;
heap32[(i7+4)>>2] = y;
__mouseDoubleClick(i7);
MandreelUnlockFrame();
}
}
////////////////////////////////////////////
function mandreelAppKeyEvent(down,keyId)
{
if ( mandreelAppPlatform == "webgl" || mandreelAppPlatform == "canvas" )
{
var i7 = MandreelLockFrame();
heap32[(i7+0)>>2] = down;
heap32[(i7+4)>>2] = keyId;
__keyEvent(i7);
MandreelUnlockFrame();
}
}
////////////////////////////////////////////
function mandreelAppGetPlatform()
{
return mandreelAppPlatform;
}
////////////////////////////////////////////
function mandreelAppGetElementAbsolutePos(elementName)
{
var element = Mandreel_document.getElementById(elementName);
var res = new Object();
res.x = 0; res.y = 0;
if (element !== null)
{
if (element.getBoundingClientRect)
{
var viewportElement = Mandreel_document.documentElement;
var box = element.getBoundingClientRect();
var scrollLeft = viewportElement.scrollLeft;
var scrollTop = viewportElement.scrollTop;
res.x = box.left + scrollLeft;
res.y = box.top + scrollTop;
}
else
{ //for old browsers
res.x = element.offsetLeft;
res.y = element.offsetTop;
var parentNode = element.parentNode;
var borderWidth = null;
while (offsetParent != null)
{
res.x += offsetParent.offsetLeft;
res.y += offsetParent.offsetTop;
var parentTagName = offsetParent.tagName.toLowerCase();
if ((__isIEOld && parentTagName != "table") ||
((__isFireFoxNew || __isChrome) &&
parentTagName == "td"))
{
borderWidth = kGetBorderWidth(offsetParent);
res.x += borderWidth.left;
res.y += borderWidth.top;
}
if (offsetParent != Mandreel_document.body &&
offsetParent != Mandreel_document.documentElement)
{
res.x -= offsetParent.scrollLeft;
res.y -= offsetParent.scrollTop;
}
//next lines are necessary to fix the problem
//with offsetParent
if (!__isIE && !__isOperaOld || __isIENew)
{
while (offsetParent != parentNode &&
parentNode !== null) {
res.x -= parentNode.scrollLeft;
res.y -= parentNode.scrollTop;
if (__isFireFoxOld || __isWebKit)
{
borderWidth =
kGetBorderWidth(parentNode);
res.x += borderWidth.left;
res.y += borderWidth.top;
}
parentNode = parentNode.parentNode;
}
}
parentNode = offsetParent.parentNode;
offsetParent = offsetParent.offsetParent;
}
}
}
return res;
}
function __getIEVersion()
{
var rv = -1; // Return value assumes failure.
if (navigator.appName == 'Microsoft Internet Explorer')
{
var ua = navigator.userAgent;
var re = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
if (re.exec(ua) != null)
rv = parseFloat(RegExp.$1);
}
return rv;
}
function __getOperaVersion()
{
var rv = 0; // Default value
if (Mandreel_window.opera)
{
var sver = Mandreel_window.opera.version();
rv = parseFloat(sver);
}
return rv;
}
/* The following code was removed for benchmarking:
var __userAgent = navigator.userAgent;
var __isIE = navigator.appVersion.match(/MSIE/) != null;
var __IEVersion = __getIEVersion();
var __isIENew = __isIE && __IEVersion >= 8;
var __isIEOld = __isIE && !__isIENew;
var __isFireFox = __userAgent.match(/firefox/i) != null;
var __isFireFoxOld = __isFireFox && ((__userAgent.match(/firefox\/2./i) != null) || (__userAgent.match(/firefox\/1./i) != null));
var __isFireFoxNew = __isFireFox && !__isFireFoxOld;
var __isWebKit = navigator.appVersion.match(/WebKit/) != null;
var __isChrome = navigator.appVersion.match(/Chrome/) != null;
var __isOpera = Mandreel_window.opera != null;
var __operaVersion = __getOperaVersion();
var __isOperaOld = __isOpera && (__operaVersion < 10); */
function __parseBorderWidth(width)
{
var res = 0;
if (typeof(width) == "string" && width != null && width != "" )
{
var p = width.indexOf("px");
if (p >= 0)
{
res = parseInt(width.substring(0, p));
}
else
{
//do not know how to calculate other values (such as 0.5em or 0.1cm) correctly now so just set the width to 1 pixel
res = 1;
}
}
return res;
}
function __getBorderWidth(element)
{
var res = new Object();
res.left = 0; res.top = 0; res.right = 0; res.bottom = 0;
if (Mandreel_window.getComputedStyle)
{
//for Firefox
var elStyle = Mandreel_window.getComputedStyle(element, null);
res.left = parseInt(elStyle.borderLeftWidth.slice(0, -2));
res.top = parseInt(elStyle.borderTopWidth.slice(0, -2));
res.right = parseInt(elStyle.borderRightWidth.slice(0, -2));
res.bottom = parseInt(elStyle.borderBottomWidth.slice(0, -2));
}
else
{
//for other browsers
res.left = __parseBorderWidth(element.style.borderLeftWidth);
res.top = __parseBorderWidth(element.style.borderTopWidth);
res.right = __parseBorderWidth(element.style.borderRightWidth);
res.bottom = __parseBorderWidth(element.style.borderBottomWidth);
}
return res;
}
////////////////////////////////////////////
// WebGL
////////////////////////////////////////////
var imandreel_gl = null;
var imandreel_ctx_canvas = null;
var imandreel_is_ready = 0;
var imandreel_oldTime = Date_now();
function mandreel_wheel(event) { imandreel_onMouseWheel(event);event.preventDefault(); event.returnValue=false; }
////////////////////////////////////////////
function mandreelAppStartRenderWebGL()
{
/* The following code was removed for benchmarking:
var canvas = document.getElementById(mandreelAppCanvasName);
mandreelAppCanvasWidth = canvas.width;
mandreelAppCanvasHeight = canvas.height;
// Register event handlers
if(window.addEventListener){ window.addEventListener('DOMMouseScroll',mandreel_wheel,false); } window.onmousewheel=document.onmousewheel=mandreel_wheel;
window.addEventListener('mousedown',imandreel_onMouseDown,false);
window.addEventListener('mouseup',imandreel_onMouseUp,false);
window.addEventListener('mousemove',imandreel_onMouseMove,false);
window.addEventListener('dblclick',imandreel_onMouseDblClick,false);
document.body.oncontextmenu = function() { return false;};
var canvasDiv = document.getElementById(mandreelAppCanvasDiv);
canvasDiv.addEventListener('keydown',imandreel_onKeyDown,false);
canvasDiv.addEventListener('keyup',imandreel_onKeyUp,false);
canvasDiv.focus();*/
// Call mandreel app init funtion (__init())
mandreelAppInit();
// Start rendering
imandreel_is_ready = 1;
//imandreel_render();
}
////////////////////////////////////////////
function imandreel_render()
{
if( ABORT )
return;
var canvas = Mandreel_document.getElementById(mandreelAppCanvasName);
WebGLUtils.requestAnimationFrame(canvas, imandreel_render);
// Reshape
if (canvas.clientWidth != mandreelAppCanvasWidth || canvas.clientHeight != mandreelAppCanvasHeight)
{
mandreelAppCanvasWidth = canvas.clientWidth;
mandreelAppCanvasHeight = canvas.clientHeight;
imandreel_gl.viewport(0, 0, mandreelAppCanvasWidth, mandreelAppCanvasHeight);
}
// Set the focus to the canvas div
if (mandreelAppForceFocus)
{
var canvasDiv = Mandreel_document.getElementById(mandreelAppCanvasDiv);
canvasDiv.focus();
}
// Call mandreel app draw funtion (__draw())
var nowTime = Date_now();
if (!g_mandreel_frame_locked)
{
g_mandreel_frame_inframe = true;
if (!_imandreel_pause_game)
mandreelAppDraw(nowTime-imandreel_oldTime);
g_mandreel_frame_inframe = false;
}
imandreel_oldTime = nowTime;
}
function render()
{
// Call mandreel app draw funtion (__draw())
var nowTime = Date_now();
if (!g_mandreel_frame_locked)
{
g_mandreel_frame_inframe = true;
if (!_imandreel_pause_game)
mandreelAppDraw(nowTime-imandreel_oldTime);
g_mandreel_frame_inframe = false;
}
imandreel_oldTime = nowTime;
}
var imandreel_last_movex = 0;
var imandreel_last_movey = 0;
////////////////////////////////////////////
function imandreel_onMouseMove(e)
{
if (!imandreel_is_ready)
return;
if (_imandreel_pause_game)
return;
var pos = mandreelAppGetElementAbsolutePos(mandreelAppCanvasName);
var setX = e.clientX - pos.x;
var setY = e.clientY - pos.y;
if(navigator.pointer && navigator.pointer.isLocked) {
var deltaX = event.movementX || event.webkitMovementX || event.mozMovementX || 0;
var deltaY = event.movementY || event.webkitMovementY || event.mozMovementX || 0;
setX = imandreel_last_movex+deltaX;
setY = imandreel_last_movey+deltaY;
}
imandreel_last_movex = setX;
imandreel_last_movey = setY;
mandreelAppMouseMove(setX,setY);
}
////////////////////////////////////////////
function imandreel_onMouseDblClick(e)
{
if (!imandreel_is_ready)
return;
if (_imandreel_pause_game)
return;
var pos = mandreelAppGetElementAbsolutePos(mandreelAppCanvasName);
var setX = e.clientX - pos.x;
var setY = e.clientY - pos.y;
mandreelAppMouseDblClick(setX,setY);
}
////////////////////////////////////////////
var mandreel_mouse_down = false;
var mandreel_rmouse_down = false;
function imandreel_onMouseDown(e)
{
if (!imandreel_is_ready)
return;
if (_imandreel_pause_game)
return;
var rightclick;
if (!e) var e = Mandreel_window.event;
if (e.which) rightclick = (e.which == 3);
else if (e.button) rightclick = (e.button == 2);
var pos = mandreelAppGetElementAbsolutePos(mandreelAppCanvasName);
var setX = e.clientX - pos.x;
var setY = e.clientY - pos.y;
if (!rightclick)
{
if (mandreel_mouse_down)
return;
mandreel_mouse_down = true;
mandreelAppMouseButton(1,setX,setY);
}
else
{
if (mandreel_rmouse_down)
return;
mandreel_rmouse_down = true;
mandreelAppMouseButton(3,setX,setY);
}
}
///////////////////////////////////////////