void ShaderShadowMapEngine::updateShadowTexBuffers(SSMEngineData *data) { TextureObjChunk *bufTex = data->getShadowTexChunk(); if(data->getMFShadowTexBuffers()->empty() == true) { TextureBufferUnrecPtr newBuf = TextureBuffer::createLocal(); newBuf->setTexture (bufTex ); newBuf->setTexTarget(GL_TEXTURE_2D); data->editMFShadowTexBuffers()->push_back(newBuf); } }
void ShaderShadowMapEngine::updatePointLightShadowTexBuffers( SSMEngineData *data) { TextureObjChunk *bufTex = data->getShadowTexChunk(); if(data->getMFShadowTexBuffers()->empty() == true) { for(UInt16 i = 0; i < 6; ++i) { TextureBufferUnrecPtr newBuf = TextureBuffer::createLocal(); newBuf->setTexture (bufTex ); newBuf->setTexTarget(_cubeFaceTargets[i]); data->editMFShadowTexBuffers()->push_back(newBuf); } } }
CubeMapGeneratorStageDataTransitPtr CubeMapGenerator::setupStageData( RenderActionBase *pAction) { CubeMapGeneratorStageDataTransitPtr returnValue = CubeMapGeneratorStageData::createLocal(); if(returnValue == NULL) return returnValue; FrameBufferObjectUnrecPtr pCubeTarget = NULL; RenderBufferUnrecPtr pDepthBuffer = NULL; if(this->getRenderTarget() == NULL) { pCubeTarget = FrameBufferObject::createLocal(); pDepthBuffer = RenderBuffer ::createLocal(); pDepthBuffer->setInternalFormat (GL_DEPTH_COMPONENT24); pCubeTarget ->setDepthAttachment(pDepthBuffer ); returnValue ->setRenderTarget (pCubeTarget ); } else { pCubeTarget = this->getRenderTarget(); } TextureObjChunkUnrecPtr pCubeTex = NULL; if(0x0000 != (_sfSetupMode.getValue() & SetupTexture)) { pCubeTex = TextureObjChunk::createLocal(); ImageUnrecPtr pImg = Image::createLocal(); pImg->set(Image::OSG_RGB_PF, getWidth (), getHeight(), 1, 1, 1, 0.0, 0, Image::OSG_UINT8_IMAGEDATA, false, 6); pCubeTex ->setImage (pImg ); pCubeTex ->setMinFilter (GL_LINEAR ); pCubeTex ->setMagFilter (GL_LINEAR ); pCubeTex ->setWrapS (GL_CLAMP_TO_EDGE ); pCubeTex ->setWrapT (GL_CLAMP_TO_EDGE ); pCubeTex ->setWrapR (GL_CLAMP_TO_EDGE ); pCubeTex ->setInternalFormat(getTextureFormat()); } else { pCubeTex = _sfTexture.getValue(); } TextureEnvChunkUnrecPtr pCubeTexEnv = NULL; if(0x0000 != (_sfSetupMode.getValue() & SetupTexEnv)) { pCubeTexEnv = TextureEnvChunk::createLocal(); pCubeTexEnv->setEnvMode (GL_REPLACE ); } TexGenChunkUnrecPtr pCubeTexGen = NULL; TextureTransformChunkUnrecPtr pCubeTexTrans = NULL; if(0x0000 != (_sfSetupMode.getValue() & SetupTexGen)) { pCubeTexGen = TexGenChunk::createLocal(); pCubeTexGen->setGenFuncS(GL_REFLECTION_MAP); pCubeTexGen->setGenFuncT(GL_REFLECTION_MAP); pCubeTexGen->setGenFuncR(GL_REFLECTION_MAP); pCubeTexTrans = TextureTransformChunk::createLocal(); pCubeTexTrans->setUseCameraBeacon(true); } static GLenum targets[6] = { GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB, GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB, GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB, GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB, GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB }; for(UInt32 i = 0; i < 6; ++i) { TextureBufferUnrecPtr pCubeTexBuffer = TextureBuffer::createLocal(); pCubeTexBuffer->setTexture (pCubeTex ); pCubeTexBuffer->setTexTarget(targets[i]); pCubeTarget->setColorAttachment(pCubeTexBuffer, i); } pCubeTarget->setSize(getWidth (), getHeight()); if(0x0000 != (_sfSetupMode.getValue() & OverrideTex)) { returnValue->addChunk(pCubeTex, getTexUnit()); } if(0x0000 != (_sfSetupMode.getValue() & SetupTexEnv)) { returnValue->addChunk(pCubeTexEnv, getTexUnit()); } if(0x0000 != (_sfSetupMode.getValue() & SetupTexGen)) { returnValue->addChunk(pCubeTexGen, getTexUnit()); returnValue->addChunk(pCubeTexTrans, getTexUnit()); returnValue->setTexTransform(pCubeTexTrans); } if(this->getCamera() == NULL) { PerspectiveCameraUnrecPtr pCam = PerspectiveCamera::createLocal(); pCam->setNear(pAction->getCamera()->getNear()); pCam->setFar (pAction->getCamera()->getFar ()); pCam->setFov (osgDegree2Rad(90.f)); returnValue->setCamera(pCam); } return returnValue; }