8d613019ce
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.
218 lines
6.8 KiB
C++
218 lines
6.8 KiB
C++
#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"<<std::endl;
|
|
|
|
Model newModel;
|
|
for(unsigned int i=0; i<_vModelsToLoad.size(); i++){
|
|
newModel = _vModelsToLoad[i];
|
|
osg::notify(osg::ALWAYS)<<"Loading: "<<newModel.filename<<std::endl;
|
|
|
|
osg::ref_ptr<osg::Node> loadedModel = osgDB::readNodeFile(newModel.filename);
|
|
if (loadedModel == 0) {
|
|
osg::notify(osg::ALWAYS)<<"Model not loaded"<<std::endl;
|
|
} else {
|
|
osg::notify(osg::ALWAYS)<<"Model loaded"<<std::endl;
|
|
_vModels.push_back(newModel);
|
|
|
|
loadedModel->setName(newModel.name);
|
|
|
|
osg::Shader * vshader = new osg::Shader(osg::Shader::VERTEX, gVertexShader );
|
|
osg::Shader * fshader = new osg::Shader(osg::Shader::FRAGMENT, gFragmentShader );
|
|
|
|
osg::Program * prog = new osg::Program;
|
|
prog->addShader ( vshader );
|
|
prog->addShader ( fshader );
|
|
|
|
loadedModel->getOrCreateStateSet()->setAttribute ( prog );
|
|
|
|
_root->addChild(loadedModel);
|
|
}
|
|
}
|
|
|
|
osgViewer::Viewer::Windows windows;
|
|
_viewer->getWindows(windows);
|
|
for(osgViewer::Viewer::Windows::iterator itr = windows.begin();itr != windows.end();++itr)
|
|
{
|
|
(*itr)->getState()->setUseModelViewAndProjectionUniforms(true);
|
|
(*itr)->getState()->setUseVertexAttributeAliasing(true);
|
|
}
|
|
|
|
_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"<<std::endl;
|
|
|
|
Model modelToDelete;
|
|
for(unsigned int i=0; i<_vModelsToDelete.size(); i++){
|
|
modelToDelete = _vModelsToDelete[i];
|
|
osg::notify(osg::ALWAYS)<<"Deleting: "<<modelToDelete.name<<std::endl;
|
|
|
|
for(unsigned int j=_root->getNumChildren(); j>0; j--){
|
|
osg::ref_ptr<osg::Node> children = _root->getChild(j-1);
|
|
if(children->getName() == modelToDelete.name){
|
|
_root->removeChild(children);
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
_vModelsToDelete.clear();
|
|
osg::notify(osg::ALWAYS)<<"finished"<<std::endl;
|
|
}
|
|
//Initialization function
|
|
void OsgMainApp::initOsgWindow(int x,int y,int width,int height){
|
|
|
|
__android_log_write(ANDROID_LOG_ERROR, "OSGANDROID",
|
|
"Initializing geometry");
|
|
|
|
//Pending
|
|
_notifyHandler = new OsgAndroidNotifyHandler();
|
|
_notifyHandler->setTag("Osg Viewer");
|
|
osg::setNotifyHandler(_notifyHandler);
|
|
|
|
osg::notify(osg::ALWAYS)<<"Testing"<<std::endl;
|
|
|
|
_viewer = new osgViewer::Viewer();
|
|
_viewer->setUpViewerAsEmbeddedInWindow(x, y, width, height);
|
|
_viewer->setThreadingModel(osgViewer::ViewerBase::SingleThreaded);
|
|
|
|
_root = new osg::Group();
|
|
|
|
_viewer->realize();
|
|
|
|
_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"<<std::endl;
|
|
return;
|
|
}
|
|
}
|
|
|
|
_vModelsToLoad.push_back(newModel);
|
|
}
|
|
void OsgMainApp::unLoadObject(int number){
|
|
if(_vModels.size() <= number){
|
|
osg::notify(osg::FATAL)<<"Index number error"<<std::endl;
|
|
return;
|
|
}
|
|
|
|
Model modelToDelete = _vModels[number];
|
|
_vModels.erase(_vModels.begin()+number);
|
|
_vModelsToDelete.push_back(modelToDelete);
|
|
}
|
|
void OsgMainApp::clearScene(){
|
|
_vModelsToDelete = _vModels;
|
|
_vModels.clear();
|
|
}
|
|
//Other Functions
|
|
int OsgMainApp::getNumberObjects(){
|
|
return _vModels.size();
|
|
}
|
|
std::string OsgMainApp::getObjectName(int number){
|
|
return _vModels[number].name;
|
|
}
|
|
void OsgMainApp::setClearColor(osg::Vec4f color){
|
|
osg::notify(osg::ALWAYS)<<"Setting Clear Color"<<std::endl;
|
|
_viewer->getCamera()->setClearColor(color);
|
|
}
|
|
osg::Vec4f OsgMainApp::getClearColor(){
|
|
osg::notify(osg::ALWAYS)<<"Getting Clear Color"<<std::endl;
|
|
return _viewer->getCamera()->getClearColor();
|
|
}
|