Cleaned up usage of BIND_PER_PRIMITIVE where possible.

This commit is contained in:
Robert Osfield 2013-06-19 16:24:59 +00:00
parent 9c127c2bca
commit df075ef9bb
16 changed files with 97 additions and 96 deletions

View File

@ -22,6 +22,11 @@
* exist in the triangulation. * exist in the triangulation.
*/ */
#include <osg/Config>
#ifndef OSG_USE_DEPRECATED_GEOMETRY_METHODS
#define OSG_USE_DEPRECATED_GEOMETRY_METHODS 1
#endif
#include <osgDB/ReadFile> #include <osgDB/ReadFile>
#include <osgUtil/Optimizer> #include <osgUtil/Optimizer>
#include <osgViewer/Viewer> #include <osgViewer/Viewer>

View File

@ -33,6 +33,10 @@
// example uses a NodeVisitor to try to find worthwhile locations // example uses a NodeVisitor to try to find worthwhile locations
// for OcclusionQueryNodes in your the scene graph. // for OcclusionQueryNodes in your the scene graph.
#include <osg/Config>
#ifndef OSG_USE_DEPRECATED_GEOMETRY_METHODS
#define OSG_USE_DEPRECATED_GEOMETRY_METHODS 1
#endif
#include <osg/NodeVisitor> #include <osg/NodeVisitor>

View File

@ -235,7 +235,9 @@ class OSG_EXPORT Geometry : public Drawable
BIND_OFF=0, BIND_OFF=0,
BIND_OVERALL=1, BIND_OVERALL=1,
BIND_PER_PRIMITIVE_SET=2, BIND_PER_PRIMITIVE_SET=2,
#if defined(OSG_USE_DEPRECATED_GEOMETRY_METHODS)
BIND_PER_PRIMITIVE=3, /// no longer supported BIND_PER_PRIMITIVE=3, /// no longer supported
#endif
BIND_PER_VERTEX=4 BIND_PER_VERTEX=4
}; };

View File

