📄 readerwritervrml2.cpp
字号:
// -*-c++-*-/* * * VRML2 file converter for OpenSceneGraph. * * authors : Jan Ciger (jan.ciger@gmail.com), * Tolga Abaci (tolga.abaci@gmail.com), * Bruno Herbelin (bruno.herbelin@gmail.com) * * (c) VRlab EPFL, Switzerland, 2004-2006 * * Gino van den Bergen, DTECTA (gino@dtecta.com) * */#include "ReaderWriterVRML2.h"#include <iostream>#include <fstream>#if defined(_MSC_VER)# pragma warning(disable: 4250) # pragma warning(disable: 4290) # pragma warning(disable: 4800) #endif #include <openvrml/vrml97node.h>#include <openvrml/common.h>#include <openvrml/browser.h>#include <openvrml/node.h>#include <openvrml/node_ptr.h>#include <openvrml/field.h>#include <osg/TexEnv>#include <osg/CullFace>#include <osg/Geode>#include <osg/Geometry>#include <osg/Material>#include <osg/Image>#include <osg/Texture2D>#include <osg/Group>#include <osg/MatrixTransform>#include <osg/Light>#include <osg/LightSource>#include <osg/Depth>#include <osg/Notify>#include <osgDB/Registry>#include <osgDB/ReadFile>#include <osgDB/FileNameUtils>#include <osgDB/FileUtils>#include <assert.h>#include <map>// Register with Registry to instantiate the above reader/writer.REGISTER_OSGPLUGIN(vrml, ReaderWriterVRML2)osgDB::ReaderWriter::ReadResult ReaderWriterVRML2::readNode(const std::string &fname, const Options* opt) const{ std::string fileName = osgDB::findDataFile(fname, opt); if (fileName.empty()) return ReadResult::FILE_NOT_FOUND; // convert possible Windows backslashes to Unix slashes // OpenVRML doesn't like backslashes, even on Windows std::string unixFileName = osgDB::convertFileNameToUnixStyle(fileName);#ifdef WIN32 if(unixFileName[1] == ':') // absolute path fileName = "file:///" + unixFileName;#else if(unixFileName[0] == '/') // absolute path fileName = "file://" + unixFileName;#endif else // relative path fileName = unixFileName; std::fstream null; openvrml::browser *browser = new openvrml::browser(null, null); std::vector<std::string> parameter; std::vector<std::string> vuri; vuri.push_back(fileName); browser->load_url(vuri, parameter); std::vector< openvrml::node_ptr > mfn; mfn = browser->root_nodes(); if (mfn.size() == 0) { return ReadResult::FILE_NOT_HANDLED; } else { osg::ref_ptr<osg::MatrixTransform> osg_root = new osg::MatrixTransform(osg::Matrix( 1, 0, 0, 0, 0, 0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 1)); osgDB::getDataFilePathList().push_front(osgDB::getFilePath(unixFileName)); for (unsigned i = 0; i < mfn.size(); i++) { openvrml::node *vrml_node = mfn[i].get(); osg_root->addChild(convertFromVRML(vrml_node).get()); } osgDB::getDataFilePathList().pop_front(); return osg_root.get(); }}osg::ref_ptr<osg::Node> ReaderWriterVRML2::convertFromVRML(openvrml::node *obj) const{ std::string name = obj->id(); static int osgLightNum = 0; //light // std::cout << obj->type.id << " Node " << " ["<< name <<']' << std::endl; if (obj->type.id == "Group") // Group node { openvrml::vrml97_node::group_node *vrml_group; vrml_group = dynamic_cast<openvrml::vrml97_node::group_node *>(obj); osg::ref_ptr<osg::Group> osg_group = new osg::Group; try { const openvrml::field_value &fv = obj->field("children"); if ( fv.type() == openvrml::field_value::mfnode_id ) { const openvrml::mfnode &mfn = dynamic_cast<const openvrml::mfnode &>(fv); for (unsigned i = 0; i < mfn.value.size(); i++) { openvrml::node *node = mfn.value[i].get(); osg_group->addChild(convertFromVRML(node).get()); } } } catch (openvrml::unsupported_interface&) { // no children } return osg_group.get(); } else if (obj->type.id == "Transform") // Handle transforms { openvrml::vrml97_node::transform_node *vrml_transform; vrml_transform = dynamic_cast<openvrml::vrml97_node::transform_node *>(obj); openvrml::mat4f vrml_m = vrml_transform->transform(); osg::ref_ptr<osg::MatrixTransform> osg_m = new osg::MatrixTransform(osg::Matrix(vrml_m[0][0], vrml_m[0][1], vrml_m[0][2], vrml_m[0][3], vrml_m[1][0], vrml_m[1][1], vrml_m[1][2], vrml_m[1][3], vrml_m[2][0], vrml_m[2][1], vrml_m[2][2], vrml_m[2][3], vrml_m[3][0], vrml_m[3][1], vrml_m[3][2], vrml_m[3][3])); try { const openvrml::field_value &fv = obj->field("children"); if ( fv.type() == openvrml::field_value::mfnode_id ) { const openvrml::mfnode &mfn = dynamic_cast<const openvrml::mfnode &>(fv); for (unsigned i = 0; i < mfn.value.size(); i++) { openvrml::node *node = mfn.value[i].get(); osg_m->addChild(convertFromVRML(node).get()); } } } catch (openvrml::unsupported_interface&) { // no children } return osg_m.get(); } else if (obj->type.id == "Shape") // Handle Shape node { osg::ref_ptr<osg::Geometry> osg_geom; // parse the geometry { const openvrml::field_value &fv = obj->field("geometry"); if (fv.type() == openvrml::field_value::sfnode_id) { const openvrml::sfnode &sfn = dynamic_cast<const openvrml::sfnode &>(fv); // is it indexed_face_set_node ? openvrml::vrml97_node::abstract_geometry_node* vrml_geom = static_cast<openvrml::vrml97_node::abstract_geometry_node*>(sfn.value.get()->to_geometry()); if (openvrml::vrml97_node::indexed_face_set_node *vrml_ifs = dynamic_cast<openvrml::vrml97_node::indexed_face_set_node *>(vrml_geom)) { osg_geom = convertVRML97IndexedFaceSet(vrml_ifs); } else if (openvrml::vrml97_node::box_node* vrml_box = dynamic_cast<openvrml::vrml97_node::box_node*>(vrml_geom)) { osg_geom = convertVRML97Box(vrml_box); } else if (openvrml::vrml97_node::sphere_node* vrml_sphere = dynamic_cast<openvrml::vrml97_node::sphere_node*>(vrml_geom)) { osg_geom = convertVRML97Sphere(vrml_sphere); } else if (openvrml::vrml97_node::cone_node* vrml_cone = dynamic_cast<openvrml::vrml97_node::cone_node*>(vrml_geom)) { osg_geom = convertVRML97Cone(vrml_cone); } else if (openvrml::vrml97_node::cylinder_node* vrml_cylinder = dynamic_cast<openvrml::vrml97_node::cylinder_node*>(vrml_geom)) { osg_geom = convertVRML97Cylinder(vrml_cylinder); } else { // other geometry types not handled yet } } } osg::ref_ptr<osg::Geode> osg_geode = new osg::Geode(); osg_geode->addDrawable(osg_geom.get()); osg::StateSet *osg_stateset = osg_geode->getOrCreateStateSet(); osg::ref_ptr<osg::Material> osg_mat = new osg::Material(); osg_stateset->setAttributeAndModes(osg_mat.get()); osg_mat->setColorMode(osg::Material::AMBIENT_AND_DIFFUSE); // parse the appearance { const openvrml::field_value &fv = obj->field("appearance"); if (fv.type() == openvrml::field_value::sfnode_id) { const openvrml::sfnode &sfn = dynamic_cast<const openvrml::sfnode &>(fv); // std::cerr << "FV->sfnode OK" << std::endl << std::flush; openvrml::vrml97_node::appearance_node* vrml_app = static_cast<openvrml::vrml97_node::appearance_node*>(sfn.value.get()->to_appearance()); const openvrml::node_ptr &vrml_material_node = vrml_app->material(); const openvrml::node_ptr &vrml_texture_node = vrml_app->texture();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -