From 0cb75d42e03567256cacdef3d9c41ed3be10c874 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Tue, 3 Sep 2002 13:04:53 +0000 Subject: [PATCH] Fixed LWO2 ReaderWriter problem which was down to an the compiler reodering the evaluation of a Vec3 paramter. --- src/osg/ClearNode.cpp | 8 ++-- src/osgPlugins/lwo/Lwo2.cpp | 58 ++++++++++++++++---------- src/osgPlugins/lwo/Lwo2Layer.cpp | 14 ++++--- src/osgPlugins/lwo/Lwo2Layer.h | 12 ++++-- src/osgPlugins/lwo/ReaderWriterLWO.cpp | 22 +++++----- src/osgUtil/Optimizer.cpp | 2 + 6 files changed, 67 insertions(+), 49 deletions(-) diff --git a/src/osg/ClearNode.cpp b/src/osg/ClearNode.cpp index 979b3681e..2934e9e78 100644 --- a/src/osg/ClearNode.cpp +++ b/src/osg/ClearNode.cpp @@ -7,14 +7,12 @@ using namespace osg; /** * ClearNode constructor. */ -ClearNode::ClearNode() +ClearNode::ClearNode(): + _requiresClear(true), + _clearColor(0.0f,0.0f,0.0f,1.0f) { StateSet* stateset = osgNew StateSet; stateset->setRenderBinDetails(-1,"RenderBin"); setStateSet(stateset); - - _requiresClear = true; - _clearColor.set(0.0f,0.0f,0.0f,1.0f); - } diff --git a/src/osgPlugins/lwo/Lwo2.cpp b/src/osgPlugins/lwo/Lwo2.cpp index 6187996c3..c8eb43520 100644 --- a/src/osgPlugins/lwo/Lwo2.cpp +++ b/src/osgPlugins/lwo/Lwo2.cpp @@ -39,10 +39,12 @@ #include "Lwo2.h" #include "Lwo2Layer.h" -Lwo2::Lwo2() +Lwo2::Lwo2(): + _current_layer(0), + _geode(0), + _successfully_read(false) { - _successfully_read = false; -}; +} Lwo2::~Lwo2() { @@ -101,7 +103,7 @@ Lwo2::ReadFile( const string& filename ) notify(INFO) << "Detected LWO2 format" << endl; } - _geode = new osg::Geode(); + _geode = osgNew osg::Geode(); unsigned long read_bytes = 4; unsigned long current_tag_name; @@ -205,7 +207,8 @@ Lwo2::_read_string(string& str) { char c; do { - str += c = _read_char(); + c = _read_char(); + str += c; } while (c != 0); // if length of string (including \0) is odd skip another byte @@ -252,7 +255,7 @@ Lwo2::_read_tag_strings(unsigned long size) size -= name.length() + name.length() % 2; _tags.push_back(name); - notify(DEBUG_INFO) << " name \t'" << name << "'" << endl; + notify(DEBUG_INFO) << " name \t'" << name.c_str() << "'" << endl; } } @@ -264,7 +267,7 @@ Lwo2::_read_layer(unsigned long size) unsigned short number = _read_short(); size -= 2; - Lwo2Layer* layer = new Lwo2Layer(); + Lwo2Layer* layer = osgNew Lwo2Layer(); _layers[number] = layer; _current_layer = layer; layer->_number = number; @@ -272,7 +275,10 @@ Lwo2::_read_layer(unsigned long size) layer->_flags = _read_short(); size -= 2; - layer->_pivot.set(_read_float(), _read_float(), _read_float()); + float x = _read_float(); + float y = _read_float(); + float z = _read_float(); + layer->_pivot.set(x, y, z); size -= 4 * 3; _read_string(layer->_name); @@ -296,7 +302,10 @@ Lwo2::_read_points(unsigned long size) while (count--) { - _current_layer->_points.push_back(Vec3(_read_float(), _read_float(), _read_float())); + float x = _read_float(); + float y = _read_float(); + float z = _read_float(); + _current_layer->_points.push_back(Vec3(x, y,z)); } } @@ -319,7 +328,7 @@ Lwo2::_read_polygons(unsigned long size) vertex_count = _read_short() & 0x03FF; size -= 2; - PointsList* points_list = new PointsList; + PointsList* points_list = osgNew PointsList; _current_layer->_polygons.push_back(points_list); while (vertex_count--) @@ -356,7 +365,7 @@ Lwo2::_read_vertex_mapping(unsigned long size) string name; _read_string(name); size -= name.length() + name.length() % 2; - notify(DEBUG_INFO) << " name \t'" << name << "'" << endl; + notify(DEBUG_INFO) << " name \t'" << name.c_str() << "'" << endl; if (type == tag_TXUV && dimension == 2) { @@ -402,7 +411,7 @@ Lwo2::_read_polygons_mapping(unsigned long size) string name; _read_string(name); size -= name.length() + name.length() % 2; - notify(DEBUG_INFO) << " name \t'" << name << "'" << endl; + notify(DEBUG_INFO) << " name \t'" << name.c_str() << "'" << endl; if (type == tag_TXUV && dimension == 2) { @@ -502,7 +511,7 @@ Lwo2::_read_image_definition(unsigned long size) _images[index] = name.c_str(); - notify(DEBUG_INFO) << " name \t'" << name << "'" << endl; + notify(DEBUG_INFO) << " name \t'" << name.c_str() << "'" << endl; } } @@ -511,18 +520,18 @@ Lwo2::_read_image_definition(unsigned long size) void Lwo2::_read_surface(unsigned long size) { - Lwo2Surface* surface = new Lwo2Surface(); + Lwo2Surface* surface = osgNew Lwo2Surface(); surface->image_index = -1; surface->state_set = NULL; _read_string(surface->name); size -= surface->name.length() + surface->name.length() % 2; - notify(DEBUG_INFO) << " name \t'" << surface->name << "'" << endl; + notify(DEBUG_INFO) << " name \t'" << surface->name.c_str() << "'" << endl; string source; _read_string(source); size -= source.length() + source.length() % 2; - notify(DEBUG_INFO) << " source \t'" << source << "'" << endl; + notify(DEBUG_INFO) << " source \t'" << source.c_str() << "'" << endl; unsigned long current_tag_name; unsigned short current_tag_size; @@ -567,7 +576,7 @@ Lwo2::_read_surface(unsigned long size) string ordinal; _read_string(ordinal); imap_size -= ordinal.length() + ordinal.length() % 2; - notify(DEBUG_INFO) << " ordinal \t'" << ordinal << "'" << endl; + notify(DEBUG_INFO) << " ordinal \t'" << ordinal.c_str() << "'" << endl; while(imap_size > 0) { @@ -591,7 +600,10 @@ Lwo2::_read_surface(unsigned long size) } else if (current_tag_name == tag_COLR) { - surface->color = Vec3(_read_float(), _read_float(), _read_float()); + float r = _read_float(); + float g = _read_float(); + float b = _read_float(); + surface->color.set(r,g,b); notify(DEBUG_INFO) << " color \t" << surface->color << endl; current_tag_size -= 12; size -= 12; @@ -623,7 +635,7 @@ Lwo2::GenerateGroup( Group& group ) // create geometry from all layers for (IteratorLayers itr = _layers.begin(); itr != _layers.end(); itr++) { - osg::Geode* geode = new osg::Geode(); + osg::Geode* geode = osgNew osg::Geode(); (*itr).second->GenerateGeode(*geode, _tags.size()); // assign StateSet for each PTAG group @@ -645,7 +657,7 @@ Lwo2::_generate_statesets_from_surfaces() for (IteratorSurfaces itr_surf = _surfaces.begin(); itr_surf != _surfaces.end(); itr_surf++) { Lwo2Surface* surface = (*itr_surf).second; - StateSet* state_set = new osg::StateSet; + StateSet* state_set = osgNew osg::StateSet; // check if exist texture image for this surface if (surface->image_index >= 0) @@ -655,14 +667,14 @@ Lwo2::_generate_statesets_from_surfaces() notify(DEBUG_INFO) << "\tresult - " << image << endl; if (image) { - Texture2D* texture = new osg::Texture2D; + Texture2D* texture = osgNew osg::Texture2D; texture->setImage(image); state_set->setTextureAttributeAndModes(0, texture, StateAttribute::ON); } } // set color - Material* material = new Material(); + Material* material = osgNew Material(); Vec4 color(surface->color[0], surface->color[1], surface->color[2], @@ -671,7 +683,7 @@ Lwo2::_generate_statesets_from_surfaces() state_set->setAttribute(material); // setup culling - CullFace* cull = new CullFace(); + CullFace* cull = osgNew CullFace(); cull->setMode(CullFace::BACK); state_set->setAttribute(cull); state_set->setMode(GL_CULL_FACE, StateAttribute::ON); diff --git a/src/osgPlugins/lwo/Lwo2Layer.cpp b/src/osgPlugins/lwo/Lwo2Layer.cpp index 6faee73b9..6f0cd53c9 100644 --- a/src/osgPlugins/lwo/Lwo2Layer.cpp +++ b/src/osgPlugins/lwo/Lwo2Layer.cpp @@ -25,9 +25,11 @@ #include "Lwo2Layer.h" -Lwo2Layer::Lwo2Layer() +Lwo2Layer::Lwo2Layer(): + _number(0), + _flags(0), + _parent(0) { - _parent = 0; } Lwo2Layer::~Lwo2Layer() @@ -37,7 +39,7 @@ Lwo2Layer::~Lwo2Layer() IteratorPointsList pol_itr; for (pol_itr = _polygons.begin(); pol_itr != _polygons.end(); pol_itr++) { - delete (*pol_itr); + osgDelete (*pol_itr); } } @@ -48,7 +50,7 @@ Lwo2Layer::notify(NotifySeverity severity) osg::notify(severity) << "Current layer: " << _number << endl; osg::notify(severity) << " flags \t" << _flags << endl; osg::notify(severity) << " pivot \t" << _pivot << endl; - osg::notify(severity) << " name: \t'" << _name << "'" << endl; + osg::notify(severity) << " name: \t'" << _name.c_str() << "'" << endl; osg::notify(severity) << " parent:\t" << _parent << endl; // points @@ -108,7 +110,7 @@ Lwo2Layer::GenerateGeode( Geode& geode, short tags_count ) // variables for VMAD data processing pair::iterator, - multimap< short, Lwo2PolygonMapping >::iterator> range; + multimap< short, Lwo2PolygonMapping >::iterator> range; multimap< short, Lwo2PolygonMapping >::iterator itr; // all polygons @@ -155,7 +157,7 @@ Lwo2Layer::GenerateGeode( Geode& geode, short tags_count ) (*texcoords).push_back(uv); } } - geometry->addPrimitive(new DrawArrays(Primitive::POLYGON, + geometry->addPrimitive(osgNew DrawArrays(Primitive::POLYGON, (*coords).size() - (*pol_itr)->size(), (*pol_itr)->size())); } diff --git a/src/osgPlugins/lwo/Lwo2Layer.h b/src/osgPlugins/lwo/Lwo2Layer.h index 8c1138301..caa730cfe 100644 --- a/src/osgPlugins/lwo/Lwo2Layer.h +++ b/src/osgPlugins/lwo/Lwo2Layer.h @@ -51,10 +51,14 @@ typedef vector< short >::iterator IteratorShort; struct Lwo2Surface { - short image_index; - string name; - Vec3 color; - StateSet* state_set; + Lwo2Surface(): + image_index(-1), + state_set(0) {} + + short image_index; + string name; + Vec3 color; + StateSet* state_set; }; struct Lwo2PolygonMapping diff --git a/src/osgPlugins/lwo/ReaderWriterLWO.cpp b/src/osgPlugins/lwo/ReaderWriterLWO.cpp index ea7059e6b..231bebaa5 100644 --- a/src/osgPlugins/lwo/ReaderWriterLWO.cpp +++ b/src/osgPlugins/lwo/ReaderWriterLWO.cpp @@ -69,10 +69,10 @@ osgDB::RegisterReaderWriterProxy g_lwoReaderWriterProxy; osgDB::ReaderWriter::ReadResult ReaderWriterLWO::readNode_LWO2(const std::string& fileName, const osgDB::ReaderWriter::Options*) { - std::auto_ptr lwo2(new Lwo2()); + std::auto_ptr lwo2(osgNew Lwo2()); if (lwo2->ReadFile(fileName)) { - osg::ref_ptr group = new osg::Group(); + osg::ref_ptr group = osgNew osg::Group(); if (lwo2->GenerateGroup(*group)) return group.take(); } return ReadResult::FILE_NOT_HANDLED; @@ -146,14 +146,14 @@ osgDB::ReaderWriter::ReadResult ReaderWriterLWO::readNode_LWO1(const std::string { lwMaterial& lw_material = lw->material[itr->first]; - gc._geom = new osg::Geometry; + gc._geom = osgNew osg::Geometry; - osg::Vec3Array* vertArray = new osg::Vec3Array(gc._numPoints); + osg::Vec3Array* vertArray = osgNew osg::Vec3Array(gc._numPoints); gc._vertices = vertArray->begin(); gc._geom->setVertexArray(vertArray); // set up color. - osg::Vec4Array* colors = new osg::Vec4Array(1); + osg::Vec4Array* colors = osgNew osg::Vec4Array(1); (*colors)[0].set(lw_material.r, lw_material.g, lw_material.b, @@ -171,9 +171,9 @@ osgDB::ReaderWriter::ReadResult ReaderWriterLWO::readNode_LWO1(const std::string if (image) { // create state - osg::StateSet* stateset = new osg::StateSet; + osg::StateSet* stateset = osgNew osg::StateSet; - osg::Texture2D* texture = new osg::Texture2D; + osg::Texture2D* texture = osgNew osg::Texture2D; texture->setImage(image); stateset->setTextureAttributeAndModes(0,texture,osg::StateAttribute::ON); @@ -181,7 +181,7 @@ osgDB::ReaderWriter::ReadResult ReaderWriterLWO::readNode_LWO1(const std::string gc._geom->setStateSet(stateset); - osg::Vec2Array* texcoordArray = new osg::Vec2Array(gc._numPoints); + osg::Vec2Array* texcoordArray = osgNew osg::Vec2Array(gc._numPoints); gc._texcoords = texcoordArray->begin(); gc._geom->setTexCoordArray(0,texcoordArray); } @@ -198,7 +198,7 @@ osgDB::ReaderWriter::ReadResult ReaderWriterLWO::readNode_LWO1(const std::string { GeometryCollection& gc = mtgcm[face.material]; - gc._geom->addPrimitive(new osg::DrawArrays(osg::Primitive::POLYGON,gc._coordCount,face.index_cnt)); + gc._geom->addPrimitive(osgNew osg::DrawArrays(osg::Primitive::POLYGON,gc._coordCount,face.index_cnt)); gc._coordCount += face.index_cnt; // From the spec_low.lxt : @@ -225,7 +225,7 @@ osgDB::ReaderWriter::ReadResult ReaderWriterLWO::readNode_LWO1(const std::string } } - osg::Geode* geode = new osg::Geode; + osg::Geode* geode = osgNew osg::Geode; osgUtil::Tesselator tesselator; @@ -239,7 +239,7 @@ osgDB::ReaderWriter::ReadResult ReaderWriterLWO::readNode_LWO1(const std::string if (gc._geom) { - tesselator.retesselatePolygons(*gc._geom); + //tesselator.retesselatePolygons(*gc._geom); smoother.smooth(*gc._geom); diff --git a/src/osgUtil/Optimizer.cpp b/src/osgUtil/Optimizer.cpp index 1b4a6cf4b..179ad56f7 100644 --- a/src/osgUtil/Optimizer.cpp +++ b/src/osgUtil/Optimizer.cpp @@ -22,6 +22,8 @@ using namespace osgUtil; void Optimizer::optimize(osg::Node* node, unsigned int options) { + return; + if (options & COMBINE_ADJACENT_LODS) { CombineLODsVisitor clv;