Revision: 1636
http://rigsofrods.svn.sourceforge.net/rigsofrods/?rev=1636&view=rev
Author: rorthomas
Date: 2011-02-02 20:07:58 +0000 (Wed, 02 Feb 2011)
Log Message:
-----------
DOF-improvements
fixed heathaze ratio
improved caelum fog mode
Modified Paths:
--------------
trunk/source/main/Heathaze.cpp
trunk/source/main/RoRFrameListener.cpp
trunk/source/main/RoRFrameListener.h
trunk/source/main/SkyManager.cpp
trunk/source/main/dof/DepthOfFieldEffect.cpp
trunk/source/main/dof/DepthOfFieldEffect.h
trunk/source/main/dof/Lens.cpp
trunk/source/main/dof/Lens.h
Modified: trunk/source/main/Heathaze.cpp
===================================================================
--- trunk/source/main/Heathaze.cpp 2011-02-02 17:10:50 UTC (rev 1635)
+++ trunk/source/main/Heathaze.cpp 2011-02-02 20:07:58 UTC (rev 1636)
@@ -43,7 +43,7 @@
HeatHaze::HeatHaze(SceneManager *sceneMgr, RenderWindow *mWindow, Ogre::Camera
*cam) : mSceneMgr(sceneMgr), rttTex(0), listener(0)
{
- TexturePtr rttTexPtr =
TextureManager::getSingleton().createManual("heathaze_rtt",
ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, TEX_TYPE_2D, 512, 512, 0,
PF_R8G8B8, TU_RENDERTARGET, new ResourceBuffer());
+ TexturePtr rttTexPtr =
TextureManager::getSingleton().createManual("heathaze_rtt",
ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, TEX_TYPE_2D,
cam->getViewport()->getWidth(), cam->getViewport()->getHeight(), 0, PF_R8G8B8,
TU_RENDERTARGET, new ResourceBuffer());
rttTex = rttTexPtr->getBuffer()->getRenderTarget();
{
/*
Modified: trunk/source/main/RoRFrameListener.cpp
===================================================================
--- trunk/source/main/RoRFrameListener.cpp 2011-02-02 17:10:50 UTC (rev
1635)
+++ trunk/source/main/RoRFrameListener.cpp 2011-02-02 20:07:58 UTC (rev
1636)
@@ -2613,11 +2613,13 @@
{
// change to fixed free camera: that is working like
fixed cam
cameramode = CAMERA_FREE_FIXED;
+ if(mDOF) mDOF->setFocusMode(DOFManager::Auto);
LogManager::getSingleton().logMessage("switching to
fixed free camera mode");
if(ow) ow->flashMessage(_L("fixed free camera"));
} else if(cameramode == CAMERA_FREE_FIXED)
{
cameramode = CAMERA_FREE;
+ if(mDOF) mDOF->setFocusMode(DOFManager::Auto);
LogManager::getSingleton().logMessage("switching to
free camera mode from fixed mode");
if(ow) ow->flashMessage(_L("free camera"));
}
@@ -2629,12 +2631,14 @@
if(cameramode == CAMERA_FREE || cameramode == CAMERA_FREE_FIXED)
{
// change back to normal camera
+ if(mDOF) mDOF->setFocusMode(DOFManager::Manual);
cameramode = storedcameramode;
LogManager::getSingleton().logMessage("exiting free
camera mode");
if(ow) ow->flashMessage(_L("normal camera"));
} else if(cameramode != CAMERA_FREE && cameramode !=
CAMERA_FREE_FIXED )
{
// enter free camera mode
+ if(mDOF) mDOF->setFocusMode(DOFManager::Auto);
storedcameramode = cameramode;
cameramode = CAMERA_FREE;
LogManager::getSingleton().logMessage("entering free
camera mode");
@@ -5308,11 +5312,12 @@
bool useDOF = (SETTINGS.getSetting("DOF") == "Yes");
if(useDOF)
{
- mDOF = new DepthOfFieldEffect(mCamera->getViewport());
+ mDOF = new DOFManager(mSceneMgr, mCamera->getViewport(), mRoot,
mCamera);
mDOF->setEnabled(true);
}
+
if (SETTINGS.getSetting("Glow") == "Yes")
{
CompositorManager::getSingleton().addCompositor(mCamera->getViewport(), "Glow");
@@ -6763,6 +6768,7 @@
if(changeCamMode)
mCamera->setFOVy(Degree(80));
collisions->forcecam=false;
+ if(mDOF) mDOF->setFocusMode(DOFManager::Auto);
}
else
{
@@ -6778,6 +6784,7 @@
camIdealPosition=camDist/2.0*Vector3(sin(angle+camRotX.valueRadians())*cos(camRotY.valueRadians()),sin(camRotY.valueRadians()),cos(angle+camRotX.valueRadians())*cos(camRotY.valueRadians()));
+ float real_camdist = camIdealPosition.length();
camIdealPosition=camIdealPosition+person->getPosition();
Vector3
newposition=(camIdealPosition+10.0*mCamera->getPosition())/11.0;
@@ -6794,6 +6801,14 @@
mCamera->setFOVy(Degree(60));
lastPosition=person->getPosition();
+
+ if(mDOF)
+ {
+ mDOF->setFocusMode(DOFManager::Manual);
+ mDOF->setFocus(real_camdist);
+ mDOF->setLensFOV(Degree(60));
+ }
+
//lastangle=angle;
}
}
@@ -6815,7 +6830,17 @@
}
mCamera->setPosition(Vector3(px+50.0, h+1.7, pz+50.0));
mCamera->lookAt(person->getPosition());
-
mCamera->setFOVy(Radian(atan2(20.0f,(mCamera->getPosition()-person->getPosition()).length())));
+ float real_camDist =
(mCamera->getPosition()-person->getPosition()).length();
+ Radian fov = Radian(atan2(20.0f,real_camDist));
+ mCamera->setFOVy(fov);
+
+ if(mDOF)
+ {
+ mDOF->setFocusMode(DOFManager::Manual);
+ mDOF->setFocus(real_camDist);
+ mDOF->setLensFOV(fov);
+ }
+
}
else if (cameramode==CAMERA_INT)
{
@@ -6832,6 +6857,12 @@
camRotX=pushcamRotX;
camRotY=pushcamRotY;
}
+ if(mDOF)
+ {
+ mDOF->setFocusMode(DOFManager::Auto);
+ mDOF->setLensFOV(Degree(75));
+ }
+
}
}
else
@@ -6859,6 +6890,12 @@
if(changeCamMode)
mCamera->setFOVy(Degree(80));
collisions->forcecam=false;
+
+ if(mDOF)
+ {
+ mDOF->setFocusMode(DOFManager::Auto);
+ mDOF->setLensFOV(Degree(80));
+ }
}
else
{
@@ -6881,6 +6918,7 @@
camIdealPosition=camDist*Vector3(sin(angle+camRotX.valueRadians())*cos(camRotY.valueRadians()),sin(camRotY.valueRadians()),cos(angle+camRotX.valueRadians())*cos(camRotY.valueRadians()));
}
+ float cam_realdist = camIdealPosition.length();
camIdealPosition=camIdealPosition+trucks[current_truck]->getPosition();
Vector3
oldposition=mCamera->getPosition()+trucks[current_truck]->nodes[0].Velocity*trucks[current_truck]->ttdt;
float
ratio=1.0/(trucks[current_truck]->tdt*4.0);
@@ -6900,6 +6938,15 @@
mCamera->setFOVy(Degree(60));
lastPosition=trucks[current_truck]->getPosition();
+
+ if(mDOF)
+ {
+ mDOF->setFocusMode(DOFManager::Manual);
+ mDOF->setFocus(cam_realdist);
+ mDOF->setLensFOV(Degree(60));
+ }
+
+
//lastangle=angle;
}
}
@@ -6929,7 +6976,16 @@
mCamera->setPosition(newposition);
}
mCamera->lookAt(trucks[current_truck]->getPosition());
-
mCamera->setFOVy(Radian(atan2(100.0f,(mCamera->getPosition()-trucks[current_truck]->getPosition()).length())));
+ float real_camDist =
(mCamera->getPosition()-trucks[current_truck]->getPosition()).length();
+ Radian fov = Radian(atan2(100.0f,real_camDist));
+ mCamera->setFOVy(fov);
+ if(mDOF)
+ {
+ mDOF->setFocusMode(DOFManager::Manual);
+ mDOF->setFocus(real_camDist);
+ mDOF->setLensFOV(fov);
+ }
+
}
else
{
@@ -6941,7 +6997,15 @@
h=w->getHeightWaves(Vector3(px+50.0,0,pz+50.0));
mCamera->setPosition(Vector3(px+50.0, h+1.7,
pz+50.0));
mCamera->lookAt(trucks[current_truck]->getPosition());
-
mCamera->setFOVy(Radian(atan2(20.0f,(mCamera->getPosition()-trucks[current_truck]->getPosition()).length())));
+ float real_camDist =
(mCamera->getPosition()-trucks[current_truck]->getPosition()).length();
+ Radian fov = Radian(atan2(20.0f,real_camDist));
+ mCamera->setFOVy(fov);
+ if(mDOF)
+ {
+ mDOF->setFocusMode(DOFManager::Manual);
+ mDOF->setFocus(real_camDist);
+ mDOF->setLensFOV(fov);
+ }
}
}
if (cameramode==CAMERA_INT)
@@ -7017,6 +7081,14 @@
trucks[current_truck]->prepareInside(false);
if(ow) ow->showDashboardOverlays(true,
trucks[current_truck]->driveable);
}
+
+ if(mDOF)
+ {
+ mDOF->setFocusMode(DOFManager::Manual);
+ mDOF->setFocus(2);
+ mDOF->setLensFOV(Degree(90));
+ }
+
}
}
Modified: trunk/source/main/RoRFrameListener.h
===================================================================
--- trunk/source/main/RoRFrameListener.h 2011-02-02 17:10:50 UTC (rev
1635)
+++ trunk/source/main/RoRFrameListener.h 2011-02-02 20:07:58 UTC (rev
1636)
@@ -185,7 +185,7 @@
} animated_object_t;
class RoRFrameListener;
-class DepthOfFieldEffect;
+class DOFManager;
class SelectorWindow;
@@ -222,7 +222,7 @@
std::map< std::string, Ogre::SceneNode *> loadedObjects;
- DepthOfFieldEffect *mDOF;
+ DOFManager *mDOF;
int mouseX;
int mouseY;
int shaderSchemeMode;
Modified: trunk/source/main/SkyManager.cpp
===================================================================
--- trunk/source/main/SkyManager.cpp 2011-02-02 17:10:50 UTC (rev 1635)
+++ trunk/source/main/SkyManager.cpp 2011-02-02 20:07:58 UTC (rev 1636)
@@ -22,6 +22,8 @@
#include "SkyManager.h"
+#include "Settings.h"
+
#include "Ogre.h"
#include "Caelum.h"
@@ -84,6 +86,11 @@
mCaelumSystem->getMoon()->getMainLight()->setCastShadows(false);
}
+ if (SETTINGS.getSetting("Fog") != "Yes")
+ {
+
mCaelumSystem->setSceneFogDensityMultiplier(0.000000000001);
+ }
+
mCaelumSystem->setEnsureSingleShadowSource(true);
mCaelumSystem->setEnsureSingleLightSource(true);
Modified: trunk/source/main/dof/DepthOfFieldEffect.cpp
===================================================================
--- trunk/source/main/dof/DepthOfFieldEffect.cpp 2011-02-02 17:10:50 UTC
(rev 1635)
+++ trunk/source/main/dof/DepthOfFieldEffect.cpp 2011-02-02 20:07:58 UTC
(rev 1636)
@@ -1,25 +1,34 @@
-// "Depth of Field" demo for Ogre
+// "Depth of Field" demo for Ogre
// Copyright (C) 2006 Christian Lindequist Larsen
//
// This code is in the public domain. You may do whatever you want with it.
-// changed by tdev, 02/02/2011
-
#include "DepthOfFieldEffect.h"
+#include <Ogre.h>
+#include "Lens.h"
using namespace Ogre;
const int DepthOfFieldEffect::BLUR_DIVISOR = 5;
-int DepthOfFieldEffect::DoF_ID = 0;
-DepthOfFieldEffect::DepthOfFieldEffect(Viewport* viewport)
- : mViewport(viewport)
- , mNearDepth(10.0)
+DepthOfFieldEffect::DepthOfFieldEffect(Ogre::Viewport *v, Ogre::Camera *cam) :
+ mNearDepth(10.0)
, mFocalDepth(100.0)
, mFarDepth(190.0)
, mFarBlurCutoff(1.0)
+ , mViewport(v)
+ , mCamera(cam)
{
- DoF_ID++;
+ mWidth = mViewport->getActualWidth();
+ mHeight = mViewport->getActualHeight();
+
+ mCompositor = NULL;
+ mDepthTechnique = NULL;
+ mDepthTarget = NULL;
+ mDepthViewport = NULL;
+ mDepthTexture.setNull();
+ mDepthMaterial.setNull();
+
createDepthRenderTexture();
addCompositor();
}
@@ -55,60 +64,73 @@
void DepthOfFieldEffect::createDepthRenderTexture()
{
// Create the depth render texture
- TexturePtr depthTexture = TextureManager::getSingleton().createManual(
- "DoF_Depth" + StringConverter::toString(DoF_ID),
- ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
- TEX_TYPE_2D, mViewport->getActualWidth(),
mViewport->getActualHeight(),
+ mDepthTexture = TextureManager::getSingleton().createManual(
+ "DoF_Depth",ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
+ TEX_TYPE_2D, mWidth, mHeight,
0, PF_L8, TU_RENDERTARGET);
// Get its render target and add a viewport to it
- RenderTexture* depthTarget =
depthTexture->getBuffer()->getRenderTarget();
- Viewport* depthViewport =
depthTarget->addViewport(mViewport->getCamera());
+ mDepthTarget = mDepthTexture->getBuffer()->getRenderTarget();
+ mDepthViewport = mDepthTarget->addViewport(mCamera);
// Register 'this' as a render target listener
- depthTarget->addListener(this);
+ mDepthTarget->addListener(this);
// Get the technique to use when rendering the depth render texture
mDepthMaterial = MaterialManager::getSingleton().getByName("DoF_Depth");
mDepthMaterial->load(); // needs to be loaded manually
mDepthTechnique = mDepthMaterial->getBestTechnique();
-
- try {
- // Create a custom render queue invocation sequence for the
depth render texture
- RenderQueueInvocationSequence* invocationSequence =
-
Root::getSingleton().createRenderQueueInvocationSequence("DoF_Depth");
- // Add a render queue invocation to the sequence, and disable
shadows for it
- RenderQueueInvocation* invocation =
invocationSequence->add(RENDER_QUEUE_MAIN, "main");
- invocation->setSuppressShadows(true);
- }
- catch(Exception e)
- {
- // do nothing, RenderQueueInvocationSequence already created
- }
+ // Create a custom render queue invocation sequence for the depth
render texture
+ RenderQueueInvocationSequence* invocationSequence =
Root::getSingleton().createRenderQueueInvocationSequence("DoF_Depth");
+ // Add a render queue invocation to the sequence, and disable shadows
for it
+ /*
+ RenderQueueInvocation* invocation =
invocationSequence->add(RENDER_QUEUE_MAIN, "main");
+ invocation->setSuppressShadows(true);
+ //invocation->setSuppressRenderStateChanges(true);
+
invocation->setSolidsOrganisation(QueuedRenderableCollection::OM_SORT_ASCENDING);
// Set the render queue invocation sequence for the depth render
texture viewport
- depthViewport->setRenderQueueInvocationSequenceName("DoF_Depth");
+ mDepthViewport->setRenderQueueInvocationSequenceName("DoF_Depth");
+ */
+
+ mDepthViewport->setShadowsEnabled(false);
+
+
+ //re-set texture "DoF_Depth"
+ MaterialPtr p =
MaterialManager::getSingleton().getByName("DoF_DepthOfField");
+ p->load();
+
p->getBestTechnique()->getPass(0)->getTextureUnitState("depth")->setTextureName("DoF_Depth");
+ p->unload();
}
void DepthOfFieldEffect::destroyDepthRenderTexture()
{
- // TODO
+ mDepthViewport->setRenderQueueInvocationSequenceName("");
+ Root::getSingleton().destroyRenderQueueInvocationSequence("DoF_Depth");
+
+ mDepthMaterial->unload();
+
+ mDepthTarget->removeAllListeners();
+ mDepthTarget->removeAllViewports();
+ //TextureManager::getSingleton().unload("DoF_Depth");
+ TextureManager::getSingleton().remove("DoF_Depth");
}
void DepthOfFieldEffect::addCompositor()
{
- // Add the compositor to the viewport
- mCompositor = CompositorManager::getSingleton().addCompositor(
- mViewport, "DoF_Compositor" +
StringConverter::toString(DoF_ID));
+ mCompositor =
CompositorManager::getSingleton().addCompositor(mViewport,
"DoF_Compositor_test");
+ mCompositor->addListener(this);
- // Register 'this' as a listener
- mCompositor->addListener(this);
+ mCompositor->setEnabled(true);
}
void DepthOfFieldEffect::removeCompositor()
{
- // TODO
+ mCompositor->setEnabled(false);
+
+ mCompositor->removeListener(this);
+ CompositorManager::getSingleton().removeCompositor(mViewport,
"DoF_Compositor_test");
}
void DepthOfFieldEffect::notifyMaterialSetup(uint32 passId, MaterialPtr&
material)
@@ -117,42 +139,39 @@
{
case BlurPass:
{
- Vector3 pixelSize = Vector3(
- 1.0f / (mViewport->getActualWidth() /
BLUR_DIVISOR),
- 1.0f / (mViewport->getActualHeight() /
BLUR_DIVISOR),
- 1.0);
+ //float pixelSize[2] = {
+ // 1.0f / (mViewport->getActualWidth() /
BLUR_DIVISOR),
+ // 1.0f / (mViewport->getActualHeight() /
BLUR_DIVISOR)};
// Adjust fragment program parameters
- GpuProgramParametersSharedPtr fragParams =
-
material->getBestTechnique()->getPass(0)->getFragmentProgramParameters();
-
+ Ogre::Vector3 ps = Ogre::Vector3(1.0f / (mWidth /
BLUR_DIVISOR),1.0f / (mHeight / BLUR_DIVISOR), 1.0f);
+ float pixelSize[3] = { ps.x, ps.y, ps.z };
+ GpuProgramParametersSharedPtr fragParams =
material->getBestTechnique()->getPass(0)->getFragmentProgramParameters();
if((!fragParams.isNull())&&(fragParams->_findNamedConstantDefinition("pixelSize")))
- fragParams->setNamedConstant("pixelSize",
pixelSize );
+ fragParams->setNamedConstant("pixelSize",
pixelSize, 1, 3);
break;
}
case OutputPass:
{
- Vector3 pixelSizeScene = Vector3(
- 1.0f / (mViewport->getActualWidth()),
- 1.0f / (mViewport->getActualHeight()),
- 1.0);
+ float pixelSizeScene[3] = {
+ 1.0f / mWidth,
+ 1.0f / mHeight,
+ 0};
- Vector3 pixelSizeBlur = Vector3(
- 1.0f / (mViewport->getActualWidth() /
BLUR_DIVISOR),
- 1.0f / (mViewport->getActualHeight() /
BLUR_DIVISOR),
- 1.0);
+ float pixelSizeBlur[3] = {
+ 1.0f / (mWidth / BLUR_DIVISOR),
+ 1.0f / (mHeight / BLUR_DIVISOR),
+ 0};
// Adjust fragment program parameters
GpuProgramParametersSharedPtr fragParams =
material->getBestTechnique()->getPass(0)->getFragmentProgramParameters();
-
if((!fragParams.isNull())&&(fragParams->_findNamedConstantDefinition("pixelSizeScene")))
- fragParams->setNamedConstant("pixelSizeScene",
pixelSizeScene );
-
+ fragParams->setNamedConstant("pixelSizeScene",
pixelSizeScene,1,3);
if((!fragParams.isNull())&&(fragParams->_findNamedConstantDefinition("pixelSizeBlur")))
- fragParams->setNamedConstant("pixelSizeBlur",
pixelSizeBlur );
+ fragParams->setNamedConstant("pixelSizeBlur",
pixelSizeBlur,1,3);
break;
}
@@ -161,22 +180,15 @@
void DepthOfFieldEffect::preViewportUpdate(const
Ogre::RenderTargetViewportEvent& evt)
{
- Vector4 dofParams(mNearDepth, mFocalDepth, mFarDepth, mFarBlurCutoff);
+ float dofParams[4] = {mNearDepth, mFocalDepth, mFarDepth,
mFarBlurCutoff};
+
// Adjust fragment program parameters for depth pass
GpuProgramParametersSharedPtr fragParams =
mDepthTechnique->getPass(0)->getFragmentProgramParameters();
-
if((!fragParams.isNull())&&(fragParams->_findNamedConstantDefinition("dofParams")))
- fragParams->setNamedConstant("dofParams", dofParams);
+ fragParams->setNamedConstant("dofParams", dofParams,1,4);
- /*
- fragParams->setNamedConstant("pixelSizeScene", pixelSizeScene,
sizeof(pixelSizeScene)/sizeof(pixelSizeScene[0]), 1.0f);
- fragParams->setNamedConstant("pixelSizeBlur", pixelSizeBlur,
sizeof(pixelSizeBlur)/sizeof(pixelSizeBlur[0]), 1.0f);
- fragParams->setNamedConstant("dofParams", dofParams,
sizeof(dofParams)/sizeof(dofParams[0]), 1.0f);
- fragParams->setNamedConstant("pixelSize",
pixelSize,sizeof(pixelSize)/sizeof(pixelSize[0]), 1.0f);
- */
-
// Add 'this' as a RenderableListener to replace the technique for all
renderables
RenderQueue* queue =
evt.source->getCamera()->getSceneManager()->getRenderQueue();
queue->setRenderableListener(this);
@@ -189,10 +201,227 @@
queue->setRenderableListener(0);
}
-bool DepthOfFieldEffect::renderableQueued(Renderable* rend, uint8 groupID,
- ushort priority, Technique** ppTech,
RenderQueue* pQueue)
+bool DepthOfFieldEffect::renderableQueued(Ogre::Renderable* rend, Ogre::uint8
groupID,
+ Ogre::ushort priority, Ogre::Technique**
ppTech, Ogre::RenderQueue* pQueue)
{
// Replace the technique of all renderables
*ppTech = mDepthTechnique;
return true;
}
+
+/////////////////////////////////////////////////////////////////////////////////////
+DOFManager::DOFManager(Ogre::SceneManager *m, Ogre::Viewport *mViewport,
Ogre::Root *root, Ogre::Camera *cam) : mRoot(root), mCamera(cam), mSceneMgr(m)
+{
+ mFocusMode = Manual;
+ mAutoSpeed = 30;
+ mAutoTime = 0.5f;
+ targetFocalDistance = 5;
+
+ mDepthOfFieldEffect = new DepthOfFieldEffect(mViewport, mCamera);
+ mLens = new Lens(mCamera->getFOVy(), 1);
+ mLens->setFocalDistance(5);
+ //mLens->setFStop(10);
+// mDepthOfFieldEffect->setEnabled(false);
+ mRoot->addFrameListener(this);
+
+ mRaySceneQuery = mSceneMgr->createRayQuery(Ogre::Ray());
+ mRaySceneQuery->setSortByDistance(true);
+ //mRaySceneQuery->setQueryMask(queryMask);
+
+ debugNode = 0;
+ bool debug = true;
+ if(debug)
+ {
+ MaterialPtr material =
MaterialManager::getSingleton().getByName("DoF_DepthDebug");
+
material->getTechnique(0)->getPass(0)->getTextureUnitState(0)->setTextureName("DoF_Depth");
+ Overlay* overlay =
OverlayManager::getSingleton().getByName("DoF_DepthDebugOverlay");
+ overlay->show();
+
+ debugNode =
mSceneMgr->getRootSceneNode()->createChildSceneNode();
+ Entity *ent = mSceneMgr->createEntity("sphere.mesh");
+ debugNode->attachObject(ent);
+ debugNode->setScale(0.001, 0.001, 0.001);
+ }
+}
+
+DOFManager::~DOFManager()
+{
+ cleanup();
+}
+
+void DOFManager::cleanup()
+{
+ mRoot->removeFrameListener(this);
+
+ delete mLens;
+ mLens = NULL;
+
+ delete mDepthOfFieldEffect;
+ mDepthOfFieldEffect = NULL;
+}
+
+void DOFManager::setAutoSpeed(float f)
+{
+ mAutoSpeed = f;
+}
+
+void DOFManager::setEnabled(bool enabled)
+{
+ mDepthOfFieldEffect->setEnabled(enabled);
+ /*
+ // crashes for some reason
+ if(enabled && !mDepthOfFieldEffect->getEnabled())
+ {
+ // turn on
+ mDepthOfFieldEffect->setEnabled(true);
+ mRoot->addFrameListener(this);
+ } else if(!enabled && mDepthOfFieldEffect->getEnabled())
+ {
+ // turn off
+ mDepthOfFieldEffect->setEnabled(false);
+ mRoot->removeFrameListener(this);
+ }
+ */
+}
+
+bool DOFManager::getEnabled()
+{
+ return mDepthOfFieldEffect->getEnabled();
+}
+
+void DOFManager::zoomView(float delta)
+{
+ Real fieldOfView = mLens->getFieldOfView().valueRadians();
+ fieldOfView += delta;
+ fieldOfView = std::max<Real>(0.1, std::min<Real>(fieldOfView, 2.0));
+ mLens->setFieldOfView(Radian(fieldOfView));
+ mCamera->setFOVy(Radian(fieldOfView));
+}
+
+void DOFManager::Aperture(float delta)
+{
+ if (mFocusMode == Pinhole)
+ return;
+ Real fStop = mLens->getFStop();
+ fStop += delta;
+ fStop = std::max<Real>(0.5, std::min<Real>(fStop, 12.0));
+ mLens->setFStop(fStop);
+}
+
+void DOFManager::moveFocus(float delta)
+{
+ mLens->setFocalDistance(mLens->getFocalDistance() + delta);
+}
+
+void DOFManager::setZoom(float f)
+{
+ Real fieldOfView = Degree(Real(f)).valueRadians();
+ fieldOfView = std::max<Real>(0.1, std::min<Real>(fieldOfView, 2.0));
+ mLens->setFieldOfView(Radian(fieldOfView));
+ mCamera->setFOVy(Radian(fieldOfView));
+}
+
+void DOFManager::setLensFOV(Radian fov)
+{
+ mLens->setFieldOfView(fov);
+}
+
+void DOFManager::setAperture(float f)
+{
+ if (mFocusMode == Pinhole)
+ return;
+ Real fStop = f;
+ fStop = std::max<Real>(0.5, std::min<Real>(fStop, 12.0));
+ mLens->setFStop(fStop);
+}
+
+void DOFManager::setFocus(float f)
+{
+ mLens->setFocalDistance(f);
+}
+
+bool DOFManager::frameStarted(const FrameEvent& evt)
+{
+ Camera *camera = mCamera;
+ // Focusing
+ switch (mFocusMode)
+ {
+ case Auto:
+ {
+ // TODO: Replace with accurate ray/triangle collision
detection
+ Real currentFocalDistance = mLens->getFocalDistance();
+
+ // TODO: Continous AF / triggered
+ mAutoTime -= evt.timeSinceLastFrame;
+ if(mAutoTime <= 0.0f)
+ {
+ mAutoTime = 0.5f;
+
+ targetFocalDistance = currentFocalDistance;
+
+ // Ryan Booker's (eyevee99) ray scene query
auto focus
+ Ray focusRay;
+
focusRay.setOrigin(camera->getDerivedPosition());
+
focusRay.setDirection(camera->getDerivedDirection());
+ Vector3 v;
+ Vector3 vn;
+
+ mRaySceneQuery->setRay(focusRay);
+ Ogre::RaySceneQueryResult &qryResult =
mRaySceneQuery->execute();
+ for (Ogre::RaySceneQueryResult::iterator it =
qryResult.begin();it != qryResult.end(); it++)
+ {
+ if(it->worldFragment)
+ {
+ if(debugNode)
debugNode->setPosition(it->worldFragment->singleIntersection +
Vector3(0.5,0,0));
+ targetFocalDistance =
(mCamera->getPosition() - it->worldFragment->singleIntersection).length();
+ break;
+ } else
+ {
+ /*
+ // this wont work since we
would need to go down to the polygon level :(
+ if(debugNode)
debugNode->setPosition(focusRay.getPoint(it->distance));
+ targetFocalDistance =
it->distance;
+ break;
+ */
+ }
+
+ }
+ }
+
+ // Slowly adjust the focal distance (emulate auto focus
motor)
+ if (currentFocalDistance < targetFocalDistance)
+ {
+ mLens->setFocalDistance(
+ std::min<Real>(currentFocalDistance +
mAutoSpeed * evt.timeSinceLastFrame, targetFocalDistance));
+ }
+ else if (currentFocalDistance > targetFocalDistance)
+ {
+ mLens->setFocalDistance(
+ std::max<Real>(currentFocalDistance -
mAutoSpeed * evt.timeSinceLastFrame, targetFocalDistance));
+ }
+
+ break;
+ }
+
+ case Manual:
+ //we set the values elsewhere
+ break;
+ }
+
+ // Update Depth of Field effect
+ if (mFocusMode != Pinhole)
+ {
+ mDepthOfFieldEffect->setEnabled(true);
+
+ // Calculate and set depth of field using lens
+ float nearDepth, focalDepth, farDepth;
+ mLens->recalculateDepthOfField(nearDepth, focalDepth, farDepth);
+ mDepthOfFieldEffect->setFocalDepths(nearDepth, focalDepth,
farDepth);
+ }
+ else
+ {
+ mDepthOfFieldEffect->setEnabled(false);
+ }
+
+ return true;
+}
Modified: trunk/source/main/dof/DepthOfFieldEffect.h
===================================================================
--- trunk/source/main/dof/DepthOfFieldEffect.h 2011-02-02 17:10:50 UTC (rev
1635)
+++ trunk/source/main/dof/DepthOfFieldEffect.h 2011-02-02 20:07:58 UTC (rev
1636)
@@ -1,4 +1,4 @@
-// "Depth of Field" demo for Ogre
+// "Depth of Field" demo for Ogre
// Copyright (C) 2006 Christian Lindequist Larsen
//
// This code is in the public domain. You may do whatever you want with it.
@@ -6,16 +6,20 @@
#ifndef __DepthOfFieldEffect_H__
#define __DepthOfFieldEffect_H__
-#include "RoRPrerequisites.h"
-#include <Ogre.h>
-#include <OgreCompositorInstance.h>
+#include "OgrePrerequisites.h"
+#include "OgreCompositorInstance.h"
+#include "OgreRenderTargetListener.h"
+#include "OgreFrameListener.h"
+#include "OgreRenderQueue.h"
+class Lens;
+
class DepthOfFieldEffect : public Ogre::CompositorInstance::Listener,
public
Ogre::RenderTargetListener,
public
Ogre::RenderQueue::RenderableListener
{
public:
- DepthOfFieldEffect(Ogre::Viewport* viewport);
+ DepthOfFieldEffect(Ogre::Viewport *mViewport, Ogre::Camera *cam);
~DepthOfFieldEffect();
float getNearDepth() const {return mNearDepth; }
@@ -28,8 +32,21 @@
void setEnabled(bool value);
private:
+ // Implementation of Ogre::CompositorInstance::Listener
+ virtual void notifyMaterialSetup(Ogre::uint32 passId,
Ogre::MaterialPtr& material);
+
+ // Implementation of Ogre::RenderTargetListener
+ virtual void preViewportUpdate(const Ogre::RenderTargetViewportEvent&
evt);
+ virtual void postViewportUpdate(const Ogre::RenderTargetViewportEvent&
evt);
+
+ // Implementation of Ogre::RenderQueue::RenderableListener
+ virtual bool renderableQueued(Ogre::Renderable* rend, Ogre::uint8
groupID,
+ Ogre::ushort priority, Ogre::Technique**
ppTech, Ogre::RenderQueue* pQueue);
+
+ int mWidth;
+ int mHeight;
+
static const int BLUR_DIVISOR;
- static int DoF_ID;
enum PassId
{
@@ -37,10 +54,15 @@
OutputPass
};
- Ogre::Viewport* mViewport;
+ Ogre::Viewport* mDepthViewport;
+ Ogre::RenderTexture* mDepthTarget;
+ Ogre::TexturePtr mDepthTexture;
Ogre::MaterialPtr mDepthMaterial;
Ogre::Technique* mDepthTechnique;
Ogre::CompositorInstance* mCompositor;
+ Ogre::Viewport *mViewport;
+ Ogre::Camera *mCamera;
+
float mNearDepth;
float mFocalDepth;
float mFarDepth;
@@ -48,19 +70,50 @@
void createDepthRenderTexture();
void destroyDepthRenderTexture();
+// void createCompositor();
+// void destroyCompositor();
void addCompositor();
void removeCompositor();
+};
- // Implementation of Ogre::CompositorInstance::Listener
- virtual void notifyMaterialSetup(Ogre::uint32 passId,
Ogre::MaterialPtr& material);
+class DOFManager : public Ogre::FrameListener
+{
+public:
+ DOFManager(Ogre::SceneManager *m, Ogre::Viewport *v, Ogre::Root *r,
Ogre::Camera *cam);
+ ~DOFManager();
- // Implementation of Ogre::RenderTargetListener
- virtual void preViewportUpdate(const Ogre::RenderTargetViewportEvent&
evt);
- virtual void postViewportUpdate(const Ogre::RenderTargetViewportEvent&
evt);
- // Implementation of Ogre::RenderQueue::RenderableListener
- virtual bool renderableQueued(Ogre::Renderable* rend, Ogre::uint8
groupID,
- Ogre::ushort priority, Ogre::Technique**
ppTech, Ogre::RenderQueue* pQueue);
+ void setEnabled(bool enabled);
+ bool getEnabled();
+
+ // controls
+ enum FocusMode {Auto, Manual, Pinhole};
+ void setFocusMode(int mode) {mFocusMode = (FocusMode)mode;}
+ void setAutoSpeed(float f);
+ void zoomView(float delta);
+ void Aperture(float delta);
+ void moveFocus(float delta);
+ void setZoom(float f);
+ void setLensFOV(Ogre::Radian fov);
+ void setAperture(float f);
+ void setFocus(float f);
+
+protected:
+ virtual bool frameStarted(const Ogre::FrameEvent& evt);
+
+ Ogre::Root *mRoot;
+ Ogre::Camera *mCamera;
+ Ogre::RaySceneQuery *mRaySceneQuery;
+ Ogre::SceneManager *mSceneMgr;
+
+ void cleanup();
+ DepthOfFieldEffect* mDepthOfFieldEffect;
+ Lens* mLens;
+ FocusMode mFocusMode;
+ float mAutoSpeed;
+ float mAutoTime;
+ Ogre::Real targetFocalDistance;
+ Ogre::SceneNode *debugNode;
};
#endif // __DepthOfFieldEffect_H__
Modified: trunk/source/main/dof/Lens.cpp
===================================================================
--- trunk/source/main/dof/Lens.cpp 2011-02-02 17:10:50 UTC (rev 1635)
+++ trunk/source/main/dof/Lens.cpp 2011-02-02 20:07:58 UTC (rev 1636)
@@ -1,4 +1,4 @@
-// "Depth of Field" demo for Ogre
+// "Depth of Field" demo for Ogre
// Copyright (C) 2006 Christian Lindequist Larsen
//
// This code is in the public domain. You may do whatever you want with it.
@@ -6,6 +6,7 @@
// Author: Ryan Booker (eyevee99)
#include "Lens.h"
+#include "Ogre.h"
using namespace Ogre;
Modified: trunk/source/main/dof/Lens.h
===================================================================
--- trunk/source/main/dof/Lens.h 2011-02-02 17:10:50 UTC (rev 1635)
+++ trunk/source/main/dof/Lens.h 2011-02-02 20:07:58 UTC (rev 1636)
@@ -1,4 +1,4 @@
-// "Depth of Field" demo for Ogre
+// "Depth of Field" demo for Ogre
// Copyright (C) 2006 Christian Lindequist Larsen
//
// This code is in the public domain. You may do whatever you want with it.
@@ -8,8 +8,8 @@
#ifndef __Lens_H__
#define __Lens_H__
-#include "RoRPrerequisites.h"
-#include <Ogre.h>
+#include "OgrePrerequisites.h"
+#include "OgreMath.h"
class Lens {
public:
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
------------------------------------------------------------------------------
Special Offer-- Download ArcSight Logger for FREE (a $49 USD value)!
Finally, a world-class log management solution at an even better price-free!
Download using promo code Free_Logger_4_Dev2Dev. Offer expires
February 28th, so secure your free ArcSight Logger TODAY!
http://p.sf.net/sfu/arcsight-sfd2d
_______________________________________________
Rigsofrods-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/rigsofrods-devel