Fixed LWO2 ReaderWriter problem which was down to an the compiler reodering
the evaluation of a Vec3 paramter.
This commit is contained in:
parent
46585242a1
commit
0cb75d42e0
@ -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);
|
||||
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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<multimap< short, Lwo2PolygonMapping >::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()));
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -69,10 +69,10 @@ osgDB::RegisterReaderWriterProxy<ReaderWriterLWO> g_lwoReaderWriterProxy;
|
||||
|
||||
osgDB::ReaderWriter::ReadResult ReaderWriterLWO::readNode_LWO2(const std::string& fileName, const osgDB::ReaderWriter::Options*)
|
||||
{
|
||||
std::auto_ptr<Lwo2> lwo2(new Lwo2());
|
||||
std::auto_ptr<Lwo2> lwo2(osgNew Lwo2());
|
||||
if (lwo2->ReadFile(fileName))
|
||||
{
|
||||
osg::ref_ptr<Group> group = new osg::Group();
|
||||
osg::ref_ptr<Group> 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);
|
||||
|
||||
|
@ -22,6 +22,8 @@ using namespace osgUtil;
|
||||
void Optimizer::optimize(osg::Node* node, unsigned int options)
|
||||
{
|
||||
|
||||
return;
|
||||
|
||||
if (options & COMBINE_ADJACENT_LODS)
|
||||
{
|
||||
CombineLODsVisitor clv;
|
||||
|
Loading…
Reference in New Issue
Block a user