⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 expgeometryrecords.cpp

📁 最新osg包
💻 CPP
📖 第 1 页 / 共 3 页
字号:
    if (geom.getColorBinding() == osg::Geometry::BIND_PER_VERTEX)    {        if (isLit( geom ))            lightMode = VERTEX_COLOR_LIGHTING;        else            lightMode = VERTEX_COLOR;    }    else    {        const osg::Vec4Array* c = dynamic_cast<const osg::Vec4Array*>( geom.getColorArray() );        if (c && (c->size() > 0))        {            packedColorRaw = (*c)[0];            transparency = flt::uint16((1. - packedColorRaw[3]) * (double)0xffff);        }        if (isLit( geom ))            lightMode = FACE_COLOR_LIGHTING;        else            lightMode = FACE_COLOR;    }    uint32 packedColor;    packedColor = (int)(packedColorRaw[3]*255) << 24 |        (int)(packedColorRaw[2]*255) << 16 | (int)(packedColorRaw[1]*255) << 8 |        (int)(packedColorRaw[0]*255);    int8 drawType;    osg::StateSet const* ss = getCurrentStateSet();    {        // Default to no facet culling        drawType = SOLID_NO_BACKFACE;        // If facet-culling isn't *dis*abled, check whether the CullFace mode is BACK        if (ss->getMode(GL_CULL_FACE) & osg::StateAttribute::ON)        {            osg::CullFace const* cullFace = static_cast<osg::CullFace const*>(                ss->getAttribute(osg::StateAttribute::CULLFACE) );            if( cullFace->getMode() == osg::CullFace::BACK )                drawType = SOLID_BACKFACE;            // Note: OpenFlt can't handle FRONT or FRONT_AND_BACK settings, so ignore these(??)        }    }    // Determine the material properties for the face    int16 materialIndex( -1 );    if (isLit( geom ))    {        osg::Material const* currMaterial = static_cast<osg::Material const*>(            ss->getAttribute(osg::StateAttribute::MATERIAL) );        materialIndex = _materialPalette->add(currMaterial);    }    // Get base texture    int16 textureIndex( -1 );    if (isTextured( 0, geom ))    {        const osg::Texture2D* texture = static_cast<const osg::Texture2D*>(            ss->getTextureAttribute( 0, osg::StateAttribute::TEXTURE )  );        if (texture != NULL)            textureIndex = _texturePalette->add( 0, texture );        else        {            std::string warning( "fltexp: Mesh is textured, but Texture2D StateAttribute is NULL." );            osg::notify( osg::WARN ) << warning << std::endl;            _fltOpt->getWriteResult().warn( warning );        }    }    // Set the appropriate template mode based    // on blending or Billboarding.    TemplateMode templateMode( FIXED_NO_ALPHA_BLENDING );    const osg::Billboard* bb = dynamic_cast< const osg::Billboard* >( &geode );    if (bb != NULL)    {        if( bb->getMode() == osg::Billboard::AXIAL_ROT )            templateMode = AXIAL_ROTATE_WITH_ALPHA_BLENDING;        else            templateMode = POINT_ROTATE_WITH_ALPHA_BLENDING;    }    else if ( ss->getMode( GL_BLEND ) & osg::StateAttribute::ON )    {        const osg::BlendFunc* bf = static_cast<const osg::BlendFunc*>(            ss->getAttribute(osg::StateAttribute::BLENDFUNC) );        if( (bf->getSource() == osg::BlendFunc::SRC_ALPHA) &&            (bf->getDestination() == osg::BlendFunc::ONE_MINUS_SRC_ALPHA) )            templateMode = FIXED_ALPHA_BLENDING;    }    uint16 length( 84 );    IdHelper id( *this, geode.getName() );    _records->writeInt16( (int16) MESH_OP );    _records->writeUInt16( length );    _records->writeID( id );    _records->writeInt32( 0 ); // Reserved    _records->writeInt32( 0 ); // IR color code    _records->writeInt16( 0 ); // Relative priority    _records->writeInt8( drawType ); // Draw type    _records->writeInt8( 0 ); // Texture white    _records->writeInt16( -1 ); // Color name index    _records->writeInt16( -1 ); // Alternate color name index    _records->writeInt8( 0 ); // Reserved    _records->writeInt8( templateMode ); // Template (billboard)    _records->writeInt16( -1 ); // Detail texture pattern index    _records->writeInt16( textureIndex ); // Texture pattern index    _records->writeInt16( materialIndex ); // Material index    _records->writeInt16( 0 ); // Surface material code    _records->writeInt16( 0 ); // Feature ID    _records->writeInt32( 0 ); // IR material code    _records->writeUInt16( transparency ); // Transparency    _records->writeInt8( 0 ); // LOD generation control    _records->writeInt8( 0 ); // Line style index    _records->writeUInt32( flags ); // Flags    _records->writeInt8( lightMode ); // Light mode    _records->writeFill( 7 ); // Reserved    _records->writeUInt32( packedColor ); // Packed color, primary    _records->writeUInt32( 0x00ffffff ); // Packed color, alternate    _records->writeInt16( -1 ); // Texture mapping index    _records->writeInt16( 0 ); // Reserved    _records->writeInt32( -1 ); // Primary color index    _records->writeInt32( -1 ); // Alternate color index    // Next four bytes:    //   15.8: two 2-byte "reserved" fields    //   15.9: one 4-byte "reserved" field    _records->writeInt16( 0 ); // Reserved    _records->writeInt16( -1 ); // Shader index}intFltExportVisitor::writeVertexList( int first, unsigned int count ){    _records->writeInt16( (int16) VERTEX_LIST_OP );    _records->writeUInt16( 4 + (count*4) );    unsigned int idx;    for( idx=0; idx<count; idx++)        // I'm imagining that 'first' will be a 0-based index into the         //   'current' set of vertices held by the vertex palette manager.        _records->writeInt32( _vertexPalette->byteOffset( first+idx ) );    return count;}intFltExportVisitor::writeVertexList( const std::vector<unsigned int>& indices, unsigned int count ){    _records->writeInt16( (int16) VERTEX_LIST_OP );    _records->writeUInt16( 4 + (count*4) );    unsigned int idx;    for( idx=0; idx<count; idx++)        // I'm imagining that 'first' will be a 0-based index into the         //   'current' set of vertices held by the vertex palette manager.        _records->writeInt32( _vertexPalette->byteOffset( indices[ idx ] ) );    return count;}voidFltExportVisitor::writeMeshPrimitive( const std::vector<unsigned int>& indices, GLenum mode ){    int16 primType;    switch( mode )    {    case GL_TRIANGLE_STRIP:        primType = 1;        break;    case GL_TRIANGLE_FAN:        primType = 2;        break;    case GL_QUAD_STRIP:        primType = 3;        break;    default:        // Warning should already be recorded. Do nothing.        return;        break;    }    uint16 length( 12 + (4 * indices.size()) );    _records->writeInt16( (int16) MESH_PRIMITIVE_OP );    _records->writeUInt16( length );    _records->writeInt16( primType ); // primitive type    _records->writeInt16( 4 ); // index size, 4 bytes    _records->writeInt32( indices.size() ); // vertex count    std::vector<unsigned int>::const_iterator it = indices.begin();    while (it != indices.end())    {        _records->writeUInt32( (*it) );        it++;    }}voidFltExportVisitor::writeLocalVertexPool( const osg::Geometry& geom ){    // Attribute Mask    static const unsigned int HAS_POSITION      = 0x80000000u >> 0;    static const unsigned int HAS_COLOR_INDEX   = 0x80000000u >> 1;    static const unsigned int HAS_RGBA_COLOR    = 0x80000000u >> 2;    static const unsigned int HAS_NORMAL        = 0x80000000u >> 3;    static const unsigned int HAS_BASE_UV       = 0x80000000u >> 4;    static const unsigned int HAS_UV_LAYER1     = 0x80000000u >> 5;    static const unsigned int HAS_UV_LAYER2     = 0x80000000u >> 6;    static const unsigned int HAS_UV_LAYER3     = 0x80000000u >> 7;    static const unsigned int HAS_UV_LAYER4     = 0x80000000u >> 8;    static const unsigned int HAS_UV_LAYER5     = 0x80000000u >> 9;    static const unsigned int HAS_UV_LAYER6     = 0x80000000u >> 10;    static const unsigned int HAS_UV_LAYER7     = 0x80000000u >> 11;    const osg::Array* v = geom.getVertexArray();    uint32 numVerts( v->getNumElements() );    osg::ref_ptr< const osg::Vec3dArray > v3 = VertexPaletteManager::asVec3dArray( v, numVerts );    if (!v3)    {        std::string warning( "fltexp: writeLocalVertexPool: VertexArray is not Vec3Array." );        osg::notify( osg::WARN ) << warning << std::endl;        _fltOpt->getWriteResult().warn( warning );        return;    }    // Compute attribute bits and vertex size.    const osg::Array* c = geom.getColorArray();    const osg::Array* n = geom.getNormalArray();    const osg::Array* t = geom.getTexCoordArray( 0 );    osg::ref_ptr< const osg::Vec4Array > c4 = VertexPaletteManager::asVec4Array( c, numVerts );    osg::ref_ptr< const osg::Vec3Array > n3 = VertexPaletteManager::asVec3Array( n, numVerts );    osg::ref_ptr< const osg::Vec2Array > t2 = VertexPaletteManager::asVec2Array( t, numVerts );    if (c && !c4)        return;    if (n && !n3)        return;    if (t && !t2)        return;    std::vector< osg::ref_ptr< const osg::Vec2Array > > mtc;    mtc.resize( 8 );    int unit=1;    for( ;unit<8; unit++)        mtc[ unit ] = VertexPaletteManager::asVec2Array( geom.getTexCoordArray( unit ), numVerts );    uint32 attr( HAS_POSITION );    unsigned int vertSize( sizeof( float64 ) * 3 );    if ( ( c4 != NULL ) && ( geom.getColorBinding() == osg::Geometry::BIND_PER_VERTEX) )    {        attr |= HAS_RGBA_COLOR;        vertSize += sizeof( unsigned int );    }    if ( ( n3 != NULL ) && ( geom.getNormalBinding() == osg::Geometry::BIND_PER_VERTEX) )    {        attr |= HAS_NORMAL;        vertSize += ( sizeof( float32 ) * 3 );    }    if ( t2 != NULL )    {        attr |= HAS_BASE_UV;        vertSize += ( sizeof( float32 ) * 2 );    }    // Add multitex    if (isTextured( 1, geom ))    {        attr |= HAS_UV_LAYER1;        vertSize += ( sizeof( float32 ) * 2 );    }    if (isTextured( 2, geom ))    {        attr |= HAS_UV_LAYER2;        vertSize += ( sizeof( float32 ) * 2 );    }    if (isTextured( 3, geom ))    {        attr |= HAS_UV_LAYER3;        vertSize += ( sizeof( float32 ) * 2 );    }    if (isTextured( 4, geom ))    {        attr |= HAS_UV_LAYER4;        vertSize += ( sizeof( float32 ) * 2 );    }    if (isTextured( 5, geom ))    {        attr |= HAS_UV_LAYER5;        vertSize += ( sizeof( float32 ) * 2 );    }    if (isTextured( 6, geom ))    {        attr |= HAS_UV_LAYER6;        vertSize += ( sizeof( float32 ) * 2 );    }    if (isTextured( 7, geom ))    {        attr |= HAS_UV_LAYER7;        vertSize += ( sizeof( float32 ) * 2 );    }    unsigned int maxVerts = (0xffff - 12) / vertSize;    unsigned int thisVertCount = (maxVerts > numVerts) ? numVerts : maxVerts;    unsigned int currentIndexLimit = maxVerts;    uint16 length( 12 + (vertSize * thisVertCount) );    _records->writeInt16( (int16) LOCAL_VERTEX_POOL_OP );    _records->writeUInt16( length );    _records->writeUInt32( numVerts ); // number of vertices    _records->writeUInt32( attr ); // attribute bits    unsigned int idx;    for( idx=0; idx<numVerts; idx++ )    {        _records->writeVec3d( (*v3)[ idx ] );        if (attr & HAS_RGBA_COLOR)        {            osg::Vec4 color = (*c4)[ idx ];            unsigned int packedColor = (int)(color[3]*255) << 24 |                (int)(color[2]*255) << 16 | (int)(color[1]*255) << 8 |                (int)(color[0]*255);            _records->writeUInt32( packedColor );        }        if (attr & HAS_NORMAL)            _records->writeVec3f( (*n3)[ idx ] );        if (attr & HAS_BASE_UV)            _records->writeVec2f( (*t2)[ idx ] );        if (attr & HAS_UV_LAYER1)            _records->writeVec2f( (*mtc[1])[ idx ] );        if (attr & HAS_UV_LAYER2)            _records->writeVec2f( (*mtc[2])[ idx ] );        if (attr & HAS_UV_LAYER3)            _records->writeVec2f( (*mtc[3])[ idx ] );        if (attr & HAS_UV_LAYER4)            _records->writeVec2f( (*mtc[4])[ idx ] );        if (attr & HAS_UV_LAYER5)            _records->writeVec2f( (*mtc[5])[ idx ] );        if (attr & HAS_UV_LAYER6)            _records->writeVec2f( (*mtc[6])[ idx ] );        if (attr & HAS_UV_LAYER7)            _records->writeVec2f( (*mtc[7])[ idx ] );        // Handle continuation record if necessary.        if ( (idx+1 == currentIndexLimit) && (idx+1 < numVerts) )        {            currentIndexLimit += maxVerts;            unsigned int remaining( numVerts - (idx+1) );            thisVertCount = (maxVerts > remaining) ? remaining : maxVerts;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -