70 lines
2.2 KiB
C++
70 lines
2.2 KiB
C++
#include "scene/SkyDome.h"
|
|
|
|
//#include <osgOcean/ShaderManager>
|
|
|
|
SkyDome::SkyDome(void) {
|
|
|
|
}
|
|
|
|
SkyDome::SkyDome(const SkyDome& copy, const osg::CopyOp& copyop) :
|
|
SphereSegment(copy, copyop) {
|
|
|
|
}
|
|
|
|
SkyDome::SkyDome(float radius, unsigned int longSteps, unsigned int latSteps, osg::TextureCubeMap* cubemap) {
|
|
Compute(radius, longSteps, latSteps, 90.f, 180.f, 0.f, 360.f);
|
|
SetupStateSet(cubemap);
|
|
}
|
|
|
|
SkyDome::~SkyDome(void) {}
|
|
|
|
void SkyDome::Create(float radius, unsigned int latSteps, unsigned int longSteps, osg::TextureCubeMap* cubemap) {
|
|
Compute(radius, longSteps, latSteps, 90.f, 180.f, 0.f, 360.f);
|
|
SetupStateSet(cubemap);
|
|
}
|
|
|
|
void SkyDome::SetupStateSet(osg::TextureCubeMap* cubemap) {
|
|
osg::StateSet* ss = new osg::StateSet;
|
|
|
|
ss->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
|
|
ss->setTextureAttributeAndModes(0, cubemap, osg::StateAttribute::ON);
|
|
ss->setAttributeAndModes(createShader().get(), osg::StateAttribute::ON);
|
|
ss->addUniform(new osg::Uniform("uEnvironmentMap", 0));
|
|
|
|
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 (osgOcean::ShaderManager::instance().areShadersEnabled()) {
|
|
char vertexSource[] =
|
|
"varying vec3 vTexCoord;\n"
|
|
"\n"
|
|
"void main(void)\n"
|
|
"{\n"
|
|
" gl_Position = ftransform();\n"
|
|
" vTexCoord = gl_Vertex.xyz;\n"
|
|
"}\n";
|
|
|
|
char fragmentSource[] =
|
|
"uniform samplerCube uEnvironmentMap;\n"
|
|
"varying vec3 vTexCoord;\n"
|
|
"\n"
|
|
"void main(void)\n"
|
|
"{\n"
|
|
" vec3 texcoord = vec3(vTexCoord.x, vTexCoord.y, -vTexCoord.z);\n"
|
|
" gl_FragData[0] = textureCube( uEnvironmentMap, texcoord.xzy );\n"
|
|
" gl_FragData[0].a = 0.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;
|
|
}
|