First cut of example test bed is to test how easy it is to build against Lua, V8 and Python for purposes of running embedded scripts.remotes/origin/OpenSceneGraph-3.4
parent
0c609bc17e
commit
835ee7aa8e
@ -0,0 +1,45 @@
|
|||||||
|
# Locate V8
|
||||||
|
# This module defines
|
||||||
|
# V8_LIBRARY
|
||||||
|
# V8_FOUND, if false, do not try to link to gdal
|
||||||
|
# V8_INCLUDE_DIR, where to find the headers
|
||||||
|
#
|
||||||
|
# $V8_DIR is an environment variable that would
|
||||||
|
# correspond to the ./configure --prefix=$V8_DIR
|
||||||
|
#
|
||||||
|
# Created by Robert Osfield (based on FindFLTK.cmake)
|
||||||
|
|
||||||
|
FIND_PATH(V8_INCLUDE_DIR v8.h
|
||||||
|
$ENV{V8_DIR}/include
|
||||||
|
$ENV{V8_DIR}
|
||||||
|
~/Library/Frameworks
|
||||||
|
/Library/Frameworks
|
||||||
|
/usr/local/include
|
||||||
|
/usr/include
|
||||||
|
/sw/include # Fink
|
||||||
|
/opt/local/include # DarwinPorts
|
||||||
|
/opt/csw/include # Blastwave
|
||||||
|
/opt/include
|
||||||
|
/usr/freeware/include
|
||||||
|
)
|
||||||
|
|
||||||
|
FIND_LIBRARY(V8_LIBRARY
|
||||||
|
NAMES v8 libv8
|
||||||
|
PATHS
|
||||||
|
$ENV{V8_DIR}/lib
|
||||||
|
$ENV{V8_DIR}
|
||||||
|
~/Library/Frameworks
|
||||||
|
/Library/Frameworks
|
||||||
|
/usr/local/lib
|
||||||
|
/usr/lib
|
||||||
|
/sw/lib
|
||||||
|
/opt/local/lib
|
||||||
|
/opt/csw/lib
|
||||||
|
/opt/lib
|
||||||
|
/usr/freeware/lib64
|
||||||
|
)
|
||||||
|
|
||||||
|
SET(V8_FOUND "NO")
|
||||||
|
IF(V8_LIBRARY AND V8_INCLUDE_DIR)
|
||||||
|
SET(V8_FOUND "YES")
|
||||||
|
ENDIF()
|
@ -0,0 +1,46 @@
|
|||||||
|
FIND_PACKAGE(Lua51)
|
||||||
|
FIND_PACKAGE(V8)
|
||||||
|
FIND_PACKAGE(PythonLibs)
|
||||||
|
|
||||||
|
IF (LUA_LIBRARIES AND LUA_INCLUDE_DIR)
|
||||||
|
SET(LUA_FOUND True)
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
|
||||||
|
IF (V8_FOUND)
|
||||||
|
ADD_DEFINITIONS(-DUSE_V8)
|
||||||
|
|
||||||
|
SET(TARGET_EXTERNAL_LIBRARIES ${TARGET_EXTERNAL_LIBRARIES} ${V8_LIBRARY})
|
||||||
|
INCLUDE_DIRECTORIES(${V8_INCLUDE_DIR} )
|
||||||
|
|
||||||
|
MESSAGE("We have found V8")
|
||||||
|
ELSE()
|
||||||
|
MESSAGE("We have NOT found V8")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
IF (LUA_FOUND)
|
||||||
|
ADD_DEFINITIONS(-DUSE_LUA)
|
||||||
|
|
||||||
|
SET(TARGET_EXTERNAL_LIBRARIES ${TARGET_EXTERNAL_LIBRARIES} ${LUA_LIBRARY})
|
||||||
|
INCLUDE_DIRECTORIES(${LUA_INCLUDE_DIR} )
|
||||||
|
|
||||||
|
MESSAGE("We have found Lua")
|
||||||
|
ELSE()
|
||||||
|
MESSAGE("We have NOT found Lua")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
IF (PYTHONLIBS_FOUND)
|
||||||
|
MESSAGE("We have found Python")
|
||||||
|
|
||||||
|
SET(TARGET_EXTERNAL_LIBRARIES ${TARGET_EXTERNAL_LIBRARIES} ${PYTHON_LIBRARY})
|
||||||
|
INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_DIR} )
|
||||||
|
|
||||||
|
ADD_DEFINITIONS(-DUSE_PYTHON)
|
||||||
|
ELSE()
|
||||||
|
MESSAGE("We have NOT found Python")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
SET(TARGET_SRC osgpresentation.cpp )
|
||||||
|
|
||||||
|
#### end var setup ###
|
||||||
|
SETUP_EXAMPLE(osgpresentation)
|
@ -0,0 +1,208 @@
|
|||||||
|
/* Copyright Robert Osfield, Licensed under the GPL
|
||||||
|
*
|
||||||
|
* Experimental base for refactor of Present3D
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <osg/Geode>
|
||||||
|
#include <osg/Geometry>
|
||||||
|
|
||||||
|
#include <osgDB/ReadFile>
|
||||||
|
#include <osgDB/FileUtils>
|
||||||
|
|
||||||
|
#include <osgGA/TrackballManipulator>
|
||||||
|
#include <osgViewer/Viewer>
|
||||||
|
|
||||||
|
// hacky experiment with create lua, v8 and python to run scripts.
|
||||||
|
|
||||||
|
#ifdef USE_LUA
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
#include <lua.h>
|
||||||
|
#include <lualib.h>
|
||||||
|
#include <lauxlib.h>
|
||||||
|
}
|
||||||
|
|
||||||
|
void runLua(const std::string& str)
|
||||||
|
{
|
||||||
|
OSG_NOTICE<<std::endl<<"runLua("<<str<<")"<<std::endl;
|
||||||
|
|
||||||
|
lua_State* lua = lua_open();
|
||||||
|
|
||||||
|
luaL_openlibs(lua);
|
||||||
|
|
||||||
|
std::string filePath = str;
|
||||||
|
if(osgDB::fileExists(filePath))
|
||||||
|
{
|
||||||
|
if(luaL_dofile(lua, filePath.c_str()))
|
||||||
|
{
|
||||||
|
OSG_NOTICE << "LuaEngine::runFile - " << lua_tostring(lua, -1) << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
OSG_NOTICE<<" parameter="<<filePath<<" not a valid file."<<std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
lua_close(lua);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef USE_PYTHON
|
||||||
|
|
||||||
|
#include <Python.h>
|
||||||
|
|
||||||
|
void runPython(const std::string& str)
|
||||||
|
{
|
||||||
|
OSG_NOTICE<<std::endl<<"runPython("<<str<<")"<<std::endl;
|
||||||
|
|
||||||
|
Py_InitializeEx(0);
|
||||||
|
|
||||||
|
PyObject* py_main = PyModule_GetDict(PyImport_AddModule("__main__"));
|
||||||
|
|
||||||
|
std::string filePath = str;
|
||||||
|
if(osgDB::fileExists(filePath))
|
||||||
|
{
|
||||||
|
FILE* f = fopen(filePath.c_str(), "r");
|
||||||
|
PyObject* r = PyRun_File(f, filePath.c_str(), Py_file_input, py_main, py_main);
|
||||||
|
|
||||||
|
fclose(f);
|
||||||
|
|
||||||
|
if(!r) {
|
||||||
|
r = PyErr_Occurred();
|
||||||
|
|
||||||
|
if(r) {
|
||||||
|
// The following snippet lets us get the return code. That is: if the
|
||||||
|
// script is stopped with sys.exit() or similar. We could use this
|
||||||
|
// return code to do something sensible... later.
|
||||||
|
if(PyErr_ExceptionMatches(PyExc_SystemExit)) {
|
||||||
|
PyObject* ty = 0;
|
||||||
|
PyObject* er = 0;
|
||||||
|
PyObject* tr = 0;
|
||||||
|
|
||||||
|
PyErr_Fetch(&ty, &er, &tr);
|
||||||
|
|
||||||
|
Py_DECREF(ty);
|
||||||
|
Py_DECREF(er);
|
||||||
|
Py_DECREF(er);
|
||||||
|
}
|
||||||
|
|
||||||
|
else {
|
||||||
|
PyErr_Print();
|
||||||
|
PyErr_Clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Py_Finalize();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef USE_V8
|
||||||
|
|
||||||
|
#include <v8.h>
|
||||||
|
|
||||||
|
void runV8(const std::string& str)
|
||||||
|
{
|
||||||
|
OSG_NOTICE<<std::endl<<"runV8("<<str<<")"<<std::endl;
|
||||||
|
|
||||||
|
v8::Isolate* isolate = v8::Isolate::New();
|
||||||
|
|
||||||
|
{
|
||||||
|
v8::Locker locker(isolate);
|
||||||
|
v8::Isolate::Scope isolate_scope(isolate);
|
||||||
|
|
||||||
|
// Create a stack-allocated handle scope.
|
||||||
|
v8::HandleScope handle_scope;
|
||||||
|
|
||||||
|
v8::Handle<v8::ObjectTemplate> global = v8::ObjectTemplate::New();
|
||||||
|
v8::Persistent<v8::Context> globalContext = v8::Context::New(NULL, global);
|
||||||
|
v8::Persistent<v8::ObjectTemplate> globalTemplate = v8::Persistent<v8::ObjectTemplate>::New(global);
|
||||||
|
|
||||||
|
std::string filePath = str;
|
||||||
|
if(osgDB::fileExists(filePath))
|
||||||
|
{
|
||||||
|
std::string js_source;
|
||||||
|
std::ifstream fin(filePath.c_str());
|
||||||
|
if (fin)
|
||||||
|
{
|
||||||
|
// read file in the crude way.
|
||||||
|
while(fin)
|
||||||
|
{
|
||||||
|
int c = fin.get();
|
||||||
|
if (c>=0 && c<=255)
|
||||||
|
{
|
||||||
|
js_source.push_back(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create a nested handle scope
|
||||||
|
v8::HandleScope local_handle_scope;
|
||||||
|
|
||||||
|
// Enter the global context
|
||||||
|
v8::Context::Scope context_scope(globalContext);
|
||||||
|
|
||||||
|
// Create a string containing the JavaScript source code.
|
||||||
|
v8::Handle<v8::String> source = v8::String::New(js_source.c_str());
|
||||||
|
|
||||||
|
// Compile the source code.
|
||||||
|
v8::Handle<v8::Script> script = v8::Script::Compile(source);
|
||||||
|
|
||||||
|
// Run the script to get the result.
|
||||||
|
v8::Handle<v8::Value> result = script->Run();
|
||||||
|
|
||||||
|
// Convert the result to an ASCII string and print it.
|
||||||
|
v8::String::AsciiValue ascii(result);
|
||||||
|
printf("%s\n", *ascii);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
globalTemplate.Dispose();
|
||||||
|
globalContext.Dispose();
|
||||||
|
}
|
||||||
|
isolate->Dispose();
|
||||||
|
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int main(int argc, char** argv)
|
||||||
|
{
|
||||||
|
osg::ArgumentParser arguments(&argc, argv);
|
||||||
|
|
||||||
|
osgViewer::Viewer viewer(arguments);
|
||||||
|
|
||||||
|
std::string str;
|
||||||
|
|
||||||
|
#ifdef USE_LUA
|
||||||
|
while (arguments.read("--lua",str))
|
||||||
|
{
|
||||||
|
runLua(str);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef USE_V8
|
||||||
|
while (arguments.read("--js",str))
|
||||||
|
{
|
||||||
|
runV8(str);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef USE_PYTHON
|
||||||
|
while (arguments.read("--python",str))
|
||||||
|
{
|
||||||
|
runPython(str);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// create the model
|
||||||
|
osg::ref_ptr<osg::Node> model = osgDB::readNodeFiles(arguments);
|
||||||
|
if (!model) return 1;
|
||||||
|
|
||||||
|
viewer.setSceneData( model.get() );
|
||||||
|
return viewer.run();
|
||||||
|
}
|
Loading…
Reference in new issue