@@ -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 | |||||