Changeset 3325

Show
Ignore:
Timestamp:
08/26/04 18:20:26 (10 years ago)
Author:
robert
Message:

Improvements to handling of winding of polygons.

Location:
OpenSceneGraph/trunk/src/osgPlugins/obj
Files:
3 modified

Legend:

Unmodified
Added
Removed
  • OpenSceneGraph/trunk/src/osgPlugins/obj/ReaderWriterOBJ.cpp

    r3323 r3325  
    269269    } 
    270270 
    271     bool reverseWinding = true; 
    272  
    273271    if (numPolygonElements>0) 
    274272    { 
     
    285283                drawArrayLengths->push_back(element.vertexIndices.size()); 
    286284             
    287                 if (reverseWinding) 
     285                if (model.needReverse(element)) 
    288286                { 
    289287                    // need to reverse so add to OSG arrays in same order as in OBJ, as OSG assume anticlockwise ordering. 
     
    320318                        ++index_itr) 
    321319                    { 
    322                         vertices->push_back(model.vertices[*index_itr]); 
     320                        vertices->push_back(transformVertex(model.vertices[*index_itr])); 
    323321                    } 
    324322                    if (numNormalIndices) 
     
    328326                            ++index_itr) 
    329327                        { 
    330                             normals->push_back(model.normals[*index_itr]); 
     328                            normals->push_back(transformNormal(model.normals[*index_itr])); 
    331329                        } 
    332330                    } 
  • OpenSceneGraph/trunk/src/osgPlugins/obj/obj.cpp

    r3324 r3325  
    463463     
    464464} 
     465 
     466osg::Vec3 Model::averageNormal(const Element& element) const 
     467{ 
     468    osg::Vec3 normal; 
     469    for(Element::IndexList::const_iterator itr=element.normalIndices.begin(); 
     470        itr!=element.normalIndices.end(); 
     471        ++itr) 
     472    { 
     473        normal += normals[*itr]; 
     474    } 
     475    normal.normalize(); 
     476     
     477    return normal; 
     478} 
     479 
     480osg::Vec3 Model::computeNormal(const Element& element) const 
     481{ 
     482    osg::Vec3 normal; 
     483    for(unsigned int i=0;i<element.vertexIndices.size()-2;++i) 
     484    { 
     485        osg::Vec3 a = vertices[element.vertexIndices[i]]; 
     486        osg::Vec3 b = vertices[element.vertexIndices[i+1]]; 
     487        osg::Vec3 c = vertices[element.vertexIndices[i+2]]; 
     488        osg::Vec3 localNormal = (b-a)   ^(c-b); 
     489        normal += localNormal; 
     490    } 
     491    normal.normalize(); 
     492     
     493    return normal; 
     494} 
     495 
     496bool Model::needReverse(const Element& element) const 
     497{ 
     498    if (element.normalIndices.empty()) return true; 
     499     
     500    return computeNormal(element)*averageNormal(element) < 0.0f; 
     501} 
  • OpenSceneGraph/trunk/src/osgPlugins/obj/obj.h

    r3323 r3325  
    160160    void addElement(Element* element); 
    161161     
     162    osg::Vec3 averageNormal(const Element& element) const; 
     163    osg::Vec3 computeNormal(const Element& element) const; 
     164    bool needReverse(const Element& element) const; 
     165     
    162166    int remapVertexIndex(int vi) { return (vi<0) ? vertices.size()+vi : vi-1; } 
    163167    int remapNormalIndex(int vi) { return (vi<0) ? normals.size()+vi : vi-1; }