Hi,
   I've met a very strange problem when I tried to set mipmaps in a osg::Image 
object.
   If I use the sample code in osgParticle/PrecipitationEffect.cpp, I can get 
correct mipmap texture, however, if I try to read texture data from files to 
set mipmap texture, it didn't work. I'll be mad, somebody met this problem 
before? help~~~~~~
 
p.s.
   sample code(texturemipmaps.cpp) : change from 
osgParticle/PrecipitationEffect.cpp and work well
   my code(Mymipmap.cpp):  could not work appropriately, with no texture on 
that plane......

 
#include <osg/MatrixTransform>
#include <osg/PositionAttitudeTransform>
#include <osg/Texture2D>
#include <osg/Geometry>
#include <osg/Geode>
#include <osgDB/Registry>
#include <osgDB/ReadFile>
#include <osgViewer/Viewer>

osg::ref_ptr<osg::Geometry> createPlane( float length, float width )
{
        osg::ref_ptr<osg::Vec3Array> vec = new osg::Vec3Array;
        vec->resize( 8 );
        (*vec)[0] = osg::Vec3f(  -2, 0, -2 );
        (*vec)[1] = osg::Vec3f( -2, 0, 2 );
        (*vec)[2] = osg::Vec3f( 2, 0, 2 );
        (*vec)[3] = osg::Vec3f( 2, 0, -2 );

        osg::ref_ptr<osg::Vec3Array> nor = new osg::Vec3Array;
        nor->push_back( osg::Vec3f( 0.0, -1.0, 0.0 ) );

        osg::ref_ptr<osg::Vec2Array> tex = new osg::Vec2Array;
        tex->push_back( osg::Vec2f(0.0, 0.0) );
        tex->push_back( osg::Vec2f(0.0, 1.0) );
        tex->push_back( osg::Vec2f(1.0, 1.0) );
        tex->push_back( osg::Vec2f(1.0, 0.0) );

        osg::ref_ptr<osg::Geometry> geo = new osg::Geometry;
        geo->setVertexArray( vec.get() );
        geo->setTexCoordArray( 0, tex.get() );
        geo->setNormalArray( nor.get() );
        geo->setNormalBinding( osg::Geometry::BIND_PER_PRIMITIVE_SET );
        geo->addPrimitiveSet( new osg::DrawArrays( osg::PrimitiveSet::QUADS, 0, 
4 ) );

        return geo;
}

static void fillSpotLightImage(unsigned char* ptr, const osg::Vec4& 
centerColour, const osg::Vec4& backgroudColour, unsigned int size, float power)
{
        if (size==1)
        {
                float r = 0.5f;
                osg::Vec4 color = centerColour*r+backgroudColour*(1.0f-r);
                *ptr++ = (unsigned char)((color[0])*255.0f);
                *ptr++ = (unsigned char)((color[1])*255.0f);
                *ptr++ = (unsigned char)((color[2])*255.0f);
                *ptr++ = (unsigned char)((color[3])*255.0f);
                return;
        }

        float mid = (float(size)-1.0f)*0.5f;
        float div = 2.0f/float(size);
        for(unsigned int r=0;r<size;++r)
        {
                //unsigned char* ptr = image->data(0,r,0);
                for(unsigned int c=0;c<size;++c)
                {
                        float dx = (float(c) - mid)*div;
                        float dy = (float(r) - mid)*div;
                        float r = powf(1.0f-sqrtf(dx*dx+dy*dy),power);
                        if (r<0.0f) r=0.0f;
                        osg::Vec4 color = 
centerColour*r+backgroudColour*(1.0f-r);
                        *ptr++ = (unsigned char)((color[0])*255.0f);
                        *ptr++ = (unsigned char)((color[1])*255.0f);
                        *ptr++ = (unsigned char)((color[2])*255.0f);
                        *ptr++ = (unsigned char)((color[3])*255.0f);
                }
        }
}

