From 01f6c23c3913941bb8e6a2c8c6899e4c1c728e6e Mon Sep 17 00:00:00 2001 From: Leif Berg Date: Wed, 16 Feb 2011 18:57:50 -0600 Subject: [PATCH 001/348] add a config directory so that vrjlua-config.lua can be replaced without being clobbered on install --- vrjugglua/binding_detail/BindvrjLuaToLua.inl | 3 +++ vrjugglua/lua/vrjlua-config.lua | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/vrjugglua/binding_detail/BindvrjLuaToLua.inl b/vrjugglua/binding_detail/BindvrjLuaToLua.inl index 3e695479..80642f87 100644 --- a/vrjugglua/binding_detail/BindvrjLuaToLua.inl +++ b/vrjugglua/binding_detail/BindvrjLuaToLua.inl @@ -68,6 +68,9 @@ void BindvrjLuaToLua(LuaStatePtr state) { if (!rootDir.empty()) { std::cout << "Found root directory (" << rootDir << "), adding to model search path..." << std::endl; appendToModelSearchPath(rootDir); + + std::cout << "Adding config directory (" << rootDir << "/etc/vrjugglua/) to Lua package path..." << std::endl; + appendToLuaRequirePath(state.get(), rootDir + "/etc/vrjugglua/"); } diff --git a/vrjugglua/lua/vrjlua-config.lua b/vrjugglua/lua/vrjlua-config.lua index 5924eff9..ea45c3c5 100644 --- a/vrjugglua/lua/vrjlua-config.lua +++ b/vrjugglua/lua/vrjlua-config.lua @@ -1,2 +1,6 @@ +-- You've probably found this file in someplace/share/vrjugglua/lua/ +-- If you copy it to someplace/etc/vrjugglua/ it will take priority over this +-- version, and will also not be overwritten by any new versions. + print("Loading config files into kernel") vrjKernel.loadConfigFile("standalone.jconf") From f7e5a94f1dea14efacac2260afb5554a483fae26 Mon Sep 17 00:00:00 2001 From: Leif Berg Date: Thu, 17 Feb 2011 14:11:36 -0600 Subject: [PATCH 002/348] do option for build without terminal --- CMakeLists.txt | 2 ++ src/CMakeLists.txt | 6 +----- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c5bf55d2..6076029e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -40,6 +40,8 @@ option(BUILD_QT_GUI "Build Qt-based GUI apps." DEFAULT_QT_GUI) option(INSTALL_CXX_SDK "Should we install the headers and libraries needed for C++ development using VRJLua?" on) +option(BUILD_WITHOUT_TERMINAL "Build GUI applications without the terminal when possible." on) + # Define advanced options option(BUILD_EMBEDDED_LUA "Build Lua, LuaBind, and osgLua as a part of the app - highly recommended." ON) option(BUILD_LUA_UTILS "Build a stock, standalone lua-interpreter and luac" ON) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index a82eb0c2..fc918753 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -83,17 +83,13 @@ endif() if(BUILD_QT_GUI) include(${QT_USE_FILE}) - set(BUILD_WITHOUT_TERMINAL OFF) set(QT_EXTRA_LIBS) set(QT_EXE_OPTIONS) if(WIN32) - if(QT_QTMAIN_LIBRARY AND NOT BUILD_VERBOSE) - set(BUILD_WITHOUT_TERMINAL ON) + if(BUILD_WITHOUT_TERMINAL AND QT_QTMAIN_LIBRARY AND NOT BUILD_VERBOSE) set(QT_EXTRA_LIBS ${QT_QTMAIN_LIBRARY}) set(QT_EXE_OPTIONS WIN32) endif() - else() - set(BUILD_WITHOUT_TERMINAL ON) endif() if(BUILD_WITHOUT_TERMINAL) From 6fb5207b70e31d074855df346344755c203eb1aa Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Thu, 17 Feb 2011 16:19:30 -0600 Subject: [PATCH 003/348] set a default font --- vrjugglua/lua/Text.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vrjugglua/lua/Text.lua b/vrjugglua/lua/Text.lua index fe964c52..072f58e9 100644 --- a/vrjugglua/lua/Text.lua +++ b/vrjugglua/lua/Text.lua @@ -62,7 +62,7 @@ function verifyFont(obj) end end -local defaultFont +local defaultFont = Font("DroidSans") function setDefaultFont(f) if type(f) == "string" then f = Font(f) From cd50e263347aa4b45338bd02e42a3cbf7c17b53d Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Thu, 17 Feb 2011 16:19:53 -0600 Subject: [PATCH 004/348] parse arguments better in qt navtestbed, allowing scripts to be passed for running --- src/QTNavMain.cpp | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/src/QTNavMain.cpp b/src/QTNavMain.cpp index 24d9ee97..506e0c6f 100644 --- a/src/QTNavMain.cpp +++ b/src/QTNavMain.cpp @@ -18,10 +18,11 @@ // Library/third-party includes #include - +#include // Standard includes -// - none; +#include +#include using namespace vrjLua; @@ -32,12 +33,31 @@ int main(int argc, char * argv[]) { /// Tell it our application path LuaPath lp = LuaPath::instance(argv[0]); + /// Process command line args + bool stubConsole = false; + std::vector files; + for (int i = 1; i < argc; ++i) { + std::string arg(argv[i]); + if (arg == "--stub") { + stubConsole = true; + } else if (arg.find(".jconf") != std::string::npos) { + std::cerr << "WARNING: passing jconf files on the command line not yet supported!" << std::endl; + } else if (arg.find(".lua") != std::string::npos) { + // change to forward slashes. + boost::algorithm::replace_all(arg, "\\", "/"); + std::cout << "Queuing up " << arg << " to run after startup..." << std::endl; + files.push_back(arg); + } else { + std::cerr << "Unrecognized command line argument '" << arg << "', ignoring..." << std::endl; + } + } + /// Create the script object LuaScript script; /// Create the console GUI boost::shared_ptr console; - if (argc > 1 && std::string(argv[1]) == "--stub") { + if (stubConsole) { std::cout << "Creating stub console, as requested..." << std::endl; boost::shared_ptr temp(new StubConsole(script)); console = temp; @@ -70,6 +90,10 @@ int main(int argc, char * argv[]) { assert(console->isValid()); + for (unsigned int i = 0; i < files.size(); ++i) { + console->addFile(files[i]); + } + /// Run it all vrj::Kernel::instance()->start(); ret = console->threadLoop(); From 82d87e023ce7f5d7954993c7eb1c97e306c2dd47 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Thu, 17 Feb 2011 16:20:02 -0600 Subject: [PATCH 005/348] restore the Debug config --- cmake/ResetConfigurations.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/ResetConfigurations.cmake b/cmake/ResetConfigurations.cmake index abf625b1..8c13fdf6 100644 --- a/cmake/ResetConfigurations.cmake +++ b/cmake/ResetConfigurations.cmake @@ -1,4 +1,4 @@ -# - Re-set the available configurations to just RelWithDebInfo and Release +# - Re-set the available configurations to just RelWithDebInfo, Release, and Debug # # Requires these CMake modules: # no additional modules required @@ -21,7 +21,7 @@ endif() set(__reset_configurations YES) if(CMAKE_CONFIGURATION_TYPES) - set(CMAKE_CONFIGURATION_TYPES "RelWithDebInfo;Release") + set(CMAKE_CONFIGURATION_TYPES "RelWithDebInfo;Release;Debug") set(CMAKE_CONFIGURATION_TYPES "${CMAKE_CONFIGURATION_TYPES}" CACHE From 44670187211bdb32ea63f9df8fe99708e3340831 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Wed, 23 Feb 2011 17:47:24 -0600 Subject: [PATCH 006/348] output error in loading wrapper to cout, so it gets caught in debug log --- third-party/osgLua/src/osgLua/osgLua.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/third-party/osgLua/src/osgLua/osgLua.cpp b/third-party/osgLua/src/osgLua/osgLua.cpp index 2bff64d0..a379683f 100644 --- a/third-party/osgLua/src/osgLua/osgLua.cpp +++ b/third-party/osgLua/src/osgLua/osgLua.cpp @@ -93,7 +93,7 @@ bool osgLua::loadWrapper(lua_State *L, const char *name) { try { lib = loadWrapperLib(name); } catch (std::exception & e) { - std::cerr << "Failed to load wrapper for " << name << " : " << e.what() << std::endl; + std::cout << "Failed to load wrapper for " << name << " : " << e.what() << std::endl; return false; } From 08f70100dd5b2cd6dfe97b28c7ce8b23bb131a1f Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Wed, 23 Feb 2011 17:47:35 -0600 Subject: [PATCH 007/348] add a "wavy room" model --- examples/models/wavyroom.ive | Bin 0 -> 94113 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 examples/models/wavyroom.ive diff --git a/examples/models/wavyroom.ive b/examples/models/wavyroom.ive new file mode 100644 index 0000000000000000000000000000000000000000..db2d2cd887c13cdd8f747ad8171821a98ec61e72 GIT binary patch literal 94113 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 Date: Wed, 23 Feb 2011 17:48:35 -0600 Subject: [PATCH 008/348] move incomplete examples to another folder --- examples/navtestbed-based/{ => in-progress}/countdown-text.lua | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename examples/navtestbed-based/{ => in-progress}/countdown-text.lua (100%) diff --git a/examples/navtestbed-based/countdown-text.lua b/examples/navtestbed-based/in-progress/countdown-text.lua similarity index 100% rename from examples/navtestbed-based/countdown-text.lua rename to examples/navtestbed-based/in-progress/countdown-text.lua From 745b046c4151d62c4a7e1d6f2af0e01799877285 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Wed, 23 Feb 2011 17:48:53 -0600 Subject: [PATCH 009/348] add work in progress shadow example --- .../navtestbed-based/in-progress/shadow-1.lua | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 examples/navtestbed-based/in-progress/shadow-1.lua diff --git a/examples/navtestbed-based/in-progress/shadow-1.lua b/examples/navtestbed-based/in-progress/shadow-1.lua new file mode 100644 index 00000000..ab53396d --- /dev/null +++ b/examples/navtestbed-based/in-progress/shadow-1.lua @@ -0,0 +1,52 @@ + +require("StockModels") + +require("osgShadow") + +scene = osgShadow.ShadowedScene() + +ReceivesShadowTraversalMask = 0x1 +CastsShadowTraversalMask = 0x2 + +scene:setReceivesShadowTraversalMask(ReceivesShadowTraversalMask) +scene:setCastsShadowTraversalMask(CastsShadowTraversalMask) + +sm = osgShadow.ShadowMap() + +scene:setShadowTechnique(sm) + +mapres = 1024 +sm:setTextureSize(osg.Vec2s(mapres, mapres)) + + +newroom = Transform{ + scale = 0.02, + position = {0, -2, 0}, + Model("examples/models/wavyroom.ive") +} +newroom:setNodeMask(ReceivesShadowTraversalMask) + + + +teapot = Transform{ + position = {0, 1, 0}, + StockModels.Teapot() +} +teapot:setNodeMask(CastsShadowTraversalMask) + + +scene:addChild(newroom) +scene:addChild(teapot) + +RelativeTo.World:addChild(scene) +RelativeTo.Room:addChild( + Lighting{ + number = 0, + ambient = 0.9, + diffuse = 0.7, + specular = 0.5, + position = {0, 3, 2}, + positional = true + } +) + From bcc49cdac6e4564ad62115ba3bd1fc687e8aad1e Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Wed, 23 Feb 2011 17:55:44 -0600 Subject: [PATCH 010/348] fix search prog files for osg --- cmake/SearchProgramFilesForOpenSceneGraph.cmake | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/cmake/SearchProgramFilesForOpenSceneGraph.cmake b/cmake/SearchProgramFilesForOpenSceneGraph.cmake index d7cf2df0..aa7165ef 100644 --- a/cmake/SearchProgramFilesForOpenSceneGraph.cmake +++ b/cmake/SearchProgramFilesForOpenSceneGraph.cmake @@ -33,8 +33,10 @@ if(WIN32) elseif(MSVC90) list_filter_out(_osgpaths "[vV][cC]8" ${_osgpaths}) endif() - list(SORT _osgpaths) - list(REVERSE _osgpaths) + if(_osgpaths) + list(SORT _osgpaths) + list(REVERSE _osgpaths) + endif() endif() else() prefix_list_glob(_osgpaths "/OpenSceneGraph*" /usr /usr/local /opt) From 01a1c2870eddcbab1b3d27437db5fe0bee3d5cda Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Wed, 23 Feb 2011 18:16:07 -0600 Subject: [PATCH 011/348] update shadow example --- examples/models/wavyroom.ive | Bin 94113 -> 20852 bytes .../navtestbed-based/in-progress/shadow-1.lua | 9 +++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/examples/models/wavyroom.ive b/examples/models/wavyroom.ive index db2d2cd887c13cdd8f747ad8171821a98ec61e72..88944f661faeccec90b2d9bfe31affc2709a9c4b 100644 GIT binary patch literal 20852 zcmeHve{fvIo#)dVV{2v@%eU5o@9^DDe3m7T7|Yp{Y?D<$K(6j`*{$GP{}4GL9wx3R z4up}7lffW(nNVBCh`_1Fvg3@ztaGXxj}UfgYb38gqXF--$z}0z)>%@4@6D{YcCCnj ze9@7olZod(pYGSpNRf^6$8Ke>GUZmk?$`b8@9+Nh_r2#OF1=)(R`|JasiTyj{65OP zpKJQ+?$ExbeS05n`qth(`@i|wQU2(m$9M1j`a_S@ zI*@PT7!>&{@t|Ig@`c@@$6NmRvAvJ){^~tn|0b9Ef>#c_=+tU~6_~96=$h-6LQ8_w z%)6Y6PugnuCmsL51Gt_(A5Bx!mZ0!Q;%=IES9D+ZPf3ZOS@K+7b38#6=;yMl*j}~; zf78={a&Pjpe}9ke^_}^yf7uyc-}QGtxK~}XUyWh^V%Ik^w|LA#m})Jx?)sm7@804u zi_I+_qpk@@T`N2n&RsZWvGJVC{>A7m9$$Q|c=%~^6-))cn0AG8F&`FQ7sLN`<`(l| zAxs6Qc#OJMG^#NR=Ptyjc)X%fjUmj%u8Uz7ugm@tp{u3PRJsZJ0baw{#WnkQ&AJ@r zcb%GJc>S-On)7&F>C~LVYtCU^vP2jIuJAKQ$~3d*2Cq$wzYF6lIPnIqCD>o%uY_%m zaLNr{19$1&BpuhkUL2KT?|4Jk0zU~$;(Gn-`K#Uto(sl+-#5;a!fH2y+q^N{B}_SA z@ZnRgIr0;IxY6qy*0+BgV;~KMAGeEZ?biPWw|M_1jwwu0SL{;zGq1TfFS0Mc{nvkZ zrz+&0x@OHbrjqs7E(?|})>on;An-!{K4k#GvHXos*1YBxx&&nn8h#Y^G1}R_7CBgJ)&!?AD^O41Y^X#9w(6fA2s+XtsUd?!Eh(_J$t% z)+1m4M$;E|@B7B%kA>z%W5M0w5MrXH$9IPx-@kYF#tnNyUn7(Trx4l8-<72VE{|;z zL;{36g?ltn;wTA}Qz#{;@h6{eZQpbul*#8uW0>O3=PlbT)z;+m8=sBM=FEJ)KdQlF zvmc-~uzw=t^t;?Q<@0H~!PGErYkOsS!pP^h_enVUJlAHwkugzsL|yKRO@sr)bjFnO ze%rJm#&tw1yE(t{E!-~QxZEMFitBHhFie4;?yX?|ns@^9(H{$8yu$m~Sc8CbE?Qxc z9^&l^a=aPwyV#C}38&BxIp5Cvnic@O@nO)R5np#@cSzEq34Uabm&Q4-Q{bWaaa&fd z*Ws+!5rz5-KK*-ene+~b@#lbtyOQg~69+~ASU7{awH?DZ6Rz$J4hTF;4=vB zI!0p^-C?6ZpJnfhBuWeN!g{((;1`M?^mDyUu?gV)#976^gibk*#-bDCM`66K>%D9@ z8I;RttWne*QQf`SqCBBFfZI0R5SMbR+(fuTV?YaXLBA>cmq7se{3^(c{R626Qv-5~=+@nXq?cPb>xije@zlcef96q1>e2pIW0u*q#6) zLQh;l$j7oLwNmi$`)3<8;sLpIHe$VP&U#lY+20?P{rwI+rB5Bv;E`}ft|R3o>E7D@ zdZU5<*7m^*Il!fSg5&vo{Us~|e)dO;aOzhcRL=($NeTHAe<-Jnm&W%Z>39^ste zv*v~Vr|o;Npjb!PGwelo3p+Zf>EH+KLpyXjpPz|IzV(C80~3@p*82|Wl>M#k!EVw$ zK>h>2{e6nhzDnxBd%#cHZALpN^t3Zfx`dt!d74$nzsGf=jX6{F>p|$jXbk9x`&E9; zQ^2FO9qNenl)RrfE9vf!1_y~pt;2tXH}#_v{1AF4?Bcla6Od;p13VxXC>H7USJD5p zwgWx%tNY-;ut(^npZ)hc>rtOKf&YRZpt~S%&<#GNZQW10SG{F`VT2d#Y|IJz9Dkrk z{LriZs3q*afQMe{IYoR9BGBb{xM4A0bMy|5Ti~huC)`N4g9qsAhrO6$9{4ww&v#9m zLT@a4m%yX7UHTua2M5D-pvKjl7yAT{U?=f~8xi{Orfv#n2lb;A{ z4FU^#*AbQdqcPckTNcZMAC|pQtAZYk#$YZcYo&LG{OsTOY&b{!m0vB~FRcnd4?2Kn zPSB_6^pn8De<(1|AC#?&vEQ$)`OLh2U$ML_JA=KC>vUtmVmzuezn}9X2jfNe$uGB9 zZzCKK_k#;ibk2vmLf&1p3($8iifs`6=diCyf3>EnN{mx{^7=Lj{4`Sse!&0uA<2($ zF+aq5g8#>~2<9ul+}aMY2|P425@&yr9^68BnS&lb@ss;;2k{pBPh8Loxqxuaa|wAh zIerEEP{hB6@|67D-&a=uPJ^)L4D}86R#LW_d|JEeaweaz>wBqz{fGM?hkEk4{w3mn zYg+PQf1inkIj&^gQ2__*LSM!JXIU-%vakL!`Ug_zci=AtobsM^M-7epZ0$Q4)cX-P z&_CApxR75%z< z?JAC2dX#vVV_ov2yhrk3e_sh0%6TiqKC-e4_&_fE`+T+BhsAyd{_O8V%1+>|V*&QB zT}3!6yC62f2c&NKIvLofOG%ZpDbB%FXM)ve`#$8{oaz7e!L`~KQ^{>?SK3+`Y5%5+#^kP1LVC?zZPrZ@0Z_7UXvmbmp3%~lgCq5iX+gGet{`2&!?El|?|GBr@ zrkgJP?8U2hEUck>;!IM3NEiRa4{_yZoXbTkCmLTocecctLSSoAztft~ow>z4TnJOaDITM)6^&}l!nq6aDITwARAUHpvFl=( z#p|-aMCdA2mwL++pE3rX#BWCNp)jw`n(Z=_TTpIAVUCzJ+y5Np_fY&OpK)ro*Pv9P ztVanrHQUuF8&N)s!Y2%@*+#rT;EA?g~TkDTBM9LKMHpP>*U{&Y?EN5jpj8it)g zua59jrTr{Bl*=U;-t!okw#$3m!SQC1zS4P|NZZxP=MV50V&=llmW|_cD(KB3?0gPV z$>LZuZiNlb*F0`rl%1eAA_tgem4(PcuD&#bOCS3 z$4Nf~JjCZ$;eb7H^5I9BgL^3Frf|49jXD(!){$Wrxt;|+N1Cap-i=fD?u4p#Vh%=ZaBzyB;wslc}*x_OX#RNzDM_6@KHMK}1J z%f)FQF!fLtX%Cns(s%vQkNUgyAGY-1GQ6C1!nt&JPIrj8?G9mmOhKY4x<{8eL zs;PmUZ|i|wgll_R+ox)44`qSBSC{%%Q#0QW!TjWWjd1q&h2xYL^cM1>oVCdNZE4td zI7|MG4+mWm&uWiH@SVFrfqumYRYN~tnS}l^t!)arjnIMYv9Yb~sk&kGBMsu%Yce_a zAn`9fJv79c+cWD^IEa&fHHh;=+nHx}@n{mRo%r!g-V4>i3zw(;5V@q8o;z4dx!n)GD4 z_rG%<+*#2)HGg4k*+b^kGn60vxkZ1W>^qbpUK^kF)ulg{eoM;7;|TyS1qXbHCt%-} zoe=4Ik?s-n%(ti2mozhO(2hcl7VHv!KaW}{V8_nmBfLB16?`yF z;YT#sBmMU;fGE>9Ul;pDM|7~6X>Iz4>S2-g7W*{ir1=Z@D!gS)f1~_PdW7&En09-0 zK@aw#Uit(2Z|YYtwX;#$nS5;L8A{_m(&GoIX9_O-S(^M9NO7L<-_TRqckaN0Df-b0 zp9}huwu4>|>`Lrorr=-l)e+ixi&zhQNR7ik(4TR?09|oO_rPWcPY}j=aFeLtvsz5X z57>`|UtaMno-TsVNCzj9unX|P@ypQj9NVSI-e;(1SjPRaAVREufkK+mc2Lr%0cph`!3}WJZv>m56zH;b^D_>JTBMEClh_F?|S(d z9-mWB$iD&{P4LsQua5BXfn`5ArS?xvYnz6i9;P2g9Hn{t2!HmeUqJ6xb}9S*L6Y&H zWq&+Jxn04&N%;NI@h0wve2kE?rT^8RBi*z|;(HYvF7HJNvhud|%r254qnd{K;q2;GhNm!0(I4&I&$DAYk?A3MmOxRX>1VfC(bIqG6BMMa9k8{S_GbIKjJxoeCW0V zul9aGyO(y}+72*~Thk?GGdMqPW^&{s<5AKvIL3YbToh~&^YOUx1jiw~2@u|%L{(hq z!-1Uk0OalcU}tk0cpupu^pQ_}>#JY*Rk{`Zss?`rzVLG(fbgGxKZhFf$k9IFe^Zu- zuS1R5!;DwmF6pnm-kOmDe8fQs=_ezmiTPdA#^fRJ@mzGQX%_p@OiX|7gPoLblU-NC zcvbNa$6+C-9M&V=CkGjyw@tSsS!4eb`raS))C@!4yKTQ2`BUO~ymt=ks{FAE_4s#bpv}?<|lAYvOf-q^__TKGa0`X@P?h3B3~rV6*!+X zjbZ)meJ{YT)8AW=C+X2)V3eos`QdXCkJ2JO;PnB&U*PF6iSL%T_?Vskx&nql`wTTR z&M54+KRhn!N**#X{x!M^L0 zeq?UC_kEsI4CpEMtD4Q}i9(!8KO_BA#x!@4zFdg=1L6;CXr%AJ`$<91f11vxg*?MN zx5F;5q4BB+hO`w`)jpK1D0fmhe`cdC=H*RJUU zQ| zp*s#G$&dS$ki-s*d^#y zc&l2)A2^rHI|m}p1VACr;N~>ke7f%C z{YeOdwLJG0;KbuRcOu^k`L<2toO*W&!tr#gAVG!@hRd1yphjsZO;w|0q@;0 zxeqINX}fXKh|~U?8tJF;8lX2Q_T7Y@Ji+}1^FwLc<5%c^&qY%;_mgwe z4@kV?GC%T_EY4%2vGbp2zV`l4;>xxpA^lP z_d6dB7KMEZ{?f_&5B=BIu^8@hRB1Ti<$>^rf5INb6}o2|6$)VxL z?Unn&ObqEe_(#NHJ@WZUwz&~@IgnC$PRQ>%^ecYA&gYUsFF$y`7w2=akDIHJ*BH6l z*v$M!^I#Boz%Jn+$^XH88hBWC@0w&O>z^Nw2)yO~e@yH*#Op|N3-k*45O2_VzSn5c z9#a)Q;FY%J`Ap%VYWcc1e>6T&}YKSUrvIPN6v0SfwK7^pr$ zy5Zgy;VZ_oGezhe>{wRF4HPzss@IQXm@!3XD zM;w|8dZ<^-8c^1L9aM zaA#rNv|Z&-0KfW6hUtlrZ!%us`J@K%g2IpIKLg_!2j$?0kYBty5~N>Jeq(MfUq$%6 zy(9347%%duLt{pq@g$xbcF%tvryf4*dAJ0Q`rhHBgU? z3pJ2Wf7Ey9QA51mjCUL)T+j-!UB7Cmh5q%x!4(eIxX@xt`BAyX`+sdQ8HNg)$N^mk;xShp-!b z-T}eXUmA_QJ@!A}Ccoeh-Mk+^6+g)JqcSQHTT-inagqX$s2|w?P*YHt~#$3M2dO?5203CQf`9uW$w0DP(y0@fY zr`Z2YEyMelkJiJ#%*22;#)DqxvmhK34v~Mx#A@9CKmX-nfiL7D_yPan#MM;-pHc9` znBe-GeA1qh0)NMuv;ii|Ld{g=%KL1koi@eBbK5wn?Aybu`UsIWNyY{h4@IkahiUhEUF z3oX}3yAP$Ahr@eZW%a-Ve)@HO{)ct7$fF!zyW97K0Wb^l_M^dhqeGv}|hzHn-n)H!R%nx#1ock`ULtBl;Xcpb4gHkQa`*C$Y#(jNTqc~2%iVy3_p1c`_n%z~f;b;v zCz;Z(-2*!J_f=HWc*E)VKB+hAf6aL!t8NkDP zCfLxq?ve5@1Fu`tMuz(Y;sw`VO>q2|OI#R-bD6M*{e5@F{u=Qk;V|AP?|JH-SI{P$ z63pvN)t_o;;ChWWQ$Ors-Cb)C-rG%0FH)W`Bg`8}eJ}jZBjh8)N;X}wrP-o@mn}f=%Z)$rJr#;)EV>Yz{gY2i^F}!oh86?e0bTG`v6Dm<98Fz z8=bdYB%a<^La%c@H~zaB;^)2nKF~Lidg?ja1?;QDS1ai)!o zo$#mMKYPciGk-xo)z`oA->65SSr6dh^Po%#@Y>(E;;c8o{#f^4-a&hK<-QKs0mhxG zfPHnQjQ+sQ#3Og+EY>+Tw&`zN_)KZlTNjN#0Q`Z}n#^&uhsHYZp&cC?yYIkFThjJ> z)+;Akeuw>EuKDoK+5d-kw7bm%2pyH3i7Je9Xy$^sE`(TLhRsZ$o%J=e@K*g!*OHuevH*2l#hpg(~L)Q2Z1zx|37^^gxE*?7@Lwh*8I_770ZB*i*0@=gfRVAJ|HSX i-_0mKl;uv%HXU5C!{diUY~PAfj`F)Gw>UN1{QW-=H7YXz literal 94113 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 Date: Fri, 25 Feb 2011 13:25:39 -0600 Subject: [PATCH 012/348] add a missing constructor in the sonix bindings --- vrjugglua/binding_detail/BindSonixToLua.inl | 1 + 1 file changed, 1 insertion(+) diff --git a/vrjugglua/binding_detail/BindSonixToLua.inl b/vrjugglua/binding_detail/BindSonixToLua.inl index 9c6bf26a..f2439696 100644 --- a/vrjugglua/binding_detail/BindSonixToLua.inl +++ b/vrjugglua/binding_detail/BindSonixToLua.inl @@ -43,6 +43,7 @@ void bindSonixToLua(LuaStatePtr state) { def("changeAPI", &Sonix::changeAPI), class_("SoundInfo") + .def(constructor<>()) .def_readwrite("alias", &snx::SoundInfo::alias) .def_readwrite("filename", &snx::SoundInfo::filename) .def_readwrite("ambient", &snx::SoundInfo::ambient) From f01f81cffd4a95609fdef6d5c280b20f7bcad664 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Tue, 1 Mar 2011 13:41:09 -0600 Subject: [PATCH 013/348] create a flag file for indicating the source directory when running from build tree --- CMakeLists.txt | 4 ++++ vrjugglua/LuaPath.cpp | 17 +++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6076029e..5b8e00d5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -208,6 +208,10 @@ if(BUILD_FLTK_GUI) include_directories(${FNFC_INCLUDE_DIRS} ${FLTK_INCLUDE_DIR}) endif() +# Add a flag for indicating the source tree location +file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/${LUA_DIR}") +file(WRITE "${CMAKE_BINARY_DIR}/${LUA_DIR}/vrjlua-sourcetreeloc.lua" "${CMAKE_SOURCE_DIR}") + # Build the vrjugglua library add_subdirectory(vrjugglua) diff --git a/vrjugglua/LuaPath.cpp b/vrjugglua/LuaPath.cpp index 25a1c622..2dea304e 100644 --- a/vrjugglua/LuaPath.cpp +++ b/vrjugglua/LuaPath.cpp @@ -20,6 +20,7 @@ // Library includes #include +#include #include @@ -148,6 +149,22 @@ void LuaPath::_init(std::string const& arg0, std::string const& vrjlua_base) { _root = _findFilePath(startingPlaces, "vrjlua-init.lua"); _luaDir = _root; } + std::string sourceTreeIndicator = (fs::path(_luaDir)/"vrjlua-sourcetreeloc.lua").string(); + if (fs::exists(sourceTreeIndicator)) { + std::ifstream df(sourceTreeIndicator.c_str()); + if (df.is_open()) { + std::string line; + std::getline(df, line); + boost::algorithm::trim(line); + if (!line.empty()) { + VRJLUA_MSG_START(dbgVRJLUA, MSG_STATUS) + << "LuaPath: Presence of file " << sourceTreeIndicator + << " indicated we are running from a build tree, adding extra path hint " << line + << VRJLUA_MSG_END(dbgVRJLUA, MSG_STATUS); + startingPlaces.push_back(line); + } + } + } _shareDir = _findFilePath(startingPlaces, "assets/fonts/droid-fonts/DroidSans.ttf"); #if __VJ_version >= 2003000 fs::path jugglerTest = "share/vrjuggler-3.0/data/definitions/simulated_positional_device.jdef"; From 4bed8f16ed95103b85db7187f96d7f655c140cd5 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Tue, 1 Mar 2011 14:41:45 -0600 Subject: [PATCH 014/348] improve error handling in luaconsole --- vrjugglua/LuaConsole.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/vrjugglua/LuaConsole.cpp b/vrjugglua/LuaConsole.cpp index a9dd51f5..74b5857e 100644 --- a/vrjugglua/LuaConsole.cpp +++ b/vrjugglua/LuaConsole.cpp @@ -84,13 +84,14 @@ bool LuaConsole::getRunBufFromLuaGlobal() { } luabind::object runbufLua(luabind::globals(state.get())["runbuf"]); - if (!runbufLua) { + if (!runbufLua || luabind::type(runbufLua) == LUA_TNIL) { throw std::runtime_error("Could not get a lua global named runbuf!"); } - _runbuf = luabind::object_cast >(runbufLua); - if (!_runbuf) { - throw std::runtime_error("Could not get a valid run buffer pointer from lua!"); + try { + _runbuf = luabind::object_cast >(runbufLua); + } catch (luabind::cast_failed &) { + throw std::runtime_error("Could not get a valid run buffer pointer from lua - cast failed!"); } return true; } From f2fe443cdc53087295e0056a9f206202e0c34e12 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Tue, 1 Mar 2011 16:35:06 -0600 Subject: [PATCH 015/348] Cache results of searching for a type by name: effectively eliminates the osgLua object creation overhead per Very Sleepy profiler. (osgIntrospection::Reflaction::getType() was most-demanding user function in time before, now it's barely even present along with other osglua methods.) --- third-party/osgLua/src/osgLua/Type.cpp | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/third-party/osgLua/src/osgLua/Type.cpp b/third-party/osgLua/src/osgLua/Type.cpp index bcdc4304..bc858f48 100644 --- a/third-party/osgLua/src/osgLua/Type.cpp +++ b/third-party/osgLua/src/osgLua/Type.cpp @@ -38,6 +38,19 @@ namespace osgLua { int call(lua_State *L); } + const osgIntrospection::Type & lookupType(std::string const& name) { + typedef std::map TypeNameMap; + static TypeNameMap usedTypes; + TypeNameMap::iterator it = usedTypes.find(name); + if (it != usedTypes.end()) { + return *(it->second); + } + const osgIntrospection::Type &type = + osgIntrospection::Reflection::getType(name); + usedTypes.insert(std::make_pair(name, &type)); + return type; + } + int staticMethodCall(lua_State *L) { int top = lua_gettop(L); const char *tname = lua_tostring(L, lua_upvalueindex(1)); @@ -112,8 +125,8 @@ namespace osgLua { // traverse the namespace try { - const osgIntrospection::Type &type = - osgIntrospection::Reflection::getType(base); + const osgIntrospection::Type &type = lookupType(base); + //osgIntrospection::Reflection::getType(base); // is it an enum ? /// @todo Make methods that require an enum accept a long @@ -153,8 +166,8 @@ namespace osgLua { int top = lua_gettop(L); std::string name(lua_tostring(L, lua_upvalueindex(1))); try { - const osgIntrospection::Type &type = - osgIntrospection::Reflection::getType(name); + const osgIntrospection::Type &type = lookupType(name); + //osgIntrospection::Reflection::getType(name); osgIntrospection::ValueList vl; for (int i = 2; i <= top; ++i) { From 5ca2d436acd29702fc1973131b3f6b76bdab2770 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Wed, 2 Mar 2011 16:10:14 -0600 Subject: [PATCH 016/348] add link to the shadow example --- examples/navtestbed-based/in-progress/shadow-1.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/examples/navtestbed-based/in-progress/shadow-1.lua b/examples/navtestbed-based/in-progress/shadow-1.lua index 50e66dc9..51ec5466 100644 --- a/examples/navtestbed-based/in-progress/shadow-1.lua +++ b/examples/navtestbed-based/in-progress/shadow-1.lua @@ -1,4 +1,6 @@ +-- Based on http://www.openscenegraph.org/projects/osg/wiki/Support/ProgrammingGuide/osgShadow + require("StockModels") require("osgShadow") From 0d77e79901a2586d53b7a2176db6320cd73da0a9 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Mon, 7 Mar 2011 11:09:31 -0600 Subject: [PATCH 017/348] add a chdir to luapath --- vrjugglua/LuaPath.cpp | 3 +++ vrjugglua/LuaPath.h | 1 + 2 files changed, 4 insertions(+) diff --git a/vrjugglua/LuaPath.cpp b/vrjugglua/LuaPath.cpp index 2dea304e..f176d3c0 100644 --- a/vrjugglua/LuaPath.cpp +++ b/vrjugglua/LuaPath.cpp @@ -240,6 +240,9 @@ std::string LuaPath::getPathToLuaScript(const std::string & scriptfn) const { return (fs::path(_luaDir) / scriptfn).string(); } +void LuaPath::chdir(std::string const& path) { + fs::current_path(path); +} void LuaPath::addLuaRequirePath(LuaStatePtr state, std::string const& dirEndingInSlash) { _searchPaths.push_front(dirEndingInSlash + "?.lua"); diff --git a/vrjugglua/LuaPath.h b/vrjugglua/LuaPath.h index ee290a5c..22577f67 100644 --- a/vrjugglua/LuaPath.h +++ b/vrjugglua/LuaPath.h @@ -41,6 +41,7 @@ class LuaPath { std::string const& getExeDir() const; std::string const& getInitialPath() const; std::string getPathToLuaScript(const std::string & scriptfn) const; + void chdir(std::string const& path); void addLuaRequirePath(LuaStatePtr state, std::string const& dirEndingInSlash); void updateLuaRequirePath(LuaStatePtr state); From 492e19b1c260fd85169ecca6b22a5cf2dd10eef2 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Mon, 7 Mar 2011 11:09:46 -0600 Subject: [PATCH 018/348] improve adding to search path from Lua --- vrjugglua/binding_detail/BindvrjLuaToLua.inl | 21 +++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/vrjugglua/binding_detail/BindvrjLuaToLua.inl b/vrjugglua/binding_detail/BindvrjLuaToLua.inl index 80642f87..6ca7cc93 100644 --- a/vrjugglua/binding_detail/BindvrjLuaToLua.inl +++ b/vrjugglua/binding_detail/BindvrjLuaToLua.inl @@ -21,6 +21,8 @@ #include #include +#include +#include // Standard includes #ifdef VERBOSE @@ -31,10 +33,27 @@ namespace vrjLua { using namespace luabind; static void appendToModelSearchPath(std::string const& path) { - osgDB::Registry::instance()->getDataFilePathList().push_back(path); + std::string p = path; + if (osgDB::fileExists(path)) { + p = osgDB::convertFileNameToUnixStyle(osgDB::getRealPath(path)); + if (osgDB::fileType(p) == osgDB::REGULAR_FILE) { + p = osgDB::getFilePath(p); + } + } + osgDB::Registry::instance()->getDataFilePathList().push_back(p); } static void appendToLuaRequirePath(LuaStateRawPtr s, std::string const& path) { + std::string p = path; + if (osgDB::fileExists(path)) { + p = osgDB::convertFileNameToUnixStyle(osgDB::getRealPath(path)); + if (osgDB::fileType(p) == osgDB::REGULAR_FILE) { + p = osgDB::getFilePath(p); + } + } + if (p[p.size() - 1] != '/') { + p.push_back('/'); + } LuaPath::instance().addLuaRequirePath(borrowStatePtr(s), path); } From c5329d63c0a1748237c388ed007d3a3337adc391 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Mon, 7 Mar 2011 11:09:56 -0600 Subject: [PATCH 019/348] allow lua to look in search path --- vrjugglua/binding_detail/BindvrjLuaToLua.inl | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/vrjugglua/binding_detail/BindvrjLuaToLua.inl b/vrjugglua/binding_detail/BindvrjLuaToLua.inl index 6ca7cc93..9b121c1c 100644 --- a/vrjugglua/binding_detail/BindvrjLuaToLua.inl +++ b/vrjugglua/binding_detail/BindvrjLuaToLua.inl @@ -66,6 +66,10 @@ static luabind::object getModelSearchPath(lua_State *L) { return searchPath; } +static std::string findInModelSearchPath(std::string const& fn) { + return osgDB::findDataFile(fn); +} + void BindvrjLuaToLua(LuaStatePtr state) { #ifdef VERBOSE std::cerr << "Registering vrjLua module functions with Lua..." << std::flush << std::endl; @@ -73,6 +77,7 @@ void BindvrjLuaToLua(LuaStatePtr state) { module(state.get(), "vrjLua") [ def("appendToModelSearchPath", &appendToModelSearchPath), def("getModelSearchPath", &getModelSearchPath), + def("findInModelSearchPath", &findInModelSearchPath), def("appendToLuaRequirePath", &appendToLuaRequirePath), def("safePrint", &LuaScript::doPrint) ]; From 2d85c8cda8556c55fa484b4d4af1117b68afe545 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Mon, 7 Mar 2011 11:10:14 -0600 Subject: [PATCH 020/348] let depth be an optional param to getscriptfilename --- vrjugglua/lua/getScriptFilename.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vrjugglua/lua/getScriptFilename.lua b/vrjugglua/lua/getScriptFilename.lua index 6eb49ed2..ee4bd6e5 100644 --- a/vrjugglua/lua/getScriptFilename.lua +++ b/vrjugglua/lua/getScriptFilename.lua @@ -1,6 +1,6 @@ -function getScriptFilename() - local info = debug.getinfo(2, 'S') +function getScriptFilename(depth) + local info = debug.getinfo(depth or 2, 'S') -- split up the string local prefix = string.sub(info.source, 1, 1) if prefix == "@" then From f578a997df11b7adac4558b32db340d24e8ee58d Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Mon, 7 Mar 2011 11:10:35 -0600 Subject: [PATCH 021/348] spacing --- vrjugglua/LuaPath.h | 1 + 1 file changed, 1 insertion(+) diff --git a/vrjugglua/LuaPath.h b/vrjugglua/LuaPath.h index 22577f67..44ed467b 100644 --- a/vrjugglua/LuaPath.h +++ b/vrjugglua/LuaPath.h @@ -41,6 +41,7 @@ class LuaPath { std::string const& getExeDir() const; std::string const& getInitialPath() const; std::string getPathToLuaScript(const std::string & scriptfn) const; + void chdir(std::string const& path); void addLuaRequirePath(LuaStatePtr state, std::string const& dirEndingInSlash); From e43c06135522b7d079b0f6b138f46141c13aa002 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Thu, 10 Mar 2011 17:17:30 -0600 Subject: [PATCH 022/348] let osgLua read unsigned integers when possible. --- third-party/osgLua/src/osgLua/Value.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/third-party/osgLua/src/osgLua/Value.cpp b/third-party/osgLua/src/osgLua/Value.cpp index b4fe30e8..01234923 100644 --- a/third-party/osgLua/src/osgLua/Value.cpp +++ b/third-party/osgLua/src/osgLua/Value.cpp @@ -80,8 +80,12 @@ namespace osgLua { if (lua_isnumber(L, index)) { lua_Integer vi = lua_tointeger(L, index); lua_Number vf = lua_tonumber(L, index); - + unsigned int vu = static_cast(vi); if (((lua_Number)vi) == vf) { + // OK, at least an integer + if (static_cast(vu) == vi) { + return osgIntrospection::Value(vu); + } return osgIntrospection::Value(vi); } return osgIntrospection::Value(vf); From a479dcbf4ee71d2b8f26619792bf4d84b916df5b Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Thu, 10 Mar 2011 17:17:38 -0600 Subject: [PATCH 023/348] some work on improving lighting - still doesn't work --- vrjugglua/lua/Scene.lua | 65 ++++++++++++++++++++--------------------- 1 file changed, 31 insertions(+), 34 deletions(-) diff --git a/vrjugglua/lua/Scene.lua b/vrjugglua/lua/Scene.lua index 327b9392..418e2f8b 100644 --- a/vrjugglua/lua/Scene.lua +++ b/vrjugglua/lua/Scene.lua @@ -63,8 +63,12 @@ end function Light(...) local arg = {...} - local num = arg.number or 0 --- todo improve this - local light = osg.Light(num) + local num = arg.number + if num == nil then + num = 0 --- todo improve this + end + local light = osg.Light() + light:setLightNum(num) if arg.ambient then if type(arg.ambient) == "number" then @@ -94,42 +98,35 @@ function Light(...) end -- Always set position - do - local pos = {0, -1, 0, 1} - local posOSG - local setLightType - if arg.directional then - pos[4] = 0 - setLightType = "directional" - elseif arg.positional then - pos[4] = 1 - setLightType = "positional" - end - if arg.position then - if type(arg.position) == "table" then - for i=1,3 do - pos[i] = arg.position[i] - end - if #arg.position == 4 then - if setLightType then - print("Warning: fourth value passed to 'position' overrides setting of light type as " .. setLightType) - end - pos[4] = arg.position[4] + local setLightType + local fourthPosition = 1 + if arg.directional then + fourthPosition = 0 + setLightType = "directional" + elseif arg.positional then + fourthPosition = 1 + setLightType = "positional" + end + if arg.position == nil then + light:setPosition(osg.Vec4(0, 1, -1, fourthPosition)) + else + if type(arg.position) == "table" then + if #(arg.position) == 4 then + if setLightType then + print("Warning: fourth value passed to 'position' overrides setting of light type as " .. setLightType) end - - else - --- Assume it's a vec4 - perhaps a bad assumption - print("WARNING: Assuming your position value is an osg.Vec4") - posOSG = arg.position + arg.position[4] = fourthPosition end + local osgvec = osg.Vec4(arg.position[1], arg.position[2], arg.position[3], arg.position[4]) + print("Setting light position to " .. tostring(osgvec)) + light:setPosition() + + else + --- Assume it's a vec4 - perhaps a bad assumption + print("WARNING: Assuming your position value is an osg.Vec4") + light:setPosition(arg.position) end - - if not posOSG then - posOSG = osg.Vec4(pos[1], pos[2], pos[3], pos[4]) - end - - light:setPosition(posOSG) end if arg.direction then From 8c066e2b17590d61aad2c22129c0095f5c02230c Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Tue, 15 Mar 2011 10:57:56 -0500 Subject: [PATCH 024/348] actually capture std::cerr! --- vrjugglua/LuaConsole.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vrjugglua/LuaConsole.cpp b/vrjugglua/LuaConsole.cpp index 74b5857e..bd5cda97 100644 --- a/vrjugglua/LuaConsole.cpp +++ b/vrjugglua/LuaConsole.cpp @@ -159,7 +159,7 @@ void LuaConsole::captureStdOut() { void LuaConsole::captureStdErr() { if (this->supportsAlternateLogging()) { _loggingActive = true; - std::cout.rdbuf(_log.rdbuf()); + std::cerr.rdbuf(_log.rdbuf()); } } From 2774ef758bd0c2761cc5d5fc2c17799efa501eba Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Tue, 15 Mar 2011 10:58:47 -0500 Subject: [PATCH 025/348] always output to console in doPrint, even if we have an alternate print function --- vrjugglua/LuaScript.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/vrjugglua/LuaScript.cpp b/vrjugglua/LuaScript.cpp index 9a0378c3..dc3cca90 100644 --- a/vrjugglua/LuaScript.cpp +++ b/vrjugglua/LuaScript.cpp @@ -289,12 +289,11 @@ void LuaScript::initVrjKernelAsClusterSecondary(int port) { } void LuaScript::doPrint(std::string const& str) { + VRJLUA_MSG_START(dbgVRJLUA_APP, MSG_STATUS) + << str + << VRJLUA_MSG_END(dbgVRJLUA_APP, MSG_STATUS); if (_printFunc) { _printFunc(str); - } else { - VRJLUA_MSG_START(dbgVRJLUA_APP, MSG_STATUS) - << str - << VRJLUA_MSG_END(dbgVRJLUA_APP, MSG_STATUS); } } From 01f938d34c0037e10316645165b00179a4a4cb37 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Tue, 15 Mar 2011 11:55:33 -0500 Subject: [PATCH 026/348] don't be so noisy on startup --- vrjugglua/LuaPath.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/vrjugglua/LuaPath.cpp b/vrjugglua/LuaPath.cpp index f176d3c0..bdf83abc 100644 --- a/vrjugglua/LuaPath.cpp +++ b/vrjugglua/LuaPath.cpp @@ -57,10 +57,10 @@ std::string LuaPath::_findFilePath(std::vector const& startingPlace try { location = _findFilePath(startingPlaces[i], qualified); } catch (std::runtime_error & e) { - VRJLUA_MSG_START(dbgVRJLUA, MSG_WARNING) + VRJLUA_MSG_START(dbgVRJLUA, MSG_DRIVEL) << "LuaPath: " << e.what() << ", was trying with starting path " << startingPlaces[i] - << VRJLUA_MSG_END(dbgVRJLUA, MSG_WARNING); + << VRJLUA_MSG_END(dbgVRJLUA, MSG_DRIVEL); location.clear(); } } @@ -71,9 +71,9 @@ std::string LuaPath::_findFilePath(std::string const& startingAt, const std::str // find the config file - recursively searching up. fs::path location = startingAt; fs::path filepath = fs::path(location / fn); - VRJLUA_MSG_START(dbgVRJLUA, MSG_STATUS) + VRJLUA_MSG_START(dbgVRJLUA, MSG_DRIVEL) << "LuaPath: Searching for file '" << fn << "' starting in " << location.string() - << VRJLUA_MSG_END(dbgVRJLUA, MSG_STATUS); + << VRJLUA_MSG_END(dbgVRJLUA, MSG_DRIVEL); for (unsigned int i = 0; #ifdef BOOST_FILESYSTEM_NO_DEPRECATED From a036fa8c670d70d0f2a9092a50c39997c65574e4 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Tue, 15 Mar 2011 14:32:36 -0500 Subject: [PATCH 027/348] Revert "let osgLua read unsigned integers when possible." This reverts commit b06c0afe15868e529f8f428ac22c5ef049111792. Caused the first example to not appear. Needs additional investigation. --- third-party/osgLua/src/osgLua/Value.cpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/third-party/osgLua/src/osgLua/Value.cpp b/third-party/osgLua/src/osgLua/Value.cpp index 01234923..b4fe30e8 100644 --- a/third-party/osgLua/src/osgLua/Value.cpp +++ b/third-party/osgLua/src/osgLua/Value.cpp @@ -80,12 +80,8 @@ namespace osgLua { if (lua_isnumber(L, index)) { lua_Integer vi = lua_tointeger(L, index); lua_Number vf = lua_tonumber(L, index); - unsigned int vu = static_cast(vi); + if (((lua_Number)vi) == vf) { - // OK, at least an integer - if (static_cast(vu) == vi) { - return osgIntrospection::Value(vu); - } return osgIntrospection::Value(vi); } return osgIntrospection::Value(vf); From 2e07b2927f856e56a40a665dd8d725469715cc65 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Sat, 19 Mar 2011 14:56:39 +0800 Subject: [PATCH 028/348] Update to Lua 5.1.4 patch level 3. --- third-party/CMakeLists.txt | 2 +- third-party/lua-5.1.4/src/lcode.c | 16 +--------------- 2 files changed, 2 insertions(+), 16 deletions(-) diff --git a/third-party/CMakeLists.txt b/third-party/CMakeLists.txt index 998b0188..fbb5fb8e 100644 --- a/third-party/CMakeLists.txt +++ b/third-party/CMakeLists.txt @@ -3,7 +3,7 @@ # Iowa State University HCI Graduate Program/VRAC if(BUILD_EMBEDDED_LUA) - # Lua 5.1.4-2 (that is, patch level 2) + # Lua 5.1.4-3 (that is, patch level 3) add_subdirectory(lua-5.1.4/src) set(LUA_INCLUDE_DIRS "${CMAKE_CURRENT_SOURCE_DIR}/lua-5.1.4/src") set(LUA_INCLUDE_DIRS ${LUA_INCLUDE_DIRS} PARENT_SCOPE) diff --git a/third-party/lua-5.1.4/src/lcode.c b/third-party/lua-5.1.4/src/lcode.c index e9aa88dc..679cb9cf 100644 --- a/third-party/lua-5.1.4/src/lcode.c +++ b/third-party/lua-5.1.4/src/lcode.c @@ -1,5 +1,5 @@ /* -** $Id: lcode.c,v 2.25.1.4 2009/06/15 14:12:25 roberto Exp $ +** $Id: lcode.c,v 2.25.1.5 2011/01/31 14:53:16 roberto Exp $ ** Code generator for Lua ** See Copyright Notice in lua.h */ @@ -549,13 +549,6 @@ void luaK_goiftrue (FuncState *fs, expdesc *e) { pc = e->u.s.info; break; } - case VFALSE: { - if (!hasjumps(e)) { - pc = luaK_jump(fs); /* always jump */ - break; - } - /* else go through */ - } default: { pc = jumponcond(fs, e, 0); break; @@ -579,13 +572,6 @@ static void luaK_goiffalse (FuncState *fs, expdesc *e) { pc = e->u.s.info; break; } - case VTRUE: { - if (!hasjumps(e)) { - pc = luaK_jump(fs); /* always jump */ - break; - } - /* else go through */ - } default: { pc = jumponcond(fs, e, 1); break; From bf6f53cbf8c56f5697faed857c35af1d7ccd0cb3 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Mon, 21 Mar 2011 10:09:46 +0800 Subject: [PATCH 029/348] fix lua targets with cmake 2.8.4 --- cmake/LuaTargets.cmake | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/cmake/LuaTargets.cmake b/cmake/LuaTargets.cmake index 4e8a1c2f..f8d4f156 100644 --- a/cmake/LuaTargets.cmake +++ b/cmake/LuaTargets.cmake @@ -54,13 +54,18 @@ function(add_lua_target _target _dest) set(ALLFILES) foreach(fn ${ARGN}) + # Produce an absolute path to the input file if(IS_ABSOLUTE "${fn}") - set(fullpath "${fn}") + get_filename_component(fullpath "${fn}" ABSOLUTE) get_filename_component(fn "${fn}" NAME) else() get_filename_component(fullpath "${CMAKE_CURRENT_SOURCE_DIR}/${fn}" ABSOLUTE) endif() - add_custom_command(OUTPUT "${_dest}/${fn}" + + # Clean up output file name + get_filename_component(absout "${_dest}/${fn}" ABSOLUTE) + + add_custom_command(OUTPUT "${absout}" COMMAND ${CMAKE_COMMAND} ARGS -E make_directory "${_dest}" @@ -70,10 +75,10 @@ function(add_lua_target _target _dest) COMMAND "${LUA_TARGET_LUAC_EXECUTABLE}" ARGS -p "${fullpath}" - WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}" - DEPENDS "${fullpath}" - COMMENT "Copying ${fullpath} to ${_dest}/${fn} and parsing...") - list(APPEND ALLFILES "${_dest}/${fn}") + MAIN_DEPENDENCY "${fn}" + VERBATIM + COMMENT "Copying ${fn} to ${absout} and parsing...") + list(APPEND ALLFILES "${absout}") endforeach() # Custom target depending on all the file copy commands From 6f2ed7714947c35a507977607c3eb69ea330c6fc Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Mon, 21 Mar 2011 10:10:40 +0800 Subject: [PATCH 030/348] clean up luatargets --- cmake/LuaTargets.cmake | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/cmake/LuaTargets.cmake b/cmake/LuaTargets.cmake index f8d4f156..12abb9e3 100644 --- a/cmake/LuaTargets.cmake +++ b/cmake/LuaTargets.cmake @@ -39,7 +39,6 @@ function(add_lua_target _target _dest) if(NOT LUA_TARGET_LUAC_EXECUTABLE) if(TARGET luac) - message(STATUS "luac target found, using that in add_lua_target") set(LUA_TARGET_LUAC_EXECUTABLE luac) else() find_executable(LUA_TARGET_LUAC_EXECUTABLE @@ -66,18 +65,18 @@ function(add_lua_target _target _dest) get_filename_component(absout "${_dest}/${fn}" ABSOLUTE) add_custom_command(OUTPUT "${absout}" - COMMAND + COMMAND ${CMAKE_COMMAND} - ARGS -E make_directory "${_dest}" - COMMAND - ${CMAKE_COMMAND} - ARGS -E copy "${fullpath}" "${_dest}" - COMMAND - "${LUA_TARGET_LUAC_EXECUTABLE}" - ARGS -p "${fullpath}" - MAIN_DEPENDENCY "${fn}" - VERBATIM - COMMENT "Copying ${fn} to ${absout} and parsing...") + ARGS -E make_directory "${_dest}" + COMMAND + ${CMAKE_COMMAND} + ARGS -E copy "${fullpath}" "${_dest}" + COMMAND + "${LUA_TARGET_LUAC_EXECUTABLE}" + ARGS -p "${fullpath}" + MAIN_DEPENDENCY "${fn}" + VERBATIM + COMMENT "Copying ${fn} to ${absout} and parsing...") list(APPEND ALLFILES "${absout}") endforeach() From 33228f23135d16ac98e9ae46b2c7475bd495f07d Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Mon, 21 Mar 2011 10:14:13 +0800 Subject: [PATCH 031/348] clean up and make sure that the sources for the target are correct --- cmake/LuaTargets.cmake | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/cmake/LuaTargets.cmake b/cmake/LuaTargets.cmake index 12abb9e3..5abbc46d 100644 --- a/cmake/LuaTargets.cmake +++ b/cmake/LuaTargets.cmake @@ -52,6 +52,7 @@ function(add_lua_target _target _dest) endif() set(ALLFILES) + set(SOURCES) foreach(fn ${ARGN}) # Produce an absolute path to the input file if(IS_ABSOLUTE "${fn}") @@ -66,7 +67,7 @@ function(add_lua_target _target _dest) add_custom_command(OUTPUT "${absout}" COMMAND - ${CMAKE_COMMAND} + ${CMAKE_COMMAND} ARGS -E make_directory "${_dest}" COMMAND ${CMAKE_COMMAND} @@ -77,12 +78,13 @@ function(add_lua_target _target _dest) MAIN_DEPENDENCY "${fn}" VERBATIM COMMENT "Copying ${fn} to ${absout} and parsing...") + list(APPEND SOURCES "${fullpath}") list(APPEND ALLFILES "${absout}") endforeach() # Custom target depending on all the file copy commands add_custom_target(${_target} - SOURCES ${ARGN} + SOURCES ${SOURCES} DEPENDS ${ALLFILES}) if(TARGET "${LUA_TARGET_LUAC_EXECUTABLE}") get_property(_luac_imported TARGET "${LUA_TARGET_LUAC_EXECUTABLE}" PROPERTY IMPORTED) From 6f2c1a405171e38385ab74e426f66aaaeb993c61 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Mon, 21 Mar 2011 10:14:29 +0800 Subject: [PATCH 032/348] port the fixes from lua targets to file copy targets --- cmake/FileCopyTargets.cmake | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/cmake/FileCopyTargets.cmake b/cmake/FileCopyTargets.cmake index 7c11f8a4..fe0251fc 100644 --- a/cmake/FileCopyTargets.cmake +++ b/cmake/FileCopyTargets.cmake @@ -47,29 +47,36 @@ function(add_file_copy_target _target _dest) endif() set(ALLFILES) + set(SOURCES) foreach(fn ${ARGN}) + # Produce an absolute path to the input file if(IS_ABSOLUTE "${fn}") - set(fullpath "${fn}") + get_filename_component(fullpath "${fn}" ABSOLUTE) get_filename_component(fn "${fn}" NAME) else() get_filename_component(fullpath "${CMAKE_CURRENT_SOURCE_DIR}/${fn}" ABSOLUTE) endif() - add_custom_command(OUTPUT "${_dest}/${fn}" - COMMAND - ${CMAKE_COMMAND} - ARGS -E make_directory "${_dest}" - COMMAND - ${CMAKE_COMMAND} - ARGS -E copy "${fullpath}" "${_dest}" - WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}" - DEPENDS "${fullpath}" - COMMENT "Copying ${fullpath} to ${_dest}/${fn}") - list(APPEND ALLFILES "${_dest}/${fn}") + + # Clean up output file name + get_filename_component(absout "${_dest}/${fn}" ABSOLUTE) + + add_custom_command(OUTPUT "${absout}" + COMMAND + ${CMAKE_COMMAND} + ARGS -E make_directory "${_dest}" + COMMAND + ${CMAKE_COMMAND} + ARGS -E copy "${fullpath}" "${_dest}" + MAIN_DEPENDENCY "${fn}" + VERBATIM + COMMENT "Copying ${fn} to ${absout}") + list(APPEND SOURCES "${fullpath}") + list(APPEND ALLFILES "${absout}") endforeach() # Custom target depending on all the file copy commands add_custom_target(${_target} - SOURCES ${ARGN} + SOURCES ${SOURCES} DEPENDS ${ALLFILES}) set_property(TARGET ${_target} PROPERTY FILE_COPY_TARGET YES) From 25144d8106cd991ef2fc97756083d4022ca112dc Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Thu, 31 Mar 2011 12:11:15 -0500 Subject: [PATCH 033/348] Scripts to build a spreadsheet of includes --- extra/generate-include-spreadsheet.sh | 50 +++++++++++++++++++++++ extra/include-spreadsheet.csv | 59 +++++++++++++++++++++++++++ extra/includecomparison.sh | 34 +++++++++++++++ 3 files changed, 143 insertions(+) create mode 100755 extra/generate-include-spreadsheet.sh create mode 100644 extra/include-spreadsheet.csv create mode 100755 extra/includecomparison.sh diff --git a/extra/generate-include-spreadsheet.sh b/extra/generate-include-spreadsheet.sh new file mode 100755 index 00000000..e816b2aa --- /dev/null +++ b/extra/generate-include-spreadsheet.sh @@ -0,0 +1,50 @@ +#!/bin/bash +if [ "x$1" == "x" ];then + echo "Must pass build directory as first parameter!" >&2 + exit 1 +fi + +SRC_IN_RELATION_TO_EXTRA=".." + +##### +# Variable creation +# Don't need to edit +EXTRA="$(dirname $(readlink -f ${0}))" +BUILD="$(readlink -f ${1})" +SRC="$(readlink -f ${EXTRA}/${SRC_IN_RELATION_TO_EXTRA})" +########## + + +SPREADSHEET="${EXTRA}/include-spreadsheet.csv" +FLAGS="-I${BUILD} -I${SRC} -I${SRC}/third-party/luabind -I${SRC}/third-party/lua-5.1.4/src -I${SRC}/third-party/osgLua/include -DEMBEDDED_LUA -DOSGLUA_LIBRARY_STATIC -DLUABIND_MAX_BASES=3 -DLUABIND_MAX_ARITY=3 -x c++" + + +#echo "EXTRA: ${EXTRA}" +#echo "BUILD: ${BUILD}" +#echo "SRC: ${SRC}" +#echo "SPREADSHEET: ${SPREADSHEET}" + + +#### +# Actually create the spreadsheet. + +# Replace existing contents with header row +cat > "${SPREADSHEET}" <> "${SPREADSHEET}" + +# osgLua headers +echo "Processing osgLua" +cd "${SRC}/third-party/osgLua/include" +"${EXTRA}/includecomparison.sh" ${FLAGS} -- osgLua/* >> "${SPREADSHEET}" + +# luabind headers +echo "Processing luabind" +cd "${SRC}/third-party/luabind" +"${EXTRA}/includecomparison.sh" ${FLAGS} -- luabind/*.hpp >> "${SPREADSHEET}" + diff --git a/extra/include-spreadsheet.csv b/extra/include-spreadsheet.csv new file mode 100644 index 00000000..2358252f --- /dev/null +++ b/extra/include-spreadsheet.csv @@ -0,0 +1,59 @@ +"Filename","Total Includes","Unique Includes","Duplicate Includes" +"vrjugglua/Internal_AnalogInterface.h",623,390,233 +"vrjugglua/Internal_DigitalInterface.h",623,390,233 +"vrjugglua/Internal_PositionInterface.h",657,421,236 +"vrjugglua/LuaConsole.h",851,516,335 +"vrjugglua/LuaIncludeFull.h",39,30,9 +"vrjugglua/LuaInclude.h",23,20,3 +"vrjugglua/LuaPath.h",628,395,233 +"vrjugglua/LuaRunBuffer.h",821,514,307 +"vrjugglua/LuaScript.h",622,389,233 +"vrjugglua/OsgAppProxy.h",1016,663,353 +"vrjugglua/osgLuaBind.h",1117,694,423 +"vrjugglua/SynchronizedRunBuffer.h",822,515,307 +"vrjugglua/VRJLua_C_Interface.h",24,21,3 +"vrjugglua/VRJLuaOutput.h",1,1,0 +"osgLua/Callback",266,218,48 +"osgLua/LoadWrapper",23,20,3 +"osgLua/LuaInclude",22,19,3 +"osgLua/Script",177,138,39 +"osgLua/Value",176,138,38 +"luabind/adopt_policy.hpp",731,472,259 +"luabind/back_reference_fwd.hpp",1,1,0 +"luabind/back_reference.hpp",730,472,258 +"luabind/class.hpp",1021,606,415 +"luabind/class_info.hpp",1021,608,413 +"luabind/config.hpp",66,51,15 +"luabind/container_policy.hpp",564,383,181 +"luabind/copy_policy.hpp",563,383,180 +"luabind/dependency_policy.hpp",563,383,180 +"luabind/discard_result_policy.hpp",563,383,180 +"luabind/error.hpp",189,138,51 +"luabind/exception_handler.hpp",336,235,101 +"luabind/from_stack.hpp",1,1,0 +"luabind/function.hpp",893,543,350 +"luabind/get_main_thread.hpp",67,52,15 +"luabind/get_pointer.hpp",44,37,7 +"luabind/handle.hpp",164,134,30 +"luabind/iterator_policy.hpp",565,384,181 +"luabind/luabind.hpp",1022,607,415 +"luabind/lua_include.hpp",40,31,9 +"luabind/make_function.hpp",881,540,341 +"luabind/nil.hpp",67,52,15 +"luabind/no_dependency.hpp",563,383,180 +"luabind/object.hpp",694,465,229 +"luabind/open.hpp",67,52,15 +"luabind/operator.hpp",575,393,182 +"luabind/out_value_policy.hpp",564,383,181 +"luabind/prefix.hpp",1,1,0 +"luabind/raw_policy.hpp",563,383,180 +"luabind/return_reference_to_policy.hpp",1,1,0 +"luabind/scope.hpp",126,97,29 +"luabind/shared_ptr_converter.hpp",589,404,185 +"luabind/tag_function.hpp",254,223,31 +"luabind/typeid.hpp",187,136,51 +"luabind/value_wrapper.hpp",132,110,22 +"luabind/version.hpp",1,1,0 +"luabind/weak_ref.hpp",67,52,15 +"luabind/wrapper_base.hpp",729,472,257 +"luabind/yield_policy.hpp",563,383,180 diff --git a/extra/includecomparison.sh b/extra/includecomparison.sh new file mode 100755 index 00000000..1c432b46 --- /dev/null +++ b/extra/includecomparison.sh @@ -0,0 +1,34 @@ +#!/bin/bash + +if [ "$1" == "-h" ] || [ "$1" == "--help" ]; then + cat < /dev/null; then + while [ "$1" != "--" ]; do + extraargs="${extraargs} ${1}" + shift + done + shift + #echo "Will pass these arguments to all instantiations: $extraargs" >&2 +fi + +for fn; do + includes=$(g++ -E -M -H ${extraargs} ${fn} 2>&1 | grep "^\..*" | sed 's/^\.* \(.*\)/\1/') + count=$(echo "${includes}" | wc -l) + uniques=$(echo "${includes}" | sort | uniq | wc -l) + dupes=$(expr $count - $uniques) + echo -e "\"${fn}\",${count},${uniques},${dupes}" +done + From 42dd429c4146b9c152091ef79f20f306fb43ed40 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Thu, 31 Mar 2011 16:03:29 -0500 Subject: [PATCH 034/348] pretty runtime, and create a pdf --- extra/generate-include-spreadsheet.sh | 66 ++++++++++++++++++++------- 1 file changed, 50 insertions(+), 16 deletions(-) diff --git a/extra/generate-include-spreadsheet.sh b/extra/generate-include-spreadsheet.sh index e816b2aa..f5029e4f 100755 --- a/extra/generate-include-spreadsheet.sh +++ b/extra/generate-include-spreadsheet.sh @@ -27,24 +27,58 @@ FLAGS="-I${BUILD} -I${SRC} -I${SRC}/third-party/luabind -I${SRC}/third-party/lua #### # Actually create the spreadsheet. +if [ "x$2" == "x" ]; then + # Replace existing contents with header row + cat > "${SPREADSHEET}" <<-EOF + "Filename","Total Includes","Unique Includes","Duplicate Includes" + EOF -# Replace existing contents with header row -cat > "${SPREADSHEET}" <> "${SPREADSHEET}" + + # osgLua headers + echo "Processing osgLua" + cd "${SRC}/third-party/osgLua/include" + "${EXTRA}/includecomparison.sh" ${FLAGS} -- osgLua/* >> "${SPREADSHEET}" + + # luabind headers + echo "Processing luabind" + cd "${SRC}/third-party/luabind" + "${EXTRA}/includecomparison.sh" ${FLAGS} -- luabind/*.hpp >> "${SPREADSHEET}" +fi + +cd ${EXTRA} +gnuplot <> "${SPREADSHEET}" +set auto x +set xtic rotate by -90 scale 0 +set xtics nomirror rotate by -90 +set xlabel "Header File" rotate by -90 -# osgLua headers -echo "Processing osgLua" -cd "${SRC}/third-party/osgLua/include" -"${EXTRA}/includecomparison.sh" ${FLAGS} -- osgLua/* >> "${SPREADSHEET}" +set ytics 100 rotate by -90 +set ylabel "Includes" rotate by -90 -# luabind headers -echo "Processing luabind" -cd "${SRC}/third-party/luabind" -"${EXTRA}/includecomparison.sh" ${FLAGS} -- luabind/*.hpp >> "${SPREADSHEET}" + + +# load csv +set datafile separator "," + +# every ::2 skips the first line +plot 'include-spreadsheet.csv' every ::2 using 3 title "Unique includes", \ + '' every ::2 using 4:xtic(1) title "Repeat includes" + +EOF From fb3b1b45f2c3e35315048d16af8dfe0ace6e1e03 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Thu, 31 Mar 2011 16:04:20 -0500 Subject: [PATCH 035/348] add rendered pdf --- extra/includes.pdf | Bin 0 -> 5756 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 extra/includes.pdf diff --git a/extra/includes.pdf b/extra/includes.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a096592d8a90a2200add4195662b411bf0cb0d1b GIT binary patch literal 5756 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 Date: Thu, 31 Mar 2011 16:13:18 -0500 Subject: [PATCH 036/348] sort before pdf --- extra/generate-include-spreadsheet.sh | 7 ++- extra/include-spreadsheet-sorted.csv | 59 ++++++++++++++++++++++++++ extra/includes.pdf | Bin 5756 -> 5703 bytes 3 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 extra/include-spreadsheet-sorted.csv diff --git a/extra/generate-include-spreadsheet.sh b/extra/generate-include-spreadsheet.sh index f5029e4f..b143b1a8 100755 --- a/extra/generate-include-spreadsheet.sh +++ b/extra/generate-include-spreadsheet.sh @@ -16,6 +16,7 @@ SRC="$(readlink -f ${EXTRA}/${SRC_IN_RELATION_TO_EXTRA})" SPREADSHEET="${EXTRA}/include-spreadsheet.csv" +SORTED="${EXTRA}/include-spreadsheet-sorted.csv" FLAGS="-I${BUILD} -I${SRC} -I${SRC}/third-party/luabind -I${SRC}/third-party/lua-5.1.4/src -I${SRC}/third-party/osgLua/include -DEMBEDDED_LUA -DOSGLUA_LIBRARY_STATIC -DLUABIND_MAX_BASES=3 -DLUABIND_MAX_ARITY=3 -x c++" @@ -47,8 +48,12 @@ if [ "x$2" == "x" ]; then echo "Processing luabind" cd "${SRC}/third-party/luabind" "${EXTRA}/includecomparison.sh" ${FLAGS} -- luabind/*.hpp >> "${SPREADSHEET}" + + echo "Sorting" + sort --field-separator=, --key=2 -g "${SPREADSHEET}" > "${SORTED}" fi +echo "Graphing" cd ${EXTRA} gnuplot <wdJ-cuG->= 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 PN=P`2O-4q`SexyiSJFW| delta 3558 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 G5BLw7IajX$ From 2303c4bc48f234c84447518dd0e1ff99e4b37b4f Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Fri, 1 Apr 2011 12:33:44 -0500 Subject: [PATCH 037/348] When adding a "dofile" string command in the console, use [[ ]] to quote instead of single quotes, solving issues with passing Windows-type paths. Remove a mini-workaround from the qt navtestbed --- src/QTNavMain.cpp | 3 --- vrjugglua/LuaConsole.cpp | 4 ++-- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/QTNavMain.cpp b/src/QTNavMain.cpp index 506e0c6f..df3049e7 100644 --- a/src/QTNavMain.cpp +++ b/src/QTNavMain.cpp @@ -18,7 +18,6 @@ // Library/third-party includes #include -#include // Standard includes #include @@ -43,8 +42,6 @@ int main(int argc, char * argv[]) { } else if (arg.find(".jconf") != std::string::npos) { std::cerr << "WARNING: passing jconf files on the command line not yet supported!" << std::endl; } else if (arg.find(".lua") != std::string::npos) { - // change to forward slashes. - boost::algorithm::replace_all(arg, "\\", "/"); std::cout << "Queuing up " << arg << " to run after startup..." << std::endl; files.push_back(arg); } else { diff --git a/vrjugglua/LuaConsole.cpp b/vrjugglua/LuaConsole.cpp index bd5cda97..cca8f05e 100644 --- a/vrjugglua/LuaConsole.cpp +++ b/vrjugglua/LuaConsole.cpp @@ -122,9 +122,9 @@ bool LuaConsole::addFile(std::string const& fn) { throw std::runtime_error("Could not get the run buffer to add a file to!"); } std::string code; - code = "dofile('"; + code = "dofile([["; code += fn; - code += "')\n"; + code += "]])\n"; bool ret = addString(code); From 9e70cdcab961d03372c8c4db53bcb159bd0f35f5 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Fri, 1 Apr 2011 12:34:00 -0500 Subject: [PATCH 038/348] fix warning --- vrjugglua/LuaScript.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vrjugglua/LuaScript.h b/vrjugglua/LuaScript.h index 8febf5b8..4498d5a5 100644 --- a/vrjugglua/LuaScript.h +++ b/vrjugglua/LuaScript.h @@ -29,7 +29,7 @@ namespace vrjLua { -inline void state_no_op_deleter(lua_State *L) { +inline void state_no_op_deleter(lua_State * /*L*/) { return; } From 8dcdd3881c4a023c9e45b574206eec0d1827fe3a Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Fri, 1 Apr 2011 12:34:10 -0500 Subject: [PATCH 039/348] cleanup and improve output --- src/QTNavMain.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/QTNavMain.cpp b/src/QTNavMain.cpp index df3049e7..15d6a2e9 100644 --- a/src/QTNavMain.cpp +++ b/src/QTNavMain.cpp @@ -27,7 +27,6 @@ using namespace vrjLua; int main(int argc, char * argv[]) { bool ret; - //QApplication app(argc, argv); /// Tell it our application path LuaPath lp = LuaPath::instance(argv[0]); @@ -74,7 +73,7 @@ int main(int argc, char * argv[]) { if (!ret) { std::cout << "Could not load osgnav-testbed module!" << std::endl; #ifdef BUILD_WITHOUT_TERMINAL - console->appendToDisplay("-- Could not load osgnav-testbed module: see View->Show debug log for potential clues."); + console->appendToDisplay("-- ERROR: Could not load osgnav-testbed module: see View->Show debug log for potential clues."); console->appendToDisplay("-- Application will not function properly - exit when finished viewing log."); /// @todo tell the console to disable any active interaction (run button, open menu item, etc) console->threadLoop(); From f88df0a2e4d93fafaf57793979aee746a7b4374e Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Fri, 1 Apr 2011 13:37:15 -0500 Subject: [PATCH 040/348] optimization from cppcheck --- vrjugglua/LuaPath.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vrjugglua/LuaPath.cpp b/vrjugglua/LuaPath.cpp index bdf83abc..0d9d3d72 100644 --- a/vrjugglua/LuaPath.cpp +++ b/vrjugglua/LuaPath.cpp @@ -251,7 +251,7 @@ void LuaPath::addLuaRequirePath(LuaStatePtr state, std::string const& dirEndingI } void LuaPath::updateLuaRequirePath(LuaStatePtr state) { - if (_searchPaths.size() == 0) { + if (_searchPaths.empty()) { _populateSearchPathsVector(state); } _setLuaSearchPaths(state); From 87da844edb511c124cac162cde169076a33ed2ac Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Fri, 1 Apr 2011 13:37:23 -0500 Subject: [PATCH 041/348] disambiguate typedef (cppcheck) --- vrjugglua/binding_detail/BindKernelToLua.inl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/vrjugglua/binding_detail/BindKernelToLua.inl b/vrjugglua/binding_detail/BindKernelToLua.inl index e43a7d67..7ae6f354 100644 --- a/vrjugglua/binding_detail/BindKernelToLua.inl +++ b/vrjugglua/binding_detail/BindKernelToLua.inl @@ -28,10 +28,10 @@ #if __VJ_version < 2003011 # include - typedef vrj::OsgApp OsgApp; + typedef vrj::OsgApp KernelOsgApp; #else # include - typedef vrj::osg::App OsgApp; + typedef vrj::osg::App KernelOsgApp; #endif // Standard includes @@ -217,7 +217,7 @@ namespace Kernel { } void setApplication(luabind::object app) { - vrj::Kernel::instance()->setApplication(luabind::object_cast(app)); + vrj::Kernel::instance()->setApplication(luabind::object_cast(app)); } void loadConfigFile(const std::string & fn) { From 81f966230c14a136f2c17b1fe4327c357559e3fb Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Tue, 5 Apr 2011 13:51:40 -0500 Subject: [PATCH 042/348] allow disabling the GUI action elements. --- vrjugglua/LuaConsole.cpp | 6 ++++++ vrjugglua/LuaConsole.h | 4 ++++ vrjugglua/fltk-console/FLTKConsole.cpp | 6 ++++++ vrjugglua/fltk-console/FLTKConsole.h | 2 ++ vrjugglua/qt-console/QTConsole.cpp | 12 ++++++++++++ vrjugglua/qt-console/QTConsole.h | 4 ++++ 6 files changed, 34 insertions(+) diff --git a/vrjugglua/LuaConsole.cpp b/vrjugglua/LuaConsole.cpp index cca8f05e..118ea291 100644 --- a/vrjugglua/LuaConsole.cpp +++ b/vrjugglua/LuaConsole.cpp @@ -254,4 +254,10 @@ void StubConsole::setTitle(std::string const& title) { << VRJLUA_MSG_END(dbgVRJLUA_CONSOLE, MSG_STATUS); } +void StubConsole::disableAction() { + VRJLUA_MSG_START(dbgVRJLUA_CONSOLE, MSG_STATUS) + << "StubConsole::disableAction called - no-op because we're a stub." + << VRJLUA_MSG_END(dbgVRJLUA_CONSOLE, MSG_STATUS); +} + } // end of vrjLua namespace diff --git a/vrjugglua/LuaConsole.h b/vrjugglua/LuaConsole.h index e319c399..9dba5e94 100644 --- a/vrjugglua/LuaConsole.h +++ b/vrjugglua/LuaConsole.h @@ -51,6 +51,8 @@ class LuaConsole { virtual void appendToDisplay(std::string const& message) = 0; virtual void setTitle(std::string const& title) = 0; + + virtual void disableAction() = 0; /// @} bool isValid() const; @@ -100,6 +102,8 @@ class StubConsole : public LuaConsole { virtual void appendToDisplay(std::string const& message); virtual void setTitle(std::string const& title); + + virtual void disableAction(); /// @} }; diff --git a/vrjugglua/fltk-console/FLTKConsole.cpp b/vrjugglua/fltk-console/FLTKConsole.cpp index 693507c1..7a0ad8e1 100644 --- a/vrjugglua/fltk-console/FLTKConsole.cpp +++ b/vrjugglua/fltk-console/FLTKConsole.cpp @@ -193,6 +193,12 @@ void FLTKConsole::setTitle(std::string const& title) { _view->copy_label(title.c_str()); } +void FLTKConsole::disableAction() { + VRJLUA_MSG_START(dbgVRJLUA_CONSOLE, MSG_STATUS) + << "FLTKConsole::disableAction called but not implemented!!!" + << VRJLUA_MSG_END(dbgVRJLUA_CONSOLE, MSG_STATUS); +} + bool FLTKConsole::_doThreadWork() { return ((Fl::wait(1.0/60.0) >= 0) && (Fl::first_window() != NULL)); } diff --git a/vrjugglua/fltk-console/FLTKConsole.h b/vrjugglua/fltk-console/FLTKConsole.h index 1caaf995..0af48ab9 100644 --- a/vrjugglua/fltk-console/FLTKConsole.h +++ b/vrjugglua/fltk-console/FLTKConsole.h @@ -46,6 +46,8 @@ class FLTKConsole : public LuaConsole, boost::noncopyable { virtual void appendToDisplay(std::string const& message); virtual void setTitle(std::string const& title); + + virtual void disableAction(); /// @} protected: diff --git a/vrjugglua/qt-console/QTConsole.cpp b/vrjugglua/qt-console/QTConsole.cpp index f5c0d94f..734c8bdb 100644 --- a/vrjugglua/qt-console/QTConsole.cpp +++ b/vrjugglua/qt-console/QTConsole.cpp @@ -173,6 +173,12 @@ void QTConsole::checkRunningState() { } } +void QTConsole::disableGUIAction() { + _ui->plainTextEdit->setEnabled(false); + _ui->buttonRun->setEnabled(false); + _ui->actionFileOpen->setEnabled(false); +} + bool QTConsole::threadLoop() { if (_running) { /// @todo notify that the thread is already running? @@ -183,6 +189,7 @@ bool QTConsole::threadLoop() { boost::shared_ptr timer(new QTimer(this)); connect(this, SIGNAL(textDisplaySignal(QString const&)), this, SLOT(addTextToDisplay(QString const&))); + connect(this, SIGNAL(disableGUISignal()), this, SLOT(disableGUIAction())); connect(timer.get(), SIGNAL(timeout()), this, SLOT(checkRunningState())); timer->start(POLLING_INTERVAL); @@ -223,4 +230,9 @@ void QTConsole::setTitle(std::string const& title) { setWindowTitle(QString::fromStdString(title)); } +void QTConsole::disableAction() { + appendToDisplay("-- Disabling interaction console GUI on this node..."); + Q_EMIT disableGUISignal(); +} + } // end of vrjLua namespace diff --git a/vrjugglua/qt-console/QTConsole.h b/vrjugglua/qt-console/QTConsole.h index 270ecf74..247b0ce4 100644 --- a/vrjugglua/qt-console/QTConsole.h +++ b/vrjugglua/qt-console/QTConsole.h @@ -61,6 +61,8 @@ class QTConsole : public QMainWindow, boost::noncopyable, public LuaConsole { virtual void appendToDisplay(std::string const& message); virtual void setTitle(std::string const& title); + + virtual void disableAction(); /// @} bool supportsAlternateLogging() const { return true; } @@ -69,6 +71,7 @@ class QTConsole : public QMainWindow, boost::noncopyable, public LuaConsole { Q_SIGNALS: void textDisplaySignal(QString const& message); + void disableGUISignal(); private Q_SLOTS: @@ -80,6 +83,7 @@ class QTConsole : public QMainWindow, boost::noncopyable, public LuaConsole { void checkRunningState(); void updateDebugLog(); void addTextToDisplay(QString const& message); + void disableGUIAction(); protected: void _shared_init(); From e4b6951a0abf6621eda13eecc578223887d6eada Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Tue, 5 Apr 2011 13:51:51 -0500 Subject: [PATCH 043/348] Disable GUI actions if we're not the local node --- vrjugglua/SynchronizedRunBuffer.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/vrjugglua/SynchronizedRunBuffer.cpp b/vrjugglua/SynchronizedRunBuffer.cpp index 55ec25e1..317eb6c6 100644 --- a/vrjugglua/SynchronizedRunBuffer.cpp +++ b/vrjugglua/SynchronizedRunBuffer.cpp @@ -15,6 +15,7 @@ // Local includes #define NEED_RUNBUFFER_LUABIND_OBJECT #include "SynchronizedRunBuffer.h" +#include "LuaConsole.h" // Library/third-party includes // - none @@ -68,6 +69,11 @@ namespace vrjLua { } } _earlyBirds.clear(); + + LuaConsole * console = LuaConsole::getConsole(); + if (console && (!isLocal())) { + console->disableAction(); + } } bool SynchronizedRunBuffer::isLocal() { From e177abd4cfaf2cf77bf6362955b7874cac2e729d Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Tue, 5 Apr 2011 13:52:13 -0500 Subject: [PATCH 044/348] correctly read serialized buffer --- vrjugglua/LuaRunBuffer.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/vrjugglua/LuaRunBuffer.cpp b/vrjugglua/LuaRunBuffer.cpp index a672f5ab..441408ac 100644 --- a/vrjugglua/LuaRunBuffer.cpp +++ b/vrjugglua/LuaRunBuffer.cpp @@ -76,9 +76,10 @@ void LuaRunBuffer::writeObject(vpr::ObjectWriter* writer) { void LuaRunBuffer::readObject(vpr::ObjectReader* reader) { vpr::Guard guard(_cond, true); _maxRun = reader->readUint32(); + _buf.clear(); for (unsigned int i = 0; i < _maxRun; ++i) { // Overwrite it all. - _buf[i] = (reader->readString()); + _buf.push_back(reader->readString()); } if (_buf.size() != _maxRun) { VRJLUA_MSG_START(dbgVRJLUA_BUFFER, MSG_WARNING) From 418a17f8af5522fe1933f87e01a40706a83d35c7 Mon Sep 17 00:00:00 2001 From: Leif Berg Date: Tue, 5 Apr 2011 13:55:09 -0500 Subject: [PATCH 045/348] add a warning message --- vrjugglua/SynchronizedRunBuffer.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/vrjugglua/SynchronizedRunBuffer.cpp b/vrjugglua/SynchronizedRunBuffer.cpp index 317eb6c6..200c2c9c 100644 --- a/vrjugglua/SynchronizedRunBuffer.cpp +++ b/vrjugglua/SynchronizedRunBuffer.cpp @@ -107,6 +107,7 @@ namespace vrjLua { _checkInit(); return _runBuf->addString(str, blocking); } else { + std::cerr << "WARNING: can't add a string if the buffer isn't local!" << std::endl; return false; } } From 58e39ce917864cde52b150e9a2e5a0706d0c0f72 Mon Sep 17 00:00:00 2001 From: Leif Berg Date: Tue, 5 Apr 2011 13:56:45 -0500 Subject: [PATCH 046/348] add debug info to run buffer --- vrjugglua/LuaRunBuffer.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/vrjugglua/LuaRunBuffer.cpp b/vrjugglua/LuaRunBuffer.cpp index 441408ac..d670bf90 100644 --- a/vrjugglua/LuaRunBuffer.cpp +++ b/vrjugglua/LuaRunBuffer.cpp @@ -66,10 +66,21 @@ void LuaRunBuffer::writeObject(vpr::ObjectWriter* writer) { /// Set max # to run so we don't run anything added between /// data synchronization and postframe _maxRun = _buf.size(); + if (_maxRun > 0) { + VRJLUA_MSG_START(dbgVRJLUA_BUFFER, MSG_STATUS) + << "Told to write objects - will write " << _maxRun + << VRJLUA_MSG_END(dbgVRJLUA_BUFFER, MSG_STATUS); + } writer->writeUint32(_maxRun); for (unsigned int i = 0; i < _maxRun; ++i) { + VRJLUA_MSG_START(dbgVRJLUA_BUFFER, MSG_STATUS) + << "Writing: "<< _buf[i] + << VRJLUA_MSG_END(dbgVRJLUA_BUFFER, MSG_STATUS); writer->writeString(_buf[i]); } + VRJLUA_MSG_START(dbgVRJLUA_BUFFER, MSG_STATUS) + << "Done writing." + << VRJLUA_MSG_END(dbgVRJLUA_BUFFER, MSG_STATUS); } From 503fd68f8b059ae4049123d70ead50b1294090ae Mon Sep 17 00:00:00 2001 From: Leif Berg Date: Tue, 5 Apr 2011 13:57:19 -0500 Subject: [PATCH 047/348] more debug text --- vrjugglua/LuaRunBuffer.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/vrjugglua/LuaRunBuffer.cpp b/vrjugglua/LuaRunBuffer.cpp index d670bf90..f9bd8635 100644 --- a/vrjugglua/LuaRunBuffer.cpp +++ b/vrjugglua/LuaRunBuffer.cpp @@ -87,6 +87,11 @@ void LuaRunBuffer::writeObject(vpr::ObjectWriter* writer) { void LuaRunBuffer::readObject(vpr::ObjectReader* reader) { vpr::Guard guard(_cond, true); _maxRun = reader->readUint32(); + if (_maxRun > 0) { + VRJLUA_MSG_START(dbgVRJLUA_BUFFER, MSG_STATUS) + << "Told to read objects - will read " << _maxRun + << VRJLUA_MSG_END(dbgVRJLUA_BUFFER, MSG_STATUS); + } _buf.clear(); for (unsigned int i = 0; i < _maxRun; ++i) { // Overwrite it all. From dfc1057d989d4b9b618799dda31e3a497682f446 Mon Sep 17 00:00:00 2001 From: Leif Berg Date: Fri, 8 Apr 2011 10:40:26 -0500 Subject: [PATCH 048/348] provide easier access to the raw state pointer --- vrjugglua/LuaScript.cpp | 5 +++++ vrjugglua/LuaScript.h | 1 + 2 files changed, 6 insertions(+) diff --git a/vrjugglua/LuaScript.cpp b/vrjugglua/LuaScript.cpp index dc3cca90..f1ff1d17 100644 --- a/vrjugglua/LuaScript.cpp +++ b/vrjugglua/LuaScript.cpp @@ -265,6 +265,11 @@ LuaStateWeakPtr LuaScript::getLuaState() const { return _state; } + +LuaStateRawPtr LuaScript::getLuaRawState() const { + return _state.get(); +} + boost::program_options::options_description LuaScript::getVrjOptionsDescriptions() { return KernelState::getVrjOptionsDescriptions(); } diff --git a/vrjugglua/LuaScript.h b/vrjugglua/LuaScript.h index 4498d5a5..baa9848f 100644 --- a/vrjugglua/LuaScript.h +++ b/vrjugglua/LuaScript.h @@ -72,6 +72,7 @@ class LuaScript { static void doPrint(std::string const& str); LuaStateWeakPtr getLuaState() const; + LuaStateRawPtr getLuaRawState() const; bool isValid() const; From 743adb2e46c8b9ed8c0dbce30d898a26c177220a Mon Sep 17 00:00:00 2001 From: Leif Berg Date: Fri, 8 Apr 2011 10:40:38 -0500 Subject: [PATCH 049/348] display the luabind headers in a project --- third-party/luabind/src/CMakeLists.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/third-party/luabind/src/CMakeLists.txt b/third-party/luabind/src/CMakeLists.txt index 6b4e8954..3fde5b82 100644 --- a/third-party/luabind/src/CMakeLists.txt +++ b/third-party/luabind/src/CMakeLists.txt @@ -62,6 +62,7 @@ set(LUABIND_API ../luabind/weak_ref.hpp ../luabind/wrapper_base.hpp ../luabind/yield_policy.hpp) +source_group(API FILES ${LUABIND_API}) set(LUABIND_DETAIL_API ../luabind/detail/call_function.hpp @@ -101,6 +102,7 @@ set(LUABIND_DETAIL_API ../luabind/detail/stack_utils.hpp ../luabind/detail/typetraits.hpp ../luabind/detail/yes_no.hpp) +source_group(Internal FILES ${LUABIND_DETAIL_API}) set(LUABIND_EXTRA_LIBS) if(MSVC) @@ -109,7 +111,7 @@ elseif(CMAKE_COMPILER_IS_GNUCXX) list(APPEND LUABIND_EXTRA_LIBS m) endif() -add_library(luabind ${LUABIND_SRCS}) +add_library(luabind ${LUABIND_SRCS} ${LUABIND_API} ${LUABIND_DETAIL_API}) target_link_libraries(luabind ${LUA_LIBRARIES} ${LUABIND_EXTRA_LIBS}) set_property(TARGET From 864b02038521db6e08af7adf7c3b56f56ec78f37 Mon Sep 17 00:00:00 2001 From: Leif Berg Date: Fri, 8 Apr 2011 10:40:55 -0500 Subject: [PATCH 050/348] make qt navtestbed pass along command line arguments like the standalone interpreter --- src/QTNavMain.cpp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/QTNavMain.cpp b/src/QTNavMain.cpp index 15d6a2e9..28434920 100644 --- a/src/QTNavMain.cpp +++ b/src/QTNavMain.cpp @@ -18,6 +18,7 @@ // Library/third-party includes #include +#include // Standard includes #include @@ -34,22 +35,34 @@ int main(int argc, char * argv[]) { /// Process command line args bool stubConsole = false; std::vector files; + std::vector args; for (int i = 1; i < argc; ++i) { std::string arg(argv[i]); if (arg == "--stub") { stubConsole = true; + /* } else if (arg.find(".jconf") != std::string::npos) { std::cerr << "WARNING: passing jconf files on the command line not yet supported!" << std::endl; + */ } else if (arg.find(".lua") != std::string::npos) { std::cout << "Queuing up " << arg << " to run after startup..." << std::endl; files.push_back(arg); } else { - std::cerr << "Unrecognized command line argument '" << arg << "', ignoring..." << std::endl; + //std::cerr << "Unrecognized command line argument '" << arg << "', ignoring..." << std::endl; + args.push_back(arg); } } /// Create the script object LuaScript script; + + /// Create the "arg" table + luabind::object arg = luabind::newtable(script.getLuaRawState()); + arg[0] = std::string(argv[0]); + for (unsigned int i = 0; i < args.size(); ++i) { + arg[i+1] = args[i]; + } + luabind::globals(script.getLuaRawState())["arg"] = arg; /// Create the console GUI boost::shared_ptr console; From 3eafcb558de830302f0786c8bbefd6a5345c1980 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Fri, 8 Apr 2011 14:53:11 -0500 Subject: [PATCH 051/348] add missing include to fix fltk console --- vrjugglua/fltk-console/FLTKConsole.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/vrjugglua/fltk-console/FLTKConsole.cpp b/vrjugglua/fltk-console/FLTKConsole.cpp index 7a0ad8e1..c0527bcb 100644 --- a/vrjugglua/fltk-console/FLTKConsole.cpp +++ b/vrjugglua/fltk-console/FLTKConsole.cpp @@ -14,6 +14,7 @@ // Internal Includes #include "FLTKConsole.h" +#include "../VRJLuaOutput.h" // FLTK-generated source #include From c759e42f50d951aef4f51d5aa90616c350b80ca1 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Fri, 8 Apr 2011 17:36:01 -0500 Subject: [PATCH 052/348] use templates instead of preprocessor to handle basic types. --- third-party/osgLua/src/osgLua/Value.cpp | 106 +++++++++++++++++++----- 1 file changed, 85 insertions(+), 21 deletions(-) diff --git a/third-party/osgLua/src/osgLua/Value.cpp b/third-party/osgLua/src/osgLua/Value.cpp index b4fe30e8..d7256de6 100644 --- a/third-party/osgLua/src/osgLua/Value.cpp +++ b/third-party/osgLua/src/osgLua/Value.cpp @@ -41,6 +41,82 @@ namespace osgLua { static void push_stdString(lua_State *L, const std::string &s) { lua_pushstring(L, s.c_str()); } + + template + struct LuaBasicTypeTraits; + + template<> + struct LuaBasicTypeTraits { + static void push(lua_State * L, bool val) { + lua_pushboolean(L, val); + } + }; + + template + struct LuaIntegerTypeTraits { + static void push(lua_State * L, T val) { + lua_pushinteger(L, val); + } + }; + + template + struct LuaNumberTypeTraits { + static void push(lua_State * L, T val) { + lua_pushnumber(L, val); + } + }; + + template<> + struct LuaBasicTypeTraits : + public LuaIntegerTypeTraits {}; + + template<> + struct LuaBasicTypeTraits : + public LuaIntegerTypeTraits {}; + + template<> + struct LuaBasicTypeTraits : + public LuaIntegerTypeTraits {}; + + template<> + struct LuaBasicTypeTraits : + public LuaNumberTypeTraits {}; + + template<> + struct LuaBasicTypeTraits : + public LuaNumberTypeTraits {}; + +#if LUA_NUMBER != double && LUA_NUMBER != float + template<> + struct LuaBasicTypeTraits : + public LuaNumberTypeTraits {}; +#endif + + template<> + struct LuaBasicTypeTraits { + static void push(lua_State * L, const char* val) { + lua_pushstring(L, val); + } + }; + + template<> + struct LuaBasicTypeTraits { + static void push(lua_State * L, const std::string & val) { + lua_pushstring(L, val.c_str()); + } + }; + + template + bool tryToPushBasicType(lua_State *L, const osgIntrospection::Value &original) { + static const osgIntrospection::Type& testType = + osgIntrospection::Reflection::getType(extended_typeid()); + if (original.getType() == testType) { + LuaBasicTypeTraits::push(L, osgIntrospection::getInstance(original)); + return true; + } + return false; + } + } Value::Value(const osgIntrospection::Value &v) : _value(v) { @@ -108,27 +184,15 @@ namespace osgLua { void Value::push(lua_State *L, const osgIntrospection::Value &original) { -#define basic_type(TYPE, NAME, FUNCTION) \ - static const osgIntrospection::Type& NAME = \ - osgIntrospection::Reflection::getType(extended_typeid()); \ - if ( original.getType() == NAME ) \ - { \ - FUNCTION(L, (TYPE) \ - osgIntrospection::getInstance(original)); \ - return; \ - } - - basic_type(bool, tbool, lua_pushboolean) - basic_type(int, tint, lua_pushinteger) - basic_type(unsigned int, tuint, lua_pushinteger) - basic_type(lua_Integer, tlua_int, lua_pushinteger) - basic_type(float, tfloat, lua_pushnumber) - basic_type(double, tdouble, lua_pushnumber) - basic_type(lua_Number, tlnumber, lua_pushnumber) - basic_type(const char*, tcchar, lua_pushstring) - basic_type(const std::string, tstd_string, detail::push_stdString) - -#undef basic_type + if (detail::tryToPushBasicType(L, original)) { return; } + if (detail::tryToPushBasicType(L, original)) { return; } + if (detail::tryToPushBasicType(L, original)) { return; } + if (detail::tryToPushBasicType(L, original)) { return; } + if (detail::tryToPushBasicType(L, original)) { return; } + if (detail::tryToPushBasicType(L, original)) { return; } + if (detail::tryToPushBasicType(L, original)) { return; } + if (detail::tryToPushBasicType(L, original)) { return; } + if (detail::tryToPushBasicType(L, original)) { return; } // if not is a basic type... // create a userdata From ef1be2666e7891c3cf816a82894a3b8550fa1136 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Fri, 8 Apr 2011 17:36:40 -0500 Subject: [PATCH 053/348] more include in tests --- tests/OsgPointers.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/OsgPointers.cpp b/tests/OsgPointers.cpp index d30413ac..0df90fdd 100644 --- a/tests/OsgPointers.cpp +++ b/tests/OsgPointers.cpp @@ -10,6 +10,7 @@ #define BOOST_TEST_MODULE OsgPointers tests // Internal Includes +#include #include #include From aaa24dd3958256390dc0728b5c0a11b4f3a9f650 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Fri, 8 Apr 2011 17:37:54 -0500 Subject: [PATCH 054/348] remove unneeded include --- vrjugglua/binding_detail/OsgHelpers.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/vrjugglua/binding_detail/OsgHelpers.cpp b/vrjugglua/binding_detail/OsgHelpers.cpp index d6bac035..7fdd2002 100644 --- a/vrjugglua/binding_detail/OsgHelpers.cpp +++ b/vrjugglua/binding_detail/OsgHelpers.cpp @@ -13,9 +13,6 @@ */ // Local includes -#ifndef LUABIND_COMBINED_COMPILE -#include -#endif #include "OsgHelpers.h" #include "../LuaIncludeFull.h" From 46598912876cbb6d1e3201098cae36491a286213 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Wed, 13 Apr 2011 15:36:11 -0500 Subject: [PATCH 055/348] Make sure to install all assets from the source tree when not using an installed build --- vrjugglua-config-build-tree.cmake.in | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/vrjugglua-config-build-tree.cmake.in b/vrjugglua-config-build-tree.cmake.in index aa2d21c5..9c442444 100644 --- a/vrjugglua-config-build-tree.cmake.in +++ b/vrjugglua-config-build-tree.cmake.in @@ -33,6 +33,10 @@ function(install_vrjugglua_lua_files) install(DIRECTORY "${VRJUGGLUA_BASE_DIR}/share/vrjugglua/" DESTINATION "share/vrjugglua/" ${ARGN}) + + install(DIRECTORY "@CMAKE_CURRENT_SOURCE_DIR@/assets" + DESTINATION "share/vrjugglua/" + ${ARGN}) endfunction() include("@CMAKE_CURRENT_BINARY_DIR@/vrjugglua-targets.cmake") From 1ee98f60fab2b8155063323158481b12d444a0cd Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Wed, 13 Apr 2011 18:14:33 -0500 Subject: [PATCH 056/348] fix build on windows --- third-party/osgLua/src/osgLua/Value.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/third-party/osgLua/src/osgLua/Value.cpp b/third-party/osgLua/src/osgLua/Value.cpp index d7256de6..b16118e0 100644 --- a/third-party/osgLua/src/osgLua/Value.cpp +++ b/third-party/osgLua/src/osgLua/Value.cpp @@ -74,10 +74,14 @@ namespace osgLua { struct LuaBasicTypeTraits : public LuaIntegerTypeTraits {}; + + /// @todo this is not the best way to do this +#ifndef _WIN32 + // On Windows, ptrdiff_t is just a typedef of integer. template<> struct LuaBasicTypeTraits : public LuaIntegerTypeTraits {}; - +#endif template<> struct LuaBasicTypeTraits : public LuaNumberTypeTraits {}; @@ -85,11 +89,13 @@ namespace osgLua { template<> struct LuaBasicTypeTraits : public LuaNumberTypeTraits {}; - -#if LUA_NUMBER != double && LUA_NUMBER != float + /// @todo this is not the best way to do this +#ifndef _WIN32 +#if (LUA_NUMBER != double) && (LUA_NUMBER != float) template<> struct LuaBasicTypeTraits : public LuaNumberTypeTraits {}; +#endif #endif template<> From 9b13aaf5ebcd325caa4f026ce82d4b72dd8b397c Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Mon, 11 Apr 2011 10:05:35 -0500 Subject: [PATCH 057/348] add LuaGCBlock class. --- vrjugglua/CMakeLists.txt | 1 + vrjugglua/LuaGCBlock.h | 69 ++++++++++++++++++++++++++++++++++++++++ vrjugglua/LuaScript.cpp | 19 ++++++----- 3 files changed, 81 insertions(+), 8 deletions(-) create mode 100644 vrjugglua/LuaGCBlock.h diff --git a/vrjugglua/CMakeLists.txt b/vrjugglua/CMakeLists.txt index ca3ef144..586bd29e 100644 --- a/vrjugglua/CMakeLists.txt +++ b/vrjugglua/CMakeLists.txt @@ -39,6 +39,7 @@ set(API Internal_DigitalInterface.h Internal_PositionInterface.h LuaConsole.h + LuaGCBlock.h LuaIncludeFull.h LuaInclude.h LuaPath.h diff --git a/vrjugglua/LuaGCBlock.h b/vrjugglua/LuaGCBlock.h new file mode 100644 index 00000000..436c1d63 --- /dev/null +++ b/vrjugglua/LuaGCBlock.h @@ -0,0 +1,69 @@ +/** @file LuaGCBlock.h + @brief + + @date 2011 + + @author + Ryan Pavlik + and + http://academic.cleardefinition.com/ + Iowa State University Virtual Reality Applications Center + Human-Computer Interaction Graduate Program +*/ + +#pragma once +#ifndef INCLUDED_LuaGCBlock_h_GUID_8c906cef_6f6d_49c4_b436_f774451856d1 +#define INCLUDED_LuaGCBlock_h_GUID_8c906cef_6f6d_49c4_b436_f774451856d1 + +// Internal Includes +#include + +// Library/third-party includes +// - none + +// Standard includes +#include + +namespace vrjLua { + +/// Class providing RAII-style method of disabling the Lua garbage collector, +/// for example, during library loading. Disables garbage collection + class LuaGCBlock { + public: + /// Derived exception class thrown by constructor + struct NullStateError : public std::runtime_error { + NullStateError() : std::runtime_error("Null Lua state passed to LuaGCBlock constructor!") {} + }; + + /** @brief Constructor: disables garbage collection in the given state. + + Requires a valid state pointer. + + @throws NullStateError if state pointer given is NULL + */ + LuaGCBlock(lua_State * L) : _L(L) { + if (!_L) { + throw NullStateError(); + } + lua_gc(_L, LUA_GCSTOP, 0); + } + + /// Destructor: restarts garbage collection on the lua state. + ~LuaGCBlock() { + lua_gc(_L, LUA_GCRESTART, 0); + } + + /// Accessor to the GC-blocked state + lua_State * state() const { + return _L; + } + + + private: + lua_State * _L; + + }; + +} + +#endif // INCLUDED_LuaGCBlock_h_GUID_8c906cef_6f6d_49c4_b436_f774451856d1 diff --git a/vrjugglua/LuaScript.cpp b/vrjugglua/LuaScript.cpp index f1ff1d17..b20e415e 100644 --- a/vrjugglua/LuaScript.cpp +++ b/vrjugglua/LuaScript.cpp @@ -17,6 +17,7 @@ #include "OsgAppProxy.h" #include "LuaPath.h" +#include "LuaGCBlock.h" #include "VRJLuaOutput.h" @@ -68,16 +69,18 @@ LuaScript::LuaScript(const bool create) { return; } - lua_gc(_state.get(), LUA_GCSTOP, 0); /* stop collector during initialization */ - // Load default Lua libs - luaL_openlibs(_state.get()); + { + /// RAII-style disabling of garbage collector during init + LuaGCBlock gcBlocker(_state.get()); + // Load default Lua libs + luaL_openlibs(gcBlocker.state()); - /// @todo Extend the path here for shared libraries? - //luabind::call_function(_state.get(), "format", "%q", ) - //luaL_dostring(_state.get(), "package.cpath = ") + /// @todo Extend the path here for shared libraries? + //luabind::call_function(_state.get(), "format", "%q", ) + //luaL_dostring(_state.get(), "package.cpath = ") - _applyBindings(); - lua_gc(_state.get(), LUA_GCRESTART, 0); + _applyBindings(); + } } } From e954ab5f83837a37e4febd736130387341ccf180 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Fri, 15 Apr 2011 10:45:41 -0500 Subject: [PATCH 058/348] much simpler method of pushing basic types in osgLua --- third-party/osgLua/src/osgLua/Value.cpp | 138 ++++++++++++++---------- 1 file changed, 82 insertions(+), 56 deletions(-) diff --git a/third-party/osgLua/src/osgLua/Value.cpp b/third-party/osgLua/src/osgLua/Value.cpp index b16118e0..37a4e3b0 100644 --- a/third-party/osgLua/src/osgLua/Value.cpp +++ b/third-party/osgLua/src/osgLua/Value.cpp @@ -38,86 +38,91 @@ namespace osgLua { namespace detail { - static void push_stdString(lua_State *L, const std::string &s) { - lua_pushstring(L, s.c_str()); - } + /// Template used to designate lua equivalents of types. template - struct LuaBasicTypeTraits; + struct LuaEquivalent; - template<> - struct LuaBasicTypeTraits { - static void push(lua_State * L, bool val) { - lua_pushboolean(L, val); - } + /// shared definition for types convertible to lua_Number + struct is_lua_Number { + typedef lua_Number type; }; - template - struct LuaIntegerTypeTraits { - static void push(lua_State * L, T val) { - lua_pushinteger(L, val); - } + /// shared definition for types convertible to lua_Integer + struct is_lua_Integer { + typedef lua_Integer type; }; - template - struct LuaNumberTypeTraits { - static void push(lua_State * L, T val) { - lua_pushnumber(L, val); - } - }; + template<> + struct LuaEquivalent : is_lua_Number {}; template<> - struct LuaBasicTypeTraits : - public LuaIntegerTypeTraits {}; + struct LuaEquivalent : is_lua_Number {}; template<> - struct LuaBasicTypeTraits : - public LuaIntegerTypeTraits {}; + struct LuaEquivalent : is_lua_Integer {}; - - /// @todo this is not the best way to do this -#ifndef _WIN32 - // On Windows, ptrdiff_t is just a typedef of integer. template<> - struct LuaBasicTypeTraits : - public LuaIntegerTypeTraits {}; -#endif + struct LuaEquivalent : is_lua_Integer {}; + + /// Forward declaration of templated way to push values into Lua + template + struct ToLua; + + /// We know how to push lua_Integer template<> - struct LuaBasicTypeTraits : - public LuaNumberTypeTraits {}; + struct ToLua { + static void push(lua_State * L, lua_Integer const val) { + lua_pushinteger(L, val); + } + }; + /// We know how to push lua_Number template<> - struct LuaBasicTypeTraits : - public LuaNumberTypeTraits {}; - /// @todo this is not the best way to do this -#ifndef _WIN32 -#if (LUA_NUMBER != double) && (LUA_NUMBER != float) + struct ToLua { + static void push(lua_State * L, lua_Number const val) { + lua_pushnumber(L, val); + } + }; + + /// We know how to push bool template<> - struct LuaBasicTypeTraits : - public LuaNumberTypeTraits {}; -#endif -#endif + struct ToLua { + static void push(lua_State * L, bool const val) { + lua_pushboolean(L, val); + } + }; + /// We know how to push const char * template<> - struct LuaBasicTypeTraits { + struct ToLua { static void push(lua_State * L, const char* val) { lua_pushstring(L, val); } }; + /// We know how to push const std::string template<> - struct LuaBasicTypeTraits { + struct ToLua { static void push(lua_State * L, const std::string & val) { lua_pushstring(L, val.c_str()); } }; + /// Fallback templated case: push value like its lua equivalent. + template + struct ToLua { + static void push(lua_State *L, T const& val) { + ToLua< typename LuaEquivalent::type >::push(L, val); + } + }; + template - bool tryToPushBasicType(lua_State *L, const osgIntrospection::Value &original) { + bool pushIfTypeIs(lua_State *L, const osgIntrospection::Value &original) { static const osgIntrospection::Type& testType = - osgIntrospection::Reflection::getType(extended_typeid()); + osgIntrospection::Reflection::getType(extended_typeid()); if (original.getType() == testType) { - LuaBasicTypeTraits::push(L, osgIntrospection::getInstance(original)); + ToLua::push(L, osgIntrospection::getInstance(original)); return true; } return false; @@ -190,15 +195,36 @@ namespace osgLua { void Value::push(lua_State *L, const osgIntrospection::Value &original) { - if (detail::tryToPushBasicType(L, original)) { return; } - if (detail::tryToPushBasicType(L, original)) { return; } - if (detail::tryToPushBasicType(L, original)) { return; } - if (detail::tryToPushBasicType(L, original)) { return; } - if (detail::tryToPushBasicType(L, original)) { return; } - if (detail::tryToPushBasicType(L, original)) { return; } - if (detail::tryToPushBasicType(L, original)) { return; } - if (detail::tryToPushBasicType(L, original)) { return; } - if (detail::tryToPushBasicType(L, original)) { return; } + if (detail::pushIfTypeIs(L, original)) { + return; + } + + if (detail::pushIfTypeIs(L, original)) { + return; + } + if (detail::pushIfTypeIs(L, original)) { + return; + } + if (detail::pushIfTypeIs(L, original)) { + return; + } + + if (detail::pushIfTypeIs(L, original)) { + return; + } + if (detail::pushIfTypeIs(L, original)) { + return; + } + if (detail::pushIfTypeIs(L, original)) { + return; + } + + if (detail::pushIfTypeIs(L, original)) { + return; + } + if (detail::pushIfTypeIs(L, original)) { + return; + } // if not is a basic type... // create a userdata From 81718136f51db4ebcb99185f2258a462fbc7bc95 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Fri, 15 Apr 2011 10:46:03 -0500 Subject: [PATCH 059/348] astyle on value.cpp --- third-party/osgLua/src/osgLua/Value.cpp | 36 ++++++++++++++----------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/third-party/osgLua/src/osgLua/Value.cpp b/third-party/osgLua/src/osgLua/Value.cpp index 37a4e3b0..b8cddd86 100644 --- a/third-party/osgLua/src/osgLua/Value.cpp +++ b/third-party/osgLua/src/osgLua/Value.cpp @@ -153,12 +153,13 @@ namespace osgLua { osgIntrospection::Value getValue(lua_State *L, int index) { int top = lua_gettop(L); - index = (index>0)? index : top + index + 1; + index = (index > 0) ? index : top + index + 1; if (lua_isuserdata(L, index)) { Value *v = Value::get(L, index); - if (v) return v->get(); - else { + if (v) { + return v->get(); + } else { luaL_error(L, "userdata can not be used as osgIntrospection::Value"); } @@ -242,23 +243,23 @@ namespace osgLua { Value* Value::get(lua_State *L, int index) { int top = lua_gettop(L); - index = (index>0)? index : top + index + 1; + index = (index > 0) ? index : top + index + 1; if (_hasOsgLuaValueMetatable(L, index)) { - Value *v = _rawGet(L,index); - lua_settop(L,top); + Value *v = _rawGet(L, index); + lua_settop(L, top); return v; } - lua_settop(L,top); + lua_settop(L, top); return 0; } Value* Value::getRequired(lua_State *L, int index) { - Value *a = Value::get(L,index); + Value *a = Value::get(L, index); if (a == 0) { luaL_error(L, "%s:%d Expected a osgLua userdata but get %s", - __FILE__,__LINE__, lua_typename(L,lua_type(L, index))) ; + __FILE__, __LINE__, lua_typename(L, lua_type(L, index))) ; } return a; } @@ -266,12 +267,13 @@ namespace osgLua { int Value::getTypeInfo(lua_State *L) { const osgIntrospection::Type *type = 0; - Value *v = Value::get(L,1); - if (v) type = &(v->getType()); - else if (lua_isstring(L,1)) { + Value *v = Value::get(L, 1); + if (v) { + type = &(v->getType()); + } else if (lua_isstring(L, 1)) { try { const osgIntrospection::Type &t = - osgIntrospection::Reflection::getType(lua_tostring(L,1)); + osgIntrospection::Reflection::getType(lua_tostring(L, 1)); type = &t; } catch (osgIntrospection::TypeNotFoundException&) { return 0; @@ -296,9 +298,11 @@ namespace osgLua { for (osgIntrospection::TypeMap::const_iterator i = map.begin(); i != map.end(); ++i) { osgIntrospection::Type *type = i->second; - if (!type->isDefined() || type->isPointer()) continue; + if (!type->isDefined() || type->isPointer()) { + continue; + } lua_pushstring(L, type->getQualifiedName().c_str()); - lua_rawseti(L,-2,counter); + lua_rawseti(L, -2, counter); counter++; } @@ -322,7 +326,7 @@ namespace osgLua { Value::push(L, returnedval); return 1; } catch (osgIntrospection::Exception &e) { - luaL_error(L,"[%s:%d] %s",__FILE__,__LINE__,e.what().c_str()); + luaL_error(L, "[%s:%d] %s", __FILE__, __LINE__, e.what().c_str()); } return 0; } From 4f0c8cf26eb138cd953d25376249bf080032ac49 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Fri, 15 Apr 2011 11:08:05 -0500 Subject: [PATCH 060/348] Switch the print function from stdout to the gui console only once the console signals that it is ready. --- vrjugglua/LuaConsole.cpp | 7 +++++-- vrjugglua/LuaConsole.h | 2 ++ vrjugglua/LuaScript.cpp | 7 ++++--- vrjugglua/fltk-console/FLTKConsole.cpp | 1 + vrjugglua/qt-console/QTConsole.cpp | 7 +++++++ vrjugglua/qt-console/QTConsole.h | 1 + 6 files changed, 20 insertions(+), 5 deletions(-) diff --git a/vrjugglua/LuaConsole.cpp b/vrjugglua/LuaConsole.cpp index 118ea291..c7b5e922 100644 --- a/vrjugglua/LuaConsole.cpp +++ b/vrjugglua/LuaConsole.cpp @@ -51,7 +51,6 @@ LuaConsole::LuaConsole() : std::cout << "In constructor " << __FUNCTION__ << " at " << __FILE__ << ":" << __LINE__ << " with this=" << this << std::endl; #endif s_console = this; - _script.setPrintFunction(consolePrintFunction); // A new script context is automatically created } @@ -62,7 +61,6 @@ LuaConsole::LuaConsole(LuaScript const& script) : std::cout << "In constructor " << __FUNCTION__ << " at " << __FILE__ << ":" << __LINE__ << " with this=" << this << std::endl; #endif s_console = this; - _script.setPrintFunction(consolePrintFunction); // Using existing (provided) script context } @@ -195,6 +193,10 @@ LuaScript& LuaConsole::getScript() { return _script; } +void LuaConsole::_consoleIsReady() { + _script.setPrintFunction(consolePrintFunction); +} + void StubConsole::setup(int & argc, char * argv[]) { VRJLUA_MSG_START(dbgVRJLUA_CONSOLE, MSG_STATUS) @@ -229,6 +231,7 @@ StubConsole::~StubConsole() { } bool StubConsole::threadLoop() { + _consoleIsReady(); VRJLUA_MSG_START(dbgVRJLUA_CONSOLE, MSG_STATUS) << "StubConsole::threadLoop called - joining the kernel thread because we're a stub." << VRJLUA_MSG_END(dbgVRJLUA_CONSOLE, MSG_STATUS); diff --git a/vrjugglua/LuaConsole.h b/vrjugglua/LuaConsole.h index 9dba5e94..8ee26da7 100644 --- a/vrjugglua/LuaConsole.h +++ b/vrjugglua/LuaConsole.h @@ -73,6 +73,8 @@ class LuaConsole { static LuaConsole * getConsole(); protected: + /// Call from subclasses to switch print function to the GUI Console print. + void _consoleIsReady(); static LuaConsole * s_console; bool _loggingActive; diff --git a/vrjugglua/LuaScript.cpp b/vrjugglua/LuaScript.cpp index b20e415e..1d6fe48f 100644 --- a/vrjugglua/LuaScript.cpp +++ b/vrjugglua/LuaScript.cpp @@ -297,11 +297,12 @@ void LuaScript::initVrjKernelAsClusterSecondary(int port) { } void LuaScript::doPrint(std::string const& str) { - VRJLUA_MSG_START(dbgVRJLUA_APP, MSG_STATUS) - << str - << VRJLUA_MSG_END(dbgVRJLUA_APP, MSG_STATUS); if (_printFunc) { _printFunc(str); + } else { + VRJLUA_MSG_START(dbgVRJLUA_APP, MSG_STATUS) + << str + << VRJLUA_MSG_END(dbgVRJLUA_APP, MSG_STATUS); } } diff --git a/vrjugglua/fltk-console/FLTKConsole.cpp b/vrjugglua/fltk-console/FLTKConsole.cpp index c0527bcb..b5d19c24 100644 --- a/vrjugglua/fltk-console/FLTKConsole.cpp +++ b/vrjugglua/fltk-console/FLTKConsole.cpp @@ -168,6 +168,7 @@ bool FLTKConsole::threadLoop() { _running = true; bool ret = true; + _consoleIsReady(); while (_running && vrj::Kernel::instance()->isRunning()) { // Do the FLTK loop ret = _doThreadWork(); diff --git a/vrjugglua/qt-console/QTConsole.cpp b/vrjugglua/qt-console/QTConsole.cpp index 734c8bdb..f6dd856d 100644 --- a/vrjugglua/qt-console/QTConsole.cpp +++ b/vrjugglua/qt-console/QTConsole.cpp @@ -202,6 +202,9 @@ bool QTConsole::threadLoop() { _ui->actionShow_debug_log->setEnabled(false); } + /// Once GUI is ready, tell the console base class to redirect print statements. + QTimer::singleShot(0, this, SLOT(consoleReady())); + show(); _app->exec(); @@ -230,6 +233,10 @@ void QTConsole::setTitle(std::string const& title) { setWindowTitle(QString::fromStdString(title)); } +void QTConsole::consoleReady() { + _consoleIsReady(); +} + void QTConsole::disableAction() { appendToDisplay("-- Disabling interaction console GUI on this node..."); Q_EMIT disableGUISignal(); diff --git a/vrjugglua/qt-console/QTConsole.h b/vrjugglua/qt-console/QTConsole.h index 247b0ce4..c00e6a6e 100644 --- a/vrjugglua/qt-console/QTConsole.h +++ b/vrjugglua/qt-console/QTConsole.h @@ -84,6 +84,7 @@ class QTConsole : public QMainWindow, boost::noncopyable, public LuaConsole { void updateDebugLog(); void addTextToDisplay(QString const& message); void disableGUIAction(); + void consoleReady(); protected: void _shared_init(); From 247bbe517c41982feb08b6b2c66c6f58d6ffca8f Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Mon, 25 Apr 2011 15:57:53 -0500 Subject: [PATCH 061/348] Fix doxygen include paths --- Doxyfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doxyfile b/Doxyfile index 989233a9..35e836ff 100644 --- a/Doxyfile +++ b/Doxyfile @@ -133,7 +133,7 @@ STRIP_FROM_PATH = # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. -STRIP_FROM_INC_PATH = +STRIP_FROM_INC_PATH = . # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful if your file system From 390c6fd6bf33c4da013f2c3b2142781cd6f006a8 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Mon, 2 May 2011 17:16:51 -0500 Subject: [PATCH 062/348] fix crash on osg.PositionAttitudeTransform():getPostition() Thanks to Leif for running across this one. --- third-party/osgLua/src/osgLua/Value_metamethod_members.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/third-party/osgLua/src/osgLua/Value_metamethod_members.cpp b/third-party/osgLua/src/osgLua/Value_metamethod_members.cpp index c5af2854..69c14d3e 100644 --- a/third-party/osgLua/src/osgLua/Value_metamethod_members.cpp +++ b/third-party/osgLua/src/osgLua/Value_metamethod_members.cpp @@ -115,7 +115,7 @@ namespace osgLua { } */ - if (!method) { + if (!method && vl.size() > 0) { if (vl.back().getType().isNonConstPointer() && vl.back().getInstanceType().isSubclassOf(osgIntrospection::Reflection::getType("osg::NodeVisitor"))) { // OK, we have a pointer to a visitor, let's search again after dereferencing From 783e63ef18d2949875435068084d0cf8d794eb45 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Mon, 2 May 2011 17:17:05 -0500 Subject: [PATCH 063/348] add a test to keep the "getPostition" bug fixed. --- tests/CMakeLists.txt | 1 + tests/luatests/osglua-missingmethod.lua | 9 +++++++++ 2 files changed, 10 insertions(+) create mode 100644 tests/luatests/osglua-missingmethod.lua diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 250c32c2..41a9dad2 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -22,6 +22,7 @@ set(LUA_TEST_SCRIPTS osg-accept-visitor osglua-enums osglua-matrixmath + osglua-missingmethod osglua-props osglua-vectormath) diff --git a/tests/luatests/osglua-missingmethod.lua b/tests/luatests/osglua-missingmethod.lua new file mode 100644 index 00000000..0fcffa78 --- /dev/null +++ b/tests/luatests/osglua-missingmethod.lua @@ -0,0 +1,9 @@ + +print("CTEST_FULL_OUTPUT") +val, message = pcall(function() + osg.PositionAttitudeTransform():getPostition() +end) + +print("val = " .. tostring(val)) +print("message = " .. tostring(message)) +print("Done!") From 052dddf175e9a4f692a83868c91a09067ab0b1e1 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Mon, 2 May 2011 18:15:28 -0500 Subject: [PATCH 064/348] add a test for dot-not-colon, which will fail for now --- tests/CMakeLists.txt | 1 + tests/luatests/osglua-dotnotcolon.lua | 9 +++++++++ 2 files changed, 10 insertions(+) create mode 100644 tests/luatests/osglua-dotnotcolon.lua diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 41a9dad2..be751a51 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -20,6 +20,7 @@ set(LUA_TEST_SCRIPTS osgapp-delegate-initdevices osgapp-delegate-devicedata osg-accept-visitor + osglua-dotnotcolon osglua-enums osglua-matrixmath osglua-missingmethod diff --git a/tests/luatests/osglua-dotnotcolon.lua b/tests/luatests/osglua-dotnotcolon.lua new file mode 100644 index 00000000..ec088053 --- /dev/null +++ b/tests/luatests/osglua-dotnotcolon.lua @@ -0,0 +1,9 @@ + +print("CTEST_FULL_OUTPUT") +val, message = pcall(function() + osg.PositionAttitudeTransform().getPosition() +end) + +print("val = " .. tostring(val)) +print("message = " .. tostring(message)) +print("Done!") From 78b61dee8be151b75abf9218f1cc4d2e0cfe03d9 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Fri, 3 Jun 2011 16:39:28 -0500 Subject: [PATCH 065/348] only use readline if we find it --- third-party/lua-5.1.4/src/CMakeLists.txt | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/third-party/lua-5.1.4/src/CMakeLists.txt b/third-party/lua-5.1.4/src/CMakeLists.txt index 81ac216e..fdd1c8ca 100644 --- a/third-party/lua-5.1.4/src/CMakeLists.txt +++ b/third-party/lua-5.1.4/src/CMakeLists.txt @@ -72,14 +72,16 @@ if(WIN32) elseif(APPLE) add_definitions(-DLUA_USE_MACOSX) else() # Linux - add_definitions(-DLUA_USE_LINUX) - find_library(READLINE_LIBRARY NAMES readline) find_package(Curses) - - list(APPEND LUA_EXTRA_LIBS ${READLINE_LIBRARY} ${CURSES_LIBRARIES}) + if(READLINE_LIBRARY AND CURSES_FOUND) + list(APPEND LUA_EXTRA_LIBS ${READLINE_LIBRARY} ${CURSES_LIBRARIES}) + add_definitions(-DLUA_USE_LINUX) + else() + add_definitions(-DLUA_USE_POSIX -DLUA_USE_DLOPEN) + endif() endif() if(CMAKE_DL_LIBS) From a60312fb77838b629e53d96e0a06bf26550d4b9c Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Fri, 3 Jun 2011 16:40:18 -0500 Subject: [PATCH 066/348] add a test that goes through all osg wrappers --- tests/CMakeLists.txt | 1 + tests/luatests/osglua-allwrappers.lua | 48 +++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 tests/luatests/osglua-allwrappers.lua diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index be751a51..34aeb8be 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -20,6 +20,7 @@ set(LUA_TEST_SCRIPTS osgapp-delegate-initdevices osgapp-delegate-devicedata osg-accept-visitor + osglua-allwrappers osglua-dotnotcolon osglua-enums osglua-matrixmath diff --git a/tests/luatests/osglua-allwrappers.lua b/tests/luatests/osglua-allwrappers.lua new file mode 100644 index 00000000..f6ce5a40 --- /dev/null +++ b/tests/luatests/osglua-allwrappers.lua @@ -0,0 +1,48 @@ +function showInfo(instance) + local c = osgLua.getTypeInfo(instance) + if c then + print("name = ",c.name) + for i,v in ipairs(c.constructors) do + print(string.format("\tconstructor(%2d) %s",i,v)) + end + for i,v in ipairs(c.methods) do + print(string.format("\tmethod(%2d) %s",i,v)) + end + else + print(instance.." ** not found **") + end +end + +print("CTEST_FULL_OUTPUT") + +-- generated with: +-- ls osgwrapper_*|sed s/osgwrapper_/\"/ | sed s/.so/\"\;/ +wrappers = { +"OpenThreads"; +"osgDB"; +"osgFX"; +"osgGA"; +"osgManipulator"; +"osgParticle"; +"osgShadow"; +"osgSim"; +"osg"; +"osgTerrain"; +"osgText"; +"osgUtil"; +"osgViewer"; +"osgVolume"; +"osgWidget"; +} + +for _, wrapper in ipairs(wrappers) do + print("Loading wrapper for " .. wrapper) + osgLua.loadWrapper(wrapper) +end +print("Wrapper loading done, will dump info.") + +types = osgLua.getTypes() +for t,d in ipairs( types ) do + showInfo(d) +end + From 49a0f718329e41ee33be8716708d75755ac372eb Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Fri, 3 Jun 2011 16:51:11 -0500 Subject: [PATCH 067/348] make sure we find fluid if building fltk --- CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5b8e00d5..0f85b7cc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -173,6 +173,9 @@ endif() if(BUILD_FLTK_GUI) set(CMAKE_FIND_APPBUNDLE NEVER) # Don't find Fluid.app the single-site browser find_package(FLTK REQUIRED) + if(NOT FLUID_EXECUTABLE) + message(FATAL_ERROR "Could not find the FLTK Fluid UI design tool!") + endif() endif() # Qt From 7154249dc2effcc2dec8d7e98c85d4fc324551f7 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Fri, 3 Jun 2011 16:53:00 -0500 Subject: [PATCH 068/348] fix that last commit - had the name wrong --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0f85b7cc..8fb97f2b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -173,7 +173,7 @@ endif() if(BUILD_FLTK_GUI) set(CMAKE_FIND_APPBUNDLE NEVER) # Don't find Fluid.app the single-site browser find_package(FLTK REQUIRED) - if(NOT FLUID_EXECUTABLE) + if(NOT FLTK_FLUID_EXECUTABLE) message(FATAL_ERROR "Could not find the FLTK Fluid UI design tool!") endif() endif() From 41adf51acdc32312ddd577fdc6a59aa1b75422f4 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Mon, 6 Jun 2011 15:41:34 -0500 Subject: [PATCH 069/348] add jenkins ctest plugin submodule --- .gitmodules | 3 +++ util/jenkins-ctest-plugin | 1 + 2 files changed, 4 insertions(+) create mode 100644 .gitmodules create mode 160000 util/jenkins-ctest-plugin diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..1ce73e3c --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "util/jenkins-ctest-plugin"] + path = util/jenkins-ctest-plugin + url = git://github.com/rpavlik/jenkins-ctest-plugin.git diff --git a/util/jenkins-ctest-plugin b/util/jenkins-ctest-plugin new file mode 160000 index 00000000..6b6f3d7c --- /dev/null +++ b/util/jenkins-ctest-plugin @@ -0,0 +1 @@ +Subproject commit 6b6f3d7c4425d494df36a3ed6aba03648ce449aa From f2d8a31778e965b4095300f4a74b16d188a73274 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Mon, 6 Jun 2011 15:44:46 -0500 Subject: [PATCH 070/348] remove imported submodules file from docstring --- third-party/lua_modules/lua-docstring/.gitmodules | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 third-party/lua_modules/lua-docstring/.gitmodules diff --git a/third-party/lua_modules/lua-docstring/.gitmodules b/third-party/lua_modules/lua-docstring/.gitmodules deleted file mode 100644 index 6ef197de..00000000 --- a/third-party/lua_modules/lua-docstring/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "lunatest"] - path = lunatest - url = https://github.com/silentbicycle/lunatest.git From 71813e9966ac37f63215a1c583481545a8ae1277 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Mon, 6 Jun 2011 15:49:16 -0500 Subject: [PATCH 071/348] Fix lunatest --- .gitmodules | 3 +++ third-party/lua_modules/lua-docstring/lunatest | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitmodules b/.gitmodules index 1ce73e3c..154c1c22 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "util/jenkins-ctest-plugin"] path = util/jenkins-ctest-plugin url = git://github.com/rpavlik/jenkins-ctest-plugin.git +[submodule "third-party/lua_modules/lua-docstring/lunatest"] + path = third-party/lua_modules/lua-docstring/lunatest + url = git://github.com/silentbicycle/lunatest.git diff --git a/third-party/lua_modules/lua-docstring/lunatest b/third-party/lua_modules/lua-docstring/lunatest index 250ae943..d75aadde 160000 --- a/third-party/lua_modules/lua-docstring/lunatest +++ b/third-party/lua_modules/lua-docstring/lunatest @@ -1 +1 @@ -Subproject commit 250ae9431be61f073cbcfa450bca262f8540f350 +Subproject commit d75aadde95e196e943d75eec75a16aed87bc92cf From 1c6fe6e33d9dbae388b2c9b389e42f2373e515f1 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Mon, 6 Jun 2011 15:53:37 -0500 Subject: [PATCH 072/348] update jenkins ctest submodule --- util/jenkins-ctest-plugin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/util/jenkins-ctest-plugin b/util/jenkins-ctest-plugin index 6b6f3d7c..d9fc5102 160000 --- a/util/jenkins-ctest-plugin +++ b/util/jenkins-ctest-plugin @@ -1 +1 @@ -Subproject commit 6b6f3d7c4425d494df36a3ed6aba03648ce449aa +Subproject commit d9fc5102a126a772f75f8701f6f11da0c5a7ab80 From 032f0a566453b34ff14b828f3f48a921c613f363 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Mon, 6 Jun 2011 16:02:05 -0500 Subject: [PATCH 073/348] another jenkins update --- util/jenkins-ctest-plugin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/util/jenkins-ctest-plugin b/util/jenkins-ctest-plugin index d9fc5102..869027d6 160000 --- a/util/jenkins-ctest-plugin +++ b/util/jenkins-ctest-plugin @@ -1 +1 @@ -Subproject commit d9fc5102a126a772f75f8701f6f11da0c5a7ab80 +Subproject commit 869027d6c7f10c10f7699fd32695efc6952748e2 From 4ff173f100ca202ca6abef75cb60b35cc1d605c4 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Mon, 6 Jun 2011 16:16:18 -0500 Subject: [PATCH 074/348] update jenkins ctest --- util/jenkins-ctest-plugin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/util/jenkins-ctest-plugin b/util/jenkins-ctest-plugin index 869027d6..5d319203 160000 --- a/util/jenkins-ctest-plugin +++ b/util/jenkins-ctest-plugin @@ -1 +1 @@ -Subproject commit 869027d6c7f10c10f7699fd32695efc6952748e2 +Subproject commit 5d3192034b989bfec35257939b48bcd67a5da234 From a1dddbf5cad8a2d13454c6d14c412b7d79e6f653 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Mon, 6 Jun 2011 16:31:49 -0500 Subject: [PATCH 075/348] jenkins ctest --- util/jenkins-ctest-plugin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/util/jenkins-ctest-plugin b/util/jenkins-ctest-plugin index 5d319203..ba1af853 160000 --- a/util/jenkins-ctest-plugin +++ b/util/jenkins-ctest-plugin @@ -1 +1 @@ -Subproject commit 5d3192034b989bfec35257939b48bcd67a5da234 +Subproject commit ba1af8531e818c97e58bb3d1a3292a44b2f95235 From 10e0b074ee0b3db113c878dab1edd26667e68195 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Wed, 8 Jun 2011 10:31:20 -0500 Subject: [PATCH 076/348] add a missing include --- vrjugglua/LuaPath.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/vrjugglua/LuaPath.cpp b/vrjugglua/LuaPath.cpp index 0d9d3d72..72b9f762 100644 --- a/vrjugglua/LuaPath.cpp +++ b/vrjugglua/LuaPath.cpp @@ -23,6 +23,7 @@ #include #include +#include // for __VJ_version define // Standard includes #include From 0fb18e0612ed54065b6eab1a0b610d35dfcdb11f Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Thu, 9 Jun 2011 10:57:33 -0500 Subject: [PATCH 077/348] remove duplication in property handling code in osglua --- .../src/osgLua/Value_metamethod_members.cpp | 76 +++++++++---------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/third-party/osgLua/src/osgLua/Value_metamethod_members.cpp b/third-party/osgLua/src/osgLua/Value_metamethod_members.cpp index 69c14d3e..b8bb4f82 100644 --- a/third-party/osgLua/src/osgLua/Value_metamethod_members.cpp +++ b/third-party/osgLua/src/osgLua/Value_metamethod_members.cpp @@ -44,6 +44,19 @@ namespace osgLua { return 0; } + static const osgIntrospection::PropertyInfo * lookupProperty(const osgIntrospection::Type &type, std::string const& memName) { + osgIntrospection::PropertyInfoList props; + type.getAllProperties(props); + if (props.size() > 0) { + for (unsigned int i = 0; i < props.size(); ++i) { + if (props[i]->getName() == memName) { + return props[i]; + } + } + } + return NULL; + } + int Value::_index(lua_State *L) { Value *v = _rawGet(L,1); if (lua_isstring(L,2)) { @@ -54,28 +67,22 @@ namespace osgLua { } //std::string cname = type.getQualifiedName(); - const char * memberName = lua_tostring(L, 2); - std::string memName(memberName); - osgIntrospection::PropertyInfoList props; - type.getAllProperties(props); - if (props.size() > 0) { - for (unsigned int i = 0; i < props.size(); ++i) { - if (props[i]->getName() == memName) { - if (props[i]->isIndexed()) { - /// @todo implement indexed properties - luaL_error(L, "Indexed properties are not yet implemented in osgLua"); - } else if (!props[i]->canGet()) { - luaL_error(L, "Property %s defined as not gettable", props[i]->getName().c_str()); - } else { - //std::cout << "Getting a property named " << props[i]->getName() << std::endl; - osgIntrospection::Value propVal = props[i]->getValue(v->get()); - Value::push(L, propVal); - return 1; - } - } + const osgIntrospection::PropertyInfo * prop = lookupProperty(type, lua_tostring(L, 2)); + if (prop) { + if (prop->isIndexed()) { + /// @todo implement indexed properties + luaL_error(L, "Indexed properties are not yet implemented in osgLua"); + } else if (!prop->canGet()) { + luaL_error(L, "Property %s defined as not gettable", prop->getName().c_str()); + } else { + //std::cout << "Getting a property named " << props[i]->getName() << std::endl; + osgIntrospection::Value propVal = prop->getValue(v->get()); + Value::push(L, propVal); + return 1; } } + // OK, it's not a property, assume it's a method. lua_pushvalue(L,2); // copy the name lua_pushcclosure(L, Value::_methodCall,1); return 1; @@ -171,28 +178,21 @@ namespace osgLua { } //std::string cname = type.getQualifiedName(); - const char * memberName = lua_tostring(L, 2); - std::string memName(memberName); - osgIntrospection::PropertyInfoList props; - type.getAllProperties(props); - if (props.size() > 0) { - for (unsigned int i = 0; i < props.size(); ++i) { - if (props[i]->getName() == memName) { - if (props[i]->isIndexed()) { - /// @todo implement indexed properties - luaL_error(L, "Indexed properties are not yet implemented in osgLua"); - } else if (!props[i]->canSet()) { - luaL_error(L, "Property %s defined as not settable", props[i]->getName().c_str()); - } else { - std::cout << "Setting a property named " << props[i]->getName() << std::endl; - props[i]->setValue(v->get(), newVal->get()); - return 0; - } - } + const osgIntrospection::PropertyInfo * prop = lookupProperty(type, lua_tostring(L, 2)); + if (prop) { + if (prop->isIndexed()) { + /// @todo implement indexed properties + luaL_error(L, "Indexed properties are not yet implemented in osgLua"); + } else if (!prop->canSet()) { + luaL_error(L, "Property %s defined as not settable", prop->getName().c_str()); + } else { + std::cout << "Setting a property named " << prop->getName() << std::endl; + prop->setValue(v->get(), newVal->get()); + return 0; } } - luaL_error(L, "No property %s defined in %s", memberName, type.getQualifiedName().c_str()); + luaL_error(L, "No property %s defined in %s", lua_tostring(L, 2), type.getQualifiedName().c_str()); } // maybe ... if is an integer... access indexed data From 556a7d5b466654631f444dd28399a690cec1c4a0 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Thu, 9 Jun 2011 11:04:54 -0500 Subject: [PATCH 078/348] remove major duplication of code in the matrix templates - comparisons are very similar --- .../osgLua/src/osgLua/MatrixTemplates.h | 36 +++++++------------ 1 file changed, 12 insertions(+), 24 deletions(-) diff --git a/third-party/osgLua/src/osgLua/MatrixTemplates.h b/third-party/osgLua/src/osgLua/MatrixTemplates.h index 2cee211a..588d5b74 100644 --- a/third-party/osgLua/src/osgLua/MatrixTemplates.h +++ b/third-party/osgLua/src/osgLua/MatrixTemplates.h @@ -34,6 +34,8 @@ #include #include +#include + namespace osgLua { @@ -110,8 +112,9 @@ namespace osgLua { return 0; } - template - int eq(lua_State *L) { + /// Shared function template to handle both equality and less-than comparison. + template + int apply_binary_bool_predicate(lua_State *L, FunctorType predicate) { Value *a = Value::getRequired(L,1); Value *b = Value::getRequired(L,2); @@ -121,12 +124,10 @@ namespace osgLua { static const osgIntrospection::Type& myType = osgIntrospection::Reflection::getType(extended_typeid()); if (typeA == myType && typeB == myType) { - bool ret = (osgIntrospection::variant_cast(a->get()) == osgIntrospection::variant_cast(b->get())); + bool ret = predicate(osgIntrospection::variant_cast(a->get()), osgIntrospection::variant_cast(b->get())); lua_pushboolean(L, ret); return 1; } else { - /// @todo figure out why line 11 in osglua-matrixmath.lua fails without this - //return value_metamethods::eq(L); luaL_error(L,"[%s:%d] Could not compare instances of %s, %s, in comparator for %s",__FILE__,__LINE__, typeA.getQualifiedName().c_str(), typeB.getQualifiedName().c_str(), @@ -136,26 +137,13 @@ namespace osgLua { } template - int lt(lua_State *L) { - Value *a = Value::getRequired(L,1); - Value *b = Value::getRequired(L,2); - - const osgIntrospection::Type &typeA = a->getType(); - const osgIntrospection::Type &typeB = b->getType(); + int eq(lua_State *L) { + return apply_binary_bool_predicate(L, std::equal_to()); + } - static const osgIntrospection::Type& myType = - osgIntrospection::Reflection::getType(extended_typeid()); - if (typeA == myType && typeB == myType) { - bool ret = (osgIntrospection::variant_cast(a->get()) < osgIntrospection::variant_cast(b->get())); - lua_pushboolean(L, ret); - return 1; - } else { - luaL_error(L,"[%s:%d] Could not compare instances of %s, %s, in comparator for %s",__FILE__,__LINE__, - typeA.getQualifiedName().c_str(), - typeB.getQualifiedName().c_str(), - myType.getQualifiedName().c_str()); - } - return 0; + template + int lt(lua_State *L) { + return apply_binary_bool_predicate(L, std::less()); } template From 06fae001e46fc7afcd8678c54aec54f4ade66b16 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Thu, 9 Jun 2011 11:05:19 -0500 Subject: [PATCH 079/348] remove major duplication in vector math - addition and subtraction are very similar --- .../osgLua/src/osgLua/VectorTemplates.h | 41 +++++-------------- 1 file changed, 11 insertions(+), 30 deletions(-) diff --git a/third-party/osgLua/src/osgLua/VectorTemplates.h b/third-party/osgLua/src/osgLua/VectorTemplates.h index cdaeded3..c2498cca 100644 --- a/third-party/osgLua/src/osgLua/VectorTemplates.h +++ b/third-party/osgLua/src/osgLua/VectorTemplates.h @@ -30,16 +30,6 @@ namespace osgLua { namespace detail { - template - T addVectors(osgIntrospection::Value const& a, osgIntrospection::Value const& b) { - return osgIntrospection::variant_cast(a) + osgIntrospection::variant_cast(b); - } - - template - T subtractVectors(osgIntrospection::Value const& a, osgIntrospection::Value const& b) { - return osgIntrospection::variant_cast(a) - osgIntrospection::variant_cast(b); - } - template T scaleVector(osgIntrospection::Value const& vector, double scalar) { return osgIntrospection::variant_cast(vector) * scalar; @@ -49,8 +39,9 @@ namespace osgLua { namespace Vector { - template - int add(lua_State *L) { + /// Shared function template to handle both addition and subtraction. + template + int apply_binary_typed_predicate(lua_State *L, FunctorType predicate) { Value *a = Value::getRequired(L,1); Value *b = Value::getRequired(L,2); @@ -60,33 +51,23 @@ namespace osgLua { static const osgIntrospection::Type& myType = osgIntrospection::Reflection::getType(extended_typeid()); if (typeA == myType && typeB == myType) { - osgIntrospection::Value ret = detail::addVectors(a->get(), b->get()); + osgIntrospection::Value ret = predicate(osgIntrospection::variant_cast(a->get()), osgIntrospection::variant_cast(b->get())); Value::push(L, ret); return 1; } else { - luaL_error(L,"[%s:%d] Could not add instance of %s, %s",__FILE__,__LINE__, typeA.getQualifiedName().c_str(), typeB.getQualifiedName().c_str()); + luaL_error(L,"[%s:%d] Could not perform math on instance of %s, %s",__FILE__,__LINE__, typeA.getQualifiedName().c_str(), typeB.getQualifiedName().c_str()); } return 0; } template - int sub(lua_State *L) { - Value *a = Value::getRequired(L,1); - Value *b = Value::getRequired(L,2); - - const osgIntrospection::Type &typeA = a->getType(); - const osgIntrospection::Type &typeB = b->getType(); + int add(lua_State *L) { + return apply_binary_typed_predicate(L, std::plus()); + } - static const osgIntrospection::Type& myType = - osgIntrospection::Reflection::getType(extended_typeid()); - if (typeA == myType && typeB == myType) { - osgIntrospection::Value ret = detail::subtractVectors(a->get(), b->get()); - Value::push(L, ret); - return 1; - } else { - luaL_error(L,"[%s:%d] Could not subtract instance of %s, %s",__FILE__,__LINE__, typeA.getQualifiedName().c_str(), typeB.getQualifiedName().c_str()); - } - return 0; + template + int sub(lua_State *L) { + return apply_binary_typed_predicate(L, std::minus()); } template From dc63d9ac6c2621a3d8e8f65bada4c0883c7cb21f Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Thu, 9 Jun 2011 12:00:37 -0500 Subject: [PATCH 080/348] jenkins ctest --- util/jenkins-ctest-plugin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/util/jenkins-ctest-plugin b/util/jenkins-ctest-plugin index ba1af853..63a4a827 160000 --- a/util/jenkins-ctest-plugin +++ b/util/jenkins-ctest-plugin @@ -1 +1 @@ -Subproject commit ba1af8531e818c97e58bb3d1a3292a44b2f95235 +Subproject commit 63a4a82773f2b6230fc0e9f246dbeeb1d66732e8 From 083060a74c4a25d711db598be4ae01e395dace8c Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Mon, 13 Jun 2011 11:28:38 -0500 Subject: [PATCH 081/348] fix warning when building with a luabind header --- third-party/luabind/luabind/detail/policy.hpp | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/third-party/luabind/luabind/detail/policy.hpp b/third-party/luabind/luabind/detail/policy.hpp index 8a040d46..54c3f8f6 100644 --- a/third-party/luabind/luabind/detail/policy.hpp +++ b/third-party/luabind/luabind/detail/policy.hpp @@ -207,7 +207,7 @@ namespace luabind { namespace detail void* result; - int const consumed_args(...) + int consumed_args(...) const { return 1; } @@ -260,7 +260,7 @@ namespace luabind { namespace detail typedef value_converter type; typedef mpl::false_ is_native; - int const consumed_args(...) + int consumed_args(...) const { return 1; } @@ -312,7 +312,7 @@ namespace luabind { namespace detail typedef const_pointer_converter type; typedef mpl::false_ is_native; - int const consumed_args(...) + int consumed_args(...) const { return 1; } @@ -368,7 +368,7 @@ namespace luabind { namespace detail typedef ref_converter type; typedef mpl::false_ is_native; - int const consumed_args(...) + int consumed_args(...) const { return 1; } @@ -414,7 +414,7 @@ namespace luabind { namespace detail typedef const_ref_converter type; typedef mpl::false_ is_native; - int const consumed_args(...) + int consumed_args(...) const { return 1; } @@ -466,7 +466,7 @@ namespace luabind { namespace detail typedef enum_converter type; typedef mpl::true_ is_native; - int const consumed_args(...) + int consumed_args(...) const { return 1; } @@ -510,7 +510,7 @@ namespace luabind { namespace detail typedef value_wrapper_converter type; typedef mpl::true_ is_native; - int const consumed_args(...) + int consumed_args(...) const { return 1; } @@ -593,7 +593,7 @@ struct native_converter_base { typedef boost::mpl::true_ is_native; - int const consumed_args(...) + int consumed_args(...) const { return 1; } @@ -768,7 +768,7 @@ struct default_converter { typedef boost::mpl::true_ is_native; - int const consumed_args(...) + int consumed_args(...) const { return 1; } @@ -819,7 +819,7 @@ struct default_converter template <> struct default_converter { - int const consumed_args(...) + int consumed_args(...) const { return 0; } From d5448f38d968ca6e23152c117151055ee5ecb5df Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Mon, 13 Jun 2011 13:55:39 -0500 Subject: [PATCH 082/348] Update luabind to fix some warnings, tests. --- src/CMakeLists.txt | 4 +++ tests/CMakeLists.txt | 4 +++ third-party/CMakeLists.txt | 27 +++++++++-------- .../luabind/luabind/back_reference_fwd.hpp | 2 ++ third-party/luabind/luabind/detail/pcall.hpp | 2 +- third-party/luabind/luabind/error.hpp | 2 +- third-party/luabind/luabind/from_stack.hpp | 2 ++ .../luabind/luabind/get_main_thread.hpp | 1 + third-party/luabind/luabind/lua_include.hpp | 12 +++++++- third-party/luabind/luabind/lua_state_fwd.hpp | 29 +++++++++++++++++++ third-party/luabind/luabind/open.hpp | 2 ++ third-party/luabind/luabind/operator.hpp | 3 ++ .../luabind/return_reference_to_policy.hpp | 2 ++ third-party/luabind/luabind/tag_function.hpp | 7 ++++- third-party/luabind/luabind/weak_ref.hpp | 2 +- third-party/luabind/src/CMakeLists.txt | 5 ++++ third-party/luabind/test/CMakeLists.txt | 14 +++++++++ .../luabind/test/test_headercompile.cpp.in | 6 ++++ vrjugglua-config-build-tree.cmake.in | 4 +++ vrjugglua-config.cmake.in | 5 ++++ vrjugglua/CMakeLists.txt | 4 +++ 21 files changed, 122 insertions(+), 17 deletions(-) create mode 100644 third-party/luabind/luabind/lua_state_fwd.hpp create mode 100644 third-party/luabind/test/test_headercompile.cpp.in diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index fc918753..bce036c2 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -11,6 +11,10 @@ if(BUILD_EMBEDDED_LUA) add_definitions(-DEMBEDDED_LUA) endif() +if(BUILD_LUA_AS_CPP) + add_definitions(-DLUABIND_CPLUSPLUS_LUA) +endif() + add_definitions(-DOSGLUA_LIBRARY_STATIC) include_directories(${Boost_INCLUDE_DIRS}) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 34aeb8be..78411881 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -3,6 +3,10 @@ # http://academic.cleardefinition.com/ # Iowa State University HCI Graduate Program/VRAC +if(BUILD_LUA_AS_CPP) + add_definitions(-DLUABIND_CPLUSPLUS_LUA) +endif() + set(TESTS_DATA "${CMAKE_CURRENT_SOURCE_DIR}/data") set(LUA_TEST_DIR "${CMAKE_CURRENT_SOURCE_DIR}/luatests") diff --git a/third-party/CMakeLists.txt b/third-party/CMakeLists.txt index fbb5fb8e..25d6aa41 100644 --- a/third-party/CMakeLists.txt +++ b/third-party/CMakeLists.txt @@ -2,6 +2,18 @@ # http://academic.cleardefinition.com/ # Iowa State University HCI Graduate Program/VRAC +if(BUILD_FLTK_GUI) + add_subdirectory(Fl_Native_File_Chooser-0.86) + set(FNFC_LIBRARY ${FNFC_LIBRARY} PARENT_SCOPE) + set(FNFC_INCLUDE_DIRS ${FNFC_INCLUDE_DIRS} PARENT_SCOPE) +endif() + +if(BUILD_QT_GUI) + #add_subdirectory(qconsole2) + #set(QCONSOLE_LIBRARY ${QCONSOLE_LIBRARY} PARENT_SCOPE) + #set(QCONSOLE_INCLUDE_DIRS ${QCONSOLE_INCLUDE_DIRS} PARENT_SCOPE) +endif() + if(BUILD_EMBEDDED_LUA) # Lua 5.1.4-3 (that is, patch level 3) add_subdirectory(lua-5.1.4/src) @@ -11,6 +23,9 @@ if(BUILD_EMBEDDED_LUA) set(LUA_LIBRARIES ${LUA_LIBRARIES} PARENT_SCOPE) set(LUA51_FOUND YES) + if(BUILD_LUA_AS_CPP) + add_definitions(-DLUABIND_CPLUSPLUS_LUA) + endif() add_subdirectory(luabind) set(LUABIND_INCLUDE_DIRS "${CMAKE_CURRENT_SOURCE_DIR}/luabind" ${LUA_INCLUDE_DIRS}) set(LUABIND_INCLUDE_DIRS ${LUABIND_INCLUDE_DIRS} PARENT_SCOPE) @@ -20,18 +35,6 @@ if(BUILD_EMBEDDED_LUA) set(OSGLUA_INCLUDE_DIRS ${OSGLUA_INCLUDE_DIRS} PARENT_SCOPE) endif() -if(BUILD_FLTK_GUI) - add_subdirectory(Fl_Native_File_Chooser-0.86) - set(FNFC_LIBRARY ${FNFC_LIBRARY} PARENT_SCOPE) - set(FNFC_INCLUDE_DIRS ${FNFC_INCLUDE_DIRS} PARENT_SCOPE) -endif() - -if(BUILD_QT_GUI) - #add_subdirectory(qconsole2) - #set(QCONSOLE_LIBRARY ${QCONSOLE_LIBRARY} PARENT_SCOPE) - #set(QCONSOLE_INCLUDE_DIRS ${QCONSOLE_INCLUDE_DIRS} PARENT_SCOPE) -endif() - # Lua stdlib release 15 add_subdirectory(stdlib/modules) diff --git a/third-party/luabind/luabind/back_reference_fwd.hpp b/third-party/luabind/luabind/back_reference_fwd.hpp index ffe141db..b8fea09e 100755 --- a/third-party/luabind/luabind/back_reference_fwd.hpp +++ b/third-party/luabind/luabind/back_reference_fwd.hpp @@ -23,6 +23,8 @@ #ifndef LUABIND_BACK_REFERENCE_FWD_040510_HPP #define LUABIND_BACK_REFERENCE_FWD_040510_HPP +#include + namespace luabind { template diff --git a/third-party/luabind/luabind/detail/pcall.hpp b/third-party/luabind/luabind/detail/pcall.hpp index f0d72b16..e77d7568 100755 --- a/third-party/luabind/luabind/detail/pcall.hpp +++ b/third-party/luabind/luabind/detail/pcall.hpp @@ -25,7 +25,7 @@ #include -struct lua_State; +#include namespace luabind { namespace detail { diff --git a/third-party/luabind/luabind/error.hpp b/third-party/luabind/luabind/error.hpp index b282a411..11ecd66a 100755 --- a/third-party/luabind/luabind/error.hpp +++ b/third-party/luabind/luabind/error.hpp @@ -28,7 +28,7 @@ #include #include -struct lua_State; +#include namespace luabind { diff --git a/third-party/luabind/luabind/from_stack.hpp b/third-party/luabind/luabind/from_stack.hpp index 56bc268d..f9204169 100755 --- a/third-party/luabind/luabind/from_stack.hpp +++ b/third-party/luabind/luabind/from_stack.hpp @@ -23,6 +23,8 @@ #ifndef LUABIND_FROM_STACK_050715_HPP #define LUABIND_FROM_STACK_050715_HPP +#include + namespace luabind { struct from_stack diff --git a/third-party/luabind/luabind/get_main_thread.hpp b/third-party/luabind/luabind/get_main_thread.hpp index f94d6e4b..6b36d74a 100644 --- a/third-party/luabind/luabind/get_main_thread.hpp +++ b/third-party/luabind/luabind/get_main_thread.hpp @@ -6,6 +6,7 @@ # define LUABIND_GET_MAIN_THREAD_090321_HPP # include +# include namespace luabind { diff --git a/third-party/luabind/luabind/lua_include.hpp b/third-party/luabind/luabind/lua_include.hpp index c3a32774..7327b533 100755 --- a/third-party/luabind/luabind/lua_include.hpp +++ b/third-party/luabind/luabind/lua_include.hpp @@ -23,7 +23,17 @@ #ifndef LUA_INCLUDE_HPP_INCLUDED #define LUA_INCLUDE_HPP_INCLUDED -#include +#ifndef LUABIND_CPLUSPLUS_LUA +extern "C" +{ +#endif + + #include "lua.h" + #include "lauxlib.h" + +#ifndef LUABIND_CPLUSPLUS_LUA +} +#endif #endif diff --git a/third-party/luabind/luabind/lua_state_fwd.hpp b/third-party/luabind/luabind/lua_state_fwd.hpp new file mode 100644 index 00000000..57c5025a --- /dev/null +++ b/third-party/luabind/luabind/lua_state_fwd.hpp @@ -0,0 +1,29 @@ +// Copyright (c) 2005 Daniel Wallin and Arvid Norberg + +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following conditions: + +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. + +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +// ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +// TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +// SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR +// ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE +// OR OTHER DEALINGS IN THE SOFTWARE. + +#ifndef LUABIND_STATE_FWD_110613_HPP +#define LUABIND_STATE_FWD_110613_HPP + +struct lua_State; + +#endif // LUABIND_STATE_FWD_110613_HPP + diff --git a/third-party/luabind/luabind/open.hpp b/third-party/luabind/luabind/open.hpp index cca4c7a5..5fe28f40 100755 --- a/third-party/luabind/luabind/open.hpp +++ b/third-party/luabind/luabind/open.hpp @@ -26,6 +26,8 @@ #include +#include + namespace luabind { LUABIND_API void open(lua_State* L); diff --git a/third-party/luabind/luabind/operator.hpp b/third-party/luabind/luabind/operator.hpp index aeb651c0..5b775803 100755 --- a/third-party/luabind/luabind/operator.hpp +++ b/third-party/luabind/luabind/operator.hpp @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -63,6 +64,8 @@ namespace luabind { namespace detail { }} // namespace luabind +#include + namespace luabind { namespace operators { #define BOOST_PP_ITERATION_PARAMS_1 (3, \ diff --git a/third-party/luabind/luabind/return_reference_to_policy.hpp b/third-party/luabind/luabind/return_reference_to_policy.hpp index 1432f79e..5aff5050 100644 --- a/third-party/luabind/luabind/return_reference_to_policy.hpp +++ b/third-party/luabind/luabind/return_reference_to_policy.hpp @@ -23,6 +23,8 @@ #ifndef LUABIND_RETURN_REFERENCE_TO_POLICY_HPP_INCLUDED #define LUABIND_RETURN_REFERENCE_TO_POLICY_HPP_INCLUDED +#include + namespace luabind { namespace detail { template diff --git a/third-party/luabind/luabind/tag_function.hpp b/third-party/luabind/luabind/tag_function.hpp index 51fe97b7..c3f1cd92 100644 --- a/third-party/luabind/luabind/tag_function.hpp +++ b/third-party/luabind/luabind/tag_function.hpp @@ -17,11 +17,16 @@ # include # include +#include + namespace luabind { namespace detail { + struct invoke_context; + struct function_object; + template struct tagged_function { @@ -78,7 +83,7 @@ tag_function(F f) template struct signature_from_function { - typedef BOOST_PP_CAT(mpl::vector, NPLUS1)< + typedef BOOST_PP_CAT(boost::mpl::vector, NPLUS1)< R BOOST_PP_ENUM_TRAILING_PARAMS(N, A) > type; }; diff --git a/third-party/luabind/luabind/weak_ref.hpp b/third-party/luabind/luabind/weak_ref.hpp index e08e250d..af1724cc 100755 --- a/third-party/luabind/luabind/weak_ref.hpp +++ b/third-party/luabind/luabind/weak_ref.hpp @@ -25,7 +25,7 @@ #include -struct lua_State; +#include namespace luabind { diff --git a/third-party/luabind/src/CMakeLists.txt b/third-party/luabind/src/CMakeLists.txt index 3fde5b82..4d015e04 100644 --- a/third-party/luabind/src/CMakeLists.txt +++ b/third-party/luabind/src/CMakeLists.txt @@ -42,6 +42,7 @@ set(LUABIND_API ../luabind/handle.hpp ../luabind/iterator_policy.hpp ../luabind/luabind.hpp + ../luabind/lua_state_fwd.hpp ../luabind/lua_include.hpp ../luabind/make_function.hpp ../luabind/nil.hpp @@ -119,6 +120,10 @@ set_property(TARGET PROPERTY PROJECT_LABEL "LuaBind Library") + +set(ALLHEADERS ${LUABIND_API} ${LUABIND_DETAIL_API} PARENT_SCOPE) +set(APIHEADERS ${LUABIND_API} PARENT_SCOPE) + set_target_properties(luabind PROPERTIES FOLDER "Third-Party") if(INSTALL_CXX_SDK) diff --git a/third-party/luabind/test/CMakeLists.txt b/third-party/luabind/test/CMakeLists.txt index b83ab5d1..fa20056a 100644 --- a/third-party/luabind/test/CMakeLists.txt +++ b/third-party/luabind/test/CMakeLists.txt @@ -59,3 +59,17 @@ foreach(test ${TESTS}) target_link_libraries(test_${test} test_main luabind) add_test(NAME ${test} COMMAND test_${test}) endforeach() + +if(BUILD_TESTING) + get_filename_component(BASE "${CMAKE_CURRENT_SOURCE_DIR}/../luabind" ABSOLUTE) + foreach(HEADER ${APIHEADERS}) + get_filename_component(FULLHEADER "${HEADER}" ABSOLUTE) + file(RELATIVE_PATH SHORTNAME "${BASE}" "${FULLHEADER}") + string(REPLACE "/" "_" SHORTNAME "${SHORTNAME}") + string(REPLACE ".hpp" "" SHORTNAME "${SHORTNAME}") + configure_file(test_headercompile.cpp.in "${CMAKE_CURRENT_BINARY_DIR}/test_headercompile_${SHORTNAME}.cpp" @ONLY) + + add_executable(test_headercompile_${SHORTNAME} "${CMAKE_CURRENT_BINARY_DIR}/test_headercompile_${SHORTNAME}.cpp") + target_link_libraries(test_headercompile_${SHORTNAME} luabind) + endforeach() +endif() diff --git a/third-party/luabind/test/test_headercompile.cpp.in b/third-party/luabind/test/test_headercompile.cpp.in new file mode 100644 index 00000000..3784c6cc --- /dev/null +++ b/third-party/luabind/test/test_headercompile.cpp.in @@ -0,0 +1,6 @@ + +#include"@FULLHEADER@" + +int main(int /*argc*/, char* /*argv*/[]) { + return 0; +} diff --git a/vrjugglua-config-build-tree.cmake.in b/vrjugglua-config-build-tree.cmake.in index 9c442444..f2fc13c7 100644 --- a/vrjugglua-config-build-tree.cmake.in +++ b/vrjugglua-config-build-tree.cmake.in @@ -46,5 +46,9 @@ if((NOT TARGET luac) AND (EXISTS "${_luac_target_file}")) include("${_luac_target_file}") endif() +set(BUILD_LUA_AS_CPP @BUILD_LUA_AS_CPP@) +if(BUILD_LUA_AS_CPP) + list(APPEND VRJUGGLUA_DEFINITIONS -DLUABIND_CPLUSPLUS_LUA) +endif() set(VRJUGGLUA_FOUND ON) diff --git a/vrjugglua-config.cmake.in b/vrjugglua-config.cmake.in index da41479d..e31b5f78 100644 --- a/vrjugglua-config.cmake.in +++ b/vrjugglua-config.cmake.in @@ -47,6 +47,11 @@ if(NOT TARGET vrjlua_exported_vrjugglua) include("${_luac_target_file}") endif() + set(BUILD_LUA_AS_CPP @BUILD_LUA_AS_CPP@) + if(BUILD_LUA_AS_CPP) + list(APPEND VRJUGGLUA_DEFINITIONS -DLUABIND_CPLUSPLUS_LUA) + endif() + include(FindPackageHandleStandardArgs) find_package_handle_standard_args(VRJuggLua DEFAULT_MSG diff --git a/vrjugglua/CMakeLists.txt b/vrjugglua/CMakeLists.txt index 586bd29e..12faf573 100644 --- a/vrjugglua/CMakeLists.txt +++ b/vrjugglua/CMakeLists.txt @@ -11,6 +11,10 @@ if(BUILD_EMBEDDED_LUA) add_definitions(-DEMBEDDED_LUA) endif() +if(BUILD_LUA_AS_CPP) + add_definitions(-DLUABIND_CPLUSPLUS_LUA) +endif() + add_definitions(-DOSGLUA_LIBRARY_STATIC) include_directories(${VRJUGGLER_INCLUDE_DIRS}) From 09bc41876afe7aaee66cbc554c8cbdfc25761a0f Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Tue, 14 Jun 2011 10:18:53 -0500 Subject: [PATCH 083/348] update luabind --- third-party/luabind/CMakeLists.txt | 13 +++ third-party/luabind/doc/CMakeLists.txt | 55 +++++++++ .../doc/GetGitRevisionDescription.cmake | 104 ++++++++++++++++++ .../doc/GetGitRevisionDescription.cmake.in | 30 +++++ third-party/luabind/doc/version.rst.in | 1 + third-party/luabind/luabind/adopt_policy.hpp | 2 +- .../luabind/luabind/container_policy.hpp | 2 +- .../luabind/luabind/out_value_policy.hpp | 4 +- third-party/luabind/luabind/raw_policy.hpp | 2 +- third-party/luabind/test/main.cpp | 2 +- third-party/luabind/test/test_attributes.cpp | 2 +- .../luabind/test/test_collapse_converter.cpp | 2 +- .../luabind/test/test_free_functions.cpp | 2 +- .../luabind/test/test_implicit_cast.cpp | 2 +- .../luabind/test/test_implicit_raw.cpp | 4 +- third-party/luabind/test/test_object.cpp | 4 +- third-party/luabind/test/test_operators.cpp | 8 +- third-party/luabind/test/test_scope.cpp | 6 +- third-party/luabind/test/test_yield.cpp | 2 +- vrjugglua/lua/vrjlua-init.lua | 8 +- 20 files changed, 231 insertions(+), 24 deletions(-) create mode 100644 third-party/luabind/doc/CMakeLists.txt create mode 100644 third-party/luabind/doc/GetGitRevisionDescription.cmake create mode 100644 third-party/luabind/doc/GetGitRevisionDescription.cmake.in create mode 100644 third-party/luabind/doc/version.rst.in diff --git a/third-party/luabind/CMakeLists.txt b/third-party/luabind/CMakeLists.txt index c881b0a7..ddf8c41b 100644 --- a/third-party/luabind/CMakeLists.txt +++ b/third-party/luabind/CMakeLists.txt @@ -6,6 +6,12 @@ cmake_minimum_required(VERSION 2.8) project(LuaBind) +set(CPACK_PACKAGE_VERSION_MAJOR "0") +set(CPACK_PACKAGE_VERSION_MINOR "9") +set(CPACK_PACKAGE_VERSION_PATCH "1") +set(CPACK_PACKAGE_VERSION + "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}") + if(NOT Boost_FOUND) find_package(Boost REQUIRED) endif() @@ -18,9 +24,15 @@ endif() if(CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR) # We are the top-level project option(INSTALL_LUABIND "Install the LuaBind library and headers" ON) + option(BUILD_SHARED_LUABIND "Build luabind as a shared library?" OFF) include(CTest) endif() +set(BUILD_SHARED_LIBS ${BUILD_SHARED_LUABIND}) +if(BUILD_SHARED_LIBS) + add_definitions(-DLUABIND_DYNAMIC_LINK) +endif() + include_directories(${Boost_INCLUDE_DIRS} "${CMAKE_CURRENT_SOURCE_DIR}" ${LUA_INCLUDE_DIRS}) @@ -31,4 +43,5 @@ if(CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR) if(BUILD_TESTING) add_subdirectory(test) endif() + add_subdirectory(doc) endif() diff --git a/third-party/luabind/doc/CMakeLists.txt b/third-party/luabind/doc/CMakeLists.txt new file mode 100644 index 00000000..98453dec --- /dev/null +++ b/third-party/luabind/doc/CMakeLists.txt @@ -0,0 +1,55 @@ +# Embedded build for LuaBind +# 2009-2011 Ryan Pavlik +# http://academic.cleardefinition.com/ +# Iowa State University HCI Graduate Program/VRAC + +set(SOURCES + adopt.rst + building.rst + copy.rst + dependency.rst + discard_result.rst + docs.rst + out_value.rst + pure_out_value.rst + raw.rst + return_reference_to.rst + return_stl_iterator.rst + style.css + yield.rst) + +set(SOURCES_COPIED) +foreach(SOURCE ${SOURCES}) + add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${SOURCE}" + COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE}" "${CMAKE_CURRENT_BINARY_DIR}/${SOURCE}" + DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE}" + COMMENT "Copying ${SOURCE}") + list(APPEND SOURCES_COPIED "${CMAKE_CURRENT_BINARY_DIR}/${SOURCE}") +endforeach() + +include(GetGitRevisionDescription.cmake) +git_describe(GIT_DESCRIPTION) +if(GIT_DESCRIPTION) + string(REGEX REPLACE "^v" "" DOCS_VERSION "${GIT_DESCRIPTION}") +else() + set(DOCS_VERSION "${CPACK_PACKAGE_VERSION}") +endif() + +configure_file(version.rst.in "${CMAKE_CURRENT_BINARY_DIR}/version.rst") +list(APPEND SOURCES "${CMAKE_CURRENT_BINARY_DIR}/version.rst") + +find_program(RST2HTML_EXECUTABLE + NAMES + rst2html + rst2html.py) + +if(RST2HTML_EXECUTABLE) + add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/docs.html" + COMMAND ${RST2HTML_EXECUTABLE} --traceback -gdt --stylesheet=style.css --link-stylesheet docs.rst > docs.html + WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}" + DEPENDS ${SOURCES_COPIED} + VERBATIM + COMMENT "Generating HTML documentation with rst2html") + add_custom_target(doc DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/docs.html") +endif() + diff --git a/third-party/luabind/doc/GetGitRevisionDescription.cmake b/third-party/luabind/doc/GetGitRevisionDescription.cmake new file mode 100644 index 00000000..f6f07ca7 --- /dev/null +++ b/third-party/luabind/doc/GetGitRevisionDescription.cmake @@ -0,0 +1,104 @@ +# - Returns a version string from Git +# +# These functions force a re-configure on each git commit so that you can +# trust the values of the variables in your build system. +# +# get_git_head_revision( [ ...]) +# +# Returns the refspec and sha hash of the current head revision +# +# git_describe( [ ...]) +# +# Returns the results of git describe on the source tree, and adjusting +# the output so that it tests false if an error occurs. +# +# git_get_exact_tag( [ ...]) +# +# Returns the results of git describe --exact-match on the source tree, +# and adjusting the output so that it tests false if there was no exact +# matching tag. +# +# Requires CMake 2.6 or newer (uses the 'function' command) +# +# Original Author: +# 2009-2010 Ryan Pavlik +# http://academic.cleardefinition.com +# Iowa State University HCI Graduate Program/VRAC +# +# Copyright Iowa State University 2009-2010. +# Distributed under the Boost Software License, Version 1.0. +# (See accompanying file LICENSE_1_0.txt or copy at +# http://www.boost.org/LICENSE_1_0.txt) + +if(__get_git_revision_description) + return() +endif() +set(__get_git_revision_description YES) + +# We must run the following at "include" time, not at function call time, +# to find the path to this module rather than the path to a calling list file +get_filename_component(_gitdescmoddir ${CMAKE_CURRENT_LIST_FILE} PATH) + +function(get_git_head_revision _refspecvar _hashvar) + set(GIT_DIR "${CMAKE_SOURCE_DIR}/.git") + if(NOT EXISTS "${GIT_DIR}") + # not in git + set(${_refspecvar} "GITDIR-NOTFOUND" PARENT_SCOPE) + set(${_hashvar} "GITDIR-NOTFOUND" PARENT_SCOPE) + return() + endif() + set(GIT_DATA "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/git-data") + if(NOT EXISTS "${GIT_DATA}") + file(MAKE_DIRECTORY "${GIT_DATA}") + endif() + set(HEAD_FILE "${GIT_DATA}/HEAD") + configure_file("${GIT_DIR}/HEAD" "${HEAD_FILE}" COPYONLY) + + configure_file("${_gitdescmoddir}/GetGitRevisionDescription.cmake.in" "${GIT_DATA}/grabRef.cmake" @ONLY) + include("${GIT_DATA}/grabRef.cmake") + + set(${_refspecvar} "${HEAD_REF}" PARENT_SCOPE) + set(${_hashvar} "${HEAD_HASH}" PARENT_SCOPE) +endfunction() + +function(git_describe _var) + if(NOT GIT_FOUND) + find_package(Git QUIET) + endif() + get_git_head_revision(refspec hash) + if(NOT GIT_FOUND) + set(${_var} "GIT-NOTFOUND" PARENT_SCOPE) + return() + endif() + if(NOT hash) + set(${_var} "HEAD-HASH-NOTFOUND" PARENT_SCOPE) + return() + endif() + + # TODO sanitize + #if((${ARGN}" MATCHES "&&") OR + # (ARGN MATCHES "||") OR + # (ARGN MATCHES "\\;")) + # message("Please report the following error to the project!") + # message(FATAL_ERROR "Looks like someone's doing something nefarious with git_describe! Passed arguments ${ARGN}") + #endif() + + #message(STATUS "Arguments to execute_process: ${ARGN}") + + execute_process(COMMAND "${GIT_EXECUTABLE}" describe ${hash} ${ARGN} + WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" + RESULT_VARIABLE res + OUTPUT_VARIABLE out + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + if(NOT res EQUAL 0) + set(out "${out}-${res}-NOTFOUND") + endif() + + set(${_var} "${out}" PARENT_SCOPE) +endfunction() + +function(git_get_exact_tag _var) + git_describe(out --exact-match ${ARGN}) + set(${_var} "${out}" PARENT_SCOPE) +endfunction() diff --git a/third-party/luabind/doc/GetGitRevisionDescription.cmake.in b/third-party/luabind/doc/GetGitRevisionDescription.cmake.in new file mode 100644 index 00000000..c04662cd --- /dev/null +++ b/third-party/luabind/doc/GetGitRevisionDescription.cmake.in @@ -0,0 +1,30 @@ +# +# Internal file for GetGitRevisionDescription.cmake +# +# Requires CMake 2.6 or newer (uses the 'function' command) +# +# Original Author: +# 2009-2010 Ryan Pavlik +# http://academic.cleardefinition.com +# Iowa State University HCI Graduate Program/VRAC +# +# Copyright Iowa State University 2009-2010. +# Distributed under the Boost Software License, Version 1.0. +# (See accompanying file LICENSE_1_0.txt or copy at +# http://www.boost.org/LICENSE_1_0.txt) + +file(READ "@HEAD_FILE@" HEAD_CONTENTS LIMIT 1024) + +string(STRIP "${HEAD_CONTENTS}" HEAD_CONTENTS) +if(HEAD_CONTENTS MATCHES "ref") + # named branch + string(REPLACE "ref: " "" HEAD_REF "${HEAD_CONTENTS}") + + configure_file("@GIT_DIR@/${HEAD_REF}" "@GIT_DATA@/head-ref" COPYONLY) +else() + # detached HEAD + configure_file("@GIT_DIR@/HEAD" "@GIT_DATA@/head-ref" COPYONLY) +endif() + +file(READ "@GIT_DATA@/head-ref" HEAD_HASH LIMIT 1024) +string(STRIP "${HEAD_HASH}" HEAD_HASH) diff --git a/third-party/luabind/doc/version.rst.in b/third-party/luabind/doc/version.rst.in new file mode 100644 index 00000000..6b6dbe9c --- /dev/null +++ b/third-party/luabind/doc/version.rst.in @@ -0,0 +1 @@ +.. |version| replace:: @DOCS_VERSION@ diff --git a/third-party/luabind/luabind/adopt_policy.hpp b/third-party/luabind/luabind/adopt_policy.hpp index dfe5818e..46c43eb7 100644 --- a/third-party/luabind/luabind/adopt_policy.hpp +++ b/third-party/luabind/luabind/adopt_policy.hpp @@ -52,7 +52,7 @@ namespace luabind { namespace detail { typedef adopt_pointer type; - int const consumed_args(...) + int consumed_args(...) const { return 1; } diff --git a/third-party/luabind/luabind/container_policy.hpp b/third-party/luabind/luabind/container_policy.hpp index 68ad0a90..4944b694 100644 --- a/third-party/luabind/luabind/container_policy.hpp +++ b/third-party/luabind/luabind/container_policy.hpp @@ -35,7 +35,7 @@ namespace luabind { namespace detail { template struct container_converter_lua_to_cpp { - int const consumed_args(...) + int consumed_args(...) const { return 1; } diff --git a/third-party/luabind/luabind/out_value_policy.hpp b/third-party/luabind/luabind/out_value_policy.hpp index ca496b52..b54a5288 100644 --- a/third-party/luabind/luabind/out_value_policy.hpp +++ b/third-party/luabind/luabind/out_value_policy.hpp @@ -83,7 +83,7 @@ namespace luabind { namespace detail template struct out_value_converter { - int const consumed_args(...) + int consumed_args(...) const { return 1; } @@ -168,7 +168,7 @@ namespace luabind { namespace detail template struct pure_out_value_converter { - int const consumed_args(...) + int consumed_args(...) const { return 0; } diff --git a/third-party/luabind/luabind/raw_policy.hpp b/third-party/luabind/luabind/raw_policy.hpp index 6d22da24..1cb2680c 100755 --- a/third-party/luabind/luabind/raw_policy.hpp +++ b/third-party/luabind/luabind/raw_policy.hpp @@ -31,7 +31,7 @@ namespace luabind { namespace detail { struct raw_converter { - int const consumed_args(...) + int consumed_args(...) const { return 0; } diff --git a/third-party/luabind/test/main.cpp b/third-party/luabind/test/main.cpp index 3152c731..fcdeae7a 100644 --- a/third-party/luabind/test/main.cpp +++ b/third-party/luabind/test/main.cpp @@ -79,7 +79,7 @@ lua_state::operator lua_State*() const return m_state; } -int pcall_handler(lua_State* L) +int pcall_handler(lua_State* /*L*/) { return 1; } diff --git a/third-party/luabind/test/test_attributes.cpp b/third-party/luabind/test/test_attributes.cpp index a18f1ea3..212d582e 100644 --- a/third-party/luabind/test/test_attributes.cpp +++ b/third-party/luabind/test/test_attributes.cpp @@ -55,7 +55,7 @@ struct property_test : counted_type void set(int a) { a_ = a; } int get() const { return a_; } - void setA(A* a) {} + void setA(A* /*a*/) {} A* getA() const { return 0; } void set_str(const char* str) diff --git a/third-party/luabind/test/test_collapse_converter.cpp b/third-party/luabind/test/test_collapse_converter.cpp index 6a5b3a14..ebb528a6 100644 --- a/third-party/luabind/test/test_collapse_converter.cpp +++ b/third-party/luabind/test/test_collapse_converter.cpp @@ -28,7 +28,7 @@ template <> struct default_converter : native_converter_base { - int const consumed_args(...) + int consumed_args(...) const { return 2; } diff --git a/third-party/luabind/test/test_free_functions.cpp b/third-party/luabind/test/test_free_functions.cpp index 04dec6bc..72e2cd48 100644 --- a/third-party/luabind/test/test_free_functions.cpp +++ b/third-party/luabind/test/test_free_functions.cpp @@ -63,7 +63,7 @@ struct copy_me { }; -void take_by_value(copy_me m) +void take_by_value(copy_me /*m*/) { } diff --git a/third-party/luabind/test/test_implicit_cast.cpp b/third-party/luabind/test/test_implicit_cast.cpp index cc36f9f2..27865ee6 100644 --- a/third-party/luabind/test/test_implicit_cast.cpp +++ b/third-party/luabind/test/test_implicit_cast.cpp @@ -50,7 +50,7 @@ struct char_pointer_convertable operator const char*() const { return "foo!"; } }; -void func(const char_pointer_convertable& f) +void func(const char_pointer_convertable& /*f*/) { } diff --git a/third-party/luabind/test/test_implicit_raw.cpp b/third-party/luabind/test/test_implicit_raw.cpp index 0fb05b1b..c3989051 100644 --- a/third-party/luabind/test/test_implicit_raw.cpp +++ b/third-party/luabind/test/test_implicit_raw.cpp @@ -5,10 +5,10 @@ #include "test.hpp" #include -void raw_function(lua_State* L) +void raw_function(lua_State* /*L*/) {} -void raw_function2(int, lua_State* L, int) +void raw_function2(int, lua_State* /*L*/, int) {} void test_main(lua_State* L) diff --git a/third-party/luabind/test/test_object.cpp b/third-party/luabind/test/test_object.cpp index 528f85c1..dfc1a10d 100644 --- a/third-party/luabind/test/test_object.cpp +++ b/third-party/luabind/test/test_object.cpp @@ -98,12 +98,12 @@ struct test_param : counted_type COUNTER_GUARD(test_param); -int test_match(const luabind::object& o) +int test_match(const luabind::object& /*o*/) { return 0; } -int test_match(int i) +int test_match(int /*i*/) { return 1; } diff --git a/third-party/luabind/test/test_operators.cpp b/third-party/luabind/test/test_operators.cpp index f9ec09b1..17c2f586 100644 --- a/third-party/luabind/test/test_operators.cpp +++ b/third-party/luabind/test/test_operators.cpp @@ -53,12 +53,12 @@ struct operator_tester : counted_type } }; -float operator*(operator_tester const& lhs, operator_tester const& rhs) +float operator*(operator_tester const& /*lhs*/, operator_tester const& /*rhs*/) { return 35.f; } -std::string operator*(operator_tester const&, int v) +std::string operator*(operator_tester const&, int /*v*/) { return "(operator_tester, int) overload"; } @@ -86,12 +86,12 @@ std::ostream& operator<<(std::ostream& os, const operator_tester&) struct op_test1 { - bool operator==(op_test1 const& rhs) const { return true; } + bool operator==(op_test1 const& /*rhs*/) const { return true; } }; struct op_test2 : public op_test1 { - bool operator==(op_test2 const& rhs) const { return true; } + bool operator==(op_test2 const& /*rhs*/) const { return true; } }; COUNTER_GUARD(operator_tester); diff --git a/third-party/luabind/test/test_scope.cpp b/third-party/luabind/test/test_scope.cpp index 15c742e3..61cfbcd3 100755 --- a/third-party/luabind/test/test_scope.cpp +++ b/third-party/luabind/test/test_scope.cpp @@ -24,8 +24,8 @@ #include int f() { return 1; } -int f_(int a) { return 2; } -int f__(int a) { return 3; } +int f_(int /*a*/) { return 2; } +int f__(int /*a*/) { return 3; } int g() { return 4; } int g_(int) { return 5; } int h() { return 6; } @@ -41,7 +41,7 @@ struct test_class : counted_type struct test_class2 : counted_type { test_class2() {} - int string_string(std::string const& s1, std::string const& s2) + int string_string(std::string const& /*s1*/, std::string const& /*s2*/) { return 1; } }; diff --git a/third-party/luabind/test/test_yield.cpp b/third-party/luabind/test/test_yield.cpp index 5a48ab8b..ab741505 100755 --- a/third-party/luabind/test/test_yield.cpp +++ b/third-party/luabind/test/test_yield.cpp @@ -32,7 +32,7 @@ struct test_class : counted_type } }; -int f(int a) +int f(int /*a*/) { return 9; } diff --git a/vrjugglua/lua/vrjlua-init.lua b/vrjugglua/lua/vrjlua-init.lua index 12ff9ff9..9fed4c1a 100644 --- a/vrjugglua/lua/vrjlua-init.lua +++ b/vrjugglua/lua/vrjlua-init.lua @@ -5,8 +5,12 @@ require("help") -- Override print function with threadsafe Juggler one do local oldprint = print - print = function(s) - vrjLua.safePrint(tostring(s)) + print = function(...) + local argStrings = {} + for _, v in ipairs{...} do + table.insert(argStrings, tostring(v)) + end + vrjLua.safePrint(table.concat(argStrings, "\t")) end end From 27531b8aa69fcb0fce27e714d902809ebe85e9e5 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Wed, 15 Jun 2011 10:39:02 -0500 Subject: [PATCH 084/348] don't read files, just add a dofile statement Should improve clustered used of scripts that want to know their location, at the expense of needing to have the same paths available on the clustered machines. Easy on Linux, the S drive on METaL Windows. --- vrjugglua/LuaRunBuffer.cpp | 24 +++--------------------- 1 file changed, 3 insertions(+), 21 deletions(-) diff --git a/vrjugglua/LuaRunBuffer.cpp b/vrjugglua/LuaRunBuffer.cpp index f9bd8635..09fe44ad 100644 --- a/vrjugglua/LuaRunBuffer.cpp +++ b/vrjugglua/LuaRunBuffer.cpp @@ -116,27 +116,9 @@ bool LuaRunBuffer::addFile(const std::string & filename, bool blocking) { << VRJLUA_MSG_END(dbgVRJLUA_BUFFER, MSG_WARNING); return false; } - std::ifstream file(filename.c_str()); - if (!file.is_open()) { - VRJLUA_MSG_START(dbgVRJLUA_BUFFER, MSG_WARNING) - << "Could not open file: " - << filename - << VRJLUA_MSG_END(dbgVRJLUA_BUFFER, MSG_WARNING); - return false; - } - std::string code; - while (!file.eof()) { - std::string line; - std::getline(file, line); - code += "\n" + line; - } - file.close(); - - // Now just add the code to the buffer using addString - // slightly inefficient if we are not blocking - might have - // to read again later - but better than hogging the - // critical section - return addString(code, blocking); + std::ostringstream ss; + ss << "dofile([==[" << filename << "]==])"; + return addString(ss.str(), blocking); } bool LuaRunBuffer::addString(const std::string & str, bool blocking) { From 83e6308c4ef00762d9a1e82079b5f13aec621425 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Wed, 15 Jun 2011 10:40:45 -0500 Subject: [PATCH 085/348] add a clearScene function to scene.lua Thanks to Leif for writing/testing this. --- vrjugglua/lua/Scene.lua | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/vrjugglua/lua/Scene.lua b/vrjugglua/lua/Scene.lua index 418e2f8b..e3eb381f 100644 --- a/vrjugglua/lua/Scene.lua +++ b/vrjugglua/lua/Scene.lua @@ -1,3 +1,7 @@ +function clearScene() + RelativeTo.World:removeChildren(0, RelativeTo.World:getNumChildren()) + RelativeTo.Room:removeChildren(0, RelativeTo.World:getNumChildren()) +end function Degrees(d) return d * 3.141592653589 / 180 From dfa00027af1141ab7e06e9c0cedf0b2b8bc3d2f2 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Tue, 21 Jun 2011 14:45:46 -0500 Subject: [PATCH 086/348] initial permission of build using cppintrospection instead of osgintrospection --- CMakeLists.txt | 14 +++++++- third-party/CMakeLists.txt | 3 +- third-party/osgLua/CMakeLists.txt | 6 ++++ third-party/osgLua/include/osgLua/Callback | 2 ++ third-party/osgLua/include/osgLua/Config.in | 23 +++++++++++++ .../osgLua/include/osgLua/IntrospectionType | 33 +++++++++++++++++++ .../osgLua/include/osgLua/IntrospectionValue | 33 +++++++++++++++++++ .../include/osgLua/Introspection_variant_cast | 33 +++++++++++++++++++ third-party/osgLua/include/osgLua/LuaInclude | 2 ++ third-party/osgLua/include/osgLua/Script | 4 ++- third-party/osgLua/include/osgLua/Value | 5 +-- third-party/osgLua/src/osgLua/BindValue.cpp | 2 +- third-party/osgLua/src/osgLua/CMakeLists.txt | 10 ++++-- .../osgLua/src/osgLua/MatrixTemplates.h | 17 +++++++--- third-party/osgLua/src/osgLua/Script.cpp | 4 +-- third-party/osgLua/src/osgLua/Type.cpp | 22 +++++++++---- third-party/osgLua/src/osgLua/Value.cpp | 25 ++++++++++---- .../src/osgLua/Value_metamethod_members.cpp | 25 ++++++++++---- .../osgLua/src/osgLua/Value_metamethods.cpp | 25 ++++++++++---- .../osgLua/src/osgLua/VectorTemplates.h | 18 +++++++--- third-party/osgLua/src/osgLua/lua_functions.h | 23 +++++++++---- .../osgLua/src/osgLua/saveObjectFile.cpp | 2 +- vrjugglua/binding_detail/OsgHelpers.cpp | 4 +-- vrjugglua/osgLuaBind.h | 2 +- 24 files changed, 279 insertions(+), 58 deletions(-) create mode 100644 third-party/osgLua/include/osgLua/Config.in create mode 100644 third-party/osgLua/include/osgLua/IntrospectionType create mode 100644 third-party/osgLua/include/osgLua/IntrospectionValue create mode 100644 third-party/osgLua/include/osgLua/Introspection_variant_cast diff --git a/CMakeLists.txt b/CMakeLists.txt index 8fb97f2b..20a726fa 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -42,6 +42,8 @@ option(INSTALL_CXX_SDK "Should we install the headers and libraries needed for C option(BUILD_WITHOUT_TERMINAL "Build GUI applications without the terminal when possible." on) +option(BUILD_WITH_CPPINTROSPECTION "Build against cppintrospection instead of osgIntrospection." off) + # Define advanced options option(BUILD_EMBEDDED_LUA "Build Lua, LuaBind, and osgLua as a part of the app - highly recommended." ON) option(BUILD_LUA_UTILS "Build a stock, standalone lua-interpreter and luac" ON) @@ -128,8 +130,11 @@ if(WIN32) endif() # OpenSceneGraph +if(NOT BUILD_WITH_CPPINTROSPECTION) + set(OSGINTROSPECTION_COMPONENT osgIntrospection) +endif() include(SearchProgramFilesForOpenSceneGraph) -find_package(OpenSceneGraph REQUIRED COMPONENTS osgDB osgUtil osgIntrospection) +find_package(OpenSceneGraph REQUIRED COMPONENTS osgDB osgUtil ${OSGINTROSPECTION_COMPONENT}) list(APPEND EXTRA_LIBS ${OPENSCENEGRAPH_LIBRARIES}) include_directories(${OPENSCENEGRAPH_INCLUDE_DIRS}) @@ -141,6 +146,13 @@ if(WIN32) endforeach() endif() + +if(BUILD_WITH_CPPINTROSPECTION) + find_package(cppintrospection) + list(APPEND EXTRA_LIBS ${CPPINTROSPECTION_LIBRARIES}) + include_directories(${CPPINTROSPECTION_INCLUDE_DIRS}) +endif() + # VR Juggler if(BUILD_WITH_VRJ30) find_package(VRJuggler 3.0 EXACT REQUIRED) diff --git a/third-party/CMakeLists.txt b/third-party/CMakeLists.txt index 25d6aa41..9a7973b7 100644 --- a/third-party/CMakeLists.txt +++ b/third-party/CMakeLists.txt @@ -30,8 +30,9 @@ if(BUILD_EMBEDDED_LUA) set(LUABIND_INCLUDE_DIRS "${CMAKE_CURRENT_SOURCE_DIR}/luabind" ${LUA_INCLUDE_DIRS}) set(LUABIND_INCLUDE_DIRS ${LUABIND_INCLUDE_DIRS} PARENT_SCOPE) + set(OSGLUA_USE_CPPINTROSPECTION ${BUILD_WITH_CPPINTROSPECTION}) add_subdirectory(osgLua) - set(OSGLUA_INCLUDE_DIRS "${CMAKE_CURRENT_SOURCE_DIR}/osgLua/include" ${LUA_INCLUDE_DIRS}) + set(OSGLUA_INCLUDE_DIRS "${CMAKE_CURRENT_SOURCE_DIR}/osgLua/include" "${CMAKE_CURRENT_BINARY_DIR}/osgLua/include" ${LUA_INCLUDE_DIRS}) set(OSGLUA_INCLUDE_DIRS ${OSGLUA_INCLUDE_DIRS} PARENT_SCOPE) endif() diff --git a/third-party/osgLua/CMakeLists.txt b/third-party/osgLua/CMakeLists.txt index cefd76f1..9982c9bf 100644 --- a/third-party/osgLua/CMakeLists.txt +++ b/third-party/osgLua/CMakeLists.txt @@ -10,5 +10,11 @@ include_directories(${OPENSCENEGRAPH_INCLUDE_DIRS}) include_directories(${LUA_INCLUDE_DIRS}) include_directories("${CMAKE_CURRENT_SOURCE_DIR}/include") +include_directories("${CMAKE_CURRENT_BINARY_DIR}/include") + +if(OSGLUA_USE_CPPINTROSPECTION) + include_directories(${CPPINTROSPECTION_INCLUDE_DIRS}) + set(INTROSPECTION_LIBRARIES ${CPPINTROSPECTION_LIBRARIES}) +endif() add_subdirectory(src/osgLua) diff --git a/third-party/osgLua/include/osgLua/Callback b/third-party/osgLua/include/osgLua/Callback index 1090a450..7432c0fe 100644 --- a/third-party/osgLua/include/osgLua/Callback +++ b/third-party/osgLua/include/osgLua/Callback @@ -17,6 +17,8 @@ #ifndef OSGLUA_CALLBACK_ #define OSGLUA_CALLBACK_ +#include + #if defined(_MSC_VER) # if defined( OSGLUA_LIBRARY_STATIC ) # define OSGLUA_API diff --git a/third-party/osgLua/include/osgLua/Config.in b/third-party/osgLua/include/osgLua/Config.in new file mode 100644 index 00000000..e9978488 --- /dev/null +++ b/third-party/osgLua/include/osgLua/Config.in @@ -0,0 +1,23 @@ +/* + osgLua: use Lua to access dynamically to osg using osgIntrospection + Copyright(C) 2006 Jose L. Hidalgo Valiño (PpluX) (pplux at pplux.com) + Copyright(C) 2010-2011 Iowa State University (Author: Ryan Pavlik ) + + This library is open source and may be redistributed and/or modified under + the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or + (at your option) any later version. The full license is in LICENSE file + included with this distribution, and on the openscenegraph.org website. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + OpenSceneGraph Public License for more details. +*/ + +#ifndef OSGLUA_CONFIG +#define OSGLUA_CONFIG + +#cmakedefine OSGLUA_USE_CPPINTROSPECTION +#cmakedefine OSGLUA_LIBRARY_STATIC + +#endif diff --git a/third-party/osgLua/include/osgLua/IntrospectionType b/third-party/osgLua/include/osgLua/IntrospectionType new file mode 100644 index 00000000..4835c328 --- /dev/null +++ b/third-party/osgLua/include/osgLua/IntrospectionType @@ -0,0 +1,33 @@ +/* + osgLua: use Lua to access dynamically to osg using osgIntrospection + Copyright(C) 2006 Jose L. Hidalgo Valiño (PpluX) (pplux at pplux.com) + Copyright(C) 2010-2011 Iowa State University (Author: Ryan Pavlik ) + + This library is open source and may be redistributed and/or modified under + the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or + (at your option) any later version. The full license is in LICENSE file + included with this distribution, and on the openscenegraph.org website. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + OpenSceneGraph Public License for more details. +*/ + +#ifndef OSGLUA_INTROSPECTION_TYPE +#define OSGLUA_INTROSPECTION_TYPE + +#include + +#ifdef OSGLUA_USE_CPPINTROSPECTION +# include + +namespace osgIntrospection { + using namespace cppintrospection; +} + +#else +# include +#endif + +#endif diff --git a/third-party/osgLua/include/osgLua/IntrospectionValue b/third-party/osgLua/include/osgLua/IntrospectionValue new file mode 100644 index 00000000..9cede934 --- /dev/null +++ b/third-party/osgLua/include/osgLua/IntrospectionValue @@ -0,0 +1,33 @@ +/* + osgLua: use Lua to access dynamically to osg using osgIntrospection + Copyright(C) 2006 Jose L. Hidalgo Valiño (PpluX) (pplux at pplux.com) + Copyright(C) 2010-2011 Iowa State University (Author: Ryan Pavlik ) + + This library is open source and may be redistributed and/or modified under + the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or + (at your option) any later version. The full license is in LICENSE file + included with this distribution, and on the openscenegraph.org website. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + OpenSceneGraph Public License for more details. +*/ + +#ifndef OSGLUA_INTROSPECTION_VALUE +#define OSGLUA_INTROSPECTION_VALUE + +#include + +#ifdef OSGLUA_USE_CPPINTROSPECTION +# include + +namespace osgIntrospection { + using namespace cppintrospection; +} + +#else +# include +#endif + +#endif diff --git a/third-party/osgLua/include/osgLua/Introspection_variant_cast b/third-party/osgLua/include/osgLua/Introspection_variant_cast new file mode 100644 index 00000000..cae4dea3 --- /dev/null +++ b/third-party/osgLua/include/osgLua/Introspection_variant_cast @@ -0,0 +1,33 @@ +/* + osgLua: use Lua to access dynamically to osg using osgIntrospection + Copyright(C) 2006 Jose L. Hidalgo Valiño (PpluX) (pplux at pplux.com) + Copyright(C) 2010-2011 Iowa State University (Author: Ryan Pavlik ) + + This library is open source and may be redistributed and/or modified under + the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or + (at your option) any later version. The full license is in LICENSE file + included with this distribution, and on the openscenegraph.org website. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + OpenSceneGraph Public License for more details. +*/ + +#ifndef OSGLUA_INTROSPECTION_VARIANT_CAST +#define OSGLUA_INTROSPECTION_VARIANT_CAST + +#include + +#ifdef OSGLUA_USE_CPPINTROSPECTION +# include + +namespace osgIntrospection { + using namespace cppintrospection; +} + +#else +# include +#endif + +#endif diff --git a/third-party/osgLua/include/osgLua/LuaInclude b/third-party/osgLua/include/osgLua/LuaInclude index e795fb7f..fe8bb294 100644 --- a/third-party/osgLua/include/osgLua/LuaInclude +++ b/third-party/osgLua/include/osgLua/LuaInclude @@ -17,6 +17,8 @@ #ifndef OSGLUA_LUAINCLUDE #define OSGLUA_LUAINCLUDE +#include + #ifdef OSGLUA_LUA_PREFIX # include OSGLUA_LUA_PREFIX #endif diff --git a/third-party/osgLua/include/osgLua/Script b/third-party/osgLua/include/osgLua/Script index ddec0eae..50a496e7 100644 --- a/third-party/osgLua/include/osgLua/Script +++ b/third-party/osgLua/include/osgLua/Script @@ -16,6 +16,8 @@ #ifndef OSGLUA_SCRIPT_ #define OSGLUA_SCRIPT_ +#include + #if defined(_MSC_VER) # if defined( OSGLUA_LIBRARY_STATIC ) # define OSGLUA_API @@ -30,7 +32,7 @@ #include #include -#include +#include #include namespace osgLua { diff --git a/third-party/osgLua/include/osgLua/Value b/third-party/osgLua/include/osgLua/Value index 2fd6f50e..74bb4f29 100644 --- a/third-party/osgLua/include/osgLua/Value +++ b/third-party/osgLua/include/osgLua/Value @@ -20,8 +20,9 @@ #include -#include -#include +#include +#include + #include #include diff --git a/third-party/osgLua/src/osgLua/BindValue.cpp b/third-party/osgLua/src/osgLua/BindValue.cpp index f6ba51d6..4b460f75 100644 --- a/third-party/osgLua/src/osgLua/BindValue.cpp +++ b/third-party/osgLua/src/osgLua/BindValue.cpp @@ -22,7 +22,7 @@ #include "lua_functions.h" #include "LuaIncludeFull.h" -#include +#include // cd /usr/include && find osg -name "Vec*" | sort | sed 's/\(.*\)/\#include \<\1\>/g' #include diff --git a/third-party/osgLua/src/osgLua/CMakeLists.txt b/third-party/osgLua/src/osgLua/CMakeLists.txt index 98cd8e38..f3fb1859 100644 --- a/third-party/osgLua/src/osgLua/CMakeLists.txt +++ b/third-party/osgLua/src/osgLua/CMakeLists.txt @@ -32,13 +32,19 @@ set(OSGLUA_PRIVATE_API set(OSGLUA_PUBLIC_API ../../include/osgLua/Callback + ../../include/osgLua/IntrospectionVType + ../../include/osgLua/IntrospectionValue + ../../include/osgLua/Introspection_variant_cast ../../include/osgLua/LoadWrapper ../../include/osgLua/LuaInclude ../../include/osgLua/Script - ../../include/osgLua/Value) + ../../include/osgLua/Value + "${CMAKE_CURRENT_BINARY_DIR}/../../include/osgLua/Config") source_group(API FILES ${OSGLUA_PUBLIC_API}) +file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/../../include/osgLua/") +configure_file("../../include/osgLua/Config.in" "${CMAKE_CURRENT_BINARY_DIR}/../../include/osgLua/Config") if(BUILD_LUA_AS_CPP) add_definitions(-DOSGLUA_LUA_BUILT_AS_CPP) @@ -53,7 +59,7 @@ endif() add_definitions(-DOSGLUA_LIBRARY_STATIC) add_library(osgLua_static ${OSGLUA_SRCS} ${OSGLUA_PRIVATE_API} ${OSGLUA_PUBLIC_API}) set_target_properties(osgLua_static PROPERTIES PUBLIC_HEADER "${OSGLUA_PUBLIC_API}") -target_link_libraries(osgLua_static lua ${OPENSCENEGRAPH_LIBRARIES} lua) +target_link_libraries(osgLua_static lua ${OPENSCENEGRAPH_LIBRARIES} ${INTROSPECTION_LIBRARIES} lua) set_property(TARGET osgLua_static diff --git a/third-party/osgLua/src/osgLua/MatrixTemplates.h b/third-party/osgLua/src/osgLua/MatrixTemplates.h index 588d5b74..ba013941 100644 --- a/third-party/osgLua/src/osgLua/MatrixTemplates.h +++ b/third-party/osgLua/src/osgLua/MatrixTemplates.h @@ -21,11 +21,18 @@ #include "LuaIncludeFull.h" -#include -#include -#include -#include -#include +#include +#ifdef OSGLUA_USE_CPPINTROSPECTION +# include +# include +#else +# include +# include +#endif + +#include +#include +#include #include #include diff --git a/third-party/osgLua/src/osgLua/Script.cpp b/third-party/osgLua/src/osgLua/Script.cpp index e7a47ccc..363e9374 100644 --- a/third-party/osgLua/src/osgLua/Script.cpp +++ b/third-party/osgLua/src/osgLua/Script.cpp @@ -21,8 +21,8 @@ #include "Type.h" #include "LuaIncludeFull.h" -#include -#include +#include +#include namespace osgLua { diff --git a/third-party/osgLua/src/osgLua/Type.cpp b/third-party/osgLua/src/osgLua/Type.cpp index bc858f48..9e0ba0f8 100644 --- a/third-party/osgLua/src/osgLua/Type.cpp +++ b/third-party/osgLua/src/osgLua/Type.cpp @@ -19,12 +19,22 @@ #include "LuaIncludeFull.h" -#include -#include -#include -#include -#include -#include +#include + +#ifdef OSGLUA_USE_CPPINTROSPECTION +# include +# include +# include +# include +#else +# include +# include +# include +# include +#endif + +#include +#include #include #include diff --git a/third-party/osgLua/src/osgLua/Value.cpp b/third-party/osgLua/src/osgLua/Value.cpp index b8cddd86..398e4db3 100644 --- a/third-party/osgLua/src/osgLua/Value.cpp +++ b/third-party/osgLua/src/osgLua/Value.cpp @@ -22,13 +22,24 @@ #include "LuaIncludeFull.h" -#include -#include -#include -#include -#include -#include -#include +#include + +#ifdef OSGLUA_USE_CPPINTROSPECTION +# include +# include +# include +# include +# include +# include +#else +# include +# include +# include +# include +# include +# include +#endif +#include #include diff --git a/third-party/osgLua/src/osgLua/Value_metamethod_members.cpp b/third-party/osgLua/src/osgLua/Value_metamethod_members.cpp index b8bb4f82..6a6c1699 100644 --- a/third-party/osgLua/src/osgLua/Value_metamethod_members.cpp +++ b/third-party/osgLua/src/osgLua/Value_metamethod_members.cpp @@ -22,13 +22,24 @@ #include "LuaIncludeFull.h" -#include -#include -#include -#include -#include -#include -#include +#include + +#ifdef OSGLUA_USE_CPPINTROSPECTION +# include +# include +# include +# include +# include +# include +#else +# include +# include +# include +# include +# include +# include +#endif +#include #include diff --git a/third-party/osgLua/src/osgLua/Value_metamethods.cpp b/third-party/osgLua/src/osgLua/Value_metamethods.cpp index 54466b41..5403a8c5 100644 --- a/third-party/osgLua/src/osgLua/Value_metamethods.cpp +++ b/third-party/osgLua/src/osgLua/Value_metamethods.cpp @@ -22,13 +22,24 @@ #include "LuaIncludeFull.h" -#include -#include -#include -#include -#include -#include -#include +#include + +#ifdef OSGLUA_USE_CPPINTROSPECTION +# include +# include +# include +# include +# include +# include +#else +# include +# include +# include +# include +# include +# include +#endif +#include diff --git a/third-party/osgLua/src/osgLua/VectorTemplates.h b/third-party/osgLua/src/osgLua/VectorTemplates.h index c2498cca..f79a2d9d 100644 --- a/third-party/osgLua/src/osgLua/VectorTemplates.h +++ b/third-party/osgLua/src/osgLua/VectorTemplates.h @@ -20,11 +20,19 @@ #include "MathValueTags.h" #include "LuaIncludeFull.h" -#include -#include -#include -#include -#include +#include + +#ifdef OSGLUA_USE_CPPINTROSPECTION +# include +# include +#else +# include +# include +#endif + +#include +#include +#include namespace osgLua { diff --git a/third-party/osgLua/src/osgLua/lua_functions.h b/third-party/osgLua/src/osgLua/lua_functions.h index 100d5be2..fa069016 100644 --- a/third-party/osgLua/src/osgLua/lua_functions.h +++ b/third-party/osgLua/src/osgLua/lua_functions.h @@ -13,13 +13,22 @@ OpenSceneGraph Public License for more details. */ -#include -#include -#include -#include -#include -#include -#include +#include +#ifdef OSGLUA_USE_CPPINTROSPECTION +# include +# include +# include +# include +# include +#else +# include +# include +# include +# include +# include +#endif +#include +#include #include diff --git a/third-party/osgLua/src/osgLua/saveObjectFile.cpp b/third-party/osgLua/src/osgLua/saveObjectFile.cpp index 72010fad..470c236e 100644 --- a/third-party/osgLua/src/osgLua/saveObjectFile.cpp +++ b/third-party/osgLua/src/osgLua/saveObjectFile.cpp @@ -19,7 +19,7 @@ #include #include -#include +#include #include int osgLua::lua_saveObjectFile(lua_State *L) { diff --git a/vrjugglua/binding_detail/OsgHelpers.cpp b/vrjugglua/binding_detail/OsgHelpers.cpp index 7fdd2002..751ff797 100644 --- a/vrjugglua/binding_detail/OsgHelpers.cpp +++ b/vrjugglua/binding_detail/OsgHelpers.cpp @@ -22,8 +22,8 @@ #include -#include -#include +#include +#include // Standard includes #include diff --git a/vrjugglua/osgLuaBind.h b/vrjugglua/osgLuaBind.h index 4442ddde..124bb25f 100644 --- a/vrjugglua/osgLuaBind.h +++ b/vrjugglua/osgLuaBind.h @@ -23,7 +23,7 @@ #include #include -#include +#include // Standard includes #ifdef BUILD_VERBOSE From 0b059a5e80e0af5db5b57daa437ba07f8b561f0e Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Tue, 21 Jun 2011 14:46:03 -0500 Subject: [PATCH 087/348] some cleanups --- third-party/osgLua/include/osgLua/Value | 1 - third-party/osgLua/src/osgLua/Callback.cpp | 2 +- vrjugglua/OsgAppProxy.cpp | 1 - 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/third-party/osgLua/include/osgLua/Value b/third-party/osgLua/include/osgLua/Value index 74bb4f29..dbd36ada 100644 --- a/third-party/osgLua/include/osgLua/Value +++ b/third-party/osgLua/include/osgLua/Value @@ -17,7 +17,6 @@ #ifndef OSGLUA_VALUE #define OSGLUA_VALUE - #include #include diff --git a/third-party/osgLua/src/osgLua/Callback.cpp b/third-party/osgLua/src/osgLua/Callback.cpp index 43adc08f..bf5073ea 100644 --- a/third-party/osgLua/src/osgLua/Callback.cpp +++ b/third-party/osgLua/src/osgLua/Callback.cpp @@ -47,7 +47,7 @@ namespace osgLua { lua_pop(_L,1); // remove the original function } else { lua_pop(_L,1); // remove the function - throw osgLua::Exception( + throw ::osgLua::Exception( "Callback not initialized correctly with a function"); } } diff --git a/vrjugglua/OsgAppProxy.cpp b/vrjugglua/OsgAppProxy.cpp index b3aee2d1..4c3d9f1e 100644 --- a/vrjugglua/OsgAppProxy.cpp +++ b/vrjugglua/OsgAppProxy.cpp @@ -30,7 +30,6 @@ #include // Standard includes -#include #include namespace vrjLua { From b8064d079c86fbb86745bf46e0a56bb3e353fb92 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Thu, 23 Jun 2011 11:15:13 -0500 Subject: [PATCH 088/348] fix typo in build system --- third-party/osgLua/src/osgLua/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/third-party/osgLua/src/osgLua/CMakeLists.txt b/third-party/osgLua/src/osgLua/CMakeLists.txt index f3fb1859..8538cf91 100644 --- a/third-party/osgLua/src/osgLua/CMakeLists.txt +++ b/third-party/osgLua/src/osgLua/CMakeLists.txt @@ -32,7 +32,7 @@ set(OSGLUA_PRIVATE_API set(OSGLUA_PUBLIC_API ../../include/osgLua/Callback - ../../include/osgLua/IntrospectionVType + ../../include/osgLua/IntrospectionType ../../include/osgLua/IntrospectionValue ../../include/osgLua/Introspection_variant_cast ../../include/osgLua/LoadWrapper From 11f664f767c8dec68fa8f56278940e3da37c5d45 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Thu, 23 Jun 2011 15:55:46 -0500 Subject: [PATCH 089/348] fix finding the osglua include dirs for client apps --- vrjugglua-config-build-tree.cmake.in | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/vrjugglua-config-build-tree.cmake.in b/vrjugglua-config-build-tree.cmake.in index f2fc13c7..d263a788 100644 --- a/vrjugglua-config-build-tree.cmake.in +++ b/vrjugglua-config-build-tree.cmake.in @@ -13,8 +13,7 @@ set(VRJUGGLUA_INCLUDE_DIRS "@CMAKE_CURRENT_SOURCE_DIR@/third-party/lua-5.1.4/src" "@CMAKE_CURRENT_SOURCE_DIR@/third-party/Fl_Native_File_Chooser-0.86" "@CMAKE_CURRENT_SOURCE_DIR@/third-party/luabind" - "@CMAKE_CURRENT_SOURCE_DIR@/third-party/osgLua/include" - "@CMAKE_CURRENT_SOURCE_DIR@/third-party/osgLua/src" + "@OSGLUA_INCLUDE_DIRS@" "@CMAKE_CURRENT_SOURCE_DIR@" "@CMAKE_CURRENT_BINARY_DIR@") From ed940ccf453e7d35d69a16212174152172966a7a Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Mon, 27 Jun 2011 12:25:19 -0500 Subject: [PATCH 090/348] remove obsolete feature - the tracking node part of osgapproxy --- vrjugglua/OsgAppProxy.cpp | 51 --------------------------------------- vrjugglua/OsgAppProxy.h | 19 --------------- 2 files changed, 70 deletions(-) diff --git a/vrjugglua/OsgAppProxy.cpp b/vrjugglua/OsgAppProxy.cpp index 4c3d9f1e..d814ca14 100644 --- a/vrjugglua/OsgAppProxy.cpp +++ b/vrjugglua/OsgAppProxy.cpp @@ -54,8 +54,6 @@ void OsgAppProxy::bindToLua(LuaStatePtr & state) { .def("getAppDelegate", & OsgAppProxy::getAppDelegate) .def("setActiveApplication", & OsgAppProxy::setActiveApplication) .def("getScene", & OsgAppProxy::getScene) - .def("getNodeTrackingPositionOnly", &OsgAppProxy::getNodeTrackingPositionOnly) - .def("getNodeTrackingPose", &OsgAppProxy::getNodeTrackingPose) .def("getTimeDelta", & OsgAppProxy::getTimeDelta) ]; } @@ -197,11 +195,6 @@ void OsgAppProxy::preFrame() { _timeDelta = diff_time.secd(); - const unsigned int n = _trackNodes.size(); - for (unsigned int i = 0; i < n; ++i) { - _trackNodes[i]->update(); - } - _forwardCallToDelegate("preFrame"); _lastPreFrameTime = cur_time; @@ -231,50 +224,6 @@ osg::Group* OsgAppProxy::getScene() { return _rootNode.get(); } -OsgAppProxy::PositionTrackingNode::PositionTrackingNode(std::string const& devName, bool posOnly) : - deviceName(devName), - positionOnly(posOnly) { - device.init(deviceName); - node = new osg::MatrixTransform; -} - -void OsgAppProxy::PositionTrackingNode::update() { - osg::Matrix mat(util::toOsgMatrix(device->getData(gadget::PositionUnitConversion::ConvertToMeters))); - if (positionOnly) { - osg::Matrix transMat; - transMat.setTrans(mat.getTrans()); - dynamic_cast(node.get())->setMatrix(transMat); - } else { - dynamic_cast(node.get())->setMatrix(mat); - } -} - -osg::Group* OsgAppProxy::getNodeTrackingPositionOnly(std::string const& device) { - for (unsigned int i = 0; i < _trackNodes.size(); ++i) { - if (_trackNodes[i]->is(device, true)) { - std::cout << "Found existing node tracking the position of " << device << " with node="<<_trackNodes[i]->node.get()<node.get(); - } - } - boost::shared_ptr temp(new PositionTrackingNode(device, true)); - std::cout << "Creating node tracking the position of " << device << " with node="<node.get()<node.get(); -} - -osg::Group* OsgAppProxy::getNodeTrackingPose(std::string const& device) { - for (unsigned int i = 0; i < _trackNodes.size(); ++i) { - if (_trackNodes[i]->is(device, false)) { - std::cout << "Found existing node tracking the full pose of " << device << " with node="<<_trackNodes[i]->node.get()<node.get(); - } - } - boost::shared_ptr temp(new PositionTrackingNode(device, false)); - std::cout << "Creating node tracking the full pose of " << device << " with node="<node.get()<node.get(); -} - double OsgAppProxy::getTimeDelta() { return _timeDelta; } diff --git a/vrjugglua/OsgAppProxy.h b/vrjugglua/OsgAppProxy.h index f1f0af95..c31208e9 100644 --- a/vrjugglua/OsgAppProxy.h +++ b/vrjugglua/OsgAppProxy.h @@ -73,9 +73,6 @@ class OsgAppProxy : public OsgApp { */ virtual osg::Group* getScene(); - osg::Group* getNodeTrackingPositionOnly(std::string const& device); - osg::Group* getNodeTrackingPose(std::string const& device); - /** Interval between the most recent (current) preFrame and the previous. This is an accessor whose data member is updated in preFrame before @@ -191,22 +188,6 @@ class OsgAppProxy : public OsgApp { */ vpr::Interval _lastPreFrameTime; double _timeDelta; - - struct PositionTrackingNode { - osg::ref_ptr node; - gadget::PositionInterface device; - std::string deviceName; - bool positionOnly; - PositionTrackingNode(std::string const& devName, bool posOnly = false); - - bool is(std::string const& devName, bool posOnly) const { - return deviceName == devName && posOnly == positionOnly; - } - - void update(); - }; - - std::vector > _trackNodes; }; // -- inline implementations -- // From 40293316a5f2528f3b81c3082091cf5424af5df3 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Mon, 27 Jun 2011 12:26:26 -0500 Subject: [PATCH 091/348] default to the qt gui. --- CMakeLists.txt | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 20a726fa..e98b2737 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,11 +22,9 @@ set(CPACK_SOURCE_PACKAGE_FILE_NAME "${PROJECT_NAME}-${CPACK_PACKAGE_VERSION}-src # Set up options ### -set(DEFAULT_QT_GUI off) if(APPLE AND CMAKE_SIZEOF_VOID_P EQUAL 8) # FLTK on Mac OS X 64-bit doesn't exist set(HIDE_FLTK TRUE) - set(DEFAULT_QT_GUI on) endif() # Define Simple Options @@ -34,9 +32,9 @@ option(BUILD_DOCS "Add a target to build documentation" on) option(BUILD_VERBOSE "Turn on lots of runtime output." off) option(BUILD_WITH_VRJ30 "Use VR Juggler 3.0 instead of 2.2" off) if(NOT HIDE_FLTK) - option(BUILD_FLTK_GUI "Build FLTK-based GUI apps." on) + option(BUILD_FLTK_GUI "Build FLTK-based GUI apps." off) endif() -option(BUILD_QT_GUI "Build Qt-based GUI apps." DEFAULT_QT_GUI) +option(BUILD_QT_GUI "Build Qt-based GUI apps." on) option(INSTALL_CXX_SDK "Should we install the headers and libraries needed for C++ development using VRJLua?" on) From 37c60e241b5b4dfe674eb59b2c228145bb3c989d Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Mon, 27 Jun 2011 12:29:07 -0500 Subject: [PATCH 092/348] Get rid of qconsole2 - wasn't using it at all. --- third-party/CMakeLists.txt | 6 - third-party/qconsole2/CMakeLists.txt | 47 - third-party/qconsole2/ChangeLog | 50 - third-party/qconsole2/INSTALL | 52 - third-party/qconsole2/Makefile | 170 -- third-party/qconsole2/TODO | 6 - third-party/qconsole2/doc/QConsole.html | 152 -- third-party/qconsole2/include/commands.h | 26 - .../qconsole2/include/commandsManager.h | 116 - third-party/qconsole2/include/interceptor.h | 37 - third-party/qconsole2/include/q3richtext_p.h | 2075 ----------------- third-party/qconsole2/include/qconsole.h | 136 -- third-party/qconsole2/include/qpyconsole.h | 72 - third-party/qconsole2/include/qtclconsole.h | 60 - third-party/qconsole2/include/tclnotify.h | 64 - third-party/qconsole2/license.terms | 40 - third-party/qconsole2/qpyconsole.pro | 26 - third-party/qconsole2/qtclconsole.pro | 32 - third-party/qconsole2/src/commands.cpp | 44 - third-party/qconsole2/src/commandsManager.cpp | 110 - third-party/qconsole2/src/interceptor.cpp | 94 - third-party/qconsole2/src/pymain.cpp | 59 - third-party/qconsole2/src/qconsole.cpp | 427 ---- third-party/qconsole2/src/qpyconsole.cpp | 357 --- third-party/qconsole2/src/qtclconsole.cpp | 152 -- third-party/qconsole2/src/tclmain.cpp | 71 - third-party/qconsole2/src/tclnotify.cpp | 537 ----- 27 files changed, 5018 deletions(-) delete mode 100644 third-party/qconsole2/CMakeLists.txt delete mode 100644 third-party/qconsole2/ChangeLog delete mode 100644 third-party/qconsole2/INSTALL delete mode 100644 third-party/qconsole2/Makefile delete mode 100644 third-party/qconsole2/TODO delete mode 100644 third-party/qconsole2/doc/QConsole.html delete mode 100644 third-party/qconsole2/include/commands.h delete mode 100644 third-party/qconsole2/include/commandsManager.h delete mode 100644 third-party/qconsole2/include/interceptor.h delete mode 100644 third-party/qconsole2/include/q3richtext_p.h delete mode 100644 third-party/qconsole2/include/qconsole.h delete mode 100644 third-party/qconsole2/include/qpyconsole.h delete mode 100644 third-party/qconsole2/include/qtclconsole.h delete mode 100644 third-party/qconsole2/include/tclnotify.h delete mode 100644 third-party/qconsole2/license.terms delete mode 100644 third-party/qconsole2/qpyconsole.pro delete mode 100644 third-party/qconsole2/qtclconsole.pro delete mode 100644 third-party/qconsole2/src/commands.cpp delete mode 100644 third-party/qconsole2/src/commandsManager.cpp delete mode 100644 third-party/qconsole2/src/interceptor.cpp delete mode 100644 third-party/qconsole2/src/pymain.cpp delete mode 100644 third-party/qconsole2/src/qconsole.cpp delete mode 100644 third-party/qconsole2/src/qpyconsole.cpp delete mode 100644 third-party/qconsole2/src/qtclconsole.cpp delete mode 100644 third-party/qconsole2/src/tclmain.cpp delete mode 100644 third-party/qconsole2/src/tclnotify.cpp diff --git a/third-party/CMakeLists.txt b/third-party/CMakeLists.txt index 9a7973b7..3b1e66fb 100644 --- a/third-party/CMakeLists.txt +++ b/third-party/CMakeLists.txt @@ -8,12 +8,6 @@ if(BUILD_FLTK_GUI) set(FNFC_INCLUDE_DIRS ${FNFC_INCLUDE_DIRS} PARENT_SCOPE) endif() -if(BUILD_QT_GUI) - #add_subdirectory(qconsole2) - #set(QCONSOLE_LIBRARY ${QCONSOLE_LIBRARY} PARENT_SCOPE) - #set(QCONSOLE_INCLUDE_DIRS ${QCONSOLE_INCLUDE_DIRS} PARENT_SCOPE) -endif() - if(BUILD_EMBEDDED_LUA) # Lua 5.1.4-3 (that is, patch level 3) add_subdirectory(lua-5.1.4/src) diff --git a/third-party/qconsole2/CMakeLists.txt b/third-party/qconsole2/CMakeLists.txt deleted file mode 100644 index 41e5fa4b..00000000 --- a/third-party/qconsole2/CMakeLists.txt +++ /dev/null @@ -1,47 +0,0 @@ -# Embedded build for QConsole -# 2009-2010 Ryan Pavlik -# http://academic.cleardefinition.com/ -# Iowa State University HCI Graduate Program/VRAC - -include("${QT_USE_FILE}") -# Make sure the compiler can find the pre-processed files from qt4_wrap_cpp -include_directories(${CMAKE_BINARY_DIR}) -include_directories("${CMAKE_CURRENT_SOURCE_DIR}/include") - -set(QCONSOLE_SRCS - src/qconsole.cpp) - -set(QCONSOLE_API - include/q3richtext_p.h) - -set(MOCS include/qconsole.h) -qt4_wrap_cpp(GENERATED_SOURCES ${MOCS}) - -source_group("Generated Sources - Do Not Edit" FILES ${GENERATED_SOURCES}) - -add_library(qconsole - ${QCONSOLE_SRCS} - ${QCONSOLE_API} - ${MOCS} - ${GENERATED_SOURCES}) -target_link_libraries(qconsole ${QT_LIBRARIES}) - -set_property(TARGET - qconsole - PROPERTY - PROJECT_LABEL - "Third-Party: QConsole Widget") - -set_target_properties(qconsole PROPERTIES PUBLIC_HEADER "${QCONSOLE_API};${MOCS}") - -if(INSTALL_CXX_SDK) - install(TARGETS qconsole - EXPORT vrjlua-sdk - RUNTIME DESTINATION ${BIN_DIR} COMPONENT runtime - LIBRARY DESTINATION ${LIB_DIR} COMPONENT runtime - ARCHIVE DESTINATION ${ARCH_DIR} COMPONENT sdk - PUBLIC_HEADER DESTINATION ${INCLUDE_DIR} COMPONENT sdk) -endif() - -set(QCONSOLE_LIBRARY qconsole PARENT_SCOPE) -set(QCONSOLE_INCLUDE_DIRS "${CMAKE_CURRENT_SOURCE_DIR}/include" PARENT_SCOPE) \ No newline at end of file diff --git a/third-party/qconsole2/ChangeLog b/third-party/qconsole2/ChangeLog deleted file mode 100644 index 80a55404..00000000 --- a/third-party/qconsole2/ChangeLog +++ /dev/null @@ -1,50 +0,0 @@ -Version 2.0 -=========== -- Supports Qt4.x: - * qt3support classes used since new QTextEdit/QTextCursor/QTextDocument - classes are not flexible enough ! - * Qt3.x still supported through usage of QT_VERSION macro -- QConsole class: - * Pasting with middle mouse button possible even when clicking - outside of the edition zone - * New internal replaceCurrentCommand() method for better modularity - * When navigating in history, multi-line commands were not - totally replaced - * Possibility to disable the stdout/stderr interception - * Possibility to choose the colors of the cmd, stdout, stderr - and completion (as well as the font) - * a new loadScript() method (useful for scripting languages - not providing this feature) -- QTclconsole class: - * Use of tclnotify.* approach allowing interpreting asynchrnous tcl - commands as in: after 1000 {puts hello} - Thanks to Ulrich Ring -- New Python implementation (QPyConsole - thanks to Mondrian Nuessle). -- General code review - -Version 1.1 -=========== -- commandsManager class: - * The getInstance() method can take an already created Tcl_Interp parameter - * removed the registerCommand() method - * New unregisterFunction() - * New set of registerVariable() methods to register C++ vars as Tcl ones - * Added support for "help messages" for functions and methods (accessible - through the new 'help' command) -- QConsole: - * Fixed a bug previously allowing inserting text outside of the - edition zone: Bug that can happen when holding the mouse button - pressed outside the edition zone and typing something - * Possibility to select words outside of the edition zone using double clicks - * Overridden paste() removed : handled by the previous bug fix - * Disabled the popup menu - * New public execCommand(QString) method that executes a Tcl command - and dislpays back its result in the console - * New saveScript() method that saves succeeded commands to a file - * New completeCommand() method that gives suggestions to complete the current command -- QtclConsole: - * Redesigned into a singleton pattern - * Implemented completeCommand() based on [ info commands ] - * New Tcl saveScript command -- New TclCallBack class that allows registring/unregistring C++ methods as Tcl Callbacks: - * Used for SetPrompt() and ShowHistory() in QtclConsole diff --git a/third-party/qconsole2/INSTALL b/third-party/qconsole2/INSTALL deleted file mode 100644 index b6aafaaf..00000000 --- a/third-party/qconsole2/INSTALL +++ /dev/null @@ -1,52 +0,0 @@ - qtclconsole & qpyconsole samples should be compiled and run -on every platform Qt (3.x & 4.x) can be compiled on. - -qtclconsole: -============ - - The only required library is the TCL library version 8.4 (an older -version could work as well but the .pro file needs to be modified). - - If the TCL library is not installed in a standard path, an environment -variable TCL_PATH should be set to point to the TCL installation path -(where there's its lib and include directories). - -To compile and run the sample, just type: - -qmake qtclconsole.pro -make -qtclconsole - - If you encounter link problems "undefined reference to `__ctype_b'", just compile tclmain.cpp -with -DFIX__CTYPE_ - -qpyconsole: -=========== - - The only required library is the Python library version 2.4 (older -versions could work as well). - - Both environment variables: PYTHON_PATH & PYTHON_VERSION should bet -set in order to link with the python library. Example: - -setenv PYTHON_PATH /usr -setenv PYTHON_VERSION 2.4 - -To compile and run the sample, just type: - -qmake qpyconsole.pro -make -qpyconsole - - If you encounter link problems "undefined reference to `__ctype_b'", just compile pymain.cpp -with -DFIX__CTYPE_ - -AUTHORS: -======== - -Houssem BDIOUI (houssem.bdioui@gmail.com) -Mondrian NUESSLE (nuessle@uni-mannheim.de) -Ulrich Ring - -Enjoy :) - diff --git a/third-party/qconsole2/Makefile b/third-party/qconsole2/Makefile deleted file mode 100644 index c8fe7868..00000000 --- a/third-party/qconsole2/Makefile +++ /dev/null @@ -1,170 +0,0 @@ -############################################################################# -# Makefile for building: qpyconsole -# Generated by qmake (1.07a) (Qt 3.3.4) on: Thu Mar 23 07:55:14 2006 -# Project: qpyconsole.pro -# Template: app -# Command: $(QMAKE) -o Makefile qpyconsole.pro -############################################################################# - -####### Compiler, tools and options - -CC = gcc -CXX = g++ -LEX = flex -YACC = yacc -CFLAGS = -pipe -Wall -W -g -DQT_NO_DEBUG -DQT_THREAD_SUPPORT -CXXFLAGS = -pipe -Wall -W -g -DQT_NO_DEBUG -DQT_THREAD_SUPPORT -LEXFLAGS = -YACCFLAGS= -d -INCPATH = -I/home/bdiouih/qt-x11-commercial-3.3.4-linux/mkspecs/default -I. -I. -Iinclude -I$(PYTHON_PATH)/include/python$(PYTHON_VERSION) -I$(QTDIR)/include -I.ui/ -I.moc/ -LINK = g++ -LFLAGS = -Wl,-rpath,$(QTDIR)/lib -LIBS = $(SUBLIBS) -L$(QTDIR)/lib -L/usr/X11R6/lib -L$(PYTHON_PATH)/lib/python$(PYTHON_VERSION)/config -lpython$(PYTHON_VERSION) -lutil -lqt-mt -L/usr/X11R6/lib -lGL -lXmu -lXrender -lXinerama -lSM -lICE -ldl -lpthread -lXext -lX11 -lm -AR = ar cqs -RANLIB = -MOC = $(QTDIR)/bin/moc -UIC = $(QTDIR)/bin/uic -QMAKE = qmake -TAR = tar -cf -GZIP = gzip -9f -COPY = cp -f -COPY_FILE= $(COPY) -COPY_DIR = $(COPY) -r -INSTALL_FILE= $(COPY_FILE) -INSTALL_DIR = $(COPY_DIR) -DEL_FILE = rm -f -SYMLINK = ln -sf -DEL_DIR = rmdir -MOVE = mv -f -CHK_DIR_EXISTS= test -d -MKDIR = mkdir -p - -####### Output directory - -OBJECTS_DIR = .obj/ - -####### Files - -HEADERS = include/interceptor.h \ - include/qpyconsole.h \ - include/qconsole.h -SOURCES = src/interceptor.cpp \ - src/pymain.cpp \ - src/qpyconsole.cpp \ - src/qconsole.cpp -OBJECTS = .obj/interceptor.o \ - .obj/pymain.o \ - .obj/qpyconsole.o \ - .obj/qconsole.o -FORMS = -UICDECLS = -UICIMPLS = -SRCMOC = .moc/moc_interceptor.cpp \ - .moc/moc_qconsole.cpp -OBJMOC = .obj/moc_interceptor.o \ - .obj/moc_qconsole.o -DIST = qpyconsole.pro -QMAKE_TARGET = qpyconsole -DESTDIR = -TARGET = qpyconsole - -first: all -####### Implicit rules - -.SUFFIXES: .c .o .cpp .cc .cxx .C - -.cpp.o: - $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< - -.cc.o: - $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< - -.cxx.o: - $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< - -.C.o: - $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< - -.c.o: - $(CC) -c $(CFLAGS) $(INCPATH) -o $@ $< - -####### Build rules - -all: Makefile $(TARGET) - -$(TARGET): $(UICDECLS) $(OBJECTS) $(OBJMOC) - $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJMOC) $(OBJCOMP) $(LIBS) - -mocables: $(SRCMOC) -uicables: $(UICDECLS) $(UICIMPLS) - -$(MOC): - ( cd $(QTDIR)/src/moc && $(MAKE) ) - -Makefile: qpyconsole.pro /home/bdiouih/qt-x11-commercial-3.3.4-linux/mkspecs/default/qmake.conf ../qt-x11-commercial-3.3.4-linux/lib/libqt-mt.prl - $(QMAKE) -o Makefile qpyconsole.pro -qmake: - @$(QMAKE) -o Makefile qpyconsole.pro - -dist: - @mkdir -p .obj/qpyconsole && $(COPY_FILE) --parents $(SOURCES) $(HEADERS) $(FORMS) $(DIST) .obj/qpyconsole/ && ( cd `dirname .obj/qpyconsole` && $(TAR) qpyconsole.tar qpyconsole && $(GZIP) qpyconsole.tar ) && $(MOVE) `dirname .obj/qpyconsole`/qpyconsole.tar.gz . && $(DEL_FILE) -r .obj/qpyconsole - -mocclean: - -$(DEL_FILE) $(OBJMOC) - -$(DEL_FILE) $(SRCMOC) - -uiclean: - -yaccclean: -lexclean: -clean: mocclean - -$(DEL_FILE) $(OBJECTS) - -$(DEL_FILE) *~ core *.core - - -####### Sub-libraries - -distclean: clean - -$(DEL_FILE) $(TARGET) $(TARGET) - - -FORCE: - -####### Compile - -.obj/interceptor.o: src/interceptor.cpp include/interceptor.h - $(CXX) -c $(CXXFLAGS) $(INCPATH) -o .obj/interceptor.o src/interceptor.cpp - -.obj/pymain.o: src/pymain.cpp include/qpyconsole.h \ - include/qconsole.h \ - include/interceptor.h - $(CXX) -c $(CXXFLAGS) $(INCPATH) -o .obj/pymain.o src/pymain.cpp - -.obj/qpyconsole.o: src/qpyconsole.cpp include/qpyconsole.h \ - include/qconsole.h \ - include/interceptor.h - $(CXX) -c $(CXXFLAGS) $(INCPATH) -o .obj/qpyconsole.o src/qpyconsole.cpp - -.obj/qconsole.o: src/qconsole.cpp include/qconsole.h \ - include/q3richtext_p.h \ - include/interceptor.h - $(CXX) -c $(CXXFLAGS) $(INCPATH) -o .obj/qconsole.o src/qconsole.cpp - -.obj/moc_interceptor.o: .moc/moc_interceptor.cpp include/interceptor.h - $(CXX) -c $(CXXFLAGS) $(INCPATH) -o .obj/moc_interceptor.o .moc/moc_interceptor.cpp - -.obj/moc_qconsole.o: .moc/moc_qconsole.cpp include/qconsole.h include/interceptor.h - $(CXX) -c $(CXXFLAGS) $(INCPATH) -o .obj/moc_qconsole.o .moc/moc_qconsole.cpp - -.moc/moc_interceptor.cpp: $(MOC) include/interceptor.h - $(MOC) include/interceptor.h -o .moc/moc_interceptor.cpp - -.moc/moc_qconsole.cpp: $(MOC) include/qconsole.h - $(MOC) include/qconsole.h -o .moc/moc_qconsole.cpp - -####### Install - -install: - -uninstall: - diff --git a/third-party/qconsole2/TODO b/third-party/qconsole2/TODO deleted file mode 100644 index a4bd06fc..00000000 --- a/third-party/qconsole2/TODO +++ /dev/null @@ -1,6 +0,0 @@ -- The interceptor class seems to work only with POSIX systems, - I'll try to port it on windows. -- Improve replacing by '\n' in history list -- autocompleteCommand for 'subcommands' as well -- Offer threaded call to commands ! - diff --git a/third-party/qconsole2/doc/QConsole.html b/third-party/qconsole2/doc/QConsole.html deleted file mode 100644 index 6e9752f6..00000000 --- a/third-party/qconsole2/doc/QConsole.html +++ /dev/null @@ -1,152 +0,0 @@ - - - -QConsole - - - - -

QConsole

-

Description

-

The QConsole class is a custom widget that implements a basic console, completely written - in C++ and relying on Qt (both 3.x & 4.x). It implements several features - and is intended to be inherited from in order to have a "real" console for a specific - scripting language, shell, etc... The class relies as much as possible on the features - offered by QTextEdit (from which it inherits) and this implied a very simple and light code.

-

QtclConsole inherits from QConsole and emulates a TCL shell in a Qt application. - So basically, the user is able to execute any TCL built-in command and also any other - user-defined commands created using the TCL C-API. These commands should represent - all the features of a given application, so the user will be able to execute them - using the GUI and also in the embedded TCL shell. - This is very useful in the EDA (Electronic Design Automation) field where most of the - tools are using TCL scripting and Qt as well.

-

This application shows how to embed the QtclConsole widget in a main window. - It is composed of the base custom widget (qconsole.h, qconsole.cpp), the Tcl implementation - (qtclconsole.h, qtconsole.cpp), some custom Tcl commands (commands.h and commands.cpp), the - commands class manager (commandsManager.h and commandsManager.cpp), the stdout/stderr - interceptor class (interceptor.h and interceptor.cpp) and the main.cpp file.

-

Features

-
    -
  • -

    QConsole is a custom widget that can be easily integrated in any interface.
    - It is able to execute any command (implementated in child classes) - and then displays its result in blue or red whether it has failed or not. It also displays the - stdout/stderr output produced by these commands with the same colorization schema.

    -
  • -
  • -

    QConsole supports multi-line commands. In fact, when an incomplete command (e.g., unclosed - braces) is validated, the cursor is set at the beginning of a new line.

    -
  • -
  • -

    QConsole supports specifying a different prompt.

    -
  • -
  • -

    Navigation:

    -
  • -
      -
    • -

      Left and right keys to move the cursor in the edition zone (from the prompt to the end of the paragraph plus all the extra lines in multi-line command mode).

      -
    • -
        -
      • -

        Associated with the shift key, selection is then possible.

        -
      • -
      • -

        Associated with ctrl key, the cursor is moved between the words.

        -
      • -
      • -

        Ctrl and shift keys can be used together.

        -
      • -
      -
    • -

      If not in multi-line mode, up and down keys permit the user to navigate in the commands' history as with advanced shells, otherwise they permit to navigate in the edition zone.

      -
    • -
    • -

      Home and end keys allow moving the cursor respectively just after the - prompt and at the end of the current line.

      -
    • -
        -
      • -

        Associated with the shift key, selection is then possible.

        -
      • -
      -
    -
  • -

    Edition:

    -
  • -
      -
    • -

      Simple key strokes work as expected and the 'enter' will place the command into the history list, validate it and 'execute' it giving us back the result (this is in case the command is complete, otherwise the cursor will move to a new line).

      -
    • -
    • -

      Pressing Ctrl + C key sequence will cancel the current command - and shows the prompt again.

      -
    • -
    • -

      Pressing the Tab key will try to autocomplete the current command. - If there are many possibilities, they should be all shown.

      -
    • -
    • -

      The Delete and Backspace keys will delete selected text or simply one - character in the limits of the edition zone. The ctrl key can be associated with them - to delete whole words.

      -
    • -
    • -

      Copy & Paste are always enabled, but Cut is only possible in the edition zone.

      -
    • -
    -
  • -

    Mouse usage:

    -
  • -
      -
    • -

      If the cursor is not placed in the edition zone, its position is undone.

      -
    • -
    • -

      Selection using the mouse is possible everywhere.

      -
    • -
    -
-

QtclConsole specific features

-
    -
  • -

    Adding custom Tcl commands is eased through the singleton class commandsManager - and its registerFunction() method. Besides, this class is responsible of holding - the Tcl_Interp instance. Several examples showing its usage were implemented and can - be tested in the console:

    -
  • -
      -
    • -

      The help command shows all the custom TCL commands registered through - the commandsManager class (as well as via the TclCallBack class).

      -
    • -
    -
      -
    • -

      The msgbox sample command was added in the commands.cpp file and implements the Qt - QMessageBox::warning() static method.

      -
    • -
    -
      -
    • -

      The history command directly implemented in the QtclConsole class. It shows the history - list of all validated commands.

      -
    • -
    -
      -
    • -

      The set_prompt command directly implemented in the QtclConsole class. It allows changing - the prompt of the console.

      -
    • -
    -
      -
    • -

      The save_script command saves the last entered commands in a script file.

      -
    • -
    -
-

QpyConsole specific features

-
    -
- - diff --git a/third-party/qconsole2/include/commands.h b/third-party/qconsole2/include/commands.h deleted file mode 100644 index ae90342a..00000000 --- a/third-party/qconsole2/include/commands.h +++ /dev/null @@ -1,26 +0,0 @@ -/*************************************************************************** - commands.h - description - ------------------- - begin : lun jun 27 2005 - copyright : (C) 2005 by houssem - email : houssem@localhost - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -#ifndef COMMANDS_H -#define COMMANDS_H - -#include - -//Global callback function that implements the msgbox command -int CallQMessageBox( ClientData client_data, Tcl_Interp* interp, int argc, char *argv[]); - -#endif diff --git a/third-party/qconsole2/include/commandsManager.h b/third-party/qconsole2/include/commandsManager.h deleted file mode 100644 index 4db9b0fb..00000000 --- a/third-party/qconsole2/include/commandsManager.h +++ /dev/null @@ -1,116 +0,0 @@ -/*************************************************************************** - commandsManager.h - description - ------------------- - begin : lun jun 27 2005 - copyright : (C) 2005 by houssem - email : houssem@localhost - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -#ifndef COMMANDS_MANAGER_H -#define COMMANDS_MANAGER_H - -#include -#include -#include - -#if QT_VERSION >= 0x040000 -#include -#define QVALUELIST_CLASSNAME Q3ValueList -#else -#define QVALUELIST_CLASSNAME QValueList -#endif - -/* Singleton helper class to register/unregister tcl callback functions & vars - along with help messages */ -class commandsManager -{ - public: - typedef int (*commandType) (void*, Tcl_Interp*, int, const char**); - public: - ~commandsManager(); - static commandsManager *getInstance(Tcl_Interp* interp = NULL); - Tcl_Interp *tclInterp() {return interp;} - void registerFunction(char *commandName, commandType function, char *helpMsg, void *param = NULL); - void unregisterFunction(const char *commandName); - //Registers an integer variable - void registerVariable(char *varName, int &Var, char *helpMsg); - //Registers a boolean variable - void registerVariable(char *varName, bool &Var, char *helpMsg); - //Registers a string variable - void registerVariable(char *varName, char *&Var, char *helpMsg); - //callback method that displays a help message - int help( ClientData client_data, Tcl_Interp* interp, int argc, const char *argv[]); - private: - Tcl_Interp* interp; - static commandsManager *theInstance; - QMap commandsHelp; - QMap varsHelp; - private: - commandsManager(Tcl_Interp* interp = NULL); -}; - -/* Template Helper class that enables registering methods - as callbacks. Usage: - TclCallBack::registerMethod(classInstance, "tcl_command_name", &ClassType::methodName, "Help message"); - */ -template -class TclCallBack -{ - private: - typedef int (Class::*commandType) (void*, Tcl_Interp*, int, const char**); - - static int callBackMethod(void* client_data, Tcl_Interp* interp, int argc, const char** argv) - { - typename QVALUELIST_CLASSNAME::iterator it1 = method.begin(); - for ( QStringList::Iterator it = methodNames.begin(); it != methodNames.end(); ++it ) - { - if (*it == argv[0]) - break; - it1 ++; - } - commandType meth = *it1; - return (instance->*meth)(client_data, interp, argc, argv); - } - - public: - static void registerMethod(Class *_instance, char * commandName, commandType _method, char *helpMsg, void *param = NULL) - { - instance = _instance; - method.push_back(_method); - methodNames.append(commandName); - commandsManager::getInstance()->registerFunction(commandName, callBackMethod, helpMsg, param); - } - - static void unregisterAll() - { - for ( QStringList::Iterator it = methodNames.begin(); it != methodNames.end(); ++it ) - commandsManager::getInstance()->unregisterFunction(*it); - method.clear(); - methodNames.clear(); - } - - private: - static Class *instance; - static QStringList methodNames; - static QVALUELIST_CLASSNAME method; -}; - -template -Class * TclCallBack::instance; - -template -QVALUELIST_CLASSNAME::commandType> TclCallBack::method; - -template -QStringList TclCallBack::methodNames; - -#endif diff --git a/third-party/qconsole2/include/interceptor.h b/third-party/qconsole2/include/interceptor.h deleted file mode 100644 index 8c1d4625..00000000 --- a/third-party/qconsole2/include/interceptor.h +++ /dev/null @@ -1,37 +0,0 @@ -// -// Author: Kuba Ober -// Downloaded from: http://www.ibib.waw.pl/~winnie -// -// License:  Public domain -// - -#if ! defined(INLUDED_INTERCEPTOR_H) -#define INCLUDED_INTERCEPTOR_H - -#include - -class QTextIStream; -class QSocketNotifier; - -class Interceptor : public QObject -{ - Q_OBJECT - public: - Interceptor(QObject * p = 0); - ~Interceptor(); - public slots: - void initialize(int outFd = 1); // defaults to standard output - void received(); - void finish(); - QTextIStream *textIStream() {return m_stream;}; - signals: - void received(QTextIStream *); - private: - QTextIStream * m_stream; - QSocketNotifier * m_notifier; - int m_pipeFd[2]; - int m_origFd; - int m_origFdCopy; -}; - -#endif diff --git a/third-party/qconsole2/include/q3richtext_p.h b/third-party/qconsole2/include/q3richtext_p.h deleted file mode 100644 index cac3665e..00000000 --- a/third-party/qconsole2/include/q3richtext_p.h +++ /dev/null @@ -1,2075 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1992-2006 Trolltech AS. All rights reserved. -** -** This file is part of the Qt3Support module of the Qt Toolkit. -** -** Licensees holding a valid Qt License Agreement may use this file in -** accordance with the rights, responsibilities and obligations -** contained therein. Please consult your licensing agreement or -** contact sales@trolltech.com if any conditions of this licensing -** agreement are not clear to you. -** -** Further information about Qt licensing is available at: -** http://www.trolltech.com/products/qt/licensing.html or by -** contacting info@trolltech.com. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#ifndef Q3RICHTEXT_P_H -#define Q3RICHTEXT_P_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists for the convenience -// of a number of Qt sources files. This header file may change from -// version to version without notice, or even be removed. -// -// We mean it. -// - -#include "QtGui/qapplication.h" -#include "QtGui/qcolor.h" -#include "QtCore/qhash.h" -#include "QtGui/qfont.h" -#include "QtGui/qfontmetrics.h" -#include "QtGui/qlayout.h" -#include "QtCore/qmap.h" -#include "QtCore/qvector.h" -#include "QtCore/qstack.h" -#include "QtCore/qlist.h" -#include "QtCore/qobject.h" -#include "QtGui/qpainter.h" -#include "QtGui/qpixmap.h" -#include "QtCore/qrect.h" -#include "QtCore/qsize.h" -#include "QtCore/qstring.h" -#include "QtCore/qstringlist.h" -#include "Qt3Support/q3stylesheet.h" -#include "Qt3Support/q3mimefactory.h" - -#ifndef QT_NO_RICHTEXT - -class Q3TextDocument; -class Q3TextString; -class Q3TextPreProcessor; -class Q3TextFormat; -class Q3TextCursor; -class Q3TextParagraph; -class Q3TextFormatter; -class Q3TextIndent; -class Q3TextFormatCollection; -class Q3StyleSheetItem; -#ifndef QT_NO_TEXTCUSTOMITEM -class Q3TextCustomItem; -#endif -class Q3TextFlow; -struct QBidiContext; - -// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -class Q_COMPAT_EXPORT Q3TextStringChar -{ - friend class Q3TextString; - -public: - // this is never called, initialize variables in Q3TextString::insert()!!! - Q3TextStringChar() : nobreak(false), lineStart(0), type(Regular) {p.format=0;} - ~Q3TextStringChar(); - - struct CustomData - { - Q3TextFormat *format; -#ifndef QT_NO_TEXTCUSTOMITEM - Q3TextCustomItem *custom; -#endif - QString anchorName; - QString anchorHref; - }; - enum Type { Regular=0, Custom=1, Anchor=2, CustomAnchor=3 }; - - QChar c; - // this is the same struct as in qtextengine_p.h. Don't change! - uchar softBreak :1; // Potential linebreak point - uchar whiteSpace :1; // A unicode whitespace character, except NBSP, ZWNBSP - uchar charStop :1; // Valid cursor position (for left/right arrow) - uchar nobreak :1; - - uchar lineStart : 1; - uchar /*Type*/ type : 2; - uchar bidiLevel :7; - uchar rightToLeft : 1; - - int x; - union { - Q3TextFormat* format; - CustomData* custom; - } p; - - - int height() const; - int ascent() const; - int descent() const; - bool isCustom() const { return (type & Custom) != 0; } - Q3TextFormat *format() const; -#ifndef QT_NO_TEXTCUSTOMITEM - Q3TextCustomItem *customItem() const; -#endif - void setFormat(Q3TextFormat *f); -#ifndef QT_NO_TEXTCUSTOMITEM - void setCustomItem(Q3TextCustomItem *i); -#endif - -#ifndef QT_NO_TEXTCUSTOMITEM - void loseCustomItem(); -#endif - - - bool isAnchor() const { return (type & Anchor) != 0; } - bool isLink() const { return isAnchor() && p.custom->anchorHref.count(); } - QString anchorName() const; - QString anchorHref() const; - void setAnchor(const QString& name, const QString& href); - - Q3TextStringChar(const Q3TextStringChar &) { - Q_ASSERT(false); - } -private: - Q3TextStringChar &operator=(const Q3TextStringChar &) { - //abort(); - return *this; - } - friend class Q3TextParagraph; -}; - -Q_DECLARE_TYPEINFO(Q3TextStringChar, Q_PRIMITIVE_TYPE); - -class Q_COMPAT_EXPORT Q3TextString -{ -public: - - Q3TextString(); - Q3TextString(const Q3TextString &s); - virtual ~Q3TextString(); - - static QString toString(const QVector &data); - QString toString() const; - - inline Q3TextStringChar &at(int i) const { - return const_cast(this)->data[i]; - } - inline int length() const { return data.size(); } - - int width(int idx) const; - - void insert(int index, const QString &s, Q3TextFormat *f); - void insert(int index, const QChar *unicode, int len, Q3TextFormat *f); - void insert(int index, Q3TextStringChar *c, bool doAddRefFormat = false); - void truncate(int index); - void remove(int index, int len); - void clear(); - - void setFormat(int index, Q3TextFormat *f, bool useCollection); - - void setBidi(bool b) { bidi = b; } - bool isBidi() const; - bool isRightToLeft() const; - QChar::Direction direction() const; - void setDirection(QChar::Direction dr) { rightToLeft = (dr == QChar::DirR); bidiDirty = true; } - - QVector rawData() const { return data; } - - void operator=(const QString &s) { clear(); insert(0, s, 0); } - void operator+=(const QString &s) { insert(length(), s, 0); } - void prepend(const QString &s) { insert(0, s, 0); } - int appendParagraphs( Q3TextParagraph *start, Q3TextParagraph *end ); - - // return next and previous valid cursor positions. - bool validCursorPosition(int idx); - int nextCursorPosition(int idx); - int previousCursorPosition(int idx); - -private: - void checkBidi() const; - - QVector data; - QString stringCache; - uint bidiDirty : 1; - uint bidi : 1; // true when the paragraph has right to left characters - uint rightToLeft : 1; -}; - -inline bool Q3TextString::isBidi() const -{ - if (bidiDirty) - checkBidi(); - return bidi; -} - -inline bool Q3TextString::isRightToLeft() const -{ - if (bidiDirty) - checkBidi(); - return rightToLeft; -} - -inline QString Q3TextString::toString() const -{ - if (bidiDirty) - checkBidi(); - return stringCache; -} - -inline QChar::Direction Q3TextString::direction() const -{ - return rightToLeft ? QChar::DirR : QChar::DirL; -} - -inline int Q3TextString::nextCursorPosition(int next) -{ - if (bidiDirty) - checkBidi(); - - const Q3TextStringChar *c = data.data(); - int len = length(); - - if (next < len - 1) { - next++; - while (next < len - 1 && !c[next].charStop) - next++; - } - return next; -} - -inline int Q3TextString::previousCursorPosition(int prev) -{ - if (bidiDirty) - checkBidi(); - - const Q3TextStringChar *c = data.data(); - - if (prev) { - prev--; - while (prev && !c[prev].charStop) - prev--; - } - return prev; -} - -inline bool Q3TextString::validCursorPosition(int idx) -{ - if (bidiDirty) - checkBidi(); - - return (at(idx).charStop); -} - -// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -class Q_COMPAT_EXPORT Q3TextCursor -{ -public: - Q3TextCursor(Q3TextDocument * = 0); - Q3TextCursor(const Q3TextCursor &c); - Q3TextCursor &operator=(const Q3TextCursor &c); - virtual ~Q3TextCursor(); - - bool operator==(const Q3TextCursor &c) const; - bool operator!=(const Q3TextCursor &c) const { return !(*this == c); } - - inline Q3TextParagraph *paragraph() const { return para; } - - Q3TextDocument *document() const; - int index() const; - - void gotoPosition(Q3TextParagraph* p, int index = 0); - void setIndex(int index) { gotoPosition(paragraph(), index); } - void setParagraph(Q3TextParagraph*p) { gotoPosition(p, 0); } - - void gotoLeft(); - void gotoRight(); - void gotoNextLetter(); - void gotoPreviousLetter(); - void gotoUp(); - void gotoDown(); - void gotoLineEnd(); - void gotoLineStart(); - void gotoHome(); - void gotoEnd(); - void gotoPageUp(int visibleHeight); - void gotoPageDown(int visibleHeight); - void gotoNextWord(bool onlySpace = false); - void gotoPreviousWord(bool onlySpace = false); - void gotoWordLeft(); - void gotoWordRight(); - - void insert(const QString &s, bool checkNewLine, QVector *formatting = 0); - void splitAndInsertEmptyParagraph(bool ind = true, bool updateIds = true); - bool remove(); - bool removePreviousChar(); - void indent(); - - bool atParagStart(); - bool atParagEnd(); - - int x() const; // x in current paragraph - int y() const; // y in current paragraph - - int globalX() const; - int globalY() const; - - Q3TextParagraph *topParagraph() const { return paras.isEmpty() ? para : paras.first(); } - int offsetX() const { return ox; } // inner document offset - int offsetY() const { return oy; } // inner document offset - int totalOffsetX() const; // total document offset - int totalOffsetY() const; // total document offset - - bool place(const QPoint &pos, Q3TextParagraph *s) { return place(pos, s, false); } - bool place(const QPoint &pos, Q3TextParagraph *s, bool link); - void restoreState(); - - - int nestedDepth() const { return (int)indices.count(); } //### size_t/int cast - void oneUp() { if (!indices.isEmpty()) pop(); } - void setValid(bool b) { valid = b; } - bool isValid() const { return valid; } - - void fixCursorPosition(); -private: - enum Operation { EnterBegin, EnterEnd, Next, Prev, Up, Down }; - - void push(); - void pop(); - bool processNesting(Operation op); - void invalidateNested(); - void gotoIntoNested(const QPoint &globalPos); - - Q3TextParagraph *para; - int idx, tmpX; - int ox, oy; - QStack indices; - QStack paras; - QStack xOffsets; - QStack yOffsets; - uint valid : 1; - -}; - -// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -class Q_COMPAT_EXPORT Q3TextCommand -{ -public: - enum Commands { Invalid, Insert, Delete, Format, Style }; - - Q3TextCommand(Q3TextDocument *dc) : doc(dc), cursor(dc) {} - virtual ~Q3TextCommand(); - - virtual Commands type() const; - - virtual Q3TextCursor *execute(Q3TextCursor *c) = 0; - virtual Q3TextCursor *unexecute(Q3TextCursor *c) = 0; - -protected: - Q3TextDocument *doc; - Q3TextCursor cursor; - -}; - -class Q_COMPAT_EXPORT Q3TextCommandHistory -{ -public: - Q3TextCommandHistory(int s) : current(-1), steps(s) { } - virtual ~Q3TextCommandHistory(); // ### why is it virtual? - - void clear(); - - void addCommand(Q3TextCommand *cmd); - Q3TextCursor *undo(Q3TextCursor *c); - Q3TextCursor *redo(Q3TextCursor *c); - - bool isUndoAvailable(); - bool isRedoAvailable(); - - void setUndoDepth(int depth) { steps = depth; } - int undoDepth() const { return steps; } - - int historySize() const { return history.count(); } - int currentPosition() const { return current; } - -private: - QList history; - int current, steps; -}; - -inline Q3TextCommandHistory::~Q3TextCommandHistory() -{ - clear(); -} - -// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -#ifndef QT_NO_TEXTCUSTOMITEM -class Q_COMPAT_EXPORT Q3TextCustomItem -{ -public: - Q3TextCustomItem(Q3TextDocument *p) - : xpos(0), ypos(-1), width(-1), height(0), parent(p) - {} - virtual ~Q3TextCustomItem(); - virtual void draw(QPainter* p, int x, int y, int cx, int cy, int cw, int ch, - const QPalette &pal, bool selected) = 0; - - virtual void adjustToPainter(QPainter*); - - enum Placement { PlaceInline = 0, PlaceLeft, PlaceRight }; - virtual Placement placement() const; - bool placeInline() { return placement() == PlaceInline; } - - virtual bool ownLine() const; - virtual void resize(int nwidth); - virtual void invalidate(); - virtual int ascent() const { return height; } - - virtual bool isNested() const; - virtual int minimumWidth() const; - - virtual QString richText() const; - - int xpos; // used for floating items - int ypos; // used for floating items - int width; - int height; - - QRect geometry() const { return QRect(xpos, ypos, width, height); } - - virtual bool enter(Q3TextCursor *, Q3TextDocument *&doc, Q3TextParagraph *¶g, int &idx, int &ox, int &oy, bool atEnd = false); - virtual bool enterAt(Q3TextCursor *, Q3TextDocument *&doc, Q3TextParagraph *¶g, int &idx, int &ox, int &oy, const QPoint &); - virtual bool next(Q3TextCursor *, Q3TextDocument *&doc, Q3TextParagraph *¶g, int &idx, int &ox, int &oy); - virtual bool prev(Q3TextCursor *, Q3TextDocument *&doc, Q3TextParagraph *¶g, int &idx, int &ox, int &oy); - virtual bool down(Q3TextCursor *, Q3TextDocument *&doc, Q3TextParagraph *¶g, int &idx, int &ox, int &oy); - virtual bool up(Q3TextCursor *, Q3TextDocument *&doc, Q3TextParagraph *¶g, int &idx, int &ox, int &oy); - - void setParagraph(Q3TextParagraph *p) { parag = p; } - Q3TextParagraph *paragraph() const { return parag; } - - Q3TextDocument *parent; - Q3TextParagraph *parag; - - virtual void pageBreak(int y, Q3TextFlow* flow); -}; -#endif - - -#ifndef QT_NO_TEXTCUSTOMITEM -class Q_COMPAT_EXPORT Q3TextImage : public Q3TextCustomItem -{ -public: - Q3TextImage(Q3TextDocument *p, const QMap &attr, const QString& context, - Q3MimeSourceFactory &factory); - virtual ~Q3TextImage(); - - Placement placement() const { return place; } - void adjustToPainter(QPainter*); - int minimumWidth() const { return width; } - - QString richText() const; - - void draw(QPainter* p, int x, int y, int cx, int cy, int cw, int ch, - const QPalette &pal, bool selected); - -private: - QRegion* reg; - QPixmap pm; - Placement place; - int tmpwidth, tmpheight; - QMap attributes; - QString imgId; - -}; -#endif - -#ifndef QT_NO_TEXTCUSTOMITEM -class Q_COMPAT_EXPORT Q3TextHorizontalLine : public Q3TextCustomItem -{ -public: - Q3TextHorizontalLine(Q3TextDocument *p, const QMap &attr, const QString& context, - Q3MimeSourceFactory &factory); - virtual ~Q3TextHorizontalLine(); - - void adjustToPainter(QPainter*); - void draw(QPainter* p, int x, int y, int cx, int cy, int cw, int ch, - const QPalette &pal, bool selected); - QString richText() const; - - bool ownLine() const { return true; } - -private: - int tmpheight; - QColor color; - bool shade; - -}; -#endif - -class Q_COMPAT_EXPORT Q3TextFlow -{ - friend class Q3TextDocument; -#ifndef QT_NO_TEXTCUSTOMITEM - friend class Q3TextTableCell; -#endif - -public: - Q3TextFlow(); - virtual ~Q3TextFlow(); - - virtual void setWidth(int width); - int width() const; - - virtual void setPageSize(int ps); - int pageSize() const { return pagesize; } - - virtual int adjustLMargin(int yp, int h, int margin, int space); - virtual int adjustRMargin(int yp, int h, int margin, int space); - -#ifndef QT_NO_TEXTCUSTOMITEM - virtual void registerFloatingItem(Q3TextCustomItem* item); - virtual void unregisterFloatingItem(Q3TextCustomItem* item); -#endif - virtual QRect boundingRect() const; - virtual void drawFloatingItems(QPainter* p, int cx, int cy, int cw, int ch, - const QPalette &pal, bool selected); - - virtual int adjustFlow(int y, int w, int h); // adjusts y according to the defined pagesize. Returns the shift. - - virtual bool isEmpty(); - - void clear(); - -private: - int w; - int pagesize; - -#ifndef QT_NO_TEXTCUSTOMITEM - QList leftItems; - QList rightItems; -#endif -}; - -inline int Q3TextFlow::width() const { return w; } - -#ifndef QT_NO_TEXTCUSTOMITEM -class Q3TextTable; - - -class Q_COMPAT_EXPORT Q3TextTableCell : public QLayoutItem -{ - friend class Q3TextTable; - -public: - Q3TextTableCell(Q3TextTable* table, - int row, int column, - const QMap &attr, - const Q3StyleSheetItem* style, - const Q3TextFormat& fmt, const QString& context, - Q3MimeSourceFactory &factory, Q3StyleSheet *sheet, const QString& doc); - virtual ~Q3TextTableCell(); - - QSize sizeHint() const ; - QSize minimumSize() const ; - QSize maximumSize() const ; - Qt::Orientations expandingDirections() const; - bool isEmpty() const; - void setGeometry(const QRect&) ; - QRect geometry() const; - - bool hasHeightForWidth() const; - int heightForWidth(int) const; - - void adjustToPainter(QPainter*); - - int row() const { return row_; } - int column() const { return col_; } - int rowspan() const { return rowspan_; } - int colspan() const { return colspan_; } - int stretch() const { return stretch_; } - - Q3TextDocument* richText() const { return richtext; } - Q3TextTable* table() const { return parent; } - - void draw(QPainter* p, int x, int y, int cx, int cy, int cw, int ch, - const QPalette &cg, bool selected); - - QBrush *backGround() const { return background; } - virtual void invalidate(); - - int verticalAlignmentOffset() const; - int horizontalAlignmentOffset() const; - -private: - QRect geom; - Q3TextTable* parent; - Q3TextDocument* richtext; - int row_; - int col_; - int rowspan_; - int colspan_; - int stretch_; - int maxw; - int minw; - bool hasFixedWidth; - QBrush *background; - int cached_width; - int cached_sizehint; - QMap attributes; - int align; -}; -#endif - - -#ifndef QT_NO_TEXTCUSTOMITEM -class Q_COMPAT_EXPORT Q3TextTable: public Q3TextCustomItem -{ - friend class Q3TextTableCell; - -public: - Q3TextTable(Q3TextDocument *p, const QMap &attr); - virtual ~Q3TextTable(); - - void adjustToPainter(QPainter *p); - void pageBreak(int y, Q3TextFlow* flow); - void draw(QPainter* p, int x, int y, int cx, int cy, int cw, int ch, - const QPalette &pal, bool selected); - - bool noErase() const { return true; } - bool ownLine() const { return true; } - Placement placement() const { return place; } - bool isNested() const { return true; } - void resize(int nwidth); - virtual void invalidate(); - - virtual bool enter(Q3TextCursor *c, Q3TextDocument *&doc, Q3TextParagraph *¶g, int &idx, int &ox, int &oy, bool atEnd = false); - virtual bool enterAt(Q3TextCursor *c, Q3TextDocument *&doc, Q3TextParagraph *¶g, int &idx, int &ox, int &oy, const QPoint &pos); - virtual bool next(Q3TextCursor *c, Q3TextDocument *&doc, Q3TextParagraph *¶g, int &idx, int &ox, int &oy); - virtual bool prev(Q3TextCursor *c, Q3TextDocument *&doc, Q3TextParagraph *¶g, int &idx, int &ox, int &oy); - virtual bool down(Q3TextCursor *c, Q3TextDocument *&doc, Q3TextParagraph *¶g, int &idx, int &ox, int &oy); - virtual bool up(Q3TextCursor *c, Q3TextDocument *&doc, Q3TextParagraph *¶g, int &idx, int &ox, int &oy); - - QString richText() const; - - int minimumWidth() const; - - QList tableCells() const { return cells; } - - bool isStretching() const { return stretch; } - -private: - void format(int w); - void addCell(Q3TextTableCell* cell); - -private: - QGridLayout* layout; - QList cells; - int cachewidth; - int fixwidth; - int cellpadding; - int cellspacing; - int border; - int outerborder; - int stretch; - int innerborder; - int us_cp, us_ib, us_b, us_ob, us_cs; - QMap attributes; - QMap currCell; - Placement place; - void adjustCells(int y , int shift); - int pageBreakFor; -}; -#endif -// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -#ifndef QT_NO_TEXTCUSTOMITEM -class Q3TextTableCell; -class Q3TextParagraph; -#endif - -struct Q_COMPAT_EXPORT Q3TextDocumentSelection -{ - Q3TextCursor startCursor, endCursor; - bool swapped; - Q_DUMMY_COMPARISON_OPERATOR(Q3TextDocumentSelection) -}; - -class Q_COMPAT_EXPORT Q3TextDocument : public QObject -{ - Q_OBJECT - -#ifndef QT_NO_TEXTCUSTOMITEM - friend class Q3TextTableCell; -#endif - friend class Q3TextCursor; - friend class Q3TextEdit; - friend class Q3TextParagraph; - -public: - enum SelectionIds { - Standard = 0, - Temp = 32000 // This selection must not be drawn, it's used e.g. by undo/redo to - // remove multiple lines with removeSelectedText() - }; - - Q3TextDocument(Q3TextDocument *p); - virtual ~Q3TextDocument(); - - Q3TextDocument *parent() const { return par; } - Q3TextParagraph *parentParagraph() const { return parentPar; } - - void setText(const QString &text, const QString &context); - QMap attributes() const { return attribs; } - void setAttributes(const QMap &attr) { attribs = attr; } - - QString text() const; - QString text(int parag) const; - QString originalText() const; - - int x() const; - int y() const; - int width() const; - int widthUsed() const; - int visibleWidth() const; - int height() const; - void setWidth(int w); - int minimumWidth() const; - bool setMinimumWidth(int needed, int used = -1, Q3TextParagraph *parag = 0); - - void setY(int y); - int leftMargin() const; - void setLeftMargin(int lm); - int rightMargin() const; - void setRightMargin(int rm); - - Q3TextParagraph *firstParagraph() const; - Q3TextParagraph *lastParagraph() const; - void setFirstParagraph(Q3TextParagraph *p); - void setLastParagraph(Q3TextParagraph *p); - - void invalidate(); - - void setPreProcessor(Q3TextPreProcessor *sh); - Q3TextPreProcessor *preProcessor() const; - - void setFormatter(Q3TextFormatter *f); - Q3TextFormatter *formatter() const; - - void setIndent(Q3TextIndent *i); - Q3TextIndent *indent() const; - - QColor selectionColor(int id) const; - QColor selectionTextColor(int id) const; - bool hasSelectionTextColor(int id) const; - void setSelectionColor(int id, const QColor &c); - void setSelectionTextColor(int id, const QColor &b); - bool hasSelection(int id, bool visible = false) const; - void setSelectionStart(int id, const Q3TextCursor &cursor); - bool setSelectionEnd(int id, const Q3TextCursor &cursor); - void selectAll(int id); - bool removeSelection(int id); - void selectionStart(int id, int ¶gId, int &index); - Q3TextCursor selectionStartCursor(int id); - Q3TextCursor selectionEndCursor(int id); - void selectionEnd(int id, int ¶gId, int &index); - void setFormat(int id, Q3TextFormat *f, int flags); - int numSelections() const { return nSelections; } - void addSelection(int id); - - QString selectedText(int id, bool asRichText = false) const; - void removeSelectedText(int id, Q3TextCursor *cursor); - void indentSelection(int id); - - Q3TextParagraph *paragAt(int i) const; - - void addCommand(Q3TextCommand *cmd); - Q3TextCursor *undo(Q3TextCursor *c = 0); - Q3TextCursor *redo(Q3TextCursor *c = 0); - Q3TextCommandHistory *commands() const { return commandHistory; } - - Q3TextFormatCollection *formatCollection() const; - - bool find(Q3TextCursor &cursor, const QString &expr, bool cs, bool wo, bool forward); - - void setTextFormat(Qt::TextFormat f); - Qt::TextFormat textFormat() const; - - bool inSelection(int selId, const QPoint &pos) const; - - Q3StyleSheet *styleSheet() const { return sheet_; } -#ifndef QT_NO_MIME - Q3MimeSourceFactory *mimeSourceFactory() const { return factory_; } -#endif - QString context() const { return contxt; } - - void setStyleSheet(Q3StyleSheet *s); - void setDefaultFormat(const QFont &font, const QColor &color); -#ifndef QT_NO_MIME - void setMimeSourceFactory(Q3MimeSourceFactory *f) { if (f) factory_ = f; } -#endif - void setContext(const QString &c) { if (!c.isEmpty()) contxt = c; } - - void setUnderlineLinks(bool b); - bool underlineLinks() const { return underlLinks; } - - void setPaper(QBrush *brush) { if (backBrush) delete backBrush; backBrush = brush; } - QBrush *paper() const { return backBrush; } - - void doLayout(QPainter *p, int w); - void draw(QPainter *p, const QRect& rect, const QPalette &pal, const QBrush *paper = 0); - - void drawParagraph(QPainter *p, Q3TextParagraph *parag, int cx, int cy, int cw, int ch, - QPixmap *&doubleBuffer, const QPalette &pal, - bool drawCursor, Q3TextCursor *cursor, bool resetChanged = true); - Q3TextParagraph *draw(QPainter *p, int cx, int cy, int cw, int ch, const QPalette &pal, - bool onlyChanged = false, bool drawCursor = false, Q3TextCursor *cursor = 0, - bool resetChanged = true); - -#ifndef QT_NO_TEXTCUSTOMITEM - static Q3TextCustomItem* tag(Q3StyleSheet *sheet, const QString& name, - const QMap &attr, - const QString& context, - const Q3MimeSourceFactory& factory, - bool emptyTag, Q3TextDocument *doc); -#endif - -#ifndef QT_NO_TEXTCUSTOMITEM - void registerCustomItem(Q3TextCustomItem *i, Q3TextParagraph *p); - void unregisterCustomItem(Q3TextCustomItem *i, Q3TextParagraph *p); -#endif - - void setFlow(Q3TextFlow *f); - void takeFlow(); - Q3TextFlow *flow() const { return flow_; } - bool isPageBreakEnabled() const { return pages; } - void setPageBreakEnabled(bool b) { pages = b; } - - void setUseFormatCollection(bool b) { useFC = b; } - bool useFormatCollection() const { return useFC; } - -#ifndef QT_NO_TEXTCUSTOMITEM - Q3TextTableCell *tableCell() const { return tc; } - void setTableCell(Q3TextTableCell *c) { tc = c; } -#endif - - void setPlainText(const QString &text); - void setRichText(const QString &text, const QString &context, const Q3TextFormat *initialFormat = 0); - QString richText() const; - QString plainText() const; - - bool focusNextPrevChild(bool next); - - int alignment() const; - void setAlignment(int a); - - int *tabArray() const; - int tabStopWidth() const; - void setTabArray(int *a); - void setTabStops(int tw); - - void setUndoDepth(int depth) { commandHistory->setUndoDepth(depth); } - int undoDepth() const { return commandHistory->undoDepth(); } - - int length() const; - void clear(bool createEmptyParag = false); - - virtual Q3TextParagraph *createParagraph(Q3TextDocument *, Q3TextParagraph *pr = 0, Q3TextParagraph *nx = 0, bool updateIds = true); - void insertChild(Q3TextDocument *dc) { childList.append(dc); } - void removeChild(Q3TextDocument *dc) { childList.removeAll(dc); } - QList children() const { return childList; } - - bool hasFocusParagraph() const; - QString focusHref() const; - QString focusName() const; - - void invalidateOriginalText() { oTextValid = false; oText = ""; } - -Q_SIGNALS: - void minimumWidthChanged(int); - -private: - Q_DISABLE_COPY(Q3TextDocument) - - void init(); - QPixmap *bufferPixmap(const QSize &s); - // HTML parser - bool hasPrefix(const QChar* doc, int length, int pos, QChar c); - bool hasPrefix(const QChar* doc, int length, int pos, const QString& s); -#ifndef QT_NO_TEXTCUSTOMITEM - Q3TextCustomItem* parseTable(const QMap &attr, const Q3TextFormat &fmt, - const QChar* doc, int length, int& pos, Q3TextParagraph *curpar); -#endif - bool eatSpace(const QChar* doc, int length, int& pos, bool includeNbsp = false); - bool eat(const QChar* doc, int length, int& pos, QChar c); - QString parseOpenTag(const QChar* doc, int length, int& pos, QMap &attr, bool& emptyTag); - QString parseCloseTag(const QChar* doc, int length, int& pos); - QChar parseHTMLSpecialChar(const QChar* doc, int length, int& pos); - QString parseWord(const QChar* doc, int length, int& pos, bool lower = true); - QChar parseChar(const QChar* doc, int length, int& pos, Q3StyleSheetItem::WhiteSpaceMode wsm); - void setRichTextInternal(const QString &text, Q3TextCursor* cursor = 0, const Q3TextFormat *initialFormat = 0); - void setRichTextMarginsInternal(QList< QVector *>& styles, Q3TextParagraph* stylesPar); - - struct Q_COMPAT_EXPORT Focus { - Q3TextParagraph *parag; - int start, len; - QString href; - QString name; - }; - - int cx, cy, cw, vw; - Q3TextParagraph *fParag, *lParag; - Q3TextPreProcessor *pProcessor; - struct SelectionColor { - QColor background; - QColor text; - }; - QMap selectionColors; - QMap selections; - Q3TextCommandHistory *commandHistory; - Q3TextFormatter *pFormatter; - Q3TextIndent *indenter; - Q3TextFormatCollection *fCollection; - Qt::TextFormat txtFormat; - uint preferRichText : 1; - uint pages : 1; - uint useFC : 1; - uint withoutDoubleBuffer : 1; - uint underlLinks : 1; - uint nextDoubleBuffered : 1; - uint oTextValid : 1; - uint mightHaveCustomItems : 1; - int align; - int nSelections; - Q3TextFlow *flow_; - Q3TextDocument *par; - Q3TextParagraph *parentPar; -#ifndef QT_NO_TEXTCUSTOMITEM - Q3TextTableCell *tc; -#endif - QBrush *backBrush; - QPixmap *buf_pixmap; - Focus focusIndicator; - int minw; - int wused; - int leftmargin; - int rightmargin; - Q3TextParagraph *minwParag, *curParag; - Q3StyleSheet* sheet_; -#ifndef QT_NO_MIME - Q3MimeSourceFactory* factory_; -#endif - QString contxt; - QMap attribs; - int *tArray; - int tStopWidth; - int uDepth; - QString oText; - QList childList; - QColor linkColor, bodyText; - double scaleFontsFactor; - - short list_tm,list_bm, list_lm, li_tm, li_bm, par_tm, par_bm; -}; - -// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - - -class Q_COMPAT_EXPORT Q3TextDeleteCommand : public Q3TextCommand -{ -public: - Q3TextDeleteCommand(Q3TextDocument *dc, int i, int idx, const QVector &str, - const QByteArray& oldStyle); - Q3TextDeleteCommand(Q3TextParagraph *p, int idx, const QVector &str); - virtual ~Q3TextDeleteCommand(); - - Commands type() const { return Delete; } - Q3TextCursor *execute(Q3TextCursor *c); - Q3TextCursor *unexecute(Q3TextCursor *c); - -protected: - int id, index; - Q3TextParagraph *parag; - QVector text; - QByteArray styleInformation; - -}; - -class Q_COMPAT_EXPORT Q3TextInsertCommand : public Q3TextDeleteCommand -{ -public: - Q3TextInsertCommand(Q3TextDocument *dc, int i, int idx, const QVector &str, - const QByteArray& oldStyleInfo) - : Q3TextDeleteCommand(dc, i, idx, str, oldStyleInfo) {} - Q3TextInsertCommand(Q3TextParagraph *p, int idx, const QVector &str) - : Q3TextDeleteCommand(p, idx, str) {} - virtual ~Q3TextInsertCommand() {} - - Commands type() const { return Insert; } - Q3TextCursor *execute(Q3TextCursor *c) { return Q3TextDeleteCommand::unexecute(c); } - Q3TextCursor *unexecute(Q3TextCursor *c) { return Q3TextDeleteCommand::execute(c); } - -}; - -class Q_COMPAT_EXPORT Q3TextFormatCommand : public Q3TextCommand -{ -public: - Q3TextFormatCommand(Q3TextDocument *dc, int sid, int sidx, int eid, int eidx, const QVector &old, Q3TextFormat *f, int fl); - virtual ~Q3TextFormatCommand(); - - Commands type() const { return Format; } - Q3TextCursor *execute(Q3TextCursor *c); - Q3TextCursor *unexecute(Q3TextCursor *c); - -protected: - int startId, startIndex, endId, endIndex; - Q3TextFormat *format; - QVector oldFormats; - int flags; - -}; - -class Q_COMPAT_EXPORT Q3TextStyleCommand : public Q3TextCommand -{ -public: - Q3TextStyleCommand(Q3TextDocument *dc, int fParag, int lParag, const QByteArray& beforeChange ); - virtual ~Q3TextStyleCommand() {} - - Commands type() const { return Style; } - Q3TextCursor *execute(Q3TextCursor *c); - Q3TextCursor *unexecute(Q3TextCursor *c); - - static QByteArray readStyleInformation( Q3TextDocument* dc, int fParag, int lParag); - static void writeStyleInformation( Q3TextDocument* dc, int fParag, const QByteArray& style); - -private: - int firstParag, lastParag; - QByteArray before; - QByteArray after; -}; - -// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -struct Q_COMPAT_EXPORT Q3TextParagraphSelection -{ - int start, end; - Q_DUMMY_COMPARISON_OPERATOR(Q3TextParagraphSelection) -}; - -struct Q_COMPAT_EXPORT QTextLineStart -{ - QTextLineStart() : y(0), baseLine(0), h(0) - { } - QTextLineStart(int y_, int bl, int h_) : y(y_), baseLine(bl), h(h_), - w(0) - { } - -public: - int y, baseLine, h; - int w; -}; - -class Q_COMPAT_EXPORT Q3TextParagraphData -{ -public: - Q3TextParagraphData() {} - virtual ~Q3TextParagraphData(); - virtual void join(Q3TextParagraphData *); -}; - -class Q3TextParagraphPseudoDocument; - -class Q3SyntaxHighlighter; - -class Q_COMPAT_EXPORT Q3TextParagraph -{ - friend class Q3TextDocument; - friend class Q3TextCursor; - friend class Q3SyntaxHighlighter; - -public: - Q3TextParagraph(Q3TextDocument *dc, Q3TextParagraph *pr = 0, Q3TextParagraph *nx = 0, bool updateIds = true); - ~Q3TextParagraph(); - - Q3TextString *string() const; - Q3TextStringChar *at(int i) const; // maybe remove later - int leftGap() const; - int length() const; // maybe remove later - - void setListStyle(Q3StyleSheetItem::ListStyle ls) { lstyle = ls; changed = true; } - Q3StyleSheetItem::ListStyle listStyle() const { return (Q3StyleSheetItem::ListStyle)lstyle; } - void setListItem(bool li); - bool isListItem() const { return litem; } - void setListValue(int v) { list_val = v; } - int listValue() const { return list_val > 0 ? list_val : -1; } - - void setListDepth(int depth); - int listDepth() const { return ldepth; } - -// void setFormat(Q3TextFormat *fm); -// Q3TextFormat *paragFormat() const; - - inline Q3TextDocument *document() const { - if (hasdoc) return (Q3TextDocument*) docOrPseudo; - return 0; - } - Q3TextParagraphPseudoDocument *pseudoDocument() const; - - QRect rect() const; - void setHeight(int h) { r.setHeight(h); } - void show(); - void hide(); - bool isVisible() const { return visible; } - - Q3TextParagraph *prev() const; - Q3TextParagraph *next() const; - void setPrev(Q3TextParagraph *s); - void setNext(Q3TextParagraph *s); - - void insert(int index, const QString &s); - void insert(int index, const QChar *unicode, int len); - void append(const QString &s, bool reallyAtEnd = false); - void truncate(int index); - void remove(int index, int len); - void join(Q3TextParagraph *s); - - void invalidate(int chr); - - void move(int &dy); - void format(int start = -1, bool doMove = true); - - bool isValid() const; - bool hasChanged() const; - void setChanged(bool b, bool recursive = false); - - int lineHeightOfChar(int i, int *bl = 0, int *y = 0) const; - Q3TextStringChar *lineStartOfChar(int i, int *index = 0, int *line = 0) const; - int lines() const; - Q3TextStringChar *lineStartOfLine(int line, int *index = 0) const; - int lineY(int l) const; - int lineBaseLine(int l) const; - int lineHeight(int l) const; - void lineInfo(int l, int &y, int &h, int &bl) const; - - void setSelection(int id, int start, int end); - void removeSelection(int id); - int selectionStart(int id) const; - int selectionEnd(int id) const; - bool hasSelection(int id) const; - bool hasAnySelection() const; - bool fullSelected(int id) const; - - void setEndState(int s); - int endState() const; - - void setParagId(int i); - int paragId() const; - - bool firstPreProcess() const; - void setFirstPreProcess(bool b); - - void indent(int *oldIndent = 0, int *newIndent = 0); - - void setExtraData(Q3TextParagraphData *data); - Q3TextParagraphData *extraData() const; - - QMap &lineStartList(); - - void setFormat(int index, int len, Q3TextFormat *f, bool useCollection = true, int flags = -1); - - void setAlignment(int a); - int alignment() const; - - void paint(QPainter &painter, const QPalette &pal, Q3TextCursor *cursor = 0, - bool drawSelections = false, int clipx = -1, int clipy = -1, - int clipw = -1, int cliph = -1); - - int topMargin() const; - int bottomMargin() const; - int leftMargin() const; - int firstLineMargin() const; - int rightMargin() const; - int lineSpacing() const; - -#ifndef QT_NO_TEXTCUSTOMITEM - void registerFloatingItem(Q3TextCustomItem *i); - void unregisterFloatingItem(Q3TextCustomItem *i); -#endif - - void setFullWidth(bool b) { fullWidth = b; } - bool isFullWidth() const { return fullWidth; } - -#ifndef QT_NO_TEXTCUSTOMITEM - Q3TextTableCell *tableCell() const; -#endif - - QBrush *background() const; - - int documentWidth() const; - int documentVisibleWidth() const; - int documentX() const; - int documentY() const; - Q3TextFormatCollection *formatCollection() const; - Q3TextFormatter *formatter() const; - - int nextTab(int i, int x); - int *tabArray() const; - void setTabArray(int *a); - void setTabStops(int tw); - - void adjustToPainter(QPainter *p); - - void setNewLinesAllowed(bool b); - bool isNewLinesAllowed() const; - - QString richText() const; - - void addCommand(Q3TextCommand *cmd); - Q3TextCursor *undo(Q3TextCursor *c = 0); - Q3TextCursor *redo(Q3TextCursor *c = 0); - Q3TextCommandHistory *commands() const; - void copyParagData(Q3TextParagraph *parag); - - void setBreakable(bool b) { breakable = b; } - bool isBreakable() const { return breakable; } - - void setBackgroundColor(const QColor &c); - QColor *backgroundColor() const { return bgcol; } - void clearBackgroundColor(); - - void setMovedDown(bool b) { movedDown = b; } - bool wasMovedDown() const { return movedDown; } - - void setDirection(QChar::Direction); - QChar::Direction direction() const; - void setPaintDevice(QPaintDevice *pd) { paintdevice = pd; } - - void readStyleInformation(QDataStream& stream); - void writeStyleInformation(QDataStream& stream) const; - -protected: - void setColorForSelection(QColor &c, QPainter &p, const QPalette &pal, int selection); - void drawLabel(QPainter* p, int x, int y, int w, int h, int base, const QPalette &pal); - void drawString(QPainter &painter, const QString &str, int start, int len, int xstart, - int y, int baseLine, int w, int h, bool drawSelections, int fullSelectionWidth, - Q3TextStringChar *formatChar, const QPalette &pal, - bool rightToLeft); - -private: - QMap &selections() const; -#ifndef QT_NO_TEXTCUSTOMITEM - QList &floatingItems() const; -#endif - inline QBrush backgroundBrush(const QPalette &pal) { - if (bgcol) - return *bgcol; - return pal.brush(QPalette::Base); - } - void invalidateStyleCache(); - - QMap lineStarts; - QRect r; - Q3TextParagraph *p, *n; - void *docOrPseudo; - uint changed : 1; - uint firstFormat : 1; - uint firstPProcess : 1; - uint needPreProcess : 1; - uint fullWidth : 1; - uint lastInFrame : 1; - uint visible : 1; - uint breakable : 1; - uint movedDown : 1; - uint mightHaveCustomItems : 1; - uint hasdoc : 1; - uint litem : 1; // whether the paragraph is a list item - uint rtext : 1; // whether the paragraph needs rich text margin - signed int align : 5; - uint /*Q3StyleSheetItem::ListStyle*/ lstyle : 4; - int invalid; - int state, id; - Q3TextString *str; - QMap *mSelections; -#ifndef QT_NO_TEXTCUSTOMITEM - QList *mFloatingItems; -#endif - short utm, ubm, ulm, urm, uflm, ulinespacing; - short tabStopWidth, minwidth; - int *tArray; - Q3TextParagraphData *eData; - short list_val; - ushort ldepth; - QColor *bgcol; - QPaintDevice *paintdevice; -}; - -// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -class Q_COMPAT_EXPORT Q3TextFormatter -{ -public: - Q3TextFormatter(); - virtual ~Q3TextFormatter(); - - virtual int format(Q3TextDocument *doc, Q3TextParagraph *parag, int start, const QMap &oldLineStarts) = 0; - virtual int formatVertically(Q3TextDocument* doc, Q3TextParagraph* parag); - - bool isWrapEnabled(Q3TextParagraph *p) const { if (!wrapEnabled) return false; if (p && !p->isBreakable()) return false; return true;} - int wrapAtColumn() const { return wrapColumn;} - virtual void setWrapEnabled(bool b); - virtual void setWrapAtColumn(int c); - virtual void setAllowBreakInWords(bool b) { biw = b; } - bool allowBreakInWords() const { return biw; } - - int minimumWidth() const { return thisminw; } - int widthUsed() const { return thiswused; } - -protected: - virtual QTextLineStart *formatLine(Q3TextParagraph *parag, Q3TextString *string, QTextLineStart *line, Q3TextStringChar *start, - Q3TextStringChar *last, int align = Qt::AlignAuto, int space = 0); -#ifndef QT_NO_COMPLEXTEXT - virtual QTextLineStart *bidiReorderLine(Q3TextParagraph *parag, Q3TextString *string, QTextLineStart *line, Q3TextStringChar *start, - Q3TextStringChar *last, int align, int space); -#endif - void insertLineStart(Q3TextParagraph *parag, int index, QTextLineStart *ls); - - int thisminw; - int thiswused; - -private: - bool wrapEnabled; - int wrapColumn; - bool biw; -}; - -// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -class Q_COMPAT_EXPORT Q3TextFormatterBreakInWords : public Q3TextFormatter -{ -public: - Q3TextFormatterBreakInWords(); - virtual ~Q3TextFormatterBreakInWords() {} - - int format(Q3TextDocument *doc, Q3TextParagraph *parag, int start, const QMap &oldLineStarts); - -}; - -// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -class Q_COMPAT_EXPORT Q3TextFormatterBreakWords : public Q3TextFormatter -{ -public: - Q3TextFormatterBreakWords(); - virtual ~Q3TextFormatterBreakWords() {} - - int format(Q3TextDocument *doc, Q3TextParagraph *parag, int start, const QMap &oldLineStarts); - -}; - -// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -class Q_COMPAT_EXPORT Q3TextIndent -{ -public: - Q3TextIndent(); - virtual ~Q3TextIndent() {} - - virtual void indent(Q3TextDocument *doc, Q3TextParagraph *parag, int *oldIndent = 0, int *newIndent = 0) = 0; - -}; - -// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -class Q_COMPAT_EXPORT Q3TextPreProcessor -{ -public: - enum Ids { - Standard = 0 - }; - - Q3TextPreProcessor(); - virtual ~Q3TextPreProcessor() {} - - virtual void process(Q3TextDocument *doc, Q3TextParagraph *, int, bool = true) = 0; - virtual Q3TextFormat *format(int id) = 0; - -}; - -// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -class Q_COMPAT_EXPORT Q3TextFormat -{ - friend class Q3TextFormatCollection; - friend class Q3TextDocument; - -public: - enum Flags { - NoFlags, - Bold = 1, - Italic = 2, - Underline = 4, - Family = 8, - Size = 16, - Color = 32, - Misspelled = 64, - VAlign = 128, - StrikeOut= 256, - Font = Bold | Italic | Underline | Family | Size | StrikeOut, - Format = Font | Color | Misspelled | VAlign - }; - - enum VerticalAlignment { AlignNormal, AlignSuperScript, AlignSubScript }; - - Q3TextFormat(); - virtual ~Q3TextFormat(); - - Q3TextFormat(const Q3StyleSheetItem *s); - Q3TextFormat(const QFont &f, const QColor &c, Q3TextFormatCollection *parent = 0); - Q3TextFormat(const Q3TextFormat &fm); - Q3TextFormat makeTextFormat(const Q3StyleSheetItem *style, const QMap& attr, double scaleFontsFactor) const; - Q3TextFormat& operator=(const Q3TextFormat &fm); - QColor color() const; - QFont font() const; - QFontMetrics fontMetrics() const { return fm; } - bool isMisspelled() const; - VerticalAlignment vAlign() const; - int minLeftBearing() const; - int minRightBearing() const; - int width(const QChar &c) const; - int width(const QString &str, int pos) const; - int height() const; - int ascent() const; - int descent() const; - int leading() const; - bool useLinkColor() const; - - void setBold(bool b); - void setItalic(bool b); - void setUnderline(bool b); - void setStrikeOut(bool b); - void setFamily(const QString &f); - void setPointSize(int s); - void setFont(const QFont &f); - void setColor(const QColor &c); - void setMisspelled(bool b); - void setVAlign(VerticalAlignment a); - - bool operator==(const Q3TextFormat &f) const; - Q3TextFormatCollection *parent() const; - const QString &key() const; - - static QString getKey(const QFont &f, const QColor &c, bool misspelled, VerticalAlignment vAlign); - - void addRef(); - void removeRef(); - - QString makeFormatChangeTags(Q3TextFormat* defaultFormat, Q3TextFormat *f, const QString& oldAnchorHref, const QString& anchorHref) const; - QString makeFormatEndTags(Q3TextFormat* defaultFormat, const QString& anchorHref) const; - - static void setPainter(QPainter *p); - static QPainter* painter(); - - bool fontSizesInPixels() { return usePixelSizes; } - -protected: - virtual void generateKey(); - -private: - void update(); - static void applyFont(const QFont &f); - -private: - QFont fn; - QColor col; - QFontMetrics fm; - uint missp : 1; - uint linkColor : 1; - uint usePixelSizes : 1; - int leftBearing, rightBearing; - VerticalAlignment ha; - uchar widths[256]; - int hei, asc, dsc; - Q3TextFormatCollection *collection; - int ref; - QString k; - int logicalFontSize; - int stdSize; - static QPainter *pntr; - static QFontMetrics *pntr_fm; - static int pntr_asc; - static int pntr_hei; - static int pntr_ldg; - static int pntr_dsc; - -}; - -// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -class Q_COMPAT_EXPORT Q3TextFormatCollection -{ - friend class Q3TextDocument; - friend class Q3TextFormat; - -public: - Q3TextFormatCollection(); - virtual ~Q3TextFormatCollection(); - - void setDefaultFormat(Q3TextFormat *f); - Q3TextFormat *defaultFormat() const; - virtual Q3TextFormat *format(Q3TextFormat *f); - virtual Q3TextFormat *format(Q3TextFormat *of, Q3TextFormat *nf, int flags); - virtual Q3TextFormat *format(const QFont &f, const QColor &c); - virtual void remove(Q3TextFormat *f); - virtual Q3TextFormat *createFormat(const Q3TextFormat &f) { return new Q3TextFormat(f); } - virtual Q3TextFormat *createFormat(const QFont &f, const QColor &c) { return new Q3TextFormat(f, c, this); } - - void updateDefaultFormat(const QFont &font, const QColor &c, Q3StyleSheet *sheet); - - QPaintDevice *paintDevice() const { return paintdevice; } - void setPaintDevice(QPaintDevice *); - -private: - void updateKeys(); - -private: - Q3TextFormat *defFormat, *lastFormat, *cachedFormat; - QHash cKey; - Q3TextFormat *cres; - QFont cfont; - QColor ccol; - QString kof, knf; - int cflags; - - QPaintDevice *paintdevice; -}; - -class Q_COMPAT_EXPORT Q3TextParagraphPseudoDocument -{ -public: - Q3TextParagraphPseudoDocument(); - ~Q3TextParagraphPseudoDocument(); - QRect docRect; - Q3TextFormatter *pFormatter; - Q3TextCommandHistory *commandHistory; - int minw; - int wused; - Q3TextFormatCollection collection; -}; - -// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -inline int Q3TextParagraph::length() const -{ - return str->length(); -} - -inline QRect Q3TextParagraph::rect() const -{ - return r; -} - -inline int Q3TextCursor::index() const -{ - return idx; -} - -// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -inline int Q3TextDocument::x() const -{ - return cx; -} - -inline int Q3TextDocument::y() const -{ - return cy; -} - -inline int Q3TextDocument::width() const -{ - return qMax(cw, flow_->width()); -} - -inline int Q3TextDocument::visibleWidth() const -{ - return vw; -} - -inline Q3TextParagraph *Q3TextDocument::firstParagraph() const -{ - return fParag; -} - -inline Q3TextParagraph *Q3TextDocument::lastParagraph() const -{ - return lParag; -} - -inline void Q3TextDocument::setFirstParagraph(Q3TextParagraph *p) -{ - fParag = p; -} - -inline void Q3TextDocument::setLastParagraph(Q3TextParagraph *p) -{ - lParag = p; -} - -inline void Q3TextDocument::setWidth(int w) -{ - cw = qMax(w, minw); - flow_->setWidth(cw); - vw = w; -} - -inline int Q3TextDocument::minimumWidth() const -{ - return minw; -} - -inline void Q3TextDocument::setY(int y) -{ - cy = y; -} - -inline int Q3TextDocument::leftMargin() const -{ - return leftmargin; -} - -inline void Q3TextDocument::setLeftMargin(int lm) -{ - leftmargin = lm; -} - -inline int Q3TextDocument::rightMargin() const -{ - return rightmargin; -} - -inline void Q3TextDocument::setRightMargin(int rm) -{ - rightmargin = rm; -} - -inline Q3TextPreProcessor *Q3TextDocument::preProcessor() const -{ - return pProcessor; -} - -inline void Q3TextDocument::setPreProcessor(Q3TextPreProcessor * sh) -{ - pProcessor = sh; -} - -inline void Q3TextDocument::setFormatter(Q3TextFormatter *f) -{ - delete pFormatter; - pFormatter = f; -} - -inline Q3TextFormatter *Q3TextDocument::formatter() const -{ - return pFormatter; -} - -inline void Q3TextDocument::setIndent(Q3TextIndent *i) -{ - indenter = i; -} - -inline Q3TextIndent *Q3TextDocument::indent() const -{ - return indenter; -} - -inline QColor Q3TextDocument::selectionColor(int id) const -{ - const Q3TextDocument *p = this; - while (p->par) - p = p->par; - return p->selectionColors[id].background; -} - -inline QColor Q3TextDocument::selectionTextColor(int id) const -{ - const Q3TextDocument *p = this; - while (p->par) - p = p->par; - return p->selectionColors[id].text; -} - -inline bool Q3TextDocument::hasSelectionTextColor(int id) const -{ - const Q3TextDocument *p = this; - while (p->par) - p = p->par; - return p->selectionColors.contains(id); -} - -inline void Q3TextDocument::setSelectionColor(int id, const QColor &c) -{ - Q3TextDocument *p = this; - while (p->par) - p = p->par; - p->selectionColors[id].background = c; -} - -inline void Q3TextDocument::setSelectionTextColor(int id, const QColor &c) -{ - Q3TextDocument *p = this; - while (p->par) - p = p->par; - p->selectionColors[id].text = c; -} - -inline Q3TextFormatCollection *Q3TextDocument::formatCollection() const -{ - return fCollection; -} - -inline int Q3TextDocument::alignment() const -{ - return align; -} - -inline void Q3TextDocument::setAlignment(int a) -{ - align = a; -} - -inline int *Q3TextDocument::tabArray() const -{ - return tArray; -} - -inline int Q3TextDocument::tabStopWidth() const -{ - return tStopWidth; -} - -inline void Q3TextDocument::setTabArray(int *a) -{ - tArray = a; -} - -inline void Q3TextDocument::setTabStops(int tw) -{ - tStopWidth = tw; -} - -inline QString Q3TextDocument::originalText() const -{ - if (oTextValid) - return oText; - return text(); -} - -inline void Q3TextDocument::setFlow(Q3TextFlow *f) -{ - if (flow_) - delete flow_; - flow_ = f; -} - -inline void Q3TextDocument::takeFlow() -{ - flow_ = 0; -} - -// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -inline QColor Q3TextFormat::color() const -{ - return col; -} - -inline QFont Q3TextFormat::font() const -{ - return fn; -} - -inline bool Q3TextFormat::isMisspelled() const -{ - return missp; -} - -inline Q3TextFormat::VerticalAlignment Q3TextFormat::vAlign() const -{ - return ha; -} - -inline bool Q3TextFormat::operator==(const Q3TextFormat &f) const -{ - return k == f.k; -} - -inline Q3TextFormatCollection *Q3TextFormat::parent() const -{ - return collection; -} - -inline void Q3TextFormat::addRef() -{ - ref++; -} - -inline void Q3TextFormat::removeRef() -{ - ref--; - if (!collection) - return; - if (this == collection->defFormat) - return; - if (ref == 0) - collection->remove(this); -} - -inline const QString &Q3TextFormat::key() const -{ - return k; -} - -inline bool Q3TextFormat::useLinkColor() const -{ - return linkColor; -} - -inline Q3TextStringChar *Q3TextParagraph::at(int i) const -{ - return &str->at(i); -} - -inline bool Q3TextParagraph::isValid() const -{ - return invalid == -1; -} - -inline bool Q3TextParagraph::hasChanged() const -{ - return changed; -} - -inline void Q3TextParagraph::setBackgroundColor(const QColor & c) -{ - delete bgcol; - bgcol = new QColor(c); - setChanged(true); -} - -inline void Q3TextParagraph::clearBackgroundColor() -{ - delete bgcol; bgcol = 0; setChanged(true); -} - -inline void Q3TextParagraph::append(const QString &s, bool reallyAtEnd) -{ - if (reallyAtEnd) - insert(str->length(), s); - else - insert(qMax(str->length() - 1, 0), s); -} - -inline Q3TextParagraph *Q3TextParagraph::prev() const -{ - return p; -} - -inline Q3TextParagraph *Q3TextParagraph::next() const -{ - return n; -} - -inline bool Q3TextParagraph::hasAnySelection() const -{ - return mSelections ? !selections().isEmpty() : false; -} - -inline void Q3TextParagraph::setEndState(int s) -{ - if (s == state) - return; - state = s; -} - -inline int Q3TextParagraph::endState() const -{ - return state; -} - -inline void Q3TextParagraph::setParagId(int i) -{ - id = i; -} - -inline int Q3TextParagraph::paragId() const -{ - if (id == -1) - qWarning("invalid parag id!!!!!!!! (%p)", (void*)this); - return id; -} - -inline bool Q3TextParagraph::firstPreProcess() const -{ - return firstPProcess; -} - -inline void Q3TextParagraph::setFirstPreProcess(bool b) -{ - firstPProcess = b; -} - -inline QMap &Q3TextParagraph::lineStartList() -{ - return lineStarts; -} - -inline Q3TextString *Q3TextParagraph::string() const -{ - return str; -} - -inline Q3TextParagraphPseudoDocument *Q3TextParagraph::pseudoDocument() const -{ - if (hasdoc) - return 0; - return (Q3TextParagraphPseudoDocument*) docOrPseudo; -} - - -#ifndef QT_NO_TEXTCUSTOMITEM -inline Q3TextTableCell *Q3TextParagraph::tableCell() const -{ - return hasdoc ? document()->tableCell () : 0; -} -#endif - -inline Q3TextCommandHistory *Q3TextParagraph::commands() const -{ - return hasdoc ? document()->commands() : pseudoDocument()->commandHistory; -} - - -inline int Q3TextParagraph::alignment() const -{ - return align; -} - -#ifndef QT_NO_TEXTCUSTOMITEM -inline void Q3TextParagraph::registerFloatingItem(Q3TextCustomItem *i) -{ - floatingItems().append(i); -} - -inline void Q3TextParagraph::unregisterFloatingItem(Q3TextCustomItem *i) -{ - floatingItems().removeAll(i); -} -#endif - -inline QBrush *Q3TextParagraph::background() const -{ -#ifndef QT_NO_TEXTCUSTOMITEM - return tableCell() ? tableCell()->backGround() : 0; -#else - return 0; -#endif -} - -inline int Q3TextParagraph::documentWidth() const -{ - return hasdoc ? document()->width() : pseudoDocument()->docRect.width(); -} - -inline int Q3TextParagraph::documentVisibleWidth() const -{ - return hasdoc ? document()->visibleWidth() : pseudoDocument()->docRect.width(); -} - -inline int Q3TextParagraph::documentX() const -{ - return hasdoc ? document()->x() : pseudoDocument()->docRect.x(); -} - -inline int Q3TextParagraph::documentY() const -{ - return hasdoc ? document()->y() : pseudoDocument()->docRect.y(); -} - -inline void Q3TextParagraph::setExtraData(Q3TextParagraphData *data) -{ - eData = data; -} - -inline Q3TextParagraphData *Q3TextParagraph::extraData() const -{ - return eData; -} - -// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -inline void Q3TextFormatCollection::setDefaultFormat(Q3TextFormat *f) -{ - defFormat = f; -} - -inline Q3TextFormat *Q3TextFormatCollection::defaultFormat() const -{ - return defFormat; -} - -// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -inline Q3TextFormat *Q3TextStringChar::format() const -{ - return (type == Regular) ? p.format : p.custom->format; -} - - -#ifndef QT_NO_TEXTCUSTOMITEM -inline Q3TextCustomItem *Q3TextStringChar::customItem() const -{ - return isCustom() ? p.custom->custom : 0; -} -#endif - -inline int Q3TextStringChar::height() const -{ -#ifndef QT_NO_TEXTCUSTOMITEM - return !isCustom() ? format()->height() : (customItem()->placement() == Q3TextCustomItem::PlaceInline ? customItem()->height : 0); -#else - return format()->height(); -#endif -} - -inline int Q3TextStringChar::ascent() const -{ -#ifndef QT_NO_TEXTCUSTOMITEM - return !isCustom() ? format()->ascent() : (customItem()->placement() == Q3TextCustomItem::PlaceInline ? customItem()->ascent() : 0); -#else - return format()->ascent(); -#endif -} - -inline int Q3TextStringChar::descent() const -{ -#ifndef QT_NO_TEXTCUSTOMITEM - return !isCustom() ? format()->descent() : 0; -#else - return format()->descent(); -#endif -} - -#endif // QT_NO_RICHTEXT - -#endif // Q3RICHTEXT_P_H diff --git a/third-party/qconsole2/include/qconsole.h b/third-party/qconsole2/include/qconsole.h deleted file mode 100644 index 73e61a90..00000000 --- a/third-party/qconsole2/include/qconsole.h +++ /dev/null @@ -1,136 +0,0 @@ -/*************************************************************************** - qconsole.h - description - ------------------- - begin : mar mar 15 2005 - copyright : (C) 2005 by Houssem BDIOUI - email : houssem.bdioui@gmail.com - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -#ifndef QCONSOLE_H -#define QCONSOLE_H - -#include "interceptor.h" -#include -#if QT_VERSION >= 0x040000 -#include -#include -#include -#include -#define QTEXTEDIT_CLASSNAME Q3TextEdit -#define QPOPUPMENU_CLASSNAME Q3PopupMenu -#else -#include -#define QTEXTEDIT_CLASSNAME QTextEdit -#define QPOPUPMENU_CLASSNAME QPopupMenu -#endif - -/**An abstract Qt console - *@author Houssem BDIOUI - */ - -class QConsole : protected QTEXTEDIT_CLASSNAME -{ - Q_OBJECT -public: - //constructor - QConsole(QWidget *parent = NULL, const char *name = NULL, bool initInterceptor = true); - //set the prompt of the console - void setPrompt(QString prompt, bool display = true); - //execCommand(QString) executes the command and displays back its result - void execCommand(QString command, bool writeCommand = true, bool showPrompt = true); - //saves a file script - int saveScript(QString fileName); - //loads a file script - int loadScript(QString fileName); - //clear & reset the console (useful sometimes) - void clear(); - void reset(); - //cosmetic methods ! - void setCmdColor(QColor c) {cmdColor = c;}; - void setErrColor(QColor c) {errColor = c;}; - void setOutColor(QColor c) {outColor = c;}; - void setCompletionColor(QColor c) {completionColor = c;}; - void setFont(QFont f) {setCurrentFont(f);}; - -private: - // Redefined virtual methods - void contentsMouseReleaseEvent(QMouseEvent *e); - void contentsMousePressEvent(QMouseEvent *e); - void contentsMouseDoubleClickEvent(QMouseEvent *e); - void keyPressEvent(QKeyEvent * e); - void paste(); - //Just to disable the popup menu - QPOPUPMENU_CLASSNAME * createPopupMenu (const QPoint & pos); - //Return false if the command is incomplete (e.g. unmatched braces) - virtual bool isCommandComplete(QString command); - //Get the command to validate - QString getCurrentCommand(); - //Replace current command with a new one - void replaceCurrentCommand(QString newCommand); - //Test wether the cursor is in the edition zone - bool isInEditionZone(); - //displays redirected stdout/stderr - void stdReceived(QTextIStream *s); - -//protected attributes -protected: - //colors - QColor cmdColor, errColor, outColor, completionColor; - // Old cursor position - int oldPara, oldIndex; - // New cursor position ! - int newPara, newIndex; - // cached prompt length - int promptLength; - // The prompt string - QString prompt; - // The commands history - QStringList history; - //Contains the commands that has succeeded - QStringList recordedScript; - // Current history index (needed because afaik QStringList does not have such an index) - uint historyIndex; - //Stdout interceptor - Interceptor *stdoutInterceptor; - //Stderr interceptor - Interceptor *stderrInterceptor; - //Holds the paragraph number of the prompt (useful for multi-line command handling) - int promptParagraph; - -protected: - //execute a validated command (should be reimplemented and called at the end) - //the return value of the function is the string result - //res must hold back the return value of the command (0: passed; else: error) - virtual QString interpretCommand(QString command, int *res); - //give suggestions to autocomplete a command (should be reimplemented) - //the return value of the function is the string list of all suggestions - virtual QStringList autocompleteCommand(QString cmd); - -// Redefined virtual slots -private slots: - //Correctly handle the cursor when moved - void moveCursor(CursorAction action, bool select); - //Reimplemented method - void removeSelectedText(int selNum = 0); - //Redirect keyboard actions - void doKeyboardAction (KeyboardAction action); - //displays the prompt - void displayPrompt(); - //Obsolete insert() slot, but still used intensively inside QTextEdit ! - void insert(const QString & text, bool indent, bool checkNewLine = TRUE, bool removeSelected = TRUE); - -signals: - //Signal emitted after that a command is executed - void commandExecuted(QString command); -}; - -#endif diff --git a/third-party/qconsole2/include/qpyconsole.h b/third-party/qconsole2/include/qpyconsole.h deleted file mode 100644 index 92efac9b..00000000 --- a/third-party/qconsole2/include/qpyconsole.h +++ /dev/null @@ -1,72 +0,0 @@ -/* - QPyConsole.h - - QConsole specialization for Python - - (C) 2006, Mondrian Nuessle, Computer Architecture Group, University of Mannheim, Germany - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - - nuessle@uni-mannheim.de - -*/ - -#ifndef QPYCONSOLE_H -#define QPYCONSOLE_H - -#include "qconsole.h" - -/**An emulated singleton console for Python within a Qt application (based on the QConsole class) - *@author Mondrian Nuessle - */ - -class QPyConsole : public QConsole -{ -public: - //destructor - ~QPyConsole(); - - //get the QPyConsole instance - static QPyConsole *getInstance(QWidget *parent = NULL, const char *name = NULL); - - void printHistory(); - -private: - - //The instance - static QPyConsole *theInstance; - -private: - // function to check if current command compiled and if not hinted for a multiline statement - bool py_check_for_unexpected_eof(); - - // string holding the current command - QString command; - - // number of lines associated with current command - int lines; - - //give suggestions to complete a command (not working...) - QStringList autocompleteCommand(QString cmd); - - //private constructor - QPyConsole(QWidget *parent = NULL, const char *name = NULL); - - //execute a validated command - QString interpretCommand(QString command, int *res); -}; - -#endif diff --git a/third-party/qconsole2/include/qtclconsole.h b/third-party/qconsole2/include/qtclconsole.h deleted file mode 100644 index c7114c03..00000000 --- a/third-party/qconsole2/include/qtclconsole.h +++ /dev/null @@ -1,60 +0,0 @@ -/*************************************************************************** - qtclconsole.h - description - ------------------- - begin : mar mar 15 2005 - copyright : (C) 2005 by Houssem BDIOUI - email : houssem.bdioui@gmail.com - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -#ifndef QTCLCONSOLE_H -#define QTCLCONSOLE_H - -#include - -#include "qconsole.h" - -/**An emulated singleton class console for Tcl within a Qt application (based on the QConsole class) - *@author Houssem BDIOUI - */ - -class QtclConsole : public QConsole -{ - public: - //destructor - ~QtclConsole(); - //callback method that implements the history command - int showHistory( ClientData client_data, Tcl_Interp* interp, int argc, const char *argv[]); - //callback method that implements the set_prompt command - int setPrompt( ClientData client_data, Tcl_Interp* interp, int argc, const char *argv[]); - //callback method that calls the saveScript() method - int saveScript( ClientData client_data, Tcl_Interp* interp, int argc, const char *argv[]); - //get the QtclConsole instance - static QtclConsole *getInstance(QWidget *parent = NULL, const char *name = NULL); - - private: - //Tcl interpreter - Tcl_Interp *interp; - //The instance - static QtclConsole *theInstance; - - private: - //Return false if the tcl command is incomplete (e.g. unmatched braces) - bool isCommandComplete(QString command); - //private constructor - QtclConsole(QWidget *parent = NULL, const char *name = NULL); - //execute a validated command - QString interpretCommand(QString command, int *res); - //give suggestions to autocomplete a command - QStringList autocompleteCommand(QString cmd); -}; - -#endif diff --git a/third-party/qconsole2/include/tclnotify.h b/third-party/qconsole2/include/tclnotify.h deleted file mode 100644 index cb47b17c..00000000 --- a/third-party/qconsole2/include/tclnotify.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (c) 2005 by Ulrich Ring - * - * This is a clone of the file unix/tclNotify.c from the - * Tcl distribution. - * - * It contained the notifier driver implementation for the - * Xt intrinsics. - * - * Copyright (c) 1997 by Sun Microsystems, Inc. - * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - * - * RCS: @(#) $Id: tclnotify.cpp,v 1.25 2004/03/08 08:33:40 ur Exp $ - */ - -#ifndef tclnotify_h_ -#define tclnotify_h_ - -// NOTE: This file is input to Qt's moc. - -#include -extern "C" int TclInExit(void); - -#include -class QSocketNotifier; - -class TclTimeNotifier : public QObject -{ - Q_OBJECT - public: - TclTimeNotifier(); - ~TclTimeNotifier(); - public slots: - void gong(); -}; - -class TclFileHandler : public QObject -{ - Q_OBJECT - public: - TclFileHandler( int f ); - ~TclFileHandler(); - - int fd; - int mask; /* Mask of desired events: TCL_READABLE, etc. */ - int readyMask; - /* Events that have been seen since the - * last time FileHandlerEventProc was called - * for this file. */ - QSocketNotifier *read; - QSocketNotifier *write; - QSocketNotifier *except; - Tcl_FileProc *proc; - /* Procedure to call, in the style of - * CreateFileHandler. */ - ClientData clientData; /* Argument to pass to proc. */ - TclFileHandler *nextPtr; /* Next in list of all files we care about. */ - public slots: - void fileactive( int ); - -}; -#endif diff --git a/third-party/qconsole2/license.terms b/third-party/qconsole2/license.terms deleted file mode 100644 index f1dcaa52..00000000 --- a/third-party/qconsole2/license.terms +++ /dev/null @@ -1,40 +0,0 @@ -This software is copyrighted by the Regents of the University of -California, Sun Microsystems, Inc., Scriptics Corporation, ActiveState -Corporation and other parties. The following terms apply to all files -associated with the software unless explicitly disclaimed in -individual files. - -The authors hereby grant permission to use, copy, modify, distribute, -and license this software and its documentation for any purpose, provided -that existing copyright notices are retained in all copies and that this -notice is included verbatim in any distributions. No written agreement, -license, or royalty fee is required for any of the authorized uses. -Modifications to this software may be copyrighted by their authors -and need not follow the licensing terms described here, provided that -the new terms are clearly indicated on the first page of each file where -they apply. - -IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY -FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES -ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY -DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE -IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE -NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR -MODIFICATIONS. - -GOVERNMENT USE: If you are acquiring this software on behalf of the -U.S. government, the Government shall have only "Restricted Rights" -in the software and related documentation as defined in the Federal -Acquisition Regulations (FARs) in Clause 52.227.19 (c) (2). If you -are acquiring the software on behalf of the Department of Defense, the -software shall be classified as "Commercial Computer Software" and the -Government shall have only "Restricted Rights" as defined in Clause -252.227-7013 (c) (1) of DFARs. Notwithstanding the foregoing, the -authors grant the U.S. Government and others acting in its behalf -permission to use and distribute the software in accordance with the -terms specified in this license. diff --git a/third-party/qconsole2/qpyconsole.pro b/third-party/qconsole2/qpyconsole.pro deleted file mode 100644 index 471467de..00000000 --- a/third-party/qconsole2/qpyconsole.pro +++ /dev/null @@ -1,26 +0,0 @@ -###################################################################### -# Automatically generated by qmake (1.05a) Mon Jul 18 19:50:31 2005 -###################################################################### - -TEMPLATE = app -DEPENDPATH += include src ui -INCLUDEPATH += . include $(PYTHON_PATH)/include/python$(PYTHON_VERSION) -CONFIG += warn_on debug -QT += qt3support - -unix { - UI_DIR = .ui - MOC_DIR = .moc - OBJECTS_DIR = .obj - LIBS += -L$(PYTHON_PATH)/lib/python$(PYTHON_VERSION)/config - LIBS += -lpython$(PYTHON_VERSION) -lutil -} - -# Input -HEADERS += include/interceptor.h \ - include/qpyconsole.h \ - include/qconsole.h -SOURCES += src/interceptor.cpp \ - src/pymain.cpp \ - src/qpyconsole.cpp \ - src/qconsole.cpp diff --git a/third-party/qconsole2/qtclconsole.pro b/third-party/qconsole2/qtclconsole.pro deleted file mode 100644 index 2dd66db2..00000000 --- a/third-party/qconsole2/qtclconsole.pro +++ /dev/null @@ -1,32 +0,0 @@ -###################################################################### -# Automatically generated by qmake (1.05a) Mon Jul 18 19:50:31 2005 -###################################################################### - -TEMPLATE = app -DEPENDPATH += include src ui -INCLUDEPATH += . include $(TCL_PATH)/include -CONFIG += warn_on debug -QT += qt3support - -unix { - UI_DIR = .ui - MOC_DIR = .moc - OBJECTS_DIR = .obj - LIBS += -L$(TCL_PATH)/lib -ltcl8.4 -} - -# Input -HEADERS += include/commands.h \ - include/commandsManager.h \ - include/interceptor.h \ - include/qtclconsole.h \ - include/qconsole.h \ - include/tclnotify.h -SOURCES += src/commands.cpp \ - src/commandsManager.cpp \ - src/interceptor.cpp \ - src/tclmain.cpp \ - src/qtclconsole.cpp \ - src/qconsole.cpp \ - src/tclnotify.cpp - diff --git a/third-party/qconsole2/src/commands.cpp b/third-party/qconsole2/src/commands.cpp deleted file mode 100644 index 1de482e2..00000000 --- a/third-party/qconsole2/src/commands.cpp +++ /dev/null @@ -1,44 +0,0 @@ -/*************************************************************************** -commands.cpp - description -------------------- -begin : lun jun 27 2005 -copyright : (C) 2005 by houssem -email : houssem@localhost -***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -#include "commands.h" -#include -#include - -//Global callback function that implements the msgbox command -int CallQMessageBox( ClientData, Tcl_Interp* interp, int argc, char *argv[]) -{ - // Reset result data - Tcl_ResetResult(interp); - - //Help message in case of wrong parameters - if (argc != 3) - { - Tcl_AppendResult(interp, "Usage: msgbox title text\n", (char*) NULL); - return TCL_ERROR; - } - - //calls the messagebox with the parameters - int result = QMessageBox::warning(0, argv[1] , argv[2], QMessageBox::Yes, - QMessageBox::No, QMessageBox::Cancel); - - //displays the return value - Tcl_AppendResult(interp, QString("QMessageBox exited with result: %1\n").arg(result).ascii(), (char*) NULL); - - return TCL_OK; -} - diff --git a/third-party/qconsole2/src/commandsManager.cpp b/third-party/qconsole2/src/commandsManager.cpp deleted file mode 100644 index 2b8df989..00000000 --- a/third-party/qconsole2/src/commandsManager.cpp +++ /dev/null @@ -1,110 +0,0 @@ -/*************************************************************************** -commandsManager.cpp - description -------------------- -begin : lun jun 27 2005 -copyright : (C) 2005 by houssem -email : houssem@localhost -***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -#include "commandsManager.h" - -commandsManager *commandsManager::theInstance = NULL; - -commandsManager::commandsManager(Tcl_Interp* _interp) -{ - if (!_interp) - { - //Initialize the Tcl interpreter - interp = Tcl_CreateInterp(); - Tcl_Init( interp ); - } - else - interp = _interp; -} - -commandsManager::~commandsManager() -{ - TclCallBack::unregisterAll(); -} - -commandsManager *commandsManager::getInstance(Tcl_Interp* interp) -{ - if (!theInstance) - { - theInstance = new commandsManager(interp); - //Register the help command - TclCallBack::registerMethod(theInstance, "help", &commandsManager::help, "displays this help message"); - } - return theInstance; -} - -void commandsManager::registerFunction(char *commandName, commandType function, char *helpMsg, void *param) -{ - commandsHelp[commandName] = helpMsg; - Tcl_CreateCommand(interp, commandName, function, param, (Tcl_CmdDeleteProc*) NULL); -} - -void commandsManager::unregisterFunction(const char *commandName) -{ - commandsHelp.remove(commandName); - Tcl_DeleteCommand(interp, commandName); -} - -void commandsManager::registerVariable(char *varName, int &Var, char *helpMsg) -{ - varsHelp[varName] = helpMsg; - Tcl_LinkVar(interp, varName, (char *)&Var, TCL_LINK_INT); -} - -void commandsManager::registerVariable(char *varName, bool &Var, char *helpMsg) -{ - varsHelp[varName] = helpMsg; - Tcl_LinkVar(interp, varName, (char *)&Var, TCL_LINK_BOOLEAN); -} - -void commandsManager::registerVariable(char *varName, char* &Var, char *helpMsg) -{ - varsHelp[varName] = helpMsg; - Tcl_LinkVar(interp, varName, (char *)&Var, TCL_LINK_STRING); -} - -int commandsManager::help( ClientData, Tcl_Interp* interp, int argc, const char *[]) -{ - // Reset result data - Tcl_ResetResult(interp); - - //Help message in case of wrong parameters - if (argc != 1) - { - Tcl_AppendResult(interp, "Usage: help\n", (char*) NULL); - return TCL_ERROR; - } - - QMap::Iterator it; - if (commandsHelp.size()) - { - Tcl_AppendResult(interp, "Commands :\n", (char*) NULL); - Tcl_AppendResult(interp, "==========\n", (char*) NULL); - for ( it = commandsHelp.begin(); it != commandsHelp.end(); ++it ) - Tcl_AppendResult(interp, QString("%1:\t\t\t%2\n").arg(it.key()).arg(it.data()).ascii(), (char*) NULL); - } - - if (varsHelp.size()) - { - Tcl_AppendResult(interp, "\nVariables :\n", (char*) NULL); - Tcl_AppendResult(interp, "===========\n", (char*) NULL); - for ( it = varsHelp.begin(); it != varsHelp.end(); ++it ) - Tcl_AppendResult(interp, QString("%1:\t\t%2\n").arg(it.key()).arg(it.data()).ascii(), (char*) NULL); - } - - return TCL_OK; -} diff --git a/third-party/qconsole2/src/interceptor.cpp b/third-party/qconsole2/src/interceptor.cpp deleted file mode 100644 index 9b11f4a0..00000000 --- a/third-party/qconsole2/src/interceptor.cpp +++ /dev/null @@ -1,94 +0,0 @@ -// -// Author: Kuba Ober -// Downloaded from: http://www.ibib.waw.pl/~winnie -// -// License:  Public domain -// - -#include -#include -#include -#include -#include -#include - -#include -#include -#include "interceptor.h" - -using namespace std; - -Interceptor::Interceptor(QObject * parent) : -QObject(parent), - m_stream(0), - m_notifier(0) -{ -} - -Interceptor::~Interceptor() -{ - finish(); -} - -void Interceptor::initialize(int outFd) -{ - if (m_notifier != 0) finish(); - - m_origFd = outFd; - - // m_pipefd[0] is the read-end of the pipe and m_pipefd[1] is the write-end. - - // Open a new pipe. We will pipe output file descriptor through the new pipe and - // read it with a QTextIStream object, using a QSocketNotifier to tell us when - // something is waiting in the pipe. - int rc = ::pipe(m_pipeFd); - assert (rc >= 0); - - // Save the original output descriptor. - m_origFdCopy = ::dup(m_origFd); - assert(m_origFdCopy >= 0); - - // Make the ouput descriptor a copy of pipe's write end - rc = ::dup2(m_pipeFd[1], m_origFd); - assert (rc >= 0); - ::close(m_pipeFd[1]); // close the write end of the pipe descriptor, it's redundant now - - // Open the pipe's read end non-blocking so that we can reliably get the data - rc = ::fcntl(m_pipeFd[0], F_GETFL); - assert(rc != -1); - rc = ::fcntl(m_pipeFd[0], F_SETFL, rc | O_NONBLOCK); // otherwise atEnd() will block! - assert(rc != -1); - FILE * f = fdopen(m_pipeFd[0], "r"); - assert(f != 0); - - if (m_stream != 0) delete m_stream; - if (m_notifier != 0) delete m_notifier; - m_stream = new QTextIStream(f); - m_notifier = new QSocketNotifier(m_pipeFd[0], QSocketNotifier::Read); - QObject::connect(m_notifier, SIGNAL(activated(int)), SLOT(received())); -} - -void Interceptor::received() -{ - emit received(m_stream); -} - -void Interceptor::finish() -{ - if (m_notifier == 0) return; - - std::cout.flush(); // flush standard output cout file descriptor - ::fflush(NULL); // flush all file buffers - ::fsync(1); // syncronize standard output buffers -- may be unnessessery - received(); // process whatever data is left there - - // Restore original state - delete m_notifier; - delete m_stream; - m_notifier = 0; - m_stream = 0; - - ::dup2(m_origFdCopy, m_origFd); // restore the output descriptor - ::close(m_origFdCopy); // close the copy as it's redundant now - ::close(m_pipeFd[0]); // close the reading end of the pipe -} diff --git a/third-party/qconsole2/src/pymain.cpp b/third-party/qconsole2/src/pymain.cpp deleted file mode 100644 index d9f7a226..00000000 --- a/third-party/qconsole2/src/pymain.cpp +++ /dev/null @@ -1,59 +0,0 @@ -/*************************************************************************** - main.cpp - description - ------------------- - begin : mar mar 8 2005 - copyright : (C) 2005 by houssem - email : houssem@localhost - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -#include -#include -#include "qpyconsole.h" - -/* Define the following to fix __ctype_* from GLIBC2.3 and upper - if not compiled using the same GLIBC */ -//#define FIX__CTYPE_ - -#ifdef FIX__CTYPE_ -#include -__const unsigned short int *__ctype_b; -__const __int32_t *__ctype_tolower; -__const __int32_t *__ctype_toupper; - -void ctSetup() -{ - __ctype_b = *(__ctype_b_loc()); - __ctype_toupper = *(__ctype_toupper_loc()); - __ctype_tolower = *(__ctype_tolower_loc()); -} -#endif - -//The main entry -int main( int argc, char ** argv ) -{ -#ifdef FIX__CTYPE_ - ctSetup(); -#endif - QApplication a( argc, argv ); - - //Create and show the main window - QMainWindow mw(0, "Application window"); - mw.setMinimumSize(640, 480); - //Instantiate and set the focus to the QPyConsole - QPyConsole *console = QPyConsole::getInstance(&mw); - mw.setFocusProxy((QWidget*)console); - mw.setCentralWidget((QWidget*)console); - a.setMainWidget(&mw); - mw.show(); - - return a.exec(); -} diff --git a/third-party/qconsole2/src/qconsole.cpp b/third-party/qconsole2/src/qconsole.cpp deleted file mode 100644 index 35b5a808..00000000 --- a/third-party/qconsole2/src/qconsole.cpp +++ /dev/null @@ -1,427 +0,0 @@ -/*************************************************************************** - qconsole.cpp - description - ------------------- - begin : mar mar 15 2005 - copyright : (C) 2005 by Houssem BDIOUI - email : houssem.bdioui@gmail.com - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -#include "qconsole.h" -#include - -#if QT_VERSION >= 0x040000 -#include -#include -#include -#include -//for Q3TextCursor usage -#include "q3richtext_p.h" -#define QTEXTCURSOR_CLASSNAME Q3TextCursor -#define CONTROL_BUTTON ControlModifier -#define WRITE_ONLY QIODevice::WriteOnly -#else -//for QTextCursor usage -#include -#define QTEXTCURSOR_CLASSNAME QTextCursor -#define CONTROL_BUTTON ControlButton -#define WRITE_ONLY IO_WriteOnly -#endif - -//Clear the console -void QConsole::clear() -{ - QTEXTEDIT_CLASSNAME::clear(); -} - -//Reset the console -void QConsole::reset() -{ - clear(); - //set the style of the QTextEdit - setTextFormat(Qt::PlainText); - setCurrentFont(QFont("Courier")); - //init attributes - historyIndex = 0; - history.clear(); - recordedScript.clear(); -} - -//QConsole constructor (init the QTextEdit & the attributes) -QConsole::QConsole(QWidget *parent, const char *name, bool initInterceptor) : QTEXTEDIT_CLASSNAME(parent,name), - cmdColor(Qt::black), errColor(Qt::red), outColor(Qt::blue), completionColor(Qt::green), - stdoutInterceptor(NULL), stderrInterceptor(NULL) -{ - //resets the console - reset(); - - if (initInterceptor) - { - //Initialize the interceptors - stdoutInterceptor = new Interceptor(this); - stdoutInterceptor->initialize(1); - connect(stdoutInterceptor, SIGNAL(received(QTextIStream *)), SLOT(displayPrompt())); - - stderrInterceptor = new Interceptor(this); - stderrInterceptor->initialize(2); - connect(stderrInterceptor, SIGNAL(received(QTextIStream *)), SLOT(displayPrompt())); - } -} - -//Sets the prompt and cache the prompt length to optimize the processing speed -void QConsole::setPrompt(QString newPrompt, bool display) -{ - prompt = newPrompt; - promptLength = prompt.length(); - //display the new prompt - if (display) - displayPrompt(); -} - -//Displays the prompt and move the cursor to the end of the line. -void QConsole::displayPrompt() -{ - //flush the stdout/stderr before displaying the prompt - if (stdoutInterceptor) - { - setColor(outColor); - stdReceived(stdoutInterceptor->textIStream()); - } - if (stderrInterceptor) - { - setColor(errColor); - stdReceived(stderrInterceptor->textIStream()); - } - //displays the prompt - setColor(cmdColor); - append(prompt); - QTEXTEDIT_CLASSNAME::moveCursor(QTEXTEDIT_CLASSNAME::MoveEnd, false); - //Saves the paragraph number of the prompt - promptParagraph = paragraphs() - 1; -} - -//displays redirected stdout/stderr -void QConsole::stdReceived(QTextIStream *s) -{ - QString line; -#if QT_VERSION >= 0x040000 - line = s->readAll(); - append(line); -#else - while (!s->atEnd()) - { - line = s->readLine(); - append(line); - } -#endif -} - -//Correctly handle the cursor when moved according to the different actions -void QConsole::moveCursor(CursorAction action, bool select) -{ - int para, index; - //save the old cursor position - getCursorPosition(¶, &index ); - //if home pressed, move the cursor just after the prompt (if in the first line) - //and select the covered text if needed - if ( (action == QTEXTEDIT_CLASSNAME::MoveLineStart) && (promptParagraph == para) ) - { - if (select) - setSelection(para, index, para, promptLength); - else - setCursorPosition(para, promptLength); - return; - } - //Process the up & down keys to navigate into the history (if not empty & if in the first line) - else if ( ( (action == QTEXTEDIT_CLASSNAME::MoveDown) || (action == QTEXTEDIT_CLASSNAME::MoveUp) ) - && history.size() && (promptParagraph == para)) - { - //update the historyIndex if up or down - if ( (action == QTEXTEDIT_CLASSNAME::MoveDown) && (historyIndex + 1 < history.size()) ) - historyIndex ++; - else if ((action == QTEXTEDIT_CLASSNAME::MoveUp) && historyIndex) - historyIndex --; - //replace the current command with the command found in the history - replaceCurrentCommand(history[historyIndex]); - } - else - QTEXTEDIT_CLASSNAME::moveCursor(action, select); - //Undo the new position if it is out of the edition zone and unselect as well - if (!isInEditionZone()) - { - setCursorPosition(para, index); - selectAll(false); - } -} - -//Redirect keyboard actions to perform text suppression and validation -//of the commands -void QConsole::doKeyboardAction(KeyboardAction action) -{ - //Get the current paragraph and the current cursor position - int para, index; - getCursorPosition(¶, &index ); - //Get the cursor - QTEXTCURSOR_CLASSNAME *cursor = textCursor(); - switch (action) - { - //Don't delete the prompt if backspace is pressed - case QTEXTEDIT_CLASSNAME::ActionBackspace: - { - if ( (promptParagraph == para) && (index == promptLength) ) - return; - } - break; - - //Don't delete the prompt if ctrl+backspace is pressed - case QTEXTEDIT_CLASSNAME::ActionWordBackspace: - { - //trick to get the new position of the cursor - cursor->gotoPreviousWord(); - //exit if the new position is out of the edition zone - bool error = false; - if ( !isInEditionZone()) - error = true; - setCursorPosition(para, index); - if (error) - return; - } - break; - - // If return pressed, do the evaluation and append the result - case QTEXTEDIT_CLASSNAME::ActionReturn: - { - //Get the command to validate - QString command = getCurrentCommand(); - //execute the command and get back its text result and its return value - if (isCommandComplete(command)) - execCommand(command, false); - else - { - append(""); - QTEXTEDIT_CLASSNAME::moveCursor(QTEXTEDIT_CLASSNAME::MoveEnd, false); - } - return; - } - break; - - default: - break; - } - //If we are here, this means that we can perform the action - //by calling the parent implementation - QTEXTEDIT_CLASSNAME::doKeyboardAction(action); -} - -//Don't remove any text if the selection is not inside the edition zone -void QConsole::removeSelectedText(int selNum) -{ - //get where the current selection starts and where it ends - int paraFrom, indexFrom, paraTo, indexTo; - getSelection( ¶From, &indexFrom, ¶To, &indexTo, selNum); - //check if the selection is inside the selection zone and then delete it - //else unselect - if (isInEditionZone() && ((paraFrom > promptParagraph) || - ( (paraFrom == promptParagraph) && (indexFrom >= promptLength) )) ) - QTEXTEDIT_CLASSNAME::removeSelectedText(selNum); - else - selectAll(false); -} - -//Reimplemented mouse press event -void QConsole::contentsMousePressEvent( QMouseEvent *e ) -{ - //Saves the old position of the cursor before any mouse click - getCursorPosition(&oldPara, &oldIndex ); - //Call the parent implementation - QTEXTEDIT_CLASSNAME::contentsMousePressEvent( e ); - //Saves the new position of the cursor - getCursorPosition(&newPara, &newIndex ); -} - -//Reimplemented mouse release event -void QConsole::contentsMouseReleaseEvent( QMouseEvent *e ) -{ - //Call the parent implementation - QTEXTEDIT_CLASSNAME::contentsMouseReleaseEvent( e ); - //Undo the new cursor position if it is out of the edition zone - if (!isInEditionZone()) - setCursorPosition(oldPara, oldIndex ); -} - -//Reimplemented mouse dblclk event -void QConsole::contentsMouseDoubleClickEvent( QMouseEvent *e ) -{ - setCursorPosition(newPara, newIndex ); - //Call the parent implementation - QTEXTEDIT_CLASSNAME::contentsMouseDoubleClickEvent( e ); -} - -//give suggestions to autocomplete a command (should be reimplemented) -//the return value of the function is the string list of all suggestions -QStringList QConsole::autocompleteCommand(QString) -{ - return QStringList(); -} - -//Reimplemented key press event -void QConsole::keyPressEvent( QKeyEvent *e ) -{ - //If Ctrl + C pressed, then undo the current command - if ( (e->key() == Qt::Key_C) && (e->state() == Qt::CONTROL_BUTTON) ) - displayPrompt(); - //Treat the tab key & autocomplete the current command - else if (e->key() == Qt::Key_Tab) - { - QString command = getCurrentCommand(); - QStringList sl = autocompleteCommand(command); - QString str = sl.join(" "); - if (sl.count() == 1) - replaceCurrentCommand(sl[0] + " "); - else if (sl.count() > 1) - { - setColor(completionColor); - append(sl.join(" ")); - setColor(cmdColor); - displayPrompt(); - QTEXTEDIT_CLASSNAME::insert(command); - } - } - else - QTEXTEDIT_CLASSNAME::keyPressEvent( e ); -} - -//Get the current command -QString QConsole::getCurrentCommand() -{ - //Get the current command: we just remove the prompt - setSelection(promptParagraph, promptLength, paragraphs()-1, paragraphLength(paragraphs()-1)); - QString command = selectedText(); - selectAll(false); - return command; -} - -//Replace current command with a new one -void QConsole::replaceCurrentCommand(QString newCommand) -{ - setSelection(promptParagraph, promptLength, paragraphs()-1, paragraphLength(paragraphs()-1)); - QTEXTEDIT_CLASSNAME::insert(newCommand); -} - -//default implementation: command always complete -bool QConsole::isCommandComplete(QString ) -{ - return true; -} - -//Tests whether the cursor is in th edition zone or not (after the prompt -//or in the next lines (in case of multi-line mode) -bool QConsole::isInEditionZone() -{ - int para, index; - getCursorPosition(¶, &index ); - return (para > promptParagraph) || ( (para == promptParagraph) && (index >= promptLength) ); -} - -//Basically, puts the command into the history list -//And emits a signal (should be called by reimplementations) -QString QConsole::interpretCommand(QString command, int *res) -{ - //Add the command to the recordedScript list - if (!*res) - recordedScript.append(command); - //update the history and its index - history.append(command.replace("\n", "\\n")); - historyIndex = history.size(); - //emit the commandExecuted signal - emit commandExecuted(command); - return ""; -} - -//execCommand(QString) executes the command and displays back its result -void QConsole::execCommand(QString command, bool writeCommand, bool showPrompt) -{ - //Display the prompt with the command first - if (writeCommand) - { - if (getCurrentCommand() != "") - displayPrompt(); - QTEXTEDIT_CLASSNAME::insert(command); - } - //execute the command and get back its text result and its return value - int res; - QString strRes = interpretCommand(command, &res); - //According to the return value, display the result either in red or in blue - if (res == 0) - setColor(outColor); - else - setColor(errColor); - append(strRes); - //Display the prompt again - if (showPrompt) - displayPrompt(); -} - -//saves a file script -int QConsole::saveScript(QString fileName) -{ - QFile f(fileName); - if (!f.open(WRITE_ONLY)) - return -1; - QTextStream ts(&f); - for ( QStringList::Iterator it = recordedScript.begin(); it != recordedScript.end(); ++it) - ts << *it << "\n"; - - f.close(); - return 0; -} - -//loads a file script -int QConsole::loadScript(QString fileName) -{ - QFile f(fileName); - if (!f.open(IO_ReadOnly)) - return -1; - QTextStream ts(&f); - QString command; - while(true) - { - command=ts.readLine(); - if (command.isNull()) - break; //done - execCommand(command, true, false); - } - f.close(); - return 0; -} - -//redefined insert() slot to avoid inserting text outside of the -//edition zone: Fixes a bug that happens when holding the mouse button -//pressed outside the edition zone and typing something -void QConsole::insert(const QString & text, bool indent, bool checkNewLine, bool removeSelected) -{ - if (isInEditionZone()) - QTEXTEDIT_CLASSNAME::insert(text, indent, checkNewLine, removeSelected); -} - -//Just disable the popup menu -QPOPUPMENU_CLASSNAME * QConsole::createPopupMenu (const QPoint &) -{ - return NULL; -} - -//Allows pasting with middle mouse button (x window) -//when clicking outside of the edition zone -void QConsole::paste() -{ - setCursorPosition(oldPara, oldIndex ); - QTEXTEDIT_CLASSNAME::paste(); -} diff --git a/third-party/qconsole2/src/qpyconsole.cpp b/third-party/qconsole2/src/qpyconsole.cpp deleted file mode 100644 index 786e6958..00000000 --- a/third-party/qconsole2/src/qpyconsole.cpp +++ /dev/null @@ -1,357 +0,0 @@ -/* - QPyConsole.cpp - - Controls the GEMBIRD Silver Shield PM USB outlet device - - (C) 2006, Mondrian Nuessle, Computer Architecture Group, University of Mannheim, Germany - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - - nuessle@uni-mannheim.de - -*/ - -#include -#include "qpyconsole.h" - -PyObject* glb; -PyObject* loc; - - -QString resultString; - -static PyObject* redirector_init(PyObject *, PyObject *) -{ - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject* redirector_write(PyObject *, PyObject *args) -{ - char* output; - PyObject *selfi; - - if (!PyArg_ParseTuple(args,"Os",&selfi,&output)) - { - return NULL; - } - - resultString.append(output); - Py_INCREF(Py_None); - return Py_None; -} - -static PyMethodDef redirectorMethods[] = -{ - {"__init__", redirector_init, METH_VARARGS, - "initialize the stdout/err redirector"}, -{"write", redirector_write, METH_VARARGS, - "implement the write method to redirect stdout/err"}, - {NULL,NULL,0,NULL}, -}; - -static PyObject* py_clear(PyObject *, PyObject *) -{ - QPyConsole::getInstance()->clear(); - return Py_None; -} - -static PyObject* py_reset(PyObject *, PyObject *) -{ - QPyConsole::getInstance()->reset(); - return Py_None; -} - -static PyObject* py_save(PyObject *, PyObject *args) -{ - char* filename; - if (!PyArg_ParseTuple(args,"s",&filename)) - { - return NULL; - } - QPyConsole::getInstance()->saveScript(filename); - return Py_None; -} - -static PyObject* py_load(PyObject *, PyObject *args) -{ - char* filename; - if (!PyArg_ParseTuple(args,"s",&filename)) - { - return NULL; - } - QPyConsole::getInstance()->loadScript(filename); - - return Py_None; -} - -static PyObject* py_history(PyObject *, PyObject *) -{ - QPyConsole::getInstance()->printHistory(); - return Py_None; -} - -static PyObject* py_quit(PyObject *, PyObject *) -{ - //QPyConsole::getInstance()->printHistory(); - resultString="Use reset() to restart the interpreter; otherwise exit your application\n"; - return Py_None; -} - - -static PyMethodDef ModuleMethods[] = { {NULL,NULL,0,NULL} }; -static PyMethodDef console_methods[] = { - {"clear",py_clear, METH_VARARGS,"clears the console"}, -{"reset",py_reset, METH_VARARGS,"reset the interpreter and clear the console"}, - {"save",py_save, METH_VARARGS,"save commands up to now in given file"}, -{"load",py_load, METH_VARARGS,"load commands from given file"}, - {"history",py_history, METH_VARARGS,"shows the history"}, -{"quit",py_quit, METH_VARARGS,"print information about quitting"}, - - {NULL, NULL,0,NULL} -}; - -void initredirector() -{ - PyMethodDef *def; - - /* create a new module and class */ - PyObject *module = Py_InitModule("redirector", ModuleMethods); - PyObject *moduleDict = PyModule_GetDict(module); - PyObject *classDict = PyDict_New(); - PyObject *className = PyString_FromString("redirector"); - PyObject *fooClass = PyClass_New(NULL, classDict, className); - PyDict_SetItemString(moduleDict, "redirector", fooClass); - Py_DECREF(classDict); - Py_DECREF(className); - Py_DECREF(fooClass); - - /* add methods to class */ - for (def = redirectorMethods; def->ml_name != NULL; def++) { - PyObject *func = PyCFunction_New(def, NULL); - PyObject *method = PyMethod_New(func, NULL, fooClass); - PyDict_SetItemString(classDict, def->ml_name, method); - Py_DECREF(func); - Py_DECREF(method); - } -} - -void QPyConsole::printHistory() -{ - uint index = 1; - for ( QStringList::Iterator it = history.begin(); it != history.end(); ++it ) - { - // Tcl_AppendResult(interp, QString("%1\t%2\n").arg(index).arg(*it).ascii(), (char*) NULL); - resultString.append(QString("%1\t%2\n").arg(index).arg(*it).ascii()); - index ++; - } -} - -QPyConsole *QPyConsole::theInstance = NULL; - -QPyConsole *QPyConsole::getInstance(QWidget *parent, const char *name) -{ - if (!theInstance) - { - theInstance = new QPyConsole(parent, name); - } - return theInstance; -} - -//QTcl console constructor (init the QTextEdit & the attributes) -QPyConsole::QPyConsole(QWidget *parent, const char *name) : QConsole(parent,name,false),lines(0) -{ - - //set the Tcl Prompt - setPrompt(">>"); - Py_Initialize(); - loc = PyDict_New (); - glb = PyDict_New (); - PyDict_SetItemString (glb, "__builtins__", PyEval_GetBuiltins ()); - initredirector(); - //Py_InitModule("console", console_methods); - PyImport_AddModule("console"); - Py_InitModule("console", console_methods); - - PyImport_ImportModule("rlcompleter"); - - //PyImport_ImportModule("console"); - PyRun_SimpleString("import sys\n" - "import redirector\n" - "import console\n" - "import rlcompleter\n" - "sys.stdout = redirector.redirector()\n" - "sys.stderr = sys.stdout\n" - "import __builtin__\n" - "__builtin__.clear=console.clear\n" - "__builtin__.reset=console.reset\n" - "__builtin__.save=console.save\n" - "__builtin__.load=console.load\n" - "__builtin__.history=console.history\n" - "__builtin__.quit=console.quit\n" - "__builtin__.completer=rlcompleter.Completer()\n" - ); - - setCompletionColor(Qt::green); - -} -char save_error_type[1024], save_error_info[1024]; - -bool -QPyConsole::py_check_for_unexpected_eof() -{ - - PyObject *errobj, *errdata, *errtraceback, *pystring; - - /* get latest python exception info */ - PyErr_Fetch(&errobj, &errdata, &errtraceback); - - pystring = NULL; - if (errobj != NULL && - (pystring = PyObject_Str(errobj)) != NULL && /* str(object) */ - (PyString_Check(pystring)) - ) - { - strcpy(save_error_type, PyString_AsString(pystring)); - } - else - strcpy(save_error_type, ""); - Py_XDECREF(pystring); - - pystring = NULL; - if (errdata != NULL && - (pystring = PyObject_Str(errdata)) != NULL && - (PyString_Check(pystring)) - ) - strcpy(save_error_info, PyString_AsString(pystring)); - else - strcpy(save_error_info, ""); - Py_XDECREF(pystring); - - if (strcmp(save_error_type,"exceptions.SyntaxError")==0 && - strncmp(save_error_info,"('unexpected EOF while parsing',",32)==0) - { - return true; - } - PyErr_Print (); - resultString="Error: "; - resultString.append(save_error_info); - Py_XDECREF(errobj); - Py_XDECREF(errdata); /* caller owns all 3 */ - Py_XDECREF(errtraceback); /* already NULL'd out */ - return false; -} - -//Desctructor -QPyConsole::~QPyConsole() -{ - Py_Finalize(); -} - -//Call the Python interpreter to execute the command -//retrieve back results using the python internal stdout/err redirectory (see above) -QString QPyConsole::interpretCommand(QString command, int *res) -{ - PyObject* py_result; - PyObject* dum; - bool multiline=false; - if (!command.isEmpty() || (command.isEmpty() && lines!=0)) - { - this->command.append(command); - py_result=Py_CompileString(this->command.ascii(),"",Py_single_input); - if (py_result==0) - { - multiline=py_check_for_unexpected_eof(); - if (multiline) - { - this->command.append("\n"); - lines++; - *res=0; - resultString=""; - QConsole::interpretCommand(command, res); - return ""; - } - else - { - *res=-1; - QString result=resultString; - resultString=""; - QConsole::interpretCommand(command, res); - this->command=""; - this->lines=0; - return result; - } - } - if ( (lines!=0 && command=="") || (this->command!="" && lines==0)) - { - this->command=""; - this->lines=0; - - dum = PyEval_EvalCode ((PyCodeObject *)py_result, glb, loc); - Py_XDECREF (dum); - Py_XDECREF (py_result); - if (PyErr_Occurred ()) - { - *res=-1; - PyErr_Print (); - } - QString result=resultString; - resultString=""; - if (command!="") - QConsole::interpretCommand(command, res); - return result; - } - else if (lines!=0 && command!="") //following multiliner line - { - this->command.append("\n"); - *res=0; - QConsole::interpretCommand(command, res); - return ""; - } - else - { - return ""; - } - - } - else - return ""; -} - -QStringList QPyConsole::autocompleteCommand(QString cmd) -{ - char run[255]; - int n =0; - QStringList list; - resultString=""; - do { - snprintf(run,255,"print completer.complete(\"%s\",%d)\n",cmd.ascii(),n); - PyRun_SimpleString(run); - resultString=resultString.stripWhiteSpace(); //strip trialing newline - if (resultString!="None") - { - list.append(resultString); - resultString=""; - } - else - { - resultString=""; - break; - } - n++; - } while (true); - return list; -} diff --git a/third-party/qconsole2/src/qtclconsole.cpp b/third-party/qconsole2/src/qtclconsole.cpp deleted file mode 100644 index d3303714..00000000 --- a/third-party/qconsole2/src/qtclconsole.cpp +++ /dev/null @@ -1,152 +0,0 @@ -/*************************************************************************** - qtclconsole.cpp - description - ------------------- - begin : mar mar 15 2005 - copyright : (C) 2005 by Houssem BDIOUI - email : houssem.bdioui@gmail.com - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -#include "qtclconsole.h" -#include "commands.h" -#include "commandsManager.h" - -//callback method that implements the history command -int QtclConsole::showHistory( ClientData, Tcl_Interp* interp, int argc, const char *[]) -{ - // Reset result data - Tcl_ResetResult(interp); - - //Help message in case of wrong parameters - if (argc != 1) - { - Tcl_AppendResult(interp, "Usage: history\n", (char*) NULL); - return TCL_ERROR; - } - - uint index = 1; - for ( QStringList::Iterator it = history.begin(); it != history.end(); ++it ) - { - Tcl_AppendResult(interp, QString("%1\t%2\n").arg(index).arg(*it).ascii(), (char*) NULL); - index ++; - } - - return TCL_OK; -} - -//callback method that implements the set_prompt command -int QtclConsole::setPrompt( ClientData, Tcl_Interp* interp, int argc, const char *argv[]) -{ - // Reset result data - Tcl_ResetResult(interp); - - //Help message in case of wrong parameters - if (argc != 2) - { - Tcl_AppendResult(interp, "Usage: set_prompt newPrompt\n", (char*) NULL); - return TCL_ERROR; - } - - QConsole::setPrompt(argv[1], false); - - return TCL_OK; -} - -//callback method that calls the saveScript() method -int QtclConsole::saveScript( ClientData, Tcl_Interp* interp, int argc, const char *argv[]) -{ - // Reset result data - Tcl_ResetResult(interp); - - //Help message in case of wrong parameters - if (argc != 2) - { - Tcl_AppendResult(interp, "Usage: save_script script_name\n", (char*) NULL); - return TCL_ERROR; - } - - if (!QConsole::saveScript(argv[1])) - return TCL_ERROR; - else - return TCL_OK; -} - -QtclConsole *QtclConsole::theInstance = NULL; - -QtclConsole *QtclConsole::getInstance(QWidget *parent, const char *name) -{ - if (!theInstance) - theInstance = new QtclConsole(parent, name); - return theInstance; -} - -//QTcl console constructor (init the QTextEdit & the attributes) -QtclConsole::QtclConsole(QWidget *parent, const char *name) : QConsole(parent,name) -{ - //Register the msgbox command - TclCallBack::registerMethod(this, "history", &QtclConsole::showHistory, "Shows the commands history"); - - //Register the set_prompt command - TclCallBack::registerMethod(this, "set_prompt", &QtclConsole::setPrompt, "Set a new prompt"); - - //Register the set_prompt command - TclCallBack::registerMethod(this, "save_script", &QtclConsole::saveScript, "Saves a script of executed commands"); - - //Get the Tcl interpreter - interp = commandsManager::getInstance()->tclInterp(); - - //set the Tcl Prompt - QConsole::setPrompt("QTcl shell> "); -} - -//Destructor -QtclConsole::~QtclConsole() -{ - //unregister all the methods - TclCallBack::unregisterAll(); -} - -//Call the TCL interpreter to execute the command -//And retrieve back the result -QString QtclConsole::interpretCommand(QString command, int *res) -{ - if (!command.isEmpty()) - { - //Do the Tcl evaluation - *res = Tcl_Eval( interp, command.ascii() ); - //Get the string result of the executed command - const char * result = Tcl_GetString( Tcl_GetObjResult( interp ) ); - //Call the parent implementation - QConsole::interpretCommand(command, res); - return result; - } - else - return ""; -} - -bool QtclConsole::isCommandComplete(QString command) -{ - //return Tcl_CommandComplete(command) && (!command.stripWhiteSpace().endsWith("\\")); - return Tcl_CommandComplete(command); -} - -QStringList QtclConsole::autocompleteCommand(QString cmd) -{ - int res = Tcl_Eval( interp, "info commands [join {" + cmd + "*}]" ); - if (!res) - { - //Get the string result of the executed command - const char * result = Tcl_GetString( Tcl_GetObjResult( interp ) ); - return QStringList::split(" ", result); - } - else - return QStringList(); -} diff --git a/third-party/qconsole2/src/tclmain.cpp b/third-party/qconsole2/src/tclmain.cpp deleted file mode 100644 index a3cb39cb..00000000 --- a/third-party/qconsole2/src/tclmain.cpp +++ /dev/null @@ -1,71 +0,0 @@ -/*************************************************************************** - tclmain.cpp - description - ------------------- - begin : mar mar 8 2005 - copyright : (C) 2005 by houssem - email : houssem@localhost - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -#include -#include -#include "commands.h" -#include "commandsManager.h" -#include "qtclconsole.h" -#include "tclnotify.h" - -extern void Qtk_InitNotifier( QApplication * ); - -/* Define the following to fix __ctype_* from GLIBC2.3 and upper - if not compiled using the same GLIBC */ -//#define FIX__CTYPE_ - -#ifdef FIX__CTYPE_ -#include -__const unsigned short int *__ctype_b; -__const __int32_t *__ctype_tolower; -__const __int32_t *__ctype_toupper; - -void ctSetup() -{ - __ctype_b = *(__ctype_b_loc()); - __ctype_toupper = *(__ctype_toupper_loc()); - __ctype_tolower = *(__ctype_tolower_loc()); -} -#endif - -//The main entry -int main( int argc, char ** argv ) -{ -#ifdef FIX__CTYPE_ - ctSetup(); -#endif - Tcl_FindExecutable(argv[0]); - Tcl_Interp * interp = Tcl_CreateInterp(); - Tcl_Init( interp ); - - QApplication a( argc, argv ); - Tcl_SetServiceMode (TCL_SERVICE_ALL); - Qtk_InitNotifier( &a ); - //Register the msgbox command - commandsManager::getInstance(interp)->registerFunction("msgbox" , (commandsManager::commandType) CallQMessageBox, "Shows the Qt message box"); - //Create and show the main window - QMainWindow mw(0, "Application window"); - mw.setMinimumSize(640, 480); - //Instantiate and set the focus to the QtclConsole - QtclConsole *console = QtclConsole::getInstance(&mw); - mw.setFocusProxy((QWidget*)console); - mw.setCentralWidget((QWidget*)console); - a.setMainWidget(&mw); - mw.show(); - - return a.exec(); -} diff --git a/third-party/qconsole2/src/tclnotify.cpp b/third-party/qconsole2/src/tclnotify.cpp deleted file mode 100644 index c7663675..00000000 --- a/third-party/qconsole2/src/tclnotify.cpp +++ /dev/null @@ -1,537 +0,0 @@ -/* - * Copyright (c) 2005 by Ulrich Ring - * - * This is a clone of the file unix/tclNotify.c from the - * Tcl distribution. - * - * It contained the notifier driver implementation for the - * Xt intrinsics. - * - * Copyright (c) 1997 by Sun Microsystems, Inc. - * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - * - * RCS: @(#) $Id: tclnotify.cpp,v 1.25 2004/03/08 08:33:40 ur Exp $ - */ - -#include "tclnotify.h" -#include -#include -#include - -/* - * The following structure is what is added to the Tcl event queue when - * file handlers are ready to fire. - */ - -struct FileHandlerEvent -{ - Tcl_Event header; - /* Information that is standard for - * all events. */ - int fd; - /* File descriptor that is ready. Used - * to find the FileHandler structure for - * the file (can't point directly to the - * FileHandler structure because it could - * go away while the event is queued). */ -}; - -// -// The following static structure contains the state information for the -// Qt based implementation of the Tcl notifier. -// - -class NotifierState -{ - public: - NotifierState(QApplication *app); - ~NotifierState(); - QApplication *qapp; // The Qt application - QTimer *timer; // A QTimer - // Handle timeouts - TclTimeNotifier *timeNotifier; - int currentTimeout; // Non 0, if timer active - // Pointer to head of file handler list - TclFileHandler *firstFileHandlerPtr; -}; - -static NotifierState * notifier = 0; - -/* - * Static routines defined in this file. - */ - -static int FileHandlerEventProc( Tcl_Event *evPtr, int flags ); -static void NotifierExitHandler( ClientData clientData ); -static void CreateFileHandler( int fd, int mask, -Tcl_FileProc * proc, ClientData clientData ); -static void DeleteFileHandler( int fd ); -static void SetTimer( Tcl_Time * timePtr ); -static int WaitForEvent( Tcl_Time * timePtr ); - -/* - *---------------------------------------------------------------------- - * - * FileHandlerEventProc -- - * - * This procedure is called by Tcl_ServiceEvent when a file event - * reaches the front of the event queue. This procedure is - * responsible for actually handling the event by invoking the - * callback for the file handler. - * - * Results: - * Returns 1 if the event was handled, meaning it should be removed - * from the queue. Returns 0 if the event was not handled, meaning - * it should stay on the queue. The only time the event isn't - * handled is if the TCL_FILE_EVENTS flag bit isn't set. - * - * Side effects: - * Whatever the file handler's callback procedure does. - * - *---------------------------------------------------------------------- - */ - -static int -FileHandlerEventProc( -Tcl_Event *evPtr, /* Event to service. */ -int flags) -/* Flags that indicate what events to - * handle, such as TCL_FILE_EVENTS. */ -{ - TclFileHandler *filePtr; - FileHandlerEvent *fileEvPtr = (FileHandlerEvent *) evPtr; - int mask; - - if (!(flags & TCL_FILE_EVENTS)) { - return 0; - } - - /* - * Search through the file handlers to find the one whose handle matches - * the event. We do this rather than keeping a pointer to the file - * handler directly in the event, so that the handler can be deleted - * while the event is queued without leaving a dangling pointer. - */ - - for (filePtr = notifier->firstFileHandlerPtr; filePtr != NULL; - filePtr = filePtr->nextPtr) { - if (filePtr->fd != fileEvPtr->fd) { - continue; - } - - /* - * The code is tricky for two reasons: - * 1. The file handler's desired events could have changed - * since the time when the event was queued, so AND the - * ready mask with the desired mask. - * 2. The file could have been closed and re-opened since - * the time when the event was queued. This is why the - * ready mask is stored in the file handler rather than - * the queued event: it will be zeroed when a new - * file handler is created for the newly opened file. - */ - - mask = filePtr->readyMask & filePtr->mask; - filePtr->readyMask = 0; - if (mask != 0) { - (*filePtr->proc)(filePtr->clientData, mask); - } - break; - } - return 1; -} - -//----------------------------------------------------------------- -NotifierState::NotifierState(QApplication *app) : qapp(app), -currentTimeout(0), firstFileHandlerPtr(0) -{ - timer = new QTimer(); - timeNotifier = new TclTimeNotifier(); - timeNotifier->connect( timer, SIGNAL(timeout()), SLOT(gong()) ); -} - -NotifierState::~NotifierState() -{ - if (notifier->currentTimeout) { - notifier->timer->stop(); - } - delete timer; - delete timeNotifier; - for (; notifier->firstFileHandlerPtr != NULL; ) { - DeleteFileHandler(notifier->firstFileHandlerPtr->fd); - /* - * original calls Tcl_DeleteFileHandler() which actually - * is redirected to DeleteFileHandler() - */ - } -} - -//----------------------------------------------------------------- -TclTimeNotifier::TclTimeNotifier() : -QObject(0, "TclTimeNotifier") -{ -} - -TclTimeNotifier::~TclTimeNotifier() -{ -} - -void -TclTimeNotifier::gong() -{ - notifier->currentTimeout = 0; - Tcl_ServiceAll(); -} - -//----------------------------------------------------------------- -TclFileHandler::TclFileHandler( int f ) : -fd(f), mask(0), readyMask(0), -read(0), write(0), except(0) -{ - // insert in list of file handlers - nextPtr = notifier->firstFileHandlerPtr; - notifier->firstFileHandlerPtr = this; -} - -TclFileHandler::~TclFileHandler() -{ - if (read) delete read; - if (write) delete write; - if (except) delete write; -} - -void -TclFileHandler::fileactive( int f ) -{ - /* - * Determine which event happened. - */ - const QObject *s = sender(); - int current_mask = 0; - - if (s == read) { - current_mask = TCL_READABLE; - } - else if (s == write) { - current_mask = TCL_WRITABLE; - } - else if (s == except) { - current_mask = TCL_EXCEPTION; - } - else { - // FIXME: should panic - } - - /* - * Ignore unwanted or duplicate events. - */ - - if (!(mask & current_mask) || (readyMask & current_mask)) { - return; - } - - /* - * This is an interesting event, so put it onto the event queue. - */ - - FileHandlerEvent *fileEvPtr; - readyMask |= mask; - fileEvPtr = (FileHandlerEvent *) ckalloc(sizeof(FileHandlerEvent)); - fileEvPtr->header.proc = FileHandlerEventProc; - fileEvPtr->fd = f; - Tcl_QueueEvent((Tcl_Event *) fileEvPtr, TCL_QUEUE_TAIL); - - /* - * Process events on the Tcl event queue before returning to Xt. - */ - - Tcl_ServiceAll(); -} - -static void FinalizeNotifier( ClientData ) -{ - // do nothing -} - -/* - *---------------------------------------------------------------------- - * - * Qtk_InitNotifier -- - * - * Initializes the notifier state. - * - * Results: - * None. - * - * Side effects: - * Creates a new exit handler. - * - *---------------------------------------------------------------------- - */ - -void -Qtk_InitNotifier(QApplication *qapp) -{ - // The (global) QApplication must exists - Q_ASSERT(qapp); - - /* - * Only reinitialize if we are not in exit handling. The notifier - * can get reinitialized after its own exit handler has run, because - * of exit handlers for the I/O and timer sub-systems (order dependency). - */ - - if (TclInExit()) { - return; - } - - Tcl_NotifierProcs notifier_info; - notifier_info.createFileHandlerProc = CreateFileHandler; - notifier_info.deleteFileHandlerProc = DeleteFileHandler; - notifier_info.setTimerProc = SetTimer; - notifier_info.waitForEventProc = WaitForEvent; - notifier_info.initNotifierProc = 0; - notifier_info.finalizeNotifierProc = FinalizeNotifier; - notifier_info.alertNotifierProc = 0; - notifier_info.serviceModeHookProc = 0; - Tcl_SetNotifier(¬ifier_info); - - /* - * DO NOT create the application context yet; doing so would prevent - * external applications from setting it for us to their own ones. - */ - Tcl_CreateExitHandler(NotifierExitHandler, NULL); - - if (!notifier) { - static NotifierState ns(qapp); - notifier = &ns; - } -} - -/* - *---------------------------------------------------------------------- - * - * NotifierExitHandler -- - * - * This function is called to cleanup the notifier state before - * Tcl is unloaded. - * - * Results: - * None. - * - * Side effects: - * Destroys the notifier window. - * - *---------------------------------------------------------------------- - */ - -static void -NotifierExitHandler( -ClientData /* clientData */) -{ -} - -/* - *---------------------------------------------------------------------- - * - * SetTimer -- - * - * This procedure sets the current notifier timeout value. - * - * Results: - * None. - * - * Side effects: - * Replaces any previous timer. - * - *---------------------------------------------------------------------- - */ - -static void -SetTimer( -Tcl_Time *timePtr) /* Timeout value, may be NULL. */ -{ - Q_ASSERT(notifier); - - if (notifier->currentTimeout != 0) { - notifier->timer->stop(); - } - - if (timePtr) { - int timeout = timePtr->sec * 1000 + timePtr->usec / 1000; - notifier->timer->start( timeout, 1 ); - notifier->currentTimeout = 1; - } - else { - notifier->currentTimeout = 0; - } -} - -/* - *---------------------------------------------------------------------- - * - * CreateFileHandler -- - * - * This procedure registers a file handler with the Xt notifier. - * - * Results: - * None. - * - * Side effects: - * Creates a new file handler structure and registers one or more - * input procedures with Xt. - * - *---------------------------------------------------------------------- - */ - -static void -CreateFileHandler( -int fd, /* Handle of stream to watch. */ -int mask, -/* OR'ed combination of TCL_READABLE, - * TCL_WRITABLE, and TCL_EXCEPTION: - * indicates conditions under which - * proc should be called. */ -Tcl_FileProc *proc, /* Procedure to call for each selected event. */ -ClientData clientData) /* Arbitrary data to pass to proc. */ -{ - Q_ASSERT(notifier); - TclFileHandler *filePtr; - - for (filePtr = notifier->firstFileHandlerPtr; filePtr != NULL; - filePtr = filePtr->nextPtr) { - if (filePtr->fd == fd) { - break; - } - } - if (filePtr == NULL) { - filePtr = new TclFileHandler( fd ); - } - filePtr->proc = proc; - filePtr->clientData = clientData; - - /* - * Create a QSocketNotifier with file fd. - */ - - if (mask & TCL_READABLE) { - if (!(filePtr->mask & TCL_READABLE)) { - filePtr->read = new QSocketNotifier( fd, QSocketNotifier::Read ); - filePtr->connect( filePtr->read, - SIGNAL(activated(int)), SLOT(fileactive(int)) ); - } - } - else { - if (filePtr->mask & TCL_READABLE) { - delete filePtr->read; - } - } - if (mask & TCL_WRITABLE) { - if (!(filePtr->mask & TCL_WRITABLE)) { - filePtr->write = new QSocketNotifier( fd, QSocketNotifier::Write ); - filePtr->connect( filePtr->write, - SIGNAL(activated(int)), SLOT(fileactive(int)) ); - } - } - else { - if (filePtr->mask & TCL_WRITABLE) { - delete filePtr->write; - } - } - filePtr->mask = mask; -} - -/* - *---------------------------------------------------------------------- - * - * DeleteFileHandler -- - * - * Cancel a previously-arranged callback arrangement for - * a file. - * - * Results: - * None. - * - * Side effects: - * If a callback was previously registered on file, remove it. - * - *---------------------------------------------------------------------- - */ - -static void -DeleteFileHandler( -int fd) -/* Stream id for which to remove - * callback procedure. */ -{ - Q_ASSERT(notifier); - TclFileHandler *filePtr, *prevPtr; - - /* - * Find the entry for the given file (and return if there - * isn't one). - */ - - for (prevPtr = NULL, filePtr = notifier->firstFileHandlerPtr; ; - prevPtr = filePtr, filePtr = filePtr->nextPtr) { - if (filePtr == NULL) { - return; - } - if (filePtr->fd == fd) { - break; - } - } - - /* - * Clean up information in the callback record. - */ - - if (prevPtr == NULL) { - notifier->firstFileHandlerPtr = filePtr->nextPtr; - } - else { - prevPtr->nextPtr = filePtr->nextPtr; - } - delete filePtr; -} - -/* - *---------------------------------------------------------------------- - * - * WaitForEvent -- - * - * This function is called by Tcl_DoOneEvent to wait for new - * events on the message queue. If the block time is 0, then - * Tcl_WaitForEvent just polls without blocking. - * - * Results: - * Returns 1 if an event was found, else 0. This ensures that - * Tcl_DoOneEvent will return 1, even if the event is handled - * by non-Tcl code. - * - * Side effects: - * Queues file events that are detected by the select. - * - *---------------------------------------------------------------------- - */ - -static int -WaitForEvent( -Tcl_Time *timePtr) /* Maximum block time, or NULL. */ -{ - Q_ASSERT(notifier); - - int timeout = 0; - if (timePtr) { - timeout = timePtr->sec * 1000 + timePtr->usec / 1000; - } - -#if QT_VERSION >= 0x040000 - notifier->qapp->processEvents( QEventLoop::AllEvents, timeout ); -#else - notifier->qapp->processEvents( timeout ); -#endif - return 1; -} From 22fe42e2ff8196b9c55a60c7cf3ec72b3adfd16c Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Mon, 27 Jun 2011 12:49:06 -0500 Subject: [PATCH 093/348] add smaller examples --- .../navtestbed-based/1-intro/AddDirectly.lua | 12 +++++++ .../1-intro/DisplayingText.lua | 29 +++++++++++++++ examples/navtestbed-based/1-intro/Group.lua | 35 +++++++++++++++++++ .../navtestbed-based/1-intro/LoadModel.lua | 7 ++++ examples/navtestbed-based/1-intro/README.txt | 8 +++++ .../navtestbed-based/1-intro/RelativeTo.lua | 26 ++++++++++++++ .../1-intro/Transformation.lua | 18 ++++++++++ 7 files changed, 135 insertions(+) create mode 100644 examples/navtestbed-based/1-intro/AddDirectly.lua create mode 100644 examples/navtestbed-based/1-intro/DisplayingText.lua create mode 100644 examples/navtestbed-based/1-intro/Group.lua create mode 100644 examples/navtestbed-based/1-intro/LoadModel.lua create mode 100644 examples/navtestbed-based/1-intro/README.txt create mode 100644 examples/navtestbed-based/1-intro/RelativeTo.lua create mode 100644 examples/navtestbed-based/1-intro/Transformation.lua diff --git a/examples/navtestbed-based/1-intro/AddDirectly.lua b/examples/navtestbed-based/1-intro/AddDirectly.lua new file mode 100644 index 00000000..13706350 --- /dev/null +++ b/examples/navtestbed-based/1-intro/AddDirectly.lua @@ -0,0 +1,12 @@ +--[[ EXAMPLE: AddDirectly.lua + +Builds on LoadModel.lua so learn that one first. +]] + +-- In LoadModel, we loaded the model into a named variable, teapot. +-- This is good if we want to do something with it later, but if we will +-- just be attaching it right away and nothing more, we don't need to name it. + +-- This is effectively equivalent, except we don't have a variable named teapot anymore. +RelativeTo.World:addChild(Model("assets/models/teapot.osg")) + diff --git a/examples/navtestbed-based/1-intro/DisplayingText.lua b/examples/navtestbed-based/1-intro/DisplayingText.lua new file mode 100644 index 00000000..f0d8da70 --- /dev/null +++ b/examples/navtestbed-based/1-intro/DisplayingText.lua @@ -0,0 +1,29 @@ +-- For the next part, we'd like to put some text. The Text module provides a convenient wrapper. +require("Text") + +-- These next examples indicate a variety of things you can do with text. + +-- a text geode (node) +title = TextGeode{ + "It's a Title!", + position = {-1, 3, -8}, + font = Font("DroidSansBold"), +} +RelativeTo.World:addChild(title) + +-- a two line text node +moretext = TextGeode{ + "Some body text", + "and another line!", + position = {-1, 2, -8}, + font = Font("DroidSans"), +} +RelativeTo.World:addChild(moretext) + +-- a text node with a more different font +evenmoretext = TextGeode{ + "It's so awesome!", + position = {-1, 1, -8}, + font = Font("DroidSerifItalic"), +} +RelativeTo.World:addChild(evenmoretext) diff --git a/examples/navtestbed-based/1-intro/Group.lua b/examples/navtestbed-based/1-intro/Group.lua new file mode 100644 index 00000000..807bdd96 --- /dev/null +++ b/examples/navtestbed-based/1-intro/Group.lua @@ -0,0 +1,35 @@ +--[[ EXAMPLE: Group.lua + +Builds on DisplayingText.lua and AddDirectly.lua +]] + +require("Text") + +-- A group node can have several children. It doesn't display anything itself in addition. +RelativeTo.World:addChild( + -- A group node containing + Group{ + -- a text geode (node) + TextGeode{ + "It's a Title!", + position = {-1, 3, -8}, + font = Font("DroidSansBold"), + }, + + -- a two line text node + TextGeode{ + "Some body text", + "and another line!", + position = {-1, 2, -8}, + font = Font("DroidSans"), + }, + + -- a text node with a more different font + TextGeode{ + "It's so awesome!", + position = {-1, 1, -8}, + font = Font("DroidSerifItalic"), + }, + + } +) diff --git a/examples/navtestbed-based/1-intro/LoadModel.lua b/examples/navtestbed-based/1-intro/LoadModel.lua new file mode 100644 index 00000000..2234e868 --- /dev/null +++ b/examples/navtestbed-based/1-intro/LoadModel.lua @@ -0,0 +1,7 @@ +-- Here we are loading a model. Don't worry about where the model file is located right now. +teapot = Model("assets/models/teapot.osg") + +-- We must attach it to a parent node in the scene. For now, we'll just always use RelativeTo.World. +-- When you want to know more, see the RelativeTo tutorial. +RelativeTo.World:addChild(teapot) + diff --git a/examples/navtestbed-based/1-intro/README.txt b/examples/navtestbed-based/1-intro/README.txt new file mode 100644 index 00000000..0f7bb5ef --- /dev/null +++ b/examples/navtestbed-based/1-intro/README.txt @@ -0,0 +1,8 @@ +Examples in increasing order of sophistication: + +- LoadModel +- AddDirectly +- Transformation +- Group +- DisplayingText +- RelativeTo diff --git a/examples/navtestbed-based/1-intro/RelativeTo.lua b/examples/navtestbed-based/1-intro/RelativeTo.lua new file mode 100644 index 00000000..e2603a03 --- /dev/null +++ b/examples/navtestbed-based/1-intro/RelativeTo.lua @@ -0,0 +1,26 @@ +--[[ EXAMPLE: RelativeTo.lua + +Builds on DisplayingText.lua so learn that one first. +]] + +require("Text") + +-- We attach it relative to the world: we can move around it. +RelativeTo.World:addChild( + TextGeode{ + "This text was added to RelativeTo.World", + position = {-1, 2, -8}, + font = Font("DroidSerifItalic"), + } +) + +-- Here, we are attaching something relative to the room: +-- it always stays the same place in physical real space. +RelativeTo.Room:addChild( + TextGeode{ + "This text was added to RelativeTo.Room", + position = {-1, 3, -8}, + font = Font("DroidSansBold"), + } +) + diff --git a/examples/navtestbed-based/1-intro/Transformation.lua b/examples/navtestbed-based/1-intro/Transformation.lua new file mode 100644 index 00000000..489ad3d1 --- /dev/null +++ b/examples/navtestbed-based/1-intro/Transformation.lua @@ -0,0 +1,18 @@ +--[[ EXAMPLE: Transformation.lua + +Builds on LoadModel.lua so learn that one first. +]] + +-- Here we are loading a model, and transforming it to a new position. + +-- Note (if you've worked through Group.lua): a transform node is actually +-- a special kind of group node, so we could put multiple children in instead +-- of just the one model. +teapot = Transform{ + position = {-1, 2, -3}, + Model("assets/models/teapot.osg") +} + +-- We attach it relative to the world: we can move around it. +RelativeTo.World:addChild(teapot) + From e0c41db1812fa7b48a4fad90f455b407d7e18b40 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Mon, 27 Jun 2011 12:50:54 -0500 Subject: [PATCH 094/348] Reorganize the examples folder --- .../1-intro/AddDirectly.lua | 0 .../1-intro/DisplayingText.lua | 0 .../{navtestbed-based => }/1-intro/Group.lua | 0 .../1-intro/LoadModel.lua | 0 .../{navtestbed-based => }/1-intro/README.txt | 0 .../1-intro/RelativeTo.lua | 0 .../1-intro/Transformation.lua | 0 .../Tracking-Extended.lua} | 0 .../2-tracking.lua => 2-input/Tracking.lua} | 0 .../DrawingApp.lua} | 0 examples/{ => advanced}/appdataexample.jconf | 0 .../in-progress/countdown-text.lua | 0 .../nav-testbed-quick-docs.txt | 0 .../in-progress/shadow-1.lua | 0 examples/navtestbed-based/1-minimal.lua | 41 ------------------- 15 files changed, 41 deletions(-) rename examples/{navtestbed-based => }/1-intro/AddDirectly.lua (100%) rename examples/{navtestbed-based => }/1-intro/DisplayingText.lua (100%) rename examples/{navtestbed-based => }/1-intro/Group.lua (100%) rename examples/{navtestbed-based => }/1-intro/LoadModel.lua (100%) rename examples/{navtestbed-based => }/1-intro/README.txt (100%) rename examples/{navtestbed-based => }/1-intro/RelativeTo.lua (100%) rename examples/{navtestbed-based => }/1-intro/Transformation.lua (100%) rename examples/{navtestbed-based/2-tracking-extended.lua => 2-input/Tracking-Extended.lua} (100%) rename examples/{navtestbed-based/2-tracking.lua => 2-input/Tracking.lua} (100%) rename examples/{navtestbed-based/3-drawing.lua => 3-interaction/DrawingApp.lua} (100%) rename examples/{ => advanced}/appdataexample.jconf (100%) rename examples/{navtestbed-based => }/in-progress/countdown-text.lua (100%) rename examples/{navtestbed-based => in-progress}/nav-testbed-quick-docs.txt (100%) rename examples/{navtestbed-based => }/in-progress/shadow-1.lua (100%) delete mode 100644 examples/navtestbed-based/1-minimal.lua diff --git a/examples/navtestbed-based/1-intro/AddDirectly.lua b/examples/1-intro/AddDirectly.lua similarity index 100% rename from examples/navtestbed-based/1-intro/AddDirectly.lua rename to examples/1-intro/AddDirectly.lua diff --git a/examples/navtestbed-based/1-intro/DisplayingText.lua b/examples/1-intro/DisplayingText.lua similarity index 100% rename from examples/navtestbed-based/1-intro/DisplayingText.lua rename to examples/1-intro/DisplayingText.lua diff --git a/examples/navtestbed-based/1-intro/Group.lua b/examples/1-intro/Group.lua similarity index 100% rename from examples/navtestbed-based/1-intro/Group.lua rename to examples/1-intro/Group.lua diff --git a/examples/navtestbed-based/1-intro/LoadModel.lua b/examples/1-intro/LoadModel.lua similarity index 100% rename from examples/navtestbed-based/1-intro/LoadModel.lua rename to examples/1-intro/LoadModel.lua diff --git a/examples/navtestbed-based/1-intro/README.txt b/examples/1-intro/README.txt similarity index 100% rename from examples/navtestbed-based/1-intro/README.txt rename to examples/1-intro/README.txt diff --git a/examples/navtestbed-based/1-intro/RelativeTo.lua b/examples/1-intro/RelativeTo.lua similarity index 100% rename from examples/navtestbed-based/1-intro/RelativeTo.lua rename to examples/1-intro/RelativeTo.lua diff --git a/examples/navtestbed-based/1-intro/Transformation.lua b/examples/1-intro/Transformation.lua similarity index 100% rename from examples/navtestbed-based/1-intro/Transformation.lua rename to examples/1-intro/Transformation.lua diff --git a/examples/navtestbed-based/2-tracking-extended.lua b/examples/2-input/Tracking-Extended.lua similarity index 100% rename from examples/navtestbed-based/2-tracking-extended.lua rename to examples/2-input/Tracking-Extended.lua diff --git a/examples/navtestbed-based/2-tracking.lua b/examples/2-input/Tracking.lua similarity index 100% rename from examples/navtestbed-based/2-tracking.lua rename to examples/2-input/Tracking.lua diff --git a/examples/navtestbed-based/3-drawing.lua b/examples/3-interaction/DrawingApp.lua similarity index 100% rename from examples/navtestbed-based/3-drawing.lua rename to examples/3-interaction/DrawingApp.lua diff --git a/examples/appdataexample.jconf b/examples/advanced/appdataexample.jconf similarity index 100% rename from examples/appdataexample.jconf rename to examples/advanced/appdataexample.jconf diff --git a/examples/navtestbed-based/in-progress/countdown-text.lua b/examples/in-progress/countdown-text.lua similarity index 100% rename from examples/navtestbed-based/in-progress/countdown-text.lua rename to examples/in-progress/countdown-text.lua diff --git a/examples/navtestbed-based/nav-testbed-quick-docs.txt b/examples/in-progress/nav-testbed-quick-docs.txt similarity index 100% rename from examples/navtestbed-based/nav-testbed-quick-docs.txt rename to examples/in-progress/nav-testbed-quick-docs.txt diff --git a/examples/navtestbed-based/in-progress/shadow-1.lua b/examples/in-progress/shadow-1.lua similarity index 100% rename from examples/navtestbed-based/in-progress/shadow-1.lua rename to examples/in-progress/shadow-1.lua diff --git a/examples/navtestbed-based/1-minimal.lua b/examples/navtestbed-based/1-minimal.lua deleted file mode 100644 index b5cfa9d6..00000000 --- a/examples/navtestbed-based/1-minimal.lua +++ /dev/null @@ -1,41 +0,0 @@ --- Here we are loading a model, and transforming it to a new position -plane = Transform{ - position = {-1, -3, -3}, - Model("examples/models/cessna.osg") -} - --- We attach it relative to the world: we can move around it. -RelativeTo.World:addChild(plane) - --- For the next part, we'd like to put some text -require("Text") - --- Here, we are attaching something relative to the room: --- it always stays the same place in physical real space. -RelativeTo.Room:addChild( - -- A group node containing - Group{ - -- a text geode (node) - TextGeode{ - "It's a Title!", - position = {-1, 3, -8}, - font = Font("DroidSansBold"), - }, - - -- a two line text node - TextGeode{ - "Some body text", - "and another line!", - position = {-1, 2, -8}, - font = Font("DroidSans"), - }, - - -- a text node with a more different font - TextGeode{ - "It's so awesome!", - position = {-1, 1, -8}, - font = Font("DroidSerifItalic"), - }, - - } -) \ No newline at end of file From d28b6ca041584c29a5ddb1ae946cf91acecae04d Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Mon, 27 Jun 2011 12:51:41 -0500 Subject: [PATCH 095/348] add the in-progress lighting example --- .../work-on-lighting/basicfactory.ive | Bin 0 -> 2321490 bytes .../work-on-lighting/light-sample.lua | 79 ++++++++++++++++++ 2 files changed, 79 insertions(+) create mode 100644 examples/in-progress/work-on-lighting/basicfactory.ive create mode 100644 examples/in-progress/work-on-lighting/light-sample.lua diff --git a/examples/in-progress/work-on-lighting/basicfactory.ive b/examples/in-progress/work-on-lighting/basicfactory.ive new file mode 100644 index 0000000000000000000000000000000000000000..5b6e0d4b3736fe1a5f446b1d612d7f86d7e82072 GIT binary patch literal 2321490 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
Kb;j!c3>md2=Fi)oVB1d9V%%sTo&cz;P)05i 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

7$-W>aL%uCOEJjb^5y0f3k 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%0D$uR1I~AzMB%f6p=5BaXi?gROW{ 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

cu{J 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