From Ulrich Hertlein, "attached are some minor tweaks:

- fixed typos in osgViewer/ViewerBase
- const-ness in include/osg/View findSlaveIndexForCamera
- supported options for STL reader, fixed return values to reflect proper errors
- supported options for DirectX reader, fixed return values
- normals pseudo-loader: scaling normals to a const (but variable) fraction of the bounding sphere radius
"
This commit is contained in:
Robert Osfield
2008-07-17 13:51:14 +00:00
parent dd9364df0e
commit 4aed0a7eac
7 changed files with 101 additions and 74 deletions

View File

@@ -115,7 +115,7 @@ class OSG_EXPORT View : public virtual osg::Object
bool addSlave(osg::Camera* camera, bool useMastersSceneData=true) { return addSlave(camera, osg::Matrix::identity(), osg::Matrix::identity(), useMastersSceneData); }
bool addSlave(osg::Camera* camera, const osg::Matrix& projectionOffset, const osg::Matrix& viewOffse, bool useMastersSceneData=true);
bool addSlave(osg::Camera* camera, const osg::Matrix& projectionOffset, const osg::Matrix& viewOffset, bool useMastersSceneData=true);
bool removeSlave(unsigned int pos);
@@ -124,7 +124,7 @@ class OSG_EXPORT View : public virtual osg::Object
Slave& getSlave(unsigned int pos) { return _slaves[pos]; }
const Slave& getSlave(unsigned int pos) const { return _slaves[pos]; }
unsigned int findSlaveIndexForCamera(osg::Camera* camera);
unsigned int findSlaveIndexForCamera(osg::Camera* camera) const;
Slave * findSlaveForCamera(osg::Camera* camera);

View File

@@ -98,7 +98,7 @@ class OSGVIEWER_EXPORT ViewerBase : public virtual osg::Object
};
/** Set the position of the end barrier.
* AfterSwapBuffers will may result is slightly higher framerates, by may
* AfterSwapBuffers may result in slightly higher framerates, but may
* lead to inconsistent swapping between different windows.
* BeforeSwapBuffers may lead to slightly lower framerate, but improve consistency in timing of swap buffers,
* especially important if you are likely to consistently break frame.*/

View File

@@ -212,7 +212,7 @@ View::Slave * View::findSlaveForCamera(osg::Camera* camera)
return &(_slaves[i]);
}
unsigned int View::findSlaveIndexForCamera(osg::Camera* camera)
unsigned int View::findSlaveIndexForCamera(osg::Camera* camera) const
{
if (_camera == camera) return _slaves.size();

View File

@@ -4,6 +4,8 @@ using namespace osg;
Normals::Normals( Node *node, float scale, Mode mode )
{
setName(mode == VertexNormals ? "VertexNormals" : "SurfaceNormals");
MakeNormalsVisitor mnv(scale,mode);
node->accept( mnv );
@@ -108,7 +110,6 @@ void Normals::MakeNormalsVisitor::apply( Geode &geode )
n *= _normal_scale;
_local_coords->push_back( v );
_local_coords->push_back( (v + n));
}
else
{
@@ -124,7 +125,6 @@ void Normals::MakeNormalsVisitor::apply( Geode &geode )
normals_index++;
else
normals_index+=3;
}
break;
}
@@ -158,8 +158,27 @@ void Normals::MakeNormalsVisitor::apply( Geode &geode )
break;
}
case(PrimitiveSet::QUAD_STRIP):
case(PrimitiveSet::POLYGON):
break;
case(PrimitiveSet::POLYGON):
{
DrawArrayLengths* dal = dynamic_cast<DrawArrayLengths*>((*itr).get());
if (dal) {
for (unsigned int j = 0; j < dal->size(); ++j) {
unsigned int num_prim = (*dal)[j];
//notify(WARN) << "j=" << j << " num_prim=" << num_prim << std::endl;
_processPrimitive(num_prim, coord_index, normals_index, binding);
coord_index += num_prim;
if (binding == Geometry::BIND_PER_PRIMITIVE) {
++normals_index;
} else {
normals_index += num_prim;
}
}
}
break;
}
default:
break;
}
@@ -193,7 +212,7 @@ void Normals::MakeNormalsVisitor::_processPrimitive( unsigned int nv,
}
for( unsigned int i = 0; i < nv; i++ )
v += *(coords++) * _mat;
v += *(coords++) * _mat;
v /= (float)(nv);
n *= _normal_scale;

