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