#include <osg/TexEnv>
#include <osg/TexEnvCombine>
#include <osg/Texture2D>
-#include <osg/TextureCubeMap>
#include <osg/TexMat>
#include <osg/Fog>
static osg::ref_ptr<osg::StateSet> layer_states[SGCloudLayer::SG_MAX_CLOUD_COVERAGES];
static osg::ref_ptr<osg::StateSet> layer_states2[SGCloudLayer::SG_MAX_CLOUD_COVERAGES];
-static osg::ref_ptr<osg::TextureCubeMap> cubeMap;
static bool state_initialized = false;
const std::string SGCloudLayer::SG_CLOUD_OVERCAST_STRING = "overcast";
stateSet->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
stateSet->setAttributeAndModes(attribFactory->getStandardAlphaFunc());
stateSet->setAttributeAndModes(attribFactory->getStandardBlendFunc());
-
-// osg::Material* material = new osg::Material;
-// material->setColorMode(osg::Material::AMBIENT_AND_DIFFUSE);
-// material->setEmission(osg::Material::FRONT_AND_BACK,
-// osg::Vec4(0.05, 0.05, 0.05, 0));
-// material->setSpecular(osg::Material::FRONT_AND_BACK,
-// osg::Vec4(0, 0, 0, 1));
-// stateSet->setAttribute(material);
-
stateSet->setMode(GL_FOG, osg::StateAttribute::OFF);
- // OSGFIXME: invented by me ...
-// stateSet->setMode(GL_DEPTH_TEST, osg::StateAttribute::OFF);
-// stateSet->setMode(GL_LIGHTING, osg::StateAttribute::ON);
-
-// stateSet->setMode(GL_LIGHT0, osg::StateAttribute::OFF);
-
- // If the normal texture is given prepare a bumpmapping enabled state
-// if (normalTexture) {
-// SGPath normalPath(path);
-// normalPath.append(normalTexture);
-// stateSet->setTextureAttribute(2, SGLoadTexture2D(normalPath));
-// stateSet->setTextureMode(2, GL_TEXTURE_2D, osg::StateAttribute::ON);
-// }
-
return stateSet;
}
SG_LOG(SG_ASTRO, SG_INFO, "initializing cloud layers");
- // This bump mapping code was inspired by the tutorial available at
- // http://www.paulsprojects.net/tutorials/simplebump/simplebump.html
- // and a NVidia white paper
- // http://developer.nvidia.com/object/bumpmappingwithregistercombiners.html
- // The normal map textures were generated by the normal map Gimp plugin :
- // http://nifelheim.dyndns.org/~cocidius/normalmap/
- //
- cubeMap = new osg::TextureCubeMap;
- cubeMap->setFilter(osg::Texture::MIN_FILTER, osg::Texture::LINEAR);
- cubeMap->setFilter(osg::Texture::MAG_FILTER, osg::Texture::LINEAR);
- cubeMap->setWrap(osg::Texture::WRAP_S, osg::Texture::CLAMP_TO_EDGE);
- cubeMap->setWrap(osg::Texture::WRAP_T, osg::Texture::CLAMP_TO_EDGE);
- cubeMap->setWrap(osg::Texture::WRAP_R, osg::Texture::CLAMP_TO_EDGE);
-
- const int size = 32;
- const float half_size = 16.0f;
- const float offset = 0.5f;
- osg::Vec3 zero_normal(0.5, 0.5, 0.5);
-
- osg::Image* image = new osg::Image;
- image->allocateImage(size, size, 1, GL_RGB, GL_UNSIGNED_BYTE);
- unsigned char *ptr = image->data(0, 0);
- for (int j = 0; j < size; j++ ) {
- for (int i = 0; i < size; i++ ) {
- osg::Vec3 tmp(half_size, -( j + offset - half_size ),
- -( i + offset - half_size ) );
- tmp.normalize();
- tmp = tmp*0.5 - zero_normal;
-
- *ptr++ = (unsigned char)( tmp[ 0 ] * 255 );
- *ptr++ = (unsigned char)( tmp[ 1 ] * 255 );
- *ptr++ = (unsigned char)( tmp[ 2 ] * 255 );
- }
- }
- cubeMap->setImage(osg::TextureCubeMap::POSITIVE_X, image);
-
- image = new osg::Image;
- image->allocateImage(size, size, 1, GL_RGB, GL_UNSIGNED_BYTE);
- ptr = image->data(0, 0);
- for (int j = 0; j < size; j++ ) {
- for (int i = 0; i < size; i++ ) {
- osg::Vec3 tmp(-half_size, -( j + offset - half_size ),
- ( i + offset - half_size ) );
- tmp.normalize();
- tmp = tmp*0.5 - zero_normal;
-
- *ptr++ = (unsigned char)( tmp[ 0 ] * 255 );
- *ptr++ = (unsigned char)( tmp[ 1 ] * 255 );
- *ptr++ = (unsigned char)( tmp[ 2 ] * 255 );
- }
- }
- cubeMap->setImage(osg::TextureCubeMap::NEGATIVE_X, image);
-
- image = new osg::Image;
- image->allocateImage(size, size, 1, GL_RGB, GL_UNSIGNED_BYTE);
- ptr = image->data(0, 0);
- for (int j = 0; j < size; j++ ) {
- for (int i = 0; i < size; i++ ) {
- osg::Vec3 tmp(( i + offset - half_size ), half_size,
- ( j + offset - half_size ) );
- tmp.normalize();
- tmp = tmp*0.5 - zero_normal;
-
- *ptr++ = (unsigned char)( tmp[ 0 ] * 255 );
- *ptr++ = (unsigned char)( tmp[ 1 ] * 255 );
- *ptr++ = (unsigned char)( tmp[ 2 ] * 255 );
- }
- }
- cubeMap->setImage(osg::TextureCubeMap::POSITIVE_Y, image);
-
- image = new osg::Image;
- image->allocateImage(size, size, 1, GL_RGB, GL_UNSIGNED_BYTE);
- ptr = image->data(0, 0);
- for (int j = 0; j < size; j++ ) {
- for (int i = 0; i < size; i++ ) {
- osg::Vec3 tmp(( i + offset - half_size ), -half_size,
- -( j + offset - half_size ) );
- tmp.normalize();
- tmp = tmp*0.5 - zero_normal;
-
- *ptr++ = (unsigned char)( tmp[ 0 ] * 255 );
- *ptr++ = (unsigned char)( tmp[ 1 ] * 255 );
- *ptr++ = (unsigned char)( tmp[ 2 ] * 255 );
- }
- }
- cubeMap->setImage(osg::TextureCubeMap::NEGATIVE_Y, image);
-
- image = new osg::Image;
- image->allocateImage(size, size, 1, GL_RGB, GL_UNSIGNED_BYTE);
- ptr = image->data(0, 0);
- for (int j = 0; j < size; j++ ) {
- for (int i = 0; i < size; i++ ) {
- osg::Vec3 tmp(( i + offset - half_size ),
- -( j + offset - half_size ), half_size );
- tmp.normalize();
- tmp = tmp*0.5 - zero_normal;
-
- *ptr++ = (unsigned char)( tmp[ 0 ] * 255 );
- *ptr++ = (unsigned char)( tmp[ 1 ] * 255 );
- *ptr++ = (unsigned char)( tmp[ 2 ] * 255 );
- }
- }
- cubeMap->setImage(osg::TextureCubeMap::POSITIVE_Z, image);
-
- image = new osg::Image;
- image->allocateImage(size, size, 1, GL_RGB, GL_UNSIGNED_BYTE);
- ptr = image->data(0, 0);
- for (int j = 0; j < size; j++ ) {
- for (int i = 0; i < size; i++ ) {
- osg::Vec3 tmp(-( i + offset - half_size ),
- -( j + offset - half_size ), -half_size );
- tmp.normalize();
- tmp = tmp*0.5 - zero_normal;
- *ptr++ = (unsigned char)( tmp[ 0 ] * 255 );
- *ptr++ = (unsigned char)( tmp[ 1 ] * 255 );
- *ptr++ = (unsigned char)( tmp[ 2 ] * 255 );
- }
- }
- cubeMap->setImage(osg::TextureCubeMap::NEGATIVE_Z, image);
-
osg::StateSet* state;
state = SGMakeState(texture_path, "overcast.png", "overcast_n.png");
layer_states[SG_CLOUD_OVERCAST] = state;