Subversion Repository Public Repository

Divide-Framework

This repository has no backups
This repository's network speed is throttled to 100KB/sec

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include "Headers/SingleShadowMap.h"

#include "Scenes/Headers/SceneState.h"
#include "Core/Headers/ParamHandler.h"
#include "Rendering/Lighting/Headers/Light.h"
#include "Hardware/Video/Headers/GFXDevice.h"
#include "Rendering/Camera/Headers/Camera.h"
#include "Rendering/Headers/Frustum.h"
#include "Managers/Headers/SceneManager.h"
#include "Geometry/Shapes/Headers/Predefined/Quad3D.h"

SingleShadowMap::SingleShadowMap(Light* light) : ShadowMap(light)
{
	_maxResolution = 0;
	_resolutionFactor = ParamHandler::getInstance().getParam<U8>("rendering.shadowResolutionFactor");
	CLAMP<F32>(_resolutionFactor,0.001f, 1.0f);
	PRINT_FN(Locale::get("LIGHT_CREATE_SHADOW_FBO"), light->getId(), "Single Shadow Map");
	std::stringstream ss;
	ss << "Light " << (U32)light->getId() << " viewport " << 0;
	ResourceDescriptor mrt(ss.str());
	mrt.setFlag(true); //No default Material;
	_renderQuad = CreateResource<Quad3D>(mrt);
	ResourceDescriptor shadowPreviewShader("fboPreview");
	_previewDepthMapShader = CreateResource<ShaderProgram>(shadowPreviewShader);
    _renderQuad->setCustomShader(_previewDepthMapShader);
	_renderQuad->renderInstance()->draw2D(true);

	SamplerDescriptor depthMapSampler;
	depthMapSampler.setWrapMode(TEXTURE_CLAMP_TO_EDGE);
	depthMapSampler.toggleMipMaps(false);
	depthMapSampler._useRefCompare = true; //< Use compare function
	depthMapSampler._cmpFunc = CMP_FUNC_LEQUAL; //< Use less or equal
	depthMapSampler._depthCompareMode = LUMINANCE;

	TextureDescriptor depthMapDescriptor(TEXTURE_2D,
										 DEPTH_COMPONENT,
										 DEPTH_COMPONENT,
										 UNSIGNED_BYTE); ///Default filters, LINEAR is OK for this

	depthMapDescriptor.setSampler(depthMapSampler);
	_depthMap = GFX_DEVICE.newFBO(FBO_2D_DEPTH);
	_depthMap->AddAttachment(depthMapDescriptor, TextureDescriptor::Depth);
	_depthMap->toggleColorWrites(false);
}

SingleShadowMap::~SingleShadowMap()
{
    RemoveResource(_previewDepthMapShader);
	RemoveResource(_renderQuad);
}

void SingleShadowMap::resolution(U16 resolution, const SceneRenderState& renderState){
	U8 resolutionFactorTemp = renderState.shadowMapResolutionFactor();
	CLAMP<U8>(resolutionFactorTemp, 1, 4);
	U16 maxResolutionTemp = resolution;
	if(resolutionFactorTemp != _resolutionFactor || _maxResolution != maxResolutionTemp){
		_resolutionFactor = resolutionFactorTemp;
		_maxResolution = maxResolutionTemp;
		///Initialize the FBO's with a variable resolution
		PRINT_FN(Locale::get("LIGHT_INIT_SHADOW_FBO"), _light->getId());
		U16 shadowMapDimension = _maxResolution/_resolutionFactor;
		_depthMap->Create(shadowMapDimension,shadowMapDimension);
	}
	ShadowMap::resolution(resolution, renderState);
	_renderQuad->setDimensions(vec4<F32>(0,0,_depthMap->getWidth(),_depthMap->getHeight()));
}

void SingleShadowMap::render(const SceneRenderState& renderState, boost::function0<void> sceneRenderFunction){
	///Only if we have a valid callback;
	if(sceneRenderFunction.empty()) {
		ERROR_FN(Locale::get("ERROR_LIGHT_INVALID_SHADOW_CALLBACK"), _light->getId());
		return;
	}

	_callback = sceneRenderFunction;
	renderInternal(renderState);
}

void SingleShadowMap::renderInternal(const SceneRenderState& renderState) const {
	GFXDevice& gfx = GFX_DEVICE;
	//Get our eye view
	vec3<F32> eyePos = renderState.getCameraConst().getEye();
	//For every depth map
	//Lock our projection matrix so no changes will be permanent during the rest of the frame
    //Lock our model view matrix so no camera transforms will be saved beyond this light's scope
	gfx.lockMatrices();
	//Set the camera to the light's view
	_light->setCameraToLightView(eyePos);
	//Set the appropriate projection
	_light->renderFromLightView(0);
	//bind the associated depth map
	_depthMap->Begin();
	//draw the scene
	GFX_DEVICE.render(_callback, renderState);
	//unbind the associated depth map
	_depthMap->End();

	//get all the required information (light MVP matrix for example)
	//and restore to the proper camera view
	_light->setCameraToSceneView();
	//Undo all modifications to the Projection Matrix
	//Undo all modifications to the ModelView Matrix
	gfx.releaseMatrices();
	///Restore our view frustum
	Frustum::getInstance().Extract(eyePos);
}

