/* * 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; }; static const char gVertexShader[] = "#version 300 es \n" "precision mediump float; \n" "in vec4 osg_Vertex;\n" "in vec3 osg_Normal;\n" "uniform mat4 osg_ModelViewProjectionMatrix;\n" "uniform mat4 osg_ModelViewMatrix;\n" "uniform mat3 osg_NormalMatrix;\n" "out vec4 color; \n" "const vec3 lightPos =vec3(0.0, 0.0, 10.0); \n" "const vec4 cessnaColor =vec4(0.8, 0.8, 0.8, 1.0); \n" "const vec4 lightAmbient =vec4(0.1, 0.1, 0.1, 1.0); \n" "const vec4 lightDiffuse =vec4(0.4, 0.4, 0.4, 1.0); \n" "const vec4 lightSpecular =vec4(0.8, 0.8, 0.8, 1.0); \n" "void DirectionalLight(in vec3 normal, \n" " in vec3 ecPos, \n" " inout vec4 ambient, \n" " inout vec4 diffuse, \n" " inout vec4 specular) \n" "{ \n" " float nDotVP; \n" " vec3 L = normalize(gl_ModelViewMatrix*vec4(lightPos, 0.0)).xyz; \n" " nDotVP = max(0.0, dot(normal, L)); \n" " \n" " if (nDotVP > 0.0) { \n" " vec3 E = normalize(-ecPos); \n" " vec3 R = normalize(reflect( L, normal )); \n" " specular = pow(max(dot(R, E), 0.0), 16.0) * lightSpecular; \n" " } \n" " ambient = lightAmbient; \n" " diffuse = lightDiffuse * nDotVP; \n" "} \n" "void main() { \n" " vec4 ambiCol = vec4(0.0); \n" " vec4 diffCol = vec4(0.0); \n" " vec4 specCol = vec4(0.0); \n" " gl_Position = osg_ModelViewProjectionMatrix * osg_Vertex; \n" " vec3 normal = normalize(osg_NormalMatrix * osg_Normal); \n" " vec4 ecPos = osg_ModelViewMatrix * osg_Vertex; \n" " DirectionalLight(normal, ecPos.xyz, ambiCol, diffCol, specCol); \n" " color = cessnaColor * (ambiCol + diffCol + specCol); \n" "} \n"; static const char gFragmentShader[] = "#version 300 es \n" "precision mediump float; \n" "in mediump vec4 color; \n" "out vec4 fragData;\n" "void main() { \n" " fragData = color; \n" "} \n"; 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_ */