@ -153,7 +153,7 @@ void Geometry::setFogCoordArray(Array* array)
} \ } \
if (array->getBinding() == static_cast<osg::Array::Binding>(ab)) return; \ if (array->getBinding() == static_cast<osg::Array::Binding>(ab)) return; \
array->setBinding(static_cast<osg::Array::Binding>(ab));\ array->setBinding(static_cast<osg::Array::Binding>(ab));\
if (ab==BIND_PER_PRIMITIVE) _containsDeprecatedData = true; if (ab==3 /*osg::Geometry::BIND_PER_PRIMITIVE*/) _containsDeprecatedData = true;
#define GET_BINDING(array) (array!=0 ? static_cast<AttributeBinding>(array->getBinding()) : BIND_OFF) #define GET_BINDING(array) (array!=0 ? static_cast<AttributeBinding>(array->getBinding()) : BIND_OFF)
@ -1352,19 +1352,19 @@ void Geometry::fixDeprecatedData()
osg::IndexArray* indices = getIndexArray(_vertexArray.get()); osg::IndexArray* indices = getIndexArray(_vertexArray.get());
if (indices) setVertexArray(expandIndexArray(_vertexArray.get(), indices)); if (indices) setVertexArray(expandIndexArray(_vertexArray.get(), indices));
if (getNormalBinding()==osg::Geometry::BIND_PER_PRIMITIVE) containsBindPerPrimitive = true; if (getNormalBinding()==3 /*osg::Geometry::BIND_PER_PRIMITIVE*/) containsBindPerPrimitive = true;
indices = getIndexArray(_normalArray.get()); indices = getIndexArray(_normalArray.get());
if (indices) setNormalArray(expandIndexArray(getNormalArray(), indices)); if (indices) setNormalArray(expandIndexArray(getNormalArray(), indices));
if (getColorBinding()==osg::Geometry::BIND_PER_PRIMITIVE) containsBindPerPrimitive = true; if (getColorBinding()==3 /*osg::Geometry::BIND_PER_PRIMITIVE*/) containsBindPerPrimitive = true;
indices = getIndexArray(_colorArray.get()); indices = getIndexArray(_colorArray.get());
if (indices) setColorArray(expandIndexArray(getColorArray(), indices)); if (indices) setColorArray(expandIndexArray(getColorArray(), indices));
if (getSecondaryColorBinding()==osg::Geometry::BIND_PER_PRIMITIVE) containsBindPerPrimitive = true; if (getSecondaryColorBinding()==3 /*osg::Geometry::BIND_PER_PRIMITIVE*/) containsBindPerPrimitive = true;
indices = getIndexArray(_secondaryColorArray.get()); indices = getIndexArray(_secondaryColorArray.get());
if (indices) setSecondaryColorArray(expandIndexArray(getSecondaryColorArray(), indices)); if (indices) setSecondaryColorArray(expandIndexArray(getSecondaryColorArray(), indices));
if (getFogCoordBinding()==osg::Geometry::BIND_PER_PRIMITIVE) containsBindPerPrimitive = true; if (getFogCoordBinding()==3 /*osg::Geometry::BIND_PER_PRIMITIVE*/) containsBindPerPrimitive = true;
indices = getIndexArray(_fogCoordArray.get()); indices = getIndexArray(_fogCoordArray.get());
if (indices) setFogCoordArray(expandIndexArray(getFogCoordArray(), indices)); if (indices) setFogCoordArray(expandIndexArray(getFogCoordArray(), indices));
@ -1376,7 +1376,7 @@ void Geometry::fixDeprecatedData()
for(unsigned int vi=0;vi<_vertexAttribList.size();++vi) for(unsigned int vi=0;vi<_vertexAttribList.size();++vi)
{ {
if (getVertexAttribBinding(vi)==osg::Geometry::BIND_PER_PRIMITIVE) containsBindPerPrimitive = true; if (getVertexAttribBinding(vi)==3 /*osg::Geometry::BIND_PER_PRIMITIVE*/) containsBindPerPrimitive = true;
indices = getIndexArray(_vertexAttribList[vi].get()); indices = getIndexArray(_vertexAttribList[vi].get());
if (indices) setVertexAttribArray(vi, expandIndexArray(getVertexAttribArray(vi), indices)); if (indices) setVertexAttribArray(vi, expandIndexArray(getVertexAttribArray(vi), indices));
} }

View File

@ -1,3 +1,8 @@
#include <osg/Config>
#ifndef OSG_USE_DEPRECATED_GEOMETRY_METHODS
#define OSG_USE_DEPRECATED_GEOMETRY_METHODS 1
#endif
#include "ConvertFromInventor.h" #include "ConvertFromInventor.h"
#include "PendulumCallback.h" #include "PendulumCallback.h"

View File

