Motion blur
Code: Select all
#include "Ogre.h"
#include "ExampleApplication.h"
AnimationState* mAnimState;
// Event handler
class CameraTrackListener: public ExampleFrameListener
{
protected:
public:
CameraTrackListener(RenderWindow* win, Camera* cam)
: ExampleFrameListener(win, cam)
{
}
bool frameStarted(const FrameEvent& evt)
{
mAnimState->addTime(evt.timeSinceLastFrame);
// Call default
return ExampleFrameListener::frameStarted(evt);
}
};
class CameraTrackApplication : public ExampleApplication
{
public:
CameraTrackApplication() {
}
~CameraTrackApplication() { }
protected:
#define RTTSIZE 1024
SceneNode* mFountainNode;
// Just override the mandatory create scene method
void createScene(void)
{
// Set ambient light
mSceneMgr->setAmbientLight(ColourValue(0.2, 0.2, 0.2));
// Create a skydome
mSceneMgr->setSkyDome(true, "Examples/CloudySky", 5, 8);
// Create a light
Light* l = mSceneMgr->createLight("MainLight");
// Accept default settings: point light, white diffuse, just set position
// NB I could attach the light to a SceneNode if I wanted it to move automatically with
// other objects, but I don't
l->setPosition(20,80,50);
Entity *ent;
// Define a floor plane mesh
Plane p;
p.normal = Vector3::UNIT_Y;
p.d = 200;
MeshManager::getSingleton().createPlane("FloorPlane",p,200000,200000,20,20,true,1,50,50,Vector3::UNIT_Z);
// Create an entity (the floor)
ent = mSceneMgr->createEntity("floor", "FloorPlane");
ent->setMaterialName("Examples/RustySteel");
// Attach to child of root node, better for culling (otherwise bounds are the combination of the 2)
mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(ent);
// Add a head, give it it's own node
SceneNode* headNode = mSceneMgr->getRootSceneNode()->createChildSceneNode();
ent = mSceneMgr->createEntity("head", "ogrehead.mesh");
headNode->attachObject(ent);
// Make sure the camera track this node
mCamera->setAutoTracking(true, headNode);
// Create the camera node & attach camera
SceneNode* camNode = mSceneMgr->getRootSceneNode()->createChildSceneNode();
camNode->attachObject(mCamera);
// set up spline animation of node
Animation* anim = mSceneMgr->createAnimation("CameraTrack", 10);
// Spline it for nice curves
anim->setInterpolationMode(Animation::IM_SPLINE);
// Create a track to animate the camera's node
AnimationTrack* track = anim->createTrack(0, camNode);
// Setup keyframes
KeyFrame* key = track->createKeyFrame(0); // startposition
key = track->createKeyFrame(2.5);
key->setTranslate(Vector3(500,500,-1000));
key = track->createKeyFrame(5);
key->setTranslate(Vector3(-1500,1000,-600));
key = track->createKeyFrame(7.5);
key->setTranslate(Vector3(0,-100,0));
key = track->createKeyFrame(10);
key->setTranslate(Vector3(0,0,0));
// Create a new animation state to track this
mAnimState = mSceneMgr->createAnimationState("CameraTrack");
mAnimState->setEnabled(true);
// Put in a bit of fog for the hell of it
mSceneMgr->setFog(FOG_EXP, ColourValue::White, 0.0002);
// Motion blur stuff :)
RenderTexture *motionBlurTexture = mRoot->getRenderSystem ()->createRenderTexture ("MotionBlurTexture", RTTSIZE, RTTSIZE);
motionBlurTexture->addViewport (mCamera);
//motionBlurTexture->getViewport (0)->setOverlaysEnabled (false);
Material *motionBlurMaterial = mSceneMgr->createMaterial ("MotionBlurMaterial");
TextureUnitState *tUnit = motionBlurMaterial->getTechnique (0)->getPass (0)->createTextureUnitState ();
tUnit->setTextureName ("MotionBlurTexture");
tUnit->setAlphaOperation (LBX_BLEND_MANUAL, LBS_MANUAL, LBS_CURRENT, 0.8, 1, 1);
motionBlurMaterial->setSceneBlending (SBT_TRANSPARENT_ALPHA);
motionBlurMaterial->setDepthCheckEnabled (false);
motionBlurMaterial->setDepthWriteEnabled (false);
Overlay *motionBlurOverlay = mSceneMgr->createOverlay ("MotionBlurOverlay", 10);
GuiElement *motionBlurPanel = GuiManager::getSingleton ().createGuiElement ("Panel", "MotionBlurPanel", false);
motionBlurPanel->setMaterialName ("MotionBlurMaterial");
motionBlurOverlay->add2D ((GuiContainer *)motionBlurPanel);
motionBlurOverlay->show ();
// End of motion blur :(
}
// Create new frame listener
void createFrameListener(void)
{
mFrameListener= new CameraTrackListener(mWindow, mCamera);
mRoot->addFrameListener(mFrameListener);
}
};
#if OGRE_PLATFORM == PLATFORM_WIN32
#define WIN32_LEAN_AND_MEAN
#include "windows.h"
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )
#else
int main(int argc, char **argv)
#endif
{
// Create application object
CameraTrackApplication app;
try {
app.go();
} catch( Exception& e ) {
#if OGRE_PLATFORM == PLATFORM_WIN32
MessageBox( NULL, e.getFullDescription().c_str(), "An exception has occured!", MB_OK | MB_ICONERROR | MB_TASKMODAL);
#else
fprintf(stderr, "An exception has occured: %s\n",
e.getFullDescription().c_str());
#endif
}
return 0;
}
Code: Select all
#include "Ogre.h"
#include "ExampleApplication.h"
AnimationState* mAnimState;
// Event handler
class CameraTrackListener: public ExampleFrameListener
{
protected:
public:
CameraTrackListener(RenderWindow* win, Camera* cam)
: ExampleFrameListener(win, cam)
{
}
bool frameStarted(const FrameEvent& evt)
{
mAnimState->addTime(evt.timeSinceLastFrame);
// Call default
return ExampleFrameListener::frameStarted(evt);
}
};
class PlaneMover : public ControllerValue<Real>
{
protected:
SceneNode* mNode;
Real mHeight;
Real mBaseHeight;
public:
PlaneMover (SceneNode *node) {
mNode = node;
mBaseHeight = mNode->getPosition ().y;
}
virtual Real getValue (void) const {
return mHeight;
}
virtual void setValue (Real value) {
mHeight = value;
mNode->setPosition (mNode->getPosition ().x, mBaseHeight + mHeight, mNode->getPosition ().z);
}
};
class CameraTrackApplication : public ExampleApplication
{
public:
CameraTrackApplication() {
}
~CameraTrackApplication() { }
protected:
#define RTTSIZE 512
#define JITTERRADIUS 4
#define NUMJITTERS 3
#define NUMRAZORS 30
#define SQUADRONSIZE 2000
SceneNode* mFountainNode;
unsigned int i;
// Just override the mandatory create scene method
void createScene(void)
{
// Set ambient light
mSceneMgr->setAmbientLight(ColourValue(0.2, 0.2, 0.2));
// Create a skydome
mSceneMgr->setSkyDome(true, "Examples/CloudySky", 5, 8);
// Create a light
Light* l = mSceneMgr->createLight("MainLight");
// Accept default settings: point light, white diffuse, just set position
// NB I could attach the light to a SceneNode if I wanted it to move automatically with
// other objects, but I don't
l->setPosition(20,80,50);
l->setDirection (-100, -60, -30);
l->setType (Light::LT_DIRECTIONAL);
Entity *ent;
// Define a floor plane mesh
Plane p;
p.normal = Vector3::UNIT_Y;
p.d = 200;
MeshManager::getSingleton().createPlane("FloorPlane",p,200000,200000,20,20,true,1,50,50,Vector3::UNIT_Z);
// Create an entity (the floor)
ent = mSceneMgr->createEntity("floor", "FloorPlane");
ent->setMaterialName("Examples/RustySteel");
// Attach to child of root node, better for culling (otherwise bounds are the combination of the 2)
mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(ent);
// Add a head, give it it's own node
SceneNode* headNode = mSceneMgr->getRootSceneNode()->createChildSceneNode(Vector3 (0, 0, -500));
ent = mSceneMgr->createEntity("head", "razor.mesh");
headNode->attachObject(ent);
SceneNode *node;
PlaneMover *mover;
WaveformControllerFunction *moverFunction;
Controller<Real> *controller;
ControllerManager *mControllerManager = &ControllerManager::getSingleton ();
for (i = 0; i < NUMRAZORS; i++) {
ent = mSceneMgr->createEntity("razor" + StringConverter::toString (i), "razor.mesh");
node = headNode->createChildSceneNode (Vector3 (Math::RangeRandom (-SQUADRONSIZE / 2.0, SQUADRONSIZE / 2.0), Math::RangeRandom (2 * SQUADRONSIZE / 3.0, 0), Math::RangeRandom (0, -SQUADRONSIZE)));
node->attachObject(ent);
mover = new PlaneMover (node);
moverFunction = new WaveformControllerFunction (WFT_SINE, 0, Math::RangeRandom (0.01, 0.2), 0, 10);
controller = mControllerManager->createController (mControllerManager->getFrameTimeSource (), mover, moverFunction);
}
// Make sure the camera track this node
mCamera->setAutoTracking(true, headNode);
// Create jittered cameras
Camera *jitterCamera[NUMJITTERS];
for (i = 0; i < NUMJITTERS; i++) {
jitterCamera[i] = mSceneMgr->createCamera ("JitteredCamera" + StringConverter::toString (i));
jitterCamera[i]->setPosition (mCamera->getDerivedPosition ());
jitterCamera[i]->setAutoTracking (true, headNode);
}
mWindow->setPriority (100);
// Create the camera node & attach camera
SceneNode* camNode = mSceneMgr->getRootSceneNode()->createChildSceneNode();
camNode->attachObject(mCamera);
SceneNode *jitterNode;
for (i = 0; i < NUMJITTERS; i++) {
jitterNode = camNode->createChildSceneNode ();
Real angle = 2.0 * Math::PI * ((Real )i / (Real )NUMJITTERS);
jitterNode->setPosition (Vector3 (Math::Cos (angle), Math::Sin (angle), 0.0) * (Real )JITTERRADIUS);
jitterNode->attachObject (jitterCamera[i]);
LogManager::getSingleton ().logMessage ("Jittered camera created at: " + StringConverter::toString (jitterNode->getPosition ()));
}
// set up spline animation of node
Animation* anim = mSceneMgr->createAnimation("CameraTrack", 50);
// Spline it for nice curves
anim->setInterpolationMode(Animation::IM_SPLINE);
// Create a track to animate the camera's node
AnimationTrack* track = anim->createTrack(0, camNode);
// Setup keyframes
KeyFrame* key = track->createKeyFrame(0); // startposition
key = track->createKeyFrame(12.5);
key->setTranslate(Vector3(250,250,1000));
key = track->createKeyFrame(25);
key->setTranslate(Vector3(-1000,100,600));
key = track->createKeyFrame(37.5);
key->setTranslate(Vector3(0,-250,100));
key = track->createKeyFrame(50);
key->setTranslate(Vector3(0,0,0));
// Create a new animation state to track this
mAnimState = mSceneMgr->createAnimationState("CameraTrack");
mAnimState->setEnabled(true);
// Put in a bit of fog for the hell of it
mSceneMgr->setFog(FOG_EXP, ColourValue::White, 0.0002);
// Depth of field stuff :)
RenderTexture *jitterTexture[NUMJITTERS];
for (i = 0; i < NUMJITTERS; i++) {
jitterTexture[i] = mRoot->getRenderSystem ()->createRenderTexture ("JitterTexture" + StringConverter::toString (i), RTTSIZE, RTTSIZE);
jitterTexture[i]->addViewport (jitterCamera[i]);
jitterTexture[i]->getViewport (0)->setOverlaysEnabled (false);
}
Material *depthOfFieldMaterial = mSceneMgr->createMaterial ("DepthOfFieldMaterial");
TextureUnitState *tUnit;
for (i = 0; i < NUMJITTERS; i++) {
tUnit = depthOfFieldMaterial->getTechnique (0)->getPass (0)->createTextureUnitState ();
tUnit->setTextureName ("JitterTexture" + StringConverter::toString (i));
tUnit->setAlphaOperation (LBX_BLEND_MANUAL, LBS_MANUAL, LBS_CURRENT, 1.0 / (float )(NUMJITTERS+1), 1, 1);
tUnit->setColourOperation (LBO_ALPHA_BLEND);
}
depthOfFieldMaterial->setSceneBlending (SBT_TRANSPARENT_ALPHA);
depthOfFieldMaterial->setDepthCheckEnabled (false);
depthOfFieldMaterial->setDepthWriteEnabled (false);
Overlay *depthOfFieldOverlay = mSceneMgr->createOverlay ("DepthOfFieldOverlay", 10);
GuiElement *depthOfFieldPanel = GuiManager::getSingleton ().createGuiElement ("Panel", "DepthOfFieldPanel", false);
depthOfFieldPanel->setMaterialName ("DepthOfFieldMaterial");
depthOfFieldOverlay->add2D ((GuiContainer *)depthOfFieldPanel);
depthOfFieldOverlay->show ();
// End of depth of field :(
}
void createCamera (void) {
// Create the camera
mCamera = mSceneMgr->createCamera("PlayerCam");
mCamera->setPosition(Vector3(0,0,0));
}
// Create new frame listener
void createFrameListener(void)
{
mFrameListener= new CameraTrackListener(mWindow, mCamera);
mRoot->addFrameListener(mFrameListener);
}
};
#if OGRE_PLATFORM == PLATFORM_WIN32
#define WIN32_LEAN_AND_MEAN
#include "windows.h"
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )
#else
int main(int argc, char **argv)
#endif
{
// Create application object
CameraTrackApplication app;
try {
app.go();
} catch( Exception& e ) {
#if OGRE_PLATFORM == PLATFORM_WIN32
MessageBox( NULL, e.getFullDescription().c_str(), "An exception has occured!", MB_OK | MB_ICONERROR | MB_TASKMODAL);
#else
fprintf(stderr, "An exception has occured: %s\n",
e.getFullDescription().c_str());
#endif
}
return 0;
}
I know this thread is floody, and the samples (specially the DOF one) are slow...

I'm working on a coooool stereo 3D effect (red-blue glasses)

All of this apart of researching about shadows (don't worry, Sinbad