View File

@@ -45,29 +45,29 @@ class NormalsReader: public osgDB::ReaderWriter
{
if( opt == "help" || opt == "HELP" )
{
osg::notify( osg::INFO ) <<
"Normals Plugin usage: <application> [-O options] <model.ext>.normals\n"
" options: \"scale=<scale>\" (default = 1.0)\n"
" \"mode=<VertexNormals|SurfaceNormals>\" (default = VertexNormals)" << std::endl;
usage();
}
else
{
int index = opt.find( "=" );
if( opt.substr( 0, index ) == "scale" ||
opt.substr( 0, index ) == "SCALE" )
{
scale = atof( opt.substr( index+1 ).c_str() );
}
else if( opt.substr( 0, index ) == "mode" || opt.substr( 0, index ) == "MODE" )
{
std::string modestr = opt.substr(index+1);
if( modestr == "VertexNormals" )
mode = Normals::VertexNormals;
else if( modestr == "SurfaceNormals" )
mode = Normals::SurfaceNormals;
else
mode = Normals::VertexNormals;
size_t index = opt.find( "=" );
if (index == std::string::npos) {
usage();
} else {
std::string key = opt.substr(0, index);
std::string value = opt.substr(index+1);
if( key == "scale" || key == "SCALE" )
{
scale = atof( value.c_str() );
}
else if( key == "mode" || key == "MODE" )
{
if( value == "VertexNormals" )
mode = Normals::VertexNormals;
else if( value == "SurfaceNormals" )
mode = Normals::SurfaceNormals;
else
mode = Normals::VertexNormals;
}
}
}
}
@@ -81,6 +81,10 @@ class NormalsReader: public osgDB::ReaderWriter
{
osg::ref_ptr<osg::Group> group = new osg::Group;
group->addChild( node.get() );
const osg::BoundingSphere& bsph = group->getBound();
scale = bsph.radius() * 0.05f * scale; // default is 5% of bounding-sphere radius
if( mode == Normals::VertexNormals )
group->addChild( new VertexNormals( node.get(), scale ));
else if( mode == Normals::SurfaceNormals )
@@ -91,6 +95,14 @@ class NormalsReader: public osgDB::ReaderWriter
}
return 0L;
}
private:
void usage() const {
osg::notify( osg::INFO ) <<
"Normals Plugin usage: <application> [-O options] <model.ext>.normals\n"
" options: \"scale=<scale>\" (default = 1.0)\n"
" \"mode=<VertexNormals|SurfaceNormals>\" (default = VertexNormals)" << std::endl;
}
};
REGISTER_OSGPLUGIN(normals, NormalsReader)

View File

