Improvements to handling of winding of polygons.

This commit is contained in:
Robert Osfield
2004-08-26 16:20:26 +00:00
parent 71149635fc
commit b5c2d85962
3 changed files with 44 additions and 5 deletions

View File

@@ -268,8 +268,6 @@ osg::Geometry* ReaderWriterOBJ::convertElementListToGeometry(obj::Model& model,
}
bool reverseWinding = true;
if (numPolygonElements>0)
{
unsigned int startPos = vertices->size();
@@ -284,7 +282,7 @@ osg::Geometry* ReaderWriterOBJ::convertElementListToGeometry(obj::Model& model,
{
drawArrayLengths->push_back(element.vertexIndices.size());
if (reverseWinding)
if (model.needReverse(element))
{
// need to reverse so add to OSG arrays in same order as in OBJ, as OSG assume anticlockwise ordering.
for(obj::Element::IndexList::reverse_iterator index_itr = element.vertexIndices.rbegin();
@@ -319,7 +317,7 @@ osg::Geometry* ReaderWriterOBJ::convertElementListToGeometry(obj::Model& model,
index_itr != element.vertexIndices.end();
++index_itr)
{
vertices->push_back(model.vertices[*index_itr]);
vertices->push_back(transformVertex(model.vertices[*index_itr]));
}
if (numNormalIndices)
{
@@ -327,7 +325,7 @@ osg::Geometry* ReaderWriterOBJ::convertElementListToGeometry(obj::Model& model,
index_itr != element.normalIndices.end();
++index_itr)
{
normals->push_back(model.normals[*index_itr]);
normals->push_back(transformNormal(model.normals[*index_itr]));
}
}
if (numTexCoordIndices)

View File

@@ -462,3 +462,40 @@ void Model::addElement(Element* element)
currentElementList->push_back(element);
}
osg::Vec3 Model::averageNormal(const Element& element) const
{
osg::Vec3 normal;
for(Element::IndexList::const_iterator itr=element.normalIndices.begin();
itr!=element.normalIndices.end();
++itr)
{
normal += normals[*itr];
}
normal.normalize();
return normal;
}
osg::Vec3 Model::computeNormal(const Element& element) const
{
osg::Vec3 normal;
for(unsigned int i=0;i<element.vertexIndices.size()-2;++i)
{
osg::Vec3 a = vertices[element.vertexIndices[i]];
osg::Vec3 b = vertices[element.vertexIndices[i+1]];
osg::Vec3 c = vertices[element.vertexIndices[i+2]];
osg::Vec3 localNormal = (b-a) ^(c-b);
normal += localNormal;
}
normal.normalize();
return normal;
}
bool Model::needReverse(const Element& element) const
{
if (element.normalIndices.empty()) return true;
return computeNormal(element)*averageNormal(element) < 0.0f;
}

View File

@@ -159,6 +159,10 @@ public:
bool readline(std::istream& fin, char* line, const int LINE_SIZE);
void addElement(Element* element);
osg::Vec3 averageNormal(const Element& element) const;
osg::Vec3 computeNormal(const Element& element) const;
bool needReverse(const Element& element) const;
int remapVertexIndex(int vi) { return (vi<0) ? vertices.size()+vi : vi-1; }
int remapNormalIndex(int vi) { return (vi<0) ? normals.size()+vi : vi-1; }
int remapTexCoordIndex(int vi) { return (vi<0) ? texcoords.size()+vi : vi-1; }