UNPKG

testrumenter

Version:

Command-line utility to test JavaScript code instrumenter

1,904 lines (1,612 loc) 5 MB
// 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); } } ///////////////////////////////////////////