| | 465 | |
| | 466 | osg::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 | |
| | 480 | osg::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 | |
| | 496 | bool Model::needReverse(const Element& element) const |
| | 497 | { |
| | 498 | if (element.normalIndices.empty()) return true; |
| | 499 | |
| | 500 | return computeNormal(element)*averageNormal(element) < 0.0f; |
| | 501 | } |