@ -587,12 +587,12 @@ osg::Quat DataInputStream::readQuat(){
osg::Geometry::AttributeBinding DataInputStream::readBinding(){ osg::Geometry::AttributeBinding DataInputStream::readBinding(){
char c = readChar(); char c = readChar();
if (_verboseOutput) std::cout<<"read/writeBinding() ["<<(int)c<<"]"<<std::endl; if (_verboseOutput) std::cout<<"readBinding() ["<<(int)c<<"]"<<std::endl;
switch((int)c){ switch((int)c){
case 0: return osg::Geometry::BIND_OFF; case 0: return osg::Geometry::BIND_OFF;
case 1: return osg::Geometry::BIND_OVERALL; case 1: return osg::Geometry::BIND_OVERALL;
case 2: return osg::Geometry::BIND_PER_PRIMITIVE; case 2: return 3 /*osg::Geometry::BIND_PER_PRIMITIVE*/;
case 3: return osg::Geometry::BIND_PER_PRIMITIVE_SET; case 3: return osg::Geometry::BIND_PER_PRIMITIVE_SET;
case 4: return osg::Geometry::BIND_PER_VERTEX; case 4: return osg::Geometry::BIND_PER_VERTEX;
default: default:

View File

@ -509,11 +509,11 @@ void DataOutputStream::writeQuat(const osg::Quat& q){
void DataOutputStream::writeBinding(osg::Geometry::AttributeBinding b){ void DataOutputStream::writeBinding(osg::Geometry::AttributeBinding b){
switch(b){ switch(b){
case osg::Geometry::BIND_OFF: writeChar((char) 0); break; case osg::Geometry::BIND_OFF: writeChar((char) 0); break;
case osg::Geometry::BIND_OVERALL: writeChar((char) 1); break; case osg::Geometry::BIND_OVERALL: writeChar((char) 1); break;
case osg::Geometry::BIND_PER_PRIMITIVE: writeChar((char) 2); break; case static_cast<osg::Geometry::AttributeBinding>(3): writeChar((char) 2); break; /*osg::Geometry::BIND_PER_PRIMITIVE*/
case osg::Geometry::BIND_PER_PRIMITIVE_SET: writeChar((char) 3); break; case osg::Geometry::BIND_PER_PRIMITIVE_SET: writeChar((char) 3); break;
case osg::Geometry::BIND_PER_VERTEX: writeChar((char) 4); break; case osg::Geometry::BIND_PER_VERTEX: writeChar((char) 4); break;
default: throwException("Unknown binding in DataOutputStream::writeBinding()"); default: throwException("Unknown binding in DataOutputStream::writeBinding()");
} }

View File

@ -59,6 +59,8 @@ void Normals::MakeNormalsVisitor::apply( Geode &geode )
Geometry *geom = dynamic_cast<Geometry *>(geode.getDrawable(i)); Geometry *geom = dynamic_cast<Geometry *>(geode.getDrawable(i));
if( geom ) if( geom )
{ {
if (geom->containsDeprecatedData()) geom->fixDeprecatedData();
Vec3Array *coords = dynamic_cast<Vec3Array*>(geom->getVertexArray()); Vec3Array *coords = dynamic_cast<Vec3Array*>(geom->getVertexArray());
if( coords == 0L ) if( coords == 0L )
continue; continue;
@ -85,7 +87,7 @@ void Normals::MakeNormalsVisitor::apply( Geode &geode )
_local_coords->push_back( v ); _local_coords->push_back( v );
_local_coords->push_back( (v + n)); _local_coords->push_back( (v + n));
} }
else // BIND_PER_PRIMITIVE_SET, BIND_PER_PRIMITIVE, BIND_PER_VERTEX else // BIND_PER_PRIMITIVE_SET, BIND_PER_VERTEX
{ {
Geometry::PrimitiveSetList& primitiveSets = geom->getPrimitiveSetList(); Geometry::PrimitiveSetList& primitiveSets = geom->getPrimitiveSetList();
Geometry::PrimitiveSetList::iterator itr; Geometry::PrimitiveSetList::iterator itr;
@ -121,10 +123,7 @@ void Normals::MakeNormalsVisitor::apply( Geode &geode )
{ {
_processPrimitive( 3, coord_index, normals_index, binding ); _processPrimitive( 3, coord_index, normals_index, binding );
coord_index += 3; coord_index += 3;
if( binding == Geometry::BIND_PER_PRIMITIVE ) normals_index+=3;
normals_index++;
else
normals_index+=3;
} }
break; break;
} }
@ -150,10 +149,7 @@ void Normals::MakeNormalsVisitor::apply( Geode &geode )
{ {
_processPrimitive( 4, coord_index, normals_index, binding ); _processPrimitive( 4, coord_index, normals_index, binding );
coord_index += 4; coord_index += 4;
if( binding == Geometry::BIND_PER_PRIMITIVE ) normals_index +=4;
normals_index++;
else
normals_index+=4;
} }
break; break;
} }
@ -169,11 +165,7 @@ void Normals::MakeNormalsVisitor::apply( Geode &geode )
//OSG_WARN << "j=" << j << " num_prim=" << num_prim << std::endl; //OSG_WARN << "j=" << j << " num_prim=" << num_prim << std::endl;
_processPrimitive(num_prim, coord_index, normals_index, binding); _processPrimitive(num_prim, coord_index, normals_index, binding);
coord_index += num_prim; coord_index += num_prim;
if (binding == Geometry::BIND_PER_PRIMITIVE) { normals_index += num_prim;
++normals_index;
} else {
normals_index += num_prim;
}
} }
} }
break; break;
@ -198,13 +190,9 @@ void Normals::MakeNormalsVisitor::_processPrimitive( unsigned int nv,
{ {
Vec3 v(0,0,0); Vec3 v(0,0,0);
Vec3 n(0,0,0); Vec3 n(0,0,0);
if( _mode == SurfaceNormals || binding == Geometry::BIND_PER_PRIMITIVE ) if( _mode == SurfaceNormals )
{ {
if( binding == Geometry::BIND_PER_PRIMITIVE ) if( binding == Geometry::BIND_PER_VERTEX )
{
n = *(normals++);
}
else if( binding == Geometry::BIND_PER_VERTEX )
{ {
for( unsigned int i = 0; i < nv; i++ ) for( unsigned int i = 0; i < nv; i++ )
n += *(normals++); n += *(normals++);

View File

@ -136,8 +136,6 @@ class ObjPrimitiveIndexWriter : public osg::PrimitiveIndexFunctor {
write(i2); write(i2);
write(i3); write(i3);
_fout << std::endl; _fout << std::endl;
// not sure if this is correct?
if(_geo->getNormalBinding() && _geo->getNormalBinding() == osg::Geometry::BIND_PER_PRIMITIVE) ++_normalIndex;
} }
// operator for lines // operator for lines
@ -147,8 +145,6 @@ class ObjPrimitiveIndexWriter : public osg::PrimitiveIndexFunctor {
write(i1); write(i1);
write(i2); write(i2);
_fout << std::endl; _fout << std::endl;
// not sure if this is correct?
if(_geo->getNormalBinding() && _geo->getNormalBinding() == osg::Geometry::BIND_PER_PRIMITIVE) ++_normalIndex;
} }
// operator for points // operator for points
@ -157,8 +153,6 @@ class ObjPrimitiveIndexWriter : public osg::PrimitiveIndexFunctor {
_fout << "p "; _fout << "p ";
write(i1); write(i1);
_fout << std::endl; _fout << std::endl;
// not sure if this is correct?
if(_geo->getNormalBinding() && _geo->getNormalBinding() == osg::Geometry::BIND_PER_PRIMITIVE) ++_normalIndex;
} }
virtual void begin(GLenum mode) virtual void begin(GLenum mode)
@ -524,6 +518,8 @@ void OBJWriterNodeVisitor::processGeometry(osg::Geometry* geo, osg::Matrix& m) {
_fout << std::endl; _fout << std::endl;
_fout << "o " << getUniqueName( geo->getName().empty() ? geo->className() : geo->getName() ) << std::endl; _fout << "o " << getUniqueName( geo->getName().empty() ? geo->className() : geo->getName() ) << std::endl;
if (geo->containsDeprecatedData()) geo->fixDeprecatedData();
processStateSet(_currentStateSet.get()); processStateSet(_currentStateSet.get());
processArray("v", geo->getVertexArray(), m, false); processArray("v", geo->getVertexArray(), m, false);

View File

@ -97,17 +97,41 @@ private:
osg::ref_ptr<osg::Geometry> geom = new osg::Geometry; osg::ref_ptr<osg::Geometry> geom = new osg::Geometry;
geom->setVertexArray(_vertex.get()); geom->setVertexArray(_vertex.get());
geom->setNormalArray(_normal.get());
geom->setNormalBinding(osg::Geometry::BIND_PER_PRIMITIVE); if (_normal.valid())
geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::TRIANGLES, 0, _numFacets * 3)); {
// need to convert per triangle normals to per vertex
osg::ref_ptr<osg::Vec3Array> perVertexNormals = new osg::Vec3Array;
perVertexNormals->reserveArray(_normal->size() * 3);
for(osg::Vec3Array::iterator itr = _normal->begin();
itr != _normal->end();
++itr)
{
perVertexNormals->push_back(*itr);
}
geom->setNormalArray(perVertexNormals.get());
geom->setNormalBinding(osg::Geometry::BIND_PER_VERTEX);
}
if (_color.valid()) if (_color.valid())
{ {
// need to convert per triangle colours to per vertex
OSG_INFO << "STL file with color" << std::endl; OSG_INFO << "STL file with color" << std::endl;
geom->setColorArray(_color.get()); osg::ref_ptr<osg::Vec4Array> perVertexColours = new osg::Vec4Array;
geom->setColorBinding(osg::Geometry::BIND_PER_PRIMITIVE); perVertexColours->reserveArray(_color->size() * 3);
for(osg::Vec4Array::iterator itr = _color->begin();
itr != _color->end();
++itr)
{
perVertexColours->push_back(*itr);
}
geom->setColorArray(perVertexColours.get());
geom->setColorBinding(osg::Geometry::BIND_PER_VERTEX);
} }
geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::TRIANGLES, 0, _numFacets * 3));
osgUtil::TriStripVisitor tristripper; osgUtil::TriStripVisitor tristripper;
tristripper.stripify(*geom); tristripper.stripify(*geom);

View File

@ -268,6 +268,8 @@ void ToVRML::apply(osg::Drawable* drawable) {
///////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////
void ToVRML::apply(osg::Geometry* geom) { void ToVRML::apply(osg::Geometry* geom) {
if (geom->containsDeprecatedData()) geom->fixDeprecatedData();
// are all primitives faces or line ? // are all primitives faces or line ?
GLenum mode; GLenum mode;
osg::PrimitiveSet::Type type; osg::PrimitiveSet::Type type;
@ -1128,12 +1130,6 @@ void ToVRML::writeNormal(osg::Geometry* geom, std::vector<int>& primitiveSetFace
_fout << indent() << n[0] << " " << n[1] << " " << n[2] << ",\n"; _fout << indent() << n[0] << " " << n[1] << " " << n[2] << ",\n";
} }
} else if (geom->getNormalBinding() == osg::Geometry::BIND_PER_PRIMITIVE) {
for (unsigned int j = 0; j < (*nArray).size(); j++) {
n = (*nArray)[j];
_fout << indent() << n[0] << " " << n[1] << " " << n[2] << ",\n";
}
} else if (geom->getNormalBinding() == osg::Geometry::BIND_PER_PRIMITIVE_SET) { } else if (geom->getNormalBinding() == osg::Geometry::BIND_PER_PRIMITIVE_SET) {
for (unsigned int j = 0; j < (*nArray).size(); j++) { for (unsigned int j = 0; j < (*nArray).size(); j++) {
n = (*nArray)[j]; n = (*nArray)[j];
@ -1282,12 +1278,6 @@ void ToVRML::writeColor(osg::Geometry* geom, std::vector<int>& primitiveSetFaces
_fout << indent() << c[0] << " " << c[1] << " " << c[2] << ",\n"; _fout << indent() << c[0] << " " << c[1] << " " << c[2] << ",\n";
} }
} else if (geom->getColorBinding() == osg::Geometry::BIND_PER_PRIMITIVE) {
for (unsigned int j = 0; j < (*cArray).size(); j++) {
c = (*cArray)[j];
_fout << indent() << c[0] << " " << c[1] << " " << c[2] << ",\n";
}
} else if (geom->getColorBinding() == osg::Geometry::BIND_PER_PRIMITIVE_SET) { } else if (geom->getColorBinding() == osg::Geometry::BIND_PER_PRIMITIVE_SET) {
for (unsigned int j = 0; j < (*cArray).size(); j++) { for (unsigned int j = 0; j < (*cArray).size(); j++) {
c = (*cArray)[j]; c = (*cArray)[j];

View File

@ -1,3 +1,8 @@
#include <osg/Config>
#ifndef OSG_USE_DEPRECATED_GEOMETRY_METHODS
#define OSG_USE_DEPRECATED_GEOMETRY_METHODS 1
#endif
#include <osgSim/ScalarBar> #include <osgSim/ScalarBar>
#include <osgText/Text> #include <osgText/Text>
#include <osg/Geometry> #include <osg/Geometry>

View File

@ -85,8 +85,6 @@ struct GeometryArrayGatherer
if (array) if (array)
_arrayList.push_back(array); _arrayList.push_back(array);
} }
else if (binding == osg::Geometry::BIND_PER_PRIMITIVE)
_useDrawElements = false;
} }
void accept(osg::ArrayVisitor& av) void accept(osg::ArrayVisitor& av)
@ -231,17 +229,15 @@ typedef osg::TriangleIndexFunctor<MyTriangleOperator> MyTriangleIndexFunctor;
void IndexMeshVisitor::makeMesh(Geometry& geom) void IndexMeshVisitor::makeMesh(Geometry& geom)
{ {
if (geom.getNormalBinding()==osg::Geometry::BIND_PER_PRIMITIVE || if (geom.containsDeprecatedData()) geom.fixDeprecatedData();
geom.getNormalBinding()==osg::Geometry::BIND_PER_PRIMITIVE_SET) return;
if (geom.getColorBinding()==osg::Geometry::BIND_PER_PRIMITIVE || if (geom.getNormalBinding()==osg::Geometry::BIND_PER_PRIMITIVE_SET) return;
geom.getColorBinding()==osg::Geometry::BIND_PER_PRIMITIVE_SET) return;
if (geom.getSecondaryColorBinding()==osg::Geometry::BIND_PER_PRIMITIVE || if (geom.getColorBinding()==osg::Geometry::BIND_PER_PRIMITIVE_SET) return;
geom.getSecondaryColorBinding()==osg::Geometry::BIND_PER_PRIMITIVE_SET) return;
if (geom.getFogCoordBinding()==osg::Geometry::BIND_PER_PRIMITIVE || if (geom.getSecondaryColorBinding()==osg::Geometry::BIND_PER_PRIMITIVE_SET) return;
geom.getFogCoordBinding()==osg::Geometry::BIND_PER_PRIMITIVE_SET) return;
if (geom.getFogCoordBinding()==osg::Geometry::BIND_PER_PRIMITIVE_SET) return;
// no point optimizing if we don't have enough vertices. // no point optimizing if we don't have enough vertices.
if (!geom.getVertexArray() || geom.getVertexArray()->getNumElements()<3) return; if (!geom.getVertexArray() || geom.getVertexArray()->getNumElements()<3) return;

View File

@ -609,6 +609,8 @@ void Tessellator::reduceArray(osg::Array * cold, const unsigned int nnu)
void Tessellator::collectTessellation(osg::Geometry &geom, unsigned int originalIndex) void Tessellator::collectTessellation(osg::Geometry &geom, unsigned int originalIndex)
{ {
if (geom.containsDeprecatedData()) geom.fixDeprecatedData();
osg::Vec3Array* vertices = dynamic_cast<osg::Vec3Array*>(geom.getVertexArray()); osg::Vec3Array* vertices = dynamic_cast<osg::Vec3Array*>(geom.getVertexArray());
VertexPtrToIndexMap vertexPtrToIndexMap; VertexPtrToIndexMap vertexPtrToIndexMap;
@ -625,16 +627,14 @@ void Tessellator::collectTessellation(osg::Geometry &geom, unsigned int original
{ {
osg::Vec3Array* normals = NULL; // GWM Sep 2002 - add normals for extra facets osg::Vec3Array* normals = NULL; // GWM Sep 2002 - add normals for extra facets
int iprim=0; int iprim=0;
if (geom.getNormalBinding()==osg::Geometry::BIND_PER_PRIMITIVE || if (geom.getNormalBinding()==osg::Geometry::BIND_PER_PRIMITIVE_SET)
geom.getNormalBinding()==osg::Geometry::BIND_PER_PRIMITIVE_SET)
{ {
normals = dynamic_cast<osg::Vec3Array*>(geom.getNormalArray()); // GWM Sep 2002 normals = dynamic_cast<osg::Vec3Array*>(geom.getNormalArray()); // GWM Sep 2002
} }
// GWM Dec 2003 - needed to add colours for extra facets // GWM Dec 2003 - needed to add colours for extra facets
osg::Vec4Array* cols4 = NULL; // GWM Dec 2003 colours are vec4 osg::Vec4Array* cols4 = NULL; // GWM Dec 2003 colours are vec4
osg::Vec3Array* cols3 = NULL; // GWM Dec 2003 colours are vec3 osg::Vec3Array* cols3 = NULL; // GWM Dec 2003 colours are vec3
if (geom.getColorBinding()==osg::Geometry::BIND_PER_PRIMITIVE || if (geom.getColorBinding()==osg::Geometry::BIND_PER_PRIMITIVE_SET)
geom.getColorBinding()==osg::Geometry::BIND_PER_PRIMITIVE_SET)
{ {
Array* colours = geom.getColorArray(); // GWM Dec 2003 - need to duplicate face colours Array* colours = geom.getColorArray(); // GWM Dec 2003 - need to duplicate face colours
switch (colours->getType()) { switch (colours->getType()) {
@ -708,10 +708,7 @@ void Tessellator::collectTessellation(osg::Geometry &geom, unsigned int original
if (primItr==_primList.begin()) if (primItr==_primList.begin())
{ // first primitive so collect primitive normal & colour. { // first primitive so collect primitive normal & colour.
if (normals) { if (normals) {
if (geom.getNormalBinding()==osg::Geometry::BIND_PER_PRIMITIVE) norm=(*normals)[iprim]; // GWM Sep 2002 the flat shaded normal
norm=(*normals)[originalIndex + _extraPrimitives];
else
norm=(*normals)[iprim]; // GWM Sep 2002 the flat shaded normal
} }
if (cols4) { if (cols4) {
primCol4=(*cols4)[iprim]; // GWM Dec 2003 the flat shaded rgba colour primCol4=(*cols4)[iprim]; // GWM Dec 2003 the flat shaded rgba colour
@ -730,13 +727,7 @@ void Tessellator::collectTessellation(osg::Geometry &geom, unsigned int original
{ // later primitives use same colour { // later primitives use same colour
if (normals) if (normals)
{ {
if (geom.getNormalBinding()==osg::Geometry::BIND_PER_PRIMITIVE) normals->push_back(norm); // GWM Sep 2002 add flat shaded normal for new facet
{
_extraPrimitives++;
normals->insert(normals->begin() + originalIndex + _extraPrimitives, norm);
}
else
normals->push_back(norm); // GWM Sep 2002 add flat shaded normal for new facet
} }
if (cols4 && _index>=cols4->size()) { if (cols4 && _index>=cols4->size()) {
cols4->push_back(primCol4); // GWM Dec 2003 add flat shaded colour for new facet cols4->push_back(primCol4); // GWM Dec 2003 add flat shaded colour for new facet
@ -745,14 +736,12 @@ void Tessellator::collectTessellation(osg::Geometry &geom, unsigned int original
if (cols3) cols3->push_back(primCol3); // GWM Dec 2003 add flat shaded colour for new facet if (cols3) cols3->push_back(primCol3); // GWM Dec 2003 add flat shaded colour for new facet
} }
if (prim->_mode==GL_TRIANGLES) { if (prim->_mode==GL_TRIANGLES) {
if (geom.getNormalBinding()==osg::Geometry::BIND_PER_PRIMITIVE_SET || if (geom.getNormalBinding()==osg::Geometry::BIND_PER_PRIMITIVE_SET) { // need one per triangle? Not one per set.
geom.getNormalBinding()==osg::Geometry::BIND_PER_PRIMITIVE) { // need one per triangle? Not one per set.
for (int ii=1; ii<ntris; ii++) { for (int ii=1; ii<ntris; ii++) {
if (normals) normals->push_back(norm); // GWM Sep 2002 add flat shaded normal for new facet if (normals) normals->push_back(norm); // GWM Sep 2002 add flat shaded normal for new facet
} }
} }
if (geom.getColorBinding()==osg::Geometry::BIND_PER_PRIMITIVE_SET || if (geom.getColorBinding()==osg::Geometry::BIND_PER_PRIMITIVE_SET) { // need one per triangle? Not one per set.
geom.getColorBinding()==osg::Geometry::BIND_PER_PRIMITIVE) { // need one per triangle? Not one per set.
for (int ii=1; ii<ntris; ii++) { for (int ii=1; ii<ntris; ii++) {
if (cols3 && _index>=cols3->size()) { if (cols3 && _index>=cols3->size()) {
if (cols3) cols3->push_back(primCol3); if (cols3) cols3->push_back(primCol3);

View File

@ -214,18 +214,15 @@ typedef osg::TriangleIndexFunctor<MyTriangleOperator> MyTriangleIndexFunctor;
void TriStripVisitor::stripify(Geometry& geom) void TriStripVisitor::stripify(Geometry& geom)
{ {
if (geom.containsDeprecatedData()) geom.fixDeprecatedData();
if (geom.getNormalBinding()==osg::Geometry::BIND_PER_PRIMITIVE || if (geom.getNormalBinding()==osg::Geometry::BIND_PER_PRIMITIVE_SET) return;
geom.getNormalBinding()==osg::Geometry::BIND_PER_PRIMITIVE_SET) return;
if (geom.getColorBinding()==osg::Geometry::BIND_PER_PRIMITIVE || if (geom.getColorBinding()==osg::Geometry::BIND_PER_PRIMITIVE_SET) return;
geom.getColorBinding()==osg::Geometry::BIND_PER_PRIMITIVE_SET) return;
if (geom.getSecondaryColorBinding()==osg::Geometry::BIND_PER_PRIMITIVE || if (geom.getSecondaryColorBinding()==osg::Geometry::BIND_PER_PRIMITIVE_SET) return;
geom.getSecondaryColorBinding()==osg::Geometry::BIND_PER_PRIMITIVE_SET) return;
if (geom.getFogCoordBinding()==osg::Geometry::BIND_PER_PRIMITIVE || if (geom.getFogCoordBinding()==osg::Geometry::BIND_PER_PRIMITIVE_SET) return;
geom.getFogCoordBinding()==osg::Geometry::BIND_PER_PRIMITIVE_SET) return;
// no point tri stripping if we don't have enough vertices. // no point tri stripping if we don't have enough vertices.
if (!geom.getVertexArray() || geom.getVertexArray()->getNumElements()<3) return; if (!geom.getVertexArray() || geom.getVertexArray()->getNumElements()<3) return;

View File

@ -6,8 +6,8 @@
BEGIN_USER_TABLE( AttributeBinding, osg::Geometry ); BEGIN_USER_TABLE( AttributeBinding, osg::Geometry );
ADD_USER_VALUE( BIND_OFF ); ADD_USER_VALUE( BIND_OFF );
ADD_USER_VALUE( BIND_OVERALL ); ADD_USER_VALUE( BIND_OVERALL );
ADD_USER_VALUE( BIND_PER_PRIMITIVE_SET ); ADD_USER_VALUE( BIND_PER_PRIMITIVE_SET );
ADD_USER_VALUE( BIND_PER_PRIMITIVE ); lookup->add("BIND_PER_PRIMITIVE",3); //ADD_USER_VALUE( BIND_PER_PRIMITIVE );
ADD_USER_VALUE( BIND_PER_VERTEX ); ADD_USER_VALUE( BIND_PER_VERTEX );
END_USER_TABLE() END_USER_TABLE()