@@ -47,8 +47,9 @@ class ReaderWriterSTL : public osgDB::ReaderWriter
public:
ReaderWriterSTL()
{
supportsExtension("stl","STL format");
supportsExtension("sta","STL format");
supportsExtension("stl","STL binary format");
supportsExtension("sta","STL ASCII format");
supportsOption("smooth", "run SmoothingVisitor");
}
virtual const char* className() const {
@@ -119,9 +120,8 @@ osgDB::ReaderWriter::ReadResult ReaderWriterSTL::readNode(const std::string& fil
// determine ASCII vs. binary mode
FILE* fp = fopen(fileName.c_str(), "rb");
if (!fp) {
return ReadResult::FILE_NOT_HANDLED;
return ReadResult::FILE_NOT_FOUND;
}
ReaderObject readerObject;
@@ -130,7 +130,7 @@ osgDB::ReaderWriter::ReadResult ReaderWriterSTL::readNode(const std::string& fil
StlHeader header;
if (fread((void*) &header, sizeof(header), 1, fp) != 1) {
fclose(fp);
return ReadResult::FILE_NOT_HANDLED;
return ReadResult::ERROR_IN_READING_FILE;
}
bool isBinary = false;
@@ -146,7 +146,7 @@ osgDB::ReaderWriter::ReadResult ReaderWriterSTL::readNode(const std::string& fil
{
osg::notify(osg::FATAL) << "ReaderWriterSTL::readNode: Unable to stat '" << fileName << "'" << std::endl;
fclose(fp);
return ReadResult::FILE_NOT_HANDLED;
return ReadResult::ERROR_IN_READING_FILE;
}
if (stb.st_size == expectLen)
@@ -163,7 +163,7 @@ osgDB::ReaderWriter::ReadResult ReaderWriterSTL::readNode(const std::string& fil
else {
osg::notify(osg::FATAL) << "ReaderWriterSTL::readNode(" << fileName.c_str() << ") unable to determine file format" << std::endl;
fclose(fp);
return ReadResult::FILE_NOT_HANDLED;
return ReadResult::ERROR_IN_READING_FILE;
}
if (!isBinary)
@@ -204,15 +204,7 @@ osgDB::ReaderWriter::ReadResult ReaderWriterSTL::readNode(const std::string& fil
osg::Geode* geode = new osg::Geode;
geode->addDrawable(geom);
bool doSmoothing = false;
if (options && (options->getOptionString() == "smooth"))
{
doSmoothing = true;
}
if (doSmoothing)
{
if (options && (options->getOptionString() == "smooth")) {
osgUtil::SmoothingVisitor smooter;
geode->accept(smooter);
}

View File

@@ -51,10 +51,11 @@ public:
ReaderWriterDirectX()
{
supportsExtension("x","DirectX scene format");
supportsOption("flipTexture", "flip texture upside-down");
}
virtual const char* className() const {
return "DirectX Reader/Writer";
return "DirectX Reader";
}
virtual ReadResult readNode(const std::string& fileName, const osgDB::ReaderWriter::Options* options) const;
@@ -84,33 +85,34 @@ osgDB::ReaderWriter::ReadResult ReaderWriterDirectX::readNode(const std::string&
// Load DirectX mesh
DX::Object obj;
if (obj.load(fileName.c_str())) {
// code for setting up the database path so that internally referenced file are searched for on relative paths.
osg::ref_ptr<Options> local_opt = options ? static_cast<Options*>(options->clone(osg::CopyOp::SHALLOW_COPY)) : new Options;
local_opt->setDatabasePath(osgDB::getFilePath(fileName));
// Options?
bool flipTexture = true;
float creaseAngle = 80.0f;
if (options) {
const std::string option = options->getOptionString();
if (option.find("flipTexture") != std::string::npos)
flipTexture = false;
if (option.find("creaseAngle") != std::string::npos) {
// TODO
}
}
// Convert to osg::Group
osg::Group* group = convertFromDX(obj, flipTexture, creaseAngle, local_opt.get());
if (!group)
return ReadResult::FILE_NOT_HANDLED;
return group;
if (obj.load(fileName.c_str()) == false) {
return ReadResult::ERROR_IN_READING_FILE;
}
return ReadResult::FILE_NOT_HANDLED;
// code for setting up the database path so that internally referenced file are searched for on relative paths.
osg::ref_ptr<Options> local_opt = options ? static_cast<Options*>(options->clone(osg::CopyOp::SHALLOW_COPY)) : new Options;
local_opt->setDatabasePath(osgDB::getFilePath(fileName));
// Options?
bool flipTexture = true;
float creaseAngle = 80.0f;
if (options) {
const std::string option = options->getOptionString();
if (option.find("flipTexture") != std::string::npos) {
flipTexture = false;
}
if (option.find("creaseAngle") != std::string::npos) {
// TODO
}
}
// Convert to osg::Group
osg::Group* group = convertFromDX(obj, flipTexture, creaseAngle, local_opt.get());
if (!group) {
return ReadResult::ERROR_IN_READING_FILE;
}
return group;
}
// Convert DirectX object
@@ -118,17 +120,19 @@ osg::Group * ReaderWriterDirectX::convertFromDX(DX::Object & obj,
bool flipTexture, float creaseAngle,
const osgDB::ReaderWriter::Options * options) const
{
osg::Group * group = new osg::Group;
osg::ref_ptr<osg::Group> group = new osg::Group;
for (unsigned int i = 0; i < obj.getNumMeshes(); ++i) {
//std::cerr << "converting mesh " << i << std::endl;
DX::Mesh & mesh = *obj.getMesh(i);
osg::Geode * geode = convertFromDX(mesh, flipTexture, creaseAngle, options);
if (geode)
group->addChild(geode);
if (!geode) {
return 0;
}
group->addChild(geode);
}
return group;
return group.release();
}
// Convert DirectX mesh to osg::Geode