| @@ -82,11 +82,9 @@ doc/samples/benchsuite | |||
| doc/samples/bluenoise | |||
| doc/samples/btphystest | |||
| doc/samples/meshviewer/meshviewer | |||
| doc/samples/nacl_phystest | |||
| doc/samples/sandbox/sample | |||
| doc/samples/math/pi | |||
| doc/samples/math/poly | |||
| doc/samples/nacl_phystest | |||
| doc/samples/simplex | |||
| doc/tutorial/01_triangle | |||
| doc/tutorial/02_cube | |||
| @@ -6,7 +6,7 @@ include $(top_srcdir)/build/autotools/common.am | |||
| EXTRA_DIST += lol-build \ | |||
| check-source.sh run-bitten.sh \ | |||
| build-linux build-mingw build-mingw64 \ | |||
| build-nacl32 build-nacl64 build-android build-html \ | |||
| build-android build-html \ | |||
| \ | |||
| msbuild/lolfx.targets \ | |||
| msbuild/lolfx.xml \ | |||
| @@ -90,19 +90,6 @@ fi | |||
| AM_CONDITIONAL(LOL_USE_BULLET, test "${ac_cv_my_have_bullet}" = "yes") | |||
| dnl Use NativeClient? | |||
| ac_cv_my_have_nacl="no" | |||
| AC_LANG_PUSH(C++) | |||
| AC_CHECK_HEADERS(ppapi/cpp/instance.h, | |||
| [ac_cv_my_have_nacl="yes" | |||
| LOL_LIBS="${LOL_LIBS} -lnosys" | |||
| if test "${ac_cv_my_build_mode}" = "xrelease"; then | |||
| LOL_TRY_CXXFLAGS(-s, [AM_CXXFLAGS="${AM_CXXFLAGS} -s"]) | |||
| fi]) | |||
| AC_LANG_POP(C++) | |||
| AM_CONDITIONAL(LOL_USE_NACL, test "${ac_cv_my_have_nacl}" != "no") | |||
| dnl Use Android? FIXME: super hacks! | |||
| ac_cv_my_have_android="no" | |||
| AC_CHECK_LIB(log, __android_log_vprint, | |||
| @@ -1,10 +0,0 @@ | |||
| #!/bin/sh | |||
| # This can't hurt | |||
| make distclean | |||
| set -e | |||
| ./build/lol-build "$@" bootstrap nacl-i386 | |||
| ./build/lol-build "$@" configure nacl-i386 | |||
| ./build/lol-build "$@" build nacl-i386 | |||
| @@ -1,10 +0,0 @@ | |||
| #!/bin/sh | |||
| # This can't hurt | |||
| make distclean | |||
| set -e | |||
| ./build/lol-build "$@" bootstrap nacl-amd64 | |||
| ./build/lol-build "$@" configure nacl-amd64 | |||
| ./build/lol-build "$@" build nacl-amd64 | |||
| @@ -20,8 +20,6 @@ | |||
| # And <platform> is one of: | |||
| # - linux-i386 | |||
| # - linux-amd64 | |||
| # - nacl-i386 | |||
| # - nacl-amd64 | |||
| # - ios-arm | |||
| # - osx-amd64 | |||
| # - android-arm | |||
| @@ -238,12 +236,6 @@ configure() | |||
| raspi-arm) | |||
| do_configure --host=arm-bcm2708hardfp-linux-gnueabi CPPFLAGS="-I$RASPI_SDK_ROOT/firmware/opt/vc/include -I$RASPI_SDK_ROOT/firmware/opt/vc/include/interface/vmcs_host/linux -I$RASPI_SDK_ROOT/chroot/usr/include -I$RASPI_SDK_ROOT/chroot/usr/include/arm-linux-gnueabihf" LDFLAGS="-L$RASPI_SDK_ROOT/firmware/opt/vc/lib -L$RASPI_SDK_ROOT/chroot/lib/arm-linux-gnueabihf -Wl,-rpath-link -Wl,$RASPI_SDK_ROOT/chroot/lib/arm-linux-gnueabihf -L$RASPI_SDK_ROOT/chroot/usr/lib/arm-linux-gnueabihf -Wl,-rpath-link -Wl,$RASPI_SDK_ROOT/chroot/usr/lib/arm-linux-gnueabihf -Wl,--unresolved-symbols=ignore-in-shared-libs" | |||
| ;; | |||
| nacl-i386) | |||
| do_configure CXX=i686-nacl-g++ CC=i686-nacl-gcc ac_cv_exeext=.32.nexe --host=i386 CPPFLAGS="-I$NACL_SDK_ROOT/include" LOL_LIBS="-lppapi -lppapi_gles2 -lppapi_cpp -u _ZN2pp12CreateModuleEv" | |||
| ;; | |||
| nacl-amd64) | |||
| do_configure CXX=x86_64-nacl-g++ CC=x86_64-nacl-gcc ac_cv_exeext=.64.nexe --host=x86_64 CPPFLAGS="-I$NACL_SDK_ROOT/include" LOL_LIBS="-lppapi -lppapi_gles2 -lppapi_cpp -u _ZN2pp12CreateModuleEv" | |||
| ;; | |||
| osx-amd64) | |||
| # HACK: use clang++ because of a memory leak in llvm-g++. | |||
| do_configure CXX=clang++ CC=clang | |||
| @@ -312,8 +304,6 @@ check() | |||
| ;; | |||
| raspi-arm) | |||
| ;; | |||
| nacl-*) | |||
| ;; | |||
| web-*) | |||
| ;; | |||
| win*-i386) | |||
| @@ -188,21 +188,6 @@ if [ "$family" != "windows" ]; then | |||
| fi | |||
| append "" | |||
| # | |||
| # Google NaCl SDK | |||
| # | |||
| append "[pepper]" | |||
| if [ "$family" != "windows" ]; then | |||
| if [ -f "$NACL_SDK_ROOT/README" ]; then | |||
| pepper_version=$(sed -ne 's/Version: //p' "$NACL_SDK_ROOT/README") | |||
| if [ "x$pepper_version" != "x" ]; then | |||
| append "version = $pepper_version" | |||
| fi | |||
| fi | |||
| fi | |||
| append "" | |||
| # | |||
| # Raspberry Pi cross-compiler | |||
| # | |||
| @@ -799,7 +799,6 @@ INPUT = .. \ | |||
| ../src/platform \ | |||
| ../src/platform/android \ | |||
| ../src/platform/d3d9 \ | |||
| ../src/platform/nacl \ | |||
| ../src/platform/sdl \ | |||
| ../src/platform/xbox \ | |||
| ../src/thread | |||
| @@ -9,7 +9,6 @@ bench: benchsuite$(EXEEXT) | |||
| if BUILD_SAMPLES | |||
| noinst_PROGRAMS = bluenoise benchsuite simplex | |||
| if LOL_USE_GL | |||
| noinst_PROGRAMS += nacl_phystest | |||
| if LOL_USE_BULLET | |||
| noinst_PROGRAMS += btphystest | |||
| endif | |||
| @@ -44,13 +43,6 @@ btphystest_LDFLAGS += \ | |||
| -s TOTAL_MEMORY=$(shell expr 32 '*' 1024 '*' 1024) | |||
| endif | |||
| nacl_phystest_SOURCES = \ | |||
| nacl_phystest.cpp nacl_phystest.h | |||
| nacl_phystest_CPPFLAGS = $(AM_CPPFLAGS) -I$(top_srcdir)/src/3rdparty/bullet3/src \ | |||
| -DHAVE_PHYS_USE_BULLET | |||
| nacl_phystest_DEPENDENCIES = @LOL_DEPS@ | |||
| nacl_phystest_LDFLAGS = $(AM_LDFLAGS) | |||
| simplex_SOURCES = simplex.cpp | |||
| simplex_CPPFLAGS = $(AM_CPPFLAGS) | |||
| simplex_DEPENDENCIES = @LOL_DEPS@ | |||
| @@ -1,10 +0,0 @@ | |||
| <DOCTYPE html> | |||
| <html> | |||
| <meta http-equiv="Content-type" content="text/html;charset=UTF-8" /> | |||
| <head> | |||
| </head> | |||
| <body> | |||
| <!-- I'm only here to ensure embed viewport of NaCl/Emscripten is "not empty" --> | |||
| </body> | |||
| </html> | |||
| @@ -1,105 +0,0 @@ | |||
| //------------------------------------------------------------------------- | |||
| // MODULE INIT FUNCTIONS | |||
| //------------------------------------------------------------------------- | |||
| function RegisterListener() | |||
| { | |||
| //Register all the correct functions to the listener | |||
| var div_listener = GetiFrameDivEmbed(); | |||
| if (div_listener) | |||
| { | |||
| div_listener.addEventListener('loadstart', NaClModuleStartedLoad, true); | |||
| div_listener.addEventListener('load', NaClModuleDidLoad, true); | |||
| div_listener.addEventListener('error', NaClModuleError, true); | |||
| div_listener.addEventListener('progress', NaClModuleLoadUpdate, true); | |||
| div_listener.addEventListener('message', NaClModuleSentMessage, true); | |||
| div_listener.addEventListener('crash', NaClModuleCrash, true); | |||
| window.setTimeout("UpdateTextStatus(0.1)", 100); | |||
| } | |||
| else if (IsUsingNaCl()) | |||
| window.setTimeout("RegisterListener()", 200); | |||
| } | |||
| function NaClInitModuleVar() | |||
| { | |||
| InitModuleVar(); | |||
| if (g_embed_module) | |||
| g_embed_module['SendMessage'] = function(message) { g_embed_module.postMessage(message); } | |||
| } | |||
| //------------------------------------------------------------------------- | |||
| // MODULE LOADING FUNCTIONS | |||
| //------------------------------------------------------------------------- | |||
| //Indicate page has been loaded. | |||
| function NaClLoadingInit() | |||
| { | |||
| HideProgressStatus(false); | |||
| //Page did load before NaCl module | |||
| if (!g_embed_module) | |||
| AddTextStatus('Please wait for module loading'); | |||
| RegisterListener(); | |||
| } | |||
| //Module starts load | |||
| function NaClModuleStartedLoad() | |||
| { | |||
| AddTextStatus('Module Started Loading'); | |||
| NaClInitModuleVar(); | |||
| } | |||
| //Module progress event | |||
| function NaClModuleLoadUpdate(event) | |||
| { | |||
| if (event.lengthComputable) | |||
| UpdateProgressBarValue('Please wait, loading', event.loaded, event.total); | |||
| else | |||
| UpdateProgressBarValue('Please wait, calculating load balance ...'); | |||
| } | |||
| //Indicate module load success. | |||
| function NaClModuleDidLoad() | |||
| { | |||
| if (!g_embed_module) | |||
| NaClInitModuleVar(); | |||
| //Hide the progress div | |||
| AddTextStatus('Module is live, thank you for your patience.'); | |||
| window.setTimeout('HideProgressStatus(true)', GetMaxStatusTime(0.5) * 1000); | |||
| ModuleIsLive(); | |||
| } | |||
| //Module did crash | |||
| function NaClModuleCrash(event) | |||
| { | |||
| NaClRestartModule(); | |||
| AddTextStatus("Module has crashed ! Restarting ..."); | |||
| } | |||
| //Module had an error | |||
| function NaClModuleError(event) | |||
| { | |||
| NaClRestartModule(); | |||
| AddTextStatus("Module Load/start Error ! Restarting ..."); | |||
| } | |||
| //Used to restart module on crash/error/load fail .... | |||
| function NaClRestartModule() | |||
| { | |||
| var id_frame_embed = GetFrameData(); | |||
| if (id_frame_embed) | |||
| { | |||
| HideProgressStatus(false); | |||
| window.setTimeout('GetFrameData().contentDocument.location.reload(true)', 1000); | |||
| } | |||
| } | |||
| //------------------------------------------------------------------------- | |||
| // MODULE COMMUNICATION FUNCTIONS | |||
| //------------------------------------------------------------------------- | |||
| //Handle message from the NaCl module | |||
| function NaClModuleSentMessage(message) | |||
| { | |||
| ModuleSentMessage(message); | |||
| } | |||
| @@ -1,118 +0,0 @@ | |||
| g_var_progress_bar = -1; | |||
| g_status_text = [null]; | |||
| g_status_timer = [-1.0]; | |||
| //------------------------------------------------------------------------- | |||
| // PROGRESS BAR STATUS FUNCTIONS | |||
| //------------------------------------------------------------------------- | |||
| //Update the actual progress bar | |||
| function UpdateProgressBarValue(new_status, new_value, new_max) | |||
| { | |||
| var progress_bar = GetProgressBar(); | |||
| if (progress_bar) | |||
| { | |||
| if (new_value != undefined && new_max != undefined) | |||
| { | |||
| if (progress_bar.value < 0) | |||
| g_var_progress_bar = -1; | |||
| var loading_text = new_status + '[' + (Math.min(1.0, new_value / new_max) * 100.0).toFixed(0) + '%]'; | |||
| //update the progress status | |||
| progress_bar.max = new_max; | |||
| progress_bar.value = new_value; | |||
| g_var_progress_bar = AddTextStatus(loading_text, g_var_progress_bar); | |||
| } | |||
| //Load length is not usable | |||
| else | |||
| { | |||
| if (progress_bar.value > 0) | |||
| g_var_progress_bar = -1; | |||
| progress_bar.value = -1; | |||
| g_var_progress_bar = AddTextStatus(new_status, g_var_progress_bar); | |||
| } | |||
| //Force Status text update for coherency | |||
| UpdateTextStatus(0.0); | |||
| } | |||
| } | |||
| //Add text status to the stack | |||
| function GetMaxStatusTime(min_value) | |||
| { | |||
| var higher_time = (min_value) ? (min_value) : (0.0); | |||
| for (var i = 0; i < g_status_timer.length; i++) | |||
| if (g_status_timer[i]) | |||
| higher_time = Math.max(higher_time, g_status_timer[i]); | |||
| } | |||
| //Update progress bar status | |||
| function UpdateTextStatus(seconds) | |||
| { | |||
| var div_progress_status = GetDivProgressStatus(); | |||
| if (div_progress_status) | |||
| { | |||
| div_progress_status.innerHTML = ''; | |||
| for (var i = 0; i < g_status_text.length; i++) | |||
| { | |||
| if (g_status_timer[i] == undefined || g_status_timer[i] < 0.0) | |||
| { | |||
| g_status_timer[i] = -1.0; | |||
| g_status_text[i] = undefined; | |||
| } | |||
| else | |||
| { | |||
| g_status_timer[i] -= seconds; | |||
| div_progress_status.innerHTML += g_status_text[i]; | |||
| //div_progress_status.innerHTML += '[' + g_status_timer[i].toFixed(2) + ']'; | |||
| if (i < g_status_text.length - 1) | |||
| div_progress_status.innerHTML += '<br>'; | |||
| } | |||
| } | |||
| window.setTimeout("UpdateTextStatus(0.1)", 100); | |||
| } | |||
| } | |||
| //Add text status to the stack | |||
| function AddTextStatus(message, message_id) | |||
| { | |||
| var msg_timer = 2.0; | |||
| if (message_id == undefined || message_id < 0) | |||
| { | |||
| g_status_text[g_status_text.length] = message; | |||
| g_status_timer[g_status_timer.length] = GetMaxStatusTime(msg_timer) + 0.5; | |||
| return g_status_timer.length - 1; | |||
| } | |||
| else | |||
| { | |||
| g_status_text[message_id] = message; | |||
| g_status_timer[message_id] = msg_timer; | |||
| return message_id; | |||
| } | |||
| } | |||
| //Hide Progress Status and empty status texts | |||
| function HideProgressStatus(should_hide) | |||
| { | |||
| var progress_bar = GetProgressBar(); | |||
| var div_progress = GetDivProgress(); | |||
| if (div_progress && progress_bar) | |||
| { | |||
| if (should_hide == true) | |||
| { | |||
| div_progress.style.visibility = "hidden"; | |||
| div_progress.style.zIndex = "-999"; | |||
| g_status_text.splice(0, g_status_text.length); | |||
| g_status_timer.splice(0, g_status_timer.length); | |||
| progress_bar.value = -1; | |||
| UpdateTextStatus(1.0); | |||
| } | |||
| else | |||
| { | |||
| div_progress.style.visibility = "visible"; | |||
| div_progress.style.zIndex = "999"; | |||
| progress_bar.value = -1; | |||
| AddTextStatus('Please wait for module loading'); | |||
| UpdateTextStatus(1.0); | |||
| } | |||
| } | |||
| } | |||
| @@ -1,319 +0,0 @@ | |||
| function TypeDictionnary(m_name) | |||
| { | |||
| this.m_name = m_name; | |||
| this.m_alphabet = ''; | |||
| this.m_cmds = new Array(); | |||
| this.m_vars = new Array(); | |||
| } | |||
| //----------------------------------------------------------------------------- | |||
| //Command Var object | |||
| //----------------------------------------------------------------------------- | |||
| function CmdVarObj() { } | |||
| function CmdVar(m_type, m_syntax) | |||
| { | |||
| var current_dict = GetCmdDictionnary(); | |||
| new_obj = new CmdVarObj(); | |||
| new_obj.m_type = m_type; | |||
| new_obj.m_syntax = m_syntax; | |||
| current_dict.m_vars[current_dict.m_vars.length] = new_obj; | |||
| } | |||
| //----------------------------------------------------------------------------- | |||
| //Command Argument object | |||
| //----------------------------------------------------------------------------- | |||
| function CmdArgObj() { } | |||
| function CmdArg(m_type, m_name, m_optional) | |||
| { | |||
| new_obj = new CmdArgObj(); | |||
| new_obj.m_type = m_type; | |||
| new_obj.m_name = m_name; | |||
| new_obj.m_optional = m_optional; | |||
| return new_obj; | |||
| } | |||
| //----------------------------------------------------------------------------- | |||
| //Command Typing object | |||
| //----------------------------------------------------------------------------- | |||
| function CmdTypeObj() { } | |||
| function CmdType(m_name, m_comment, m_arg) | |||
| { | |||
| var current_dict = GetCmdDictionnary(); | |||
| new_obj = new CmdTypeObj(); | |||
| new_obj.m_name = m_name; | |||
| new_obj.m_comment = m_comment; | |||
| new_obj.m_arg = m_arg; | |||
| new_obj.CheckCommand = function(check_name) | |||
| { | |||
| if (m_name != undefined && check_name.length > 0) | |||
| { | |||
| for (var i = 0; i < m_name.length; i++) | |||
| { | |||
| if (m_name[i] != undefined) | |||
| { | |||
| var pattern = new RegExp("^[ ]*" + check_name + "[a-z]*"); | |||
| if (pattern.test(m_name[i])) | |||
| return true; | |||
| } | |||
| } | |||
| } | |||
| return false; | |||
| } | |||
| current_dict.m_cmds[current_dict.m_cmds.length] = new_obj; | |||
| } | |||
| //----------------------------------------------------------------------------- | |||
| //Tries to find a matching command in the dictionnary based on the current cursor location in the given TextArea. | |||
| //----------------------------------------------------------------------------- | |||
| function FindMatchingCommand(src_text_area) | |||
| { | |||
| if (src_text_area != undefined) | |||
| { | |||
| var current_dict = GetCmdDictionnary(); | |||
| var found_match = ""; | |||
| var check = true; | |||
| var cursor = Math.min(src_text_area.selectionStart, src_text_area.value.length - 1); | |||
| //Weird test to ensure we don't start searching on the next line or on the next word. | |||
| if (!src_text_area.value[cursor].match(/^[ \n]$/)) | |||
| cursor++; | |||
| cursor = Math.min(cursor, src_text_area.value.length - 1); | |||
| var o = 0; | |||
| while (check && o < 10) | |||
| { | |||
| //Move backward to find the first letter on this line | |||
| for (; cursor > 0; cursor--) | |||
| if (src_text_area.value[cursor].match(/^[a-z\n]+$/)) | |||
| break; | |||
| //Move backward to find the start of the command | |||
| for (; cursor > 0; cursor--) | |||
| if (!src_text_area.value[cursor - 1].match(/^[#0-9a-z]+$/)) | |||
| break; | |||
| //If the cursor is on a "#" and the previous is a " ", we're on a color, repeat the operation | |||
| if (cursor > 0 && src_text_area.value[cursor - 1].match(/[ ]/) && | |||
| src_text_area.value[cursor].match(/[#]/)) | |||
| check = true; | |||
| else | |||
| check = false; | |||
| o++; | |||
| } | |||
| //Move forward to find the end of the word | |||
| for (; cursor < src_text_area.value.length; cursor++) | |||
| { | |||
| if (src_text_area.value[cursor].match(/^[a-z]+$/)) | |||
| found_match += src_text_area.value[cursor]; | |||
| else | |||
| break; | |||
| } | |||
| //Try to match the command with the dictionnary | |||
| var match_data = new Object(); | |||
| match_data.match = found_match; | |||
| match_data.match_list = new Array(); | |||
| for (cursor = 0; cursor < current_dict.m_cmds.length; cursor++) | |||
| if (current_dict.m_cmds[cursor].CheckCommand(found_match)) | |||
| match_data.match_list[match_data.match_list.length] = cursor; | |||
| return match_data; | |||
| } | |||
| } | |||
| //----------------------------------------------------------------------------- | |||
| //Build a TOC from all commands first letter | |||
| //----------------------------------------------------------------------------- | |||
| function BuildTOC(with_dot) | |||
| { | |||
| var res = ''; | |||
| var current_dict = GetCmdDictionnary(); | |||
| for (var a = 'a'.charCodeAt(0); a <= 'z'.charCodeAt(0); a++) | |||
| { | |||
| var stop = false; | |||
| for (var i = 0; !stop && i < current_dict.m_cmds.length; i++) | |||
| { | |||
| for (var j = 0; j < current_dict.m_cmds[i].m_name.length; j++) | |||
| { | |||
| if (current_dict.m_cmds[i].m_name[j][0] == String.fromCharCode(a)) | |||
| { | |||
| res += String.fromCharCode(a); | |||
| stop = true; | |||
| break; | |||
| } | |||
| } | |||
| } | |||
| if (!stop && with_dot) | |||
| res += '.'; | |||
| } | |||
| return res; | |||
| } | |||
| //----------------------------------------------------------------------------- | |||
| //Setup code lookup logic | |||
| //----------------------------------------------------------------------------- | |||
| function CmdLookup(div_cmds, div_args, div_cmnt, div_vars, text_src) | |||
| { | |||
| var cur_dict = GetCmdDictionnary(); | |||
| if (text_src != undefined) | |||
| { | |||
| var type_list = new Array(); | |||
| var cmd_size = 8; | |||
| var found = FindMatchingCommand(text_src); | |||
| if (found.match_list.length > 0) | |||
| { | |||
| var perfect_match = false; | |||
| var best_match = 0; | |||
| var best_length = 300000; | |||
| //Find the best match to put it in first in the list | |||
| for (var i = 0; i < found.match_list.length && best_length > 0; i++) | |||
| { | |||
| var cur_match = cur_dict.m_cmds[found.match_list[i]]; | |||
| for (var j = 0; j < cur_match.m_name.length && best_length > 0; j++) | |||
| { | |||
| if (cur_match.m_name[j].length == found.match.length) | |||
| { | |||
| perfect_match = true; | |||
| best_match = i; | |||
| best_length = 0; | |||
| } | |||
| else if (cur_match.m_name[j].length < best_length && | |||
| cur_match.m_name[j].length > found.match.length) | |||
| { | |||
| best_match = i; | |||
| best_length = cur_match.m_name[j].length; | |||
| } | |||
| } | |||
| } | |||
| var tmp = found.match_list[0]; | |||
| found.match_list[0] = found.match_list[best_match]; | |||
| found.match_list[best_match] = tmp; | |||
| div_cmds[0].innerHTML = ""; | |||
| div_cmds[1].innerHTML = ""; | |||
| div_args.innerHTML = ""; | |||
| div_cmnt.innerHTML = ""; | |||
| //Go through the found matches and show them. | |||
| for (var i = 0; i < found.match_list.length; i++) | |||
| { | |||
| var cur_match = cur_dict.m_cmds[found.match_list[i]]; | |||
| div_cmds[0].innerHTML += '['; | |||
| var max = cur_match.m_name.length; | |||
| var word = 0; | |||
| for (var j = 0; j < max; j++) | |||
| { | |||
| var mth = found.match; | |||
| var cmd = cur_match.m_name[j]; | |||
| //Matching start caracters should be bold | |||
| if (mth == cmd.slice(0, mth.length)) | |||
| { | |||
| div_cmds[word].innerHTML += ' '; | |||
| div_cmds[word].innerHTML += '<b>' + mth + '</b>'; | |||
| div_cmds[word].innerHTML += cmd.slice(mth.length, cmd.length); | |||
| word++; | |||
| } | |||
| } | |||
| //Complete empty command by <br> so commands in the two columns are on the same line | |||
| word = (word > 0)?(2):(0); | |||
| while (word-- > 0) | |||
| div_cmds[word].innerHTML += "<br>"; | |||
| //Go through the arguments and show them, force if we found the perfect match | |||
| if ((perfect_match || found.match_list.length < 4) && i == 0) | |||
| { | |||
| div_args.innerHTML += " > "; | |||
| if (cur_match.m_arg != undefined) | |||
| { | |||
| max = cur_match.m_arg.length; | |||
| var found_optional = false; | |||
| for (var j = 0; j < max; j++) | |||
| { | |||
| if (cur_match.m_arg[j].m_optional != undefined && found_optional == false) | |||
| { | |||
| var tab = '<br>'; for (var l = 0; l < 5; l++) tab += ' '; | |||
| div_args.innerHTML += tab + 'Opt: ['; | |||
| found_optional = true; | |||
| } | |||
| else if (j > 0) | |||
| div_args.innerHTML += ', '; | |||
| //Types are bold | |||
| div_args.innerHTML += '<b>' + cur_match.m_arg[j].m_type + '</b> '; | |||
| type_list[type_list.length] = cur_match.m_arg[j].m_type; | |||
| //Names are not | |||
| div_args.innerHTML += cur_match.m_arg[j].m_name; | |||
| if (cur_match.m_arg[j].m_optional != undefined) | |||
| div_args.innerHTML += ' = <b>' + cur_match.m_arg[j].m_optional + '</b>'; | |||
| } | |||
| if (found_optional == true) | |||
| div_args.innerHTML += '] '; | |||
| div_args.innerHTML += ' <br>'; | |||
| } | |||
| //Add the comment | |||
| if (cur_match.m_comment != undefined) | |||
| { | |||
| var tb_i = 16; var in_i = 8; | |||
| var tab = '<br>'; | |||
| if (cur_match.m_arg == undefined) { tb_i -= 8; in_i -= 8; } | |||
| for (var l = 0; l < in_i; l++) div_args.innerHTML += ' '; | |||
| for (var l = 0; l < tb_i; l++) tab += ' '; | |||
| div_args.innerHTML += cur_match.m_comment + ' '; | |||
| while (div_args.innerHTML.indexOf('\n') > -1) | |||
| div_args.innerHTML = div_args.innerHTML.replace('\n', tab); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| else | |||
| { | |||
| div_cmds[0].innerHTML = "[ ... "; | |||
| div_cmds[1].innerHTML = ""; | |||
| div_args.innerHTML = ""; | |||
| div_cmnt.innerHTML = ""; | |||
| } | |||
| //Go through the type list and bold the used ones. | |||
| if (cur_dict.m_vars != undefined) | |||
| { | |||
| div_vars.innerHTML = ""; | |||
| var max = cur_dict.m_vars.length; | |||
| for (var j = 0; j < max; j++) | |||
| { | |||
| var cur_var = cur_dict.m_vars[j]; | |||
| div_vars.innerHTML += " > "; | |||
| var k = 0; | |||
| for (; k < type_list.length; k++) | |||
| if (cur_var.m_type == type_list[k]) | |||
| break; | |||
| //Bold the used variables | |||
| if (k < type_list.length) | |||
| div_vars.innerHTML += "<b>" + cur_var.m_type + "</b>"; | |||
| else | |||
| div_vars.innerHTML += cur_var.m_type; | |||
| if (cur_var.m_syntax != undefined) | |||
| { | |||
| var align_size = 9; | |||
| var cmd_size = cur_var.m_type.length + 3; | |||
| for (var m = 0; m < cur_var.m_syntax.length; m++) | |||
| { | |||
| for (var l = 0; l < align_size - cmd_size; l++) | |||
| div_vars.innerHTML += " "; | |||
| div_vars.innerHTML += cur_var.m_syntax[m] + "<br>"; | |||
| cmd_size = 0; | |||
| } | |||
| var tab = ''; | |||
| for (var l = 0; l < align_size - cmd_size; l++) | |||
| tab += " "; | |||
| while (div_vars.innerHTML.indexOf('\n') > -1) | |||
| div_vars.innerHTML = div_vars.innerHTML.replace('\n', '<br>' + tab); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| } | |||
| @@ -1,131 +0,0 @@ | |||
| //----------------------------------------------------------------------------- | |||
| // COOKIE MANAGEMENT - nom nom nom nom - | |||
| //----------------------------------------------------------------------------- | |||
| function LolCookie() { } | |||
| function LolCookieDays(m_name, m_value, m_expire_days) | |||
| { | |||
| var cookie = new LolCookie(); | |||
| cookie.m_name = m_name; | |||
| cookie.m_value = m_value; | |||
| cookie.m_expire_date = new Date(); | |||
| cookie.m_expire_date.setDate(cookie.m_expire_date.getDate() + m_expire_days); | |||
| return cookie; | |||
| } | |||
| function LolCookieDate(m_name, m_value, m_expire_date) | |||
| { | |||
| var cookie = new LolCookie(); | |||
| cookie.m_name = m_name; | |||
| cookie.m_value = m_value; | |||
| cookie.m_expire_date = m_expire_date; | |||
| return cookie; | |||
| } | |||
| //Set a cookie | |||
| function StoreLolCookie(cookie) | |||
| { | |||
| GetLolCookie(cookie.m_name, true); | |||
| var enc_value = escape(cookie.m_value) + ";"; | |||
| //Add expire days | |||
| if (cookie.m_expire_date) | |||
| enc_value += " expires=" + cookie.m_expire_date.toUTCString() + ";"; | |||
| enc_value = cookie.m_name + "=" + enc_value; | |||
| //Store cookies | |||
| document.cookie = enc_value; | |||
| } | |||
| //Get a cookie | |||
| function GetLolCookie(name, remove) | |||
| { | |||
| var cki_doc = document.cookie; | |||
| var cookie = null; | |||
| var cki_start = cki_doc.indexOf(name + "="); | |||
| if (cki_start > -1) | |||
| { | |||
| cookie = new LolCookie(); | |||
| cookie.m_name = name; | |||
| cookie.m_expire_date = null; | |||
| //Retrieve value | |||
| var val_start = cki_doc.indexOf("=", cki_start) + 1; | |||
| var val_end = cki_doc.indexOf(";", cki_start); | |||
| if (val_end < 0) | |||
| val_end = cki_doc.length; | |||
| cookie.m_value = unescape(cki_doc.substring(val_start, val_end)); | |||
| if (remove) | |||
| document.cookie = name + "=; expires=0;"; | |||
| } | |||
| return cookie; | |||
| } | |||
| //Check the existence of a cookie | |||
| function DoesLolCookieExist(name) | |||
| { | |||
| var cki_doc = document.cookie; | |||
| if (cki_doc.indexOf(name + "=") > -1) | |||
| return true; | |||
| return false; | |||
| } | |||
| //----------------------------------------------------------------------------- | |||
| // FILE MANAGEMENT | |||
| //----------------------------------------------------------------------------- | |||
| //Dynamic load | |||
| function DynLoadFile(filename) | |||
| { | |||
| var filetype = filename.match(/\.[a-zA-Z]+$/); | |||
| //if filename is a external JavaScript file | |||
| if (filetype == ".js") | |||
| { | |||
| var fileref = document.createElement('script'); | |||
| fileref.setAttribute("type","text/javascript"); | |||
| fileref.setAttribute("src", filename); | |||
| } | |||
| //if filename is an external CSS file | |||
| else if (filetype == ".css") | |||
| { | |||
| var fileref = document.createElement("link"); | |||
| fileref.setAttribute("rel", "stylesheet"); | |||
| fileref.setAttribute("type", "text/css"); | |||
| fileref.setAttribute("href", filename); | |||
| } | |||
| if (fileref) | |||
| document.getElementsByTagName("head")[0].appendChild(fileref); | |||
| } | |||
| //Dynamic remove | |||
| function DynRemoveFile(filename) | |||
| { | |||
| var filetype = filename.match(/\.[a-zA-Z]+$/); | |||
| var targetelement = "none"; | |||
| var targetattr = "none"; | |||
| //Determine element type to create nodelist from and corresponding attribute to test for | |||
| if (filetype==".js") | |||
| { | |||
| targetelement = "script"; | |||
| targetattr = "src"; | |||
| } | |||
| else if (filetype == ".css") | |||
| { | |||
| targetelement = "link"; | |||
| targetattr = "href"; | |||
| } | |||
| var allsuspects = document.getElementsByTagName(targetelement); | |||
| //Search backwards within nodelist for matching elements to remove | |||
| for (var i = allsuspects.length; i >= 0; i--) | |||
| if (allsuspects[i] && | |||
| allsuspects[i].getAttribute(targetattr) && | |||
| allsuspects[i].getAttribute(targetattr).indexOf(filename) != -1) | |||
| allsuspects[i].parentNode.removeChild(allsuspects[i]); //remove element by calling parentNode.removeChild() | |||
| } | |||
| @@ -29,7 +29,7 @@ using namespace lol; | |||
| static int const TEXTURE_WIDTH = 256; | |||
| //Basic build defines --------------------------------------------------------- | |||
| #define HAS_WEB (__native_client__ || EMSCRIPTEN) | |||
| #define HAS_WEB (EMSCRIPTEN) | |||
| #define HAS_INPUT (_WIN32 && !HAS_WEB) | |||
| //Basic config defines -------------------------------------------------------- | |||
| @@ -1,190 +0,0 @@ | |||
| <!doctype html> | |||
| <html lang="en-us"> | |||
| <head> | |||
| <meta charset="utf-8"> | |||
| <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> | |||
| <title>YOUR PAGE NAME HERE</title> | |||
| <style> | |||
| .emscripten | |||
| { | |||
| padding-right: 0; | |||
| margin-left: auto; | |||
| margin-right: auto; | |||
| display: block; | |||
| } | |||
| textarea.emscripten | |||
| { | |||
| font-family: monospace; | |||
| width: 80%; | |||
| } | |||
| div.emscripten | |||
| { | |||
| text-align: center; | |||
| } | |||
| div.emscripten_border | |||
| { | |||
| border: 1px solid black; | |||
| position: absolute; | |||
| left: 0px; | |||
| top: 0px; | |||
| } | |||
| /* the canvas *must not* have any border or padding, or mouse coords will be wrong */ | |||
| canvas.emscripten | |||
| { | |||
| border: 0px none; | |||
| } | |||
| </style> | |||
| </head> | |||
| <body> | |||
| <div class="emscripten_border" id="id_div_embed_data"> | |||
| <canvas class="emscripten" id="id_cvas_render" oncontextmenu="event.preventDefault()"></canvas> | |||
| </div> | |||
| <!-- this part is a little weird, I don't really know what to do with it. --> | |||
| <div class="emscripten"> | |||
| <input type="checkbox" id="id_ckbox_resize">Resize canvas | |||
| <input type="checkbox" id="id_ckbox_pointer_lock" checked>Lock/hide mouse pointer | |||
| | |||
| <input type="button" value="Fullscreen" onclick="ClickFullscreen()"> | |||
| </div> | |||
| <textarea class="emscripten" id="id_txt_output" rows="8"> </textarea> | |||
| <script type='text/javascript'> | |||
| // connect to canvas | |||
| var Module = | |||
| { | |||
| output: document.getElementById('id_txt_output'), | |||
| canvas: document.getElementById('id_cvas_render'), | |||
| preRun: [], | |||
| postRun: [], | |||
| clickFullsreen: function() | |||
| { | |||
| Module.requestFullScreen(document.getElementById('id_ckbox_pointer_lock').checked, | |||
| document.getElementById('id_ckbox_resize').checked); | |||
| }, | |||
| print: (function() | |||
| { | |||
| if (this.output) | |||
| { | |||
| this.output.value = ''; // clear browser cache | |||
| return function(text) | |||
| { | |||
| this.text = Array.prototype.slice.call(arguments).join(' '); | |||
| // These replacements are necessary if you render to raw HTML | |||
| /* | |||
| text = text.replace(/&/g, "&"); | |||
| text = text.replace(/</g, "<"); | |||
| text = text.replace(/ >/g, ">"); | |||
| text = text.replace('\n', '<br>', 'g'); | |||
| */ | |||
| this.output.value += text + "\n"; | |||
| this.output.scrollTop = 99999; // focus on bottom | |||
| }; | |||
| } | |||
| else | |||
| return ''; | |||
| })(), | |||
| printErr: function(text) | |||
| { | |||
| text = Array.prototype.slice.call(arguments).join(' '); | |||
| if (0) // XXX disabled for safety typeof dump == 'function') | |||
| dump(text + '\n'); // fast, straight to the real console | |||
| else | |||
| console.log(text); | |||
| }, | |||
| //Load Status handling | |||
| setStatus: function(text, new_value, new_max) | |||
| { | |||
| var tmp_status = ''; | |||
| var tmp_value = undefined; | |||
| var tmp_max = undefined; | |||
| var should_hide = false; | |||
| //Clear any interval put on this Status. | |||
| if (Module.setStatus.interval) | |||
| clearInterval(Module.setStatus.interval); | |||
| //If value and max have been set, directly go for the win. | |||
| if (new_value != undefined && new_max != undefined) | |||
| { | |||
| tmp_status = text; | |||
| tmp_value = new_value; | |||
| tmp_max = new_max; | |||
| } | |||
| else | |||
| //Else do the complicated stuff. | |||
| { | |||
| var m = text.match(/([^(]+)\((\d+(\.\d+)?)\/(\d+)\)/); | |||
| if (m) | |||
| { | |||
| text = m[1]; | |||
| tmp_value = parseInt(m[2]) * 100; | |||
| tmp_max = parseInt(m[4]) * 100; | |||
| } | |||
| else | |||
| should_hide = true; | |||
| } | |||
| if (parent) | |||
| { | |||
| //parent.UpdateProgressBarValue(tmp_status, tmp_value, tmp_max); | |||
| //parent.HideProgressStatus(should_hide); | |||
| } | |||
| }, | |||
| totalDependencies: 0, | |||
| monitorRunDependencies: | |||
| function(left) | |||
| { | |||
| this.totalDependencies = Math.max(this.totalDependencies, left); | |||
| if (left) | |||
| Module.setStatus('Downloading dependencies ', (this.totalDependencies - left), this.totalDependencies); | |||
| else | |||
| { | |||
| Module.setStatus('All downloads complete.', 1, 1); | |||
| parent.ModuleIsLive(); | |||
| } | |||
| }, | |||
| //IMPORTANT : This is the C -> Javascript wraping, add your functions list here. | |||
| wrapup_list: [ {src_obj: null, func_name: 'DoSendMessage', c_func_name: 'C_Send', return_var: 'number', args: ['string'] } ], | |||
| do_wrapup: function() | |||
| { | |||
| for (var i = 0; i < this.wrapup_list.length; i++) | |||
| { | |||
| if (!this.wrapup_list[i].src_obj) | |||
| this.wrapup_list[i].src_obj = this; | |||
| this.wrapup_list[i].src_obj[this.wrapup_list[i].func_name] = | |||
| cwrap(this.wrapup_list[i].c_func_name, | |||
| this.wrapup_list[i].return_var, | |||
| this.wrapup_list[i].args); | |||
| } | |||
| }, | |||
| //Module <-> Page communication setup | |||
| SendMessage:function(message) | |||
| { | |||
| this.DoSendMessage(message); | |||
| }, | |||
| ModuleSendMessage:function(message) | |||
| { | |||
| alert(message); | |||
| } | |||
| }; | |||
| </script> | |||
| <!-- Copy this HTML in your site folder and put your built program script in the src. --> | |||
| <script src="./meshviewer.em.js"></script> | |||
| <!-- --> | |||
| <script type='text/javascript'> | |||
| //This call NEEDS TO BE after the .js include, because "cwrap" is set in it. | |||
| Module.do_wrapup(); | |||
| //Parent communication datas | |||
| function GetDivEmbed() { return document.getElementById('id_div_embed_data'); } | |||
| function GetEmbedModule() { return Module; } | |||
| parent.InitModuleVar(); | |||
| Module.setStatus('Please wait, calculating load balance ...', 0, 1); | |||
| </script> | |||
| </body> | |||
| </html> | |||
| @@ -1,396 +0,0 @@ | |||
| <DOCTYPE html> | |||
| <html> | |||
| <meta http-equiv="Content-type" content="text/html;charset=UTF-8" /> | |||
| <!-- | |||
| Copyright (c) 2012 The Native Client Authors. All rights reserved. | |||
| Use of this source code is governed by a BSD-style license that can be | |||
| found in the LICENSE file. | |||
| --> | |||
| <head> | |||
| <style type="text/css"> | |||
| body | |||
| { | |||
| font:12px Consolas; | |||
| } | |||
| button | |||
| { | |||
| font:14px Consolas; | |||
| } | |||
| textarea | |||
| { | |||
| font:14px Consolas; | |||
| } | |||
| #id_div_progress_status | |||
| { | |||
| font:12px Consolas; | |||
| } | |||
| #id_div_progress | |||
| { | |||
| position: absolute; | |||
| top: 20%; | |||
| left: 30%; | |||
| right: 30%; | |||
| z-index: 3; | |||
| background-color:white; | |||
| border:1px solid #000000; | |||
| visibility: hidden; | |||
| z-index: 1; | |||
| } | |||
| progress | |||
| { | |||
| background-color: #f3f3f3; | |||
| border: 0; | |||
| height: 18px; | |||
| width: 200px; | |||
| border-radius: 9px; | |||
| } | |||
| progress::-webkit-progress-bar | |||
| { | |||
| background-color: #f3f3f3; | |||
| border: 1px solid #000000; | |||
| padding: 2px 2px; | |||
| height: 20px; | |||
| border-radius: 0px; | |||
| } | |||
| progress::-webkit-progress-value | |||
| { | |||
| background-color: #22BB22; | |||
| border: 0px; | |||
| height: 14px; | |||
| border-radius: 0px; | |||
| } | |||
| #id_div_listener | |||
| { | |||
| position: relative; | |||
| } | |||
| #id_div_frame_embed | |||
| { | |||
| position: absolute; | |||
| top: 2px; | |||
| left: 2px; | |||
| z-index: 0; | |||
| } | |||
| #BGCanvas | |||
| { | |||
| border:1px solid #000000; | |||
| } | |||
| #id_div_helper_cmd_0 | |||
| { | |||
| margin-left: 5px; | |||
| } | |||
| </style> | |||
| <title>Mesh Viewer Web Edition</title> | |||
| </head> | |||
| <script type="text/javascript"> | |||
| //Base data Setup : GLOBAL STYLE | |||
| g_div_frame_embed_save = ''; | |||
| g_div_frame_embed = null; | |||
| g_txtarea_code_src = null; | |||
| g_div_helper_cmd = [null, null]; | |||
| g_div_helper_args = null; | |||
| g_div_helper_cmnt = null; | |||
| g_div_helper_vars = null; | |||
| g_div_alphabet = null; | |||
| g_div_progress = null; | |||
| g_div_progress_status = null; | |||
| g_progress_bar = null; | |||
| g_var_progress_bar = -1; | |||
| g_frame_embed = null; | |||
| //This is the module pointer : can be either the NaCl or Em one depending on the context. | |||
| g_embed_module = null; | |||
| var g_autosave_timer = 4.0; | |||
| var g_autosave_time = 4.0; | |||
| var g_code_addin = [' custom setmesh "#CODE#" ', '#CODE#']; | |||
| var g_code_base = []; | |||
| var CodeDictionnary = []; | |||
| var g_code_id = 0; | |||
| g_code_base[0] = "//This is a comment\nsc#f8f afcb 1 1 1 0"; | |||
| g_code_base[1] = "//This is a comment\naddlight 0.0 position (4 -1 -4) color (.0 .2 .5 1)\naddlight 0.0 position (8 2 6) color #ffff\nshowgizmo true\nshowlight true"; | |||
| function machinchose() { return 'test machin '; } | |||
| function GetTextAreaCodeSrc() { return g_txtarea_code_src; } | |||
| function GetDivProgress() { return g_div_progress; } | |||
| function GetProgressBar() { return g_progress_bar; } | |||
| function GetDivProgressStatus() { return g_div_progress_status; } | |||
| function GetDivEmbedData() { return g_div_frame_embed; } | |||
| function GetDivEmbedDataSave() { return g_div_frame_embed_save; } | |||
| function GetFrameData() { return g_frame_embed; } | |||
| //Communication with iframe content. | |||
| function InitModuleVar() { g_embed_module = GetiFrameModuleVar(); } | |||
| function GetiFrameDivEmbed() { return (!g_frame_embed) ? (null) : (g_frame_embed.contentWindow.GetDivEmbed()); } | |||
| function GetiFrameModuleVar() { return (!g_frame_embed) ? (null) : (g_frame_embed.contentWindow.GetEmbedModule()); } | |||
| function IsUsingNaCl() { return window.chrome; } | |||
| </script> | |||
| <script src="../javascript/utils.js"></script> | |||
| <script src="../javascript/progressstatus.js"></script> | |||
| <script type="text/javascript"> | |||
| //Used by typedictionnary.js | |||
| function GetCmdDictionnary() { return CodeDictionnary[g_code_id]; } | |||
| g_code_id = 1; | |||
| </script> | |||
| <script src="../javascript/typedictionnary.js"></script> | |||
| <!-- Init Scene setup dictionnary --> | |||
| <script type="text/javascript"> | |||
| CodeDictionnary[g_code_id] = new TypeDictionnary("SceneSetup"); | |||
| </script> | |||
| <script src="./scenesetupdictionnary.js"></script> | |||
| <!-- Init Easy mesh dictionnary --> | |||
| <script type="text/javascript"> | |||
| g_code_id--; | |||
| CodeDictionnary[g_code_id] = new TypeDictionnary("EasyMesh"); | |||
| </script> | |||
| <script src="./easymeshdictionnary.js"></script> | |||
| <!-- Revert datas to normal --> | |||
| <script type="text/javascript"> | |||
| g_code_id = 0; | |||
| </script> | |||
| <script type="text/javascript"> | |||
| //Base init for all datas | |||
| function VarInit() | |||
| { | |||
| //Init frame variable first. | |||
| g_frame_embed = document.getElementById('id_frame_embed'); | |||
| //This is in an iframe. | |||
| g_div_frame_embed = g_frame_embed.contentDocument.getElementById('id_div_frame_embed'); | |||
| //The rest of these are in this page. | |||
| g_txtarea_code_src = document.getElementById('id_txtarea_code_src'); | |||
| g_div_helper_cmd[0] = document.getElementById('id_div_helper_cmd_0'); | |||
| g_div_helper_cmd[1] = document.getElementById('id_div_helper_cmd_1'); | |||
| g_div_helper_args = document.getElementById('id_div_helper_args'); | |||
| g_div_helper_cmnt = document.getElementById('id_div_helper_cmnt'); | |||
| g_div_helper_vars = document.getElementById('id_div_helper_vars'); | |||
| g_div_alphabet = document.getElementById('id_div_alphabet'); | |||
| g_div_progress = document.getElementById('id_div_progress'); | |||
| g_div_progress_status = document.getElementById('id_div_progress_status'); | |||
| g_progress_bar = document.getElementById('id_progress_bar'); | |||
| } | |||
| //Base init | |||
| function Init() | |||
| { | |||
| VarInit(); | |||
| //Put here any cookie update | |||
| if (DoesLolCookieExist("LolMeshViewerAutosave")) | |||
| { | |||
| var lol_cookie = GetLolCookie("LolMeshViewerAutosave", false); | |||
| var value_list = lol_cookie.m_value.split(";"); | |||
| for (var i = 0; i < g_code_base.length && i < value_list.length; i++) | |||
| { | |||
| g_code_base[i] = value_list[i]; | |||
| var addins = g_code_addin[i].split('#CODE#'); | |||
| for (var j = 0; j < addins.length; j++) | |||
| if (addins[j] && addins[j] != '') | |||
| g_code_base[i] = g_code_base[i].replace(addins[j], ""); | |||
| } | |||
| g_txtarea_code_src.value = g_code_base[g_code_id]; | |||
| } | |||
| else if (!g_txtarea_code_src.value) | |||
| g_txtarea_code_src.value = g_code_base[g_code_id]; | |||
| //Fill the TOC | |||
| if (!g_div_alphabet.innerHTML) | |||
| { | |||
| for (var i = 0; i < CodeDictionnary.length; i++) | |||
| { | |||
| g_code_id = i; | |||
| var new_toc = BuildTOC(true); | |||
| var pattern = new RegExp("^[a-zA-Z\.]"); | |||
| while (pattern.test(new_toc)) | |||
| new_toc = new_toc.replace(pattern, "<b>$&"); | |||
| pattern = new RegExp("[a-zA-Z\.]$"); | |||
| while (pattern.test(new_toc)) | |||
| new_toc = new_toc.replace(pattern, "$&</b>"); | |||
| pattern = new RegExp("([a-zA-Z])([\.])"); | |||
| while (pattern.test(new_toc)) | |||
| new_toc = new_toc.replace(pattern, "$1</b>$2"); | |||
| pattern = new RegExp("([\.])([a-zA-Z])"); | |||
| while (pattern.test(new_toc)) | |||
| new_toc = new_toc.replace(pattern, "$1<b>$2"); | |||
| CodeDictionnary[i].m_alphabet = new_toc; | |||
| } | |||
| g_code_id = 0; | |||
| InitEditValues(); | |||
| } | |||
| //NaCl Specific | |||
| if (IsUsingNaCl()) | |||
| { | |||
| DynLoadFile("../javascript/naclloading.js"); | |||
| g_frame_embed.src = 'meshviewer.nacl.html'; | |||
| } | |||
| else | |||
| g_frame_embed.src = 'meshviewer.em.html'; | |||
| g_frame_embed.onload = function() { VarInit(); } | |||
| //Tick has been done, start Tick | |||
| window.setTimeout("Tick(.2)", 200); | |||
| } | |||
| function Tick(seconds) | |||
| { | |||
| window.setTimeout("Tick(.1)", 100); | |||
| var text_src = g_txtarea_code_src; | |||
| var div_cmds = g_div_helper_cmd; | |||
| var div_args = g_div_helper_args; | |||
| var div_cmnt = g_div_helper_cmnt; | |||
| var div_vars = g_div_helper_vars; | |||
| CmdLookup(div_cmds, div_args, div_cmnt, div_vars, text_src); | |||
| g_autosave_timer -= seconds; | |||
| if (g_autosave_timer < 0.0) | |||
| { | |||
| g_autosave_timer = g_autosave_time; | |||
| StoreCodeCookie(); | |||
| } | |||
| } | |||
| function StoreCodeCookie() | |||
| { | |||
| var result = ''; | |||
| for (var i = 0; i < g_code_base.length; i++) | |||
| { result += g_code_addin[i].replace('#CODE#', g_code_base[i]) + ";"; } | |||
| StoreLolCookie(new LolCookieDays("LolMeshViewerAutosave", result, 10)); | |||
| } | |||
| function StoreTextAreaValue() | |||
| { | |||
| g_code_base[g_code_id] = GetTextAreaCodeSrc().value; | |||
| } | |||
| function ExchangeSetup() | |||
| { | |||
| StoreTextAreaValue(); | |||
| g_code_id = (g_code_id + 1) % 2; | |||
| InitEditValues(); | |||
| } | |||
| function InitEditValues() | |||
| { | |||
| GetTextAreaCodeSrc().value = g_code_base[g_code_id]; | |||
| g_div_alphabet.innerHTML = ' Table of content<br> [' + CodeDictionnary[g_code_id].m_alphabet + '] <br> '; | |||
| } | |||
| //Handle message from the NaCl module | |||
| function ModuleSentMessage(message) | |||
| { | |||
| alert('Module sent message: ' + message.data); | |||
| } | |||
| //When module is live, it calls this. | |||
| function ModuleIsLive() | |||
| { | |||
| for (var i = 0; i < g_code_base.length; i++) | |||
| { | |||
| SendMessageToModule(); | |||
| ExchangeSetup(); | |||
| } | |||
| } | |||
| //Called by the "Send Mesh Command !" button | |||
| function SendMessageToModule() | |||
| { | |||
| StoreTextAreaValue(); | |||
| if (g_embed_module) | |||
| { | |||
| StoreCodeCookie(); | |||
| g_embed_module.SendMessage(g_code_addin[g_code_id].replace('#CODE#', g_code_base[g_code_id])); | |||
| } | |||
| else | |||
| alert("Module not loaded !"); | |||
| } | |||
| </script> | |||
| <body> | |||
| <h1>Mesh Viewer : Web version.</h1> | |||
| <table border="0" cellpadding="0" cellspacing="0"> | |||
| <tr height="404"> | |||
| <td> | |||
| <p> | |||
| <div id="final_div"> | |||
| <div id="id_div_listener" align="center" style="width:800px;height:400px"> | |||
| <canvas id="BGCanvas" width="802" height="402"></canvas> | |||
| <div id="id_div_progress"> | |||
| <br> | |||
| <progress id="id_progress_bar" align="left"></progress> | |||
| <div id="id_div_progress_status">....</div> | |||
| </div> | |||
| <div id="id_div_frame_embed"> | |||
| <iframe onload="Init();" id="id_frame_embed" src="../javascript/empty.html" width=800 height=400 frameborder=0 scrolling=no></iframe> | |||
| </div> | |||
| </div> | |||
| </div> | |||
| </p> | |||
| </td> | |||
| <td> | |||
| </td> | |||
| </tr> | |||
| <tr> | |||
| <td rowspan="2"> | |||
| <table border="0" cellpadding="0" cellspacing="0" width="802"> | |||
| <tr> | |||
| <td align="left"> | |||
| <div><button onclick="SendMessageToModule()">Update program</button></div> | |||
| </td> | |||
| <td align="right"> | |||
| <div><button onclick="ExchangeSetup()">Change edit data</button></div> | |||
| </td> | |||
| </tr> | |||
| </table> | |||
| <table border="0" cellpadding="0" cellspacing="0"> | |||
| <tr> | |||
| <td height="1%"> | |||
| <div id="bouton"> | |||
| <textarea autofocus id="id_txtarea_code_src" rows="6" cols="94" style="font: 14px Consolas; resize: none;"></textarea> | |||
| </div> | |||
| </td> | |||
| <td valign="top" rowspan="3"> </td> | |||
| <td valign="top" rowspan="3"> | |||
| <div><b><u>Variable Types usage :</u></b></div> | |||
| <div id="id_div_helper_vars"></div> | |||
| </td> | |||
| </tr> | |||
| <tr> | |||
| <td height="1%"> | |||
| <div id="id_div_alphabet"></div> | |||
| </td> | |||
| </tr> | |||
| <tr> | |||
| <td valign="top"> | |||
| <table border="0" cellpadding="0" cellspacing="0"> | |||
| <tr> | |||
| <td valign="top"><div id="id_div_helper_cmd_0"></div></td> | |||
| <td valign="top"><div id="id_div_helper_cmd_1"></div></td> | |||
| <td valign="top"><div id="id_div_helper_args" ></div></td> | |||
| <td valign="top"><div id="id_div_helper_cmnt" ></div></td> | |||
| </tr> | |||
| </table> | |||
| </td> | |||
| </tr> | |||
| </table> | |||
| </td> | |||
| </tr> | |||
| </table> | |||
| </body> | |||
| </html> | |||
| @@ -1,14 +0,0 @@ | |||
| <DOCTYPE html> | |||
| <html> | |||
| <body> | |||
| <script type="text/javascript"> | |||
| function GetDivEmbed() { return document.getElementById('id_div_embed_data'); } | |||
| function GetEmbedModule() { return document.getElementById('id_embed_nacl_module'); } | |||
| if (parent.IsUsingNaCl()) parent.NaClLoadingInit(); | |||
| </script> | |||
| <div id="id_div_embed_data" style="left:0px;top:0px;position:absolute;"> | |||
| <embed name="name_embed_nacl_module" id="id_embed_nacl_module" width=800 height=400 src="meshviewer.nacl.nmf" type="application/x-nacl" /> | |||
| </div> | |||
| </body> | |||
| </html> | |||
| @@ -56,46 +56,6 @@ | |||
| <None Include="..\data\meshviewer.init.lua"> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild> | |||
| </None> | |||
| <None Include="meshviewer.index.html"> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild> | |||
| </None> | |||
| <None Include="meshviewer.nacl.html"> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild> | |||
| </None> | |||
| <None Include="meshviewer.em.html"> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild> | |||
| </None> | |||
| <None Include="meshviewer.nacl.nmf"> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild> | |||
| </None> | |||
| <None Include="easymeshdictionnary.js"> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild> | |||
| </None> | |||
| <None Include="scenesetupdictionnary.js"> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild> | |||
| </None> | |||
| <None Include="../javascript/naclloading.js"> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild> | |||
| </None> | |||
| <None Include="../javascript/progressstatus.js"> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild> | |||
| </None> | |||
| <None Include="../javascript/utils.js"> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild> | |||
| </None> | |||
| <None Include="../javascript/typedictionnary.js"> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild> | |||
| </None> | |||
| </ItemGroup> | |||
| <ItemGroup> | |||
| <LolFxCompile Include="shinyfur.lolfx" /> | |||
| @@ -1,126 +0,0 @@ | |||
| // | |||
| // Lol Engine — BtPhys tutorial | |||
| // | |||
| // Copyright © 2009—2015 Benjamin “Touky” Huet <huet.benjamin@gmail.com> | |||
| // © 2012—2015 Sam Hocevar <sam@hocevar.net> | |||
| // | |||
| // Lol Engine is free software. It comes without any warranty, to | |||
| // the extent permitted by applicable law. You can redistribute it | |||
| // and/or modify it under the terms of the Do What the Fuck You Want | |||
| // to Public License, Version 2, as published by the WTFPL Task Force. | |||
| // See http://www.wtfpl.net/ for more details. | |||
| // | |||
| #if HAVE_CONFIG_H | |||
| # include "config.h" | |||
| #endif | |||
| #include <lol/engine.h> | |||
| #include "loldebug.h" | |||
| using namespace lol; | |||
| //#include "physics/lolphysics.h" | |||
| //#include "physics/easyphysics.h" | |||
| #include "nacl_phystest.h" | |||
| //using namespace lol::phys; | |||
| int gNumObjects = 64; | |||
| Nacl_PhysTest::Nacl_PhysTest(bool editor) | |||
| { | |||
| /* Register an input controller for the keyboard */ | |||
| m_controller = new Controller("Default"); | |||
| m_controller->GetKey(KEY_MOVE_FORWARD).Bind("Keyboard", "Up"); | |||
| m_controller->GetKey(KEY_MOVE_BACK).Bind("Keyboard", "Down"); | |||
| m_controller->GetKey(KEY_MOVE_LEFT).Bind("Keyboard", "Left"); | |||
| m_controller->GetKey(KEY_MOVE_RIGHT).Bind("Keyboard", "Right"); | |||
| m_controller->GetKey(KEY_MOVE_JUMP).Bind("Keyboard", "Space"); | |||
| m_controller->GetKey(KEY_MOVE_UP).Bind("Keyboard", "PageUp"); | |||
| m_controller->GetKey(KEY_MOVE_DOWN).Bind("Keyboard", "PageDown"); | |||
| m_controller->GetKey(KEY_QUIT).Bind("Keyboard", "Escape"); | |||
| /* Create a camera that matches the settings of XNA BtPhysTest */ | |||
| m_camera = new Camera(); | |||
| m_camera->SetView(vec3(50.f, 50.f, 0.f), | |||
| vec3(0.f, 0.f, 0.f), | |||
| vec3(0, 1, 0)); | |||
| m_camera->SetProjection(radians(45.f), .1f, 1000.f, (float)Video::GetSize().x, (float)Video::GetSize().y / (float)Video::GetSize().x); | |||
| Scene::GetScene().PushCamera(m_camera); | |||
| m_ready = false; | |||
| /* | |||
| m_simulation = new Simulation(); | |||
| m_simulation->SetWorldLimit(vec3(-1000.0f, -1000.0f, -1000.0f), vec3(1000.0f, 1000.0f, 1000.0f)); | |||
| m_simulation->Init(); | |||
| vec3 NewGravity = vec3(.0f, -10.0f, .0f); | |||
| m_simulation->SetGravity(NewGravity); | |||
| m_simulation->SetContinuousDetection(true); | |||
| m_simulation->SetTimestep(1.f / 120.f); | |||
| Ticker::Ref(m_simulation); | |||
| */ | |||
| /* Add a white directional light */ | |||
| m_light1 = new Light(); | |||
| m_light1->SetPosition(vec3(0.2f, 0.2f, 0.f)); | |||
| m_light1->SetColor(vec4(0.5f, 0.5f, 0.5f, 1.f)); | |||
| m_light1->SetType(LightType::Directional); | |||
| Ticker::Ref(m_light1); | |||
| /* Add an orangeish point light */ | |||
| m_light2 = new Light(); | |||
| m_light2->SetPosition(vec3(-15.f, 15.f, 15.f)); | |||
| m_light2->SetColor(vec4(0.4f, 0.3f, 0.2f, 1.f)); | |||
| m_light2->SetType(LightType::Point); | |||
| Ticker::Ref(m_light2); | |||
| } | |||
| void Nacl_PhysTest::tick_game(float seconds) | |||
| { | |||
| WorldEntity::tick_game(seconds); | |||
| if (m_controller->IsKeyReleased(KEY_QUIT)) | |||
| Ticker::Shutdown(); | |||
| } | |||
| void Nacl_PhysTest::tick_draw(float seconds, Scene &scene) | |||
| { | |||
| WorldEntity::tick_draw(seconds, scene); | |||
| if (!m_ready) | |||
| { | |||
| /* FIXME: this object never cleans up */ | |||
| m_ready = true; | |||
| } | |||
| else | |||
| { | |||
| } | |||
| } | |||
| Nacl_PhysTest::~Nacl_PhysTest() | |||
| { | |||
| Scene::GetScene().PopCamera(m_camera); | |||
| Ticker::Unref(m_light1); | |||
| Ticker::Unref(m_light2); | |||
| //Ticker::Unref(m_simulation); | |||
| } | |||
| int main(int argc, char **argv) | |||
| { | |||
| sys::init(argc, argv); | |||
| Application app("Nacl_PhysTest", ivec2(1280, 960), 60.0f); | |||
| new Nacl_PhysTest(argc > 1); | |||
| app.ShowPointer(false); | |||
| app.Run(); | |||
| return EXIT_SUCCESS; | |||
| } | |||
| @@ -1,64 +0,0 @@ | |||
| // | |||
| // Lol Engine — Bullet physics test | |||
| // | |||
| // Copyright © 2009—2013 Benjamin “Touky” Huet <huet.benjamin@gmail.com> | |||
| // © 2012—2018 Sam Hocevar <sam@hocevar.net> | |||
| // | |||
| // Lol Engine is free software. It comes without any warranty, to | |||
| // the extent permitted by applicable law. You can redistribute it | |||
| // and/or modify it under the terms of the Do What the Fuck You Want | |||
| // to Public License, Version 2, as published by the WTFPL Task Force. | |||
| // See http://www.wtfpl.net/ for more details. | |||
| // | |||
| #pragma once | |||
| class Nacl_PhysTest : public WorldEntity | |||
| { | |||
| public: | |||
| Nacl_PhysTest(bool editor = false); | |||
| virtual ~Nacl_PhysTest(); | |||
| std::string GetName() const { return "<Nacl_PhysTest>"; } | |||
| protected: | |||
| virtual void tick_game(float seconds); | |||
| virtual void tick_draw(float seconds, Scene &scene); | |||
| private: | |||
| enum | |||
| { | |||
| KEY_MOVE_FORWARD, | |||
| KEY_MOVE_BACK, | |||
| KEY_MOVE_LEFT, | |||
| KEY_MOVE_RIGHT, | |||
| KEY_MOVE_UP, | |||
| KEY_MOVE_DOWN, | |||
| KEY_MOVE_JUMP, | |||
| KEY_QUIT, | |||
| KEY_MAX, | |||
| }; | |||
| TileSet* m_cat_texture; | |||
| Shader* m_cat_shader; | |||
| Camera* m_camera; | |||
| Controller * m_controller; | |||
| Light * m_light1; | |||
| Light * m_light2; | |||
| bool m_ready; | |||
| //lol::phys::Simulation* m_simulation; | |||
| //array<EasyConstraint*> m_constraint_list; | |||
| //array<PhysicsObject*, float> m_physobj_list; | |||
| //array<PhysicsObject*> m_ground_list; | |||
| //array<PhysicsObject*> m_platform_list; | |||
| //array<PhysicsObject*> m_character_list; | |||
| //array<PhysicsObject*> m_stairs_list; | |||
| float m_loop_value; | |||
| float m_target_timer; | |||
| int m_cam_target; | |||
| float m_fov_dp; | |||
| float m_loc_dp; | |||
| }; | |||
| @@ -1,72 +0,0 @@ | |||
| <?xml version="1.0" encoding="utf-8"?> | |||
| <Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | |||
| <PropertyGroup Label="LolMacros"> | |||
| <LolDir Condition="Exists('$(SolutionDir)\lol')">$(SolutionDir)\lol</LolDir> | |||
| <LolDir Condition="!Exists('$(SolutionDir)\lol')">$(SolutionDir)</LolDir> | |||
| </PropertyGroup> | |||
| <ItemGroup Label="ProjectConfigurations"> | |||
| <ProjectConfiguration Include="Debug|ORBIS"> | |||
| <Configuration>Debug</Configuration> | |||
| <Platform>ORBIS</Platform> | |||
| </ProjectConfiguration> | |||
| <ProjectConfiguration Include="Debug|Win32"> | |||
| <Configuration>Debug</Configuration> | |||
| <Platform>Win32</Platform> | |||
| </ProjectConfiguration> | |||
| <ProjectConfiguration Include="Debug|x64"> | |||
| <Configuration>Debug</Configuration> | |||
| <Platform>x64</Platform> | |||
| </ProjectConfiguration> | |||
| <ProjectConfiguration Include="Release|ORBIS"> | |||
| <Configuration>Release</Configuration> | |||
| <Platform>ORBIS</Platform> | |||
| </ProjectConfiguration> | |||
| <ProjectConfiguration Include="Release|Win32"> | |||
| <Configuration>Release</Configuration> | |||
| <Platform>Win32</Platform> | |||
| </ProjectConfiguration> | |||
| <ProjectConfiguration Include="Release|x64"> | |||
| <Configuration>Release</Configuration> | |||
| <Platform>x64</Platform> | |||
| </ProjectConfiguration> | |||
| </ItemGroup> | |||
| <ItemGroup> | |||
| <ClInclude Include="nacl_phystest.h" /> | |||
| </ItemGroup> | |||
| <ItemGroup> | |||
| <ClCompile Include="nacl_phystest.cpp" /> | |||
| </ItemGroup> | |||
| <ItemGroup> | |||
| <ProjectReference Include="$(LolDir)\src\lol-core.vcxproj"> | |||
| <Project>{9e62f2fe-3408-4eae-8238-fd84238ceeda}</Project> | |||
| </ProjectReference> | |||
| <ProjectReference Condition="'$(enable_bullet)'!='no'" Include="$(LolDir)\src\3rdparty\lol-bullet.vcxproj"> | |||
| <Project>{83d3b207-c601-4025-8f41-01dedc354661}</Project> | |||
| </ProjectReference> | |||
| </ItemGroup> | |||
| <ItemGroup> | |||
| <None Include="Makefile.am"> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> | |||
| </None> | |||
| </ItemGroup> | |||
| <PropertyGroup Label="Globals"> | |||
| <ProjectGuid>{ee203b88-44cf-4859-9d42-7a1f43fecb53}</ProjectGuid> | |||
| <ConfigurationType>Application</ConfigurationType> | |||
| <Keyword>Win32Proj</Keyword> | |||
| </PropertyGroup> | |||
| <Import Project="$(LolDir)\build\msbuild\lol.config.props" /> | |||
| <ImportGroup Label="ExtensionSettings"> | |||
| <Import Project="$(LolDir)\build\msbuild\lolfx.props" /> | |||
| </ImportGroup> | |||
| <ImportGroup Label="PropertySheets"> | |||
| <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> | |||
| <Import Project="$(LolDir)\build\msbuild\lol.vars.props" /> | |||
| </ImportGroup> | |||
| <PropertyGroup Label="UserMacros" /> | |||
| <Import Project="$(LolDir)\build\msbuild\lol.rules.props" /> | |||
| <ItemDefinitionGroup /> | |||
| <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> | |||
| <ImportGroup Label="ExtensionTargets"> | |||
| <Import Project="$(LolDir)\build\msbuild\lolfx.targets" /> | |||
| </ImportGroup> | |||
| </Project> | |||
| @@ -1,20 +0,0 @@ | |||
| <?xml version="1.0" encoding="utf-8"?> | |||
| <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | |||
| <ItemGroup> | |||
| <ClInclude Include="nacl_phystest.h" /> | |||
| </ItemGroup> | |||
| <ItemGroup> | |||
| <ClCompile Include="nacl_phystest.cpp" /> | |||
| </ItemGroup> | |||
| <ItemGroup> | |||
| <Filter Include="generated"> | |||
| <UniqueIdentifier>{4fc7662b-b17a-49b9-acd1-0cf767183b07}</UniqueIdentifier> | |||
| </Filter> | |||
| <Filter Include="physics"> | |||
| <UniqueIdentifier>{ccecd634-9321-4c49-9471-e9da50dda6d4}</UniqueIdentifier> | |||
| </Filter> | |||
| </ItemGroup> | |||
| <ItemGroup> | |||
| <None Include="Makefile.am" /> | |||
| </ItemGroup> | |||
| </Project> | |||
| @@ -51,12 +51,7 @@ public: | |||
| /* Window size decides the world aspect ratio. For instance, 640×480 | |||
| * will be mapped to (-0.66,-0.5) - (0.66,0.5). */ | |||
| #if !defined __native_client__ | |||
| m_window_size = Video::GetSize(); | |||
| #else | |||
| /* FIXME: it's illegal to call this on the game thread! */ | |||
| m_window_size = ivec2(640, 480); | |||
| #endif | |||
| if (m_window_size.y < m_window_size.x) | |||
| m_window2world = 0.5 / m_window_size.y; | |||
| else | |||
| @@ -98,14 +93,9 @@ public: | |||
| uint8_t red = (uint8_t)(rgb.r * 256); | |||
| uint8_t green = (uint8_t)(rgb.g * 256); | |||
| uint8_t blue = (uint8_t)(rgb.b * 256); | |||
| #if defined __native_client__ | |||
| m_palette.push(u8vec4(red, green, blue, 255)); | |||
| #else | |||
| m_palette.push(u8vec4(blue, green, red, 255)); | |||
| #endif | |||
| } | |||
| #if !defined __native_client__ | |||
| m_zoomtext = new Text("", "data/font/ascii.png"); | |||
| m_zoomtext->SetPos(vec3(5, (float)m_window_size.y - 15, 1)); | |||
| Ticker::Ref(m_zoomtext); | |||
| @@ -117,7 +107,6 @@ public: | |||
| m_mousetext = new Text("", "data/font/ascii.png"); | |||
| m_mousetext->SetPos(vec3(5, (float)m_window_size.y - 43, 1)); | |||
| Ticker::Ref(m_mousetext); | |||
| #endif | |||
| m_position = vec3::zero; | |||
| m_aabb.aa = m_position; | |||
| @@ -143,11 +132,9 @@ public: | |||
| m_donequeue.pop(); | |||
| #endif | |||
| #if !defined __native_client__ | |||
| Ticker::Unref(m_centertext); | |||
| Ticker::Unref(m_mousetext); | |||
| Ticker::Unref(m_zoomtext); | |||
| #endif | |||
| } | |||
| inline f128cmplx TexelToWorldOffset(vec2 texel) | |||
| @@ -299,7 +286,6 @@ public: | |||
| m_zoom_settings[i][1] -= 0.5f * (1.0f - m_zoom_settings[i][2]); | |||
| } | |||
| #if !defined __native_client__ | |||
| char buf[256]; | |||
| std::sprintf(buf, "center: "); | |||
| m_view.center.x.sprintf(buf + strlen(buf), 30); | |||
| @@ -313,7 +299,6 @@ public: | |||
| m_mousetext->SetText(buf); | |||
| std::sprintf(buf, "[%s] zoom: %g", m_julia ? "Julia" : "Mandelbrot", 1.0 / m_view.radius); | |||
| m_zoomtext->SetText(buf); | |||
| #endif | |||
| if (m_dirty[m_frame]) | |||
| { | |||
| @@ -590,10 +575,8 @@ private: | |||
| queue<int> m_spawnqueue, m_jobqueue, m_donequeue; | |||
| #endif | |||
| #if !defined __native_client__ | |||
| /* Debug information */ | |||
| Text *m_centertext, *m_mousetext, *m_zoomtext; | |||
| #endif | |||
| }; | |||
| int main(int argc, char **argv) | |||
| @@ -21,7 +21,6 @@ liblol_core_a_SOURCES = \ | |||
| $(liblol_core_sources) \ | |||
| \ | |||
| $(imgui_sources) \ | |||
| $(nacl_sources) \ | |||
| $(sdl_sources) \ | |||
| $(d3d9_sources) \ | |||
| $(android_sources) | |||
| @@ -156,15 +155,6 @@ imgui_sources += \ | |||
| lolimgui.cpp lolimgui.h \ | |||
| $(NULL) | |||
| if LOL_USE_NACL | |||
| nacl_sources = \ | |||
| platform/nacl/nacl-app.cpp platform/nacl/nacl-app.h \ | |||
| platform/nacl/nacl-instance.cpp platform/nacl/nacl-instance.h \ | |||
| platform/nacl/nacl-module.cpp \ | |||
| platform/nacl/opengl_context.cpp platform/nacl/opengl_context.h \ | |||
| platform/nacl/opengl_context_ptrs.h | |||
| endif | |||
| android_sources = \ | |||
| image/codec/android-image.cpp \ | |||
| platform/android/androidapp.cpp platform/android/androidapp.h | |||
| @@ -18,9 +18,7 @@ | |||
| #include "lolgl.h" | |||
| #if __native_client__ | |||
| # include "platform/nacl/nacl-app.h" | |||
| #elif __ANDROID__ | |||
| #if __ANDROID__ | |||
| # include "platform/android/androidapp.h" | |||
| #elif LOL_USE_SDL | |||
| # include "platform/sdl/sdlapp.h" | |||
| @@ -73,9 +71,7 @@ class ApplicationDisplayData | |||
| { } | |||
| protected: | |||
| #if __native_client__ | |||
| //NOT HANDLED YET | |||
| #elif __ANDROID__ | |||
| #if __ANDROID__ | |||
| //NOT HANDLED YET | |||
| #elif LOL_USE_SDL | |||
| SdlAppDisplay display; | |||
| @@ -139,9 +135,7 @@ class ApplicationData | |||
| : app(name, res, framerate) | |||
| { } | |||
| #if __native_client__ | |||
| NaClApp app; | |||
| #elif __ANDROID__ | |||
| #if __ANDROID__ | |||
| AndroidApp app; | |||
| #elif LOL_USE_SDL | |||
| SdlApp app; | |||
| @@ -64,7 +64,7 @@ Texture::Texture(ivec2 size, PixelFormat format) | |||
| { 0, 0, 0, 0 }, /* Unknown */ | |||
| /* FIXME: this is all mixed up for the RGBA/ARGB combinations */ | |||
| #if defined __native_client__ || defined HAVE_GLES_2X | |||
| #if defined HAVE_GLES_2X | |||
| { GL_LUMINANCE, GL_LUMINANCE, GL_UNSIGNED_BYTE, 1 }, | |||
| { GL_RGB, GL_RGB, GL_UNSIGNED_BYTE, 3 }, | |||
| { GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, 4 }, | |||
| @@ -164,38 +164,6 @@ | |||
| <ClCompile Include="messageservice.cpp" /> | |||
| <ClCompile Include="platform.cpp" /> | |||
| <ClCompile Include="platform\d3d9\d3d9input.cpp" /> | |||
| <ClCompile Include="platform\nacl\nacl-app.cpp"> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">true</ExcludedFromBuild> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">true</ExcludedFromBuild> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild> | |||
| </ClCompile> | |||
| <ClCompile Include="platform\nacl\nacl-instance.cpp"> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">true</ExcludedFromBuild> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">true</ExcludedFromBuild> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild> | |||
| </ClCompile> | |||
| <ClCompile Include="platform\nacl\nacl-module.cpp"> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">true</ExcludedFromBuild> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">true</ExcludedFromBuild> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild> | |||
| </ClCompile> | |||
| <ClCompile Include="platform\nacl\opengl_context.cpp"> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">true</ExcludedFromBuild> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">true</ExcludedFromBuild> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild> | |||
| </ClCompile> | |||
| <ClCompile Include="platform\sdl\sdlapp.cpp"> | |||
| <ExcludedFromBuild Condition="'$(enable_sdl)'=='no'">true</ExcludedFromBuild> | |||
| </ClCompile> | |||
| @@ -317,38 +285,6 @@ | |||
| <ClInclude Include="numeric.h" /> | |||
| <ClInclude Include="platform.h" /> | |||
| <ClInclude Include="platform\d3d9\d3d9input.h" /> | |||
| <ClInclude Include="platform\nacl\nacl-app.h"> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">true</ExcludedFromBuild> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">true</ExcludedFromBuild> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild> | |||
| </ClInclude> | |||
| <ClInclude Include="platform\nacl\nacl-instance.h"> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">true</ExcludedFromBuild> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">true</ExcludedFromBuild> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild> | |||
| </ClInclude> | |||
| <ClInclude Include="platform\nacl\opengl_context.h"> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">true</ExcludedFromBuild> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">true</ExcludedFromBuild> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild> | |||
| </ClInclude> | |||
| <ClInclude Include="platform\nacl\opengl_context_ptrs.h"> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">true</ExcludedFromBuild> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">true</ExcludedFromBuild> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild> | |||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild> | |||
| </ClInclude> | |||
| <ClInclude Include="platform\sdl\sdlapp.h"> | |||
| <ExcludedFromBuild Condition="'$(enable_sdl)'=='no'">true</ExcludedFromBuild> | |||
| </ClInclude> | |||
| @@ -79,9 +79,6 @@ | |||
| <Filter Include="platform\d3d9"> | |||
| <UniqueIdentifier>{a914e15d-3201-467a-a9c9-d7c5244b13ee}</UniqueIdentifier> | |||
| </Filter> | |||
| <Filter Include="platform\nacl"> | |||
| <UniqueIdentifier>{f6cc3470-c841-4581-969b-e60cea841c27}</UniqueIdentifier> | |||
| </Filter> | |||
| <Filter Include="image\dither"> | |||
| <UniqueIdentifier>{63e63eea-c96e-4d37-81f6-f3f17e18b751}</UniqueIdentifier> | |||
| </Filter> | |||
| @@ -291,18 +288,8 @@ | |||
| <ClCompile Include="MessageService.cpp"> | |||
| <Filter>...</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="math\constants.cpp" /> | |||
| <ClCompile Include="platform\nacl\nacl-app.cpp"> | |||
| <Filter>platform\nacl</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="platform\nacl\nacl-instance.cpp"> | |||
| <Filter>platform\nacl</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="platform\nacl\nacl-module.cpp"> | |||
| <Filter>platform\nacl</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="platform\nacl\opengl_context.cpp"> | |||
| <Filter>platform\nacl</Filter> | |||
| <ClCompile Include="math\constants.cpp"> | |||
| <Filter>math</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="easymesh\easymeshrender.cpp"> | |||
| <Filter>easymesh</Filter> | |||
| @@ -706,18 +693,6 @@ | |||
| <ClInclude Include="messageservice.h"> | |||
| <Filter>...</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="platform\nacl\nacl-app.h"> | |||
| <Filter>platform\nacl</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="platform\nacl\nacl-instance.h"> | |||
| <Filter>platform\nacl</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="platform\nacl\opengl_context.h"> | |||
| <Filter>platform\nacl</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="platform\nacl\opengl_context_ptrs.h"> | |||
| <Filter>platform\nacl</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="easymesh\easymeshrender.h"> | |||
| <Filter>easymesh</Filter> | |||
| </ClInclude> | |||
| @@ -195,12 +195,6 @@ namespace lol | |||
| } | |||
| /* XXX: workaround for a compilation bug in NaCl headers */ | |||
| #if defined __native_client__ | |||
| # define typeid(x) (*(type_info*)nullptr) | |||
| #endif | |||
| /* XXX: workaround for X11 headers that try to #define these */ | |||
| #undef Always | |||
| #define Always Always | |||
| @@ -22,10 +22,8 @@ | |||
| # include "config.h" | |||
| #endif | |||
| /* If using NaCl or Android, override main() with our version */ | |||
| #if __native_client__ | |||
| # define main lol_nacl_main | |||
| #elif __ANDROID__ | |||
| /* If using Android, override main() with our version */ | |||
| #if __ANDROID__ | |||
| # define main lol_android_main | |||
| #endif | |||
| @@ -17,10 +17,8 @@ | |||
| // -------------------------------------- | |||
| // | |||
| /* If using NaCl or Android, override main() with our version */ | |||
| #if __native_client__ | |||
| # define main lol_nacl_main | |||
| #elif __ANDROID__ | |||
| /* If using Android, override main() with our version */ | |||
| #if __ANDROID__ | |||
| # define main lol_android_main | |||
| #endif | |||
| @@ -29,9 +29,6 @@ namespace lol | |||
| #undef min | |||
| #undef max | |||
| /* Avoid issues with NaCl headers */ | |||
| #undef log2 | |||
| /* | |||
| * A bigint stores its digits in an array of integers. The MSB of the | |||
| * integers are unused. The highest used bit is the sign bit. | |||
| @@ -180,8 +180,8 @@ LOL_ATTR_NODISCARD static inline int16_t abs(int16_t x) { return std::abs(x); } | |||
| LOL_ATTR_NODISCARD static inline uint16_t abs(uint16_t x) { return x; } | |||
| LOL_ATTR_NODISCARD static inline int32_t abs(int32_t x) { return std::abs(x); } | |||
| LOL_ATTR_NODISCARD static inline uint32_t abs(uint32_t x) { return x; } | |||
| #if defined __native_client__ || defined __ANDROID__ | |||
| /* The pepper 19 toolchain doesn't provide abs() for long long int. */ | |||
| #if defined __ANDROID__ | |||
| /* The Android toolchain doesn't provide abs() for int64_t. */ | |||
| LOL_ATTR_NODISCARD static inline int64_t abs(int64_t x) { return x > 0 ? x : -x; } | |||
| #else | |||
| LOL_ATTR_NODISCARD static inline int64_t abs(int64_t x) { return std::abs(x); } | |||
| @@ -29,9 +29,6 @@ namespace lol | |||
| #undef min | |||
| #undef max | |||
| /* Avoid issues with NaCl headers */ | |||
| #undef log2 | |||
| /* | |||
| * The base class for reals. The only real reason for making this a template | |||
| * class is so we can have implicit constructors ("real x = 1" works) but | |||
| @@ -1,70 +0,0 @@ | |||
| // | |||
| // Lol Engine | |||
| // | |||
| // Copyright: (c) 2010-2011 Sam Hocevar <sam@hocevar.net> | |||
| // This program is free software; you can redistribute it and/or | |||
| // modify it under the terms of the Do What The Fuck You Want To | |||
| // Public License, Version 2, as published by Sam Hocevar. See | |||
| // http://www.wtfpl.net/ for more details. | |||
| // | |||
| #include <lol/engine-internal.h> | |||
| #include "nacl-app.h" | |||
| #include "nacl-instance.h" | |||
| namespace lol | |||
| { | |||
| /* | |||
| * NaCl App implementation class | |||
| */ | |||
| class NaClAppData | |||
| { | |||
| friend class NaClApp; | |||
| private: | |||
| #if defined __native_client__ | |||
| #endif | |||
| }; | |||
| /* | |||
| * Public NaClApp class | |||
| */ | |||
| NaClApp::NaClApp(char const *title, ivec2 res, float fps) : | |||
| data(new NaClAppData()) | |||
| { | |||
| Ticker::Setup(fps); | |||
| #if defined __native_client__ | |||
| #endif | |||
| } | |||
| void NaClApp::ShowPointer(bool show) | |||
| { | |||
| ; | |||
| } | |||
| void NaClApp::Tick() | |||
| { | |||
| /* The caller should run forever */ | |||
| #if defined __native_client__ | |||
| static int init = 0; | |||
| if (!init) | |||
| { | |||
| NaClInstance::MainSignal(); | |||
| init = 1; | |||
| } | |||
| #endif | |||
| } | |||
| NaClApp::~NaClApp() | |||
| { | |||
| #if defined __native_client__ | |||
| #endif | |||
| delete data; | |||
| } | |||
| } /* namespace lol */ | |||
| @@ -1,39 +0,0 @@ | |||
| // | |||
| // Lol Engine | |||
| // | |||
| // Copyright: (c) 2010-2011 Sam Hocevar <sam@hocevar.net> | |||
| // This program is free software; you can redistribute it and/or | |||
| // modify it under the terms of the Do What The Fuck You Want To | |||
| // Public License, Version 2, as published by Sam Hocevar. See | |||
| // http://www.wtfpl.net/ for more details. | |||
| // | |||
| #pragma once | |||
| // | |||
| // The NaClApp class | |||
| // ----------------- | |||
| // | |||
| #include <lol/math/vector.h> | |||
| namespace lol | |||
| { | |||
| class NaClAppData; | |||
| class NaClApp | |||
| { | |||
| public: | |||
| NaClApp(char const *title, ivec2 res, float fps); | |||
| virtual ~NaClApp(); | |||
| void ShowPointer(bool show); | |||
| void Tick(); | |||
| private: | |||
| NaClAppData *data; | |||
| }; | |||
| } /* namespace lol */ | |||
| @@ -1,277 +0,0 @@ | |||
| // Copyright (c) 2011 The Native Client Authors. All rights reserved. | |||
| // Use of this source code is governed by a BSD-style license that can be | |||
| // found in the LICENSE file. | |||
| #include <lol/engine-internal.h> | |||
| #include <cstdlib> | |||
| #include <cstdio> | |||
| #include <cstring> | |||
| #include <string> | |||
| #include <ppapi/cpp/rect.h> | |||
| #include <ppapi/cpp/size.h> | |||
| #include <ppapi/cpp/var.h> | |||
| #include <ppapi/cpp/module.h> | |||
| #include <ppapi/cpp/completion_callback.h> | |||
| #include "platform/nacl/nacl-instance.h" | |||
| #include "platform/nacl/opengl_context.h" | |||
| /* One of these wrappers will be overridden by the user's version */ | |||
| void lol_nacl_main(void) __attribute__((weak)); | |||
| void lol_nacl_main(void) {} | |||
| void lol_nacl_main(int argc, char **argv) __attribute__((weak)); | |||
| void lol_nacl_main(int argc, char **argv) { UNUSED(argc, argv); } | |||
| void lol_nacl_main(int argc, char **argv, char **envp) __attribute__((weak)); | |||
| void lol_nacl_main(int argc, char **argv, char **envp) { UNUSED(argc, argv, envp); } | |||
| namespace lol | |||
| { | |||
| /* | |||
| * NACL Input implementation class | |||
| * This is a ripoff of the SDL one | |||
| */ | |||
| NaClInstance::NaClInstance(PP_Instance instance) | |||
| : pp::Instance(instance), | |||
| m_size(0, 0) | |||
| { | |||
| RequestInputEvents(PP_INPUTEVENT_CLASS_MOUSE | PP_INPUTEVENT_CLASS_WHEEL); | |||
| RequestFilteringInputEvents(PP_INPUTEVENT_CLASS_KEYBOARD); | |||
| m_input_data = new NaClInputData(); | |||
| m_input_data->m_keyboard = InputDeviceInternal::CreateStandardKeyboard(); | |||
| m_input_data->m_mouse = InputDeviceInternal::CreateStandardMouse(); | |||
| } | |||
| NaClInstance::~NaClInstance() | |||
| { | |||
| // Destroy the cube view while GL context is current. | |||
| m_opengl_ctx->MakeContextCurrent(this); | |||
| delete m_input_data; | |||
| } | |||
| static double const DELTA_MS = 1000.0 / 60.0; | |||
| void NaClInstance::TickCallback(void* data, int32_t result) | |||
| { | |||
| UNUSED(result); | |||
| NaClInstance *instance = (NaClInstance *)data; | |||
| instance->DrawSelf(); | |||
| /* FIXME: only set if if Ticker isn't finished */ | |||
| pp::Module::Get()->core()->CallOnMainThread( | |||
| DELTA_MS, pp::CompletionCallback(&TickCallback, data), PP_OK); | |||
| //Tick input : TODO: DELTA_MS is not exactly kasher ? | |||
| instance->m_input_data->Tick(DELTA_MS); | |||
| } | |||
| mutex NaClInstance::main_mutex; | |||
| queue<NaClInstance::Args *, 1> NaClInstance::main_queue; | |||
| bool NaClInstance::Init(uint32_t argc, | |||
| const char* /* argn */[], | |||
| const char* argv[]) | |||
| { | |||
| /* Ensure only one NaClInstance does Init() at the same time. */ | |||
| main_mutex.Lock(); | |||
| char *env[] = { nullptr }; | |||
| Args arglist(argc, const_cast<char **>(argv), const_cast<char **>(env)); | |||
| main_queue.push(&arglist); | |||
| m_main_thread = new thread(MainRun, nullptr); | |||
| /* Push so that only MainSignal() can unblock us */ | |||
| main_queue.push(nullptr); | |||
| main_queue.push(nullptr); | |||
| main_mutex.Unlock(); | |||
| // My timer callback | |||
| pp::Module::Get()->core()->CallOnMainThread( | |||
| DELTA_MS, pp::CompletionCallback(&TickCallback, this), PP_OK); | |||
| /* The gamepad interface */ | |||
| m_pad_interface = static_cast<PPB_Gamepad const *>( | |||
| pp::Module::Get()->GetBrowserInterface(PPB_GAMEPAD_INTERFACE)); | |||
| return true; | |||
| } | |||
| void * NaClInstance::MainRun(void *data) | |||
| { | |||
| UNUSED(data); | |||
| Args *arglist = main_queue.pop(); | |||
| /* Call the user's main() function. One of these will work. */ | |||
| lol_nacl_main(); | |||
| lol_nacl_main(arglist->m_argc, arglist->m_argv); | |||
| lol_nacl_main(arglist->m_argc, arglist->m_argv, arglist->m_env); | |||
| return nullptr; | |||
| } | |||
| void NaClInstance::MainSignal() | |||
| { | |||
| /* FIXME: find something more elegant. */ | |||
| main_queue.pop(); | |||
| main_queue.pop(); | |||
| } | |||
| void NaClInstance::HandleMessage(const pp::Var& message) | |||
| { | |||
| if (!message.is_string()) | |||
| return; | |||
| /* FIXME: do some shit here */ | |||
| MessageService::Send(MessageBucket::AppIn, message.AsString().c_str()); | |||
| } | |||
| void NaClInstance::DidChangeView(const pp::Rect& position, const pp::Rect& clip) | |||
| { | |||
| UNUSED(clip); | |||
| if (position.size().width() == m_size.x && | |||
| position.size().height() == m_size.y) | |||
| return; // Size didn't change, no need to update anything. | |||
| m_size = ivec2(position.size().width(), position.size().height()); | |||
| if (m_opengl_ctx == nullptr) | |||
| m_opengl_ctx.reset(new OpenGLContext(this)); | |||
| m_opengl_ctx->InvalidateContext(this); | |||
| m_opengl_ctx->ResizeContext(position.size()); | |||
| if (!m_opengl_ctx->MakeContextCurrent(this)) | |||
| return; | |||
| Video::Setup(m_size); | |||
| DrawSelf(); | |||
| } | |||
| bool NaClInstance::HandleInputEvent(const pp::InputEvent& event) | |||
| { | |||
| m_input_data->m_input_events << event; | |||
| return true; | |||
| } | |||
| void NaClInstance::DrawSelf() | |||
| { | |||
| if (m_opengl_ctx == nullptr) | |||
| return; | |||
| m_opengl_ctx->MakeContextCurrent(this); | |||
| Ticker::tick_draw(); | |||
| m_opengl_ctx->FlushContext(); | |||
| } | |||
| void NaClInputData::Tick(float seconds) | |||
| { | |||
| UNUSED(seconds); | |||
| if (!IsViewportSizeValid()) | |||
| InitViewportSize(); | |||
| //Init cursor position, if mouse didn't move. | |||
| ivec2 mousepos = m_mouse->GetCursorPixelPos(0); | |||
| vec2 mousepos_prev = vec2(mousepos); | |||
| /* Handle keyboard and WM events */ | |||
| for (int i = 0; i < m_input_events.count(); ++i) | |||
| { | |||
| pp::InputEvent &e = m_input_events[i]; | |||
| switch (e.GetType()) | |||
| { | |||
| case PP_INPUTEVENT_TYPE_MOUSEDOWN: | |||
| case PP_INPUTEVENT_TYPE_MOUSEUP: | |||
| { | |||
| pp::MouseInputEvent em = pp::MouseInputEvent(e); | |||
| //Show probably do a switch. | |||
| if (em.GetButton() != PP_INPUTEVENT_MOUSEBUTTON_NONE) | |||
| m_mouse->SetKey(em.GetButton(), em.GetType() == PP_INPUTEVENT_TYPE_MOUSEDOWN); | |||
| break; | |||
| } | |||
| case PP_INPUTEVENT_TYPE_MOUSELEAVE: | |||
| case PP_INPUTEVENT_TYPE_MOUSEENTER: | |||
| { | |||
| /* TODO: "InScreen" idx hardcoded, not nice */ | |||
| pp::MouseInputEvent em = pp::MouseInputEvent(e); | |||
| m_mouse->SetKey(3, em.GetType() == PP_INPUTEVENT_TYPE_MOUSEENTER); | |||
| break; | |||
| } | |||
| case PP_INPUTEVENT_TYPE_MOUSEMOVE: | |||
| { | |||
| pp::MouseInputEvent em = pp::MouseInputEvent(e); | |||
| mousepos = ivec2(em.GetPosition().x(), em.GetPosition().y()); | |||
| break; | |||
| } | |||
| case PP_INPUTEVENT_TYPE_WHEEL: | |||
| { | |||
| /* TODO: MOUSE WHEEL NOT IMPLEMENTED IN LOL */ | |||
| break; | |||
| } | |||
| // Use ? | |||
| //case PP_INPUTEVENT_TYPE_RAWKEYDOWN: | |||
| //case PP_INPUTEVENT_TYPE_CHAR: | |||
| case PP_INPUTEVENT_TYPE_KEYDOWN: | |||
| case PP_INPUTEVENT_TYPE_KEYUP: | |||
| { | |||
| pp::KeyboardInputEvent ek = pp::KeyboardInputEvent(e); | |||
| m_keyboard->SetKey(ek.GetKeyCode(), ek.GetType() == PP_INPUTEVENT_TYPE_KEYUP); | |||
| break; | |||
| } | |||
| case PP_INPUTEVENT_TYPE_UNDEFINED: | |||
| default: | |||
| { | |||
| break; | |||
| } | |||
| } | |||
| } | |||
| m_input_events.clear(); | |||
| /* Handle mouse input */ | |||
| if (IsViewportSizeValid()) | |||
| { | |||
| if (mousepos.x >= 0 && mousepos.x < m_app.x && mousepos.y >= 0 && mousepos.y < m_app.y) | |||
| { | |||
| //We need the max if we want coherent mouse speed between axis | |||
| float max_screen_size = lol::max(m_screen.x, m_screen.y); | |||
| vec2 vmousepos = vec2(mousepos); | |||
| m_mouse->SetCursor(0, vmousepos / m_app, mousepos); | |||
| // Note: 100.0f is an arbitrary value that makes it feel about the same than an xbox controller joystick | |||
| m_mouse->SetAxis(0, (vmousepos.x - mousepos_prev.x) * 100.0f / max_screen_size); | |||
| // Unlike SDL, no need to negate Y axis. | |||
| m_mouse->SetAxis(1, (vmousepos.y - mousepos_prev.y) * 100.0f / max_screen_size); | |||
| } | |||
| if (m_mousecapture) | |||
| { | |||
| /* | |||
| mousepos = ivec2(m_app * .5f); | |||
| NaClInputData::SetMousePos(mousepos); | |||
| */ | |||
| } | |||
| } | |||
| } | |||
| //---- | |||
| void NaClInputData::InitViewportSize() | |||
| { | |||
| if (Scene::GetCount()) | |||
| { | |||
| m_app = vec2(Video::GetSize()); | |||
| //Dunno if its the good idea. | |||
| m_screen = vec2(Video::GetSize()); | |||
| } | |||
| else | |||
| { | |||
| m_app = vec2(-1.f); | |||
| m_screen = vec2(-1.f); | |||
| } | |||
| } | |||
| void NaClInputData::SetMousePos(ivec2 position) | |||
| { | |||
| UNUSED(position); | |||
| //? How to do that ? | |||
| //SDL_WarpMouse((uint16_t)position.x, (uint16_t)position.y); | |||
| } | |||
| } // namespace lol | |||
| @@ -1,106 +0,0 @@ | |||
| // Copyright (c) 2011 The Native Client Authors. All rights reserved. | |||
| // Use of this source code is governed by a BSD-style license that can be | |||
| // found in the LICENSE file. | |||
| #pragma once | |||
| #include <ppapi/cpp/instance.h> | |||
| #include <ppapi/c/ppb_gamepad.h> | |||
| #include <ppapi/cpp/input_event.h> | |||
| #include "platform/nacl/opengl_context.h" | |||
| #include "platform/nacl/opengl_context_ptrs.h" | |||
| #include "input/input.h" | |||
| #include "input/input_internal.h" | |||
| namespace lol { | |||
| class NaClInputData | |||
| { | |||
| friend class NaClInstance; | |||
| private: | |||
| void Tick(float seconds); | |||
| bool IsViewportSizeValid() { return (m_app.x > 0.f && m_app.y > 0.f && m_screen.x > 0.f && m_screen.y > 0.f); } | |||
| void InitViewportSize(); | |||
| static void SetMousePos(ivec2 position); | |||
| NaClInputData() | |||
| : m_mousecapture(false) | |||
| { | |||
| InitViewportSize(); | |||
| } | |||
| array<class pp::InputEvent> m_input_events; | |||
| class InputDeviceInternal* m_mouse; | |||
| class InputDeviceInternal* m_keyboard; | |||
| vec2 m_app; | |||
| vec2 m_screen; | |||
| bool m_mousecapture; | |||
| }; | |||
| class NaClInstance : public pp::Instance | |||
| { | |||
| public: | |||
| explicit NaClInstance(PP_Instance instance); | |||
| // The dtor makes the 3D context current before deleting the cube view, then | |||
| // destroys the 3D context both in the module and in the browser. | |||
| virtual ~NaClInstance(); | |||
| // Called by the browser when the NaCl module is loaded and all ready to go. | |||
| virtual bool Init(uint32_t argc, const char* argn[], const char* argv[]); | |||
| // Called whenever the in-browser window changes size. | |||
| virtual void DidChangeView(const pp::Rect& position, const pp::Rect& clip); | |||
| // Called by the browser to handle the postMessage() call in Javascript. | |||
| virtual void HandleMessage(const pp::Var& message); | |||
| // Bind and publish the module's methods to JavaScript. | |||
| //void InitializeMethods(ScriptingBridge* bridge); | |||
| // Called to draw the contents of the module's browser area. | |||
| virtual bool HandleInputEvent(const pp::InputEvent& event); | |||
| void DrawSelf(); | |||
| /* Communication with the application object */ | |||
| static void MainSignal(); | |||
| private: | |||
| SharedOpenGLContext m_opengl_ctx; | |||
| ivec2 m_size; | |||
| static void TickCallback(void* data, int32_t result); | |||
| static void * MainRun(void *data); | |||
| /* Gamepad support */ | |||
| PPB_Gamepad const *m_pad_interface; | |||
| //12/09/2013 : Should use new system. | |||
| NaClInputData *m_input_data; | |||
| /* Communication with the application object */ | |||
| struct Args | |||
| { | |||
| Args(int argc, char **argv, char **env) | |||
| : m_argc(argc), m_argv(argv), m_env(env) {} | |||
| Args() {} | |||
| int m_argc; | |||
| char **m_argv; | |||
| char **m_env; | |||
| }; | |||
| static mutex main_mutex; | |||
| static queue<Args *, 1> main_queue; | |||
| Thread *m_main_thread; | |||
| }; | |||
| } // namespace lol | |||
| @@ -1,57 +0,0 @@ | |||
| // Copyright (c) 2011 The Native Client Authors. All rights reserved. | |||
| // Use of this source code is governed by a BSD-style license that can be | |||
| // found in the LICENSE file. | |||
| #include <lol/engine-internal.h> | |||
| #include <ppapi/cpp/instance.h> | |||
| #include <ppapi/cpp/module.h> | |||
| #include <ppapi/gles2/gl2ext_ppapi.h> | |||
| #include "lolgl.h" /* needed for GL_TRUE */ | |||
| #include "platform/nacl/nacl-instance.h" | |||
| /// The Module class. The browser calls the CreateInstance() method to create | |||
| /// an instance of your NaCl module on the web page. The browser creates a new | |||
| /// instance for each <embed> tag with type="application/x-nacl". | |||
| class NaClModule : public pp::Module | |||
| { | |||
| public: | |||
| NaClModule() : pp::Module() {} | |||
| virtual ~NaClModule() | |||
| { | |||
| glTerminatePPAPI(); | |||
| } | |||
| /// Called by the browser when the module is first loaded and ready to run. | |||
| /// This is called once per module, not once per instance of the module on | |||
| /// the page. | |||
| virtual bool Init() | |||
| { | |||
| return glInitializePPAPI(get_browser_interface()) == GL_TRUE; | |||
| } | |||
| /// Create and return a Lol instance object. | |||
| /// @param[in] instance The browser-side instance. | |||
| /// @return the plugin-side instance. | |||
| virtual pp::Instance* CreateInstance(PP_Instance instance) | |||
| { | |||
| return new lol::NaClInstance(instance); | |||
| } | |||
| }; | |||
| namespace pp | |||
| { | |||
| /// Factory function called by the browser when the module is first loaded. | |||
| /// The browser keeps a singleton of this module. It calls the | |||
| /// CreateInstance() method on the object you return to make instances. There | |||
| /// is one instance per <embed> tag on the page. This is the main binding | |||
| /// point for your NaCl module with the browser. | |||
| Module* CreateModule() | |||
| { | |||
| return new NaClModule(); | |||
| } | |||
| } // namespace pp | |||
| @@ -1,87 +0,0 @@ | |||
| // Copyright (c) 2011 The Native Client Authors. All rights reserved. | |||
| // Use of this source code is governed by a BSD-style license that can be | |||
| // found in the LICENSE file. | |||
| #include <lol/engine-internal.h> | |||
| #include <ppapi/cpp/completion_callback.h> | |||
| #include <ppapi/gles2/gl2ext_ppapi.h> | |||
| #include "platform/nacl/opengl_context.h" | |||
| namespace { | |||
| // This is called by the brower when the 3D context has been flushed to the | |||
| // browser window. | |||
| void FlushCallback(void* data, int32_t result) { | |||
| static_cast<lol::OpenGLContext*>(data)->set_flush_pending(false); | |||
| } | |||
| } // namespace | |||
| namespace lol { | |||
| OpenGLContext::OpenGLContext(pp::Instance* instance) | |||
| : pp::Graphics3DClient(instance), | |||
| flush_pending_(false) { | |||
| pp::Module* module = pp::Module::Get(); | |||
| assert(module); | |||
| gles2_interface_ = static_cast<const struct PPB_OpenGLES2*>( | |||
| module->GetBrowserInterface(PPB_OPENGLES2_INTERFACE)); | |||
| assert(gles2_interface_); | |||
| } | |||
| OpenGLContext::~OpenGLContext() { | |||
| glSetCurrentContextPPAPI(0); | |||
| } | |||
| bool OpenGLContext::MakeContextCurrent(pp::Instance* instance) | |||
| { | |||
| if (instance == nullptr) | |||
| { | |||
| glSetCurrentContextPPAPI(0); | |||
| return false; | |||
| } | |||
| // Lazily create the Pepper context. | |||
| if (context_.is_null()) { | |||
| int32_t attribs[] = { | |||
| PP_GRAPHICS3DATTRIB_ALPHA_SIZE, 8, | |||
| PP_GRAPHICS3DATTRIB_DEPTH_SIZE, 24, | |||
| PP_GRAPHICS3DATTRIB_STENCIL_SIZE, 8, | |||
| PP_GRAPHICS3DATTRIB_SAMPLES, 0, | |||
| PP_GRAPHICS3DATTRIB_SAMPLE_BUFFERS, 0, | |||
| PP_GRAPHICS3DATTRIB_WIDTH, size_.width(), | |||
| PP_GRAPHICS3DATTRIB_HEIGHT, size_.height(), | |||
| PP_GRAPHICS3DATTRIB_NONE | |||
| }; | |||
| context_ = pp::Graphics3D(instance, pp::Graphics3D(), attribs); | |||
| if (context_.is_null()) { | |||
| glSetCurrentContextPPAPI(0); | |||
| return false; | |||
| } | |||
| instance->BindGraphics(context_); | |||
| } | |||
| glSetCurrentContextPPAPI(context_.pp_resource()); | |||
| return true; | |||
| } | |||
| void OpenGLContext::InvalidateContext(pp::Instance* instance) { | |||
| glSetCurrentContextPPAPI(0); | |||
| } | |||
| void OpenGLContext::ResizeContext(const pp::Size& size) { | |||
| size_ = size; | |||
| if (!context_.is_null()) { | |||
| context_.ResizeBuffers(size.width(), size.height()); | |||
| } | |||
| } | |||
| void OpenGLContext::FlushContext() { | |||
| if (flush_pending()) { | |||
| // A flush is pending so do nothing; just drop this flush on the floor. | |||
| return; | |||
| } | |||
| set_flush_pending(true); | |||
| context_.SwapBuffers(pp::CompletionCallback(&FlushCallback, this)); | |||
| } | |||
| } // namespace lol | |||
| @@ -1,92 +0,0 @@ | |||
| // Copyright (c) 2011 The Native Client Authors. All rights reserved. | |||
| // Use of this source code is governed by a BSD-style license that can be | |||
| // found in the LICENSE file. | |||
| #pragma once | |||
| /// | |||
| /// @file | |||
| /// OpenGLContext manages the OpenGL context in the browser that is associated | |||
| /// with a @a pp::Instance instance. | |||
| /// | |||
| #include <assert.h> | |||
| #include <algorithm> | |||
| #include <string> | |||
| #include <ppapi/c/ppb_opengles2.h> | |||
| #include <ppapi/cpp/graphics_3d_client.h> | |||
| #include <ppapi/cpp/graphics_3d.h> | |||
| #include <ppapi/cpp/instance.h> | |||
| #include <ppapi/cpp/size.h> | |||
| #include "platform/nacl/opengl_context_ptrs.h" | |||
| namespace lol { | |||
| /// OpenGLContext manages an OpenGL rendering context in the browser. | |||
| /// | |||
| class OpenGLContext : public pp::Graphics3DClient { | |||
| public: | |||
| explicit OpenGLContext(pp::Instance* instance); | |||
| /// Release all the in-browser resources used by this context, and make this | |||
| /// context invalid. | |||
| virtual ~OpenGLContext(); | |||
| /// The Graphics3DClient interfcace. | |||
| virtual void Graphics3DContextLost() { | |||
| assert(!"Unexpectedly lost graphics context"); | |||
| } | |||
| /// Make @a this the current 3D context in @a instance. | |||
| /// @param instance The instance of the NaCl module that will receive the | |||
| /// the current 3D context. | |||
| /// @return success. | |||
| bool MakeContextCurrent(pp::Instance* instance); | |||
| /// Flush the contents of this context to the browser's 3D device. | |||
| void FlushContext(); | |||
| /// Make the underlying 3D device invalid, so that any subsequent rendering | |||
| /// commands will have no effect. The next call to MakeContextCurrent() will | |||
| /// cause the underlying 3D device to get rebound and start receiving | |||
| /// receiving rendering commands again. Use InvalidateContext(), for | |||
| /// example, when resizing the context's viewing area. | |||
| void InvalidateContext(pp::Instance* instance); | |||
| /// Resize the context. | |||
| void ResizeContext(const pp::Size& size); | |||
| pp::Size const& GetSize() { return size_; } | |||
| /// The OpenGL ES 2.0 interface. | |||
| const struct PPB_OpenGLES2* gles2() const { | |||
| return gles2_interface_; | |||
| } | |||
| /// The PP_Resource needed to make GLES2 calls through the Pepper interface. | |||
| PP_Resource gl_context() const { | |||
| return context_.pp_resource(); | |||
| } | |||
| /// Indicate whether a flush is pending. This can only be called from the | |||
| /// main thread; it is not thread safe. | |||
| bool flush_pending() const { | |||
| return flush_pending_; | |||
| } | |||
| void set_flush_pending(bool flag) { | |||
| flush_pending_ = flag; | |||
| } | |||
| private: | |||
| pp::Size size_; | |||
| pp::Graphics3D context_; | |||
| bool flush_pending_; | |||
| const struct PPB_OpenGLES2* gles2_interface_; | |||
| }; | |||
| } // namespace lol | |||
| @@ -1,19 +0,0 @@ | |||
| // Copyright (c) 2011 The Native Client Authors. All rights reserved. | |||
| // Use of this source code is governed by a BSD-style license that can be | |||
| // found in the LICENSE file. | |||
| #pragma once | |||
| // A convenience wrapper for a shared OpenGLContext pointer type. As other | |||
| // smart pointer types are needed, add them here. | |||
| #include <tr1/memory> | |||
| namespace lol { | |||
| class OpenGLContext; | |||
| typedef std::tr1::shared_ptr<OpenGLContext> SharedOpenGLContext; | |||
| } // namespace lol | |||