void ScenarioRenderer::loadGroundBasedComplexModel(ComplexModel &cm) { SharedPointer<istream> in = m_scnxArchive->getModelData(cm.getModelFile()); if (in.isValid()) { // Load model. OBJXArchive *objxArchive = NULL; if (cm.getModelFile().find(".objx") != string::npos) { objxArchive = OBJXArchiveFactory::getInstance().getOBJXArchive(*in); } else if (cm.getModelFile().find(".obj") != string::npos) { objxArchive = OBJXArchiveFactory::getInstance().getOBJXArchiveFromPlainOBJFile(*in); } if (objxArchive != NULL) { m_listOfLoadedOBJXArchives.push_back(objxArchive); vector<TriangleSet> listOfTriangleSets = objxArchive->getListOfTriangleSets(); if (listOfTriangleSets.size() > 0) { clog << "OBJ model successfully opened (containing " << listOfTriangleSets.size() << " sets of triangles)." << endl; clog << " Translation: " << cm.getPosition().toString() << endl; clog << " Rotation: " << cm.getRotation().toString() << endl; m_mapOfGroundBasedComplexModels[cm.toString()] = listOfTriangleSets; } else { clog << "OBJ model could not be opened." << endl; } } } }
void ScenarioRenderer::visitSurroundings(Surroundings &s) { Lock l(m_scenarioRendererMutex); if ( (m_scnxArchive != NULL) && (m_renderer != NULL) ) { const vector<Shape*> &listOfShapes = s.getListOfShapes(); vector<Shape*>::const_iterator it = listOfShapes.begin(); while (it != listOfShapes.end()) { Shape *shape = (*it++); if (shape != NULL) { ComplexModel *cm = dynamic_cast<data::scenario::ComplexModel*>(shape); if (cm != NULL) { vector<TriangleSet> listOfTriangleSets = m_mapOfGroundBasedComplexModels[cm->toString()]; // Check if the complex model must be loaded first. if (listOfTriangleSets.size() == 0) { loadGroundBasedComplexModel(*cm); } // Draw list of triangle sets. m_renderer->beginPainting(); m_renderer->drawListOfTriangleSets(listOfTriangleSets, cm->getPosition(), cm->getRotation()); m_renderer->endPainting(); } } } } }