int main(int, char **)
{
        osgViewer::Viewer viewer;
        osg::ref_ptr<osg::Group> root = new osg::Group;
        osg::ref_ptr<osg::PositionAttitudeTransform> mypat1 = new 
osg::PositionAttitudeTransform;
        osg::ref_ptr<osg::PositionAttitudeTransform> mypat2 = new 
osg::PositionAttitudeTransform;
        osg::ref_ptr<osg::Geode> mygeode1 = new osg::Geode;
        osg::ref_ptr<osg::Geode> mygeode2 = new osg::Geode;
        
        osg::StateSet* mystate0 = root->getOrCreateStateSet();
        osg::StateSet* mystate1 = mypat1->getOrCreateStateSet();

        osg::Image* image = new osg::Image;
        osg::Image::MipmapDataType mipmapData;
        unsigned int s = 32;
        unsigned int totalSize = 0;
        unsigned i;
        for(i=0; s>0; s>>=1, ++i)
        {
                if (i>0) mipmapData.push_back(totalSize);
                totalSize += s*s*4;
        }

        unsigned char* ptr = new unsigned char[totalSize];
        image->setImage(32, 32, 32, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, ptr, 
osg::Image::USE_NEW_DELETE,1);

        image->setMipmapLevels(mipmapData);

        s = 32;
        for(i=0; s>0; s>>=1, ++i)
        {
                fillSpotLightImage(ptr, osg::Vec4(1.0f,1.0f,1.0f,1.0f), 
osg::Vec4(1.0f,0.1f*s,1.0f/s,1.0f), s, 1.0);
                ptr += s*s*4;
        }

        osg::Texture2D* mytex1 = new osg::Texture2D;
        mytex1->setImage( 0, image );
        mytex1->setWrap(osg::Texture::WRAP_S, osg::Texture::REPEAT);
        mytex1->setWrap(osg::Texture::WRAP_T, osg::Texture::REPEAT);
        mytex1->setFilter(osg::Texture::MIN_FILTER, 
osg::Texture::NEAREST_MIPMAP_NEAREST);
        mytex1->setFilter(osg::Texture::MAG_FILTER, osg::Texture::NEAREST);
        mystate0->setTextureAttributeAndModes( 0, mytex1, 
osg::StateAttribute::ON );

        mygeode1->addDrawable( createPlane(5, 5).get() );
        //mygeode2->addDrawable( createPlane(5, 5).get() );
        mypat1->setPosition( osg::Vec3(-10.0, 0.0, 0.0) );
        mypat1->addChild( mygeode1.get() );
        mypat2->addChild( mygeode2.get() );
        root->addChild( mypat1.get() );
        root->addChild( mypat2.get() );

        viewer.setSceneData( root.get() );
        return viewer.run();
}
#include "stdafx.h"

#include <osg/MatrixTransform>
#include <osg/PositionAttitudeTransform>
#include <osg/Texture>
#include <osg/Texture2D>
#include <osg/Geometry>
#include <osg/Geode>
#include <osgDB/Registry>
#include <osgDB/ReadFile>
#include <osgDB/WriteFile>
#include <osg/Image>
#include <osgViewer/Viewer>

osg::ref_ptr<osg::Geometry> createPlane( float length, float width )
{
        osg::ref_ptr<osg::Vec3Array> vec = new osg::Vec3Array;
        vec->resize( 4 );
        (*vec)[0] = osg::Vec3f(  -2, 0, -2 );
        (*vec)[1] = osg::Vec3f( -2, 0, 2 );
        (*vec)[2] = osg::Vec3f( 2, 0, 2 );
        (*vec)[3] = osg::Vec3f( 2, 0, -2 );

        osg::ref_ptr<osg::Vec3Array> nor = new osg::Vec3Array;
        nor->push_back( osg::Vec3f( 0.0, -1.0, 0.0 ) );

        osg::ref_ptr<osg::Vec2Array> tex = new osg::Vec2Array;
        tex->push_back( osg::Vec2f(0.0, 0.0) );
        tex->push_back( osg::Vec2f(0.0, 1.0) );
        tex->push_back( osg::Vec2f(1.0, 1.0) );
        tex->push_back( osg::Vec2f(1.0, 0.0) );

        osg::ref_ptr<osg::Geometry> geo = new osg::Geometry;
        geo->setVertexArray( vec.get() );
        geo->setTexCoordArray( 0, tex.get() );
        geo->setNormalArray( nor.get() );
        geo->setNormalBinding( osg::Geometry::BIND_PER_PRIMITIVE_SET );
        geo->addPrimitiveSet( new osg::DrawArrays( osg::PrimitiveSet::QUADS, 0, 
4 ) );

        return geo;
}



int main(int, char **)
{
        osgViewer::Viewer viewer;
        osg::ref_ptr<osg::Geode> mygeode = new osg::Geode;
        osg::StateSet* mystate0 = mygeode->getOrCreateStateSet();

        osg::ref_ptr<osg::Image> img = osgDB::readImageFile("osg32.rgb");
        osg::ref_ptr<osg::Image> img1 = osgDB::readImageFile("osg16.rgb");

        osg::ref_ptr<osg::Image> image = new osg::Image;
        osg::Image::MipmapDataType mipmapData;
        mipmapData.push_back(img->getTotalSizeInBytes());
        
//mipmapData.push_back(img->getTotalSizeInBytes()+img1->getTotalSizeInBytes());

        unsigned char* ptr = new unsigned 
char[img->getTotalSizeInBytes()+img1->getTotalSizeInBytes()];

        image->setImage(img->s(), img->t(), img->r(), 
                img->getInternalTextureFormat(), img->getPixelFormat(), 
img->getDataType(),
                ptr, osg::Image::USE_NEW_DELETE,img->getPacking());

        image->setMipmapLevels(mipmapData);

        memcpy(ptr, img->data(), img->getTotalSizeInBytes());
        memcpy(ptr+img->getTotalSizeInBytes(), img1->data(), 
img1->getTotalSizeInBytes());

        
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
        osg::ref_ptr<osg::Texture2D> mytex = new osg::Texture2D;
        mytex->setImage( 0, image.get() );
        mytex->setUseHardwareMipMapGeneration(false);
        mystate0->setTextureAttributeAndModes( 0, mytex.get(), 
osg::StateAttribute::ON );
        mygeode->addDrawable( createPlane(64, 64).get() );

        viewer.setSceneData( mygeode.get() );
        return viewer.run();
}



_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to