Changeset 8286
- Timestamp:
- 05/08/08 15:56:28
- Files:
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
OpenSceneGraph/trunk/src/osgPlugins/OpenFlight/FltExportVisitor.cpp
r8018 r8286 357 357 ScopedStatePushPop drawableGuard( this, geom->getStateSet() ); 358 358 359 // Write vertex array data out to vertex palette manager 360 if (!isAllMesh( *geom )) 359 // Push and pop subfaces if polygon offset is on. 360 SubfaceHelper subface( *this, getCurrentStateSet() ); 361 362 if (atLeastOneFace( *geom )) 363 { 361 364 // If at least one record will be a Face record, then we 362 // need to write to the vertex p ool.365 // need to write to the vertex palette. 363 366 _vertexPalette->add( *geom ); 364 367 365 unsigned int jdx; 366 for (jdx=0; jdx < geom->getNumPrimitiveSets(); jdx++) 367 { 368 osg::PrimitiveSet* prim = geom->getPrimitiveSet( jdx ); 369 if (prim->getType() == osg::PrimitiveSet::DrawArraysPrimitiveType) 370 handleDrawArrays( dynamic_cast<osg::DrawArrays*>( prim ), *geom, node ); 371 else if (prim->getType() == osg::PrimitiveSet::DrawArrayLengthsPrimitiveType) 372 handleDrawArrayLengths( dynamic_cast<osg::DrawArrayLengths*>( prim ), *geom, node ); 373 else if ( (prim->getType() == osg::PrimitiveSet::DrawElementsUBytePrimitiveType) || 374 (prim->getType() == osg::PrimitiveSet::DrawElementsUShortPrimitiveType) || 375 (prim->getType() == osg::PrimitiveSet::DrawElementsUIntPrimitiveType) ) 376 handleDrawElements( dynamic_cast<osg::DrawElements*>( prim ), *geom, node ); 377 else 368 // Iterate over all PrimitiveSets and output Face records. 369 unsigned int jdx; 370 for (jdx=0; jdx < geom->getNumPrimitiveSets(); jdx++) 378 371 { 379 std::string warning( "fltexp: Unknown PrimitiveSet type." ); 380 osg::notify( osg::WARN ) << warning << std::endl; 381 _fltOpt->getWriteResult().warn( warning ); 382 return; 372 osg::PrimitiveSet* prim = geom->getPrimitiveSet( jdx ); 373 if ( isMesh( prim->getMode() ) ) 374 continue; 375 376 if (prim->getType() == osg::PrimitiveSet::DrawArraysPrimitiveType) 377 handleDrawArrays( dynamic_cast<osg::DrawArrays*>( prim ), *geom, node ); 378 else if (prim->getType() == osg::PrimitiveSet::DrawArrayLengthsPrimitiveType) 379 handleDrawArrayLengths( dynamic_cast<osg::DrawArrayLengths*>( prim ), *geom, node ); 380 else if ( (prim->getType() == osg::PrimitiveSet::DrawElementsUBytePrimitiveType) || 381 (prim->getType() == osg::PrimitiveSet::DrawElementsUShortPrimitiveType) || 382 (prim->getType() == osg::PrimitiveSet::DrawElementsUIntPrimitiveType) ) 383 handleDrawElements( dynamic_cast<osg::DrawElements*>( prim ), *geom, node ); 384 else 385 { 386 std::string warning( "fltexp: Unknown PrimitiveSet type." ); 387 osg::notify( osg::WARN ) << warning << std::endl; 388 _fltOpt->getWriteResult().warn( warning ); 389 return; 390 } 383 391 } 392 } 393 394 if (atLeastOneMesh( *geom )) 395 { 396 // If at least one Mesh record, write out preamble mesh records 397 // followed by a Mesh Primitive record per PrimitiveSet. 398 writeMesh( node, *geom ); 399 400 writeMatrix( node.getUserData() ); 401 writeComment( node ); 402 writeMultitexture( *geom ); 403 writeLocalVertexPool( *geom ); 404 405 writePush(); 406 407 unsigned int jdx; 408 for (jdx=0; jdx < geom->getNumPrimitiveSets(); jdx++) 409 { 410 osg::PrimitiveSet* prim = geom->getPrimitiveSet( jdx ); 411 if ( !isMesh( prim->getMode() ) ) 412 continue; 413 414 if (prim->getType() == osg::PrimitiveSet::DrawArraysPrimitiveType) 415 handleDrawArrays( dynamic_cast<osg::DrawArrays*>( prim ), *geom, node ); 416 else if (prim->getType() == osg::PrimitiveSet::DrawArrayLengthsPrimitiveType) 417 handleDrawArrayLengths( dynamic_cast<osg::DrawArrayLengths*>( prim ), *geom, node ); 418 else if ( (prim->getType() == osg::PrimitiveSet::DrawElementsUBytePrimitiveType) || 419 (prim->getType() == osg::PrimitiveSet::DrawElementsUShortPrimitiveType) || 420 (prim->getType() == osg::PrimitiveSet::DrawElementsUIntPrimitiveType) ) 421 handleDrawElements( dynamic_cast<osg::DrawElements*>( prim ), *geom, node ); 422 else 423 { 424 std::string warning( "fltexp: Unknown PrimitiveSet type." ); 425 osg::notify( osg::WARN ) << warning << std::endl; 426 _fltOpt->getWriteResult().warn( warning ); 427 return; 428 } 429 } 430 431 writePop(); 384 432 } 385 433 } OpenSceneGraph/trunk/src/osgPlugins/OpenFlight/FltExportVisitor.h
r8003 r8286 125 125 // Geometry records 126 126 void writeFace( const osg::Geode& geode, const osg::Geometry& geom, GLenum mode ); 127 void writeMesh( const osg::Geode& geode, const osg::Geometry& geom , GLenum mode);127 void writeMesh( const osg::Geode& geode, const osg::Geometry& geom ); 128 128 int writeVertexList( int first, unsigned int count ); 129 129 int writeVertexList( const std::vector<unsigned int>& indices, unsigned int count ); 130 130 void writeMeshPrimitive( const std::vector<unsigned int>& indices, GLenum mode ); 131 void writeLocalVertexPool( const osg::Geometry& geom , GLenum mode);131 void writeLocalVertexPool( const osg::Geometry& geom ); 132 132 void writeMultitexture( const osg::Geometry& geom ); 133 133 void writeUVList( int numVerts, const osg::Geometry& geom ); … … 159 159 bool isLit( const osg::Geometry& geom ) const; 160 160 bool isTextured( int unit, const osg::Geometry& geom ) const; 161 bool isAllMesh( const osg::Geometry& geom ) const; 161 bool isMesh( const GLenum mode ) const; 162 bool atLeastOneFace( const osg::Geometry& geom ) const; 163 bool atLeastOneMesh( const osg::Geometry& geom ) const; 162 164 163 165 osg::ref_ptr< ExportOptions > _fltOpt; OpenSceneGraph/trunk/src/osgPlugins/OpenFlight/expGeometryRecords.cpp
r8086 r8286 68 68 69 69 bool 70 FltExportVisitor::isAllMesh( const osg::Geometry& geom ) const 71 { 72 // Return true if all primitive types will use Mesh records for output. 70 FltExportVisitor::isMesh( const GLenum mode ) const 71 { 72 return( (mode == GL_TRIANGLE_STRIP) || 73 (mode == GL_TRIANGLE_FAN) || 74 (mode == GL_QUAD_STRIP) ); 75 } 76 77 bool 78 FltExportVisitor::atLeastOneFace( const osg::Geometry& geom ) const 79 { 80 // Return true if at least one PrimitiveSet mode will use a Face record. 73 81 unsigned int jdx; 74 82 for (jdx=0; jdx < geom.getNumPrimitiveSets(); jdx++) 75 83 { 76 84 const osg::PrimitiveSet* prim = geom.getPrimitiveSet( jdx ); 77 if( (prim->getMode() != GL_TRIANGLE_STRIP) && 78 (prim->getMode() != GL_TRIANGLE_FAN) && 79 (prim->getMode() != GL_QUAD_STRIP) ) 80 return false; 81 } 82 return true; 85 if( !isMesh( prim->getMode() ) ) 86 return true; 87 } 88 // All PrimitiveSet modes will use Mesh records. 89 return false; 90 } 91 bool 92 FltExportVisitor::atLeastOneMesh( const osg::Geometry& geom ) const 93 { 94 // Return true if at least one PrimitiveSet mode will use a Mesh record. 95 unsigned int jdx; 96 for (jdx=0; jdx < geom.getNumPrimitiveSets(); jdx++) 97 { 98 const osg::PrimitiveSet* prim = geom.getPrimitiveSet( jdx ); 99 if( isMesh( prim->getMode() ) ) 100 return true; 101 } 102 // All PrimitiveSet modes will use Face records. 103 return false; 83 104 } 84 105 … … 283 304 284 305 void 285 FltExportVisitor::writeMesh( const osg::Geode& geode, const osg::Geometry& geom , GLenum mode)306 FltExportVisitor::writeMesh( const osg::Geode& geode, const osg::Geometry& geom ) 286 307 { 287 308 enum DrawMode … … 355 376 osg::StateSet const* ss = getCurrentStateSet(); 356 377 357 switch( mode )358 {359 case GL_POINTS:360 {361 std::string warning( "fltexp: GL_POINTS not supported in FLT export." );362 osg::notify( osg::WARN ) << warning << std::endl;363 _fltOpt->getWriteResult().warn( warning );364 return;365 break;366 }367 case GL_LINES:368 case GL_LINE_STRIP:369 case GL_LINE_LOOP:370 case GL_TRIANGLES:371 case GL_QUADS:372 {373 std::string warning( "fltexp: Wrong mode in Mesh record." );374 osg::notify( osg::WARN ) << warning << std::endl;375 _fltOpt->getWriteResult().warn( warning );376 return;377 break;378 }379 case GL_TRIANGLE_STRIP:380 case GL_TRIANGLE_FAN:381 case GL_QUAD_STRIP:382 case GL_POLYGON:383 378 { 384 379 // Default to no facet culling … … 395 390 // Note: OpenFlt can't handle FRONT or FRONT_AND_BACK settings, so ignore these(??) 396 391 } 397 break;398 }399 392 } 400 393 … … 545 538 546 539 void 547 FltExportVisitor::writeLocalVertexPool( const osg::Geometry& geom , GLenum mode)540 FltExportVisitor::writeLocalVertexPool( const osg::Geometry& geom ) 548 541 { 549 542 // Attribute Mask … … 837 830 break; 838 831 case GL_POINTS: 832 n = 1; 833 break; 834 case GL_LINES: 835 n = 2; 836 break; 837 case GL_TRIANGLES: 838 n = 3; 839 break; 840 case GL_QUADS: 841 n = 4; 842 break; 839 843 case GL_LINE_STRIP: 840 844 case GL_LINE_LOOP: … … 843 847 n = count; 844 848 break; 845 case GL_LINES: 846 n = 2; 847 break; 848 case GL_TRIANGLES: 849 n = 3; 850 break; 851 case GL_QUADS: 852 n = 4; 853 break; 854 } 855 856 // Push and pop subfaces if polygon offset is on. 857 SubfaceHelper subface( *this, getCurrentStateSet() ); 849 } 858 850 859 851 if (useMesh) 860 852 { 861 writeMesh( geode, geom, mode );862 863 writeMatrix( geode.getUserData() );864 writeComment( geode );865 writeMultitexture( geom );866 writeLocalVertexPool( geom, mode );867 868 writePush();869 870 853 std::vector< unsigned int > indices; 871 854 int jdx; … … 873 856 indices.push_back( first+jdx ); 874 857 writeMeshPrimitive( indices, mode ); 875 876 writePop();877 858 } 878 859 else … … 881 862 while ((unsigned int)( first+n ) <= max) 882 863 { 883 // Need:884 // * Geode for record name (but also need to handle885 // multi Geometry objects and multi PrimitiveSet objects;886 // all Face records can't have the same name).887 // * Mode888 864 writeFace( geode, geom, mode ); 889 865 … … 920 896 break; 921 897 case GL_POINTS: 898 n = 1; 899 break; 900 case GL_LINES: 901 n = 2; 902 break; 903 case GL_TRIANGLES: 904 n = 3; 905 break; 906 case GL_QUADS: 907 n = 4; 908 break; 922 909 case GL_LINE_STRIP: 923 910 case GL_LINE_LOOP: … … 925 912 default: 926 913 break; 927 case GL_LINES:928 n = 2;929 break;930 case GL_TRIANGLES:931 n = 3;932 break;933 case GL_QUADS:934 n = 4;935 break;936 914 } 937 915 … … 941 919 if (useMesh) 942 920 { 943 writeMesh( geode, geom, mode );944 945 writeMatrix( geode.getUserData() );946 writeComment( geode );947 writeMultitexture( geom );948 writeLocalVertexPool( geom, mode );949 950 writePush();951 952 921 int idx( 0 ); 953 922 for( osg::DrawArrayLengths::const_iterator itr=dal->begin(); … … 960 929 writeMeshPrimitive( indices, mode ); 961 930 } 962 963 writePop();964 931 } 965 932 else … … 1017 984 break; 1018 985 case GL_POINTS: 986 n = 1; 987 break; 988 case GL_LINES: 989 n = 2; 990 break; 991 case GL_TRIANGLES: 992 n = 3; 993 break; 994 case GL_QUADS: 995 n = 4; 996 break; 1019 997 case GL_LINE_STRIP: 1020 998 case GL_LINE_LOOP: … … 1023 1001 n = de->getNumIndices(); 1024 1002 break; 1025 case GL_LINES:1026 n = 2;1027 break;1028 case GL_TRIANGLES:1029 n = 3;1030 break;1031 case GL_QUADS:1032 n = 4;1033 break;1034 1003 } 1035 1004 … … 1039 1008 if (useMesh) 1040 1009 { 1041 writeMesh( geode, geom, mode );1042 1043 writeMatrix( geode.getUserData() );1044 writeComment( geode );1045 writeMultitexture( geom );1046 writeLocalVertexPool( geom, mode );1047 1048 writePush();1049 1050 1010 std::vector< unsigned int > indices; 1051 1011 int idx; … … 1053 1013 indices.push_back( de->index( idx ) ); 1054 1014 writeMeshPrimitive( indices, mode ); 1055 1056 writePop();1057 1015 } 1058 1016 else
