Advertisement
Guest User

beautyInShadow

a guest
Jun 18th, 2012
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.83 KB | None | 0 0
  1. #pragma once
  2. #include "include/irrlicht.h"
  3. #include "optimize.h"
  4. #include "IQuadSceneNode.h"
  5. #include <Cg/cg.h>
  6. #include "includeCg/IrrCg.h"
  7. #include "beautyInComponent.h"
  8. #include "beautyInShader.h"
  9. #include "beautyInDeffered.h"
  10.  
  11. #include "PSSMUtils.h"
  12. namespace beautyInRender
  13. {
  14.     class IModulateLightCallback : public IrrCg::ICgShaderConstantSetCallBack
  15.     {
  16.     public:
  17.         ITexture *SMapTexture[4];
  18.         CPSSMUtils *PSSMUtils;
  19.         IModulateLightCallback(CPSSMUtils *pssm) : IrrCg::ICgShaderConstantSetCallBack()
  20.         {
  21.             PSSMUtils=pssm;
  22.         }
  23.  
  24.         virtual void OnSetConstants( IrrCg::ICgServices* Services,CGprogram Vertex,CGprogram Fragment,const irr::video::SMaterial& Material )
  25.         {
  26.             irr::core::matrix4 Matrix = Services->getDevice()->getVideoDriver()->getTransform(irr::video::ETS_PROJECTION);
  27.             Matrix *= Services->getDevice()->getVideoDriver()->getTransform(irr::video::ETS_VIEW);
  28.             Matrix = Services->getDevice()->getVideoDriver()->getTransform(irr::video::ETS_WORLD);
  29.             Services->setMatrix(cgGetNamedParameter(Vertex, "WorldViewProj"), IrrCg::ICGT_MATRIX_IDENTITY, Matrix);
  30.             matrix4 iMatrix = Services->getDevice()->getVideoDriver()->getTransform(irr::video::ETS_PROJECTION);
  31.             iMatrix *= Services->getDevice()->getVideoDriver()->getTransform(irr::video::ETS_VIEW);
  32.             iMatrix.makeInverse();
  33.             //iMatrix=iMatrix.getTransposed();
  34.             Services->setMatrix(cgGetNamedParameter(Fragment, "InvertViewProjection"), IrrCg::ICGT_MATRIX_IDENTITY, iMatrix);
  35.             Services->EnableTexture(cgGetNamedParameter(Fragment,"ColorTex"),Material.getTexture(0));
  36.             Services->EnableTexture(cgGetNamedParameter(Fragment,"NormalDepthTex"),Material.getTexture(1));
  37.             Services->setParameter1i(cgGetNamedParameter(Fragment,"ScreenWidth"),Services->getDevice()->getVideoDriver()->getScreenSize().Width);
  38.             Services->setParameter1i(cgGetNamedParameter(Fragment,"ScreenHeight"),Services->getDevice()->getVideoDriver()->getScreenSize().Height);
  39.  
  40.             Services->setParameter1i(cgGetNamedParameter(Fragment, "NumSplits"), PSSMUtils->getSplitsCount());
  41.  
  42.             float TextureOffset = 0.5f;
  43.  
  44.             matrix4 mTextureMatrixConst;
  45.             mTextureMatrixConst[0] = 0.5f;
  46.             mTextureMatrixConst[1] = 0.0f;
  47.             mTextureMatrixConst[2] = 0.0f;
  48.             mTextureMatrixConst[3] = 0.0f;
  49.  
  50.             mTextureMatrixConst[4] = 0.0f;
  51.             mTextureMatrixConst[5] = -0.5f;
  52.  
  53.             if(PSSMUtils->getVideoDriver()->getDriverType() == EDT_OPENGL)
  54.                 mTextureMatrixConst[5] *= -1.0f;
  55.  
  56.             mTextureMatrixConst[6] = 0.0f;
  57.             mTextureMatrixConst[7] = 0.0f;
  58.  
  59.             mTextureMatrixConst[8] = 0.0f;
  60.             mTextureMatrixConst[9] = 0.0f;
  61.             mTextureMatrixConst[10] = 1.0f;
  62.             mTextureMatrixConst[11] = 0.0f;
  63.  
  64.             mTextureMatrixConst[12] = TextureOffset;
  65.             mTextureMatrixConst[13] = TextureOffset;
  66.             mTextureMatrixConst[14] = 0.0f;
  67.             mTextureMatrixConst[15] = 1.0f;
  68.  
  69.             for(int i = 0; i < PSSMUtils->getSplitsCount(); i++)
  70.             {
  71.                 TextureOffset = 0.5f;
  72.  
  73.                 if(PSSMUtils->getVideoDriver()->getDriverType() == EDT_OPENGL)
  74.                     TextureOffset -= (0.5f / (float)SMapTexture[i]->getSize().Width);
  75.                 else
  76.                     TextureOffset += (0.5f / (float)SMapTexture[i]->getSize().Width);
  77.  
  78.                 mTextureMatrixConst[12] = TextureOffset;
  79.                 mTextureMatrixConst[13] = TextureOffset;
  80.  
  81.  
  82.                 Matrix = mTextureMatrixConst;
  83.                 Matrix *= PSSMUtils->getProjectionMatrix(i);
  84.                 Matrix *= PSSMUtils->getViewMatrix(i);
  85.  
  86.                 Services->setMatrix(cgGetArrayParameter(cgGetNamedParameter(Fragment, "TextureMatrix"), i),ICGT_MATRIX_IDENTITY,Matrix );
  87.             }
  88.  
  89.             for(int i = 0; i < PSSMUtils->getSplitsCount(); i++)
  90.             {
  91.                 Services->setParameter1f(cgGetArrayParameter(cgGetNamedParameter(Fragment, "SplitDistance"), i), PSSMUtils->getSplitDistance(i+1));
  92.             }
  93.  
  94.             for(int i = 0; i < PSSMUtils->getSplitsCount(); i++)
  95.             {
  96.                 Services->EnableTexture(cgGetArrayParameter(cgGetNamedParameter(Fragment, "DepthMap"), i),SMapTexture[i]);
  97.             }
  98.         }
  99.  
  100.     };
  101.     class beautyInShadow : public beautyInComponent
  102.     {
  103.     protected:     
  104.         beautyInDeffered *deffered;
  105.         irr::IrrlichtDevice *device;
  106.         irr::scene::ISceneManager *smgr;
  107.         irr::video::IVideoDriver *driver;
  108.         CPSSMUtils *Utils;
  109.         IModulateLightCallback *PSSMCallback;
  110.         irr::scene::IQuadSceneNode *Quad;
  111.         irr::scene::ICameraSceneNode *Camera;
  112.         irr::scene::ISceneNode *SunCore;
  113.         irr::video::SColor ShadowColor;
  114.         void registerShaders()
  115.         {
  116.             global->ShaderLibrary->registerShader(new shader::CShaderSource("CG/Depth.cg","CG/Depth.cg","PSSMDepth",new CDepthCallBack(Utils)));
  117.             global->ShaderLibrary->registerShader(new shader::CShaderSource("CG/DepthT.cg","CG/DepthT.cg","PSSMTransparentDepth",new CDepthCallBackTrans(Utils)));
  118.             PSSMCallback=new IModulateLightCallback(Utils);
  119.             for(unsigned int i=0;i<SplitRTT.size();i++)
  120.             {
  121.                 if(i==4)
  122.                     break;
  123.                 PSSMCallback->SMapTexture[i]=SplitRTT[i];
  124.             }
  125.             global->ShaderLibrary->registerShader(new shader::CShaderSource("CG/Light.cg","CG/ModulateLight.cg","PSSMModulateLight",PSSMCallback,true,irr::video::EMT_TRANSPARENT_ADD_COLOR));
  126.             //global->ShaderLibrary->registerShader(new shader::CShaderSource("CG/PSSM.cg","CG/PSSM.cg","PSSM",PSSMCallback));
  127.         }
  128.  
  129.         void createShaders()
  130.         {
  131.             global->MaterialLibrary->registerMaterial(global->ShaderLibrary->getShader("PSSMModulateLight"));
  132.             global->MaterialLibrary->registerMaterial(global->ShaderLibrary->getShader("PSSMDepth"));
  133.             global->MaterialLibrary->registerMaterial(global->ShaderLibrary->getShader("PSSMTransparentDepth"));
  134.             //global->MaterialLibrary->registerMaterial(global->ShaderLibrary->getShader("PSSM"));
  135.         }
  136.     public:
  137.  
  138.         irr::core::array<irr::video::ITexture*> SplitRTT;
  139.         virtual void OnPreRender(irr::core::array<irr::scene::ISceneNode*> &lightList)
  140.         {
  141.         }
  142.  
  143.         virtual void OnPostRender()
  144.         {
  145.             ICameraSceneNode *ActiveCam=smgr->getActiveCamera();
  146.             Utils->CalculateSplitDistances(smgr->getActiveCamera());
  147.             setLightPosition(ActiveCam->getAbsolutePosition());
  148.             Camera->setTarget(ActiveCam->getAbsolutePosition());
  149.             irr::core::array<irr::core::array<u32>> NodeMaterial;
  150.             irr::core::array<irr::scene::ISceneNode*> NodesGet;
  151.             irr::core::array<irr::scene::ISceneNode*> Nodes;
  152.             smgr->getSceneNodesFromType(ESNT_ANY,NodesGet);
  153.            
  154.             for(int i=0;i<NodesGet.size();i++)
  155.             {
  156.                 if(NodesGet[i]->getType()==ESNT_CAMERA)
  157.                     continue;
  158.                 if(NodesGet[i]->getAttributes())
  159.                 {
  160.                     if(NodesGet[i]->getAttributes()->existsAttribute("ReceiveShadow") || NodesGet[i]->getAttributes()->existsAttribute("CastShadow"))
  161.                     {
  162.                         if(NodesGet[i]->getAttributes()->getAttributeAsBool("ReceiveShadow") || NodesGet[i]->getAttributes()->getAttributeAsBool("CastShadow"))
  163.                         {
  164.                             Nodes.push_back(NodesGet[i]);
  165.                             core::array<u32> MatArray;
  166.                             for(unsigned int m=0;m<NodesGet[i]->getMaterialCount();m++)
  167.                             {
  168.  
  169.                                 NodesGet[i]->getMaterial(m).setFlag(EMF_LIGHTING,false);
  170.                                 MatArray.push_back(NodesGet[i]->getMaterial(m).MaterialType);
  171.                                 NodesGet[i]->getMaterial(m).MaterialType=global->MaterialLibrary->getMaterial("PSSMTransparentDepth");
  172.  
  173.                             }
  174.                             NodeMaterial.push_back(MatArray);
  175.                         }
  176.                     }
  177.                 }
  178.             }
  179.            
  180.             for(int CSplit=0;CSplit<Utils->getSplitsCount();CSplit++)
  181.             {
  182.                 driver->setRenderTarget(SplitRTT[CSplit],true, true,SColor(0xffffffff));
  183.                 Utils->CalculateFrustumCorners(ActiveCam,CSplit,1.1f);
  184.                 Utils->CalculateLightForFrustum(CSplit);
  185.                 Camera->OnRegisterSceneNode();
  186.                 Camera->render();
  187.  
  188.                 for(unsigned int i=0;i<Nodes.size();i++)
  189.                 {
  190.                     if(irr::video::isAABBinFrustum(Nodes[i]->getBoundingBox(),Camera->getViewFrustum()) && Nodes[i]->getAttributes()->getAttributeAsBool("CastShadow"))
  191.                     {
  192.                         Nodes[i]->OnRegisterSceneNode();
  193.                         Nodes[i]->render();
  194.                     }
  195.                 }
  196.  
  197.                
  198.  
  199.  
  200.  
  201.             }
  202.            
  203.  
  204.             /*driver->setRenderTarget(ShadowRTT,true,true,SColor(0xffffffff));
  205.             ActiveCam->OnRegisterSceneNode();
  206.             ActiveCam->OnAnimate(global->device->getTimer()->getTime());
  207.             ActiveCam->render();
  208.  
  209.             for(unsigned int i=0;i<Nodes.size();i++)
  210.             {
  211.                 if(!Nodes[i]->getAttributes()->getAttributeAsBool("ReceiveShadow"))
  212.                     continue;
  213.                 for(unsigned int m=0;m<Nodes[i]->getMaterialCount();m++)
  214.                 {
  215.                    
  216.                     Nodes[i]->getMaterial(m).MaterialType=global->MaterialLibrary->getMaterial("PSSM");
  217.                 }
  218.                 Nodes[i]->OnRegisterSceneNode();
  219.                 Nodes[i]->render();
  220.             }*/
  221.  
  222.             for(unsigned int i=0;i<Nodes.size();i++)
  223.             {
  224.                 for(unsigned int m=0;m<Nodes[i]->getMaterialCount();m++)
  225.                 {
  226.                     Nodes[i]->getMaterial(m).MaterialType=(E_MATERIAL_TYPE)NodeMaterial[i][m];
  227.                 }
  228.             }
  229.  
  230.             driver->setRenderTarget(IOTarget.Out);
  231.             Quad->setMaterialTexture(0,IOTarget.In);
  232.             Quad->setMaterialTexture(1,deffered->getNormalDepthMap());
  233.             Quad->setMaterialType(global->MaterialLibrary->getMaterial("PSSMModulateLight"));
  234.             ActiveCam->OnRegisterSceneNode();
  235.             ActiveCam->OnAnimate(global->device->getTimer()->getTime());
  236.             ActiveCam->render();
  237.             Quad->render();
  238.  
  239.  
  240.         }
  241.         virtual void OnRenderPassPreRender(irr::scene::E_SCENE_NODE_RENDER_PASS renderPass)
  242.         {
  243.         }
  244.         virtual void OnRenderPassPostRender(irr::scene::E_SCENE_NODE_RENDER_PASS renderPass)
  245.         {
  246.         }
  247.         virtual void OnNodePreRender(irr::scene::ISceneNode *node)
  248.         {
  249.         }
  250.         virtual void OnNodePostRender(irr::scene::ISceneNode *node)
  251.         {
  252.         }
  253.         virtual void init()
  254.         {
  255.             smgr=global->device->getSceneManager();
  256.             driver=global->device->getVideoDriver();
  257.  
  258.             IOTarget.Out=0;
  259.         }
  260.        
  261.  
  262.  
  263.         ISceneNode *getSunCore()
  264.         {
  265.             return SunCore;
  266.         }
  267.  
  268.  
  269.  
  270.         void setLightPosition(vector3df pos)
  271.         {
  272.             SunCore->setPosition(pos);
  273.         }
  274.  
  275.         void setLightRotation(vector3df rot)
  276.         {
  277.             SunCore->setRotation(rot);
  278.         }
  279.  
  280.         vector3df getLightRotation()
  281.         {
  282.             return SunCore->getRotation();
  283.         }
  284.  
  285.         vector3df getLightPosition()
  286.         {
  287.  
  288.             return SunCore->getAbsolutePosition();
  289.         }
  290.  
  291.  
  292.  
  293.         vector3df getSunCameraPosition()
  294.         {
  295.             return Camera->getAbsolutePosition();
  296.         }
  297.  
  298.         ISceneNode *getSunCameraNode()
  299.         {
  300.             return Camera;
  301.         }
  302.  
  303.         void initPSSM(beautyInDeffered *prev,irr::core::array<irr::core::dimension2du> splits,float splitLambda=0.5f,float far=40000.0f)
  304.         {
  305.             SunCore=smgr->addEmptySceneNode();
  306.             Camera=smgr->addCameraSceneNode(SunCore,vector3df(0,0,far),vector3df(0,0,0),-1,false);
  307.            
  308.             Camera->setFarValue(far);
  309.             Camera->setFOV(900000.0f);
  310.             Utils=new CPSSMUtils(Camera,splits.size(),splitLambda);
  311.             Utils->setVideoDriver(driver);
  312.             Utils->LightFar=far;
  313.             for(unsigned int s=0;s<splits.size();s++)
  314.                 SplitRTT.push_back(driver->addRenderTargetTexture(splits[s],irr::core::stringc(s)+irr::core::stringc("SplitRTT"),ECF_R32F));
  315.  
  316.             Quad=new irr::scene::IQuadSceneNode(0,smgr);
  317.             Quad->setMaterialFlag(irr::video::EMF_ZWRITE_ENABLE,false);
  318.             Quad->setVisible(false);
  319.            
  320.             IOTarget.In=driver->addRenderTargetTexture(driver->getCurrentRenderTargetSize(),"ShadowIn",irr::video::ECF_A8R8G8B8);
  321.             deffered=prev;
  322.             deffered->IOTarget.Out=IOTarget.In;
  323.             registerShaders();
  324.             createShaders();
  325.         }
  326.     };
  327. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement