source: trunk/BUTE/src/PreComputingRuns/PMFFilteringPass.cpp @ 126

Revision 126, 3.2 KB checked in by barsi, 19 years ago (diff)

Added a folder remotely

Line 
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 */
11PMFFilteringPass::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 */
27PMFFilteringPass::~PMFFilteringPass() {
28}
29
30void 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
42void PMFFilteringPass::onRenderEnd(NameValuePairList* namedParams){
43        effectWrapper->EndPass();
44}
45
46float PMFFilteringPass::getResolution(){
47        return resolution;
48}
49
50void PMFFilteringPass::setResolution(float resolution){
51        this->resolution=resolution;
52}
53
54void 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
92void PMFFilteringPass::setAreaCompensation(float ac) {
93        this->areaCompensation = ac;
94}
95float PMFFilteringPass::getAreaCompensation() {
96        return this->areaCompensation;
97}
98void PMFFilteringPass::setNormalThreshold(float nt) {
99        this->normalThreshold = nt;
100}
101float PMFFilteringPass::getNormalThreshold() {
102        return this->normalThreshold;
103}
104
Note: See TracBrowser for help on using the repository browser.