Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma once
- #include "include/irrlicht.h"
- #include "optimize.h"
- #include "IQuadSceneNode.h"
- #include <Cg/cg.h>
- #include "includeCg/IrrCg.h"
- #include "beautyInComponent.h"
- #include "beautyInShader.h"
- #include "beautyInDeffered.h"
- #include "PSSMUtils.h"
- namespace beautyInRender
- {
- class IModulateLightCallback : public IrrCg::ICgShaderConstantSetCallBack
- {
- public:
- ITexture *SMapTexture[4];
- CPSSMUtils *PSSMUtils;
- IModulateLightCallback(CPSSMUtils *pssm) : IrrCg::ICgShaderConstantSetCallBack()
- {
- PSSMUtils=pssm;
- }
- virtual void OnSetConstants( IrrCg::ICgServices* Services,CGprogram Vertex,CGprogram Fragment,const irr::video::SMaterial& Material )
- {
- irr::core::matrix4 Matrix = Services->getDevice()->getVideoDriver()->getTransform(irr::video::ETS_PROJECTION);
- Matrix *= Services->getDevice()->getVideoDriver()->getTransform(irr::video::ETS_VIEW);
- Matrix = Services->getDevice()->getVideoDriver()->getTransform(irr::video::ETS_WORLD);
- Services->setMatrix(cgGetNamedParameter(Vertex, "WorldViewProj"), IrrCg::ICGT_MATRIX_IDENTITY, Matrix);
- matrix4 iMatrix = Services->getDevice()->getVideoDriver()->getTransform(irr::video::ETS_PROJECTION);
- iMatrix *= Services->getDevice()->getVideoDriver()->getTransform(irr::video::ETS_VIEW);
- iMatrix.makeInverse();
- //iMatrix=iMatrix.getTransposed();
- Services->setMatrix(cgGetNamedParameter(Fragment, "InvertViewProjection"), IrrCg::ICGT_MATRIX_IDENTITY, iMatrix);
- Services->EnableTexture(cgGetNamedParameter(Fragment,"ColorTex"),Material.getTexture(0));
- Services->EnableTexture(cgGetNamedParameter(Fragment,"NormalDepthTex"),Material.getTexture(1));
- Services->setParameter1i(cgGetNamedParameter(Fragment,"ScreenWidth"),Services->getDevice()->getVideoDriver()->getScreenSize().Width);
- Services->setParameter1i(cgGetNamedParameter(Fragment,"ScreenHeight"),Services->getDevice()->getVideoDriver()->getScreenSize().Height);
- Services->setParameter1i(cgGetNamedParameter(Fragment, "NumSplits"), PSSMUtils->getSplitsCount());
- float TextureOffset = 0.5f;
- matrix4 mTextureMatrixConst;
- mTextureMatrixConst[0] = 0.5f;
- mTextureMatrixConst[1] = 0.0f;
- mTextureMatrixConst[2] = 0.0f;
- mTextureMatrixConst[3] = 0.0f;
- mTextureMatrixConst[4] = 0.0f;
- mTextureMatrixConst[5] = -0.5f;
- if(PSSMUtils->getVideoDriver()->getDriverType() == EDT_OPENGL)
- mTextureMatrixConst[5] *= -1.0f;
- mTextureMatrixConst[6] = 0.0f;
- mTextureMatrixConst[7] = 0.0f;
- mTextureMatrixConst[8] = 0.0f;
- mTextureMatrixConst[9] = 0.0f;
- mTextureMatrixConst[10] = 1.0f;
- mTextureMatrixConst[11] = 0.0f;
- mTextureMatrixConst[12] = TextureOffset;
- mTextureMatrixConst[13] = TextureOffset;
- mTextureMatrixConst[14] = 0.0f;
- mTextureMatrixConst[15] = 1.0f;
- for(int i = 0; i < PSSMUtils->getSplitsCount(); i++)
- {
- TextureOffset = 0.5f;
- if(PSSMUtils->getVideoDriver()->getDriverType() == EDT_OPENGL)
- TextureOffset -= (0.5f / (float)SMapTexture[i]->getSize().Width);
- else
- TextureOffset += (0.5f / (float)SMapTexture[i]->getSize().Width);
- mTextureMatrixConst[12] = TextureOffset;
- mTextureMatrixConst[13] = TextureOffset;
- Matrix = mTextureMatrixConst;
- Matrix *= PSSMUtils->getProjectionMatrix(i);
- Matrix *= PSSMUtils->getViewMatrix(i);
- Services->setMatrix(cgGetArrayParameter(cgGetNamedParameter(Fragment, "TextureMatrix"), i),ICGT_MATRIX_IDENTITY,Matrix );
- }
- for(int i = 0; i < PSSMUtils->getSplitsCount(); i++)
- {
- Services->setParameter1f(cgGetArrayParameter(cgGetNamedParameter(Fragment, "SplitDistance"), i), PSSMUtils->getSplitDistance(i+1));
- }
- for(int i = 0; i < PSSMUtils->getSplitsCount(); i++)
- {
- Services->EnableTexture(cgGetArrayParameter(cgGetNamedParameter(Fragment, "DepthMap"), i),SMapTexture[i]);
- }
- }
- };
- class beautyInShadow : public beautyInComponent
- {
- protected:
- beautyInDeffered *deffered;
- irr::IrrlichtDevice *device;
- irr::scene::ISceneManager *smgr;
- irr::video::IVideoDriver *driver;
- CPSSMUtils *Utils;
- IModulateLightCallback *PSSMCallback;
- irr::scene::IQuadSceneNode *Quad;
- irr::scene::ICameraSceneNode *Camera;
- irr::scene::ISceneNode *SunCore;
- irr::video::SColor ShadowColor;
- void registerShaders()
- {
- global->ShaderLibrary->registerShader(new shader::CShaderSource("CG/Depth.cg","CG/Depth.cg","PSSMDepth",new CDepthCallBack(Utils)));
- global->ShaderLibrary->registerShader(new shader::CShaderSource("CG/DepthT.cg","CG/DepthT.cg","PSSMTransparentDepth",new CDepthCallBackTrans(Utils)));
- PSSMCallback=new IModulateLightCallback(Utils);
- for(unsigned int i=0;i<SplitRTT.size();i++)
- {
- if(i==4)
- break;
- PSSMCallback->SMapTexture[i]=SplitRTT[i];
- }
- global->ShaderLibrary->registerShader(new shader::CShaderSource("CG/Light.cg","CG/ModulateLight.cg","PSSMModulateLight",PSSMCallback,true,irr::video::EMT_TRANSPARENT_ADD_COLOR));
- //global->ShaderLibrary->registerShader(new shader::CShaderSource("CG/PSSM.cg","CG/PSSM.cg","PSSM",PSSMCallback));
- }
- void createShaders()
- {
- global->MaterialLibrary->registerMaterial(global->ShaderLibrary->getShader("PSSMModulateLight"));
- global->MaterialLibrary->registerMaterial(global->ShaderLibrary->getShader("PSSMDepth"));
- global->MaterialLibrary->registerMaterial(global->ShaderLibrary->getShader("PSSMTransparentDepth"));
- //global->MaterialLibrary->registerMaterial(global->ShaderLibrary->getShader("PSSM"));
- }
- public:
- irr::core::array<irr::video::ITexture*> SplitRTT;
- virtual void OnPreRender(irr::core::array<irr::scene::ISceneNode*> &lightList)
- {
- }
- virtual void OnPostRender()
- {
- ICameraSceneNode *ActiveCam=smgr->getActiveCamera();
- Utils->CalculateSplitDistances(smgr->getActiveCamera());
- setLightPosition(ActiveCam->getAbsolutePosition());
- Camera->setTarget(ActiveCam->getAbsolutePosition());
- irr::core::array<irr::core::array<u32>> NodeMaterial;
- irr::core::array<irr::scene::ISceneNode*> NodesGet;
- irr::core::array<irr::scene::ISceneNode*> Nodes;
- smgr->getSceneNodesFromType(ESNT_ANY,NodesGet);
- for(int i=0;i<NodesGet.size();i++)
- {
- if(NodesGet[i]->getType()==ESNT_CAMERA)
- continue;
- if(NodesGet[i]->getAttributes())
- {
- if(NodesGet[i]->getAttributes()->existsAttribute("ReceiveShadow") || NodesGet[i]->getAttributes()->existsAttribute("CastShadow"))
- {
- if(NodesGet[i]->getAttributes()->getAttributeAsBool("ReceiveShadow") || NodesGet[i]->getAttributes()->getAttributeAsBool("CastShadow"))
- {
- Nodes.push_back(NodesGet[i]);
- core::array<u32> MatArray;
- for(unsigned int m=0;m<NodesGet[i]->getMaterialCount();m++)
- {
- NodesGet[i]->getMaterial(m).setFlag(EMF_LIGHTING,false);
- MatArray.push_back(NodesGet[i]->getMaterial(m).MaterialType);
- NodesGet[i]->getMaterial(m).MaterialType=global->MaterialLibrary->getMaterial("PSSMTransparentDepth");
- }
- NodeMaterial.push_back(MatArray);
- }
- }
- }
- }
- for(int CSplit=0;CSplit<Utils->getSplitsCount();CSplit++)
- {
- driver->setRenderTarget(SplitRTT[CSplit],true, true,SColor(0xffffffff));
- Utils->CalculateFrustumCorners(ActiveCam,CSplit,1.1f);
- Utils->CalculateLightForFrustum(CSplit);
- Camera->OnRegisterSceneNode();
- Camera->render();
- for(unsigned int i=0;i<Nodes.size();i++)
- {
- if(irr::video::isAABBinFrustum(Nodes[i]->getBoundingBox(),Camera->getViewFrustum()) && Nodes[i]->getAttributes()->getAttributeAsBool("CastShadow"))
- {
- Nodes[i]->OnRegisterSceneNode();
- Nodes[i]->render();
- }
- }
- }
- /*driver->setRenderTarget(ShadowRTT,true,true,SColor(0xffffffff));
- ActiveCam->OnRegisterSceneNode();
- ActiveCam->OnAnimate(global->device->getTimer()->getTime());
- ActiveCam->render();
- for(unsigned int i=0;i<Nodes.size();i++)
- {
- if(!Nodes[i]->getAttributes()->getAttributeAsBool("ReceiveShadow"))
- continue;
- for(unsigned int m=0;m<Nodes[i]->getMaterialCount();m++)
- {
- Nodes[i]->getMaterial(m).MaterialType=global->MaterialLibrary->getMaterial("PSSM");
- }
- Nodes[i]->OnRegisterSceneNode();
- Nodes[i]->render();
- }*/
- for(unsigned int i=0;i<Nodes.size();i++)
- {
- for(unsigned int m=0;m<Nodes[i]->getMaterialCount();m++)
- {
- Nodes[i]->getMaterial(m).MaterialType=(E_MATERIAL_TYPE)NodeMaterial[i][m];
- }
- }
- driver->setRenderTarget(IOTarget.Out);
- Quad->setMaterialTexture(0,IOTarget.In);
- Quad->setMaterialTexture(1,deffered->getNormalDepthMap());
- Quad->setMaterialType(global->MaterialLibrary->getMaterial("PSSMModulateLight"));
- ActiveCam->OnRegisterSceneNode();
- ActiveCam->OnAnimate(global->device->getTimer()->getTime());
- ActiveCam->render();
- Quad->render();
- }
- virtual void OnRenderPassPreRender(irr::scene::E_SCENE_NODE_RENDER_PASS renderPass)
- {
- }
- virtual void OnRenderPassPostRender(irr::scene::E_SCENE_NODE_RENDER_PASS renderPass)
- {
- }
- virtual void OnNodePreRender(irr::scene::ISceneNode *node)
- {
- }
- virtual void OnNodePostRender(irr::scene::ISceneNode *node)
- {
- }
- virtual void init()
- {
- smgr=global->device->getSceneManager();
- driver=global->device->getVideoDriver();
- IOTarget.Out=0;
- }
- ISceneNode *getSunCore()
- {
- return SunCore;
- }
- void setLightPosition(vector3df pos)
- {
- SunCore->setPosition(pos);
- }
- void setLightRotation(vector3df rot)
- {
- SunCore->setRotation(rot);
- }
- vector3df getLightRotation()
- {
- return SunCore->getRotation();
- }
- vector3df getLightPosition()
- {
- return SunCore->getAbsolutePosition();
- }
- vector3df getSunCameraPosition()
- {
- return Camera->getAbsolutePosition();
- }
- ISceneNode *getSunCameraNode()
- {
- return Camera;
- }
- void initPSSM(beautyInDeffered *prev,irr::core::array<irr::core::dimension2du> splits,float splitLambda=0.5f,float far=40000.0f)
- {
- SunCore=smgr->addEmptySceneNode();
- Camera=smgr->addCameraSceneNode(SunCore,vector3df(0,0,far),vector3df(0,0,0),-1,false);
- Camera->setFarValue(far);
- Camera->setFOV(900000.0f);
- Utils=new CPSSMUtils(Camera,splits.size(),splitLambda);
- Utils->setVideoDriver(driver);
- Utils->LightFar=far;
- for(unsigned int s=0;s<splits.size();s++)
- SplitRTT.push_back(driver->addRenderTargetTexture(splits[s],irr::core::stringc(s)+irr::core::stringc("SplitRTT"),ECF_R32F));
- Quad=new irr::scene::IQuadSceneNode(0,smgr);
- Quad->setMaterialFlag(irr::video::EMF_ZWRITE_ENABLE,false);
- Quad->setVisible(false);
- IOTarget.In=driver->addRenderTargetTexture(driver->getCurrentRenderTargetSize(),"ShadowIn",irr::video::ECF_A8R8G8B8);
- deffered=prev;
- deffered->IOTarget.Out=IOTarget.In;
- registerShaders();
- createShaders();
- }
- };
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement