From 8d613019ce06de4d38078d1dbdfb302db20b060f Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Thu, 9 Jun 2011 14:11:04 +0000 Subject: [PATCH] From Jorge Ciges, "two clean example viewers (GLES1/2) that permit load models withouth recompiling by options in the menu and some basic options. basic options. As Rafa and I told you earlier this can't be integrated in the CMAKE chain. It needs to be compiled by the user out of the OSG standard compilation. It could be stored in the examples. That way users will not come here asking for the examples. Main characteristics are: -Menu with loading and unloading by path. -Return to home view -Keyboard capabilities with manipilator switch and basic state changing. -Change color screen. -Osg log bypassed to LogCat (This comes practically straight from Marcin Hajder example I've only added personal TAG) -Earmbi / Earmbi V7 -Install to SD (if the device supports the feature) And that's all. Now I'm looking to fix the environmental mapping with true GLES (it does not work well in Android) I will try to make it in time for 3.0. The other work that i'm studying Dynamic build with Android but that will need a lot of time to test. --- .../AndroidManifest.xml | 21 + .../osgAndroidExampleGLES1/default.properties | 11 + .../osgAndroidExampleGLES1/jni/Android.mk | 67 +++ .../osgAndroidExampleGLES1/jni/Application.mk | 11 + .../jni/OsgAndroidNotifyHandler.cpp | 38 ++ .../jni/OsgAndroidNotifyHandler.hpp | 26 ++ .../osgAndroidExampleGLES1/jni/OsgMainApp.cpp | 205 +++++++++ .../osgAndroidExampleGLES1/jni/OsgMainApp.hpp | 138 ++++++ .../jni/osgNativeLib.cpp | 113 +++++ examples/osgAndroidExampleGLES1/proguard.cfg | 36 ++ .../res/drawable-hdpi/osg.png | Bin 0 -> 11756 bytes .../res/drawable-hdpi/web_browser.png | Bin 0 -> 4738 bytes .../res/drawable-ldpi/osg.png | Bin 0 -> 5956 bytes .../res/drawable-mdpi/osg.png | Bin 0 -> 7670 bytes .../res/layout/dialog_text_entry.xml | 29 ++ .../res/layout/main.xml | 12 + .../res/layout/ui_layout_gles.xml | 45 ++ .../res/menu/appmenu.xml | 9 + .../res/values/strings.xml | 28 ++ .../osg/AndroidExample/ColorPickerDialog.java | 250 +++++++++++ .../src/osg/AndroidExample/EGLview.java | 329 ++++++++++++++ .../src/osg/AndroidExample/osgNativeLib.java | 28 ++ .../src/osg/AndroidExample/osgViewer.java | 417 ++++++++++++++++++ .../AndroidManifest.xml | 21 + .../osgAndroidExampleGLES2/default.properties | 11 + .../osgAndroidExampleGLES2/jni/Android.mk | 67 +++ .../osgAndroidExampleGLES2/jni/Application.mk | 11 + .../jni/OsgAndroidNotifyHandler.cpp | 38 ++ .../jni/OsgAndroidNotifyHandler.hpp | 26 ++ .../osgAndroidExampleGLES2/jni/OsgMainApp.cpp | 217 +++++++++ .../osgAndroidExampleGLES2/jni/OsgMainApp.hpp | 182 ++++++++ .../jni/osgNativeLib.cpp | 113 +++++ examples/osgAndroidExampleGLES2/proguard.cfg | 36 ++ .../res/drawable-hdpi/osg.png | Bin 0 -> 11756 bytes .../res/drawable-hdpi/web_browser.png | Bin 0 -> 4738 bytes .../res/drawable-ldpi/osg.png | Bin 0 -> 5956 bytes .../res/drawable-mdpi/osg.png | Bin 0 -> 7670 bytes .../res/layout/dialog_text_entry.xml | 29 ++ .../res/layout/main.xml | 12 + .../res/layout/ui_layout_gles.xml | 45 ++ .../res/menu/appmenu.xml | 9 + .../res/values/strings.xml | 28 ++ .../osg/AndroidExample/ColorPickerDialog.java | 250 +++++++++++ .../src/osg/AndroidExample/EGLview.java | 329 ++++++++++++++ .../src/osg/AndroidExample/osgNativeLib.java | 28 ++ .../src/osg/AndroidExample/osgViewer.java | 417 ++++++++++++++++++ 46 files changed, 3682 insertions(+) create mode 100644 examples/osgAndroidExampleGLES1/AndroidManifest.xml create mode 100644 examples/osgAndroidExampleGLES1/default.properties create mode 100644 examples/osgAndroidExampleGLES1/jni/Android.mk create mode 100644 examples/osgAndroidExampleGLES1/jni/Application.mk create mode 100644 examples/osgAndroidExampleGLES1/jni/OsgAndroidNotifyHandler.cpp create mode 100644 examples/osgAndroidExampleGLES1/jni/OsgAndroidNotifyHandler.hpp create mode 100644 examples/osgAndroidExampleGLES1/jni/OsgMainApp.cpp create mode 100644 examples/osgAndroidExampleGLES1/jni/OsgMainApp.hpp create mode 100644 examples/osgAndroidExampleGLES1/jni/osgNativeLib.cpp create mode 100644 examples/osgAndroidExampleGLES1/proguard.cfg create mode 100644 examples/osgAndroidExampleGLES1/res/drawable-hdpi/osg.png create mode 100644 examples/osgAndroidExampleGLES1/res/drawable-hdpi/web_browser.png create mode 100644 examples/osgAndroidExampleGLES1/res/drawable-ldpi/osg.png create mode 100644 examples/osgAndroidExampleGLES1/res/drawable-mdpi/osg.png create mode 100644 examples/osgAndroidExampleGLES1/res/layout/dialog_text_entry.xml create mode 100644 examples/osgAndroidExampleGLES1/res/layout/main.xml create mode 100644 examples/osgAndroidExampleGLES1/res/layout/ui_layout_gles.xml create mode 100644 examples/osgAndroidExampleGLES1/res/menu/appmenu.xml create mode 100644 examples/osgAndroidExampleGLES1/res/values/strings.xml create mode 100644 examples/osgAndroidExampleGLES1/src/osg/AndroidExample/ColorPickerDialog.java create mode 100644 examples/osgAndroidExampleGLES1/src/osg/AndroidExample/EGLview.java create mode 100644 examples/osgAndroidExampleGLES1/src/osg/AndroidExample/osgNativeLib.java create mode 100644 examples/osgAndroidExampleGLES1/src/osg/AndroidExample/osgViewer.java create mode 100644 examples/osgAndroidExampleGLES2/AndroidManifest.xml create mode 100644 examples/osgAndroidExampleGLES2/default.properties create mode 100644 examples/osgAndroidExampleGLES2/jni/Android.mk create mode 100644 examples/osgAndroidExampleGLES2/jni/Application.mk create mode 100644 examples/osgAndroidExampleGLES2/jni/OsgAndroidNotifyHandler.cpp create mode 100644 examples/osgAndroidExampleGLES2/jni/OsgAndroidNotifyHandler.hpp create mode 100644 examples/osgAndroidExampleGLES2/jni/OsgMainApp.cpp create mode 100644 examples/osgAndroidExampleGLES2/jni/OsgMainApp.hpp create mode 100644 examples/osgAndroidExampleGLES2/jni/osgNativeLib.cpp create mode 100644 examples/osgAndroidExampleGLES2/proguard.cfg create mode 100644 examples/osgAndroidExampleGLES2/res/drawable-hdpi/osg.png create mode 100644 examples/osgAndroidExampleGLES2/res/drawable-hdpi/web_browser.png create mode 100644 examples/osgAndroidExampleGLES2/res/drawable-ldpi/osg.png create mode 100644 examples/osgAndroidExampleGLES2/res/drawable-mdpi/osg.png create mode 100644 examples/osgAndroidExampleGLES2/res/layout/dialog_text_entry.xml create mode 100644 examples/osgAndroidExampleGLES2/res/layout/main.xml create mode 100644 examples/osgAndroidExampleGLES2/res/layout/ui_layout_gles.xml create mode 100644 examples/osgAndroidExampleGLES2/res/menu/appmenu.xml create mode 100644 examples/osgAndroidExampleGLES2/res/values/strings.xml create mode 100644 examples/osgAndroidExampleGLES2/src/osg/AndroidExample/ColorPickerDialog.java create mode 100644 examples/osgAndroidExampleGLES2/src/osg/AndroidExample/EGLview.java create mode 100644 examples/osgAndroidExampleGLES2/src/osg/AndroidExample/osgNativeLib.java create mode 100644 examples/osgAndroidExampleGLES2/src/osg/AndroidExample/osgViewer.java diff --git a/examples/osgAndroidExampleGLES1/AndroidManifest.xml b/examples/osgAndroidExampleGLES1/AndroidManifest.xml new file mode 100644 index 000000000..eac0d374a --- /dev/null +++ b/examples/osgAndroidExampleGLES1/AndroidManifest.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + diff --git a/examples/osgAndroidExampleGLES1/default.properties b/examples/osgAndroidExampleGLES1/default.properties new file mode 100644 index 000000000..e2e8061f2 --- /dev/null +++ b/examples/osgAndroidExampleGLES1/default.properties @@ -0,0 +1,11 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system use, +# "build.properties", and override values to adapt the script to your +# project structure. + +# Project target. +target=android-8 diff --git a/examples/osgAndroidExampleGLES1/jni/Android.mk b/examples/osgAndroidExampleGLES1/jni/Android.mk new file mode 100644 index 000000000..1a4d3efc0 --- /dev/null +++ b/examples/osgAndroidExampleGLES1/jni/Android.mk @@ -0,0 +1,67 @@ +LOCAL_PATH := $(call my-dir) + +include $(CLEAR_VARS) + +LOCAL_MODULE := osgNativeLib +### Main Install dir +OSG_ANDROID_DIR := < type your install directory > +LIBDIR := $(OSG_ANDROID_DIR)/obj/local/armeabi + +ifeq ($(TARGET_ARCH_ABI),armeabi-v7a) + LOCAL_ARM_NEON := true + LIBDIR := $(OSG_ANDROID_DIR)/obj/local/armeabi-v7a +endif + +### Add all source file names to be included in lib separated by a whitespace + +LOCAL_C_INCLUDES:= $(OSG_ANDROID_DIR)/include +LOCAL_CFLAGS := -Werror -fno-short-enums +LOCAL_CPPFLAGS := -DOSG_LIBRARY_STATIC + +LOCAL_LDLIBS := -llog -lGLESv1_CM -ldl -lz +LOCAL_SRC_FILES := osgNativeLib.cpp OsgMainApp.cpp OsgAndroidNotifyHandler.cpp +LOCAL_LDFLAGS := -L $(LIBDIR) \ +-losgdb_dds \ +-losgdb_openflight \ +-losgdb_tga \ +-losgdb_rgb \ +-losgdb_osgterrain \ +-losgdb_osg \ +-losgdb_ive \ +-losgdb_deprecated_osgviewer \ +-losgdb_deprecated_osgvolume \ +-losgdb_deprecated_osgtext \ +-losgdb_deprecated_osgterrain \ +-losgdb_deprecated_osgsim \ +-losgdb_deprecated_osgshadow \ +-losgdb_deprecated_osgparticle \ +-losgdb_deprecated_osgfx \ +-losgdb_deprecated_osganimation \ +-losgdb_deprecated_osg \ +-losgdb_serializers_osgvolume \ +-losgdb_serializers_osgtext \ +-losgdb_serializers_osgterrain \ +-losgdb_serializers_osgsim \ +-losgdb_serializers_osgshadow \ +-losgdb_serializers_osgparticle \ +-losgdb_serializers_osgmanipulator \ +-losgdb_serializers_osgfx \ +-losgdb_serializers_osganimation \ +-losgdb_serializers_osg \ +-losgViewer \ +-losgVolume \ +-losgTerrain \ +-losgText \ +-losgShadow \ +-losgSim \ +-losgParticle \ +-losgManipulator \ +-losgGA \ +-losgFX \ +-losgDB \ +-losgAnimation \ +-losgUtil \ +-losg \ +-lOpenThreads + +include $(BUILD_SHARED_LIBRARY) diff --git a/examples/osgAndroidExampleGLES1/jni/Application.mk b/examples/osgAndroidExampleGLES1/jni/Application.mk new file mode 100644 index 000000000..20040dc94 --- /dev/null +++ b/examples/osgAndroidExampleGLES1/jni/Application.mk @@ -0,0 +1,11 @@ +#ANDROID APPLICATION MAKEFILE +APP_BUILD_SCRIPT := $(call my-dir)/Android.mk +#APP_PROJECT_PATH := $(call my-dir) + +APP_OPTIM := release + +APP_PLATFORM := android-7 +APP_STL := gnustl_static +APP_CPPFLAGS := -fexceptions -frtti +APP_ABI := armeabi armeabi-v7a +APP_MODULES := osgNativeLib \ No newline at end of file diff --git a/examples/osgAndroidExampleGLES1/jni/OsgAndroidNotifyHandler.cpp b/examples/osgAndroidExampleGLES1/jni/OsgAndroidNotifyHandler.cpp new file mode 100644 index 000000000..2e4f38c15 --- /dev/null +++ b/examples/osgAndroidExampleGLES1/jni/OsgAndroidNotifyHandler.cpp @@ -0,0 +1,38 @@ +/* + * OsgAndroidNotifyHandler.cpp + * + * Created on: 31/05/2011 + * Author: Jorge Izquierdo Ciges + */ + +#include "OsgAndroidNotifyHandler.hpp" +#include + +void OsgAndroidNotifyHandler::setTag(std::string tag){ + _tag = tag; +} +void OsgAndroidNotifyHandler::notify(osg::NotifySeverity severity, const char *message){ + + switch ( severity ) { + case osg::DEBUG_FP: + __android_log_write(ANDROID_LOG_VERBOSE,_tag.c_str(),message); + break; + case osg::DEBUG_INFO: + __android_log_write(ANDROID_LOG_DEBUG,_tag.c_str(),message); + break; + case osg::NOTICE: + case osg::INFO: + __android_log_write(ANDROID_LOG_INFO,_tag.c_str(),message); + break; + case osg::WARN: + __android_log_write(ANDROID_LOG_WARN,_tag.c_str(),message); + break; + case osg::FATAL: + case osg::ALWAYS: + __android_log_write(ANDROID_LOG_ERROR,_tag.c_str(),message); + break; + default: + __android_log_write(ANDROID_LOG_DEBUG,_tag.c_str(),message); + break; + } +} diff --git a/examples/osgAndroidExampleGLES1/jni/OsgAndroidNotifyHandler.hpp b/examples/osgAndroidExampleGLES1/jni/OsgAndroidNotifyHandler.hpp new file mode 100644 index 000000000..114a369aa --- /dev/null +++ b/examples/osgAndroidExampleGLES1/jni/OsgAndroidNotifyHandler.hpp @@ -0,0 +1,26 @@ +/* + * OsgAndroidNotifyHandler.hpp + * + * Created on: 31/05/2011 + * Author: Jorge Izquierdo Ciges + */ + +#ifndef OSGANDROIDNOTIFYHANDLER_HPP_ +#define OSGANDROIDNOTIFYHANDLER_HPP_ + +#include + +#include + +#include + +class OSG_EXPORT OsgAndroidNotifyHandler : public osg::NotifyHandler +{ +private: + std::string _tag; +public: + void setTag(std::string tag); + void notify(osg::NotifySeverity severity, const char *message); +}; + +#endif /* OSGANDROIDNOTIFYHANDLER_HPP_ */ diff --git a/examples/osgAndroidExampleGLES1/jni/OsgMainApp.cpp b/examples/osgAndroidExampleGLES1/jni/OsgMainApp.cpp new file mode 100644 index 000000000..c1d930c55 --- /dev/null +++ b/examples/osgAndroidExampleGLES1/jni/OsgMainApp.cpp @@ -0,0 +1,205 @@ +#include "OsgMainApp.hpp" + + +OsgMainApp::OsgMainApp(){ + + _lodScale = 1.0f; + _prevFrame = 0; + + _initialized = false; + _clean_scene = false; + +} +OsgMainApp::~OsgMainApp(){ + +} +void OsgMainApp::loadModels(){ + if(_vModelsToLoad.size()==0) return; + + osg::notify(osg::ALWAYS)<<"There are "<<_vModelsToLoad.size()<<" models to load"< loadedModel = osgDB::readNodeFile(newModel.filename); + if (loadedModel == 0) { + osg::notify(osg::ALWAYS)<<"Model not loaded"<setName(newModel.name); + _root->addChild(loadedModel); + } + } + + _viewer->setSceneData(NULL); + _viewer->setSceneData(_root.get()); + _manipulator->getNode(); + _viewer->home(); + + _viewer->getDatabasePager()->clear(); + _viewer->getDatabasePager()->registerPagedLODs(_root.get()); + _viewer->getDatabasePager()->setUpThreads(3, 1); + _viewer->getDatabasePager()->setTargetMaximumNumberOfPageLOD(2); + _viewer->getDatabasePager()->setUnrefImageDataAfterApplyPolicy(true, true); + + _vModelsToLoad.clear(); + +} +void OsgMainApp::deleteModels(){ + if(_vModelsToDelete.size()==0) return; + + osg::notify(osg::ALWAYS)<<"There are "<<_vModelsToDelete.size()<<" models to delete"<getNumChildren(); j>0; j--){ + osg::ref_ptr children = _root->getChild(j-1); + if(children->getName() == modelToDelete.name){ + _root->removeChild(children); + } + } + + } + + _vModelsToDelete.clear(); + osg::notify(osg::ALWAYS)<<"finished"<setTag("Osg Viewer"); + osg::setNotifyHandler(_notifyHandler); + + osg::notify(osg::ALWAYS)<<"Testing"<setUpViewerAsEmbeddedInWindow(x, y, width, height); + + _root = new osg::Group(); + + _viewer->realize(); + + _state = _root->getOrCreateStateSet(); + _state->setMode(GL_LIGHTING, osg::StateAttribute::ON); + _state->setMode(GL_DEPTH_TEST, osg::StateAttribute::ON); + _state->setMode(GL_CULL_FACE, osg::StateAttribute::ON); + + _viewer->setSceneData(_root.get()); + + _viewer->addEventHandler(new osgViewer::StatsHandler); + _viewer->addEventHandler(new osgGA::StateSetManipulator(_viewer->getCamera()->getOrCreateStateSet())); + _viewer->addEventHandler(new osgViewer::ThreadingHandler); + _viewer->addEventHandler(new osgViewer::LODScaleHandler); + + _manipulator = new osgGA::KeySwitchMatrixManipulator; + + _manipulator->addMatrixManipulator( '1', "Trackball", new osgGA::TrackballManipulator() ); + _manipulator->addMatrixManipulator( '2', "Flight", new osgGA::FlightManipulator() ); + _manipulator->addMatrixManipulator( '3', "Drive", new osgGA::DriveManipulator() ); + _manipulator->addMatrixManipulator( '4', "Terrain", new osgGA::TerrainManipulator() ); + _manipulator->addMatrixManipulator( '5', "Orbit", new osgGA::OrbitManipulator() ); + _manipulator->addMatrixManipulator( '6', "FirstPerson", new osgGA::FirstPersonManipulator() ); + _manipulator->addMatrixManipulator( '7', "Spherical", new osgGA::SphericalManipulator() ); + + _viewer->setCameraManipulator( _manipulator.get() ); + + _viewer->getViewerStats()->collectStats("scene", true); + + _initialized = true; + +} +//Draw +void OsgMainApp::draw(){ + //Every load o remove has to be done before any drawing + loadModels(); + deleteModels(); + + _viewer->frame(); +} +//Events +void OsgMainApp::mouseButtonPressEvent(float x,float y,int button){ + _viewer->getEventQueue()->mouseButtonPress(x, y, button); +} +void OsgMainApp::mouseButtonReleaseEvent(float x,float y,int button){ + _viewer->getEventQueue()->mouseButtonRelease(x, y, button); +} +void OsgMainApp::mouseMoveEvent(float x,float y){ + _viewer->getEventQueue()->mouseMotion(x, y); +} +void OsgMainApp::keyboardDown(int key){ + _viewer->getEventQueue()->keyPress(key); +} +void OsgMainApp::keyboardUp(int key){ + _viewer->getEventQueue()->keyRelease(key); +} +//Loading and unloading +void OsgMainApp::loadObject(std::string filePath){ + Model newModel; + newModel.filename = filePath; + newModel.name = filePath; + + int num = 0; + for(unsigned int i=0;i<_vModels.size();i++){ + if(_vModels[i].name==newModel.name) + return; + } + + _vModelsToLoad.push_back(newModel); + +} +void OsgMainApp::loadObject(std::string name,std::string filePath){ + + Model newModel; + newModel.filename = filePath; + newModel.name = name; + + for(unsigned int i=0;i<_vModels.size();i++){ + if(_vModels[i].name==newModel.name){ + osg::notify(osg::ALWAYS)<<"Name already used"<getCamera()->setClearColor(color); +} +osg::Vec4f OsgMainApp::getClearColor(){ + osg::notify(osg::ALWAYS)<<"Getting Clear Color"<getCamera()->getClearColor(); +} diff --git a/examples/osgAndroidExampleGLES1/jni/OsgMainApp.hpp b/examples/osgAndroidExampleGLES1/jni/OsgMainApp.hpp new file mode 100644 index 000000000..95f18b286 --- /dev/null +++ b/examples/osgAndroidExampleGLES1/jni/OsgMainApp.hpp @@ -0,0 +1,138 @@ +/* + * OsgMainApp.hpp + * + * Created on: 29/05/2011 + * Author: Jorge Izquierdo Ciges + */ + +#ifndef OSGMAINAPP_HPP_ +#define OSGMAINAPP_HPP_ + +//Android log +#include +#include +#include +#include + +//Standard libraries +#include + +//osg +#include +#include +#include +#include +#include +#include +#include +//osgText +#include +//osgDB +#include +#include +#include +#include +//osg_viewer +#include +#include +#include +//osgGA +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +//Self headers +#include "OsgAndroidNotifyHandler.hpp" + +//Static plugins Macro +USE_OSGPLUGIN(ive) +USE_OSGPLUGIN(osg) +USE_OSGPLUGIN(osg2) +USE_OSGPLUGIN(terrain) +USE_OSGPLUGIN(rgb) +USE_OSGPLUGIN(OpenFlight) +USE_OSGPLUGIN(dds) +//Static DOTOSG +USE_DOTOSGWRAPPER_LIBRARY(osg) +USE_DOTOSGWRAPPER_LIBRARY(osgFX) +USE_DOTOSGWRAPPER_LIBRARY(osgParticle) +USE_DOTOSGWRAPPER_LIBRARY(osgTerrain) +USE_DOTOSGWRAPPER_LIBRARY(osgText) +USE_DOTOSGWRAPPER_LIBRARY(osgViewer) +USE_DOTOSGWRAPPER_LIBRARY(osgVolume) +//Static serializer +USE_SERIALIZER_WRAPPER_LIBRARY(osg) +USE_SERIALIZER_WRAPPER_LIBRARY(osgAnimation) +USE_SERIALIZER_WRAPPER_LIBRARY(osgFX) +USE_SERIALIZER_WRAPPER_LIBRARY(osgManipulator) +USE_SERIALIZER_WRAPPER_LIBRARY(osgParticle) +USE_SERIALIZER_WRAPPER_LIBRARY(osgTerrain) +USE_SERIALIZER_WRAPPER_LIBRARY(osgText) +USE_SERIALIZER_WRAPPER_LIBRARY(osgVolume) + +#define LOG_TAG "osgNativeLib" +#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__) +#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__) + +struct Model{ + std::string filename; + std::string name; +}; + +class OsgMainApp{ +private: + osg::ref_ptr _viewer; + osg::ref_ptr _root; + osg::ref_ptr _state; + osg::ref_ptr _manipulator; + + float _lodScale; + unsigned int _prevFrame; + + bool _initialized; + bool _clean_scene; + + OsgAndroidNotifyHandler *_notifyHandler; + + std::vector _vModels; + std::vector _vModelsToLoad; + std::vector _vModelsToDelete; + + void loadModels(); + void deleteModels(); + +public: + OsgMainApp(); + ~OsgMainApp(); + + //Initialization function + void initOsgWindow(int x,int y,int width,int height); + //Draw + void draw(); + //Events + void mouseButtonPressEvent(float x,float y,int button); + void mouseButtonReleaseEvent(float x,float y,int button); + void mouseMoveEvent(float x,float y); + void keyboardDown(int key); + void keyboardUp(int key); + //Loading and unloading + void loadObject(std::string filePath); + void loadObject(std::string name,std::string filePath); + void unLoadObject(int number); + void clearScene(); + //Other functions + int getNumberObjects(); + std::string getObjectName(int nunmber); + + void setClearColor(osg::Vec4f color); + osg::Vec4f getClearColor(); +}; + + +#endif /* OSGMAINAPP_HPP_ */ diff --git a/examples/osgAndroidExampleGLES1/jni/osgNativeLib.cpp b/examples/osgAndroidExampleGLES1/jni/osgNativeLib.cpp new file mode 100644 index 000000000..4c8efc3f2 --- /dev/null +++ b/examples/osgAndroidExampleGLES1/jni/osgNativeLib.cpp @@ -0,0 +1,113 @@ +#include +#include +#include + +#include + +#include "OsgMainApp.hpp" + +OsgMainApp mainApp; + +extern "C" { + JNIEXPORT void JNICALL Java_osg_AndroidExample_osgNativeLib_init(JNIEnv * env, jobject obj, jint width, jint height); + JNIEXPORT void JNICALL Java_osg_AndroidExample_osgNativeLib_step(JNIEnv * env, jobject obj); + JNIEXPORT void JNICALL Java_osg_AndroidExample_osgNativeLib_clearContents(JNIEnv * env, jobject obj); + JNIEXPORT void JNICALL Java_osg_AndroidExample_osgNativeLib_mouseButtonPressEvent(JNIEnv * env, jobject obj, jfloat x, jfloat y, jint button); + JNIEXPORT void JNICALL Java_osg_AndroidExample_osgNativeLib_mouseButtonReleaseEvent(JNIEnv * env, jobject obj, jfloat x, jfloat y, jint button); + JNIEXPORT void JNICALL Java_osg_AndroidExample_osgNativeLib_mouseMoveEvent(JNIEnv * env, jobject obj, jfloat x, jfloat y); + JNIEXPORT void JNICALL Java_osg_AndroidExample_osgNativeLib_keyboardDown(JNIEnv * env, jobject obj, jint key); + JNIEXPORT void JNICALL Java_osg_AndroidExample_osgNativeLib_keyboardUp(JNIEnv * env, jobject obj, jint key); + JNIEXPORT jintArray JNICALL Java_osg_AndroidExample_osgNativeLib_getClearColor(JNIEnv * env, jobject obj); + JNIEXPORT void JNICALL Java_osg_AndroidExample_osgNativeLib_setClearColor(JNIEnv * env, jobject obj, jint red, jint green, jint blue); + JNIEXPORT void JNICALL Java_osg_AndroidExample_osgNativeLib_loadObject(JNIEnv * env, jobject obj, jstring address); + JNIEXPORT void JNICALL Java_osg_AndroidExample_osgNativeLib_unLoadObject(JNIEnv * env, jobject obj, jint number); + JNIEXPORT jobjectArray JNICALL Java_osg_AndroidExample_osgNativeLib_getObjectNames(JNIEnv * env, jobject obj); +}; + +JNIEXPORT void JNICALL Java_osg_AndroidExample_osgNativeLib_init(JNIEnv * env, jobject obj, jint width, jint height){ + mainApp.initOsgWindow(0,0,width,height); +} +JNIEXPORT void JNICALL Java_osg_AndroidExample_osgNativeLib_step(JNIEnv * env, jobject obj){ + mainApp.draw(); +} +JNIEXPORT void JNICALL Java_osg_AndroidExample_osgNativeLib_clearContents(JNIEnv * env, jobject obj){ + mainApp.clearScene(); +} +JNIEXPORT void JNICALL Java_osg_AndroidExample_osgNativeLib_mouseButtonPressEvent(JNIEnv * env, jobject obj, jfloat x, jfloat y, jint button){ + mainApp.mouseButtonPressEvent(x,y,button); +} +JNIEXPORT void JNICALL Java_osg_AndroidExample_osgNativeLib_mouseButtonReleaseEvent(JNIEnv * env, jobject obj, jfloat x, jfloat y, jint button){ + mainApp.mouseButtonReleaseEvent(x,y,button); +} +JNIEXPORT void JNICALL Java_osg_AndroidExample_osgNativeLib_mouseMoveEvent(JNIEnv * env, jobject obj, jfloat x, jfloat y){ + mainApp.mouseMoveEvent(x,y); +} +JNIEXPORT void JNICALL Java_osg_AndroidExample_osgNativeLib_keyboardDown(JNIEnv * env, jobject obj, jint key){ + mainApp.keyboardDown(key); +} +JNIEXPORT void JNICALL Java_osg_AndroidExample_osgNativeLib_keyboardUp(JNIEnv * env, jobject obj, jint key){ + mainApp.keyboardUp(key); +} +JNIEXPORT jintArray JNICALL Java_osg_AndroidExample_osgNativeLib_getClearColor(JNIEnv * env, jobject obj){ + + jintArray color; + color = env->NewIntArray(3); + if (color == NULL) { + return NULL; + } + osg::Vec4 vTemp1 = mainApp.getClearColor(); + + jint vTemp2[3]; + + vTemp2[0] = (int) (vTemp1.r() * 255); + vTemp2[1] = (int) (vTemp1.g() * 255); + vTemp2[2] = (int) (vTemp1.b() * 255); + + std::cout<SetIntArrayRegion(color, 0, 3, vTemp2); + + return color; +} +JNIEXPORT void JNICALL Java_osg_AndroidExample_osgNativeLib_setClearColor(JNIEnv * env, jobject obj, jint red, jint green, jint blue){ + osg::Vec4 tVec((float) red / 255.0f, (float) green / 255.0f, (float) blue / 255.0f, 0.0f); + mainApp.setClearColor(tVec); +} +JNIEXPORT void JNICALL Java_osg_AndroidExample_osgNativeLib_loadObject(JNIEnv * env, jobject obj, jstring address){ + //Import Strings from JNI + const char *nativeAddress = env->GetStringUTFChars(address, false); + + mainApp.loadObject(std::string(nativeAddress)); + + //Release Strings to JNI + env->ReleaseStringUTFChars(address, nativeAddress); +} +JNIEXPORT void JNICALL Java_osg_AndroidExample_osgNativeLib_loadObject(JNIEnv * env, jobject obj, jstring address, jstring name){ + //Import Strings from JNI + const char *nativeAddress = env->GetStringUTFChars(address, false); + const char *nativeName = env->GetStringUTFChars(name, false); + + mainApp.loadObject(std::string(nativeName),std::string(nativeAddress)); + + //Release Strings to JNI + env->ReleaseStringUTFChars(address, nativeAddress); + env->ReleaseStringUTFChars(address, nativeName); +} +JNIEXPORT void JNICALL Java_osg_AndroidExample_osgNativeLib_unLoadObject(JNIEnv * env, jobject obj, jint number){ + + mainApp.unLoadObject(number); + +} +JNIEXPORT jobjectArray JNICALL Java_osg_AndroidExample_osgNativeLib_getObjectNames(JNIEnv * env, jobject obj){ + + jobjectArray fileNames; + unsigned int numModels = mainApp.getNumberObjects(); + fileNames = (jobjectArray)env->NewObjectArray(numModels,env->FindClass("java/lang/String"),env->NewStringUTF("")); + + for(unsigned int i=0;i < numModels;i++){ + std::string name = mainApp.getObjectName(i); + env->SetObjectArrayElement(fileNames,i,env->NewStringUTF(name.c_str())); + } + + return fileNames; +} diff --git a/examples/osgAndroidExampleGLES1/proguard.cfg b/examples/osgAndroidExampleGLES1/proguard.cfg new file mode 100644 index 000000000..12dd0392c --- /dev/null +++ b/examples/osgAndroidExampleGLES1/proguard.cfg @@ -0,0 +1,36 @@ +-optimizationpasses 5 +-dontusemixedcaseclassnames +-dontskipnonpubliclibraryclasses +-dontpreverify +-verbose +-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* + +-keep public class * extends android.app.Activity +-keep public class * extends android.app.Application +-keep public class * extends android.app.Service +-keep public class * extends android.content.BroadcastReceiver +-keep public class * extends android.content.ContentProvider +-keep public class * extends android.app.backup.BackupAgentHelper +-keep public class * extends android.preference.Preference +-keep public class com.android.vending.licensing.ILicensingService + +-keepclasseswithmembernames class * { + native ; +} + +-keepclasseswithmembernames class * { + public (android.content.Context, android.util.AttributeSet); +} + +-keepclasseswithmembernames class * { + public (android.content.Context, android.util.AttributeSet, int); +} + +-keepclassmembers enum * { + public static **[] values(); + public static ** valueOf(java.lang.String); +} + +-keep class * implements android.os.Parcelable { + public static final android.os.Parcelable$Creator *; +} diff --git a/examples/osgAndroidExampleGLES1/res/drawable-hdpi/osg.png b/examples/osgAndroidExampleGLES1/res/drawable-hdpi/osg.png new file mode 100644 index 0000000000000000000000000000000000000000..e9377f5008f8a276749993374becc500b34d1b9d GIT binary patch literal 11756 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 QZ2$lO07*qoM6N<$g8b43bN~PV literal 0 HcmV?d00001 diff --git a/examples/osgAndroidExampleGLES1/res/drawable-ldpi/osg.png b/examples/osgAndroidExampleGLES1/res/drawable-ldpi/osg.png new file mode 100644 index 0000000000000000000000000000000000000000..0b8cce36b9025c6c81182a382458ddadfa12e2b4 GIT binary patch literal 5956 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 + + + + + + diff --git a/examples/osgAndroidExampleGLES1/res/layout/main.xml b/examples/osgAndroidExampleGLES1/res/layout/main.xml new file mode 100644 index 000000000..3a5f117d3 --- /dev/null +++ b/examples/osgAndroidExampleGLES1/res/layout/main.xml @@ -0,0 +1,12 @@ + + + + diff --git a/examples/osgAndroidExampleGLES1/res/layout/ui_layout_gles.xml b/examples/osgAndroidExampleGLES1/res/layout/ui_layout_gles.xml new file mode 100644 index 000000000..1d10283f5 --- /dev/null +++ b/examples/osgAndroidExampleGLES1/res/layout/ui_layout_gles.xml @@ -0,0 +1,45 @@ + + + + + + + + +