[126] | 1 | // author: Szabolcs Czuczor (BME-IIT)
|
---|
| 2 |
|
---|
| 3 | #include "Ogre.h"
|
---|
| 4 | #include "OgreEffectWrapper.h"
|
---|
| 5 | #include "ManagedOgreRenderTexturePass.h"
|
---|
| 6 | #include "PMFFilteringPass.h"
|
---|
| 7 |
|
---|
| 8 | /**
|
---|
| 9 | * @brief: Construtor.
|
---|
| 10 | */
|
---|
| 11 | PMFFilteringPass::PMFFilteringPass(
|
---|
| 12 | Root* mRoot,unsigned int width,unsigned int height,
|
---|
| 13 | TextureType texType, PixelFormat internalFormat,
|
---|
| 14 | const NameValuePairList *miscParams,
|
---|
| 15 | bool fullScreenQuadRenderer,String renderTextureName)
|
---|
| 16 | :ManagedOgreRenderTexturePass(mRoot,renderTextureName,width,height,texType,internalFormat,miscParams,fullScreenQuadRenderer)
|
---|
| 17 | {
|
---|
| 18 | this->setMaterialName("PMF/PhotonMapFiltering");
|
---|
| 19 | generateFilterKernel(PMF_KT_UNIFORM, 2);
|
---|
| 20 | areaCompensation = 1.0f;
|
---|
| 21 | normalThreshold = 1.0f;
|
---|
| 22 | }
|
---|
| 23 |
|
---|
| 24 | /**
|
---|
| 25 | * @brief: Destructor.
|
---|
| 26 | */
|
---|
| 27 | PMFFilteringPass::~PMFFilteringPass() {
|
---|
| 28 | }
|
---|
| 29 |
|
---|
| 30 | void PMFFilteringPass::onRenderStart(NameValuePairList* namedParams){
|
---|
| 31 | effectWrapper->SetTechniqueToUse(0);
|
---|
| 32 | effectWrapper->BeginPass();
|
---|
| 33 | effectWrapper->SetFragmentProgramParameters();
|
---|
| 34 | effectWrapper->SetFloatArray("filterKernel", f_pmfFilterKernel, 25);
|
---|
| 35 | effectWrapper->SetFloat("g_fPMTextRes",resolution);
|
---|
| 36 | effectWrapper->SetFloat("g_fAreaCompensation", areaCompensation);
|
---|
| 37 | effectWrapper->SetFloat("g_fNormalThreshold", normalThreshold);
|
---|
| 38 |
|
---|
| 39 |
|
---|
| 40 | }
|
---|
| 41 |
|
---|
| 42 | void PMFFilteringPass::onRenderEnd(NameValuePairList* namedParams){
|
---|
| 43 | effectWrapper->EndPass();
|
---|
| 44 | }
|
---|
| 45 |
|
---|
| 46 | float PMFFilteringPass::getResolution(){
|
---|
| 47 | return resolution;
|
---|
| 48 | }
|
---|
| 49 |
|
---|
| 50 | void PMFFilteringPass::setResolution(float resolution){
|
---|
| 51 | this->resolution=resolution;
|
---|
| 52 | }
|
---|
| 53 |
|
---|
| 54 | void PMFFilteringPass::generateFilterKernel(t_pmfKernelType kt, int kernelSize) {
|
---|
| 55 | i_pmfKernelType = kt;
|
---|
| 56 | i_pmfKernelSize = kernelSize;
|
---|
| 57 | for (int i = 0; i < 25; i++) f_pmfFilterKernel[i] = 0.0f;
|
---|
| 58 | float x;
|
---|
| 59 | int idx;
|
---|
| 60 | for (int j = 0; j <= kernelSize; j++)
|
---|
| 61 | for (int i = 0; i <= kernelSize; i++) {
|
---|
| 62 | idx = j * 5 + i;
|
---|
| 63 | x = (float)sqrt((double)(_pmf_sqr(i) + _pmf_sqr(j))) / (float)(kernelSize + 1);
|
---|
| 64 | switch (kt) {
|
---|
| 65 | case PMF_KT_UNIFORM: {
|
---|
| 66 | if (x <= (float)kernelSize) f_pmfFilterKernel[idx] = 0.5f;
|
---|
| 67 | else f_pmfFilterKernel[idx] = 0.0f;
|
---|
| 68 | } break;
|
---|
| 69 | case PMF_KT_TRIANGLE: {
|
---|
| 70 | f_pmfFilterKernel[idx] = 1.0f - x;
|
---|
| 71 | } break;
|
---|
| 72 | case PMF_KT_EPANECHNIKOV: {
|
---|
| 73 | f_pmfFilterKernel[idx] = 0.75f * (1.0f - _pmf_sqr(x));
|
---|
| 74 | } break;
|
---|
| 75 | case PMF_KT_QUARTIC: {
|
---|
| 76 | f_pmfFilterKernel[idx] = (15.0f / 16.0f) * _pmf_sqr(1.0f - _pmf_sqr(x));
|
---|
| 77 | } break;
|
---|
| 78 | case PMF_KT_TRIWEIGHT: {
|
---|
| 79 | f_pmfFilterKernel[idx] = (35.0f / 32.0f) * _pmf_cube(1.0f - _pmf_sqr(x));
|
---|
| 80 | } break;
|
---|
| 81 | case PMF_KT_GAUSS: {
|
---|
| 82 | f_pmfFilterKernel[idx] = 0.39894228f * (float)exp((double)-_pmf_sqr(x) / 2.0f);
|
---|
| 83 | } break;
|
---|
| 84 | case PMF_KT_COSINE: {
|
---|
| 85 | f_pmfFilterKernel[idx] = (float)cos((_PMF_PI / 2.0f) * x);
|
---|
| 86 | } break;
|
---|
| 87 | }
|
---|
| 88 | if ((kt != PMF_KT_GAUSS) && (x > kernelSize)) f_pmfFilterKernel[idx] = 0.0f;
|
---|
| 89 | }
|
---|
| 90 | }
|
---|
| 91 |
|
---|
| 92 | void PMFFilteringPass::setAreaCompensation(float ac) {
|
---|
| 93 | this->areaCompensation = ac;
|
---|
| 94 | }
|
---|
| 95 | float PMFFilteringPass::getAreaCompensation() {
|
---|
| 96 | return this->areaCompensation;
|
---|
| 97 | }
|
---|
| 98 | void PMFFilteringPass::setNormalThreshold(float nt) {
|
---|
| 99 | this->normalThreshold = nt;
|
---|
| 100 | }
|
---|
| 101 | float PMFFilteringPass::getNormalThreshold() {
|
---|
| 102 | return this->normalThreshold;
|
---|
| 103 | }
|
---|
| 104 |
|
---|