void SingleShadowMap::previewShadowMaps(){
	_depthMap->Bind(0);
    _previewDepthMapShader->bind();
    _previewDepthMapShader->UniformTexture("tex",0);
	GFX_DEVICE.toggle2D(true);
		GFX_DEVICE.renderInViewport(vec4<U32>(0,0,256,256),
								    boost::bind(&GFXDevice::renderInstance,
									            DELEGATE_REF(GFX_DEVICE),
												DELEGATE_REF(_renderQuad->renderInstance())));
	GFX_DEVICE.toggle2D(false);
	_depthMap->Unbind(0);
}

Commits for Divide-Framework/trunk/Source Code/Rendering/Lighting/ShadowMapping/SingleShadowMap.cpp

Diff revisions: vs.
Revision Author Commited Message
168 Diff Diff k1ngp1n picture k1ngp1n Sat 26 Oct, 2013 19:03:21 +0000

- Reworked the Camera class[[BR]]
— Now fully quaternion based [[BR]]
— Basic camera types added but not used yet (third person, first person, orbit) [[BR]]
- Cleaned up Material and Texture handling [[BR]]
- Added clipping plane support [[BR]]
— Similar to OpenGL fixed-function clip planes but fully shader driven [[BR]]
— Added a new class, “Plane”, that helps define clip planes [[BR]]
- Optimized the Singleton class to allow faster “getInstance” calls without performance penalties [[BR]]
-- “createInstance” must be called for each singleton class before usage. Or “gerOrCreateInstance” can be used, which is basically the former “getInstance” implementation [[BR]]
- Improved console logging by changing some heap allocations to stack and removing dependencies on the std::string class [[BR]]
- Added a lot of performance optimizations related to coding standards and redundant calculations [[BR]]
— e.g. Frustum AABB check didn’t need to recompute the AABB points as they were calculated already [[BR]]
— e.g. A vector did not need to be set to 0 on initialization as that is already it’s default state on creation [[BR]]
— e.g. Faster Framerate and Timing calculations by using less member variables that are not needed outsied of calling functions [[BR]]
- The SceneState now contains the SceneRenderState and is passed on to the SceneGraph’s update calls [[BR]]
- Better material export/import to/from XML format [[BR]]
- More bug fixes and cleanups [[BR]]

152 Diff Diff k1ngp1n picture k1ngp1n Thu 20 Jun, 2013 14:23:31 +0000

[Ionut] [[BR]]
- New rendering pipeline (experimental and unstable): [[BR]]
— OpenGL 3.x clean context (glLight commands are still used for now, but UBO support is there, but not used yet) [[BR]]
— Custom matrix stacks and UBO based shader data (UBOs cause some link errors on some nVidia cards)[[BR]]
— Multi-threaded texture loading and shader compilation (mt shader compilation disabled for now. needs more tests) [[BR]]
— VAO rendering is self contained (no more enable/disable calls before a draw request) [[BR]]
— Render instance class used for rendering information [[BR]]
[[BR]]
- New unique ID generation base class: GUIDWrapper. Each class that derives from this, gets an application wide unique id on construction [[BR]]
- Added base code for an in-game editor using CEGUI [[BR]]
- Replaced some mutex locks with lockless data structures or atomic data [[BR]]
- CEGUI 0.8.2, FTGL-GL3 and GLIM 0.4 modified to support GLEW_MX if defined [[BR]]
- Dropped VS2008 support [[BR]]
- Networking library, server framework and ReCast files are now projects inside the Divide Framework solution [[BR]]
- New console command “setFov” that modifies the horizontal FoV value in realtime [[BR]]
- New console command “recompileShader” that reparses shader files, recompiles shaders and relinks shader programs who’s names match or contain the argument string [[BR]]
- New debug utility: axis angle drawn in corner of the screen if needed [[BR]]
- More ‘const’-s pasted around the code, more loop performance tweaks (allocations before a loop, tighter loops, etc), more utility member functions added to various classes [[BR]]

146 k1ngp1n picture k1ngp1n Wed 10 Apr, 2013 13:20:15 +0000

[Ionut] [[BR]]
*Final LightBranch updates 2/3 : Main trunk merge and build test (VC90, VC100, gDebugger) [[BR]]
-Merged light branch with trunk [[BR]]
-Deleted light branch [[BR]]