Hi Bawenang,
*
*
I don't see a problem with that, the skydome class was only really created
to dress up the example code.

Regards,

Kim.



On 1 December 2011 11:46, Bawenang Rukmoko <[email protected]> wrote:

> Hi,
>
> First of all, I would like to ask a permission to use and modify the
> SkyDome used in the oceanExample and make it into a separate library. I
> know that it is not really a part of osgOcean library, but I reckon that
> the devs should be the same. So I asked the question here.
>
> Like the title above, I wanted to change the SkyDome and make it to use a
> repeating Texture2D instead of the TextureCubeMap. I need the SkyDome to
> display the starfield repeatedly, while also making the texture stretching
> be as natural as possible (ie. not overstretched like the current SkyDome).
> It still didn't work because it showed the color array of the SphereSegment
> geometry. The SphereSegment class is the same as the one in oceanExample.
> However, I've reworked the SkyDome class. This is my SkyDome class.
>
>
>
>
> Thank you!
>
> Cheers,
> Bawenang
>
>
> Code:
>
> SkyDome.h
>
>    class OSGATMOSPHERE_EXPORT SkyDome : public SphereSegment
>    {
>        public:
>            /**
>             * Sky Dome Parameters struct
>             *
>             */
>            struct SkyDomeParams
>            {
>                float           radius;
>                unsigned int    longSteps;
>                unsigned int    latSteps;
>                std::string     starfieldTexName;
>
>                ///Ctor
>                SkyDomeParams()
> //                    : radius(10000)
>                    : radius(1900)
>                    , longSteps(4)
>                    , latSteps(4)
>                    , starfieldTexName("")
>                {
>
>                }
>
>                ///Ctor with params
>                SkyDomeParams(float r, unsigned int longitudeStep, unsigned
> int latitudeStep, const std::string& texName)
> //                    : radius(10000)
>                    : radius(r)
>                    , longSteps(longitudeStep)
>                    , latSteps(latitudeStep)
>                    , starfieldTexName(texName)
>                {
>
>                }
>
>                ///Copy Ctor
>                SkyDomeParams(const SkyDomeParams& copy)
>                {
>                    this->radius = copy.radius;
>                    this->longSteps = copy.longSteps;
>                    this->latSteps = copy.latSteps;
>                    this->starfieldTexName = copy.starfieldTexName;
>                }
>
>                ///Assignment Op
>                SkyDomeParams& operator = (const SkyDomeParams& copy)
>                {
>                    this->radius = copy.radius;
>                    this->longSteps = copy.longSteps;
>                    this->latSteps = copy.latSteps;
>                    this->starfieldTexName = copy.starfieldTexName;
>
>                    return *this;
>                }
>
>                ///Dtor
>                ~SkyDomeParams()
>                {
>                }
>
>            };
>
>                SkyDome( void );
>                SkyDome( const SkyDome& copy, const osg::CopyOp&
> copyop=osg::CopyOp::SHALLOW_COPY );
>                SkyDome( float radius, unsigned int longSteps, unsigned int
> latSteps, const std::string& starfieldTexName );
>                SkyDome( const SkyDomeParams& skyDomeParams );
>
>        protected:
>                ~SkyDome(void);
>
>        public:
>                void setupStateSet( );
>                void create( float radius, unsigned int latSteps, unsigned
> int longSteps, const std::string& starfieldTexName );
>                void create( const SkyDomeParams& skyDomeParams );
>
>                //++ BAWE-20111128: SKYDOME
>                /**
>                 *
>                 */
>                inline void setStarField( const std::string&
> starfieldTexName )
>                {
>                if (!mStarfieldTexture.valid())
>                {
>                    mStarfieldTexture = new osg::Texture2D;
>                    _setTextureParams( );
>                }
>                _createTexture( starfieldTexName );
>                }
>
>                void showPolyLine(bool isShowLine);
>                //-- BAWE-20111128: SKYDOME
>
>        private:
>                osg::ref_ptr<osg::Program> _createShader(void);
>                void _setTextureParams( );
>                void _createTexture( const std::string& starfieldTexName );
>                void _createFromParams();
>
>                SkyDomeParams                   mSkyDomeParams;
>                bool                            mIsShowPolyLine;
>                osg::ref_ptr<osg::Texture2D>    mStarfieldTexture;
>
>    };
>
>
>
>
>
> Code:
>
> SkyDome.cpp
>
> SkyDome::SkyDome( void )
>        : mIsShowPolyLine (false)
>        , mSkyDomeParams ()
> {
>
> }
>
> SkyDome::SkyDome( const SkyDome& copy, const osg::CopyOp& copyop ):
>    SphereSegment( copy, copyop )
> {
>
> }
>
> SkyDome::SkyDome( float radius, unsigned int longSteps, unsigned int
> latSteps, const std::string& starfieldTexName )
>        : mIsShowPolyLine (false)
>        , mSkyDomeParams ()
> {
>    create( radius, longSteps, latSteps,starfieldTexName );
>    setupStateSet();
>    showPolyLine(false);
> }
>
> SkyDome::SkyDome( const SkyDomeParams& skyDomeParams )
>        : mIsShowPolyLine (false)
>        , mSkyDomeParams ()
> {
>    create( skyDomeParams );
>    setupStateSet();
>    showPolyLine(false);
> }
>
> SkyDome::~SkyDome(void)
> {
> }
>
> void SkyDome::create( float radius, unsigned int longSteps, unsigned int
> latSteps, const std::string& starfieldTexName )
> {
>    //compute( radius, longSteps, latSteps, 90.f, 180.f, 0.f, 360.f );
>    mSkyDomeParams.radius = radius;
>    mSkyDomeParams.latSteps = latSteps;
>    mSkyDomeParams.longSteps = longSteps;
>    mSkyDomeParams.starfieldTexName = starfieldTexName;
>    _createFromParams();
> }
>
> void SkyDome::create( const SkyDomeParams& skyDomeParams )
> {
>    //compute( radius, longSteps, latSteps, 90.f, 180.f, 0.f, 360.f );
>    mSkyDomeParams = skyDomeParams;
>    _createFromParams();
> }
>
> void SkyDome::_createFromParams( )
> {
>    //compute( radius, longSteps, latSteps, 90.f, 180.f, 0.f, 360.f );
>    compute( mSkyDomeParams.radius, mSkyDomeParams.longSteps,
> mSkyDomeParams.latSteps, 0.f, 180.f, 0.f, 360.f );
>    setStarField(mSkyDomeParams.starfieldTexName);
> }
>
>
>
> void SkyDome::setupStateSet( )
> {
>    osg::StateSet* ss = new osg::StateSet;
>
>    ss->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
>    ss->setAttributeAndModes( _createShader().get(),
> osg::StateAttribute::ON );
>    ss->addUniform( new osg::Uniform("uEnvironmentMap", 0) );
>    ss->setTextureMode(0,GL_TEXTURE_1D,osg::StateAttribute::OFF);
>    ss->setTextureMode(0,GL_TEXTURE_2D,osg::StateAttribute::ON);
>    ss->setTextureMode(0,GL_TEXTURE_3D,osg::StateAttribute::OFF);
>
>    setStateSet(ss);
> }
>
> osg::ref_ptr<osg::Program> SkyDome::_createShader(void)
> {
>    osg::ref_ptr<osg::Program> program = new osg::Program;
>
>    // Do not use shaders if they were globally disabled.
>    if (ShaderManager::instance().areShadersEnabled())
>    {
>        char vertexSource[]=
>            "varying vec2 vTexCoord;\n"
>            "\n"
>            "void main(void)\n"
>            "{\n"
>            "    gl_TexCoord[0] = gl_MultiTexCoord0;\n"
>            "    vTexCoord = gl_Vertex.xy;\n"
>            "}\n";
>
>        char fragmentSource[]=
>            "uniform sampler2D uEnvironmentMap;\n"
>            "varying vec2 vTexCoord;\n"
>            "\n"
>            "void main(void)\n"
>            "{\n"
>            "   gl_FragData[0] = texture2D( uEnvironmentMap,
> gl_TexCoord[0].st );\n"
>            //"   gl_FragData[0].a = 0.0;\n"
>            "   gl_FragData[0].a = 1.0;\n"
>            "   gl_FragData[1] = vec4(0.0);\n"
>            "}\n";
>
>        program->setName( "sky_dome_shader" );
>        program->addShader(new osg::Shader(osg::Shader::VERTEX,
> vertexSource));
>        program->addShader(new osg::Shader(osg::Shader::FRAGMENT,
> fragmentSource));
>    }
>
>    return program;
> }
>
> void SkyDome::_setTextureParams( )
> {
>    mStarfieldTexture->setInternalFormat(GL_RGBA);
>
>    mStarfieldTexture->setFilter( osg::Texture::MIN_FILTER,
>  osg::Texture::NEAREST_MIPMAP_NEAREST);
>    mStarfieldTexture->setFilter( osg::Texture::MAG_FILTER,
>  osg::Texture::NEAREST);
>    mStarfieldTexture->setWrap  ( osg::Texture::WRAP_S,
>  osg::Texture::REPEAT);
>    mStarfieldTexture->setWrap  ( osg::Texture::WRAP_T,
>  osg::Texture::REPEAT);
> //    mStarfieldTexture->setWrap  ( osg::Texture::WRAP_T,
>  osg::Texture::CLAMP_TO_EDGE);
> //    mStarfieldTexture->setWrap  ( osg::Texture::WRAP_S,
>  osg::Texture::CLAMP_TO_EDGE);
>
> }
>
> void SkyDome::_createTexture( const std::string& starfieldTexName )
> {
>    mStarfieldTexture->setImage( osgDB::readImageFile( starfieldTexName ) );
>
>    getOrCreateStateSet()->setTextureAttributeAndModes( 0,
> mStarfieldTexture.get(), osg::StateAttribute::ON );
>
> }
>
> void SkyDome::showPolyLine(bool isShowLine)
> {
>    //
> --------------------------------------------------------------------------------
>    //   Grab the state set of the node, this  will a StateSet if one does
> not exist
>    //
> --------------------------------------------------------------------------------
>    osg::StateSet *state = getOrCreateStateSet();
>
>    //
> ----------------------------------------------------------------------------------------------
>    //   We need to retrieve the Polygon mode of the  state set, and create
> one if does not have one
>    //
> ----------------------------------------------------------------------------------------------
>    osg::PolygonMode *polyModeObj;
>
>    polyModeObj = dynamic_cast< osg::PolygonMode* >
>        ( state->getAttribute( osg::StateAttribute::POLYGONMODE ));
>
>    if ( !polyModeObj ) {
>
>        polyModeObj = new osg::PolygonMode;
>
>        state->setAttribute( polyModeObj );
>    }
>
>    // --------------------------------------------
>    //  Now we can set the state to WIREFRAME
>    // --------------------------------------------
>
>    if (isShowLine)
>        polyModeObj->setMode(  osg::PolygonMode::FRONT_AND_BACK,
> osg::PolygonMode::LINE );
>    else
>        polyModeObj->setMode(  osg::PolygonMode::FRONT_AND_BACK,
> osg::PolygonMode::FILL );
>
>    mIsShowPolyLine = isShowLine;
>  }
>
>
>
>
> So what went wrong here? Is it because of the texture mapping with the
> texcoord array in SphereSegment? Thanks in advance.
>
> ------------------------
> &quot;There's no place like 127.0.0.1&quot;
>
> ------------------
> Read this topic online here:
> http://forum.openscenegraph.org/viewtopic.php?p=44155#44155
>
>
>
>
>
> _______________________________________________
> osg-users mailing list
> [email protected]
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to