From David Spilling, added "noRotation" ReaderWriter::Option into the .obj plugin

to enable disabling of the automatic rotation from Y up coordinate frame to Z up coordinate frame.
This commit is contained in:
Robert Osfield 2005-11-07 14:42:36 +00:00
parent b2f5a48c15
commit 31ec432e06

View File

@ -66,15 +66,39 @@ protected:
void buildMaterialToStateSetMap(obj::Model& model, MaterialToStateSetMap& materialToSetSetMap) const; void buildMaterialToStateSetMap(obj::Model& model, MaterialToStateSetMap& materialToSetSetMap) const;
osg::Geometry* convertElementListToGeometry(obj::Model& model, obj::Model::ElementList& elementList) const; osg::Geometry* convertElementListToGeometry(obj::Model& model, obj::Model::ElementList& elementList, bool& rotate) const;
osg::Node* convertModelToSceneGraph(obj::Model& model) const; osg::Node* convertModelToSceneGraph(obj::Model& model, bool& rotate) const;
inline osg::Vec3 transformVertex(const osg::Vec3& vec, const bool rotate) const ;
inline osg::Vec3 transformNormal(const osg::Vec3& vec, const bool rotate) const ;
inline osg::Vec3 transformVertex(const osg::Vec3& vec) const { return osg::Vec3(vec.x(),-vec.z(),vec.y()); }
inline osg::Vec3 transformNormal(const osg::Vec3& vec) const { return osg::Vec3(vec.x(),-vec.z(),vec.y()); }
}; };
inline osg::Vec3 ReaderWriterOBJ::transformVertex(const osg::Vec3& vec, const bool rotate) const
{
if(rotate==true)
{
return osg::Vec3(vec.x(),-vec.z(),vec.y());
}
else
{
return vec;
}
}
inline osg::Vec3 ReaderWriterOBJ::transformNormal(const osg::Vec3& vec, const bool rotate) const
{
if(rotate==true)
{
return osg::Vec3(vec.x(),-vec.z(),vec.y());
}
else
{
return vec;
}
}
// register with Registry to instantiate the above reader/writer. // register with Registry to instantiate the above reader/writer.
osgDB::RegisterReaderWriterProxy<ReaderWriterOBJ> g_objReaderWriterProxy; osgDB::RegisterReaderWriterProxy<ReaderWriterOBJ> g_objReaderWriterProxy;
@ -157,7 +181,7 @@ void ReaderWriterOBJ::buildMaterialToStateSetMap(obj::Model& model, MaterialToSt
} }
} }
osg::Geometry* ReaderWriterOBJ::convertElementListToGeometry(obj::Model& model, obj::Model::ElementList& elementList) const osg::Geometry* ReaderWriterOBJ::convertElementListToGeometry(obj::Model& model, obj::Model::ElementList& elementList, bool& rotate) const
{ {
unsigned int numVertexIndices = 0; unsigned int numVertexIndices = 0;
@ -235,7 +259,7 @@ osg::Geometry* ReaderWriterOBJ::convertElementListToGeometry(obj::Model& model,
index_itr != element.vertexIndices.end(); index_itr != element.vertexIndices.end();
++index_itr) ++index_itr)
{ {
vertices->push_back(transformVertex(model.vertices[*index_itr])); vertices->push_back(transformVertex(model.vertices[*index_itr],rotate));
++numPoints; ++numPoints;
} }
if (numNormalIndices) if (numNormalIndices)
@ -244,7 +268,7 @@ osg::Geometry* ReaderWriterOBJ::convertElementListToGeometry(obj::Model& model,
index_itr != element.normalIndices.end(); index_itr != element.normalIndices.end();
++index_itr) ++index_itr)
{ {
normals->push_back(transformNormal(model.normals[*index_itr])); normals->push_back(transformNormal(model.normals[*index_itr],rotate));
} }
} }
if (numTexCoordIndices) if (numTexCoordIndices)
@ -281,7 +305,7 @@ osg::Geometry* ReaderWriterOBJ::convertElementListToGeometry(obj::Model& model,
index_itr != element.vertexIndices.end(); index_itr != element.vertexIndices.end();
++index_itr) ++index_itr)
{ {
vertices->push_back(transformVertex(model.vertices[*index_itr])); vertices->push_back(transformVertex(model.vertices[*index_itr],rotate));
} }
if (numNormalIndices) if (numNormalIndices)
{ {
@ -289,7 +313,7 @@ osg::Geometry* ReaderWriterOBJ::convertElementListToGeometry(obj::Model& model,
index_itr != element.normalIndices.end(); index_itr != element.normalIndices.end();
++index_itr) ++index_itr)
{ {
normals->push_back(transformNormal(model.normals[*index_itr])); normals->push_back(transformNormal(model.normals[*index_itr],rotate));
} }
} }
if (numTexCoordIndices) if (numTexCoordIndices)
@ -352,7 +376,7 @@ osg::Geometry* ReaderWriterOBJ::convertElementListToGeometry(obj::Model& model,
index_itr != element.vertexIndices.rend(); index_itr != element.vertexIndices.rend();
++index_itr) ++index_itr)
{ {
vertices->push_back(transformVertex(model.vertices[*index_itr])); vertices->push_back(transformVertex(model.vertices[*index_itr],rotate));
} }
if (numNormalIndices) if (numNormalIndices)
{ {
@ -360,7 +384,7 @@ osg::Geometry* ReaderWriterOBJ::convertElementListToGeometry(obj::Model& model,
index_itr != element.normalIndices.rend(); index_itr != element.normalIndices.rend();
++index_itr) ++index_itr)
{ {
normals->push_back(transformNormal(model.normals[*index_itr])); normals->push_back(transformNormal(model.normals[*index_itr],rotate));
} }
} }
if (numTexCoordIndices) if (numTexCoordIndices)
@ -380,7 +404,7 @@ osg::Geometry* ReaderWriterOBJ::convertElementListToGeometry(obj::Model& model,
index_itr != element.vertexIndices.end(); index_itr != element.vertexIndices.end();
++index_itr) ++index_itr)
{ {
vertices->push_back(transformVertex(model.vertices[*index_itr])); vertices->push_back(transformVertex(model.vertices[*index_itr],rotate));
} }
if (numNormalIndices) if (numNormalIndices)
{ {
@ -388,7 +412,7 @@ osg::Geometry* ReaderWriterOBJ::convertElementListToGeometry(obj::Model& model,
index_itr != element.normalIndices.end(); index_itr != element.normalIndices.end();
++index_itr) ++index_itr)
{ {
normals->push_back(transformNormal(model.normals[*index_itr])); normals->push_back(transformNormal(model.normals[*index_itr],rotate));
} }
} }
if (numTexCoordIndices) if (numTexCoordIndices)
@ -410,7 +434,7 @@ osg::Geometry* ReaderWriterOBJ::convertElementListToGeometry(obj::Model& model,
return geometry; return geometry;
} }
osg::Node* ReaderWriterOBJ::convertModelToSceneGraph(obj::Model& model) const osg::Node* ReaderWriterOBJ::convertModelToSceneGraph(obj::Model& model, bool& rotate) const
{ {
if (model.elementStateMap.empty()) return 0; if (model.elementStateMap.empty()) return 0;
@ -430,7 +454,7 @@ osg::Node* ReaderWriterOBJ::convertModelToSceneGraph(obj::Model& model) const
const obj::ElementState& es = itr->first; const obj::ElementState& es = itr->first;
obj::Model::ElementList& el = itr->second; obj::Model::ElementList& el = itr->second;
osg::Geometry* geometry = convertElementListToGeometry(model,el); osg::Geometry* geometry = convertElementListToGeometry(model,el,rotate);
if (geometry) if (geometry)
{ {
@ -453,6 +477,7 @@ osg::Node* ReaderWriterOBJ::convertModelToSceneGraph(obj::Model& model) const
tsv.smooth(*geometry); tsv.smooth(*geometry);
} }
osg::Geode* geode = new osg::Geode; osg::Geode* geode = new osg::Geode;
geode->addDrawable(geometry); geode->addDrawable(geometry);
geode->setName(es.objectName); geode->setName(es.objectName);
@ -484,12 +509,18 @@ osgDB::ReaderWriter::ReadResult ReaderWriterOBJ::readNode(const std::string& fil
osg::ref_ptr<Options> local_opt = options ? static_cast<Options*>(options->clone(osg::CopyOp::SHALLOW_COPY)) : new Options; osg::ref_ptr<Options> local_opt = options ? static_cast<Options*>(options->clone(osg::CopyOp::SHALLOW_COPY)) : new Options;
local_opt->setDatabasePath(osgDB::getFilePath(fileName)); local_opt->setDatabasePath(osgDB::getFilePath(fileName));
obj::Model model; obj::Model model;
model.setDatabasePath(osgDB::getFilePath(fileName.c_str())); model.setDatabasePath(osgDB::getFilePath(fileName.c_str()));
model.readOBJ(fin, local_opt.get()); model.readOBJ(fin, local_opt.get());
osg::Node* node = convertModelToSceneGraph(model); // code for checking the nonRotation
bool rotate = true;
if ((options!=NULL) && (options->getOptionString() == "noRotation"))
{
rotate = false;
}
osg::Node* node = convertModelToSceneGraph(model,rotate);
return node; return node;
} }
@ -503,7 +534,14 @@ osgDB::ReaderWriter::ReadResult ReaderWriterOBJ::readNode(std::istream& fin, con
obj::Model model; obj::Model model;
model.readOBJ(fin, options); model.readOBJ(fin, options);
osg::Node* node = convertModelToSceneGraph(model); // code for checking the nonRotation
bool rotate = true;
if ((options!=NULL) && (options->getOptionString() == "noRotation"))
{
rotate = false;
}
osg::Node* node = convertModelToSceneGraph(model,rotate);
return node; return node;
} }