1 #include "pch.h"
2 #include "common/Def_Str.h"
3 #include "BaseApp.h"
4
5 #include "../vdrift/pathmanager.h"
6 #include "../vdrift/settings.h"
7
8 #include "Compositor.h"
9 #include "SplitScreen.h"
10 //#include "HDRCompositor.h"
11
12 #include <OgreRoot.h>
13 #include <OgreCompositorManager.h>
14 #include <OgreCompositionTargetPass.h>
15 #include <OgreCompositionPass.h>
16 #include <OgreTechnique.h>
17 #include <OgreCompositor.h>
18 using namespace Ogre;
19
20
createViewports()21 void BaseApp::createViewports()
22 {
23 mSplitMgr->mNumViewports = pSet->gui.local_players;
24 mSplitMgr->Align();
25 }
26
AnyEffectEnabled()27 bool BaseApp::AnyEffectEnabled()
28 {
29 //any new effect need to be added here to have UI Rendered on it
30 return pSet->all_effects && (pSet->softparticles || /*?*/pSet->bloom || pSet->hdr || pSet->blur || pSet->ssao || pSet->godrays || pSet->dof || pSet->filmgrain);
31 }
32
NeedMRTBuffer()33 bool BaseApp::NeedMRTBuffer()
34 {
35 return pSet->all_effects && (pSet->ssao || pSet->softparticles || pSet->dof || pSet->godrays || pSet->blur);
36 }
37
38
39 /// Refresh
40 //-------------------------------------------------------------------------------------
refreshCompositor(bool disableAll)41 void BaseApp::refreshCompositor(bool disableAll)
42 {
43 CompositorManager& cmp = CompositorManager::getSingleton();
44
45 for (std::list<Viewport*>::iterator it=mSplitMgr->mViewports.begin(); it!=mSplitMgr->mViewports.end(); ++it)
46 {
47 cmp.setCompositorEnabled((*it), "gbuffer", false);
48
49 cmp.setCompositorEnabled((*it), "gbufferNoMRT", false);
50 cmp.setCompositorEnabled((*it), "Bloom", false);
51 cmp.setCompositorEnabled((*it), "HDR", false);
52 cmp.setCompositorEnabled((*it), "HDRNoMRT", false);
53
54 //if (MaterialGenerator::MRTSupported())
55 cmp.setCompositorEnabled((*it), "ssao", false);
56 cmp.setCompositorEnabled((*it), "SoftParticles", false);
57 cmp.setCompositorEnabled((*it), "DepthOfField", false);
58 cmp.setCompositorEnabled((*it), "GodRays", false);
59 cmp.setCompositorEnabled((*it), "gbufferFinalizer", false);
60
61 cmp.setCompositorEnabled((*it), "motionblur", false);
62 cmp.setCompositorEnabled((*it), "FilmGrain", false);
63 cmp.setCompositorEnabled((*it), "gbufferUIRender", false);
64 }
65
66 if (!pSet->all_effects || disableAll)
67 return;
68
69 // Set Bloom params (intensity, orig weight)
70 try
71 { MaterialPtr bloom = MaterialManager::getSingleton().getByName("Ogre/Compositor/BloomBlend2");
72 if(!bloom.isNull())
73 {
74 GpuProgramParametersSharedPtr params = bloom->getTechnique(0)->getPass(0)->getFragmentProgramParameters();
75 params->setNamedConstant("OriginalImageWeight", pSet->bloom_orig);
76 params->setNamedConstant("BlurWeight", pSet->bloom_int);
77 }
78 }catch(...)
79 { LogO("!Warning: Failed to set bloom shader params."); }
80
81 // HDR params todo..
82 //try
83 //{ MaterialPtr hdrmat = MaterialManager::getSingleton().getByName("Ogre/Compositor/BloomBlend2");
84 // GpuProgramParametersSharedPtr params = hdrmat->getTechnique(0)->getPass(0)->getFragmentProgramParameters();
85 // params->setNamedConstant("Bloom", pSet->);
86 //}catch(...)
87 //{ LogO("!!! Failed to set hdr shader params."); }
88
89 // Set Motion Blur intens
90 //try
91 //{ MaterialPtr blur = MaterialManager::getSingleton().getByName("Ogre/Compositor/Combine");
92 // GpuProgramParametersSharedPtr params = blur->getTechnique(0)->getPass(0)->getFragmentProgramParameters();
93 // params->setNamedConstant("blur", pSet->motionblurintensity);
94 //}catch(...)
95 //{ LogO("!!! Failed to set blur shader params."); }
96
97
98 for (std::list<Viewport*>::iterator it=mSplitMgr->mViewports.begin(); it!=mSplitMgr->mViewports.end(); ++it)
99 {
100 //if(MaterialGenerator::MRTSupported())
101 //the condition here is any compositor needing the gbuffers like ssao ,soft particles
102 cmp.setCompositorEnabled((*it), "gbuffer", NeedMRTBuffer());
103
104 cmp.setCompositorEnabled((*it), "gbufferNoMRT",!NeedMRTBuffer() && AnyEffectEnabled());
105
106 cmp.setCompositorEnabled((*it), "Bloom", pSet->bloom);
107 cmp.setCompositorEnabled((*it), "HDR", pSet->hdr && NeedMRTBuffer());
108 cmp.setCompositorEnabled((*it), "HDRNoMRT", pSet->hdr && !NeedMRTBuffer());
109 cmp.setCompositorEnabled((*it), "motionblur", pSet->blur);
110 cmp.setCompositorEnabled((*it), "FilmGrain", pSet->hdr);
111
112 //if(MaterialGenerator::MRTSupported())
113 cmp.setCompositorEnabled((*it), "ssao", pSet->ssao);
114 cmp.setCompositorEnabled((*it), "SoftParticles", pSet->softparticles);
115 cmp.setCompositorEnabled((*it), "DepthOfField", pSet->dof);
116 cmp.setCompositorEnabled((*it), "GodRays", pSet->godrays);
117 cmp.setCompositorEnabled((*it), "gbufferFinalizer", NeedMRTBuffer() && !pSet->softparticles);
118
119 cmp.setCompositorEnabled((*it), "gbufferUIRender", AnyEffectEnabled());
120 }
121 }
122
123 //-------------------------------------------------------------------------------------
recreateCompositor()124 void BaseApp::recreateCompositor()
125 {
126 CompositorManager& cmp = CompositorManager::getSingleton();
127
128 if (!pSet->all_effects) // disable compositor
129 {
130 refreshCompositor();
131 return;
132 }
133
134 // add when needed
135 if (!ResourceGroupManager::getSingleton().resourceGroupExists("Effects"))
136 {
137 std::string sPath = PATHMANAGER::Data() + "/compositor";
138 mRoot->addResourceLocation(sPath, "FileSystem", "Effects");
139 mRoot->addResourceLocation(sPath + "/gbuffer", "FileSystem", "Effects");
140 mRoot->addResourceLocation(sPath + "/bloom", "FileSystem", "Effects");
141 mRoot->addResourceLocation(sPath + "/hdr", "FileSystem", "Effects");
142 mRoot->addResourceLocation(sPath + "/motionblur", "FileSystem", "Effects");
143 mRoot->addResourceLocation(sPath + "/ssao", "FileSystem", "Effects");
144 mRoot->addResourceLocation(sPath + "/softparticles", "FileSystem", "Effects");
145 mRoot->addResourceLocation(sPath + "/dof", "FileSystem", "Effects");
146 mRoot->addResourceLocation(sPath + "/godrays", "FileSystem", "Effects");
147 mRoot->addResourceLocation(sPath + "/filmgrain", "FileSystem", "Effects");
148 ResourceGroupManager::getSingleton().initialiseResourceGroup("Effects");
149 }
150
151 // hdr has to be first in the compositor queue
152 if (!mHDRLogic)
153 {
154 mHDRLogic = new HDRLogic;
155
156 cmp.registerCompositorLogic("HDR", mHDRLogic);
157 mHDRLogic->setApp(this);
158 }
159
160 if (!mSSAOLogic)
161 {
162 mSSAOLogic = new SSAOLogic();
163 mSSAOLogic->setApp(this);
164 //if(MaterialGenerator::MRTSupported())
165 if (1)
166 CompositorManager::getSingleton().registerCompositorLogic("ssao", mSSAOLogic);
167 else
168 cmp.registerCompositorLogic("ssaoNoMRT", mSSAOLogic);
169 }
170 if (!mGodRaysLogic)
171 {
172 mGodRaysLogic = new GodRaysLogic();
173 mGodRaysLogic->setApp(this);
174 cmp.registerCompositorLogic("GodRays", mGodRaysLogic);
175 }
176 if (!mSoftParticlesLogic)
177 {
178 mSoftParticlesLogic = new SoftParticlesLogic();
179 mSoftParticlesLogic->setApp(this);
180 cmp.registerCompositorLogic("SoftParticles", mSoftParticlesLogic);
181 }
182 if (!mDepthOfFieldLogic)
183 {
184 mDepthOfFieldLogic = new DepthOfFieldLogic();
185 mDepthOfFieldLogic->setApp(this);
186 cmp.registerCompositorLogic("DepthOfField", mDepthOfFieldLogic);
187 }
188 if (!mFilmGrainLogic)
189 {
190 mFilmGrainLogic = new FilmGrainLogic();
191 mFilmGrainLogic->setApp(this);
192 cmp.registerCompositorLogic("FilmGrain", mFilmGrainLogic);
193 }
194 if (!mGBufferLogic)
195 {
196 mGBufferLogic = new GBufferLogic();
197 mGBufferLogic->setApp(this);
198 cmp.registerCompositorLogic("GBuffer", mGBufferLogic);
199 }
200 if (!mMotionBlurLogic)
201 {
202 mMotionBlurLogic = new MotionBlurLogic(this);
203 cmp.registerCompositorLogic("motionblur", mMotionBlurLogic);
204 }
205
206 for (std::list<Viewport*>::iterator it=mSplitMgr->mViewports.begin(); it!=mSplitMgr->mViewports.end(); ++it)
207 {
208 // remove old comp. first
209 cmp.removeCompositorChain( (*it ));
210
211 //if (MaterialGenerator::MRTSupported())
212 cmp.addCompositor((*it), "gbuffer");
213
214 cmp.addCompositor((*it), "gbufferNoMRT");
215 cmp.addCompositor((*it), "HDRNoMRT");
216 //if (MaterialGenerator::MRTSupported())
217 if (1)
218 {
219 cmp.addCompositor((*it), "ssao");
220 cmp.addCompositor((*it), "SoftParticles");
221 cmp.addCompositor((*it), "DepthOfField");
222 cmp.addCompositor((*it), "gbufferFinalizer");
223 cmp.addCompositor((*it), "HDR");
224 }
225 else
226 cmp.addCompositor((*it), "ssaoNoMRT");
227
228 cmp.addCompositor((*it), "GodRays");
229 cmp.addCompositor((*it), "Bloom");
230 cmp.addCompositor((*it), "motionblur");
231 //cmp.addCompositor((*it), "FXAA");
232 cmp.addCompositor((*it), "FilmGrain");
233 cmp.addCompositor((*it), "gbufferUIRender");
234
235 }
236 refreshCompositor();
237 }
238
239