| @@ -82,11 +82,9 @@ doc/samples/benchsuite | |||||
| doc/samples/bluenoise | doc/samples/bluenoise | ||||
| doc/samples/btphystest | doc/samples/btphystest | ||||
| doc/samples/meshviewer/meshviewer | doc/samples/meshviewer/meshviewer | ||||
| doc/samples/nacl_phystest | |||||
| doc/samples/sandbox/sample | doc/samples/sandbox/sample | ||||
| doc/samples/math/pi | doc/samples/math/pi | ||||
| doc/samples/math/poly | doc/samples/math/poly | ||||
| doc/samples/nacl_phystest | |||||
| doc/samples/simplex | doc/samples/simplex | ||||
| doc/tutorial/01_triangle | doc/tutorial/01_triangle | ||||
| doc/tutorial/02_cube | doc/tutorial/02_cube | ||||
| @@ -6,7 +6,7 @@ include $(top_srcdir)/build/autotools/common.am | |||||
| EXTRA_DIST += lol-build \ | EXTRA_DIST += lol-build \ | ||||
| check-source.sh run-bitten.sh \ | check-source.sh run-bitten.sh \ | ||||
| build-linux build-mingw build-mingw64 \ | build-linux build-mingw build-mingw64 \ | ||||
| build-nacl32 build-nacl64 build-android build-html \ | |||||
| build-android build-html \ | |||||
| \ | \ | ||||
| msbuild/lolfx.targets \ | msbuild/lolfx.targets \ | ||||
| msbuild/lolfx.xml \ | msbuild/lolfx.xml \ | ||||
| @@ -90,19 +90,6 @@ fi | |||||
| AM_CONDITIONAL(LOL_USE_BULLET, test "${ac_cv_my_have_bullet}" = "yes") | 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! | dnl Use Android? FIXME: super hacks! | ||||
| ac_cv_my_have_android="no" | ac_cv_my_have_android="no" | ||||
| AC_CHECK_LIB(log, __android_log_vprint, | 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: | # And <platform> is one of: | ||||
| # - linux-i386 | # - linux-i386 | ||||
| # - linux-amd64 | # - linux-amd64 | ||||
| # - nacl-i386 | |||||
| # - nacl-amd64 | |||||
| # - ios-arm | # - ios-arm | ||||
| # - osx-amd64 | # - osx-amd64 | ||||
| # - android-arm | # - android-arm | ||||
| @@ -238,12 +236,6 @@ configure() | |||||
| raspi-arm) | 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" | 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) | osx-amd64) | ||||
| # HACK: use clang++ because of a memory leak in llvm-g++. | # HACK: use clang++ because of a memory leak in llvm-g++. | ||||
| do_configure CXX=clang++ CC=clang | do_configure CXX=clang++ CC=clang | ||||
| @@ -312,8 +304,6 @@ check() | |||||
| ;; | ;; | ||||
| raspi-arm) | raspi-arm) | ||||
| ;; | ;; | ||||
| nacl-*) | |||||
| ;; | |||||
| web-*) | web-*) | ||||
| ;; | ;; | ||||
| win*-i386) | win*-i386) | ||||
| @@ -188,21 +188,6 @@ if [ "$family" != "windows" ]; then | |||||
| fi | fi | ||||
| append "" | 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 | # Raspberry Pi cross-compiler | ||||
| # | # | ||||
| @@ -799,7 +799,6 @@ INPUT = .. \ | |||||
| ../src/platform \ | ../src/platform \ | ||||
| ../src/platform/android \ | ../src/platform/android \ | ||||
| ../src/platform/d3d9 \ | ../src/platform/d3d9 \ | ||||
| ../src/platform/nacl \ | |||||
| ../src/platform/sdl \ | ../src/platform/sdl \ | ||||
| ../src/platform/xbox \ | ../src/platform/xbox \ | ||||
| ../src/thread | ../src/thread | ||||
| @@ -9,7 +9,6 @@ bench: benchsuite$(EXEEXT) | |||||
| if BUILD_SAMPLES | if BUILD_SAMPLES | ||||
| noinst_PROGRAMS = bluenoise benchsuite simplex | noinst_PROGRAMS = bluenoise benchsuite simplex | ||||
| if LOL_USE_GL | if LOL_USE_GL | ||||
| noinst_PROGRAMS += nacl_phystest | |||||
| if LOL_USE_BULLET | if LOL_USE_BULLET | ||||
| noinst_PROGRAMS += btphystest | noinst_PROGRAMS += btphystest | ||||
| endif | endif | ||||
| @@ -44,13 +43,6 @@ btphystest_LDFLAGS += \ | |||||
| -s TOTAL_MEMORY=$(shell expr 32 '*' 1024 '*' 1024) | -s TOTAL_MEMORY=$(shell expr 32 '*' 1024 '*' 1024) | ||||
| endif | 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_SOURCES = simplex.cpp | ||||
| simplex_CPPFLAGS = $(AM_CPPFLAGS) | simplex_CPPFLAGS = $(AM_CPPFLAGS) | ||||
| simplex_DEPENDENCIES = @LOL_DEPS@ | 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; | static int const TEXTURE_WIDTH = 256; | ||||
| //Basic build defines --------------------------------------------------------- | //Basic build defines --------------------------------------------------------- | ||||
| #define HAS_WEB (__native_client__ || EMSCRIPTEN) | |||||
| #define HAS_WEB (EMSCRIPTEN) | |||||
| #define HAS_INPUT (_WIN32 && !HAS_WEB) | #define HAS_INPUT (_WIN32 && !HAS_WEB) | ||||
| //Basic config defines -------------------------------------------------------- | //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"> | <None Include="..\data\meshviewer.init.lua"> | ||||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild> | <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild> | ||||
| </None> | </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> | ||||
| <ItemGroup> | <ItemGroup> | ||||
| <LolFxCompile Include="shinyfur.lolfx" /> | <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 | /* Window size decides the world aspect ratio. For instance, 640×480 | ||||
| * will be mapped to (-0.66,-0.5) - (0.66,0.5). */ | * will be mapped to (-0.66,-0.5) - (0.66,0.5). */ | ||||
| #if !defined __native_client__ | |||||
| m_window_size = Video::GetSize(); | 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) | if (m_window_size.y < m_window_size.x) | ||||
| m_window2world = 0.5 / m_window_size.y; | m_window2world = 0.5 / m_window_size.y; | ||||
| else | else | ||||
| @@ -98,14 +93,9 @@ public: | |||||
| uint8_t red = (uint8_t)(rgb.r * 256); | uint8_t red = (uint8_t)(rgb.r * 256); | ||||
| uint8_t green = (uint8_t)(rgb.g * 256); | uint8_t green = (uint8_t)(rgb.g * 256); | ||||
| uint8_t blue = (uint8_t)(rgb.b * 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)); | m_palette.push(u8vec4(blue, green, red, 255)); | ||||
| #endif | |||||
| } | } | ||||
| #if !defined __native_client__ | |||||
| m_zoomtext = new Text("", "data/font/ascii.png"); | m_zoomtext = new Text("", "data/font/ascii.png"); | ||||
| m_zoomtext->SetPos(vec3(5, (float)m_window_size.y - 15, 1)); | m_zoomtext->SetPos(vec3(5, (float)m_window_size.y - 15, 1)); | ||||
| Ticker::Ref(m_zoomtext); | Ticker::Ref(m_zoomtext); | ||||
| @@ -117,7 +107,6 @@ public: | |||||
| m_mousetext = new Text("", "data/font/ascii.png"); | m_mousetext = new Text("", "data/font/ascii.png"); | ||||
| m_mousetext->SetPos(vec3(5, (float)m_window_size.y - 43, 1)); | m_mousetext->SetPos(vec3(5, (float)m_window_size.y - 43, 1)); | ||||
| Ticker::Ref(m_mousetext); | Ticker::Ref(m_mousetext); | ||||
| #endif | |||||
| m_position = vec3::zero; | m_position = vec3::zero; | ||||
| m_aabb.aa = m_position; | m_aabb.aa = m_position; | ||||
| @@ -143,11 +132,9 @@ public: | |||||
| m_donequeue.pop(); | m_donequeue.pop(); | ||||
| #endif | #endif | ||||
| #if !defined __native_client__ | |||||
| Ticker::Unref(m_centertext); | Ticker::Unref(m_centertext); | ||||
| Ticker::Unref(m_mousetext); | Ticker::Unref(m_mousetext); | ||||
| Ticker::Unref(m_zoomtext); | Ticker::Unref(m_zoomtext); | ||||
| #endif | |||||
| } | } | ||||
| inline f128cmplx TexelToWorldOffset(vec2 texel) | inline f128cmplx TexelToWorldOffset(vec2 texel) | ||||
| @@ -299,7 +286,6 @@ public: | |||||
| m_zoom_settings[i][1] -= 0.5f * (1.0f - m_zoom_settings[i][2]); | m_zoom_settings[i][1] -= 0.5f * (1.0f - m_zoom_settings[i][2]); | ||||
| } | } | ||||
| #if !defined __native_client__ | |||||
| char buf[256]; | char buf[256]; | ||||
| std::sprintf(buf, "center: "); | std::sprintf(buf, "center: "); | ||||
| m_view.center.x.sprintf(buf + strlen(buf), 30); | m_view.center.x.sprintf(buf + strlen(buf), 30); | ||||
| @@ -313,7 +299,6 @@ public: | |||||
| m_mousetext->SetText(buf); | m_mousetext->SetText(buf); | ||||
| std::sprintf(buf, "[%s] zoom: %g", m_julia ? "Julia" : "Mandelbrot", 1.0 / m_view.radius); | std::sprintf(buf, "[%s] zoom: %g", m_julia ? "Julia" : "Mandelbrot", 1.0 / m_view.radius); | ||||
| m_zoomtext->SetText(buf); | m_zoomtext->SetText(buf); | ||||
| #endif | |||||
| if (m_dirty[m_frame]) | if (m_dirty[m_frame]) | ||||
| { | { | ||||
| @@ -590,10 +575,8 @@ private: | |||||
| queue<int> m_spawnqueue, m_jobqueue, m_donequeue; | queue<int> m_spawnqueue, m_jobqueue, m_donequeue; | ||||
| #endif | #endif | ||||
| #if !defined __native_client__ | |||||
| /* Debug information */ | /* Debug information */ | ||||
| Text *m_centertext, *m_mousetext, *m_zoomtext; | Text *m_centertext, *m_mousetext, *m_zoomtext; | ||||
| #endif | |||||
| }; | }; | ||||
| int main(int argc, char **argv) | int main(int argc, char **argv) | ||||
| @@ -21,7 +21,6 @@ liblol_core_a_SOURCES = \ | |||||
| $(liblol_core_sources) \ | $(liblol_core_sources) \ | ||||
| \ | \ | ||||
| $(imgui_sources) \ | $(imgui_sources) \ | ||||
| $(nacl_sources) \ | |||||
| $(sdl_sources) \ | $(sdl_sources) \ | ||||
| $(d3d9_sources) \ | $(d3d9_sources) \ | ||||
| $(android_sources) | $(android_sources) | ||||
| @@ -156,15 +155,6 @@ imgui_sources += \ | |||||
| lolimgui.cpp lolimgui.h \ | lolimgui.cpp lolimgui.h \ | ||||
| $(NULL) | $(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 = \ | android_sources = \ | ||||
| image/codec/android-image.cpp \ | image/codec/android-image.cpp \ | ||||
| platform/android/androidapp.cpp platform/android/androidapp.h | platform/android/androidapp.cpp platform/android/androidapp.h | ||||
| @@ -18,9 +18,7 @@ | |||||
| #include "lolgl.h" | #include "lolgl.h" | ||||
| #if __native_client__ | |||||
| # include "platform/nacl/nacl-app.h" | |||||
| #elif __ANDROID__ | |||||
| #if __ANDROID__ | |||||
| # include "platform/android/androidapp.h" | # include "platform/android/androidapp.h" | ||||
| #elif LOL_USE_SDL | #elif LOL_USE_SDL | ||||
| # include "platform/sdl/sdlapp.h" | # include "platform/sdl/sdlapp.h" | ||||
| @@ -73,9 +71,7 @@ class ApplicationDisplayData | |||||
| { } | { } | ||||
| protected: | protected: | ||||
| #if __native_client__ | |||||
| //NOT HANDLED YET | |||||
| #elif __ANDROID__ | |||||
| #if __ANDROID__ | |||||
| //NOT HANDLED YET | //NOT HANDLED YET | ||||
| #elif LOL_USE_SDL | #elif LOL_USE_SDL | ||||
| SdlAppDisplay display; | SdlAppDisplay display; | ||||
| @@ -139,9 +135,7 @@ class ApplicationData | |||||
| : app(name, res, framerate) | : app(name, res, framerate) | ||||
| { } | { } | ||||
| #if __native_client__ | |||||
| NaClApp app; | |||||
| #elif __ANDROID__ | |||||
| #if __ANDROID__ | |||||
| AndroidApp app; | AndroidApp app; | ||||
| #elif LOL_USE_SDL | #elif LOL_USE_SDL | ||||
| SdlApp app; | SdlApp app; | ||||
| @@ -64,7 +64,7 @@ Texture::Texture(ivec2 size, PixelFormat format) | |||||
| { 0, 0, 0, 0 }, /* Unknown */ | { 0, 0, 0, 0 }, /* Unknown */ | ||||
| /* FIXME: this is all mixed up for the RGBA/ARGB combinations */ | /* 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_LUMINANCE, GL_LUMINANCE, GL_UNSIGNED_BYTE, 1 }, | ||||
| { GL_RGB, GL_RGB, GL_UNSIGNED_BYTE, 3 }, | { GL_RGB, GL_RGB, GL_UNSIGNED_BYTE, 3 }, | ||||
| { GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, 4 }, | { GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, 4 }, | ||||
| @@ -164,38 +164,6 @@ | |||||
| <ClCompile Include="messageservice.cpp" /> | <ClCompile Include="messageservice.cpp" /> | ||||
| <ClCompile Include="platform.cpp" /> | <ClCompile Include="platform.cpp" /> | ||||
| <ClCompile Include="platform\d3d9\d3d9input.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"> | <ClCompile Include="platform\sdl\sdlapp.cpp"> | ||||
| <ExcludedFromBuild Condition="'$(enable_sdl)'=='no'">true</ExcludedFromBuild> | <ExcludedFromBuild Condition="'$(enable_sdl)'=='no'">true</ExcludedFromBuild> | ||||
| </ClCompile> | </ClCompile> | ||||
| @@ -317,38 +285,6 @@ | |||||
| <ClInclude Include="numeric.h" /> | <ClInclude Include="numeric.h" /> | ||||
| <ClInclude Include="platform.h" /> | <ClInclude Include="platform.h" /> | ||||
| <ClInclude Include="platform\d3d9\d3d9input.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"> | <ClInclude Include="platform\sdl\sdlapp.h"> | ||||
| <ExcludedFromBuild Condition="'$(enable_sdl)'=='no'">true</ExcludedFromBuild> | <ExcludedFromBuild Condition="'$(enable_sdl)'=='no'">true</ExcludedFromBuild> | ||||
| </ClInclude> | </ClInclude> | ||||
| @@ -79,9 +79,6 @@ | |||||
| <Filter Include="platform\d3d9"> | <Filter Include="platform\d3d9"> | ||||
| <UniqueIdentifier>{a914e15d-3201-467a-a9c9-d7c5244b13ee}</UniqueIdentifier> | <UniqueIdentifier>{a914e15d-3201-467a-a9c9-d7c5244b13ee}</UniqueIdentifier> | ||||
| </Filter> | </Filter> | ||||
| <Filter Include="platform\nacl"> | |||||
| <UniqueIdentifier>{f6cc3470-c841-4581-969b-e60cea841c27}</UniqueIdentifier> | |||||
| </Filter> | |||||
| <Filter Include="image\dither"> | <Filter Include="image\dither"> | ||||
| <UniqueIdentifier>{63e63eea-c96e-4d37-81f6-f3f17e18b751}</UniqueIdentifier> | <UniqueIdentifier>{63e63eea-c96e-4d37-81f6-f3f17e18b751}</UniqueIdentifier> | ||||
| </Filter> | </Filter> | ||||
| @@ -291,18 +288,8 @@ | |||||
| <ClCompile Include="MessageService.cpp"> | <ClCompile Include="MessageService.cpp"> | ||||
| <Filter>...</Filter> | <Filter>...</Filter> | ||||
| </ClCompile> | </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> | ||||
| <ClCompile Include="easymesh\easymeshrender.cpp"> | <ClCompile Include="easymesh\easymeshrender.cpp"> | ||||
| <Filter>easymesh</Filter> | <Filter>easymesh</Filter> | ||||
| @@ -706,18 +693,6 @@ | |||||
| <ClInclude Include="messageservice.h"> | <ClInclude Include="messageservice.h"> | ||||
| <Filter>...</Filter> | <Filter>...</Filter> | ||||
| </ClInclude> | </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"> | <ClInclude Include="easymesh\easymeshrender.h"> | ||||
| <Filter>easymesh</Filter> | <Filter>easymesh</Filter> | ||||
| </ClInclude> | </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 */ | /* XXX: workaround for X11 headers that try to #define these */ | ||||
| #undef Always | #undef Always | ||||
| #define Always Always | #define Always Always | ||||
| @@ -22,10 +22,8 @@ | |||||
| # include "config.h" | # include "config.h" | ||||
| #endif | #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 | # define main lol_android_main | ||||
| #endif | #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 | # define main lol_android_main | ||||
| #endif | #endif | ||||
| @@ -29,9 +29,6 @@ namespace lol | |||||
| #undef min | #undef min | ||||
| #undef max | #undef max | ||||
| /* Avoid issues with NaCl headers */ | |||||
| #undef log2 | |||||
| /* | /* | ||||
| * A bigint stores its digits in an array of integers. The MSB of the | * 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. | * 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 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 int32_t abs(int32_t x) { return std::abs(x); } | ||||
| LOL_ATTR_NODISCARD static inline uint32_t abs(uint32_t x) { return 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; } | LOL_ATTR_NODISCARD static inline int64_t abs(int64_t x) { return x > 0 ? x : -x; } | ||||
| #else | #else | ||||
| LOL_ATTR_NODISCARD static inline int64_t abs(int64_t x) { return std::abs(x); } | LOL_ATTR_NODISCARD static inline int64_t abs(int64_t x) { return std::abs(x); } | ||||
| @@ -29,9 +29,6 @@ namespace lol | |||||
| #undef min | #undef min | ||||
| #undef max | #undef max | ||||
| /* Avoid issues with NaCl headers */ | |||||
| #undef log2 | |||||
| /* | /* | ||||
| * The base class for reals. The only real reason for making this a template | * 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 | * 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 | |||||