Index: /GTP/trunk/App/Demos/Illum/Rain/include/RainFrameListener.h
===================================================================
--- /GTP/trunk/App/Demos/Illum/Rain/include/RainFrameListener.h	(revision 2221)
+++ /GTP/trunk/App/Demos/Illum/Rain/include/RainFrameListener.h	(revision 2221)
@@ -0,0 +1,75 @@
+
+///////////////////////////////////////////////////////////////////////////
+//
+//		Realistic rain real-time simulation program
+//
+//		Pierre Rousseau
+//
+///////////////////////////////////////////////////////////////////////////
+//
+//		Main camera, and external events (mouse/keyboard) handling
+//
+///////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef __RAIN_FRAME_LISTENER__
+#define __RAIN_FRAME_LISTENER__
+
+#include "CommonRain.h"
+#include "RainCloseDropsParticles.h"
+#include <ExampleFrameListener.h>
+
+
+
+
+/** RainFrameListener class
+  * processes keyboard and mouse events,
+  * and performs all computations needed for each frame
+  */
+class RainFrameListener : public ExampleFrameListener
+{
+private:
+
+    SceneNode *mViewNode, *mCameraNode;
+    Real timer;
+    CloseDropsParticles *mRainSystem;
+
+public:
+
+    /**
+     ** standard constructor
+     **  - the renderWindow and camera are needed for reglar initialization of the frame listener
+     **  - view node will only be translated (position of the observer and particle system)
+     **  - cameranode, which must be attached to viewNode, will be rotated to look in any direction
+     **  - syst is the particle system itself, which will need to be updated with user input, time since last frame...
+     */
+    RainFrameListener(RenderWindow* win, Camera* cam, SceneNode* ViewNode, SceneNode* CameraNode, CloseDropsParticles *syst);
+
+    /**
+     ** this function is called just before a frame gets rendered 
+     ** Contains reactions to user input (keyboard, mouse), and calls for particle system update
+     */
+    bool frameStarted(const FrameEvent& evt);
+
+    /**
+     ** this function is called just after a frame gets rendered
+     */
+    bool frameEnded(const FrameEvent& evt);
+
+protected:
+    /**
+     ** function to update the text of the overlay with fps stats
+     */
+    void updateStats(void);
+
+    /**
+     ** function to set a specific text on the stats overlay
+     */
+    void displayMessage(String text);
+};
+
+
+
+
+#endif //__RAIN_FRAME_LISTENER__
Index: /GTP/trunk/App/Demos/Illum/Rain/include/RainTextureFrameListener.h
===================================================================
--- /GTP/trunk/App/Demos/Illum/Rain/include/RainTextureFrameListener.h	(revision 2221)
+++ /GTP/trunk/App/Demos/Illum/Rain/include/RainTextureFrameListener.h	(revision 2221)
@@ -0,0 +1,47 @@
+
+///////////////////////////////////////////////////////////////////////////
+//
+//		Realistic rain real-time simulation program
+//
+//		Pierre Rousseau
+//
+///////////////////////////////////////////////////////////////////////////
+//
+//		Texture cameras handling
+//
+///////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef __RAIN_TEXTURE_FRAME_LISTENER__
+#define __RAIN_TEXTURE_FRAME_LISTENER__
+
+
+#include "CommonRain.h"
+#include "OgreRenderTargetListener.h"
+#include "ExampleApplication.h"
+
+
+
+/** TextureFrameListener class
+  * enables us not to see the particle systems in the textures we capture to texture our particles 
+  */
+class TextureFrameListener : public Ogre::RenderTargetListener
+{
+private :
+    SceneManager* mSceneMgr;
+
+public:
+    /** constructor used when rain is rendered with a particle system */
+    TextureFrameListener(SceneManager* SceneMgr);
+
+    /** pre-render operations, hides the rain system, so it is not seen in the captured texture */
+    void preRenderTargetUpdate (const Ogre::RenderTargetEvent &evt);
+
+    /** post-render operations, shows the hidden rain system */
+    void postRenderTargetUpdate (const Ogre::RenderTargetEvent &evt);
+};
+
+
+#endif //__RAIN_TEXTURE_FRAME_LISTENER__
+
Index: /GTP/trunk/App/Demos/Illum/Rain/include/RainCloseDropsParticles.h
===================================================================
--- /GTP/trunk/App/Demos/Illum/Rain/include/RainCloseDropsParticles.h	(revision 2221)
+++ /GTP/trunk/App/Demos/Illum/Rain/include/RainCloseDropsParticles.h	(revision 2221)
@@ -0,0 +1,171 @@
+
+///////////////////////////////////////////////////////////////////////////
+//
+//		Realistic rain real-time simulation program
+//
+//		Pierre Rousseau
+//
+///////////////////////////////////////////////////////////////////////////
+//
+//		Particle systems handling
+//
+///////////////////////////////////////////////////////////////////////////
+
+#ifndef __RAIN_CLOSE_DROPS_PARTICLES__
+#define __RAIN_CLOSE_DROPS_PARTICLES__
+
+
+#include "CommonRain.h"
+#include "RainTextureFrameListener.h"
+#include "RainManualHardwareBillboardMeshLoader.h"
+#include "RainLight.h"
+
+
+
+
+
+
+/** Class : CloseDropsParticles
+  * defines a rain system, with cameras and shaders
+  */
+class CloseDropsParticles
+{
+private :
+    SceneManager *mSceneMgr;
+    RainLightManager *mRainLightMgr;
+    SceneNode *mParticlesNode, *mParentCam, *mParentSyst;
+
+    // wide angle camera used to render the drops
+    Ogre::Camera *mCamera;
+    RenderTexture *dropsTexture;
+    MaterialPtr dropsTexturesMaterial;
+
+    // simulation textures, containing particle positions
+    unsigned int mActiveParticlesCount;
+    RenderTexture *particlePosTexture, *particlePosTextureBackup;
+
+    BillboardSet *bbSet1, *bbSet2; // billboardsets for ping-pong position textures
+
+
+public :
+    /** public variable : width of the particles */
+    float mRainWidth;
+    /** public variable : wheight of the particles (for streaks) */
+    float mRainStreaksHeight;
+
+
+    /** public functions */
+
+    /** constructor, taking in parameters :
+      *   - the SceneManager used in the scene
+      *   - the SceneNode to which the particle system should be attached
+      *   - the SceneNode to which the auxiliary camera (which we use to texture our drops) should be attached
+      */
+    CloseDropsParticles(SceneManager *sceneMgr, SceneNode *parentSyst, SceneNode *parentCam);
+
+    /** Destructor */
+    ~CloseDropsParticles();
+
+    /** function wich creates the lights (streetlights and bindings to light the drops) */
+    void createLights();
+
+    /** function to retrieve a pointer to the rainLightManager associate with this CloseDropsParticles */
+    RainLightManager *getLightManagerPtr();
+
+    /** function which updates the lights, if they are animated */
+    void updateLights();
+
+    /** function which creates the position texture and it's backup. should be called when initiaiting the rendering of the first frame (through frame listener) */
+    void definePosTextureAndBackup();
+
+    /** control function, to check what the textures look like */
+    void makeControlOverlay();
+
+    /** function to update one of the two position RTT's ; if set to true, the primary texture will be updated */
+    void updatePositionTexture(bool primary);
+
+    /** function to update the different shader parameters used to update the particles positions, or render them */
+    void updateFragmentProgramParameter(const String &name, float value);
+    /** function to update the different shader parameters used to update the particles positions, or render them */
+    void updateFragmentProgramParameter(const String &name, Ogre::Vector3 value);
+    /** function to update the different shader parameters used to update the particles positions, or render them */
+    void updateFragmentProgramParameter(const String &name, Ogre::Vector4 value);
+    /** function to update the different shader parameters used to update the particles positions, or render them */
+
+    /** function to update the different shader parameters used to update the particles positions, or render them */
+    void updateShaderParameters(float tslf, float rainBbSide, float streaksHeight, int nbLights,
+                                Vector3 viewPos, Vector3 viewDir, Vector3 fallVect, Vector3 boxMin, Vector3 boxMax, Vector3 lastMove, Vector3 randomMove, int useShader);
+
+
+    /** function to update the different shader parameters used to update the particles positions, or render them */
+    void updateTimeSinceLastFrame(float tslf);
+    /** function to update the different shader parameters used to update the particles positions, or render them */
+    void updateRainBilboardSideLength(float rainBbSide);
+    /** function to update the different shader parameters used to update the particles positions, or render them */
+    void updateStreaksHeight(float streaksHeight);
+    /** function to update the different shader parameters used to update the particles positions, or render them */
+    void updateLightCount(float nbLights);
+    /** function to update the different shader parameters used to update the particles positions, or render them */
+    void updateViewPos(Vector3 viewPos);
+    /** function to update the different shader parameters used to update the particles positions, or render them */
+    void updateViewDir(Vector3 viewDir);
+    /** function to update the different shader parameters used to update the particles positions, or render them */
+    void updateFallVector(Vector3 fallVect);
+    /** function to update the different shader parameters used to update the particles positions, or render them */
+    void updateBoxMin(Vector3 boxMin);
+    /** function to update the different shader parameters used to update the particles positions, or render them */
+    void updateBoxMax(Vector3 boxMax);
+    /** function to update the different shader parameters used to update the particles positions, or render them */
+    void updateLastMove(Vector3 lastMove);
+    /** function to update the different shader parameters used to update the particles positions, or render them */
+    void updateRandomMove(Vector3 randomMove);
+
+    /** functions which hide the particle position billboards.
+        billboards must be hidden when rendering the scene, and visible when updating the position texture */
+    void hidePositionBillboards()
+    {
+        bbSet1->setVisible(false);
+        bbSet2->setVisible(false);
+    }
+    /** functions which show the particle position billboards.
+        billboards must be hidden when rendering the scene, and visible when updating the position texture */
+    void showPositionBillboards()
+    {
+        bbSet1->setVisible(true);
+        bbSet2->setVisible(true);
+    }
+
+private :
+
+    /** this function defines the material used to texture the particles */
+    void createMaterial(String name);
+
+    /** creation of the auxiliary camera used to texture our particles */
+    Camera* createDropsCamera();
+
+    /** definition of the shader parameters used for the particles material */
+    void GPUmaterial();
+    
+    /** function used to initialize the position texture */
+    void initializeBillboardsPositionTexture();
+    
+    /** function which creates a simple quad mesh to use on our hardware billboards */
+    MeshPtr createHardwareBillboardMesh(String materialName, String meshName=BILLBOARD_MESH_NAME);
+
+    /** function to update a billboard mesh created as a manual resource, used to give it the appropriate texture coordinates */
+    void modifyClonedHardwareBillboardMesh(MeshPtr &msh, int partNumber);
+
+    /** function which initializes the vertex buffers and textures */
+    void initParticles();
+    
+    /** function which defines the position renderTexture */
+    void createBillboardsPositionRenderTexture(RenderTexture *PSPosTexture, Vector3 nodePos, BillboardSet *bbSet);
+
+    /** function which defines the material used to update the particles position texture */
+    void createBillboardsPositionTextureMaterial(String inputTextureName);
+};
+
+
+
+
+#endif // __RAIN_CLOSE_DROPS_PARTICLES__
Index: /GTP/trunk/App/Demos/Illum/Rain/include/RainLight.h
===================================================================
--- /GTP/trunk/App/Demos/Illum/Rain/include/RainLight.h	(revision 2221)
+++ /GTP/trunk/App/Demos/Illum/Rain/include/RainLight.h	(revision 2221)
@@ -0,0 +1,119 @@
+
+///////////////////////////////////////////////////////////////////////////
+//
+//		Realistic rain real-time simulation program
+//
+//		Pierre Rousseau
+//
+///////////////////////////////////////////////////////////////////////////
+//
+//		Light Handling
+//
+///////////////////////////////////////////////////////////////////////////
+
+
+#ifndef __RAIN_LIGHT__
+#define __RAIN_LIGHT__
+
+
+
+#include "CommonRain.h"
+#include "ExampleApplication.h"
+#include <vector>
+
+
+
+
+/** RainLight class
+  * enables a change of appearance of raindrops close to a light source
+  */
+class RainLight
+{
+private :
+    SceneManager *mSceneMgr;
+    SceneNode *mLightNode;
+    SceneNode *mConeNode;
+    BillboardSet *mBillboardSet;
+    Billboard *mBillboard;
+
+    ColourValue mColour;
+    Vector3 mLightPos, mLightInitialPos, mLightDir;
+    float mLightCutoff, mLightAttenuation;
+    bool isAnimated;
+
+
+    float stepH1, stepH2, stepH3, stepV1, stepV2;
+    float h1, h2, h3;
+    float v1, v2;
+
+public :
+    /** Constructor for street light. Should not be called directly. Use RainLightManager->addStreetLight() instead.*/
+    RainLight(SceneManager *sceneMgr, int lightNumber = 0, ColourValue col = ColourValue::Red, Vector3 LightPos = Vector3(0, 0, 0), float LightAttenuation = 150);
+
+    void animate();
+
+    ColourValue getColour()
+    {
+        return mColour;
+    }
+
+    Vector3 getPosition()
+    {
+        return mLightPos;
+    }
+
+    Vector3 getDirection()
+    {
+        return mLightDir;
+    }
+
+    float getCutoff()
+    {
+        return mLightCutoff;
+    }
+
+    float getAttenuation()
+    {
+        return mLightAttenuation;
+    }
+
+    bool getIsAnimated()
+    {
+        return isAnimated;
+    }
+
+};
+
+
+
+class RainLightManager
+{
+private :
+    int lightCount;
+    std::vector<RainLight *> lightVector;
+    SceneManager *mSceneMgr;
+
+public :
+    RainLightManager(SceneManager *sceneMgr);
+
+    ~RainLightManager();
+
+    int getLightCount()
+    {
+        return lightCount;
+    }
+
+    void addStreetLight(ColourValue col = ColourValue::Red + ColourValue::Green + ColourValue::Blue, Vector3 LightPos = Vector3(0, 0, 0), float LightAttenuation = 150);
+
+    /** defines the light information texture, used by the particles to get lighted */
+    void createLightInfoTexture();
+
+    void updateLightInfoTexture();
+
+    void updateLights();
+
+    void finalizeLights();
+};
+
+#endif // __RAIN_LIGHT__
+
Index: /GTP/trunk/App/Demos/Illum/Rain/include/CommonRain.h
===================================================================
--- /GTP/trunk/App/Demos/Illum/Rain/include/CommonRain.h	(revision 2221)
+++ /GTP/trunk/App/Demos/Illum/Rain/include/CommonRain.h	(revision 2221)
@@ -0,0 +1,105 @@
+
+///////////////////////////////////////////////////////////////////////////
+//
+//		Realistic rain real-time simulation program
+//
+//		Pierre Rousseau
+//
+///////////////////////////////////////////////////////////////////////////
+//
+//		Global definitions
+//
+///////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef __COMMON_RAIN__
+#define __COMMON_RAIN__
+
+
+////////////////////////////////////////////////////////////
+/// determine what the program will look like
+////////////////////////////////////////////////////////////
+
+// currently incompatible with STREAKS or LIGHT_EXTENSION :
+//#define SNOW
+
+#ifndef SNOW
+#define STREAKS
+
+//#define LIGHT_EXTENSION
+#endif
+
+
+
+
+
+
+////////////////////////////////////////////////////////////
+/// this constant defines the size (in pixels) of the
+/// position texture. 
+/// There will be (BILLBOARD_POS_TEX_SIZE) ²
+/// particles in the system.
+////////////////////////////////////////////////////////////
+#define BILLBOARD_POS_TEX_SIZE 	64
+
+
+
+
+
+
+////////////////////////////////////////////////////////////
+/// Constants for the program
+////////////////////////////////////////////////////////////
+// size of the "render to texture" : if using frame buffer copy, must be less than the frame buffer size
+#define RTTSIZE 512
+
+#define _PI 3.1415926535
+#define FOVyCam (_PI/3.0)
+#define FOVyRtt (15.0 * _PI / 18.0)
+
+// arbitrary unit = 0.1m
+#define HAUTEUR_OBSERVATEUR 18.0
+
+
+
+////////////////////////////////////////////////////////////
+/// Values for the hardware implementation
+/// of the particle system
+////////////////////////////////////////////////////////////
+
+
+#define PARTICLE_POSITION_TEXTURE_NAME		"floating_point_RTT_ping"
+#define PARTICLE_POSITION_BACKUP_TEXTURE_NAME	"floating_point_RTT_pong"
+#define PARTICLE_POSITION_INIT_TEXTURE_NAME	"floating_point_initializer"
+
+#define STATIC_GEOMETRY_NAME	"billboards_in_vertex_buffer"
+
+
+#define LIGHT_INFO_TEXTURE_NAME		"light_information_texture"
+
+#define BILLBOARD_MESH_NAME		"cloned_manual_mesh"
+
+#define RAIN_MATERIAL_NAME		"rain_system_material"
+
+#define REFRACT_RTT_NAME		"refract_rtt"
+
+
+#define PARTICLES_MIN_X		-2000
+#define PARTICLES_MAX_X		 2000
+#define PARTICLES_MIN_Y		  -10
+#define PARTICLES_MAX_Y		  100
+#define PARTICLES_MIN_Z		-2000
+#define PARTICLES_MAX_Z		 2000
+
+
+
+#define VIS_PARTICLE_BOX_MIN_X		-50
+#define VIS_PARTICLE_BOX_MAX_X		 50
+#define VIS_PARTICLE_BOX_MIN_Y		-20
+#define VIS_PARTICLE_BOX_MAX_Y		 80
+#define VIS_PARTICLE_BOX_MIN_Z		-50
+#define VIS_PARTICLE_BOX_MAX_Z		 50
+
+
+#endif // __COMMON_RAIN__
Index: /GTP/trunk/App/Demos/Illum/Rain/include/RainManualHardwareBillboardMeshLoader.h
===================================================================
--- /GTP/trunk/App/Demos/Illum/Rain/include/RainManualHardwareBillboardMeshLoader.h	(revision 2221)
+++ /GTP/trunk/App/Demos/Illum/Rain/include/RainManualHardwareBillboardMeshLoader.h	(revision 2221)
@@ -0,0 +1,136 @@
+
+///////////////////////////////////////////////////////////////////////////
+//
+//		Realistic rain real-time simulation program
+//
+//		Pierre Rousseau
+//
+///////////////////////////////////////////////////////////////////////////
+//
+//		Definition of the mesh for the particles
+//
+///////////////////////////////////////////////////////////////////////////
+
+
+#ifndef __HARDWARE_BILLBOARD_LOADER__
+#define __HARDWARE_BILLBOARD_LOADER__
+
+
+#include <OgreResource.h>
+
+
+
+class ManualHardwareBillboardMeshLoader : public ManualResourceLoader
+{
+private :
+    String mMaterialName;
+
+public :
+
+    ManualHardwareBillboardMeshLoader(String materialName)
+    {
+        mMaterialName = materialName;
+    }
+
+
+    void loadResource(Resource *res)
+    {
+        Mesh* msh = static_cast<Mesh*>(res);
+        SubMesh* sm = msh->createSubMesh();
+        sm->useSharedVertices = false;
+        sm->vertexData = new VertexData();
+        sm->vertexData->vertexStart = 0;
+        sm->vertexData->vertexCount = 4;
+        VertexDeclaration* dcl = sm->vertexData->vertexDeclaration;
+        size_t offset = 0;
+        dcl->addElement(0, offset, VET_FLOAT3, VES_POSITION);
+        offset += VertexElement::getTypeSize(VET_FLOAT3);
+        dcl->addElement(0, offset, VET_FLOAT4, VES_TEXTURE_COORDINATES); // xy will serve as regular texCoords, zw, for positionning in the texture
+        offset += VertexElement::getTypeSize(VET_FLOAT4);
+
+        HardwareVertexBufferSharedPtr vbuf = HardwareBufferManager::getSingleton().createVertexBuffer(offset, 4, HardwareBuffer::HBU_STATIC_WRITE_ONLY);
+        float* pReal = static_cast<float*>(vbuf->lock(HardwareBuffer::HBL_DISCARD));
+
+
+        // vertex 0
+        // position
+        *pReal++ = 0;
+        *pReal++ = 0;
+        *pReal++ = 0;
+        // uv
+        *pReal++ = 1;
+        *pReal++ = 0;
+        // position texture coordinates
+        *pReal++ = 0;
+        *pReal++ = 0;
+
+        // vertex 1
+        // position
+        *pReal++ = 0;
+        *pReal++ = 0;
+        *pReal++ = 0;
+        // uv
+        *pReal++ = 0;
+        *pReal++ = 0;
+        // position texture coordinates
+        *pReal++ = 0;
+        *pReal++ = 0;
+
+        // vertex 2
+        // position
+        *pReal++ = 0;
+        *pReal++ = 0;
+        *pReal++ = 0;
+        // uv
+        *pReal++ = 0;
+        *pReal++ = 1;
+        // position texture coordinates
+        *pReal++ = 0;
+        *pReal++ = 0;
+
+        // vertex 3
+        // position
+        *pReal++ = 0;
+        *pReal++ = 0;
+        *pReal++ = 0;
+        // uv
+        *pReal++ = 1;
+        *pReal++ = 1;
+        // position texture coordinates
+        *pReal++ = 0;
+        *pReal++ = 0;
+
+
+        vbuf->unlock();
+
+        sm->vertexData->vertexBufferBinding->setBinding(0, vbuf);
+        sm->indexData->indexCount = 6;
+        sm->indexData->indexBuffer = HardwareBufferManager::getSingleton()
+                                     .createIndexBuffer(HardwareIndexBuffer::IT_16BIT, 6,
+                                                        HardwareBuffer::HBU_STATIC_WRITE_ONLY);
+        uint16* pI = static_cast<uint16*>(
+                         sm->indexData->indexBuffer->lock(HardwareBuffer::HBL_DISCARD))
+                     ;
+
+        // we link vertices 0, 1, and 2
+        *pI++ = 0;
+        *pI++ = 1;
+        *pI++ = 2;
+
+        // second triangle : we link vertices 0, 2, and 3
+        *pI++ = 0;
+        *pI++ = 2;
+        *pI++ = 3;
+
+        sm->indexData->indexBuffer->unlock();
+
+        sm->setMaterialName(mMaterialName);
+
+
+        msh->_setBounds(AxisAlignedBox(0,0,0,0,0,0), true);
+        msh->_setBoundingSphereRadius(1);
+    }
+};
+
+
+#endif //__HARDWARE_BILLBOARD_LOADER__
Index: /GTP/trunk/App/Demos/Illum/Rain/rain.sln
===================================================================
--- /GTP/trunk/App/Demos/Illum/Rain/rain.sln	(revision 2221)
+++ /GTP/trunk/App/Demos/Illum/Rain/rain.sln	(revision 2221)
@@ -0,0 +1,20 @@
+﻿
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual C++ Express 2005
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "rain", "rain.vcproj", "{BF9454C7-33EA-48FF-B289-4440775C1DF7}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Win32 = Debug|Win32
+		Release|Win32 = Release|Win32
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{BF9454C7-33EA-48FF-B289-4440775C1DF7}.Debug|Win32.ActiveCfg = Debug|Win32
+		{BF9454C7-33EA-48FF-B289-4440775C1DF7}.Debug|Win32.Build.0 = Debug|Win32
+		{BF9454C7-33EA-48FF-B289-4440775C1DF7}.Release|Win32.ActiveCfg = Release|Win32
+		{BF9454C7-33EA-48FF-B289-4440775C1DF7}.Release|Win32.Build.0 = Release|Win32
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal
Index: /GTP/trunk/App/Demos/Illum/Rain/src/RainCloseDropsParticles.cpp
===================================================================
--- /GTP/trunk/App/Demos/Illum/Rain/src/RainCloseDropsParticles.cpp	(revision 2221)
+++ /GTP/trunk/App/Demos/Illum/Rain/src/RainCloseDropsParticles.cpp	(revision 2221)
@@ -0,0 +1,861 @@
+
+///////////////////////////////////////////////////////////////////////////
+//
+//		Realistic rain real-time simulation program
+//
+//		Pierre Rousseau
+//
+///////////////////////////////////////////////////////////////////////////
+//
+//		Particle systems handling
+//
+///////////////////////////////////////////////////////////////////////////
+
+
+#include "windows.h"
+#include "RainCloseDropsParticles.h"
+#include <OgreHardwarePixelBuffer.h>
+using namespace std;
+
+
+extern float startPos[3];
+
+
+
+
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+
+CloseDropsParticles::CloseDropsParticles(SceneManager *sceneMgr, SceneNode *parentSyst, SceneNode *parentCam)
+{
+    mSceneMgr = sceneMgr;
+    mParentCam = parentCam;
+    mParentSyst = parentSyst;
+
+	// CHANGE THE FOLLOWING PARAMETERS TO MODIFY THE SIZES OF THE PARTICLES
+    mRainWidth = 0.2f;	// ranging from 0.1 to 0.9
+    mRainStreaksHeight = 1.0;
+    mActiveParticlesCount = BILLBOARD_POS_TEX_SIZE * BILLBOARD_POS_TEX_SIZE;
+
+    mParticlesNode = parentSyst->createChildSceneNode();
+
+    mRainLightMgr = new RainLightManager(mSceneMgr);
+    createLights();
+
+    std::cout << "creating rain system" << std::endl << std::endl;
+    initParticles();
+}
+
+
+
+
+
+CloseDropsParticles::~CloseDropsParticles()
+{
+    mSceneMgr->destroyStaticGeometry(STATIC_GEOMETRY_NAME);
+    cout << "Particles destructed." << endl;
+}
+
+
+
+
+void CloseDropsParticles::createLights()
+{
+    mSceneMgr->setAmbientLight(ColourValue(1.0, 1.0, 1.0));
+
+    mRainLightMgr->addStreetLight(ColourValue::Green, Vector3(startPos[0] + 100 , startPos[1] - HAUTEUR_OBSERVATEUR, startPos[2] + 20), 120); // green light
+    mRainLightMgr->addStreetLight(ColourValue::Red, Vector3(startPos[0] + 130 , startPos[1] - HAUTEUR_OBSERVATEUR, startPos[2] + 60), 120); // red light
+    mRainLightMgr->addStreetLight(ColourValue::Red + ColourValue::Green + ColourValue::Blue, Vector3(startPos[0] + 160 , startPos[1] - HAUTEUR_OBSERVATEUR, startPos[2] + 100), 120); // white light
+
+
+    mRainLightMgr->finalizeLights();
+}
+
+
+
+
+RainLightManager *CloseDropsParticles::getLightManagerPtr()
+{
+    return mRainLightMgr;
+}
+
+
+
+
+void CloseDropsParticles::updateLights()
+{
+    mRainLightMgr->updateLights();
+}
+
+
+
+void CloseDropsParticles::createBillboardsPositionRenderTexture(RenderTexture *PSPosTexture, Vector3 nodePos, BillboardSet *bbSet)
+{
+    //initialize the render to texture related stuff
+
+    String camName = "camera_for_" + PSPosTexture->getName();
+    Camera *PSPosCamera = new Ogre::Camera(camName, mSceneMgr);
+
+    SceneNode *mPSPosCamNode = mSceneMgr->getRootSceneNode()->createChildSceneNode();
+    mPSPosCamNode->setPosition(nodePos);
+    mPSPosCamNode->attachObject(PSPosCamera);
+
+    PSPosCamera->setPosition(Vector3(0, 0, 0));
+    PSPosCamera->setNearClipDistance( 10 );
+    PSPosCamera->setFarClipDistance( 12 );
+    PSPosCamera->setFOVy(Ogre::Radian(Ogre::Degree(90)));
+    PSPosCamera->setProjectionType(PT_ORTHOGRAPHIC );
+    PSPosCamera->setAspectRatio(1.0);
+
+    mPSPosCamNode->attachObject(bbSet);
+
+    Billboard *mBillboard = bbSet->createBillboard(Vector3(0, 0, -11));
+    mBillboard->setDimensions(20, 20);
+    mBillboard->setColour(ColourValue::White);
+
+    TextureFrameListener *textureLis = new TextureFrameListener(mSceneMgr);
+
+    PSPosTexture->addListener(textureLis);
+    PSPosTexture->addViewport(PSPosCamera);
+    PSPosTexture->getViewport (0)->setOverlaysEnabled (false);
+    PSPosTexture->getViewport (0)->setClearEveryFrame(true);
+
+    PSPosTexture->setAutoUpdated(false);
+}
+
+
+
+
+
+void CloseDropsParticles::createBillboardsPositionTextureMaterial(String inputTextureName)
+{
+    MaterialPtr posTextureMaterial = MaterialManager::getSingleton().create("rtt_material_using_" + inputTextureName, ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
+
+    // alpha rejection mustn't be set, to avoid breaking the FBO
+
+    TextureUnitState *tPosSrcUnit = posTextureMaterial->getTechnique (0)->getPass (0)->createTextureUnitState ();
+    tPosSrcUnit->setTextureName (inputTextureName);
+    tPosSrcUnit->setTextureFiltering (FO_POINT, FO_POINT, FO_NONE );
+    tPosSrcUnit->setTextureAddressingMode(Ogre::TextureUnitState::TAM_CLAMP); // mode clamp for this texture
+
+    posTextureMaterial->setDepthCheckEnabled (true);
+    posTextureMaterial->setDepthWriteEnabled (true);
+
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    // shader part
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+    String progName;
+
+    // fragment program which will map the generated textures
+    progName = "billboardPosTexUpdater" + inputTextureName;
+    HighLevelGpuProgramPtr fp = HighLevelGpuProgramManager::getSingleton().createProgram(progName, ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, "cg", GPT_FRAGMENT_PROGRAM);
+    fp->setSourceFile("billboardPosTexUpdaterFP.cg");
+    fp->setParameter("profiles", "ps_2_x arbfp1");
+
+    fp->setParameter("entry_point", "main");
+
+    posTextureMaterial->getTechnique (0)->getPass (0)->setFragmentProgram (progName);
+
+    posTextureMaterial->compile();
+}
+
+
+
+void CloseDropsParticles::definePosTextureAndBackup()
+{
+    String tmp;
+
+    // first : define the "primary" and "secondary" RTT's
+    tmp = String("billboardset_for_") + PARTICLE_POSITION_TEXTURE_NAME;
+    bbSet1 = mSceneMgr->createBillboardSet(tmp);
+    particlePosTexture = Root::getSingleton().getRenderSystem()->createRenderTexture (PARTICLE_POSITION_TEXTURE_NAME, BILLBOARD_POS_TEX_SIZE, BILLBOARD_POS_TEX_SIZE, TEX_TYPE_2D, PF_FLOAT32_RGB);
+    createBillboardsPositionRenderTexture(particlePosTexture, Vector3(0, 10, 0), bbSet1);
+
+    tmp = String("billboardset_for_") + PARTICLE_POSITION_BACKUP_TEXTURE_NAME;
+    bbSet2 = mSceneMgr->createBillboardSet(tmp);
+
+    // particlePosTextureBackup was already created and initialized
+    particlePosTextureBackup = Root::getSingleton().getRenderSystem()->createRenderTexture (PARTICLE_POSITION_BACKUP_TEXTURE_NAME, BILLBOARD_POS_TEX_SIZE, BILLBOARD_POS_TEX_SIZE, TEX_TYPE_2D, PF_FLOAT32_RGB);
+
+    createBillboardsPositionRenderTexture(particlePosTextureBackup, Vector3(100, 10, 0), bbSet2);
+
+    // initialization
+    createBillboardsPositionTextureMaterial(PARTICLE_POSITION_INIT_TEXTURE_NAME);
+    tmp = String("rtt_material_using_") + PARTICLE_POSITION_INIT_TEXTURE_NAME;
+    bbSet2->setMaterialName(tmp);
+
+    particlePosTextureBackup->update();
+
+    // create and bind the materials used for the billboardSets
+    createBillboardsPositionTextureMaterial(PARTICLE_POSITION_BACKUP_TEXTURE_NAME);
+    tmp = String("rtt_material_using_") + PARTICLE_POSITION_BACKUP_TEXTURE_NAME;
+    bbSet1->setMaterialName(tmp);
+
+    // now it's initialized, set it to normal rendering
+    createBillboardsPositionTextureMaterial(PARTICLE_POSITION_TEXTURE_NAME);
+    tmp = String("rtt_material_using_") + PARTICLE_POSITION_TEXTURE_NAME;
+    bbSet2->setMaterialName(tmp);
+
+}
+
+
+
+
+void CloseDropsParticles::initializeBillboardsPositionTexture()
+{
+    // initialize the texture
+    TexturePtr InitializationBillBoardPositionTexture = TextureManager::getSingleton().createManual(
+                PARTICLE_POSITION_INIT_TEXTURE_NAME, // name
+                ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
+                TEX_TYPE_2D,      // type
+                BILLBOARD_POS_TEX_SIZE, BILLBOARD_POS_TEX_SIZE,         // width & height
+                0,                // number of mipmaps
+                PF_FLOAT32_RGB,     // pixel format
+                TU_DYNAMIC_WRITE_ONLY_DISCARDABLE);
+
+    // Get the pixel buffer
+    HardwarePixelBufferSharedPtr pixelBuffer = InitializationBillBoardPositionTexture->getBuffer();
+
+    // Lock the pixel buffer and get a pixel box
+    pixelBuffer->lock(HardwareBuffer::HBL_DISCARD); // for best performance use HBL_DISCARD!
+    const PixelBox& pixelBox = pixelBuffer->getCurrentLock();
+
+    float* pDest = static_cast<float*>(pixelBox.data);
+
+    /////////////////////////////////////////////////
+    //  (indPart%100) * 10 - 500, 10, (indPart/100) * 10 - 1000
+    //  ((i + j * BILLBOARD_POS_TEX_SIZE )% 100) * 10 - 500, 10, ((i + j * BILLBOARD_POS_TEX_SIZE) / 100) * 10 - 1000
+    /////////////////////////////////////////////////
+
+    // Fill in some pixel data.
+    for (size_t j = 0; j < BILLBOARD_POS_TEX_SIZE; j++)
+        for(size_t i = 0; i < BILLBOARD_POS_TEX_SIZE; i++)
+        {
+            if (i + j * BILLBOARD_POS_TEX_SIZE < mActiveParticlesCount)
+            {
+                // the drops are initially positionned on a regular horizontal grid, with random altitude.
+                *pDest++ = i / float(BILLBOARD_POS_TEX_SIZE);		// R -> X
+                *pDest++ = (rand() % 10000) / 10000.0f;			// G -> Y
+                *pDest++ = j / float(BILLBOARD_POS_TEX_SIZE);		// B -> Z
+            }
+            else
+            {
+                *pDest++ = 0.0;		// R -> X
+                *pDest++ = 0.0;		// G -> Y
+                *pDest++ = 0.0;		// B -> Z
+            }
+        }
+
+    // Unlock the pixel buffer
+    pixelBuffer->unlock();
+
+    InitializationBillBoardPositionTexture->load();
+
+}
+
+
+
+
+void CloseDropsParticles::makeControlOverlay()
+{
+    MaterialPtr posTextureVerifMaterial1 = MaterialManager::getSingleton().create("overlayVerif1", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
+
+    posTextureVerifMaterial1->getTechnique (0)->getPass (0)->setAlphaRejectSettings(CMPF_NOT_EQUAL, 0);
+    TextureUnitState *tUnitVerif = posTextureVerifMaterial1->getTechnique (0)->getPass (0)->createTextureUnitState ();
+    
+	//tUnitVerif->setTextureName (REFRACT_RTT_NAME);
+	tUnitVerif->setTextureName (PARTICLE_POSITION_TEXTURE_NAME);
+
+    tUnitVerif->setTextureFiltering (TFO_NONE );
+    tUnitVerif->setTextureAddressingMode(Ogre::TextureUnitState::TAM_CLAMP); // mode clamp for this texture
+
+    posTextureVerifMaterial1->compile();
+
+
+    OverlayElement *posTexPanel1 = OverlayManager::getSingleton ().createOverlayElement ("Panel", "PosTexPanel1", false);
+    posTexPanel1->setDimensions(0.15, 0.2);
+    posTexPanel1->setPosition(0.01, 0.01);
+    posTexPanel1->setMaterialName ("overlayVerif1");
+
+    MaterialPtr posTextureVerifMaterial2 = posTextureVerifMaterial1->clone("overlayVerif2");
+    TextureUnitState *tUnitVerif2 = posTextureVerifMaterial2->getTechnique (0)->getPass (0)->getTextureUnitState (0);
+
+    tUnitVerif2->setTextureName (LIGHT_INFO_TEXTURE_NAME);
+
+    tUnitVerif2->setTextureFiltering (TFO_NONE );
+    tUnitVerif2->setTextureAddressingMode(Ogre::TextureUnitState::TAM_CLAMP);
+
+    posTextureVerifMaterial2->compile();
+
+
+    OverlayElement *posTexPanel2 = OverlayManager::getSingleton ().createOverlayElement ("Panel", "PosTexPanel2", false);
+    posTexPanel2->setDimensions(0.15, 0.01);
+    //posTexPanel2->setDimensions(0.15, 0.2);
+    posTexPanel2->setPosition(0.01, 0.22);
+    posTexPanel2->setMaterialName ("overlayVerif2");
+
+    Overlay *posTexOverlay = OverlayManager::getSingleton ().create("PositionTextureOverlay");
+    posTexOverlay->add2D ((OverlayContainer *)posTexPanel1);
+    posTexOverlay->add2D ((OverlayContainer *)posTexPanel2);
+    posTexOverlay->show ();
+}
+
+
+
+
+
+
+
+
+MeshPtr CloseDropsParticles::createHardwareBillboardMesh(String materialName, String meshName)
+{
+    MeshPtr msh = MeshManager::getSingleton().createManual(meshName,
+                  ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
+                  new ManualHardwareBillboardMeshLoader(materialName));
+
+    msh->load();
+
+    return msh;
+}
+
+
+
+
+
+
+void CloseDropsParticles::modifyClonedHardwareBillboardMesh(MeshPtr &msh, int partNumber)
+{
+    SubMesh* sm = msh->getSubMesh(0);
+
+    Ogre::VertexData* vertex_data = sm->vertexData;
+
+    const Ogre::VertexElement* texCoordsElem = vertex_data->vertexDeclaration->findElementBySemantic(Ogre::VES_TEXTURE_COORDINATES);
+    Ogre::HardwareVertexBufferSharedPtr vbuf = vertex_data->vertexBufferBinding->getBuffer(texCoordsElem->getSource());
+    unsigned char* vertex = static_cast<unsigned char*>(vbuf->lock(Ogre::HardwareBuffer::HBL_DISCARD))
+                            ;
+    float* pReal;
+
+    // vertex 0
+    texCoordsElem->baseVertexPointerToElement(vertex, &pReal);
+    // uv
+    *pReal++ = 1;
+    *pReal++ = 0;
+    // position texture coordinates
+    *pReal++ = float(partNumber % BILLBOARD_POS_TEX_SIZE) / float(BILLBOARD_POS_TEX_SIZE);
+    *pReal++ = float(partNumber / BILLBOARD_POS_TEX_SIZE) / float(BILLBOARD_POS_TEX_SIZE);
+
+    // vertex 1
+    vertex += vbuf->getVertexSize();
+    texCoordsElem->baseVertexPointerToElement(vertex, &pReal);
+    // uv
+    *pReal++ = 0;
+    *pReal++ = 0;
+    // position texture coordinates
+    *pReal++ = float(partNumber % BILLBOARD_POS_TEX_SIZE) / float(BILLBOARD_POS_TEX_SIZE);
+    *pReal++ = float(partNumber / BILLBOARD_POS_TEX_SIZE) / float(BILLBOARD_POS_TEX_SIZE);
+
+    // vertex 2
+    vertex += vbuf->getVertexSize();
+    texCoordsElem->baseVertexPointerToElement(vertex, &pReal);
+    // uv
+    *pReal++ = 0;
+    *pReal++ = 1;
+    // position texture coordinates
+    *pReal++ = float(partNumber % BILLBOARD_POS_TEX_SIZE) / float(BILLBOARD_POS_TEX_SIZE);
+    *pReal++ = float(partNumber / BILLBOARD_POS_TEX_SIZE) / float(BILLBOARD_POS_TEX_SIZE);
+
+    // vertex 3
+    vertex += vbuf->getVertexSize();
+    texCoordsElem->baseVertexPointerToElement(vertex, &pReal);
+    // uv
+    *pReal++ = 1;
+    *pReal++ = 1;
+    // position texture coordinates
+    *pReal++ = float(partNumber % BILLBOARD_POS_TEX_SIZE) / float(BILLBOARD_POS_TEX_SIZE);
+    *pReal++ = float(partNumber / BILLBOARD_POS_TEX_SIZE) / float(BILLBOARD_POS_TEX_SIZE);
+
+
+    vbuf->unlock();
+
+    msh->load();
+}
+
+
+
+
+
+void CloseDropsParticles::initParticles()
+{
+    StaticGeometry *s;
+
+    // we create the texture which will be used to update the particles positions.
+    initializeBillboardsPositionTexture();
+
+    createMaterial(RAIN_MATERIAL_NAME);
+
+    // we create the billboards as static geometry in a vertex buffer on the graphics card. The positions will only be modified in a shader
+    s = mSceneMgr->createStaticGeometry(STATIC_GEOMETRY_NAME);
+
+    // we must set our region parameters so that only one region includes all the geometry
+    s->setOrigin(Vector3(-5000, -500, -5000));
+    s->setRegionDimensions(Vector3(10000, 1000, 10000));
+    s->setRenderingDistance(100000);
+
+    int discreetSize = int(sqrt(BILLBOARD_POS_TEX_SIZE * BILLBOARD_POS_TEX_SIZE / 3.0));
+
+    cout << endl << endl << "Loading " << BILLBOARD_POS_TEX_SIZE * BILLBOARD_POS_TEX_SIZE << " particles" << endl;
+
+    // we should position the particles so that they cover the whole world (to avoid clipping)
+    for (int indPart = 0; indPart < BILLBOARD_POS_TEX_SIZE * BILLBOARD_POS_TEX_SIZE; indPart++)
+    {
+        String meshName = BILLBOARD_MESH_NAME + StringConverter::toString(indPart);
+        // define the billboard (quad) mesh to use
+        modifyClonedHardwareBillboardMesh(createHardwareBillboardMesh(RAIN_MATERIAL_NAME, meshName), indPart);
+
+        String entName = "simple_quad_for_hardware_bilboard_" + StringConverter::toString(indPart);
+        Entity *e = mSceneMgr->createEntity(entName, meshName);
+        e->setQueryFlags(0x00000002);
+
+        float indX = float( (indPart / 3) % discreetSize ) / float(discreetSize);
+        float indY = (indPart % 3) / 2.0;  // three stories of droplets
+        float indZ = float( (indPart / 3) / discreetSize ) / float(discreetSize);
+
+        Vector3 pos(PARTICLES_MIN_X + (PARTICLES_MAX_X - PARTICLES_MIN_X) * indX ,
+                    PARTICLES_MIN_Y + (PARTICLES_MAX_Y - PARTICLES_MIN_Y) * indY ,
+                    PARTICLES_MIN_Z + (PARTICLES_MAX_Z - PARTICLES_MIN_Z) * indZ); // we give each particle a different position, to avoid clipping
+
+		s->addEntity(e, pos);
+
+
+        // progress bar
+        printf("|");
+        int discret = 50;
+        int prog = int (discret * indPart / (BILLBOARD_POS_TEX_SIZE * BILLBOARD_POS_TEX_SIZE) );
+        for (int car=0 ; car <= prog ; car++)
+            printf("#");
+        for (int car=prog+1 ; car <= discret ; car++)
+            printf(" ");
+        printf("|\r");
+    }
+
+    s->build();
+
+    cout << endl << endl << "Particles loaded" << endl << endl;
+}
+
+
+
+
+void CloseDropsParticles::updatePositionTexture(bool primary)
+{
+    if (static_cast<MaterialPtr>(MaterialManager::getSingleton().getByName(RAIN_MATERIAL_NAME))->
+            getTechnique (0)->getPass (0)->getTextureUnitState (1)->isBlank())
+    {
+        std::cout << "merde !!!" << std::endl;
+    }
+
+    if (primary)
+    {
+        particlePosTexture->update();
+        static_cast<MaterialPtr>(MaterialManager::getSingleton().getByName(RAIN_MATERIAL_NAME))->getTechnique (0)->getPass (0)->getTextureUnitState (1)->setTextureName(PARTICLE_POSITION_TEXTURE_NAME);
+        static_cast<MaterialPtr>(MaterialManager::getSingleton().getByName(RAIN_MATERIAL_NAME))->compile();
+    }
+    else
+    {
+        particlePosTextureBackup->update();
+        static_cast<MaterialPtr>(MaterialManager::getSingleton().getByName(RAIN_MATERIAL_NAME))->getTechnique (0)->getPass (0)->getTextureUnitState (1)->setTextureName(PARTICLE_POSITION_BACKUP_TEXTURE_NAME);
+        static_cast<MaterialPtr>(MaterialManager::getSingleton().getByName(RAIN_MATERIAL_NAME))->compile();
+    }
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+void CloseDropsParticles::createMaterial(String name)
+{
+    dropsTexturesMaterial = MaterialManager::getSingleton().create(name, ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
+
+#ifndef SNOW
+
+    mCamera = createDropsCamera();
+    mParentCam->attachObject(mCamera);
+
+    dropsTexture = Root::getSingleton().getRenderSystem()->createRenderTexture (REFRACT_RTT_NAME, RTTSIZE, RTTSIZE, TEX_TYPE_2D, PF_R8G8B8);
+    dropsTexture->setAutoUpdated(true); // the main RTT texture will be updated automatically
+    TextureFrameListener *textureLis = new TextureFrameListener(mSceneMgr); // to avoid seeing the drops in the rtt
+
+    dropsTexture->addListener(textureLis);
+    dropsTexture->addViewport(mCamera);
+    dropsTexture->getViewport (0)->setOverlaysEnabled (false);
+    dropsTexture->getViewport (0)->setClearEveryFrame(true);
+#endif
+
+    dropsTexturesMaterial->getTechnique (0)->getPass (0)->setAlphaRejectSettings(CMPF_NOT_EQUAL, 0);	// we discard the portions of the texture where alpha = 0
+
+    TextureUnitState *createMaterialTUnit1 = dropsTexturesMaterial->getTechnique (0)->getPass (0)->createTextureUnitState ();
+#ifdef SNOW
+
+    createMaterialTUnit1->setTextureName ("flocon.png");
+    dropsTexturesMaterial->getTechnique (0)->getPass (0)->setSceneBlending(SBT_TRANSPARENT_ALPHA);
+#else
+
+    createMaterialTUnit1->setTextureName (REFRACT_RTT_NAME);
+#endif
+
+    createMaterialTUnit1->setTextureFiltering (FO_POINT, FO_POINT, FO_NONE );
+    createMaterialTUnit1->setTextureAddressingMode(Ogre::TextureUnitState::TAM_CLAMP); // mode wrap for this texture
+
+    TextureUnitState *createMaterialTUnit2 = dropsTexturesMaterial->getTechnique (0)->getPass (0)->createTextureUnitState ();
+    createMaterialTUnit2->setTextureName (PARTICLE_POSITION_INIT_TEXTURE_NAME); // real position texture isn't yet initialized
+	
+	// THE FOLLOWING LINE IS NECESSARY TO HANDLE VERTEX TEXTURE FETCH IN OGRE.
+	// IT NEEDS OGRE EIHORT
+	// THIS IS THE REASON WHY THE PROGRAM WILL NOT RUN PROPERLY IN DIRECTX
+	// -SHOULD- BE FINE AFTER THE PROGRAM GETS PORTED TO EIHORT (OGRE 1.4)
+
+	// createMaterialTUnit2->setBindingType(BT_VERTEX);
+    
+	
+	
+	createMaterialTUnit2->setTextureFiltering (FO_POINT, FO_POINT, FO_NONE );
+    createMaterialTUnit2->setTextureAddressingMode(Ogre::TextureUnitState::TAM_CLAMP); // mode clamp for this texture
+
+#ifndef SNOW
+
+    String maskName = "masques/masque_" + StringConverter::toString(mRainWidth * 5.0f) + "_.tga";
+    TextureUnitState *createMaterialTUnit3 = dropsTexturesMaterial->getTechnique (0)->getPass (0)->createTextureUnitState ();
+    createMaterialTUnit3->setTextureName (maskName);  // because we start with billboard width = 0.5
+    createMaterialTUnit3->setTextureFiltering (FO_POINT, FO_POINT, FO_NONE );
+    createMaterialTUnit3->setTextureAddressingMode(Ogre::TextureUnitState::TAM_CLAMP); // mode clamp for this texture
+#endif
+
+#ifdef STREAKS
+
+    TextureUnitState *createMaterialTUnit4 = dropsTexturesMaterial->getTechnique (0)->getPass (0)->createTextureUnitState ();
+    createMaterialTUnit4->setTextureName ("shape.tga");
+    createMaterialTUnit4->setTextureFiltering (FO_POINT, FO_POINT, FO_NONE );
+    createMaterialTUnit4->setTextureAddressingMode(Ogre::TextureUnitState::TAM_CLAMP); // mode clamp for this texture
+    dropsTexturesMaterial->getTechnique (0)->getPass (0)->setSceneBlending(SBT_TRANSPARENT_ALPHA);
+#endif
+
+#ifdef LIGHT_EXTENSION
+
+    TextureUnitState *createMaterialTUnit5 = dropsTexturesMaterial->getTechnique (0)->getPass (0)->createTextureUnitState ();
+    createMaterialTUnit5->setTextureName (LIGHT_INFO_TEXTURE_NAME);
+    createMaterialTUnit5->setTextureFiltering (FO_POINT, FO_POINT, FO_NONE );
+    createMaterialTUnit5->setTextureAddressingMode(Ogre::TextureUnitState::TAM_CLAMP); // mode clamp for this texture
+#endif
+
+    dropsTexturesMaterial->getTechnique (0)->setLodIndex(0);
+
+    dropsTexturesMaterial->setDepthCheckEnabled (true);   // we activate depth test
+    dropsTexturesMaterial->setDepthWriteEnabled (true);
+
+    GPUmaterial();
+
+    dropsTexturesMaterial->compile();
+}
+
+
+
+
+
+
+Camera* CloseDropsParticles::createDropsCamera()
+{
+    Camera *dropsCamera;
+    String camName;
+
+    dropsCamera = new Ogre::Camera("refract_drops_camera", mSceneMgr);
+
+    dropsCamera->setPosition(Vector3(0, 0, 0));
+    dropsCamera->setNearClipDistance( 1 );
+    dropsCamera->setFarClipDistance( 10000 );
+    dropsCamera->setFOVy(Ogre::Radian(FOVyRtt));  // large FOVy, 170
+    dropsCamera->setAspectRatio(4.0f/3.0f);
+    dropsCamera->setLodBias(0.01);
+
+    return dropsCamera;
+}
+
+
+void CloseDropsParticles::updateFragmentProgramParameter(const String &name, float value)
+{
+    GpuProgramParametersSharedPtr paramsFP = dropsTexturesMaterial->getTechnique (0)->getPass (0)->getFragmentProgramParameters ();
+
+    paramsFP->setNamedConstant(name, value);
+}
+
+
+
+void CloseDropsParticles::updateFragmentProgramParameter(const String &name, Vector3 value)
+{
+    GpuProgramParametersSharedPtr paramsFP = dropsTexturesMaterial->getTechnique (0)->getPass (0)->getFragmentProgramParameters ();
+
+    paramsFP->setNamedConstant(name, value);
+}
+
+
+
+void CloseDropsParticles::updateFragmentProgramParameter(const String &name, Vector4 value)
+{
+    GpuProgramParametersSharedPtr paramsFP = dropsTexturesMaterial->getTechnique (0)->getPass (0)->getFragmentProgramParameters ();
+
+    paramsFP->setNamedConstant(name, value);
+}
+
+
+
+void CloseDropsParticles::updateTimeSinceLastFrame(float tslf)
+{
+    String tmpstr = String("rtt_material_using_") + PARTICLE_POSITION_TEXTURE_NAME;
+    GpuProgramParametersSharedPtr paramsPosFP = static_cast<MaterialPtr>(MaterialManager::getSingleton().getByName(tmpstr))->getTechnique (0)->getPass (0)->getFragmentProgramParameters ();
+    paramsPosFP->setNamedConstant("tslf", tslf);
+    // two distinct materials are used for position update, let's synchronize the second
+    tmpstr = String("rtt_material_using_") + PARTICLE_POSITION_BACKUP_TEXTURE_NAME;
+    paramsPosFP = static_cast<MaterialPtr>(MaterialManager::getSingleton().getByName(tmpstr))->getTechnique (0)->getPass (0)->getFragmentProgramParameters ();
+    paramsPosFP->setNamedConstant("tslf", tslf);
+}
+
+
+void CloseDropsParticles::updateRainBilboardSideLength(float rainBbSide)
+{
+    GpuProgramParametersSharedPtr paramsVP = dropsTexturesMaterial->getTechnique (0)->getPass (0)->getVertexProgramParameters ();
+    paramsVP->setNamedConstant("rainBbSide", rainBbSide);
+}
+
+void CloseDropsParticles::updateStreaksHeight(float streaksHeight)
+{
+#ifdef STREAKS
+    GpuProgramParametersSharedPtr paramsVP = dropsTexturesMaterial->getTechnique (0)->getPass (0)->getVertexProgramParameters ();
+    paramsVP->setNamedConstant("streaksHeight", streaksHeight);
+#endif
+
+}
+
+void CloseDropsParticles::updateLightCount(float nbLights)
+{
+#ifdef LIGHT_EXTENSION
+    GpuProgramParametersSharedPtr paramsFP = dropsTexturesMaterial->getTechnique (0)->getPass (0)->getFragmentProgramParameters ();
+    paramsFP->setNamedConstant("nbLights", nbLights);
+#endif
+}
+
+void CloseDropsParticles::updateViewPos(Vector3 viewPos)
+{
+    GpuProgramParametersSharedPtr paramsVP = dropsTexturesMaterial->getTechnique (0)->getPass (0)->getVertexProgramParameters ();
+    paramsVP->setNamedConstant("viewPos", viewPos);
+}
+
+void CloseDropsParticles::updateViewDir(Vector3 viewDir)
+{
+    GpuProgramParametersSharedPtr paramsVP = dropsTexturesMaterial->getTechnique (0)->getPass (0)->getVertexProgramParameters ();
+    paramsVP->setNamedConstant("viewDir", viewDir);
+}
+
+void CloseDropsParticles::updateFallVector(Vector3 fallVect)
+{
+    String tmpstr = String("rtt_material_using_") + PARTICLE_POSITION_TEXTURE_NAME;
+    GpuProgramParametersSharedPtr paramsPosFP = static_cast<MaterialPtr>(MaterialManager::getSingleton().getByName(tmpstr))->getTechnique (0)->getPass (0)->getFragmentProgramParameters ();
+    paramsPosFP->setNamedConstant("fallVect", fallVect);
+    // two distinct materials are used for position update, let's synchronize the second
+    tmpstr = String("rtt_material_using_") + PARTICLE_POSITION_BACKUP_TEXTURE_NAME;
+    paramsPosFP = static_cast<MaterialPtr>(MaterialManager::getSingleton().getByName(tmpstr))->getTechnique (0)->getPass (0)->getFragmentProgramParameters ();
+    paramsPosFP->setNamedConstant("fallVect", fallVect);
+
+
+#ifdef STREAKS
+    // needed also in the vertex shader, to bend the streaks
+    GpuProgramParametersSharedPtr paramsVP = dropsTexturesMaterial->getTechnique (0)->getPass (0)->getVertexProgramParameters ();
+    paramsVP->setNamedConstant("fallVect", fallVect);
+#endif
+}
+
+void CloseDropsParticles::updateBoxMin(Vector3 boxMin)
+{
+    GpuProgramParametersSharedPtr paramsVP = dropsTexturesMaterial->getTechnique (0)->getPass (0)->getVertexProgramParameters ();
+    paramsVP->setNamedConstant("boxMin", boxMin);
+}
+
+void CloseDropsParticles::updateBoxMax(Vector3 boxMax)
+{
+    GpuProgramParametersSharedPtr paramsVP = dropsTexturesMaterial->getTechnique (0)->getPass (0)->getVertexProgramParameters ();
+    paramsVP->setNamedConstant("boxMax", boxMax);
+}
+
+void CloseDropsParticles::updateLastMove(Vector3 lastMove)
+{
+    String tmpstr = String("rtt_material_using_") + PARTICLE_POSITION_TEXTURE_NAME;
+    GpuProgramParametersSharedPtr paramsPosFP = static_cast<MaterialPtr>(MaterialManager::getSingleton().getByName(tmpstr))->getTechnique (0)->getPass (0)->getFragmentProgramParameters ();
+    paramsPosFP->setNamedConstant("lastMove", lastMove);
+    // two distinct materials are used for position update, let's synchronize the second
+    tmpstr = String("rtt_material_using_") + PARTICLE_POSITION_BACKUP_TEXTURE_NAME;
+    paramsPosFP = static_cast<MaterialPtr>(MaterialManager::getSingleton().getByName(tmpstr))->getTechnique (0)->getPass (0)->getFragmentProgramParameters ();
+    paramsPosFP->setNamedConstant("lastMove", lastMove);
+}
+
+void CloseDropsParticles::updateRandomMove(Vector3 randomMove)
+{
+    String tmpstr = String("rtt_material_using_") + PARTICLE_POSITION_TEXTURE_NAME;
+    GpuProgramParametersSharedPtr paramsPosFP = static_cast<MaterialPtr>(MaterialManager::getSingleton().getByName(tmpstr))->getTechnique (0)->getPass (0)->getFragmentProgramParameters ();
+    paramsPosFP->setNamedConstant("randomMove", randomMove);
+    // two distinct materials are used for position update, let's synchronize the second
+    tmpstr = String("rtt_material_using_") + PARTICLE_POSITION_BACKUP_TEXTURE_NAME;
+    paramsPosFP = static_cast<MaterialPtr>(MaterialManager::getSingleton().getByName(tmpstr))->getTechnique (0)->getPass (0)->getFragmentProgramParameters ();
+    paramsPosFP->setNamedConstant("randomMove", randomMove);
+}
+
+
+
+
+
+void CloseDropsParticles::updateShaderParameters(float tslf, float rainBbSide,
+        float streaksHeight, int nbLights,
+        Vector3 viewPos, Vector3 viewDir, Vector3 fallVect, Vector3 boxMin, Vector3 boxMax, Vector3 lastMove, Vector3 randomMove, int useShader)
+{
+    // data to update :
+
+    // floats :
+    // time since last frame (in seconds)
+    // particle count
+    // billboard position texture side length
+    // billboard side length
+    // streaks height
+    // number of lights
+
+    // vec3 :
+    // viewer position
+    // view direction
+    // fall vector (including wind)
+    // minimum box position
+    // maximum box position
+    // viewer movement to compensate (in box coordinates)
+    // random displacement when respawning the particle
+
+
+    // actualizing parameters for the position update shader
+
+    String tmpstr = String("rtt_material_using_") + PARTICLE_POSITION_TEXTURE_NAME;
+    GpuProgramParametersSharedPtr paramsPosFP = static_cast<MaterialPtr>(MaterialManager::getSingleton().getByName(tmpstr))->getTechnique (0)->getPass (0)->getFragmentProgramParameters ();
+    paramsPosFP->setNamedConstant("tslf", tslf);
+    paramsPosFP->setNamedConstant("randomMove", randomMove);
+    paramsPosFP->setNamedConstant("lastMove", lastMove);
+    paramsPosFP->setNamedConstant("fallVect", fallVect);
+    // two distinct materials are used for position update, let's synchronize the second
+    tmpstr = String("rtt_material_using_") + PARTICLE_POSITION_BACKUP_TEXTURE_NAME;
+    paramsPosFP = static_cast<MaterialPtr>(MaterialManager::getSingleton().getByName(tmpstr))->getTechnique (0)->getPass (0)->getFragmentProgramParameters ();
+    paramsPosFP->setNamedConstant("tslf", tslf);
+    paramsPosFP->setNamedConstant("randomMove", randomMove);
+    paramsPosFP->setNamedConstant("lastMove", lastMove);
+    paramsPosFP->setNamedConstant("fallVect", fallVect);
+
+
+    // actualizing vertex program parameters
+
+    GpuProgramParametersSharedPtr paramsVP = dropsTexturesMaterial->getTechnique (0)->getPass (0)->getVertexProgramParameters ();
+    paramsVP->setNamedConstant("viewPos", viewPos);
+    paramsVP->setNamedConstant("viewDir", viewDir);
+    paramsVP->setNamedConstant("boxMin", boxMin);
+    paramsVP->setNamedConstant("boxMax", boxMax);
+    paramsVP->setNamedConstant("rainBbSide", rainBbSide);
+#ifdef STREAKS
+
+    paramsVP->setNamedConstant("streaksHeight", streaksHeight);
+#endif
+
+
+    // actualizing fragment program parameters
+
+    GpuProgramParametersSharedPtr paramsFP = dropsTexturesMaterial->getTechnique (0)->getPass (0)->getFragmentProgramParameters ();
+#ifdef LIGHT_EXTENSION
+
+    paramsFP->setNamedConstant("nbLights", nbLights);
+#endif
+}
+
+
+void CloseDropsParticles::GPUmaterial()
+{
+    // vertex program which will modify texture coordinates
+    HighLevelGpuProgramPtr vp = HighLevelGpuProgramManager::getSingleton().createProgram("gouttesTexCoordsVP", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, "cg", GPT_VERTEX_PROGRAM);
+    vp->setSourceFile("gouttesTexCoordsVP.cg");
+    vp->setParameter("profiles", "vs_3_0 vp40");
+#ifdef STREAKS
+
+    vp->setParameter("entry_point", "mainStreaks");
+#else
+
+    vp->setParameter("entry_point", "mainNoStreaks");
+#endif
+
+    // vertex program binding
+    dropsTexturesMaterial->getTechnique (0)->getPass (0)->setVertexProgram ("gouttesTexCoordsVP");
+
+    // we give it some parameters
+    GpuProgramParametersSharedPtr paramsVP = dropsTexturesMaterial->getTechnique (0)->getPass (0)->getVertexProgramParameters ();
+    paramsVP->setNamedAutoConstant("worldviewproj", GpuProgramParameters::ACT_WORLDVIEWPROJ_MATRIX);
+    paramsVP->setNamedAutoConstant("worldview", GpuProgramParameters::ACT_WORLDVIEW_MATRIX);
+
+
+    // fragment program which will map the generated textures
+    HighLevelGpuProgramPtr fp = HighLevelGpuProgramManager::getSingleton().createProgram("gouttesTexCoordsFP", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, "cg", GPT_FRAGMENT_PROGRAM);
+    fp->setSourceFile("gouttesTexCoordsFP.cg");
+    fp->setParameter("profiles", "ps_3_0 fp40");
+
+
+#ifdef SNOW
+
+    fp->setParameter("entry_point", "main_Snow_noLight");
+
+#else
+
+#ifdef STREAKS
+
+#ifdef LIGHT_EXTENSION
+
+    fp->setParameter("entry_point", "main_Streaks_Light");
+#else  // LIGHT
+
+    fp->setParameter("entry_point", "main_Streaks_noLight");
+#endif  // LIGHT
+
+#else  // STREAKS
+
+#ifdef LIGHT_EXTENSION
+
+    fp->setParameter("entry_point", "main_noStreaks_Light");
+#else  // LIGHT
+
+    fp->setParameter("entry_point", "main_noStreaks_noLight");
+#endif  // LIGHT
+
+#endif  // STREAKS
+
+#endif  // SNOW
+
+
+
+    dropsTexturesMaterial->getTechnique (0)->getPass (0)->setFragmentProgram ("gouttesTexCoordsFP");
+
+
+#ifdef LIGHT_EXTENSION
+
+    GpuProgramParametersSharedPtr paramsFP = dropsTexturesMaterial->getTechnique (0)->getPass (0)->getFragmentProgramParameters ();
+    paramsFP->setNamedAutoConstant("worldview", GpuProgramParameters::ACT_WORLDVIEW_MATRIX);
+
+    // lighting
+    paramsFP->setNamedAutoConstant("colAmb", GpuProgramParameters::ACT_AMBIENT_LIGHT_COLOUR);
+
+#endif  //LIGHT
+}
Index: /GTP/trunk/App/Demos/Illum/Rain/src/RainLight.cpp
===================================================================
--- /GTP/trunk/App/Demos/Illum/Rain/src/RainLight.cpp	(revision 2221)
+++ /GTP/trunk/App/Demos/Illum/Rain/src/RainLight.cpp	(revision 2221)
@@ -0,0 +1,294 @@
+
+///////////////////////////////////////////////////////////////////////////
+//
+//		Realistic rain real-time simulation program
+//
+//		Pierre Rousseau
+//
+///////////////////////////////////////////////////////////////////////////
+//
+//		Light Handling
+//
+///////////////////////////////////////////////////////////////////////////
+
+
+#include "RainLight.h"
+
+
+
+
+
+
+
+
+
+
+RainLight::RainLight(SceneManager *sceneMgr, int lightNumber, ColourValue col, Vector3 LightPos, float LightAttenuation)
+{String name;
+
+  mSceneMgr = sceneMgr;
+
+  Vector3 decalage_ampoule(-5.5, 38, 0);
+  
+  Entity *mStreetLight = mSceneMgr->createEntity("Street_light_" + StringConverter::toString(lightNumber), "lampadaire.mesh");
+  mStreetLight->setMaterialName("lampMat");
+  
+  mConeNode = NULL;
+  SceneNode *mStreetLightNode = mSceneMgr->getRootSceneNode()->createChildSceneNode();
+  mStreetLightNode->setPosition(LightPos);
+  mStreetLightNode->setScale(0.8, 0.8, 0.8);
+  mStreetLightNode->attachObject(mStreetLight);
+
+  mLightNode = mStreetLightNode->createChildSceneNode(decalage_ampoule);
+
+  name = "billboardSet_for_light" +  StringConverter::toString(lightNumber);
+  mBillboardSet = sceneMgr->createBillboardSet(name);
+  mLightNode->attachObject(mBillboardSet);
+  mBillboardSet->setMaterialName("Examples/Flare");
+
+  mBillboard = mBillboardSet->createBillboard(Vector3(0, 0, 0));
+  mBillboard->setDimensions(8, 8);
+  mBillboard->setColour(col);
+
+  mColour = col;
+  mLightPos = mLightNode->getWorldPosition();
+  mLightDir = Vector3(-0.2, -1, 0).normalisedCopy();
+  mLightCutoff = 35;
+  mLightAttenuation = LightAttenuation;
+}
+
+
+
+
+
+
+
+
+void RainLight::animate()
+{
+  static Vector3 pos;
+  static Vector3 dir;
+
+  if (isAnimated)
+  {
+    h1 += stepH1 / 10.0;
+    h2 += stepH2 / 10.0;
+    h3 += stepH3 / 10.0;
+    v1 += stepV1 / 10.0;
+    v2 += stepV2 / 10.0;
+/*
+    pos = Vector3(sin(h1) * sin(h2) * 10.0, sin(v1) * sin(v2) * 3.0, (cos(h1) - 1.0) * (cos(h3) - 1.0) * 10.0);
+    mLightPos = mLightInitialPos + pos;
+    mLightNode->setPosition(mLightPos);
+
+    mLightCutoff = sin(h3) * 60.0 + 30;
+    
+    if (mLightCutoff < 45)
+    {
+      //the cone is narrow, we scale over x and z
+      mConeNode->setScale(tan(mLightCutoff * _PI / 180.0) * 2.0, 1.0, tan(mLightCutoff * _PI / 180.0) * 2.0);
+    }
+    else
+    {
+      mConeNode->setScale(1.0, 1.0 / (tan(mLightCutoff * _PI / 180.0) * 2.0), 1.0);
+    }
+*/
+
+    dir = Vector3(sin(h1) * sin(h2), cos(h1), sin(h1) * cos(h2)).normalisedCopy();
+	if (mConeNode)
+	{
+		mConeNode->resetOrientation();
+		mConeNode->rotate(Vector3(0, 1, 0).getRotationTo(dir));
+		mLightDir = dir;
+	}
+  }
+}
+
+
+
+
+
+
+
+//////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////////////////////////
+//////////
+//////////	RainLightManager class
+//////////
+//////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////////////////////////
+
+
+RainLightManager::RainLightManager(SceneManager *sceneMgr)
+{
+  mSceneMgr = sceneMgr;
+  lightCount = 0;
+  lightVector.clear();
+}
+
+
+
+RainLightManager::~RainLightManager()
+{}
+
+
+
+
+void RainLightManager::addStreetLight(ColourValue col, Vector3 LightPos, float LightAttenuation)
+{
+  lightVector.push_back(new RainLight(mSceneMgr, lightCount, col, LightPos, LightAttenuation));
+
+  ++lightCount;
+}
+
+
+/*
+light info texture will contain information about a light source :
+	- first pixel  : color
+	- second pixel : position
+	- third pixel  : direction (if spot)
+	- fourth pixel : spot cutoff angle (180 for omnidirectional), distance attenuation (% / m)
+*/
+
+//void RainLightManager::createLightInfoTexture(int lightIndex, ColourValue col, Vector3 lightPosition, Vector3 lightDirection)
+void RainLightManager::createLightInfoTexture()
+{
+  std::cout << std::endl << "    Creating light information texture " << std::endl << std::endl;
+
+
+  TexturePtr DynamicLightInfoTexture = TextureManager::getSingleton().createManual(
+                                         LIGHT_INFO_TEXTURE_NAME, // name
+                                         ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
+                                         TEX_TYPE_2D,      // type
+                                         4, lightCount,    // width & height
+                                         0,                // number of mipmaps
+                                         PF_FLOAT32_RGBA,     // pixel format
+                                         TU_DYNAMIC_WRITE_ONLY_DISCARDABLE);
+
+  // Get the pixel buffer
+  HardwarePixelBufferSharedPtr pixelBuffer = DynamicLightInfoTexture->getBuffer();
+
+  // Lock the pixel buffer and get a pixel box
+  pixelBuffer->lock(HardwareBuffer::HBL_DISCARD);
+  const PixelBox& pixelBox = pixelBuffer->getCurrentLock();
+
+  float* pDest = static_cast<float*>(pixelBox.data);
+
+  // Fill in some pixel data.
+
+  for (int i = 0 ; i < lightCount ; i++ )
+  {
+    // we search for the data of each light
+    ColourValue col = lightVector[i]->getColour();
+    Vector3 pos = lightVector[i]->getPosition();
+    Vector3 dir = lightVector[i]->getDirection();
+    float cutoff = lightVector[i]->getCutoff();
+    float att = lightVector[i]->getAttenuation();
+
+    // first pixel : light color
+    *pDest++ = col.r;
+    *pDest++ = col.g;
+    *pDest++ = col.b;
+    *pDest++ = 1.0;
+    // second pixel : light position
+    *pDest++ = pos.x;
+    *pDest++ = pos.y;
+    *pDest++ = pos.z;
+    *pDest++ = 1.0;
+    // third pixel : light direction
+    *pDest++ = dir.x;
+    *pDest++ = dir.y;
+    *pDest++ = dir.z;
+    *pDest++ = 1.0;
+    // fourth pixel : cutoff and attenuation
+    *pDest++ = cutoff;
+    *pDest++ = att;
+    *pDest++ = 1.0;
+    *pDest++ = 1.0;
+  }
+  // Unlock the pixel buffer
+  pixelBuffer->unlock();
+
+  DynamicLightInfoTexture->load();
+}
+
+
+
+
+void RainLightManager::updateLightInfoTexture()
+{
+  TexturePtr DynamicLightInfoTexture = TextureManager::getSingleton().getByName(LIGHT_INFO_TEXTURE_NAME);
+
+  // Get the pixel buffer
+  HardwarePixelBufferSharedPtr pixelBuffer = DynamicLightInfoTexture->getBuffer();
+
+  // Lock the pixel buffer and get a pixel box
+  pixelBuffer->lock(HardwareBuffer::HBL_DISCARD);
+  const PixelBox& pixelBox = pixelBuffer->getCurrentLock();
+
+  float* pDest = static_cast<float*>(pixelBox.data);
+
+  // Fill in some pixel data.
+  for (int i = 0 ; i < lightCount ; i++ )
+  {
+    // we search for the data of each light
+    ColourValue col = lightVector[i]->getColour();
+    Vector3 pos = lightVector[i]->getPosition();
+    Vector3 dir = lightVector[i]->getDirection();
+    float cutoff = lightVector[i]->getCutoff();
+    float att = lightVector[i]->getAttenuation();
+
+    // first pixel : light color
+    *pDest++ = col.r;
+    *pDest++ = col.g;
+    *pDest++ = col.b;
+    *pDest++ = 1.0;
+    // second pixel : light position
+    *pDest++ = pos.x;
+    *pDest++ = pos.y;
+    *pDest++ = pos.z;
+    *pDest++ = 1.0;
+    // third pixel : light direction
+    *pDest++ = dir.x;
+    *pDest++ = dir.y;
+    *pDest++ = dir.z;
+    *pDest++ = 1.0;
+    // fourth pixel : cutoff and attenuation
+    *pDest++ = cutoff;
+    *pDest++ = att;
+    *pDest++ = 1.0;
+    *pDest++ = 1.0;
+  }
+
+  // Unlock the pixel buffer
+  pixelBuffer->unlock();
+
+  DynamicLightInfoTexture->load();
+}
+
+
+
+void RainLightManager::updateLights()
+{
+  for (int i = 0 ; i < lightCount ; i++ )
+  {
+    if (lightVector[i]->getIsAnimated())
+    {
+      lightVector[i]->animate();
+    }
+  }
+
+  updateLightInfoTexture();
+}
+
+
+
+
+void RainLightManager::finalizeLights()
+{
+  createLightInfoTexture();
+}
+
+
+
+
Index: /GTP/trunk/App/Demos/Illum/Rain/src/main.cpp
===================================================================
--- /GTP/trunk/App/Demos/Illum/Rain/src/main.cpp	(revision 2221)
+++ /GTP/trunk/App/Demos/Illum/Rain/src/main.cpp	(revision 2221)
@@ -0,0 +1,146 @@
+///////////////////////////////////////////////////////////////////////////
+//
+//		Realistic real-time rain simulation program
+//
+//		Pierre Rousseau
+//
+///////////////////////////////////////////////////////////////////////////
+
+
+
+#include "CommonRain.h"
+#include "RainFrameListener.h"
+
+
+
+///////////////////////////////////////////////////////////////////////////
+// global variables
+///////////////////////////////////////////////////////////////////////////
+
+float startPos[3]            = {700, HAUTEUR_OBSERVATEUR, 100 };
+
+// variable to avoid going down through the ground
+RaySceneQuery* raySceneQuery = 0;
+
+
+
+
+
+
+/**
+ ** Class : RainApp : the application's starting point
+ ** provided here as an example.
+ ** you should uncomment the #define statements in CommonRain.h if you wish to render streaks or snow or regular raindrops.
+ */
+
+class RainApp : public ExampleApplication
+{
+
+private :
+    SceneNode *mViewNode, *mCameraNode;
+    CloseDropsParticles *mSyst;
+
+public:
+    /** Basic constructor */
+    RainApp()
+    {}
+
+    /** destructor */
+    ~RainApp()
+    {
+        delete mSyst;
+        delete raySceneQuery;
+    }
+
+protected:
+
+    /** function creating the scene manager used in the application */
+    virtual void chooseSceneManager(void)
+    {
+        mSceneMgr = mRoot->createSceneManager( ST_EXTERIOR_CLOSE );
+    }
+
+    /** function defining the contents of the scene, objects, and particles */
+    void createScene(void)
+    {
+        // We set a skybox
+        mSceneMgr->setSkyBox(true, "Examples/StormySkyBox");
+
+        mSceneMgr->setWorldGeometry( "terrain.cfg" );
+
+	// define a main node used to move the observer.
+	// the main camera will be attached to a child node of this main node.
+        mViewNode = mSceneMgr->getRootSceneNode()->createChildSceneNode("playerView");
+
+        mViewNode->setPosition(startPos[0], startPos[1], startPos[2]); // the camera is positionned 1.8m above the ground (human height)
+
+        mViewNode->yaw(Ogre::Radian(_PI), Ogre::Node::TS_LOCAL);
+        mCameraNode = mViewNode->createChildSceneNode();
+        mCameraNode->attachObject(mCamera);
+
+        mCamera->setNearClipDistance( 1 );
+        mCamera->setFarClipDistance( 10000 );
+        mCamera->setFOVy(Ogre::Radian(FOVyCam));  // normal FOVy, 60Â°
+        mCamera->setAspectRatio(4.0f/3.0f);
+        mCamera->setLodBias(1);
+        mCamera->setPosition(Vector3(0, 0, 0));
+
+        // definition of the particle system
+        mSyst = new CloseDropsParticles(mSceneMgr, mViewNode, mCameraNode);
+
+        // collisions with the terrain
+        raySceneQuery = mSceneMgr->createRayQuery(Ray(mCamera->getPosition(), Vector3::NEGATIVE_UNIT_Y));
+        raySceneQuery->setQueryMask(0x80000000);
+    }
+
+    /** function to connect the application to its scene manager */
+    void createFrameListener(void)
+    {
+        mFrameListener= new RainFrameListener(mWindow, mCamera, mViewNode, mCameraNode, mSyst);
+        mRoot->addFrameListener(mFrameListener);
+    }
+};
+
+
+
+
+
+
+
+
+#ifdef WIN32
+#include <windows.h>
+#endif
+
+// ----------------------------------------------------------------------------
+// Main function, just boots the application
+// ----------------------------------------------------------------------------
+#ifdef WIN32
+INT WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,INT)
+#else
+int main(int argc, char **argv)
+#endif
+{
+    srand(time(NULL));
+    // Create application object
+    RainApp app;
+
+    try
+    {
+        app.go();
+    }
+    catch( Exception& e )
+    {
+#ifdef 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
+
+    }
+#ifndef WIN32
+    return 0;
+#endif
+}
Index: /GTP/trunk/App/Demos/Illum/Rain/src/RainFrameListener.cpp
===================================================================
--- /GTP/trunk/App/Demos/Illum/Rain/src/RainFrameListener.cpp	(revision 2221)
+++ /GTP/trunk/App/Demos/Illum/Rain/src/RainFrameListener.cpp	(revision 2221)
@@ -0,0 +1,406 @@
+
+///////////////////////////////////////////////////////////////////////////
+//
+//		Realistic rain real-time simulation program
+//
+//		Pierre Rousseau
+//
+///////////////////////////////////////////////////////////////////////////
+//
+//		Main camera, and external events (mouse/keyboard) handling
+//
+///////////////////////////////////////////////////////////////////////////
+
+
+
+#include "RainCloseDropsParticles.h"
+#include "RainFrameListener.h"
+#include <OgreHardwarePixelBuffer.h>
+using namespace std;
+
+
+extern float startPos[3];
+
+// don't go below the ground with this
+extern RaySceneQuery* raySceneQuery;
+
+
+RainFrameListener::RainFrameListener(RenderWindow* win, Camera* cam, SceneNode* ViewNode, SceneNode* CameraNode, CloseDropsParticles *syst) : ExampleFrameListener(win, cam)
+{
+    mViewNode = ViewNode;
+    mCameraNode = CameraNode;
+    mRainSystem = syst;
+    timer = 0.0;
+    mWindow->setAutoUpdated(false);
+
+    Overlay * mRainOverlay = OverlayManager::getSingleton().getByName("RainOverlay");
+    mRainOverlay->show();
+
+    showDebugOverlay(false); // useless as we defined our own overlay
+}
+
+
+
+void RainFrameListener::updateStats(void)
+{
+    static String currFps = "FPS : ";
+    // update stats when necessary
+    try
+    {
+        OverlayElement* guiCurr = OverlayManager::getSingleton().getOverlayElement("RainCurrFps");
+
+        const RenderTarget::FrameStats& stats = mWindow->getStatistics();
+
+        guiCurr->setCaption(currFps + StringConverter::toString(stats.lastFPS));
+    }
+    catch(...)
+    {
+        // ignore
+    }
+}
+
+
+void RainFrameListener::displayMessage(String text)
+{
+    try
+    {
+        OverlayElement* guiCurr = OverlayManager::getSingleton().getOverlayElement("RainCurrFps");
+        guiCurr->setCaption(text);
+    }
+    catch(...)
+    {
+        // ignore
+    }
+}
+
+
+bool RainFrameListener::frameStarted(const FrameEvent& evt)
+{
+    static bool usePrimaryPositionTexture = true;
+    static bool capture = false;
+    static bool stopDrop = false;
+    static int numScreenshot=0;
+    static bool firstFrame = true;
+	static bool showOverlay = true;
+    Real moveFactor;
+
+#ifdef SNOW
+
+    static float fallSpeed = 0.1;
+    static float windForce = 0.02;
+#else
+
+    static float fallSpeed = 0.7;
+    static float windForce = 0.0;
+#endif
+
+
+    if (firstFrame)
+    {
+        mRainSystem->definePosTextureAndBackup();
+        firstFrame = false;
+
+        // give initial values to the shader parameters
+        Vector3 camPos = mViewNode->getWorldPosition();
+        Vector3 viewPos( (camPos.x - PARTICLES_MIN_X) / float(PARTICLES_MAX_X - PARTICLES_MIN_X),
+                         (camPos.y - PARTICLES_MIN_Y) / float(PARTICLES_MAX_Y - PARTICLES_MIN_Y),
+                         (camPos.z - PARTICLES_MIN_Z) / float(PARTICLES_MAX_Z - PARTICLES_MIN_Z) );
+        Vector3 viewDir(0.0, 0.0, 1.0);
+        Vector3 fallVect(windForce, -fallSpeed, 0.0);
+        Vector3 boxMin(VIS_PARTICLE_BOX_MIN_X, VIS_PARTICLE_BOX_MIN_Y, VIS_PARTICLE_BOX_MIN_Z);
+        Vector3 boxMax(VIS_PARTICLE_BOX_MAX_X, VIS_PARTICLE_BOX_MAX_Y, VIS_PARTICLE_BOX_MAX_Z);
+        Vector3 lastMove( 0.0, 0.0, 0.0 );
+
+        Vector3 randomMove((rand() % 100 ) / 1000.0 - 0.05, (rand() % 100 ) / 1000.0 - 0.05, (rand() % 100 ) / 1000.0 - 0.05);
+
+        mRainSystem->updateShaderParameters(0.015, mRainSystem->mRainWidth, mRainSystem->mRainStreaksHeight, mRainSystem->getLightManagerPtr()->getLightCount(), viewPos, viewDir, fallVect, boxMin, boxMax, lastMove, randomMove, 1);
+
+		// the control overlay is for debugging purposes : uncomment if you wish to see a dynamic texture, such as the particle's position texture.
+        //mRainSystem->makeControlOverlay();
+    }
+    else
+    {
+        // set the active position texture
+        mRainSystem->showPositionBillboards();
+        mRainSystem->updatePositionTexture(usePrimaryPositionTexture);
+        mRainSystem->hidePositionBillboards();
+
+        usePrimaryPositionTexture = !usePrimaryPositionTexture;
+        //update random factor
+        mRainSystem->updateRandomMove(Vector3((rand() % 100 ) / 1000.0 - 0.05, (rand() % 100 ) / 1000.0 - 0.05, (rand() % 100 ) / 1000.0 - 0.05));
+    }
+
+
+
+
+
+    if (capture)
+    {
+        moveFactor = evt.timeSinceLastFrame * 10.0;
+
+        // set framerate to 30 fps
+        mRainSystem->updateTimeSinceLastFrame(1.0 / 30.0);
+    }
+    else
+    {
+        // tell the stat overlay to update
+        updateStats();
+
+        // update time since last frame
+        mRainSystem->updateTimeSinceLastFrame(evt.timeSinceLastFrame);
+
+        moveFactor = evt.timeSinceLastFrame * 80.0;
+    }
+
+    timer -= evt.timeSinceLastFrame;
+
+
+
+    mInputDevice->capture();
+
+    /////////////////////////////////////////////////
+    /////////////////////////////////////////////////
+    // translations
+    /////////////////////////////////////////////////
+    /////////////////////////////////////////////////
+
+    // save the previous position
+    Vector3 oldViewPos = mViewNode->getWorldPosition();
+
+    if (mInputDevice->isKeyDown(Ogre::KC_UP) || mInputDevice->isKeyDown(Ogre::KC_NUMPAD8))
+    {
+        mViewNode->translate(0.0, 0.0, -moveFactor, Ogre::Node::TS_LOCAL);
+    }
+
+    if (mInputDevice->isKeyDown(Ogre::KC_DOWN) || mInputDevice->isKeyDown(Ogre::KC_NUMPAD5))
+    {
+        mViewNode->translate(0.0, 0.0, moveFactor, Ogre::Node::TS_LOCAL);
+    }
+
+    // keep the feets on the ground
+    static Ray updateRay;
+    updateRay.setOrigin(mViewNode->getPosition());
+    updateRay.setDirection(Vector3::NEGATIVE_UNIT_Y);
+    raySceneQuery->setRay(updateRay);
+    raySceneQuery->setQueryMask(0x80000000);
+    RaySceneQueryResult& qryResult = raySceneQuery->execute();
+    RaySceneQueryResult::iterator i = qryResult.begin();
+    if (i != qryResult.end() && i->worldFragment)
+    {
+        SceneQuery::WorldFragment* wf = i->worldFragment;
+        mViewNode->setPosition(mViewNode->getPosition().x, i->worldFragment->singleIntersection.y + HAUTEUR_OBSERVATEUR, mViewNode->getPosition().z);
+    }
+
+
+    // in case the user moved, update his position
+    Vector3 camPos = mViewNode->getWorldPosition();
+    mRainSystem->updateViewPos(camPos);
+
+
+    /////////////////////////////////////////////////
+    /////////////////////////////////////////////////
+    // rotations
+    /////////////////////////////////////////////////
+    /////////////////////////////////////////////////
+    Real rotX = -mInputDevice->getMouseRelativeX();
+    Real rotY = -mInputDevice->getMouseRelativeY();
+
+    Vector3 oldViewDir = mViewNode->getOrientation().zAxis();
+
+    mViewNode->yaw(Ogre::Radian(rotX * evt.timeSinceLastFrame / (capture ? 100.0 : 1.0)), Ogre::Node::TS_WORLD);
+    mCameraNode->pitch(-Ogre::Radian(rotY * evt.timeSinceLastFrame / (capture ? 100.0 : 1.0)), Ogre::Node::TS_LOCAL);
+
+    // get the orientation for the update shader
+    Vector3 newViewDir = mViewNode->getOrientation().zAxis();
+
+    Vector3 lastMove( (camPos.x - oldViewPos.x) / float(VIS_PARTICLE_BOX_MAX_X - VIS_PARTICLE_BOX_MIN_X) - (newViewDir.x - oldViewDir.x)/2.0,
+                      (camPos.y - oldViewPos.y) / float(VIS_PARTICLE_BOX_MAX_Y - VIS_PARTICLE_BOX_MIN_Y),
+                      (camPos.z - oldViewPos.z) / float(VIS_PARTICLE_BOX_MAX_Z - VIS_PARTICLE_BOX_MIN_Z) - (newViewDir.z - oldViewDir.z)/2.0 );
+    mRainSystem->updateLastMove(lastMove);
+
+    mRainSystem->updateViewDir(newViewDir);
+
+
+    /////////////////////////////////////////////////////////////////////////////////////
+    /////////////////////////////////////////////////////////////////////////////////////
+    //
+    //	react to user input (keyboard)
+    //
+    /////////////////////////////////////////////////////////////////////////////////////
+    /////////////////////////////////////////////////////////////////////////////////////
+
+
+// pause the system
+    if (mInputDevice->isKeyDown(KC_SPACE) && timer <= 0)
+    {
+        stopDrop = ! stopDrop;
+        if (stopDrop)
+            displayMessage("Pause");
+        else
+            displayMessage(" ");
+
+        timer = 0.5;
+
+        // update fall vector
+        mRainSystem->updateFallVector(Vector3(stopDrop?0.0:windForce, stopDrop?0.0:-fallSpeed, 0.0));
+    }
+
+
+
+    // modifying particle size
+
+    if (mInputDevice->isKeyDown(KC_ADD) && timer <= 0)
+    {
+        mRainSystem->mRainWidth += 0.05;
+        displayMessage("Radius : " + StringConverter::toString(mRainSystem->mRainWidth * 5.0f));
+        std::cout << "Radius : " << mRainSystem->mRainWidth * 5.0f << std::endl;
+#ifndef SNOW
+
+        if (mRainSystem->mRainWidth <= 0.901)
+        {
+            String nom_masque="masques/masque_" + StringConverter::toString(mRainSystem->mRainWidth * 5.0f) + "_.tga";
+            static_cast<MaterialPtr>(MaterialManager::getSingleton().getByName(RAIN_MATERIAL_NAME))->getTechnique (0)->getPass (0)->getTextureUnitState (2)->setTextureName(nom_masque);
+        }
+#endif
+        timer = 0.1;
+
+        // update the size
+        mRainSystem->updateRainBilboardSideLength(mRainSystem->mRainWidth);
+    }
+
+    if (mInputDevice->isKeyDown(KC_SUBTRACT) && timer <= 0)
+    {
+        if (mRainSystem->mRainWidth > 0.051)
+        {
+            mRainSystem->mRainWidth -= 0.05;
+            displayMessage("Radius : " + StringConverter::toString(mRainSystem->mRainWidth * 5.0f));
+            std::cout << "Radius : " << mRainSystem->mRainWidth * 5.0f << std::endl;
+#ifndef SNOW
+
+            if (mRainSystem->mRainWidth <= 0.9 && mRainSystem->mRainWidth >= 0.14)
+            {
+                String nom_masque="masques/masque_" + StringConverter::toString(mRainSystem->mRainWidth * 5.0f) + "_.tga";
+                static_cast<MaterialPtr>(MaterialManager::getSingleton().getByName(RAIN_MATERIAL_NAME))->getTechnique (0)->getPass (0)->getTextureUnitState (2)->setTextureName(nom_masque);
+            }
+#endif
+
+        }
+        timer = 0.1;
+
+        // update the size
+        mRainSystem->updateRainBilboardSideLength(mRainSystem->mRainWidth);
+    }
+
+
+
+    // press 'S' to accelerate, and 'Q' to slow down
+    if (mInputDevice->isKeyDown(KC_S))
+    {
+        displayMessage("Accelerating");
+        fallSpeed += 0.002;
+        std::cout << "fallSpeed : " << fallSpeed << std::endl;
+
+        // update fall vector
+        mRainSystem->updateFallVector(Vector3(stopDrop?0.0:windForce, stopDrop?0.0:-fallSpeed, 0.0));
+    }
+    if (mInputDevice->isKeyDown(KC_Q))
+    {
+        if (fallSpeed > 0.05)
+        {
+            displayMessage("Slowing");
+            fallSpeed -= 0.002;
+        }
+        std::cout << "fallSpeed : " << fallSpeed << std::endl;
+
+        // update fall vector
+        mRainSystem->updateFallVector(Vector3(stopDrop?0.0:windForce, stopDrop?0.0:-fallSpeed, 0.0));
+    }
+
+    // wind handling ('W' key)
+    if (mInputDevice->isKeyDown(KC_W))
+    {
+        if (mInputDevice->isKeyDown(KC_LSHIFT) || mInputDevice->isKeyDown(KC_RSHIFT))
+        {
+            displayMessage("Decreasing wind");
+            windForce -= 0.001;
+        }
+        else
+        {
+            displayMessage("Increasing wind");
+            windForce += 0.001;
+        }
+        std::cout << "wind : " << windForce << std::endl;
+
+        // update fall vector
+        mRainSystem->updateFallVector(Vector3(stopDrop?0.0:windForce, stopDrop?0.0:-fallSpeed, 0.0));
+    }
+
+
+    // erase text
+    if (mInputDevice->isKeyDown(KC_E))
+    {
+        displayMessage(" ");
+    }
+
+	// show / hide the calimero overlay
+    if (mInputDevice->isKeyDown(KC_O) && timer <= 0)
+    {
+        showOverlay = ! showOverlay;
+        if (showOverlay)
+			OverlayManager::getSingleton().getByName("RainOverlay")->show();
+        else
+			OverlayManager::getSingleton().getByName("RainOverlay")->hide();
+
+        timer = 0.5;
+    }
+
+
+    // we can capture a screenshot
+
+    mWindow->update();
+
+    if (mInputDevice->isKeyDown(KC_SYSRQ) && timer <= 0)
+    {
+        String tmp;
+
+        String padding = (numScreenshot<10) ? "000" : ( (numScreenshot<100) ? "00" : ((numScreenshot<1000) ? "0" : "" ) ) ;
+        tmp = "screenshot_" + padding;
+        tmp += StringConverter::toString(numScreenshot++) + ".jpg";
+        mWindow->writeContentsToFile(tmp);
+        timer = 0.5;
+    }
+
+    // on enregistre
+    if (mInputDevice->isKeyDown(Ogre::KC_C) && timer <= 0)
+    {
+        displayMessage(" ");
+        capture = !capture;
+        timer = 0.5;
+    }
+    if (capture)
+    {
+        String tmp;
+
+        String padding = (numScreenshot<10) ? "000" : ( (numScreenshot<100) ? "00" : ((numScreenshot<1000) ? "0" : "" ) ) ;
+        tmp = "Capture_" + padding;
+        tmp += StringConverter::toString(numScreenshot++) + ".jpg";
+
+        mWindow->writeContentsToFile(tmp);
+    }
+
+    // end of program
+
+    if(mInputDevice->isKeyDown(Ogre::KC_ESCAPE))
+        return false;
+
+    return true;
+}
+
+
+
+
+bool RainFrameListener::frameEnded(const FrameEvent& evt)
+{
+    return ExampleFrameListener::frameEnded(evt);
+}
+
Index: /GTP/trunk/App/Demos/Illum/Rain/src/RainTextureFrameListener.cpp
===================================================================
--- /GTP/trunk/App/Demos/Illum/Rain/src/RainTextureFrameListener.cpp	(revision 2221)
+++ /GTP/trunk/App/Demos/Illum/Rain/src/RainTextureFrameListener.cpp	(revision 2221)
@@ -0,0 +1,36 @@
+
+///////////////////////////////////////////////////////////////////////////
+//
+//		Realistic rain real-time simulation program
+//
+//		Pierre Rousseau
+//
+///////////////////////////////////////////////////////////////////////////
+//
+//		Texture cameras handling
+//
+///////////////////////////////////////////////////////////////////////////
+
+
+
+#include "RainTextureFrameListener.h"
+
+
+
+
+TextureFrameListener::TextureFrameListener(SceneManager* SceneMgr) : RenderTargetListener()
+{
+    mSceneMgr=SceneMgr;
+}
+
+void TextureFrameListener::preRenderTargetUpdate (const Ogre::RenderTargetEvent &evt)
+{
+    mSceneMgr->getStaticGeometry(STATIC_GEOMETRY_NAME)->setVisible(false);
+}
+
+void TextureFrameListener::postRenderTargetUpdate (const Ogre::RenderTargetEvent &evt)
+{
+    mSceneMgr->getStaticGeometry(STATIC_GEOMETRY_NAME)->setVisible(true);
+}
+
+
Index: /GTP/trunk/App/Demos/Illum/Rain/bin/release/plugins.cfg
===================================================================
--- /GTP/trunk/App/Demos/Illum/Rain/bin/release/plugins.cfg	(revision 2221)
+++ /GTP/trunk/App/Demos/Illum/Rain/bin/release/plugins.cfg	(revision 2221)
@@ -0,0 +1,13 @@
+# Defines plugins to load
+
+# Define plugin folder
+PluginFolder=.
+
+# Define D3D rendering implementation plugin
+Plugin=RenderSystem_Direct3D9
+Plugin=RenderSystem_GL
+Plugin=Plugin_ParticleFX
+Plugin=Plugin_BSPSceneManager
+Plugin=Plugin_OctreeSceneManager
+Plugin=Plugin_CgProgramManager
+
Index: /GTP/trunk/App/Demos/Illum/Rain/bin/release/ogre.cfg
===================================================================
--- /GTP/trunk/App/Demos/Illum/Rain/bin/release/ogre.cfg	(revision 2221)
+++ /GTP/trunk/App/Demos/Illum/Rain/bin/release/ogre.cfg	(revision 2221)
@@ -0,0 +1,19 @@
+Render System=OpenGL Rendering Subsystem
+
+[Direct3D9 Rendering Subsystem]
+Allow NVPerfHUD=No
+Anti aliasing=None
+Floating-point mode=Fastest
+Full Screen=No
+Rendering Device=NVIDIA GeForce Go 7300
+VSync=No
+Video Mode=800 x 600 @ 32-bit colour
+
+[OpenGL Rendering Subsystem]
+Colour Depth=32
+Display Frequency=N/A
+FSAA=0
+Full Screen=No
+RTT Preferred Mode=FBO
+VSync=No
+Video Mode=800 x 600
Index: /GTP/trunk/App/Demos/Illum/Rain/bin/release/terrain.cfg
===================================================================
--- /GTP/trunk/App/Demos/Illum/Rain/bin/release/terrain.cfg	(revision 2221)
+++ /GTP/trunk/App/Demos/Illum/Rain/bin/release/terrain.cfg	(revision 2221)
@@ -0,0 +1,71 @@
+# The main world texture (if you wish the terrain manager to create a material for you)
+WorldTexture=route_texture.jpg
+
+# The detail texture (if you wish the terrain manager to create a material for you)
+DetailTexture=route_detail.jpg
+
+#number of times the detail texture will tile in a terrain tile
+DetailTile=3
+
+# Heightmap source
+PageSource=Heightmap
+
+# Heightmap-source specific settings
+Heightmap.image=route.png
+
+# If you use RAW, fill in the below too
+# RAW-specific setting - size (horizontal/vertical)
+#Heightmap.raw.size=513
+# RAW-specific setting - bytes per pixel (1 = 8bit, 2=16bit)
+#Heightmap.raw.bpp=2
+
+# How large is a page of tiles (in vertices)? Must be (2^n)+1
+PageSize=513
+
+# How large is each tile? Must be (2^n)+1 and be smaller than PageSize
+TileSize=65
+
+# The maximum error allowed when determining which LOD to use
+MaxPixelError=3
+
+# The size of a terrain page, in world units
+PageWorldX=1500
+PageWorldZ=1500
+# Maximum height of the terrain 
+MaxHeight=100
+
+# Upper LOD limit
+MaxMipMapLevel=5
+
+#VertexNormals=yes
+#VertexColors=yes
+#UseTriStrips=yes
+
+# Use vertex program to morph LODs, if available
+VertexProgramMorph=yes
+
+# The proportional distance range at which the LOD morph starts to take effect
+# This is as a proportion of the distance between the current LODs effective range,
+# and the effective range of the next lower LOD
+#LODMorphStart=0.2
+
+# This following section is for if you want to provide your own terrain shading routine
+# Note that since you define your textures within the material this makes the 
+# WorldTexture and DetailTexture settings redundant
+
+# The name of the vertex program parameter you wish to bind the morph LOD factor to
+# this is 0 when there is no adjustment (highest) to 1 when the morph takes it completely
+# to the same position as the next lower LOD
+# USE THIS IF YOU USE HIGH-LEVEL VERTEX PROGRAMS WITH LOD MORPHING
+#MorphLODFactorParamName=morphFactor
+
+# The index of the vertex program parameter you wish to bind the morph LOD factor to
+# this is 0 when there is no adjustment (highest) to 1 when the morph takes it completely
+# to the same position as the next lower LOD
+# USE THIS IF YOU USE ASSEMBLER VERTEX PROGRAMS WITH LOD MORPHING
+#MorphLODFactorParamIndex=4
+
+# The name of the material you will define to shade the terrain
+#CustomMaterialName=TestTerrainMaterial
+
+
Index: /GTP/trunk/App/Demos/Illum/Rain/bin/release/resources.cfg
===================================================================
--- /GTP/trunk/App/Demos/Illum/Rain/bin/release/resources.cfg	(revision 2221)
+++ /GTP/trunk/App/Demos/Illum/Rain/bin/release/resources.cfg	(revision 2221)
@@ -0,0 +1,25 @@
+# Resource locations to be added to the 'boostrap' path
+# This also contains the minimum you need to use the Ogre example framework
+[Bootstrap]
+Zip=c:/ogresdk/media/packs/OgreCore.zip
+
+# Resource locations to be added to the default path
+[General]
+FileSystem=../../rainMaterials
+FileSystem=../../terrain
+FileSystem=c:/ogresdk/media
+FileSystem=c:/ogresdk/media/fonts
+#FileSystem=c:/ogresdk/media/materials/programs
+FileSystem=c:/ogresdk/media/materials/scripts
+FileSystem=c:/ogresdk/media/materials/textures
+FileSystem=c:/ogresdk/media/models
+FileSystem=c:/ogresdk/media/overlays
+FileSystem=c:/ogresdk/media/particle
+FileSystem=c:/ogresdk/media/gui
+FileSystem=c:/ogresdk/media/DeferredShadingMedia
+Zip=c:/ogresdk/media/packs/cubemap.zip
+Zip=c:/ogresdk/media/packs/cubemapsJS.zip
+Zip=c:/ogresdk/media/packs/dragon.zip
+Zip=c:/ogresdk/media/packs/fresneldemo.zip
+Zip=c:/ogresdk/media/packs/ogretestmap.zip
+Zip=c:/ogresdk/media/packs/skybox.zip
Index: /GTP/trunk/App/Demos/Illum/Rain/bin/debug/plugins.cfg
===================================================================
--- /GTP/trunk/App/Demos/Illum/Rain/bin/debug/plugins.cfg	(revision 2221)
+++ /GTP/trunk/App/Demos/Illum/Rain/bin/debug/plugins.cfg	(revision 2221)
@@ -0,0 +1,13 @@
+# Defines plugins to load
+
+# Define plugin folder
+PluginFolder=.
+
+# Define D3D rendering implementation plugin
+Plugin=RenderSystem_Direct3D9
+Plugin=RenderSystem_GL
+Plugin=Plugin_ParticleFX
+Plugin=Plugin_BSPSceneManager
+Plugin=Plugin_OctreeSceneManager
+Plugin=Plugin_CgProgramManager
+
Index: /GTP/trunk/App/Demos/Illum/Rain/bin/debug/ogre.cfg
===================================================================
--- /GTP/trunk/App/Demos/Illum/Rain/bin/debug/ogre.cfg	(revision 2221)
+++ /GTP/trunk/App/Demos/Illum/Rain/bin/debug/ogre.cfg	(revision 2221)
@@ -0,0 +1,19 @@
+Render System=OpenGL Rendering Subsystem
+
+[Direct3D9 Rendering Subsystem]
+Allow NVPerfHUD=No
+Anti aliasing=None
+Floating-point mode=Fastest
+Full Screen=No
+Rendering Device=NVIDIA GeForce Go 7300
+VSync=No
+Video Mode=800 x 600 @ 32-bit colour
+
+[OpenGL Rendering Subsystem]
+Colour Depth=32
+Display Frequency=N/A
+FSAA=0
+Full Screen=No
+RTT Preferred Mode=FBO
+VSync=No
+Video Mode=800 x 600
Index: /GTP/trunk/App/Demos/Illum/Rain/bin/debug/terrain.cfg
===================================================================
--- /GTP/trunk/App/Demos/Illum/Rain/bin/debug/terrain.cfg	(revision 2221)
+++ /GTP/trunk/App/Demos/Illum/Rain/bin/debug/terrain.cfg	(revision 2221)
@@ -0,0 +1,71 @@
+# The main world texture (if you wish the terrain manager to create a material for you)
+WorldTexture=route_texture.jpg
+
+# The detail texture (if you wish the terrain manager to create a material for you)
+DetailTexture=route_detail.jpg
+
+#number of times the detail texture will tile in a terrain tile
+DetailTile=3
+
+# Heightmap source
+PageSource=Heightmap
+
+# Heightmap-source specific settings
+Heightmap.image=route.png
+
+# If you use RAW, fill in the below too
+# RAW-specific setting - size (horizontal/vertical)
+#Heightmap.raw.size=513
+# RAW-specific setting - bytes per pixel (1 = 8bit, 2=16bit)
+#Heightmap.raw.bpp=2
+
+# How large is a page of tiles (in vertices)? Must be (2^n)+1
+PageSize=513
+
+# How large is each tile? Must be (2^n)+1 and be smaller than PageSize
+TileSize=65
+
+# The maximum error allowed when determining which LOD to use
+MaxPixelError=3
+
+# The size of a terrain page, in world units
+PageWorldX=1500
+PageWorldZ=1500
+# Maximum height of the terrain 
+MaxHeight=100
+
+# Upper LOD limit
+MaxMipMapLevel=5
+
+#VertexNormals=yes
+#VertexColors=yes
+#UseTriStrips=yes
+
+# Use vertex program to morph LODs, if available
+VertexProgramMorph=yes
+
+# The proportional distance range at which the LOD morph starts to take effect
+# This is as a proportion of the distance between the current LODs effective range,
+# and the effective range of the next lower LOD
+#LODMorphStart=0.2
+
+# This following section is for if you want to provide your own terrain shading routine
+# Note that since you define your textures within the material this makes the 
+# WorldTexture and DetailTexture settings redundant
+
+# The name of the vertex program parameter you wish to bind the morph LOD factor to
+# this is 0 when there is no adjustment (highest) to 1 when the morph takes it completely
+# to the same position as the next lower LOD
+# USE THIS IF YOU USE HIGH-LEVEL VERTEX PROGRAMS WITH LOD MORPHING
+#MorphLODFactorParamName=morphFactor
+
+# The index of the vertex program parameter you wish to bind the morph LOD factor to
+# this is 0 when there is no adjustment (highest) to 1 when the morph takes it completely
+# to the same position as the next lower LOD
+# USE THIS IF YOU USE ASSEMBLER VERTEX PROGRAMS WITH LOD MORPHING
+#MorphLODFactorParamIndex=4
+
+# The name of the material you will define to shade the terrain
+#CustomMaterialName=TestTerrainMaterial
+
+
Index: /GTP/trunk/App/Demos/Illum/Rain/bin/debug/resources.cfg
===================================================================
--- /GTP/trunk/App/Demos/Illum/Rain/bin/debug/resources.cfg	(revision 2221)
+++ /GTP/trunk/App/Demos/Illum/Rain/bin/debug/resources.cfg	(revision 2221)
@@ -0,0 +1,25 @@
+# Resource locations to be added to the 'boostrap' path
+# This also contains the minimum you need to use the Ogre example framework
+[Bootstrap]
+Zip=c:/ogresdk/media/packs/OgreCore.zip
+
+# Resource locations to be added to the default path
+[General]
+FileSystem=../../rainMaterials
+FileSystem=../../terrain
+FileSystem=c:/ogresdk/media
+FileSystem=c:/ogresdk/media/fonts
+#FileSystem=c:/ogresdk/media/materials/programs
+FileSystem=c:/ogresdk/media/materials/scripts
+FileSystem=c:/ogresdk/media/materials/textures
+FileSystem=c:/ogresdk/media/models
+FileSystem=c:/ogresdk/media/overlays
+FileSystem=c:/ogresdk/media/particle
+FileSystem=c:/ogresdk/media/gui
+FileSystem=c:/ogresdk/media/DeferredShadingMedia
+Zip=c:/ogresdk/media/packs/cubemap.zip
+Zip=c:/ogresdk/media/packs/cubemapsJS.zip
+Zip=c:/ogresdk/media/packs/dragon.zip
+Zip=c:/ogresdk/media/packs/fresneldemo.zip
+Zip=c:/ogresdk/media/packs/ogretestmap.zip
+Zip=c:/ogresdk/media/packs/skybox.zip
Index: /GTP/trunk/App/Demos/Illum/Rain/docs/html/tabs.css
===================================================================
--- /GTP/trunk/App/Demos/Illum/Rain/docs/html/tabs.css	(revision 2221)
+++ /GTP/trunk/App/Demos/Illum/Rain/docs/html/tabs.css	(revision 2221)
@@ -0,0 +1,102 @@
+/* tabs styles, based on http://www.alistapart.com/articles/slidingdoors */
+
+DIV.tabs
+{
+   float            : left;
+   width            : 100%;
+   background       : url("tab_b.gif") repeat-x bottom;
+   margin-bottom    : 4px;
+}
+
+DIV.tabs UL
+{
+   margin           : 0px;
+   padding-left     : 10px;
+   list-style       : none;
+}
+
+DIV.tabs LI, DIV.tabs FORM
+{
+   display          : inline;
+   margin           : 0px;
+   padding          : 0px;
+}
+
+DIV.tabs FORM
+{
+   float            : right;
+}
+
+DIV.tabs A
+{
+   float            : left;
+   background       : url("tab_r.gif") no-repeat right top;
+   border-bottom    : 1px solid #84B0C7;
+   font-size        : x-small;
+   font-weight      : bold;
+   text-decoration  : none;
+}
+
+DIV.tabs A:hover
+{
+   background-position: 100% -150px;
+}
+
+DIV.tabs A:link, DIV.tabs A:visited,
+DIV.tabs A:active, DIV.tabs A:hover
+{
+       color: #1A419D;
+}
+
+DIV.tabs SPAN
+{
+   float            : left;
+   display          : block;
+   background       : url("tab_l.gif") no-repeat left top;
+   padding          : 5px 9px;
+   white-space      : nowrap;
+}
+
+DIV.tabs INPUT
+{
+   float            : right;
+   display          : inline;
+   font-size        : 1em;
+}
+
+DIV.tabs TD
+{
+   font-size        : x-small;
+   font-weight      : bold;
+   text-decoration  : none;
+}
+
+
+
+/* Commented Backslash Hack hides rule from IE5-Mac \*/
+DIV.tabs SPAN {float : none;}
+/* End IE5-Mac hack */
+
+DIV.tabs A:hover SPAN
+{
+   background-position: 0% -150px;
+}
+
+DIV.tabs LI#current A
+{
+   background-position: 100% -150px;
+   border-width     : 0px;
+}
+
+DIV.tabs LI#current SPAN
+{
+   background-position: 0% -150px;
+   padding-bottom   : 6px;
+}
+
+DIV.nav
+{
+   background       : none;
+   border           : none;
+   border-bottom    : 1px solid #84B0C7;
+}
Index: /GTP/trunk/App/Demos/Illum/Rain/docs/html/annotated.html
===================================================================
--- /GTP/trunk/App/Demos/Illum/Rain/docs/html/annotated.html	(revision 2221)
+++ /GTP/trunk/App/Demos/Illum/Rain/docs/html/annotated.html	(revision 2221)
@@ -0,0 +1,31 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>gametools-rain: Class List</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6 -->
+<div class="tabs">
+  <ul>
+    <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+    <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+  </ul></div>
+<div class="tabs">
+  <ul>
+    <li id="current"><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+    <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+    <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+  </ul></div>
+<h1>gametools-rain Class List</h1>Here are the classes, structs, unions and interfaces with brief descriptions:<table>
+  <tr><td class="indexkey"><a class="el" href="classCloseDropsParticles.html">CloseDropsParticles</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="classRainApp.html">RainApp</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="classRainFrameListener.html">RainFrameListener</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="classRainLight.html">RainLight</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="classTextureFrameListener.html">TextureFrameListener</a></td><td class="indexvalue"></td></tr>
+</table>
+<hr size="1"><address style="align: right;"><small>Generated on Wed May 17 16:55:30 2006 for gametools-rain by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
+</body>
+</html>
Index: /GTP/trunk/App/Demos/Illum/Rain/docs/html/hierarchy.html
===================================================================
--- /GTP/trunk/App/Demos/Illum/Rain/docs/html/hierarchy.html	(revision 2221)
+++ /GTP/trunk/App/Demos/Illum/Rain/docs/html/hierarchy.html	(revision 2221)
@@ -0,0 +1,31 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>gametools-rain: Hierarchical Index</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6 -->
+<div class="tabs">
+  <ul>
+    <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+    <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+  </ul></div>
+<div class="tabs">
+  <ul>
+    <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+    <li id="current"><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+    <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+  </ul></div>
+<h1>gametools-rain Class Hierarchy</h1>This inheritance list is sorted roughly, but not completely, alphabetically:<ul>
+<li><a class="el" href="classCloseDropsParticles.html">CloseDropsParticles</a>
+<li><a class="el" href="classRainApp.html">RainApp</a>
+<li><a class="el" href="classRainFrameListener.html">RainFrameListener</a>
+<li><a class="el" href="classRainLight.html">RainLight</a>
+<li><a class="el" href="classTextureFrameListener.html">TextureFrameListener</a>
+</ul>
+<hr size="1"><address style="align: right;"><small>Generated on Wed May 17 16:55:30 2006 for gametools-rain by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
+</body>
+</html>
Index: /GTP/trunk/App/Demos/Illum/Rain/docs/html/RainLight_8h-source.html
===================================================================
--- /GTP/trunk/App/Demos/Illum/Rain/docs/html/RainLight_8h-source.html	(revision 2221)
+++ /GTP/trunk/App/Demos/Illum/Rain/docs/html/RainLight_8h-source.html	(revision 2221)
@@ -0,0 +1,129 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>gametools-rain: RainLight.h Source File</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6 -->
+<div class="tabs">
+  <ul>
+    <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+    <li><a href="annotated.html"><span>Classes</span></a></li>
+    <li id="current"><a href="files.html"><span>Files</span></a></li>
+  </ul></div>
+<h1>RainLight.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 
+<a name="l00003"></a>00003 <span class="comment">//</span>
+<a name="l00004"></a>00004 <span class="comment">//              Realistic rain real-time simulation program</span>
+<a name="l00005"></a>00005 <span class="comment">//</span>
+<a name="l00006"></a>00006 <span class="comment">//              Pierre Rousseau</span>
+<a name="l00007"></a>00007 <span class="comment">//</span>
+<a name="l00009"></a>00009 <span class="comment"></span><span class="comment">//</span>
+<a name="l00010"></a>00010 <span class="comment">//              Light Handling</span>
+<a name="l00011"></a>00011 <span class="comment">//</span>
+<a name="l00013"></a>00013 <span class="comment"></span>
+<a name="l00014"></a>00014 
+<a name="l00015"></a>00015 <span class="preprocessor">#ifndef __RAIN_LIGHT__</span>
+<a name="l00016"></a>00016 <span class="preprocessor"></span><span class="preprocessor">#define __RAIN_LIGHT__</span>
+<a name="l00017"></a>00017 <span class="preprocessor"></span>
+<a name="l00018"></a>00018 
+<a name="l00019"></a>00019 
+<a name="l00020"></a>00020 <span class="preprocessor">#include "CommonRain.h"</span>
+<a name="l00021"></a>00021 <span class="preprocessor">#include "ExampleApplication.h"</span>
+<a name="l00022"></a>00022 <span class="preprocessor">#include &lt;vector&gt;</span>
+<a name="l00023"></a>00023 
+<a name="l00024"></a>00024 
+<a name="l00025"></a>00025 
+<a name="l00026"></a>00026 
+<a name="l00030"></a><a class="code" href="classRainLight.html">00030</a> <span class="keyword">class </span><a class="code" href="classRainLight.html">RainLight</a>
+<a name="l00031"></a>00031 {
+<a name="l00032"></a>00032 <span class="keyword">private</span> :
+<a name="l00033"></a>00033     SceneManager *mSceneMgr;
+<a name="l00034"></a>00034     SceneNode *mLightNode;
+<a name="l00035"></a>00035     SceneNode *mConeNode;
+<a name="l00036"></a>00036     BillboardSet *mBillboardSet;
+<a name="l00037"></a>00037     Billboard *mBillboard;
+<a name="l00038"></a>00038 
+<a name="l00039"></a>00039     ColourValue mColour;
+<a name="l00040"></a>00040     Vector3 mLightPos, mLightInitialPos, mLightDir;
+<a name="l00041"></a>00041     <span class="keywordtype">float</span> mLightCutoff, mLightAttenuation;
+<a name="l00042"></a>00042     <span class="keywordtype">bool</span> isAnimated;
+<a name="l00043"></a>00043 
+<a name="l00044"></a>00044 
+<a name="l00045"></a>00045     <span class="keywordtype">float</span> stepH1, stepH2, stepH3, stepV1, stepV2;
+<a name="l00046"></a>00046     <span class="keywordtype">float</span> h1, h2, h3;
+<a name="l00047"></a>00047     <span class="keywordtype">float</span> v1, v2;
+<a name="l00048"></a>00048 
+<a name="l00049"></a>00049 <span class="keyword">public</span> :
+<a name="l00051"></a>00051     <a class="code" href="classRainLight.html#3f7303451d4241cba55324c9eeb7ef00">RainLight</a>(SceneManager *sceneMgr, <span class="keywordtype">int</span> lightNumber = 0, ColourValue col = ColourValue::Red, Vector3 LightPos = Vector3(0, 0, 0), <span class="keywordtype">float</span> LightAttenuation = 150);
+<a name="l00052"></a>00052 
+<a name="l00053"></a>00053     <span class="keywordtype">void</span> animate();
+<a name="l00054"></a>00054 
+<a name="l00055"></a>00055     ColourValue getColour()
+<a name="l00056"></a>00056     {
+<a name="l00057"></a>00057         <span class="keywordflow">return</span> mColour;
+<a name="l00058"></a>00058     }
+<a name="l00059"></a>00059 
+<a name="l00060"></a>00060     Vector3 getPosition()
+<a name="l00061"></a>00061     {
+<a name="l00062"></a>00062         <span class="keywordflow">return</span> mLightPos;
+<a name="l00063"></a>00063     }
+<a name="l00064"></a>00064 
+<a name="l00065"></a>00065     Vector3 getDirection()
+<a name="l00066"></a>00066     {
+<a name="l00067"></a>00067         <span class="keywordflow">return</span> mLightDir;
+<a name="l00068"></a>00068     }
+<a name="l00069"></a>00069 
+<a name="l00070"></a>00070     <span class="keywordtype">float</span> getCutoff()
+<a name="l00071"></a>00071     {
+<a name="l00072"></a>00072         <span class="keywordflow">return</span> mLightCutoff;
+<a name="l00073"></a>00073     }
+<a name="l00074"></a>00074 
+<a name="l00075"></a>00075     <span class="keywordtype">float</span> getAttenuation()
+<a name="l00076"></a>00076     {
+<a name="l00077"></a>00077         <span class="keywordflow">return</span> mLightAttenuation;
+<a name="l00078"></a>00078     }
+<a name="l00079"></a>00079 
+<a name="l00080"></a>00080     <span class="keywordtype">bool</span> getIsAnimated()
+<a name="l00081"></a>00081     {
+<a name="l00082"></a>00082         <span class="keywordflow">return</span> isAnimated;
+<a name="l00083"></a>00083     }
+<a name="l00084"></a>00084 
+<a name="l00085"></a>00085 };
+<a name="l00086"></a>00086 
+<a name="l00087"></a>00087 
+<a name="l00088"></a>00088 
+<a name="l00089"></a>00089 <span class="keyword">class </span>RainLightManager
+<a name="l00090"></a>00090 {
+<a name="l00091"></a>00091 <span class="keyword">private</span> :
+<a name="l00092"></a>00092     <span class="keywordtype">int</span> lightCount;
+<a name="l00093"></a>00093     std::vector&lt;RainLight *&gt; lightVector;
+<a name="l00094"></a>00094     SceneManager *mSceneMgr;
+<a name="l00095"></a>00095 
+<a name="l00096"></a>00096 <span class="keyword">public</span> :
+<a name="l00097"></a>00097     RainLightManager(SceneManager *sceneMgr);
+<a name="l00098"></a>00098 
+<a name="l00099"></a>00099     ~RainLightManager();
+<a name="l00100"></a>00100 
+<a name="l00101"></a>00101     <span class="keywordtype">int</span> getLightCount()
+<a name="l00102"></a>00102     {
+<a name="l00103"></a>00103         <span class="keywordflow">return</span> lightCount;
+<a name="l00104"></a>00104     }
+<a name="l00105"></a>00105 
+<a name="l00106"></a>00106     <span class="keywordtype">void</span> addStreetLight(ColourValue col = ColourValue::Red + ColourValue::Green + ColourValue::Blue, Vector3 LightPos = Vector3(0, 0, 0), <span class="keywordtype">float</span> LightAttenuation = 150);
+<a name="l00107"></a>00107 
+<a name="l00109"></a>00109     <span class="keywordtype">void</span> createLightInfoTexture();
+<a name="l00110"></a>00110 
+<a name="l00111"></a>00111     <span class="keywordtype">void</span> updateLightInfoTexture();
+<a name="l00112"></a>00112 
+<a name="l00113"></a>00113     <span class="keywordtype">void</span> updateLights();
+<a name="l00114"></a>00114 
+<a name="l00115"></a>00115     <span class="keywordtype">void</span> finalizeLights();
+<a name="l00116"></a>00116 };
+<a name="l00117"></a>00117 
+<a name="l00118"></a>00118 <span class="preprocessor">#endif // __RAIN_LIGHT__</span>
+<a name="l00119"></a>00119 <span class="preprocessor"></span>
+</pre></div><hr size="1"><address style="align: right;"><small>Generated on Wed May 17 16:55:30 2006 for gametools-rain by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
+</body>
+</html>
Index: /GTP/trunk/App/Demos/Illum/Rain/docs/html/classRainApp.html
===================================================================
--- /GTP/trunk/App/Demos/Illum/Rain/docs/html/classRainApp.html	(revision 2221)
+++ /GTP/trunk/App/Demos/Illum/Rain/docs/html/classRainApp.html	(revision 2221)
@@ -0,0 +1,184 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>gametools-rain: RainApp Class Reference</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6 -->
+<div class="tabs">
+  <ul>
+    <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+    <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+  </ul></div>
+<div class="tabs">
+  <ul>
+    <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+    <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+    <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+  </ul></div>
+<h1>RainApp Class Reference</h1><!-- doxytag: class="RainApp" --><a href="classRainApp-members.html">List of all members.</a><hr><a name="_details"></a><h2>Detailed Description</h2>
+Class : <a class="el" href="classRainApp.html">RainApp</a> : the application's starting point provided here as an example. you should uncomment the define statements in <a class="el" href="CommonRain_8h-source.html">CommonRain.h</a> if you wish to render streaks or snow or regular raindrops. 
+<p>
+<table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRainApp.html#daa84d15f79672b913f1f19600451b99">RainApp</a> ()</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRainApp.html#166d18092b93d4f8cf485986d5e94dbf">~RainApp</a> ()</td></tr>
+
+<tr><td colspan="2"><br><h2>Protected Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">virtual void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRainApp.html#2efc0cd656befa457bce27f4a80a99c9">chooseSceneManager</a> (void)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRainApp.html#a483339af0f95518bc0835a61d9447f3">createScene</a> (void)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRainApp.html#5065d75b2cc757f3bb0f0d52ddc2ad4d">createFrameListener</a> (void)</td></tr>
+
+</table>
+<hr><h2>Constructor &amp; Destructor Documentation</h2>
+<a class="anchor" name="daa84d15f79672b913f1f19600451b99"></a><!-- doxytag: member="RainApp::RainApp" ref="daa84d15f79672b913f1f19600451b99" args="()" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">RainApp::RainApp           </td>
+          <td class="md" valign="top">(&nbsp;</td>
+          <td class="mdname1" valign="top" nowrap>          </td>
+          <td class="md" valign="top">&nbsp;)&nbsp;</td>
+          <td class="md" nowrap><code> [inline]</code></td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+Basic constructor     </td>
+  </tr>
+</table>
+<a class="anchor" name="166d18092b93d4f8cf485986d5e94dbf"></a><!-- doxytag: member="RainApp::~RainApp" ref="166d18092b93d4f8cf485986d5e94dbf" args="()" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">RainApp::~RainApp           </td>
+          <td class="md" valign="top">(&nbsp;</td>
+          <td class="mdname1" valign="top" nowrap>          </td>
+          <td class="md" valign="top">&nbsp;)&nbsp;</td>
+          <td class="md" nowrap><code> [inline]</code></td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+destructor     </td>
+  </tr>
+</table>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="2efc0cd656befa457bce27f4a80a99c9"></a><!-- doxytag: member="RainApp::chooseSceneManager" ref="2efc0cd656befa457bce27f4a80a99c9" args="(void)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">virtual void RainApp::chooseSceneManager           </td>
+          <td class="md" valign="top">(&nbsp;</td>
+          <td class="md" nowrap valign="top">void&nbsp;</td>
+          <td class="mdname1" valign="top" nowrap>          </td>
+          <td class="md" valign="top">&nbsp;)&nbsp;</td>
+          <td class="md" nowrap><code> [inline, protected, virtual]</code></td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+function creating the scene manager used in the application     </td>
+  </tr>
+</table>
+<a class="anchor" name="5065d75b2cc757f3bb0f0d52ddc2ad4d"></a><!-- doxytag: member="RainApp::createFrameListener" ref="5065d75b2cc757f3bb0f0d52ddc2ad4d" args="(void)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">void RainApp::createFrameListener           </td>
+          <td class="md" valign="top">(&nbsp;</td>
+          <td class="md" nowrap valign="top">void&nbsp;</td>
+          <td class="mdname1" valign="top" nowrap>          </td>
+          <td class="md" valign="top">&nbsp;)&nbsp;</td>
+          <td class="md" nowrap><code> [inline, protected]</code></td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+function to connect the application to its scene manager     </td>
+  </tr>
+</table>
+<a class="anchor" name="a483339af0f95518bc0835a61d9447f3"></a><!-- doxytag: member="RainApp::createScene" ref="a483339af0f95518bc0835a61d9447f3" args="(void)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">void RainApp::createScene           </td>
+          <td class="md" valign="top">(&nbsp;</td>
+          <td class="md" nowrap valign="top">void&nbsp;</td>
+          <td class="mdname1" valign="top" nowrap>          </td>
+          <td class="md" valign="top">&nbsp;)&nbsp;</td>
+          <td class="md" nowrap><code> [inline, protected]</code></td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+function defining the contents of the scene, objects, and particles     </td>
+  </tr>
+</table>
+<hr>The documentation for this class was generated from the following file:<ul>
+<li>main.cpp</ul>
+<hr size="1"><address style="align: right;"><small>Generated on Wed May 17 16:55:30 2006 for gametools-rain by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
+</body>
+</html>
Index: /GTP/trunk/App/Demos/Illum/Rain/docs/html/RainManualHardwareBillboardMeshLoader_8h-source.html
===================================================================
--- /GTP/trunk/App/Demos/Illum/Rain/docs/html/RainManualHardwareBillboardMeshLoader_8h-source.html	(revision 2221)
+++ /GTP/trunk/App/Demos/Illum/Rain/docs/html/RainManualHardwareBillboardMeshLoader_8h-source.html	(revision 2221)
@@ -0,0 +1,151 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>gametools-rain: RainManualHardwareBillboardMeshLoader.h Source File</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6 -->
+<div class="tabs">
+  <ul>
+    <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+    <li><a href="annotated.html"><span>Classes</span></a></li>
+    <li id="current"><a href="files.html"><span>Files</span></a></li>
+  </ul></div>
+<h1>RainManualHardwareBillboardMeshLoader.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 
+<a name="l00003"></a>00003 <span class="comment">//</span>
+<a name="l00004"></a>00004 <span class="comment">//              Realistic rain real-time simulation program</span>
+<a name="l00005"></a>00005 <span class="comment">//</span>
+<a name="l00006"></a>00006 <span class="comment">//              Pierre Rousseau</span>
+<a name="l00007"></a>00007 <span class="comment">//</span>
+<a name="l00009"></a>00009 <span class="comment"></span><span class="comment">//</span>
+<a name="l00010"></a>00010 <span class="comment">//              Definition of the mesh for the particles</span>
+<a name="l00011"></a>00011 <span class="comment">//</span>
+<a name="l00013"></a>00013 <span class="comment"></span>
+<a name="l00014"></a>00014 
+<a name="l00015"></a>00015 <span class="preprocessor">#ifndef __HARDWARE_BILLBOARD_LOADER__</span>
+<a name="l00016"></a>00016 <span class="preprocessor"></span><span class="preprocessor">#define __HARDWARE_BILLBOARD_LOADER__</span>
+<a name="l00017"></a>00017 <span class="preprocessor"></span>
+<a name="l00018"></a>00018 
+<a name="l00019"></a>00019 <span class="preprocessor">#include &lt;OgreResource.h&gt;</span>
+<a name="l00020"></a>00020 
+<a name="l00021"></a>00021 
+<a name="l00022"></a>00022 
+<a name="l00023"></a>00023 <span class="keyword">class </span>ManualHardwareBillboardMeshLoader : <span class="keyword">public</span> ManualResourceLoader
+<a name="l00024"></a>00024 {
+<a name="l00025"></a>00025 <span class="keyword">private</span> :
+<a name="l00026"></a>00026     String mMaterialName;
+<a name="l00027"></a>00027 
+<a name="l00028"></a>00028 <span class="keyword">public</span> :
+<a name="l00029"></a>00029 
+<a name="l00030"></a>00030     ManualHardwareBillboardMeshLoader(String materialName)
+<a name="l00031"></a>00031     {
+<a name="l00032"></a>00032         mMaterialName = materialName;
+<a name="l00033"></a>00033     }
+<a name="l00034"></a>00034 
+<a name="l00035"></a>00035 
+<a name="l00036"></a>00036     <span class="keywordtype">void</span> loadResource(Resource *res)
+<a name="l00037"></a>00037     {
+<a name="l00038"></a>00038         Mesh* msh = static_cast&lt;Mesh*&gt;(res);
+<a name="l00039"></a>00039         SubMesh* sm = msh-&gt;createSubMesh();
+<a name="l00040"></a>00040         sm-&gt;useSharedVertices = <span class="keyword">false</span>;
+<a name="l00041"></a>00041         sm-&gt;vertexData = <span class="keyword">new</span> VertexData();
+<a name="l00042"></a>00042         sm-&gt;vertexData-&gt;vertexStart = 0;
+<a name="l00043"></a>00043         sm-&gt;vertexData-&gt;vertexCount = 4;
+<a name="l00044"></a>00044         VertexDeclaration* dcl = sm-&gt;vertexData-&gt;vertexDeclaration;
+<a name="l00045"></a>00045         size_t offset = 0;
+<a name="l00046"></a>00046         dcl-&gt;addElement(0, offset, VET_FLOAT3, VES_POSITION);
+<a name="l00047"></a>00047         offset += VertexElement::getTypeSize(VET_FLOAT3);
+<a name="l00048"></a>00048         dcl-&gt;addElement(0, offset, VET_FLOAT4, VES_TEXTURE_COORDINATES); <span class="comment">// xy will serve as regular texCoords, zw, for positionning in the texture</span>
+<a name="l00049"></a>00049         offset += VertexElement::getTypeSize(VET_FLOAT4);
+<a name="l00050"></a>00050 
+<a name="l00051"></a>00051         HardwareVertexBufferSharedPtr vbuf = HardwareBufferManager::getSingleton().createVertexBuffer(offset, 4, HardwareBuffer::HBU_STATIC_WRITE_ONLY);
+<a name="l00052"></a>00052         <span class="keywordtype">float</span>* pReal = static_cast&lt;float*&gt;(vbuf-&gt;lock(HardwareBuffer::HBL_DISCARD));
+<a name="l00053"></a>00053 
+<a name="l00054"></a>00054 
+<a name="l00055"></a>00055         <span class="comment">// vertex 0</span>
+<a name="l00056"></a>00056         <span class="comment">// position</span>
+<a name="l00057"></a>00057         *pReal++ = 0;
+<a name="l00058"></a>00058         *pReal++ = 0;
+<a name="l00059"></a>00059         *pReal++ = 0;
+<a name="l00060"></a>00060         <span class="comment">// uv</span>
+<a name="l00061"></a>00061         *pReal++ = 1;
+<a name="l00062"></a>00062         *pReal++ = 0;
+<a name="l00063"></a>00063         <span class="comment">// position texture coordinates</span>
+<a name="l00064"></a>00064         *pReal++ = 0;
+<a name="l00065"></a>00065         *pReal++ = 0;
+<a name="l00066"></a>00066 
+<a name="l00067"></a>00067         <span class="comment">// vertex 1</span>
+<a name="l00068"></a>00068         <span class="comment">// position</span>
+<a name="l00069"></a>00069         *pReal++ = 0;
+<a name="l00070"></a>00070         *pReal++ = 0;
+<a name="l00071"></a>00071         *pReal++ = 0;
+<a name="l00072"></a>00072         <span class="comment">// uv</span>
+<a name="l00073"></a>00073         *pReal++ = 0;
+<a name="l00074"></a>00074         *pReal++ = 0;
+<a name="l00075"></a>00075         <span class="comment">// position texture coordinates</span>
+<a name="l00076"></a>00076         *pReal++ = 0;
+<a name="l00077"></a>00077         *pReal++ = 0;
+<a name="l00078"></a>00078 
+<a name="l00079"></a>00079         <span class="comment">// vertex 2</span>
+<a name="l00080"></a>00080         <span class="comment">// position</span>
+<a name="l00081"></a>00081         *pReal++ = 0;
+<a name="l00082"></a>00082         *pReal++ = 0;
+<a name="l00083"></a>00083         *pReal++ = 0;
+<a name="l00084"></a>00084         <span class="comment">// uv</span>
+<a name="l00085"></a>00085         *pReal++ = 0;
+<a name="l00086"></a>00086         *pReal++ = 1;
+<a name="l00087"></a>00087         <span class="comment">// position texture coordinates</span>
+<a name="l00088"></a>00088         *pReal++ = 0;
+<a name="l00089"></a>00089         *pReal++ = 0;
+<a name="l00090"></a>00090 
+<a name="l00091"></a>00091         <span class="comment">// vertex 3</span>
+<a name="l00092"></a>00092         <span class="comment">// position</span>
+<a name="l00093"></a>00093         *pReal++ = 0;
+<a name="l00094"></a>00094         *pReal++ = 0;
+<a name="l00095"></a>00095         *pReal++ = 0;
+<a name="l00096"></a>00096         <span class="comment">// uv</span>
+<a name="l00097"></a>00097         *pReal++ = 1;
+<a name="l00098"></a>00098         *pReal++ = 1;
+<a name="l00099"></a>00099         <span class="comment">// position texture coordinates</span>
+<a name="l00100"></a>00100         *pReal++ = 0;
+<a name="l00101"></a>00101         *pReal++ = 0;
+<a name="l00102"></a>00102 
+<a name="l00103"></a>00103 
+<a name="l00104"></a>00104         vbuf-&gt;unlock();
+<a name="l00105"></a>00105 
+<a name="l00106"></a>00106         sm-&gt;vertexData-&gt;vertexBufferBinding-&gt;setBinding(0, vbuf);
+<a name="l00107"></a>00107         sm-&gt;indexData-&gt;indexCount = 6;
+<a name="l00108"></a>00108         sm-&gt;indexData-&gt;indexBuffer = HardwareBufferManager::getSingleton()
+<a name="l00109"></a>00109                                      .createIndexBuffer(HardwareIndexBuffer::IT_16BIT, 6,
+<a name="l00110"></a>00110                                                         HardwareBuffer::HBU_STATIC_WRITE_ONLY);
+<a name="l00111"></a>00111         uint16* pI = static_cast&lt;uint16*&gt;(
+<a name="l00112"></a>00112                          sm-&gt;indexData-&gt;indexBuffer-&gt;lock(HardwareBuffer::HBL_DISCARD))
+<a name="l00113"></a>00113                      ;
+<a name="l00114"></a>00114 
+<a name="l00115"></a>00115         <span class="comment">// we link vertices 0, 1, and 2</span>
+<a name="l00116"></a>00116         *pI++ = 0;
+<a name="l00117"></a>00117         *pI++ = 1;
+<a name="l00118"></a>00118         *pI++ = 2;
+<a name="l00119"></a>00119 
+<a name="l00120"></a>00120         <span class="comment">// second triangle : we link vertices 0, 2, and 3</span>
+<a name="l00121"></a>00121         *pI++ = 0;
+<a name="l00122"></a>00122         *pI++ = 2;
+<a name="l00123"></a>00123         *pI++ = 3;
+<a name="l00124"></a>00124 
+<a name="l00125"></a>00125         sm-&gt;indexData-&gt;indexBuffer-&gt;unlock();
+<a name="l00126"></a>00126 
+<a name="l00127"></a>00127         sm-&gt;setMaterialName(mMaterialName);
+<a name="l00128"></a>00128 
+<a name="l00129"></a>00129 
+<a name="l00130"></a>00130         msh-&gt;_setBounds(AxisAlignedBox(0,0,0,0,0,0), <span class="keyword">true</span>);
+<a name="l00131"></a>00131         msh-&gt;_setBoundingSphereRadius(1);
+<a name="l00132"></a>00132     }
+<a name="l00133"></a>00133 };
+<a name="l00134"></a>00134 
+<a name="l00135"></a>00135 
+<a name="l00136"></a>00136 <span class="preprocessor">#endif //__HARDWARE_BILLBOARD_LOADER__</span>
+</pre></div><hr size="1"><address style="align: right;"><small>Generated on Wed May 17 16:55:30 2006 for gametools-rain by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
+</body>
+</html>
Index: /GTP/trunk/App/Demos/Illum/Rain/docs/html/functions_func.html
===================================================================
--- /GTP/trunk/App/Demos/Illum/Rain/docs/html/functions_func.html	(revision 2221)
+++ /GTP/trunk/App/Demos/Illum/Rain/docs/html/functions_func.html	(revision 2221)
@@ -0,0 +1,112 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>gametools-rain: Class Members - Functions</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6 -->
+<div class="tabs">
+  <ul>
+    <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+    <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+  </ul></div>
+<div class="tabs">
+  <ul>
+    <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+    <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+    <li id="current"><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+  </ul></div>
+<div class="tabs">
+  <ul>
+    <li><a href="functions.html"><span>All</span></a></li>
+    <li id="current"><a href="functions_func.html"><span>Functions</span></a></li>
+    <li><a href="functions_vars.html"><span>Variables</span></a></li>
+  </ul>
+</div>
+<div class="tabs">
+  <ul>
+    <li><a href="#index_c"><span>c</span></a></li>
+    <li><a href="#index_d"><span>d</span></a></li>
+    <li><a href="#index_f"><span>f</span></a></li>
+    <li><a href="#index_g"><span>g</span></a></li>
+    <li><a href="#index_h"><span>h</span></a></li>
+    <li><a href="#index_m"><span>m</span></a></li>
+    <li><a href="#index_p"><span>p</span></a></li>
+    <li><a href="#index_r"><span>r</span></a></li>
+    <li><a href="#index_s"><span>s</span></a></li>
+    <li><a href="#index_t"><span>t</span></a></li>
+    <li><a href="#index_u"><span>u</span></a></li>
+    <li><a href="#index_~"><span>~</span></a></li>
+  </ul>
+</div>
+
+<p>
+&nbsp;
+<p>
+<h3><a class="anchor" name="index_c">- c -</a></h3><ul>
+<li>chooseSceneManager()
+: <a class="el" href="classRainApp.html#2efc0cd656befa457bce27f4a80a99c9">RainApp</a><li>CloseDropsParticles()
+: <a class="el" href="classCloseDropsParticles.html#854ab941991fcb21d1640fc6d938e408">CloseDropsParticles</a><li>createFrameListener()
+: <a class="el" href="classRainApp.html#5065d75b2cc757f3bb0f0d52ddc2ad4d">RainApp</a><li>createLights()
+: <a class="el" href="classCloseDropsParticles.html#f8ced0c0f82c037a0d4a6a685c9b0435">CloseDropsParticles</a><li>createScene()
+: <a class="el" href="classRainApp.html#a483339af0f95518bc0835a61d9447f3">RainApp</a></ul>
+<h3><a class="anchor" name="index_d">- d -</a></h3><ul>
+<li>definePosTextureAndBackup()
+: <a class="el" href="classCloseDropsParticles.html#1353cbebfae74f3e9e8cbb9b9e429089">CloseDropsParticles</a><li>displayMessage()
+: <a class="el" href="classRainFrameListener.html#ea5fb5d71d65f6aed207feb5a3db7b09">RainFrameListener</a></ul>
+<h3><a class="anchor" name="index_f">- f -</a></h3><ul>
+<li>frameEnded()
+: <a class="el" href="classRainFrameListener.html#2b35f43facecdc5efd19060f234289c1">RainFrameListener</a><li>frameStarted()
+: <a class="el" href="classRainFrameListener.html#11baf48c2d3f2880dfc1a6451df01545">RainFrameListener</a></ul>
+<h3><a class="anchor" name="index_g">- g -</a></h3><ul>
+<li>getLightManagerPtr()
+: <a class="el" href="classCloseDropsParticles.html#07b630c2f9893453cf7a6a0a81704d85">CloseDropsParticles</a></ul>
+<h3><a class="anchor" name="index_h">- h -</a></h3><ul>
+<li>hidePositionBillboards()
+: <a class="el" href="classCloseDropsParticles.html#9be4bfaed25d7fb306f353fcf38553b3">CloseDropsParticles</a></ul>
+<h3><a class="anchor" name="index_m">- m -</a></h3><ul>
+<li>makeControlOverlay()
+: <a class="el" href="classCloseDropsParticles.html#1ea41c537ac5a889452f8b311d161e3d">CloseDropsParticles</a></ul>
+<h3><a class="anchor" name="index_p">- p -</a></h3><ul>
+<li>postRenderTargetUpdate()
+: <a class="el" href="classTextureFrameListener.html#82fc4bbfe697af3b9391005549626393">TextureFrameListener</a><li>preRenderTargetUpdate()
+: <a class="el" href="classTextureFrameListener.html#f562539756bf7c75fd2414ece67879eb">TextureFrameListener</a></ul>
+<h3><a class="anchor" name="index_r">- r -</a></h3><ul>
+<li>RainApp()
+: <a class="el" href="classRainApp.html#daa84d15f79672b913f1f19600451b99">RainApp</a><li>RainFrameListener()
+: <a class="el" href="classRainFrameListener.html#7ffa91734beebaa997cb27e814f572fe">RainFrameListener</a><li>RainLight()
+: <a class="el" href="classRainLight.html#3f7303451d4241cba55324c9eeb7ef00">RainLight</a></ul>
+<h3><a class="anchor" name="index_s">- s -</a></h3><ul>
+<li>showPositionBillboards()
+: <a class="el" href="classCloseDropsParticles.html#7504154f99f56be93e7ebf5e374ef506">CloseDropsParticles</a></ul>
+<h3><a class="anchor" name="index_t">- t -</a></h3><ul>
+<li>TextureFrameListener()
+: <a class="el" href="classTextureFrameListener.html#5e03071dea9753aa265037cdc94e311d">TextureFrameListener</a></ul>
+<h3><a class="anchor" name="index_u">- u -</a></h3><ul>
+<li>updateBoxMax()
+: <a class="el" href="classCloseDropsParticles.html#98be1ed6e9561ed2afbf3b625fc55428">CloseDropsParticles</a><li>updateBoxMin()
+: <a class="el" href="classCloseDropsParticles.html#3a2aca7152213edefb89ce819069e47a">CloseDropsParticles</a><li>updateFallVector()
+: <a class="el" href="classCloseDropsParticles.html#1a590aabe2601cf7705423e8724874a9">CloseDropsParticles</a><li>updateFragmentProgramParameter()
+: <a class="el" href="classCloseDropsParticles.html#abb13ff5aac1fa66da4473c936fc5bed">CloseDropsParticles</a><li>updateLastMove()
+: <a class="el" href="classCloseDropsParticles.html#91e9858663a5155b23c734703b807fd9">CloseDropsParticles</a><li>updateLightCount()
+: <a class="el" href="classCloseDropsParticles.html#b09a148f6d44e4ee87a5081c74757a98">CloseDropsParticles</a><li>updateLights()
+: <a class="el" href="classCloseDropsParticles.html#d2686c928601912243528dbf93f122e3">CloseDropsParticles</a><li>updatePositionTexture()
+: <a class="el" href="classCloseDropsParticles.html#e7e63a1a54ec6368046e377ef02ed622">CloseDropsParticles</a><li>updateRainBilboardSideLength()
+: <a class="el" href="classCloseDropsParticles.html#f9de759fa82c8ec7042200d2370e74d6">CloseDropsParticles</a><li>updateRandomMove()
+: <a class="el" href="classCloseDropsParticles.html#c6ecb49d550648cf42ca847088ba7f84">CloseDropsParticles</a><li>updateShaderParameters()
+: <a class="el" href="classCloseDropsParticles.html#382d373910aeeca4da9c4c2c21d3c474">CloseDropsParticles</a><li>updateStats()
+: <a class="el" href="classRainFrameListener.html#fb74925a5b7856838701cdeed0523924">RainFrameListener</a><li>updateStreaksHeight()
+: <a class="el" href="classCloseDropsParticles.html#c12db346d5dcb629eece45cf16827718">CloseDropsParticles</a><li>updateTimeSinceLastFrame()
+: <a class="el" href="classCloseDropsParticles.html#faf0938f86626973a5f787a339d68e39">CloseDropsParticles</a><li>updateViewDir()
+: <a class="el" href="classCloseDropsParticles.html#f1b8b1a995996677bd75584ef85b1596">CloseDropsParticles</a><li>updateViewPos()
+: <a class="el" href="classCloseDropsParticles.html#2925efdc8a09636534a780a34e8bffdf">CloseDropsParticles</a></ul>
+<h3><a class="anchor" name="index_~">- ~ -</a></h3><ul>
+<li>~CloseDropsParticles()
+: <a class="el" href="classCloseDropsParticles.html#9f3718c6d0721b1bce367ec2d55f2b35">CloseDropsParticles</a><li>~RainApp()
+: <a class="el" href="classRainApp.html#166d18092b93d4f8cf485986d5e94dbf">RainApp</a></ul>
+<hr size="1"><address style="align: right;"><small>Generated on Wed May 17 16:55:30 2006 for gametools-rain by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
+</body>
+</html>
Index: /GTP/trunk/App/Demos/Illum/Rain/docs/html/RainTextureFrameListener_8h-source.html
===================================================================
--- /GTP/trunk/App/Demos/Illum/Rain/docs/html/RainTextureFrameListener_8h-source.html	(revision 2221)
+++ /GTP/trunk/App/Demos/Illum/Rain/docs/html/RainTextureFrameListener_8h-source.html	(revision 2221)
@@ -0,0 +1,56 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>gametools-rain: RainTextureFrameListener.h Source File</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6 -->
+<div class="tabs">
+  <ul>
+    <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+    <li><a href="annotated.html"><span>Classes</span></a></li>
+    <li id="current"><a href="files.html"><span>Files</span></a></li>
+  </ul></div>
+<h1>RainTextureFrameListener.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 
+<a name="l00003"></a>00003 <span class="comment">//</span>
+<a name="l00004"></a>00004 <span class="comment">//              Realistic rain real-time simulation program</span>
+<a name="l00005"></a>00005 <span class="comment">//</span>
+<a name="l00006"></a>00006 <span class="comment">//              Pierre Rousseau</span>
+<a name="l00007"></a>00007 <span class="comment">//</span>
+<a name="l00009"></a>00009 <span class="comment"></span><span class="comment">//</span>
+<a name="l00010"></a>00010 <span class="comment">//              Texture cameras handling</span>
+<a name="l00011"></a>00011 <span class="comment">//</span>
+<a name="l00013"></a>00013 <span class="comment"></span>
+<a name="l00014"></a>00014 
+<a name="l00015"></a>00015 
+<a name="l00016"></a>00016 <span class="preprocessor">#ifndef __RAIN_TEXTURE_FRAME_LISTENER__</span>
+<a name="l00017"></a>00017 <span class="preprocessor"></span><span class="preprocessor">#define __RAIN_TEXTURE_FRAME_LISTENER__</span>
+<a name="l00018"></a>00018 <span class="preprocessor"></span>
+<a name="l00019"></a>00019 
+<a name="l00020"></a>00020 <span class="preprocessor">#include "CommonRain.h"</span>
+<a name="l00021"></a>00021 <span class="preprocessor">#include "OgreRenderTargetListener.h"</span>
+<a name="l00022"></a>00022 <span class="preprocessor">#include "ExampleApplication.h"</span>
+<a name="l00023"></a>00023 
+<a name="l00024"></a>00024 
+<a name="l00025"></a>00025 
+<a name="l00029"></a><a class="code" href="classTextureFrameListener.html">00029</a> <span class="keyword">class </span><a class="code" href="classTextureFrameListener.html">TextureFrameListener</a> : <span class="keyword">public</span> Ogre::RenderTargetListener
+<a name="l00030"></a>00030 {
+<a name="l00031"></a>00031 <span class="keyword">private</span> :
+<a name="l00032"></a>00032     SceneManager* mSceneMgr;
+<a name="l00033"></a>00033 
+<a name="l00034"></a>00034 <span class="keyword">public</span>:
+<a name="l00036"></a>00036     <a class="code" href="classTextureFrameListener.html#5e03071dea9753aa265037cdc94e311d">TextureFrameListener</a>(SceneManager* SceneMgr);
+<a name="l00037"></a>00037 
+<a name="l00039"></a>00039     <span class="keywordtype">void</span> <a class="code" href="classTextureFrameListener.html#f562539756bf7c75fd2414ece67879eb">preRenderTargetUpdate</a> (<span class="keyword">const</span> Ogre::RenderTargetEvent &amp;evt);
+<a name="l00040"></a>00040 
+<a name="l00042"></a>00042     <span class="keywordtype">void</span> <a class="code" href="classTextureFrameListener.html#82fc4bbfe697af3b9391005549626393">postRenderTargetUpdate</a> (<span class="keyword">const</span> Ogre::RenderTargetEvent &amp;evt);
+<a name="l00043"></a>00043 };
+<a name="l00044"></a>00044 
+<a name="l00045"></a>00045 
+<a name="l00046"></a>00046 <span class="preprocessor">#endif //__RAIN_TEXTURE_FRAME_LISTENER__</span>
+<a name="l00047"></a>00047 <span class="preprocessor"></span>
+</pre></div><hr size="1"><address style="align: right;"><small>Generated on Wed May 17 16:55:30 2006 for gametools-rain by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
+</body>
+</html>
Index: /GTP/trunk/App/Demos/Illum/Rain/docs/html/classRainFrameListener-members.html
===================================================================
--- /GTP/trunk/App/Demos/Illum/Rain/docs/html/classRainFrameListener-members.html	(revision 2221)
+++ /GTP/trunk/App/Demos/Illum/Rain/docs/html/classRainFrameListener-members.html	(revision 2221)
@@ -0,0 +1,30 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>gametools-rain: Member List</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6 -->
+<div class="tabs">
+  <ul>
+    <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+    <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+  </ul></div>
+<div class="tabs">
+  <ul>
+    <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+    <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+    <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+  </ul></div>
+<h1>RainFrameListener Member List</h1>This is the complete list of members for <a class="el" href="classRainFrameListener.html">RainFrameListener</a>, including all inherited members.<p><table>
+  <tr class="memlist"><td><a class="el" href="classRainFrameListener.html#ea5fb5d71d65f6aed207feb5a3db7b09">displayMessage</a>(String text)</td><td><a class="el" href="classRainFrameListener.html">RainFrameListener</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classRainFrameListener.html#2b35f43facecdc5efd19060f234289c1">frameEnded</a>(const FrameEvent &amp;evt)</td><td><a class="el" href="classRainFrameListener.html">RainFrameListener</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classRainFrameListener.html#11baf48c2d3f2880dfc1a6451df01545">frameStarted</a>(const FrameEvent &amp;evt)</td><td><a class="el" href="classRainFrameListener.html">RainFrameListener</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classRainFrameListener.html#7ffa91734beebaa997cb27e814f572fe">RainFrameListener</a>(RenderWindow *win, Camera *cam, SceneNode *ViewNode, SceneNode *CameraNode, CloseDropsParticles *syst)</td><td><a class="el" href="classRainFrameListener.html">RainFrameListener</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classRainFrameListener.html#fb74925a5b7856838701cdeed0523924">updateStats</a>(void)</td><td><a class="el" href="classRainFrameListener.html">RainFrameListener</a></td><td><code> [protected]</code></td></tr>
+</table><hr size="1"><address style="align: right;"><small>Generated on Wed May 17 16:55:30 2006 for gametools-rain by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
+</body>
+</html>
Index: /GTP/trunk/App/Demos/Illum/Rain/docs/html/RainCloseDropsParticles_8h-source.html
===================================================================
--- /GTP/trunk/App/Demos/Illum/Rain/docs/html/RainCloseDropsParticles_8h-source.html	(revision 2221)
+++ /GTP/trunk/App/Demos/Illum/Rain/docs/html/RainCloseDropsParticles_8h-source.html	(revision 2221)
@@ -0,0 +1,137 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>gametools-rain: RainCloseDropsParticles.h Source File</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6 -->
+<div class="tabs">
+  <ul>
+    <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+    <li><a href="annotated.html"><span>Classes</span></a></li>
+    <li id="current"><a href="files.html"><span>Files</span></a></li>
+  </ul></div>
+<h1>RainCloseDropsParticles.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 
+<a name="l00003"></a>00003 <span class="comment">//</span>
+<a name="l00004"></a>00004 <span class="comment">//              Realistic rain real-time simulation program</span>
+<a name="l00005"></a>00005 <span class="comment">//</span>
+<a name="l00006"></a>00006 <span class="comment">//              Pierre Rousseau</span>
+<a name="l00007"></a>00007 <span class="comment">//</span>
+<a name="l00009"></a>00009 <span class="comment"></span><span class="comment">//</span>
+<a name="l00010"></a>00010 <span class="comment">//              Particle systems handling</span>
+<a name="l00011"></a>00011 <span class="comment">//</span>
+<a name="l00013"></a>00013 <span class="comment"></span>
+<a name="l00014"></a>00014 <span class="preprocessor">#ifndef __RAIN_CLOSE_DROPS_PARTICLES__</span>
+<a name="l00015"></a>00015 <span class="preprocessor"></span><span class="preprocessor">#define __RAIN_CLOSE_DROPS_PARTICLES__</span>
+<a name="l00016"></a>00016 <span class="preprocessor"></span>
+<a name="l00017"></a>00017 
+<a name="l00018"></a>00018 <span class="preprocessor">#include "CommonRain.h"</span>
+<a name="l00019"></a>00019 <span class="preprocessor">#include "RainTextureFrameListener.h"</span>
+<a name="l00020"></a>00020 <span class="preprocessor">#include "RainManualHardwareBillboardMeshLoader.h"</span>
+<a name="l00021"></a>00021 <span class="preprocessor">#include "RainLight.h"</span>
+<a name="l00022"></a>00022 
+<a name="l00023"></a>00023 
+<a name="l00024"></a>00024 
+<a name="l00025"></a>00025 
+<a name="l00026"></a>00026 
+<a name="l00027"></a>00027 
+<a name="l00031"></a><a class="code" href="classCloseDropsParticles.html">00031</a> <span class="keyword">class </span><a class="code" href="classCloseDropsParticles.html">CloseDropsParticles</a>
+<a name="l00032"></a>00032 {
+<a name="l00033"></a>00033 <span class="keyword">private</span> :
+<a name="l00034"></a>00034     SceneManager *mSceneMgr;
+<a name="l00035"></a>00035     RainLightManager *mRainLightMgr;
+<a name="l00036"></a>00036     SceneNode *mParticlesNode, *mParentCam, *mParentSyst;
+<a name="l00037"></a>00037 
+<a name="l00038"></a>00038     <span class="comment">// wide angle camera used to render the drops</span>
+<a name="l00039"></a>00039     Ogre::Camera *mCamera;
+<a name="l00040"></a>00040     RenderTexture *dropsTexture;
+<a name="l00041"></a>00041     MaterialPtr dropsTexturesMaterial;
+<a name="l00042"></a>00042 
+<a name="l00043"></a>00043     <span class="comment">// simulation textures, containing particle positions</span>
+<a name="l00044"></a>00044     <span class="keywordtype">int</span> mActiveParticlesCount;
+<a name="l00045"></a>00045     RenderTexture *particlePosTexture, *particlePosTextureBackup;
+<a name="l00046"></a>00046 
+<a name="l00047"></a>00047     BillboardSet *bbSet1, *bbSet2; <span class="comment">// billboardsets for ping-pong position textures</span>
+<a name="l00048"></a>00048 
+<a name="l00049"></a>00049 
+<a name="l00050"></a>00050 <span class="keyword">public</span> :
+<a name="l00052"></a><a class="code" href="classCloseDropsParticles.html#1e01a41391f939b3f4e1f2b140f9f192">00052</a>     <span class="keywordtype">float</span> <a class="code" href="classCloseDropsParticles.html#1e01a41391f939b3f4e1f2b140f9f192">mRainWidth</a>;
+<a name="l00054"></a><a class="code" href="classCloseDropsParticles.html#9812ff8eb6059ecc22d1a659a3581262">00054</a>     <span class="keywordtype">float</span> <a class="code" href="classCloseDropsParticles.html#9812ff8eb6059ecc22d1a659a3581262">mRainStreaksHeight</a>;
+<a name="l00055"></a>00055 
+<a name="l00056"></a>00056 
+<a name="l00064"></a>00064     <a class="code" href="classCloseDropsParticles.html#854ab941991fcb21d1640fc6d938e408">CloseDropsParticles</a>(SceneManager *sceneMgr, SceneNode *parentSyst, SceneNode *parentCam);
+<a name="l00065"></a>00065 
+<a name="l00067"></a>00067     <a class="code" href="classCloseDropsParticles.html#9f3718c6d0721b1bce367ec2d55f2b35">~CloseDropsParticles</a>();
+<a name="l00068"></a>00068 
+<a name="l00070"></a>00070     <span class="keywordtype">void</span> <a class="code" href="classCloseDropsParticles.html#f8ced0c0f82c037a0d4a6a685c9b0435">createLights</a>();
+<a name="l00071"></a>00071 
+<a name="l00073"></a>00073     RainLightManager *<a class="code" href="classCloseDropsParticles.html#07b630c2f9893453cf7a6a0a81704d85">getLightManagerPtr</a>();
+<a name="l00074"></a>00074 
+<a name="l00076"></a>00076     <span class="keywordtype">void</span> <a class="code" href="classCloseDropsParticles.html#d2686c928601912243528dbf93f122e3">updateLights</a>();
+<a name="l00077"></a>00077 
+<a name="l00079"></a>00079     <span class="keywordtype">void</span> <a class="code" href="classCloseDropsParticles.html#1353cbebfae74f3e9e8cbb9b9e429089">definePosTextureAndBackup</a>();
+<a name="l00080"></a>00080 
+<a name="l00082"></a>00082     <span class="keywordtype">void</span> <a class="code" href="classCloseDropsParticles.html#1ea41c537ac5a889452f8b311d161e3d">makeControlOverlay</a>();
+<a name="l00083"></a>00083 
+<a name="l00085"></a>00085     <span class="keywordtype">void</span> <a class="code" href="classCloseDropsParticles.html#e7e63a1a54ec6368046e377ef02ed622">updatePositionTexture</a>(<span class="keywordtype">bool</span> primary);
+<a name="l00086"></a>00086 
+<a name="l00088"></a>00088     <span class="keywordtype">void</span> <a class="code" href="classCloseDropsParticles.html#ed530332d6ea95622da6d65d2f453a0f">updateFragmentProgramParameter</a>(<span class="keyword">const</span> String &amp;name, <span class="keywordtype">float</span> value);
+<a name="l00090"></a>00090     <span class="keywordtype">void</span> <a class="code" href="classCloseDropsParticles.html#ed530332d6ea95622da6d65d2f453a0f">updateFragmentProgramParameter</a>(<span class="keyword">const</span> String &amp;name, Ogre::Vector3 value);
+<a name="l00092"></a>00092     <span class="keywordtype">void</span> <a class="code" href="classCloseDropsParticles.html#ed530332d6ea95622da6d65d2f453a0f">updateFragmentProgramParameter</a>(<span class="keyword">const</span> String &amp;name, Ogre::Vector4 value);
+<a name="l00096"></a>00096     <span class="keywordtype">void</span> <a class="code" href="classCloseDropsParticles.html#382d373910aeeca4da9c4c2c21d3c474">updateShaderParameters</a>(<span class="keywordtype">float</span> tslf, <span class="keywordtype">float</span> rainBbSide, <span class="keywordtype">float</span> streaksHeight, <span class="keywordtype">int</span> nbLights,
+<a name="l00097"></a>00097                                 Vector3 viewPos, Vector3 viewDir, Vector3 fallVect, Vector3 boxMin, Vector3 boxMax, Vector3 lastMove, Vector3 randomMove, <span class="keywordtype">int</span> useShader);
+<a name="l00098"></a>00098 
+<a name="l00099"></a>00099 
+<a name="l00101"></a>00101     <span class="keywordtype">void</span> <a class="code" href="classCloseDropsParticles.html#faf0938f86626973a5f787a339d68e39">updateTimeSinceLastFrame</a>(<span class="keywordtype">float</span> tslf);
+<a name="l00103"></a>00103     <span class="keywordtype">void</span> <a class="code" href="classCloseDropsParticles.html#f9de759fa82c8ec7042200d2370e74d6">updateRainBilboardSideLength</a>(<span class="keywordtype">float</span> rainBbSide);
+<a name="l00105"></a>00105     <span class="keywordtype">void</span> <a class="code" href="classCloseDropsParticles.html#c12db346d5dcb629eece45cf16827718">updateStreaksHeight</a>(<span class="keywordtype">float</span> streaksHeight);
+<a name="l00107"></a>00107     <span class="keywordtype">void</span> <a class="code" href="classCloseDropsParticles.html#b09a148f6d44e4ee87a5081c74757a98">updateLightCount</a>(<span class="keywordtype">float</span> nbLights);
+<a name="l00109"></a>00109     <span class="keywordtype">void</span> <a class="code" href="classCloseDropsParticles.html#2925efdc8a09636534a780a34e8bffdf">updateViewPos</a>(Vector3 viewPos);
+<a name="l00111"></a>00111     <span class="keywordtype">void</span> <a class="code" href="classCloseDropsParticles.html#f1b8b1a995996677bd75584ef85b1596">updateViewDir</a>(Vector3 viewDir);
+<a name="l00113"></a>00113     <span class="keywordtype">void</span> <a class="code" href="classCloseDropsParticles.html#1a590aabe2601cf7705423e8724874a9">updateFallVector</a>(Vector3 fallVect);
+<a name="l00115"></a>00115     <span class="keywordtype">void</span> <a class="code" href="classCloseDropsParticles.html#3a2aca7152213edefb89ce819069e47a">updateBoxMin</a>(Vector3 boxMin);
+<a name="l00117"></a>00117     <span class="keywordtype">void</span> <a class="code" href="classCloseDropsParticles.html#98be1ed6e9561ed2afbf3b625fc55428">updateBoxMax</a>(Vector3 boxMax);
+<a name="l00119"></a>00119     <span class="keywordtype">void</span> <a class="code" href="classCloseDropsParticles.html#91e9858663a5155b23c734703b807fd9">updateLastMove</a>(Vector3 lastMove);
+<a name="l00121"></a>00121     <span class="keywordtype">void</span> <a class="code" href="classCloseDropsParticles.html#c6ecb49d550648cf42ca847088ba7f84">updateRandomMove</a>(Vector3 randomMove);
+<a name="l00122"></a>00122 
+<a name="l00125"></a><a class="code" href="classCloseDropsParticles.html#9be4bfaed25d7fb306f353fcf38553b3">00125</a>     <span class="keywordtype">void</span> <a class="code" href="classCloseDropsParticles.html#9be4bfaed25d7fb306f353fcf38553b3">hidePositionBillboards</a>()
+<a name="l00126"></a>00126     {
+<a name="l00127"></a>00127         bbSet1-&gt;setVisible(<span class="keyword">false</span>);
+<a name="l00128"></a>00128         bbSet2-&gt;setVisible(<span class="keyword">false</span>);
+<a name="l00129"></a>00129     }
+<a name="l00132"></a><a class="code" href="classCloseDropsParticles.html#7504154f99f56be93e7ebf5e374ef506">00132</a>     <span class="keywordtype">void</span> <a class="code" href="classCloseDropsParticles.html#7504154f99f56be93e7ebf5e374ef506">showPositionBillboards</a>()
+<a name="l00133"></a>00133     {
+<a name="l00134"></a>00134         bbSet1-&gt;setVisible(<span class="keyword">true</span>);
+<a name="l00135"></a>00135         bbSet2-&gt;setVisible(<span class="keyword">true</span>);
+<a name="l00136"></a>00136     }
+<a name="l00137"></a>00137 
+<a name="l00138"></a>00138 <span class="keyword">private</span> :
+<a name="l00139"></a>00139 
+<a name="l00141"></a>00141     <span class="keywordtype">void</span> createMaterial(String name);
+<a name="l00142"></a>00142 
+<a name="l00144"></a>00144     Camera* createDropsCamera();
+<a name="l00145"></a>00145 
+<a name="l00147"></a>00147     <span class="keywordtype">void</span> GPUmaterial();
+<a name="l00148"></a>00148     
+<a name="l00150"></a>00150     <span class="keywordtype">void</span> initializeBillboardsPositionTexture();
+<a name="l00151"></a>00151     
+<a name="l00153"></a>00153     MeshPtr createHardwareBillboardMesh(String materialName, String meshName=BILLBOARD_MESH_NAME);
+<a name="l00154"></a>00154 
+<a name="l00156"></a>00156     <span class="keywordtype">void</span> modifyClonedHardwareBillboardMesh(MeshPtr msh, <span class="keywordtype">int</span> partNumber);
+<a name="l00157"></a>00157 
+<a name="l00159"></a>00159     <span class="keywordtype">void</span> initParticles();
+<a name="l00160"></a>00160     
+<a name="l00162"></a>00162     <span class="keywordtype">void</span> createBillboardsPositionRenderTexture(RenderTexture *PSPosTexture, Vector3 nodePos, BillboardSet *bbSet);
+<a name="l00163"></a>00163 
+<a name="l00165"></a>00165     <span class="keywordtype">void</span> createBillboardsPositionTextureMaterial(String inputTextureName);
+<a name="l00166"></a>00166 };
+<a name="l00167"></a>00167 
+<a name="l00168"></a>00168 
+<a name="l00169"></a>00169 
+<a name="l00170"></a>00170 
+<a name="l00171"></a>00171 <span class="preprocessor">#endif // __RAIN_CLOSE_DROPS_PARTICLES__</span>
+</pre></div><hr size="1"><address style="align: right;"><small>Generated on Wed May 17 16:55:30 2006 for gametools-rain by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
+</body>
+</html>
Index: /GTP/trunk/App/Demos/Illum/Rain/docs/html/CommonRain_8h-source.html
===================================================================
--- /GTP/trunk/App/Demos/Illum/Rain/docs/html/CommonRain_8h-source.html	(revision 2221)
+++ /GTP/trunk/App/Demos/Illum/Rain/docs/html/CommonRain_8h-source.html	(revision 2221)
@@ -0,0 +1,93 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>gametools-rain: CommonRain.h Source File</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6 -->
+<div class="tabs">
+  <ul>
+    <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+    <li><a href="annotated.html"><span>Classes</span></a></li>
+    <li id="current"><a href="files.html"><span>Files</span></a></li>
+  </ul></div>
+<h1>CommonRain.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 
+<a name="l00003"></a>00003 <span class="comment">//</span>
+<a name="l00004"></a>00004 <span class="comment">//              Realistic rain real-time simulation program</span>
+<a name="l00005"></a>00005 <span class="comment">//</span>
+<a name="l00006"></a>00006 <span class="comment">//              Pierre Rousseau</span>
+<a name="l00007"></a>00007 <span class="comment">//</span>
+<a name="l00009"></a>00009 <span class="comment"></span><span class="comment">//</span>
+<a name="l00010"></a>00010 <span class="comment">//              Global definitions</span>
+<a name="l00011"></a>00011 <span class="comment">//</span>
+<a name="l00013"></a>00013 <span class="comment"></span>
+<a name="l00014"></a>00014 
+<a name="l00015"></a>00015 
+<a name="l00016"></a>00016 <span class="preprocessor">#ifndef __COMMON_RAIN__</span>
+<a name="l00017"></a>00017 <span class="preprocessor"></span><span class="preprocessor">#define __COMMON_RAIN__</span>
+<a name="l00018"></a>00018 <span class="preprocessor"></span>
+<a name="l00019"></a>00019 
+<a name="l00023"></a>00023 
+<a name="l00024"></a>00024 <span class="comment">// currently incompatible with STREAKS or LIGHT_EXTENSION :</span>
+<a name="l00025"></a>00025 <span class="comment">//#define SNOW</span>
+<a name="l00026"></a>00026 
+<a name="l00027"></a>00027 <span class="preprocessor">#ifndef SNOW</span>
+<a name="l00028"></a>00028 <span class="preprocessor"></span><span class="comment">//#define STREAKS</span>
+<a name="l00029"></a>00029 
+<a name="l00030"></a>00030 <span class="preprocessor">#define LIGHT_EXTENSION</span>
+<a name="l00031"></a>00031 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00032"></a>00032 <span class="preprocessor"></span>
+<a name="l00033"></a>00033 
+<a name="l00037"></a>00037 <span class="comment">// size of the "render to texture" : if using frame buffer copy, must be less than the frame buffer size</span>
+<a name="l00038"></a>00038 <span class="preprocessor">#define RTTSIZE 512</span>
+<a name="l00039"></a>00039 <span class="preprocessor"></span>
+<a name="l00040"></a>00040 <span class="preprocessor">#define _PI 3.1415926535</span>
+<a name="l00041"></a>00041 <span class="preprocessor"></span><span class="preprocessor">#define FOVyCam (_PI/3.0)</span>
+<a name="l00042"></a>00042 <span class="preprocessor"></span><span class="preprocessor">#define FOVyRtt (15.0 * _PI / 18.0)</span>
+<a name="l00043"></a>00043 <span class="preprocessor"></span>
+<a name="l00044"></a>00044 <span class="comment">// arbitrary unit = 0.1m</span>
+<a name="l00045"></a>00045 <span class="preprocessor">#define HAUTEUR_OBSERVATEUR 18.0</span>
+<a name="l00046"></a>00046 <span class="preprocessor"></span>
+<a name="l00047"></a>00047 
+<a name="l00048"></a>00048 
+<a name="l00053"></a>00053 
+<a name="l00054"></a>00054 
+<a name="l00055"></a>00055 <span class="preprocessor">#define PARTICLE_POSITION_TEXTURE_NAME          "floating_point_RTT_ping"</span>
+<a name="l00056"></a>00056 <span class="preprocessor"></span><span class="preprocessor">#define PARTICLE_POSITION_BACKUP_TEXTURE_NAME   "floating_point_RTT_pong"</span>
+<a name="l00057"></a>00057 <span class="preprocessor"></span><span class="preprocessor">#define PARTICLE_POSITION_INIT_TEXTURE_NAME     "floating_point_initializer"</span>
+<a name="l00058"></a>00058 <span class="preprocessor"></span>
+<a name="l00059"></a>00059 <span class="preprocessor">#define STATIC_GEOMETRY_NAME    "billboards_in_vertex_buffer"</span>
+<a name="l00060"></a>00060 <span class="preprocessor"></span>
+<a name="l00061"></a>00061 
+<a name="l00062"></a>00062 <span class="preprocessor">#define LIGHT_INFO_TEXTURE_NAME         "light_information_texture"</span>
+<a name="l00063"></a>00063 <span class="preprocessor"></span>
+<a name="l00064"></a>00064 <span class="preprocessor">#define BILLBOARD_MESH_NAME             "cloned_manual_mesh"</span>
+<a name="l00065"></a>00065 <span class="preprocessor"></span>
+<a name="l00066"></a>00066 <span class="preprocessor">#define RAIN_MATERIAL_NAME              "rain_system_material"</span>
+<a name="l00067"></a>00067 <span class="preprocessor"></span>
+<a name="l00068"></a>00068 <span class="preprocessor">#define REFRACT_RTT_NAME                "refract_rtt"</span>
+<a name="l00069"></a>00069 <span class="preprocessor"></span>
+<a name="l00070"></a>00070 
+<a name="l00071"></a>00071 <span class="preprocessor">#define PARTICLES_MIN_X         -2000</span>
+<a name="l00072"></a>00072 <span class="preprocessor"></span><span class="preprocessor">#define PARTICLES_MAX_X          2000</span>
+<a name="l00073"></a>00073 <span class="preprocessor"></span><span class="preprocessor">#define PARTICLES_MIN_Y           -10</span>
+<a name="l00074"></a>00074 <span class="preprocessor"></span><span class="preprocessor">#define PARTICLES_MAX_Y           100</span>
+<a name="l00075"></a>00075 <span class="preprocessor"></span><span class="preprocessor">#define PARTICLES_MIN_Z         -2000</span>
+<a name="l00076"></a>00076 <span class="preprocessor"></span><span class="preprocessor">#define PARTICLES_MAX_Z          2000</span>
+<a name="l00077"></a>00077 <span class="preprocessor"></span>
+<a name="l00078"></a>00078 
+<a name="l00079"></a>00079 
+<a name="l00080"></a>00080 <span class="preprocessor">#define VIS_PARTICLE_BOX_MIN_X          -50</span>
+<a name="l00081"></a>00081 <span class="preprocessor"></span><span class="preprocessor">#define VIS_PARTICLE_BOX_MAX_X           50</span>
+<a name="l00082"></a>00082 <span class="preprocessor"></span><span class="preprocessor">#define VIS_PARTICLE_BOX_MIN_Y          -20</span>
+<a name="l00083"></a>00083 <span class="preprocessor"></span><span class="preprocessor">#define VIS_PARTICLE_BOX_MAX_Y           80</span>
+<a name="l00084"></a>00084 <span class="preprocessor"></span><span class="preprocessor">#define VIS_PARTICLE_BOX_MIN_Z          -50</span>
+<a name="l00085"></a>00085 <span class="preprocessor"></span><span class="preprocessor">#define VIS_PARTICLE_BOX_MAX_Z           50</span>
+<a name="l00086"></a>00086 <span class="preprocessor"></span>
+<a name="l00087"></a>00087 
+<a name="l00088"></a>00088 <span class="preprocessor">#endif // __COMMON_RAIN__</span>
+</pre></div><hr size="1"><address style="align: right;"><small>Generated on Wed May 17 16:55:30 2006 for gametools-rain by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
+</body>
+</html>
Index: /GTP/trunk/App/Demos/Illum/Rain/docs/html/classRainLight-members.html
===================================================================
--- /GTP/trunk/App/Demos/Illum/Rain/docs/html/classRainLight-members.html	(revision 2221)
+++ /GTP/trunk/App/Demos/Illum/Rain/docs/html/classRainLight-members.html	(revision 2221)
@@ -0,0 +1,33 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>gametools-rain: Member List</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6 -->
+<div class="tabs">
+  <ul>
+    <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+    <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+  </ul></div>
+<div class="tabs">
+  <ul>
+    <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+    <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+    <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+  </ul></div>
+<h1>RainLight Member List</h1>This is the complete list of members for <a class="el" href="classRainLight.html">RainLight</a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>animate</b>() (defined in <a class="el" href="classRainLight.html">RainLight</a>)</td><td><a class="el" href="classRainLight.html">RainLight</a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>getAttenuation</b>() (defined in <a class="el" href="classRainLight.html">RainLight</a>)</td><td><a class="el" href="classRainLight.html">RainLight</a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>getColour</b>() (defined in <a class="el" href="classRainLight.html">RainLight</a>)</td><td><a class="el" href="classRainLight.html">RainLight</a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>getCutoff</b>() (defined in <a class="el" href="classRainLight.html">RainLight</a>)</td><td><a class="el" href="classRainLight.html">RainLight</a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>getDirection</b>() (defined in <a class="el" href="classRainLight.html">RainLight</a>)</td><td><a class="el" href="classRainLight.html">RainLight</a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>getIsAnimated</b>() (defined in <a class="el" href="classRainLight.html">RainLight</a>)</td><td><a class="el" href="classRainLight.html">RainLight</a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>getPosition</b>() (defined in <a class="el" href="classRainLight.html">RainLight</a>)</td><td><a class="el" href="classRainLight.html">RainLight</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classRainLight.html#3f7303451d4241cba55324c9eeb7ef00">RainLight</a>(SceneManager *sceneMgr, int lightNumber=0, ColourValue col=ColourValue::Red, Vector3 LightPos=Vector3(0, 0, 0), float LightAttenuation=150)</td><td><a class="el" href="classRainLight.html">RainLight</a></td><td></td></tr>
+</table><hr size="1"><address style="align: right;"><small>Generated on Wed May 17 16:55:30 2006 for gametools-rain by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
+</body>
+</html>
Index: /GTP/trunk/App/Demos/Illum/Rain/docs/html/classTextureFrameListener-members.html
===================================================================
--- /GTP/trunk/App/Demos/Illum/Rain/docs/html/classTextureFrameListener-members.html	(revision 2221)
+++ /GTP/trunk/App/Demos/Illum/Rain/docs/html/classTextureFrameListener-members.html	(revision 2221)
@@ -0,0 +1,28 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>gametools-rain: Member List</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6 -->
+<div class="tabs">
+  <ul>
+    <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+    <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+  </ul></div>
+<div class="tabs">
+  <ul>
+    <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+    <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+    <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+  </ul></div>
+<h1>TextureFrameListener Member List</h1>This is the complete list of members for <a class="el" href="classTextureFrameListener.html">TextureFrameListener</a>, including all inherited members.<p><table>
+  <tr class="memlist"><td><a class="el" href="classTextureFrameListener.html#82fc4bbfe697af3b9391005549626393">postRenderTargetUpdate</a>(const Ogre::RenderTargetEvent &amp;evt)</td><td><a class="el" href="classTextureFrameListener.html">TextureFrameListener</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classTextureFrameListener.html#f562539756bf7c75fd2414ece67879eb">preRenderTargetUpdate</a>(const Ogre::RenderTargetEvent &amp;evt)</td><td><a class="el" href="classTextureFrameListener.html">TextureFrameListener</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classTextureFrameListener.html#5e03071dea9753aa265037cdc94e311d">TextureFrameListener</a>(SceneManager *SceneMgr)</td><td><a class="el" href="classTextureFrameListener.html">TextureFrameListener</a></td><td></td></tr>
+</table><hr size="1"><address style="align: right;"><small>Generated on Wed May 17 16:55:30 2006 for gametools-rain by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
+</body>
+</html>
Index: /GTP/trunk/App/Demos/Illum/Rain/docs/html/classRainFrameListener.html
===================================================================
--- /GTP/trunk/App/Demos/Illum/Rain/docs/html/classRainFrameListener.html	(revision 2221)
+++ /GTP/trunk/App/Demos/Illum/Rain/docs/html/classRainFrameListener.html	(revision 2221)
@@ -0,0 +1,217 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>gametools-rain: RainFrameListener Class Reference</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6 -->
+<div class="tabs">
+  <ul>
+    <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+    <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+  </ul></div>
+<div class="tabs">
+  <ul>
+    <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+    <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+    <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+  </ul></div>
+<h1>RainFrameListener Class Reference</h1><!-- doxytag: class="RainFrameListener" --><code>#include &lt;<a class="el" href="RainFrameListener_8h-source.html">RainFrameListener.h</a>&gt;</code>
+<p>
+<a href="classRainFrameListener-members.html">List of all members.</a><hr><a name="_details"></a><h2>Detailed Description</h2>
+<a class="el" href="classRainFrameListener.html">RainFrameListener</a> class processes keyboard and mouse events, and performs all computations needed for each frame 
+<p>
+<table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRainFrameListener.html#7ffa91734beebaa997cb27e814f572fe">RainFrameListener</a> (RenderWindow *win, Camera *cam, SceneNode *ViewNode, SceneNode *CameraNode, <a class="el" href="classCloseDropsParticles.html">CloseDropsParticles</a> *syst)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRainFrameListener.html#11baf48c2d3f2880dfc1a6451df01545">frameStarted</a> (const FrameEvent &amp;evt)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRainFrameListener.html#2b35f43facecdc5efd19060f234289c1">frameEnded</a> (const FrameEvent &amp;evt)</td></tr>
+
+<tr><td colspan="2"><br><h2>Protected Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRainFrameListener.html#fb74925a5b7856838701cdeed0523924">updateStats</a> (void)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRainFrameListener.html#ea5fb5d71d65f6aed207feb5a3db7b09">displayMessage</a> (String text)</td></tr>
+
+</table>
+<hr><h2>Constructor &amp; Destructor Documentation</h2>
+<a class="anchor" name="7ffa91734beebaa997cb27e814f572fe"></a><!-- doxytag: member="RainFrameListener::RainFrameListener" ref="7ffa91734beebaa997cb27e814f572fe" args="(RenderWindow *win, Camera *cam, SceneNode *ViewNode, SceneNode *CameraNode, CloseDropsParticles *syst)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">RainFrameListener::RainFrameListener           </td>
+          <td class="md" valign="top">(&nbsp;</td>
+          <td class="md" nowrap valign="top">RenderWindow *&nbsp;</td>
+          <td class="mdname" nowrap> <em>win</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td class="md"></td>
+          <td class="md" nowrap>Camera *&nbsp;</td>
+          <td class="mdname" nowrap> <em>cam</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td class="md"></td>
+          <td class="md" nowrap>SceneNode *&nbsp;</td>
+          <td class="mdname" nowrap> <em>ViewNode</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td class="md"></td>
+          <td class="md" nowrap>SceneNode *&nbsp;</td>
+          <td class="mdname" nowrap> <em>CameraNode</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td class="md"></td>
+          <td class="md" nowrap><a class="el" href="classCloseDropsParticles.html">CloseDropsParticles</a> *&nbsp;</td>
+          <td class="mdname" nowrap> <em>syst</em></td>
+        </tr>
+        <tr>
+          <td class="md"></td>
+          <td class="md">)&nbsp;</td>
+          <td class="md" colspan="2"></td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+standard constructor<ul>
+<li>the renderWindow and camera are needed for reglar initialization of the frame listener</li><li>view node will only be translated (position of the observer and particle system)</li><li>cameranode, which must be attached to viewNode, will be rotated to look in any direction</li><li>syst is the particle system itself, which will need to be updated with user input, time since last frame... </li></ul>
+    </td>
+  </tr>
+</table>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="ea5fb5d71d65f6aed207feb5a3db7b09"></a><!-- doxytag: member="RainFrameListener::displayMessage" ref="ea5fb5d71d65f6aed207feb5a3db7b09" args="(String text)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">void RainFrameListener::displayMessage           </td>
+          <td class="md" valign="top">(&nbsp;</td>
+          <td class="md" nowrap valign="top">String&nbsp;</td>
+          <td class="mdname1" valign="top" nowrap> <em>text</em>          </td>
+          <td class="md" valign="top">&nbsp;)&nbsp;</td>
+          <td class="md" nowrap><code> [protected]</code></td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+function to set a specific text on the stats overlay     </td>
+  </tr>
+</table>
+<a class="anchor" name="2b35f43facecdc5efd19060f234289c1"></a><!-- doxytag: member="RainFrameListener::frameEnded" ref="2b35f43facecdc5efd19060f234289c1" args="(const FrameEvent &amp;evt)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">bool RainFrameListener::frameEnded           </td>
+          <td class="md" valign="top">(&nbsp;</td>
+          <td class="md" nowrap valign="top">const FrameEvent &amp;&nbsp;</td>
+          <td class="mdname1" valign="top" nowrap> <em>evt</em>          </td>
+          <td class="md" valign="top">&nbsp;)&nbsp;</td>
+          <td class="md" nowrap></td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+this function is called just after a frame gets rendered     </td>
+  </tr>
+</table>
+<a class="anchor" name="11baf48c2d3f2880dfc1a6451df01545"></a><!-- doxytag: member="RainFrameListener::frameStarted" ref="11baf48c2d3f2880dfc1a6451df01545" args="(const FrameEvent &amp;evt)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">bool RainFrameListener::frameStarted           </td>
+          <td class="md" valign="top">(&nbsp;</td>
+          <td class="md" nowrap valign="top">const FrameEvent &amp;&nbsp;</td>
+          <td class="mdname1" valign="top" nowrap> <em>evt</em>          </td>
+          <td class="md" valign="top">&nbsp;)&nbsp;</td>
+          <td class="md" nowrap></td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+this function is called just before a frame gets rendered Contains reactions to user input (keyboard, mouse), and calls for particle system update     </td>
+  </tr>
+</table>
+<a class="anchor" name="fb74925a5b7856838701cdeed0523924"></a><!-- doxytag: member="RainFrameListener::updateStats" ref="fb74925a5b7856838701cdeed0523924" args="(void)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">void RainFrameListener::updateStats           </td>
+          <td class="md" valign="top">(&nbsp;</td>
+          <td class="md" nowrap valign="top">void&nbsp;</td>
+          <td class="mdname1" valign="top" nowrap>          </td>
+          <td class="md" valign="top">&nbsp;)&nbsp;</td>
+          <td class="md" nowrap><code> [protected]</code></td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+function to update the text of the overlay with fps stats     </td>
+  </tr>
+</table>
+<hr>The documentation for this class was generated from the following files:<ul>
+<li><a class="el" href="RainFrameListener_8h-source.html">RainFrameListener.h</a><li>RainFrameListener.cpp</ul>
+<hr size="1"><address style="align: right;"><small>Generated on Wed May 17 16:55:30 2006 for gametools-rain by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
+</body>
+</html>
Index: /GTP/trunk/App/Demos/Illum/Rain/docs/html/doxygen.css
===================================================================
--- /GTP/trunk/App/Demos/Illum/Rain/docs/html/doxygen.css	(revision 2221)
+++ /GTP/trunk/App/Demos/Illum/Rain/docs/html/doxygen.css	(revision 2221)
@@ -0,0 +1,310 @@
+BODY,H1,H2,H3,H4,H5,H6,P,CENTER,TD,TH,UL,DL,DIV {
+	font-family: Geneva, Arial, Helvetica, sans-serif;
+}
+BODY,TD {
+       font-size: 90%;
+}
+H1 {
+	text-align: center;
+       font-size: 160%;
+}
+H2 {
+       font-size: 120%;
+}
+H3 {
+       font-size: 100%;
+}
+CAPTION { font-weight: bold }
+DIV.qindex {
+	width: 100%;
+	background-color: #e8eef2;
+	border: 1px solid #84b0c7;
+	text-align: center;
+	margin: 2px;
+	padding: 2px;
+	line-height: 140%;
+}
+DIV.nav {
+	width: 100%;
+	background-color: #e8eef2;
+	border: 1px solid #84b0c7;
+	text-align: center;
+	margin: 2px;
+	padding: 2px;
+	line-height: 140%;
+}
+DIV.navtab {
+       background-color: #e8eef2;
+       border: 1px solid #84b0c7;
+       text-align: center;
+       margin: 2px;
+       margin-right: 15px;
+       padding: 2px;
+}
+TD.navtab {
+       font-size: 70%;
+}
+A.qindex {
+       text-decoration: none;
+       font-weight: bold;
+       color: #1A419D;
+}
+A.qindex:visited {
+       text-decoration: none;
+       font-weight: bold;
+       color: #1A419D
+}
+A.qindex:hover {
+	text-decoration: none;
+	background-color: #ddddff;
+}
+A.qindexHL {
+	text-decoration: none;
+	font-weight: bold;
+	background-color: #6666cc;
+	color: #ffffff;
+	border: 1px double #9295C2;
+}
+A.qindexHL:hover {
+	text-decoration: none;
+	background-color: #6666cc;
+	color: #ffffff;
+}
+A.qindexHL:visited { text-decoration: none; background-color: #6666cc; color: #ffffff }
+A.el { text-decoration: none; font-weight: bold }
+A.elRef { font-weight: bold }
+A.code:link { text-decoration: none; font-weight: normal; color: #0000FF}
+A.code:visited { text-decoration: none; font-weight: normal; color: #0000FF}
+A.codeRef:link { font-weight: normal; color: #0000FF}
+A.codeRef:visited { font-weight: normal; color: #0000FF}
+A:hover { text-decoration: none; background-color: #f2f2ff }
+DL.el { margin-left: -1cm }
+.fragment {
+       font-family: Fixed, monospace;
+       font-size: 95%;
+}
+PRE.fragment {
+	border: 1px solid #CCCCCC;
+	background-color: #f5f5f5;
+	margin-top: 4px;
+	margin-bottom: 4px;
+	margin-left: 2px;
+	margin-right: 8px;
+	padding-left: 6px;
+	padding-right: 6px;
+	padding-top: 4px;
+	padding-bottom: 4px;
+}
+DIV.ah { background-color: black; font-weight: bold; color: #ffffff; margin-bottom: 3px; margin-top: 3px }
+TD.md { background-color: #F4F4FB; font-weight: bold; }
+TD.mdPrefix {
+       background-color: #F4F4FB;
+       color: #606060;
+	font-size: 80%;
+}
+TD.mdname1 { background-color: #F4F4FB; font-weight: bold; color: #602020; }
+TD.mdname { background-color: #F4F4FB; font-weight: bold; color: #602020; width: 600px; }
+DIV.groupHeader {
+       margin-left: 16px;
+       margin-top: 12px;
+       margin-bottom: 6px;
+       font-weight: bold;
+}
+DIV.groupText { margin-left: 16px; font-style: italic; font-size: 90% }
+BODY {
+	background: white;
+	color: black;
+	margin-right: 20px;
+	margin-left: 20px;
+}
+TD.indexkey {
+	background-color: #e8eef2;
+	font-weight: bold;
+	padding-right  : 10px;
+	padding-top    : 2px;
+	padding-left   : 10px;
+	padding-bottom : 2px;
+	margin-left    : 0px;
+	margin-right   : 0px;
+	margin-top     : 2px;
+	margin-bottom  : 2px;
+	border: 1px solid #CCCCCC;
+}
+TD.indexvalue {
+	background-color: #e8eef2;
+	font-style: italic;
+	padding-right  : 10px;
+	padding-top    : 2px;
+	padding-left   : 10px;
+	padding-bottom : 2px;
+	margin-left    : 0px;
+	margin-right   : 0px;
+	margin-top     : 2px;
+	margin-bottom  : 2px;
+	border: 1px solid #CCCCCC;
+}
+TR.memlist {
+   background-color: #f0f0f0; 
+}
+P.formulaDsp { text-align: center; }
+IMG.formulaDsp { }
+IMG.formulaInl { vertical-align: middle; }
+SPAN.keyword       { color: #008000 }
+SPAN.keywordtype   { color: #604020 }
+SPAN.keywordflow   { color: #e08000 }
+SPAN.comment       { color: #800000 }
+SPAN.preprocessor  { color: #806020 }
+SPAN.stringliteral { color: #002080 }
+SPAN.charliteral   { color: #008080 }
+.mdTable {
+	border: 1px solid #868686;
+	background-color: #F4F4FB;
+}
+.mdRow {
+	padding: 8px 10px;
+}
+.mdescLeft {
+       padding: 0px 8px 4px 8px;
+	font-size: 80%;
+	font-style: italic;
+	background-color: #FAFAFA;
+	border-top: 1px none #E0E0E0;
+	border-right: 1px none #E0E0E0;
+	border-bottom: 1px none #E0E0E0;
+	border-left: 1px none #E0E0E0;
+	margin: 0px;
+}
+.mdescRight {
+       padding: 0px 8px 4px 8px;
+	font-size: 80%;
+	font-style: italic;
+	background-color: #FAFAFA;
+	border-top: 1px none #E0E0E0;
+	border-right: 1px none #E0E0E0;
+	border-bottom: 1px none #E0E0E0;
+	border-left: 1px none #E0E0E0;
+	margin: 0px;
+}
+.memItemLeft {
+	padding: 1px 0px 0px 8px;
+	margin: 4px;
+	border-top-width: 1px;
+	border-right-width: 1px;
+	border-bottom-width: 1px;
+	border-left-width: 1px;
+	border-top-color: #E0E0E0;
+	border-right-color: #E0E0E0;
+	border-bottom-color: #E0E0E0;
+	border-left-color: #E0E0E0;
+	border-top-style: solid;
+	border-right-style: none;
+	border-bottom-style: none;
+	border-left-style: none;
+	background-color: #FAFAFA;
+	font-size: 80%;
+}
+.memItemRight {
+	padding: 1px 8px 0px 8px;
+	margin: 4px;
+	border-top-width: 1px;
+	border-right-width: 1px;
+	border-bottom-width: 1px;
+	border-left-width: 1px;
+	border-top-color: #E0E0E0;
+	border-right-color: #E0E0E0;
+	border-bottom-color: #E0E0E0;
+	border-left-color: #E0E0E0;
+	border-top-style: solid;
+	border-right-style: none;
+	border-bottom-style: none;
+	border-left-style: none;
+	background-color: #FAFAFA;
+	font-size: 80%;
+}
+.memTemplItemLeft {
+	padding: 1px 0px 0px 8px;
+	margin: 4px;
+	border-top-width: 1px;
+	border-right-width: 1px;
+	border-bottom-width: 1px;
+	border-left-width: 1px;
+	border-top-color: #E0E0E0;
+	border-right-color: #E0E0E0;
+	border-bottom-color: #E0E0E0;
+	border-left-color: #E0E0E0;
+	border-top-style: none;
+	border-right-style: none;
+	border-bottom-style: none;
+	border-left-style: none;
+	background-color: #FAFAFA;
+	font-size: 80%;
+}
+.memTemplItemRight {
+	padding: 1px 8px 0px 8px;
+	margin: 4px;
+	border-top-width: 1px;
+	border-right-width: 1px;
+	border-bottom-width: 1px;
+	border-left-width: 1px;
+	border-top-color: #E0E0E0;
+	border-right-color: #E0E0E0;
+	border-bottom-color: #E0E0E0;
+	border-left-color: #E0E0E0;
+	border-top-style: none;
+	border-right-style: none;
+	border-bottom-style: none;
+	border-left-style: none;
+	background-color: #FAFAFA;
+	font-size: 80%;
+}
+.memTemplParams {
+	padding: 1px 0px 0px 8px;
+	margin: 4px;
+	border-top-width: 1px;
+	border-right-width: 1px;
+	border-bottom-width: 1px;
+	border-left-width: 1px;
+	border-top-color: #E0E0E0;
+	border-right-color: #E0E0E0;
+	border-bottom-color: #E0E0E0;
+	border-left-color: #E0E0E0;
+	border-top-style: solid;
+	border-right-style: none;
+	border-bottom-style: none;
+	border-left-style: none;
+       color: #606060;
+	background-color: #FAFAFA;
+	font-size: 80%;
+}
+.search     { color: #003399;
+              font-weight: bold;
+}
+FORM.search {
+              margin-bottom: 0px;
+              margin-top: 0px;
+}
+INPUT.search { font-size: 75%;
+               color: #000080;
+               font-weight: normal;
+               background-color: #e8eef2;
+}
+TD.tiny      { font-size: 75%;
+}
+a {
+	color: #1A41A8;
+}
+a:visited {
+	color: #2A3798;
+}
+.dirtab { padding: 4px;
+          border-collapse: collapse;
+          border: 1px solid #84b0c7;
+}
+TH.dirtab { background: #e8eef2;
+            font-weight: bold;
+}
+HR { height: 1px;
+     border: none;
+     border-top: 1px solid black;
+}
+
Index: /GTP/trunk/App/Demos/Illum/Rain/docs/html/classCloseDropsParticles-members.html
===================================================================
--- /GTP/trunk/App/Demos/Illum/Rain/docs/html/classCloseDropsParticles-members.html	(revision 2221)
+++ /GTP/trunk/App/Demos/Illum/Rain/docs/html/classCloseDropsParticles-members.html	(revision 2221)
@@ -0,0 +1,52 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>gametools-rain: Member List</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6 -->
+<div class="tabs">
+  <ul>
+    <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+    <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+  </ul></div>
+<div class="tabs">
+  <ul>
+    <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+    <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+    <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+  </ul></div>
+<h1>CloseDropsParticles Member List</h1>This is the complete list of members for <a class="el" href="classCloseDropsParticles.html">CloseDropsParticles</a>, including all inherited members.<p><table>
+  <tr class="memlist"><td><a class="el" href="classCloseDropsParticles.html#854ab941991fcb21d1640fc6d938e408">CloseDropsParticles</a>(SceneManager *sceneMgr, SceneNode *parentSyst, SceneNode *parentCam)</td><td><a class="el" href="classCloseDropsParticles.html">CloseDropsParticles</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCloseDropsParticles.html#f8ced0c0f82c037a0d4a6a685c9b0435">createLights</a>()</td><td><a class="el" href="classCloseDropsParticles.html">CloseDropsParticles</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCloseDropsParticles.html#1353cbebfae74f3e9e8cbb9b9e429089">definePosTextureAndBackup</a>()</td><td><a class="el" href="classCloseDropsParticles.html">CloseDropsParticles</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCloseDropsParticles.html#07b630c2f9893453cf7a6a0a81704d85">getLightManagerPtr</a>()</td><td><a class="el" href="classCloseDropsParticles.html">CloseDropsParticles</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCloseDropsParticles.html#9be4bfaed25d7fb306f353fcf38553b3">hidePositionBillboards</a>()</td><td><a class="el" href="classCloseDropsParticles.html">CloseDropsParticles</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCloseDropsParticles.html#1ea41c537ac5a889452f8b311d161e3d">makeControlOverlay</a>()</td><td><a class="el" href="classCloseDropsParticles.html">CloseDropsParticles</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCloseDropsParticles.html#9812ff8eb6059ecc22d1a659a3581262">mRainStreaksHeight</a></td><td><a class="el" href="classCloseDropsParticles.html">CloseDropsParticles</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCloseDropsParticles.html#1e01a41391f939b3f4e1f2b140f9f192">mRainWidth</a></td><td><a class="el" href="classCloseDropsParticles.html">CloseDropsParticles</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCloseDropsParticles.html#7504154f99f56be93e7ebf5e374ef506">showPositionBillboards</a>()</td><td><a class="el" href="classCloseDropsParticles.html">CloseDropsParticles</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCloseDropsParticles.html#98be1ed6e9561ed2afbf3b625fc55428">updateBoxMax</a>(Vector3 boxMax)</td><td><a class="el" href="classCloseDropsParticles.html">CloseDropsParticles</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCloseDropsParticles.html#3a2aca7152213edefb89ce819069e47a">updateBoxMin</a>(Vector3 boxMin)</td><td><a class="el" href="classCloseDropsParticles.html">CloseDropsParticles</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCloseDropsParticles.html#1a590aabe2601cf7705423e8724874a9">updateFallVector</a>(Vector3 fallVect)</td><td><a class="el" href="classCloseDropsParticles.html">CloseDropsParticles</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCloseDropsParticles.html#ed530332d6ea95622da6d65d2f453a0f">updateFragmentProgramParameter</a>(const String &amp;name, float value)</td><td><a class="el" href="classCloseDropsParticles.html">CloseDropsParticles</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCloseDropsParticles.html#e6deff9c5de199bff8c4a8b12f57609e">updateFragmentProgramParameter</a>(const String &amp;name, Ogre::Vector3 value)</td><td><a class="el" href="classCloseDropsParticles.html">CloseDropsParticles</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCloseDropsParticles.html#abb13ff5aac1fa66da4473c936fc5bed">updateFragmentProgramParameter</a>(const String &amp;name, Ogre::Vector4 value)</td><td><a class="el" href="classCloseDropsParticles.html">CloseDropsParticles</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCloseDropsParticles.html#91e9858663a5155b23c734703b807fd9">updateLastMove</a>(Vector3 lastMove)</td><td><a class="el" href="classCloseDropsParticles.html">CloseDropsParticles</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCloseDropsParticles.html#b09a148f6d44e4ee87a5081c74757a98">updateLightCount</a>(float nbLights)</td><td><a class="el" href="classCloseDropsParticles.html">CloseDropsParticles</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCloseDropsParticles.html#d2686c928601912243528dbf93f122e3">updateLights</a>()</td><td><a class="el" href="classCloseDropsParticles.html">CloseDropsParticles</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCloseDropsParticles.html#e7e63a1a54ec6368046e377ef02ed622">updatePositionTexture</a>(bool primary)</td><td><a class="el" href="classCloseDropsParticles.html">CloseDropsParticles</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCloseDropsParticles.html#f9de759fa82c8ec7042200d2370e74d6">updateRainBilboardSideLength</a>(float rainBbSide)</td><td><a class="el" href="classCloseDropsParticles.html">CloseDropsParticles</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCloseDropsParticles.html#c6ecb49d550648cf42ca847088ba7f84">updateRandomMove</a>(Vector3 randomMove)</td><td><a class="el" href="classCloseDropsParticles.html">CloseDropsParticles</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCloseDropsParticles.html#382d373910aeeca4da9c4c2c21d3c474">updateShaderParameters</a>(float tslf, float rainBbSide, float streaksHeight, int nbLights, Vector3 viewPos, Vector3 viewDir, Vector3 fallVect, Vector3 boxMin, Vector3 boxMax, Vector3 lastMove, Vector3 randomMove, int useShader)</td><td><a class="el" href="classCloseDropsParticles.html">CloseDropsParticles</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCloseDropsParticles.html#c12db346d5dcb629eece45cf16827718">updateStreaksHeight</a>(float streaksHeight)</td><td><a class="el" href="classCloseDropsParticles.html">CloseDropsParticles</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCloseDropsParticles.html#faf0938f86626973a5f787a339d68e39">updateTimeSinceLastFrame</a>(float tslf)</td><td><a class="el" href="classCloseDropsParticles.html">CloseDropsParticles</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCloseDropsParticles.html#f1b8b1a995996677bd75584ef85b1596">updateViewDir</a>(Vector3 viewDir)</td><td><a class="el" href="classCloseDropsParticles.html">CloseDropsParticles</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCloseDropsParticles.html#2925efdc8a09636534a780a34e8bffdf">updateViewPos</a>(Vector3 viewPos)</td><td><a class="el" href="classCloseDropsParticles.html">CloseDropsParticles</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCloseDropsParticles.html#9f3718c6d0721b1bce367ec2d55f2b35">~CloseDropsParticles</a>()</td><td><a class="el" href="classCloseDropsParticles.html">CloseDropsParticles</a></td><td></td></tr>
+</table><hr size="1"><address style="align: right;"><small>Generated on Wed May 17 16:55:30 2006 for gametools-rain by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
+</body>
+</html>
Index: /GTP/trunk/App/Demos/Illum/Rain/docs/html/files.html
===================================================================
--- /GTP/trunk/App/Demos/Illum/Rain/docs/html/files.html	(revision 2221)
+++ /GTP/trunk/App/Demos/Illum/Rain/docs/html/files.html	(revision 2221)
@@ -0,0 +1,26 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>gametools-rain: File Index</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6 -->
+<div class="tabs">
+  <ul>
+    <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+    <li><a href="annotated.html"><span>Classes</span></a></li>
+    <li id="current"><a href="files.html"><span>Files</span></a></li>
+  </ul></div>
+<h1>gametools-rain File List</h1>Here is a list of all documented files with brief descriptions:<table>
+  <tr><td class="indexkey"><b>CommonRain.h</b> <a href="CommonRain_8h-source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><b>RainCloseDropsParticles.h</b> <a href="RainCloseDropsParticles_8h-source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><b>RainFrameListener.h</b> <a href="RainFrameListener_8h-source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><b>RainLight.h</b> <a href="RainLight_8h-source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><b>RainManualHardwareBillboardMeshLoader.h</b> <a href="RainManualHardwareBillboardMeshLoader_8h-source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><b>RainTextureFrameListener.h</b> <a href="RainTextureFrameListener_8h-source.html">[code]</a></td><td class="indexvalue"></td></tr>
+</table>
+<hr size="1"><address style="align: right;"><small>Generated on Wed May 17 16:55:30 2006 for gametools-rain by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
+</body>
+</html>
Index: /GTP/trunk/App/Demos/Illum/Rain/docs/html/functions_vars.html
===================================================================
--- /GTP/trunk/App/Demos/Illum/Rain/docs/html/functions_vars.html	(revision 2221)
+++ /GTP/trunk/App/Demos/Illum/Rain/docs/html/functions_vars.html	(revision 2221)
@@ -0,0 +1,37 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>gametools-rain: Class Members - Variables</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6 -->
+<div class="tabs">
+  <ul>
+    <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+    <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+  </ul></div>
+<div class="tabs">
+  <ul>
+    <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+    <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+    <li id="current"><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+  </ul></div>
+<div class="tabs">
+  <ul>
+    <li><a href="functions.html"><span>All</span></a></li>
+    <li><a href="functions_func.html"><span>Functions</span></a></li>
+    <li id="current"><a href="functions_vars.html"><span>Variables</span></a></li>
+  </ul>
+</div>
+&nbsp;
+<p>
+<ul>
+<li>mRainStreaksHeight
+: <a class="el" href="classCloseDropsParticles.html#9812ff8eb6059ecc22d1a659a3581262">CloseDropsParticles</a><li>mRainWidth
+: <a class="el" href="classCloseDropsParticles.html#1e01a41391f939b3f4e1f2b140f9f192">CloseDropsParticles</a></ul>
+<hr size="1"><address style="align: right;"><small>Generated on Wed May 17 16:55:30 2006 for gametools-rain by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
+</body>
+</html>
Index: /GTP/trunk/App/Demos/Illum/Rain/docs/html/classRainLight.html
===================================================================
--- /GTP/trunk/App/Demos/Illum/Rain/docs/html/classRainLight.html	(revision 2221)
+++ /GTP/trunk/App/Demos/Illum/Rain/docs/html/classRainLight.html	(revision 2221)
@@ -0,0 +1,114 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>gametools-rain: RainLight Class Reference</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6 -->
+<div class="tabs">
+  <ul>
+    <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+    <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+  </ul></div>
+<div class="tabs">
+  <ul>
+    <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+    <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+    <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+  </ul></div>
+<h1>RainLight Class Reference</h1><!-- doxytag: class="RainLight" --><code>#include &lt;<a class="el" href="RainLight_8h-source.html">RainLight.h</a>&gt;</code>
+<p>
+<a href="classRainLight-members.html">List of all members.</a><hr><a name="_details"></a><h2>Detailed Description</h2>
+<a class="el" href="classRainLight.html">RainLight</a> class enables a change of appearance of raindrops close to a light source 
+<p>
+<table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRainLight.html#3f7303451d4241cba55324c9eeb7ef00">RainLight</a> (SceneManager *sceneMgr, int lightNumber=0, ColourValue col=ColourValue::Red, Vector3 LightPos=Vector3(0, 0, 0), float LightAttenuation=150)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="74bc77e3b3a397f2b169b13d9f239c62"></a><!-- doxytag: member="RainLight::animate" ref="74bc77e3b3a397f2b169b13d9f239c62" args="()" -->
+void&nbsp;</td><td class="memItemRight" valign="bottom"><b>animate</b> ()</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="dbb03025b8fd524a31f3e0e8b13c9f5d"></a><!-- doxytag: member="RainLight::getColour" ref="dbb03025b8fd524a31f3e0e8b13c9f5d" args="()" -->
+ColourValue&nbsp;</td><td class="memItemRight" valign="bottom"><b>getColour</b> ()</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="28afdaf038a531fb8511b73b6292dda3"></a><!-- doxytag: member="RainLight::getPosition" ref="28afdaf038a531fb8511b73b6292dda3" args="()" -->
+Vector3&nbsp;</td><td class="memItemRight" valign="bottom"><b>getPosition</b> ()</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="508bea3a523740baa4913737773a8c95"></a><!-- doxytag: member="RainLight::getDirection" ref="508bea3a523740baa4913737773a8c95" args="()" -->
+Vector3&nbsp;</td><td class="memItemRight" valign="bottom"><b>getDirection</b> ()</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="250476ac8bc9c299d37e8d4c0e6ac1ef"></a><!-- doxytag: member="RainLight::getCutoff" ref="250476ac8bc9c299d37e8d4c0e6ac1ef" args="()" -->
+float&nbsp;</td><td class="memItemRight" valign="bottom"><b>getCutoff</b> ()</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="14854fc41dcc34ad7dece5ee1a1238ea"></a><!-- doxytag: member="RainLight::getAttenuation" ref="14854fc41dcc34ad7dece5ee1a1238ea" args="()" -->
+float&nbsp;</td><td class="memItemRight" valign="bottom"><b>getAttenuation</b> ()</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="22d2f9ce11e8e65caf85457649b2b1b2"></a><!-- doxytag: member="RainLight::getIsAnimated" ref="22d2f9ce11e8e65caf85457649b2b1b2" args="()" -->
+bool&nbsp;</td><td class="memItemRight" valign="bottom"><b>getIsAnimated</b> ()</td></tr>
+
+</table>
+<hr><h2>Constructor &amp; Destructor Documentation</h2>
+<a class="anchor" name="3f7303451d4241cba55324c9eeb7ef00"></a><!-- doxytag: member="RainLight::RainLight" ref="3f7303451d4241cba55324c9eeb7ef00" args="(SceneManager *sceneMgr, int lightNumber=0, ColourValue col=ColourValue::Red, Vector3 LightPos=Vector3(0, 0, 0), float LightAttenuation=150)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">RainLight::RainLight           </td>
+          <td class="md" valign="top">(&nbsp;</td>
+          <td class="md" nowrap valign="top">SceneManager *&nbsp;</td>
+          <td class="mdname" nowrap> <em>sceneMgr</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td class="md"></td>
+          <td class="md" nowrap>int&nbsp;</td>
+          <td class="mdname" nowrap> <em>lightNumber</em> = <code>0</code>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td class="md"></td>
+          <td class="md" nowrap>ColourValue&nbsp;</td>
+          <td class="mdname" nowrap> <em>col</em> = <code>ColourValue::Red</code>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td class="md"></td>
+          <td class="md" nowrap>Vector3&nbsp;</td>
+          <td class="mdname" nowrap> <em>LightPos</em> = <code>Vector3(0,&nbsp;0,&nbsp;0)</code>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td class="md"></td>
+          <td class="md" nowrap>float&nbsp;</td>
+          <td class="mdname" nowrap> <em>LightAttenuation</em> = <code>150</code></td>
+        </tr>
+        <tr>
+          <td class="md"></td>
+          <td class="md">)&nbsp;</td>
+          <td class="md" colspan="2"></td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+Constructor for street light. Should not be called directly. Use RainLightManager-&gt;addStreetLight() instead.     </td>
+  </tr>
+</table>
+<hr>The documentation for this class was generated from the following files:<ul>
+<li><a class="el" href="RainLight_8h-source.html">RainLight.h</a><li>RainLight.cpp</ul>
+<hr size="1"><address style="align: right;"><small>Generated on Wed May 17 16:55:30 2006 for gametools-rain by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
+</body>
+</html>
Index: /GTP/trunk/App/Demos/Illum/Rain/docs/html/RainFrameListener_8h-source.html
===================================================================
--- /GTP/trunk/App/Demos/Illum/Rain/docs/html/RainFrameListener_8h-source.html	(revision 2221)
+++ /GTP/trunk/App/Demos/Illum/Rain/docs/html/RainFrameListener_8h-source.html	(revision 2221)
@@ -0,0 +1,66 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>gametools-rain: RainFrameListener.h Source File</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6 -->
+<div class="tabs">
+  <ul>
+    <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+    <li><a href="annotated.html"><span>Classes</span></a></li>
+    <li id="current"><a href="files.html"><span>Files</span></a></li>
+  </ul></div>
+<h1>RainFrameListener.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 
+<a name="l00003"></a>00003 <span class="comment">//</span>
+<a name="l00004"></a>00004 <span class="comment">//              Realistic rain real-time simulation program</span>
+<a name="l00005"></a>00005 <span class="comment">//</span>
+<a name="l00006"></a>00006 <span class="comment">//              Pierre Rousseau</span>
+<a name="l00007"></a>00007 <span class="comment">//</span>
+<a name="l00009"></a>00009 <span class="comment"></span><span class="comment">//</span>
+<a name="l00010"></a>00010 <span class="comment">//              Main camera, and external events (mouse/keyboard) handling</span>
+<a name="l00011"></a>00011 <span class="comment">//</span>
+<a name="l00013"></a>00013 <span class="comment"></span>
+<a name="l00014"></a>00014 
+<a name="l00015"></a>00015 
+<a name="l00016"></a>00016 <span class="preprocessor">#ifndef __RAIN_FRAME_LISTENER__</span>
+<a name="l00017"></a>00017 <span class="preprocessor"></span><span class="preprocessor">#define __RAIN_FRAME_LISTENER__</span>
+<a name="l00018"></a>00018 <span class="preprocessor"></span>
+<a name="l00019"></a>00019 <span class="preprocessor">#include "CommonRain.h"</span>
+<a name="l00020"></a>00020 <span class="preprocessor">#include "RainCloseDropsParticles.h"</span>
+<a name="l00021"></a>00021 <span class="preprocessor">#include &lt;ExampleFrameListener.h&gt;</span>
+<a name="l00022"></a>00022 
+<a name="l00023"></a>00023 
+<a name="l00024"></a>00024 
+<a name="l00025"></a>00025 
+<a name="l00030"></a><a class="code" href="classRainFrameListener.html">00030</a> <span class="keyword">class </span><a class="code" href="classRainFrameListener.html">RainFrameListener</a> : <span class="keyword">public</span> ExampleFrameListener
+<a name="l00031"></a>00031 {
+<a name="l00032"></a>00032 <span class="keyword">private</span>:
+<a name="l00033"></a>00033 
+<a name="l00034"></a>00034     SceneNode *mViewNode, *mCameraNode;
+<a name="l00035"></a>00035     Real timer;
+<a name="l00036"></a>00036     <a class="code" href="classCloseDropsParticles.html">CloseDropsParticles</a> *mRainSystem;
+<a name="l00037"></a>00037 
+<a name="l00038"></a>00038 <span class="keyword">public</span>:
+<a name="l00039"></a>00039 
+<a name="l00047"></a>00047     <a class="code" href="classRainFrameListener.html#7ffa91734beebaa997cb27e814f572fe">RainFrameListener</a>(RenderWindow* win, Camera* cam, SceneNode* ViewNode, SceneNode* CameraNode, <a class="code" href="classCloseDropsParticles.html">CloseDropsParticles</a> *syst);
+<a name="l00048"></a>00048 
+<a name="l00053"></a>00053     <span class="keywordtype">bool</span> <a class="code" href="classRainFrameListener.html#11baf48c2d3f2880dfc1a6451df01545">frameStarted</a>(<span class="keyword">const</span> FrameEvent&amp; evt);
+<a name="l00054"></a>00054 
+<a name="l00058"></a>00058     <span class="keywordtype">bool</span> <a class="code" href="classRainFrameListener.html#2b35f43facecdc5efd19060f234289c1">frameEnded</a>(<span class="keyword">const</span> FrameEvent&amp; evt);
+<a name="l00059"></a>00059 
+<a name="l00060"></a>00060 <span class="keyword">protected</span>:
+<a name="l00064"></a>00064     <span class="keywordtype">void</span> <a class="code" href="classRainFrameListener.html#fb74925a5b7856838701cdeed0523924">updateStats</a>(<span class="keywordtype">void</span>);
+<a name="l00065"></a>00065 
+<a name="l00069"></a>00069     <span class="keywordtype">void</span> <a class="code" href="classRainFrameListener.html#ea5fb5d71d65f6aed207feb5a3db7b09">displayMessage</a>(String text);
+<a name="l00070"></a>00070 };
+<a name="l00071"></a>00071 
+<a name="l00072"></a>00072 
+<a name="l00073"></a>00073 
+<a name="l00074"></a>00074 
+<a name="l00075"></a>00075 <span class="preprocessor">#endif //__RAIN_FRAME_LISTENER__</span>
+</pre></div><hr size="1"><address style="align: right;"><small>Generated on Wed May 17 16:55:30 2006 for gametools-rain by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
+</body>
+</html>
Index: /GTP/trunk/App/Demos/Illum/Rain/docs/html/classTextureFrameListener.html
===================================================================
--- /GTP/trunk/App/Demos/Illum/Rain/docs/html/classTextureFrameListener.html	(revision 2221)
+++ /GTP/trunk/App/Demos/Illum/Rain/docs/html/classTextureFrameListener.html	(revision 2221)
@@ -0,0 +1,127 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>gametools-rain: TextureFrameListener Class Reference</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6 -->
+<div class="tabs">
+  <ul>
+    <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+    <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+  </ul></div>
+<div class="tabs">
+  <ul>
+    <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+    <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+    <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+  </ul></div>
+<h1>TextureFrameListener Class Reference</h1><!-- doxytag: class="TextureFrameListener" --><code>#include &lt;<a class="el" href="RainTextureFrameListener_8h-source.html">RainTextureFrameListener.h</a>&gt;</code>
+<p>
+<a href="classTextureFrameListener-members.html">List of all members.</a><hr><a name="_details"></a><h2>Detailed Description</h2>
+<a class="el" href="classTextureFrameListener.html">TextureFrameListener</a> class enables us not to see the particle systems in the textures we capture to texture our particles 
+<p>
+<table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTextureFrameListener.html#5e03071dea9753aa265037cdc94e311d">TextureFrameListener</a> (SceneManager *SceneMgr)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTextureFrameListener.html#f562539756bf7c75fd2414ece67879eb">preRenderTargetUpdate</a> (const Ogre::RenderTargetEvent &amp;evt)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTextureFrameListener.html#82fc4bbfe697af3b9391005549626393">postRenderTargetUpdate</a> (const Ogre::RenderTargetEvent &amp;evt)</td></tr>
+
+</table>
+<hr><h2>Constructor &amp; Destructor Documentation</h2>
+<a class="anchor" name="5e03071dea9753aa265037cdc94e311d"></a><!-- doxytag: member="TextureFrameListener::TextureFrameListener" ref="5e03071dea9753aa265037cdc94e311d" args="(SceneManager *SceneMgr)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">TextureFrameListener::TextureFrameListener           </td>
+          <td class="md" valign="top">(&nbsp;</td>
+          <td class="md" nowrap valign="top">SceneManager *&nbsp;</td>
+          <td class="mdname1" valign="top" nowrap> <em>SceneMgr</em>          </td>
+          <td class="md" valign="top">&nbsp;)&nbsp;</td>
+          <td class="md" nowrap></td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+constructor used when rain is rendered with a particle system     </td>
+  </tr>
+</table>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="82fc4bbfe697af3b9391005549626393"></a><!-- doxytag: member="TextureFrameListener::postRenderTargetUpdate" ref="82fc4bbfe697af3b9391005549626393" args="(const Ogre::RenderTargetEvent &amp;evt)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">void TextureFrameListener::postRenderTargetUpdate           </td>
+          <td class="md" valign="top">(&nbsp;</td>
+          <td class="md" nowrap valign="top">const Ogre::RenderTargetEvent &amp;&nbsp;</td>
+          <td class="mdname1" valign="top" nowrap> <em>evt</em>          </td>
+          <td class="md" valign="top">&nbsp;)&nbsp;</td>
+          <td class="md" nowrap></td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+post-render operations, shows the hidden rain system     </td>
+  </tr>
+</table>
+<a class="anchor" name="f562539756bf7c75fd2414ece67879eb"></a><!-- doxytag: member="TextureFrameListener::preRenderTargetUpdate" ref="f562539756bf7c75fd2414ece67879eb" args="(const Ogre::RenderTargetEvent &amp;evt)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">void TextureFrameListener::preRenderTargetUpdate           </td>
+          <td class="md" valign="top">(&nbsp;</td>
+          <td class="md" nowrap valign="top">const Ogre::RenderTargetEvent &amp;&nbsp;</td>
+          <td class="mdname1" valign="top" nowrap> <em>evt</em>          </td>
+          <td class="md" valign="top">&nbsp;)&nbsp;</td>
+          <td class="md" nowrap></td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+pre-render operations, hides the rain system, so it is not seen in the captured texture     </td>
+  </tr>
+</table>
+<hr>The documentation for this class was generated from the following files:<ul>
+<li><a class="el" href="RainTextureFrameListener_8h-source.html">RainTextureFrameListener.h</a><li>RainTextureFrameListener.cpp</ul>
+<hr size="1"><address style="align: right;"><small>Generated on Wed May 17 16:55:30 2006 for gametools-rain by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
+</body>
+</html>
Index: /GTP/trunk/App/Demos/Illum/Rain/docs/html/index.html
===================================================================
--- /GTP/trunk/App/Demos/Illum/Rain/docs/html/index.html	(revision 2221)
+++ /GTP/trunk/App/Demos/Illum/Rain/docs/html/index.html	(revision 2221)
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>gametools-rain: Main Page</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6 -->
+<div class="tabs">
+  <ul>
+    <li id="current"><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+    <li><a href="annotated.html"><span>Classes</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+  </ul></div>
+<h1>gametools-rain Documentation</h1>
+<p>
+<hr size="1"><address style="align: right;"><small>Generated on Wed May 17 16:55:30 2006 for gametools-rain by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
+</body>
+</html>
Index: /GTP/trunk/App/Demos/Illum/Rain/docs/html/classRainApp-members.html
===================================================================
--- /GTP/trunk/App/Demos/Illum/Rain/docs/html/classRainApp-members.html	(revision 2221)
+++ /GTP/trunk/App/Demos/Illum/Rain/docs/html/classRainApp-members.html	(revision 2221)
@@ -0,0 +1,30 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>gametools-rain: Member List</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6 -->
+<div class="tabs">
+  <ul>
+    <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+    <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+  </ul></div>
+<div class="tabs">
+  <ul>
+    <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+    <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+    <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+  </ul></div>
+<h1>RainApp Member List</h1>This is the complete list of members for <a class="el" href="classRainApp.html">RainApp</a>, including all inherited members.<p><table>
+  <tr class="memlist"><td><a class="el" href="classRainApp.html#2efc0cd656befa457bce27f4a80a99c9">chooseSceneManager</a>(void)</td><td><a class="el" href="classRainApp.html">RainApp</a></td><td><code> [inline, protected, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classRainApp.html#5065d75b2cc757f3bb0f0d52ddc2ad4d">createFrameListener</a>(void)</td><td><a class="el" href="classRainApp.html">RainApp</a></td><td><code> [inline, protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classRainApp.html#a483339af0f95518bc0835a61d9447f3">createScene</a>(void)</td><td><a class="el" href="classRainApp.html">RainApp</a></td><td><code> [inline, protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classRainApp.html#daa84d15f79672b913f1f19600451b99">RainApp</a>()</td><td><a class="el" href="classRainApp.html">RainApp</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classRainApp.html#166d18092b93d4f8cf485986d5e94dbf">~RainApp</a>()</td><td><a class="el" href="classRainApp.html">RainApp</a></td><td><code> [inline]</code></td></tr>
+</table><hr size="1"><address style="align: right;"><small>Generated on Wed May 17 16:55:30 2006 for gametools-rain by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
+</body>
+</html>
Index: /GTP/trunk/App/Demos/Illum/Rain/docs/html/functions.html
===================================================================
--- /GTP/trunk/App/Demos/Illum/Rain/docs/html/functions.html	(revision 2221)
+++ /GTP/trunk/App/Demos/Illum/Rain/docs/html/functions.html	(revision 2221)
@@ -0,0 +1,114 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>gametools-rain: Class Members</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6 -->
+<div class="tabs">
+  <ul>
+    <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+    <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+  </ul></div>
+<div class="tabs">
+  <ul>
+    <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+    <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+    <li id="current"><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+  </ul></div>
+<div class="tabs">
+  <ul>
+    <li id="current"><a href="functions.html"><span>All</span></a></li>
+    <li><a href="functions_func.html"><span>Functions</span></a></li>
+    <li><a href="functions_vars.html"><span>Variables</span></a></li>
+  </ul>
+</div>
+<div class="tabs">
+  <ul>
+    <li><a href="#index_c"><span>c</span></a></li>
+    <li><a href="#index_d"><span>d</span></a></li>
+    <li><a href="#index_f"><span>f</span></a></li>
+    <li><a href="#index_g"><span>g</span></a></li>
+    <li><a href="#index_h"><span>h</span></a></li>
+    <li><a href="#index_m"><span>m</span></a></li>
+    <li><a href="#index_p"><span>p</span></a></li>
+    <li><a href="#index_r"><span>r</span></a></li>
+    <li><a href="#index_s"><span>s</span></a></li>
+    <li><a href="#index_t"><span>t</span></a></li>
+    <li><a href="#index_u"><span>u</span></a></li>
+    <li><a href="#index_~"><span>~</span></a></li>
+  </ul>
+</div>
+
+<p>
+Here is a list of all documented class members with links to the class documentation for each member:
+<p>
+<h3><a class="anchor" name="index_c">- c -</a></h3><ul>
+<li>chooseSceneManager()
+: <a class="el" href="classRainApp.html#2efc0cd656befa457bce27f4a80a99c9">RainApp</a><li>CloseDropsParticles()
+: <a class="el" href="classCloseDropsParticles.html#854ab941991fcb21d1640fc6d938e408">CloseDropsParticles</a><li>createFrameListener()
+: <a class="el" href="classRainApp.html#5065d75b2cc757f3bb0f0d52ddc2ad4d">RainApp</a><li>createLights()
+: <a class="el" href="classCloseDropsParticles.html#f8ced0c0f82c037a0d4a6a685c9b0435">CloseDropsParticles</a><li>createScene()
+: <a class="el" href="classRainApp.html#a483339af0f95518bc0835a61d9447f3">RainApp</a></ul>
+<h3><a class="anchor" name="index_d">- d -</a></h3><ul>
+<li>definePosTextureAndBackup()
+: <a class="el" href="classCloseDropsParticles.html#1353cbebfae74f3e9e8cbb9b9e429089">CloseDropsParticles</a><li>displayMessage()
+: <a class="el" href="classRainFrameListener.html#ea5fb5d71d65f6aed207feb5a3db7b09">RainFrameListener</a></ul>
+<h3><a class="anchor" name="index_f">- f -</a></h3><ul>
+<li>frameEnded()
+: <a class="el" href="classRainFrameListener.html#2b35f43facecdc5efd19060f234289c1">RainFrameListener</a><li>frameStarted()
+: <a class="el" href="classRainFrameListener.html#11baf48c2d3f2880dfc1a6451df01545">RainFrameListener</a></ul>
+<h3><a class="anchor" name="index_g">- g -</a></h3><ul>
+<li>getLightManagerPtr()
+: <a class="el" href="classCloseDropsParticles.html#07b630c2f9893453cf7a6a0a81704d85">CloseDropsParticles</a></ul>
+<h3><a class="anchor" name="index_h">- h -</a></h3><ul>
+<li>hidePositionBillboards()
+: <a class="el" href="classCloseDropsParticles.html#9be4bfaed25d7fb306f353fcf38553b3">CloseDropsParticles</a></ul>
+<h3><a class="anchor" name="index_m">- m -</a></h3><ul>
+<li>makeControlOverlay()
+: <a class="el" href="classCloseDropsParticles.html#1ea41c537ac5a889452f8b311d161e3d">CloseDropsParticles</a><li>mRainStreaksHeight
+: <a class="el" href="classCloseDropsParticles.html#9812ff8eb6059ecc22d1a659a3581262">CloseDropsParticles</a><li>mRainWidth
+: <a class="el" href="classCloseDropsParticles.html#1e01a41391f939b3f4e1f2b140f9f192">CloseDropsParticles</a></ul>
+<h3><a class="anchor" name="index_p">- p -</a></h3><ul>
+<li>postRenderTargetUpdate()
+: <a class="el" href="classTextureFrameListener.html#82fc4bbfe697af3b9391005549626393">TextureFrameListener</a><li>preRenderTargetUpdate()
+: <a class="el" href="classTextureFrameListener.html#f562539756bf7c75fd2414ece67879eb">TextureFrameListener</a></ul>
+<h3><a class="anchor" name="index_r">- r -</a></h3><ul>
+<li>RainApp()
+: <a class="el" href="classRainApp.html#daa84d15f79672b913f1f19600451b99">RainApp</a><li>RainFrameListener()
+: <a class="el" href="classRainFrameListener.html#7ffa91734beebaa997cb27e814f572fe">RainFrameListener</a><li>RainLight()
+: <a class="el" href="classRainLight.html#3f7303451d4241cba55324c9eeb7ef00">RainLight</a></ul>
+<h3><a class="anchor" name="index_s">- s -</a></h3><ul>
+<li>showPositionBillboards()
+: <a class="el" href="classCloseDropsParticles.html#7504154f99f56be93e7ebf5e374ef506">CloseDropsParticles</a></ul>
+<h3><a class="anchor" name="index_t">- t -</a></h3><ul>
+<li>TextureFrameListener()
+: <a class="el" href="classTextureFrameListener.html#5e03071dea9753aa265037cdc94e311d">TextureFrameListener</a></ul>
+<h3><a class="anchor" name="index_u">- u -</a></h3><ul>
+<li>updateBoxMax()
+: <a class="el" href="classCloseDropsParticles.html#98be1ed6e9561ed2afbf3b625fc55428">CloseDropsParticles</a><li>updateBoxMin()
+: <a class="el" href="classCloseDropsParticles.html#3a2aca7152213edefb89ce819069e47a">CloseDropsParticles</a><li>updateFallVector()
+: <a class="el" href="classCloseDropsParticles.html#1a590aabe2601cf7705423e8724874a9">CloseDropsParticles</a><li>updateFragmentProgramParameter()
+: <a class="el" href="classCloseDropsParticles.html#abb13ff5aac1fa66da4473c936fc5bed">CloseDropsParticles</a><li>updateLastMove()
+: <a class="el" href="classCloseDropsParticles.html#91e9858663a5155b23c734703b807fd9">CloseDropsParticles</a><li>updateLightCount()
+: <a class="el" href="classCloseDropsParticles.html#b09a148f6d44e4ee87a5081c74757a98">CloseDropsParticles</a><li>updateLights()
+: <a class="el" href="classCloseDropsParticles.html#d2686c928601912243528dbf93f122e3">CloseDropsParticles</a><li>updatePositionTexture()
+: <a class="el" href="classCloseDropsParticles.html#e7e63a1a54ec6368046e377ef02ed622">CloseDropsParticles</a><li>updateRainBilboardSideLength()
+: <a class="el" href="classCloseDropsParticles.html#f9de759fa82c8ec7042200d2370e74d6">CloseDropsParticles</a><li>updateRandomMove()
+: <a class="el" href="classCloseDropsParticles.html#c6ecb49d550648cf42ca847088ba7f84">CloseDropsParticles</a><li>updateShaderParameters()
+: <a class="el" href="classCloseDropsParticles.html#382d373910aeeca4da9c4c2c21d3c474">CloseDropsParticles</a><li>updateStats()
+: <a class="el" href="classRainFrameListener.html#fb74925a5b7856838701cdeed0523924">RainFrameListener</a><li>updateStreaksHeight()
+: <a class="el" href="classCloseDropsParticles.html#c12db346d5dcb629eece45cf16827718">CloseDropsParticles</a><li>updateTimeSinceLastFrame()
+: <a class="el" href="classCloseDropsParticles.html#faf0938f86626973a5f787a339d68e39">CloseDropsParticles</a><li>updateViewDir()
+: <a class="el" href="classCloseDropsParticles.html#f1b8b1a995996677bd75584ef85b1596">CloseDropsParticles</a><li>updateViewPos()
+: <a class="el" href="classCloseDropsParticles.html#2925efdc8a09636534a780a34e8bffdf">CloseDropsParticles</a></ul>
+<h3><a class="anchor" name="index_~">- ~ -</a></h3><ul>
+<li>~CloseDropsParticles()
+: <a class="el" href="classCloseDropsParticles.html#9f3718c6d0721b1bce367ec2d55f2b35">CloseDropsParticles</a><li>~RainApp()
+: <a class="el" href="classRainApp.html#166d18092b93d4f8cf485986d5e94dbf">RainApp</a></ul>
+<hr size="1"><address style="align: right;"><small>Generated on Wed May 17 16:55:30 2006 for gametools-rain by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
+</body>
+</html>
Index: /GTP/trunk/App/Demos/Illum/Rain/docs/html/classCloseDropsParticles.html
===================================================================
--- /GTP/trunk/App/Demos/Illum/Rain/docs/html/classCloseDropsParticles.html	(revision 2221)
+++ /GTP/trunk/App/Demos/Illum/Rain/docs/html/classCloseDropsParticles.html	(revision 2221)
@@ -0,0 +1,944 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>gametools-rain: CloseDropsParticles Class Reference</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6 -->
+<div class="tabs">
+  <ul>
+    <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+    <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+  </ul></div>
+<div class="tabs">
+  <ul>
+    <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+    <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+    <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+  </ul></div>
+<h1>CloseDropsParticles Class Reference</h1><!-- doxytag: class="CloseDropsParticles" --><code>#include &lt;<a class="el" href="RainCloseDropsParticles_8h-source.html">RainCloseDropsParticles.h</a>&gt;</code>
+<p>
+<a href="classCloseDropsParticles-members.html">List of all members.</a><hr><a name="_details"></a><h2>Detailed Description</h2>
+Class : <a class="el" href="classCloseDropsParticles.html">CloseDropsParticles</a> defines a rain system, with cameras and shaders 
+<p>
+<table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCloseDropsParticles.html#854ab941991fcb21d1640fc6d938e408">CloseDropsParticles</a> (SceneManager *sceneMgr, SceneNode *parentSyst, SceneNode *parentCam)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCloseDropsParticles.html#9f3718c6d0721b1bce367ec2d55f2b35">~CloseDropsParticles</a> ()</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCloseDropsParticles.html#f8ced0c0f82c037a0d4a6a685c9b0435">createLights</a> ()</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">RainLightManager *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCloseDropsParticles.html#07b630c2f9893453cf7a6a0a81704d85">getLightManagerPtr</a> ()</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCloseDropsParticles.html#d2686c928601912243528dbf93f122e3">updateLights</a> ()</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCloseDropsParticles.html#1353cbebfae74f3e9e8cbb9b9e429089">definePosTextureAndBackup</a> ()</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCloseDropsParticles.html#1ea41c537ac5a889452f8b311d161e3d">makeControlOverlay</a> ()</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCloseDropsParticles.html#e7e63a1a54ec6368046e377ef02ed622">updatePositionTexture</a> (bool primary)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCloseDropsParticles.html#ed530332d6ea95622da6d65d2f453a0f">updateFragmentProgramParameter</a> (const String &amp;name, float value)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCloseDropsParticles.html#e6deff9c5de199bff8c4a8b12f57609e">updateFragmentProgramParameter</a> (const String &amp;name, Ogre::Vector3 value)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCloseDropsParticles.html#abb13ff5aac1fa66da4473c936fc5bed">updateFragmentProgramParameter</a> (const String &amp;name, Ogre::Vector4 value)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCloseDropsParticles.html#382d373910aeeca4da9c4c2c21d3c474">updateShaderParameters</a> (float tslf, float rainBbSide, float streaksHeight, int nbLights, Vector3 viewPos, Vector3 viewDir, Vector3 fallVect, Vector3 boxMin, Vector3 boxMax, Vector3 lastMove, Vector3 randomMove, int useShader)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCloseDropsParticles.html#faf0938f86626973a5f787a339d68e39">updateTimeSinceLastFrame</a> (float tslf)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCloseDropsParticles.html#f9de759fa82c8ec7042200d2370e74d6">updateRainBilboardSideLength</a> (float rainBbSide)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCloseDropsParticles.html#c12db346d5dcb629eece45cf16827718">updateStreaksHeight</a> (float streaksHeight)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCloseDropsParticles.html#b09a148f6d44e4ee87a5081c74757a98">updateLightCount</a> (float nbLights)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCloseDropsParticles.html#2925efdc8a09636534a780a34e8bffdf">updateViewPos</a> (Vector3 viewPos)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCloseDropsParticles.html#f1b8b1a995996677bd75584ef85b1596">updateViewDir</a> (Vector3 viewDir)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCloseDropsParticles.html#1a590aabe2601cf7705423e8724874a9">updateFallVector</a> (Vector3 fallVect)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCloseDropsParticles.html#3a2aca7152213edefb89ce819069e47a">updateBoxMin</a> (Vector3 boxMin)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCloseDropsParticles.html#98be1ed6e9561ed2afbf3b625fc55428">updateBoxMax</a> (Vector3 boxMax)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCloseDropsParticles.html#91e9858663a5155b23c734703b807fd9">updateLastMove</a> (Vector3 lastMove)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCloseDropsParticles.html#c6ecb49d550648cf42ca847088ba7f84">updateRandomMove</a> (Vector3 randomMove)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCloseDropsParticles.html#9be4bfaed25d7fb306f353fcf38553b3">hidePositionBillboards</a> ()</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCloseDropsParticles.html#7504154f99f56be93e7ebf5e374ef506">showPositionBillboards</a> ()</td></tr>
+
+<tr><td colspan="2"><br><h2>Public Attributes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">float&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCloseDropsParticles.html#1e01a41391f939b3f4e1f2b140f9f192">mRainWidth</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">float&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCloseDropsParticles.html#9812ff8eb6059ecc22d1a659a3581262">mRainStreaksHeight</a></td></tr>
+
+</table>
+<hr><h2>Constructor &amp; Destructor Documentation</h2>
+<a class="anchor" name="854ab941991fcb21d1640fc6d938e408"></a><!-- doxytag: member="CloseDropsParticles::CloseDropsParticles" ref="854ab941991fcb21d1640fc6d938e408" args="(SceneManager *sceneMgr, SceneNode *parentSyst, SceneNode *parentCam)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">CloseDropsParticles::CloseDropsParticles           </td>
+          <td class="md" valign="top">(&nbsp;</td>
+          <td class="md" nowrap valign="top">SceneManager *&nbsp;</td>
+          <td class="mdname" nowrap> <em>sceneMgr</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td class="md"></td>
+          <td class="md" nowrap>SceneNode *&nbsp;</td>
+          <td class="mdname" nowrap> <em>parentSyst</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td class="md"></td>
+          <td class="md" nowrap>SceneNode *&nbsp;</td>
+          <td class="mdname" nowrap> <em>parentCam</em></td>
+        </tr>
+        <tr>
+          <td class="md"></td>
+          <td class="md">)&nbsp;</td>
+          <td class="md" colspan="2"></td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+constructor, taking in parameters :<ul>
+<li>the SceneManager used in the scene</li><li>the SceneNode to which the particle system should be attached</li><li>the SceneNode to which the auxiliary camera (which we use to texture our drops) should be attached </li></ul>
+    </td>
+  </tr>
+</table>
+<a class="anchor" name="9f3718c6d0721b1bce367ec2d55f2b35"></a><!-- doxytag: member="CloseDropsParticles::~CloseDropsParticles" ref="9f3718c6d0721b1bce367ec2d55f2b35" args="()" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">CloseDropsParticles::~CloseDropsParticles           </td>
+          <td class="md" valign="top">(&nbsp;</td>
+          <td class="mdname1" valign="top" nowrap>          </td>
+          <td class="md" valign="top">&nbsp;)&nbsp;</td>
+          <td class="md" nowrap></td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+Destructor     </td>
+  </tr>
+</table>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="f8ced0c0f82c037a0d4a6a685c9b0435"></a><!-- doxytag: member="CloseDropsParticles::createLights" ref="f8ced0c0f82c037a0d4a6a685c9b0435" args="()" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">void CloseDropsParticles::createLights           </td>
+          <td class="md" valign="top">(&nbsp;</td>
+          <td class="mdname1" valign="top" nowrap>          </td>
+          <td class="md" valign="top">&nbsp;)&nbsp;</td>
+          <td class="md" nowrap></td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+function wich creates the lights (streetlights and bindings to light the drops)     </td>
+  </tr>
+</table>
+<a class="anchor" name="1353cbebfae74f3e9e8cbb9b9e429089"></a><!-- doxytag: member="CloseDropsParticles::definePosTextureAndBackup" ref="1353cbebfae74f3e9e8cbb9b9e429089" args="()" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">void CloseDropsParticles::definePosTextureAndBackup           </td>
+          <td class="md" valign="top">(&nbsp;</td>
+          <td class="mdname1" valign="top" nowrap>          </td>
+          <td class="md" valign="top">&nbsp;)&nbsp;</td>
+          <td class="md" nowrap></td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+function which creates the position texture and it's backup. should be called when initiaiting the rendering of the first frame (through frame listener)     </td>
+  </tr>
+</table>
+<a class="anchor" name="07b630c2f9893453cf7a6a0a81704d85"></a><!-- doxytag: member="CloseDropsParticles::getLightManagerPtr" ref="07b630c2f9893453cf7a6a0a81704d85" args="()" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">RainLightManager * CloseDropsParticles::getLightManagerPtr           </td>
+          <td class="md" valign="top">(&nbsp;</td>
+          <td class="mdname1" valign="top" nowrap>          </td>
+          <td class="md" valign="top">&nbsp;)&nbsp;</td>
+          <td class="md" nowrap></td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+function to retrieve a pointer to the rainLightManager associate with this <a class="el" href="classCloseDropsParticles.html">CloseDropsParticles</a>     </td>
+  </tr>
+</table>
+<a class="anchor" name="9be4bfaed25d7fb306f353fcf38553b3"></a><!-- doxytag: member="CloseDropsParticles::hidePositionBillboards" ref="9be4bfaed25d7fb306f353fcf38553b3" args="()" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">void CloseDropsParticles::hidePositionBillboards           </td>
+          <td class="md" valign="top">(&nbsp;</td>
+          <td class="mdname1" valign="top" nowrap>          </td>
+          <td class="md" valign="top">&nbsp;)&nbsp;</td>
+          <td class="md" nowrap><code> [inline]</code></td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+functions which hide the particle position billboards. billboards must be hidden when rendering the scene, and visible when updating the position texture     </td>
+  </tr>
+</table>
+<a class="anchor" name="1ea41c537ac5a889452f8b311d161e3d"></a><!-- doxytag: member="CloseDropsParticles::makeControlOverlay" ref="1ea41c537ac5a889452f8b311d161e3d" args="()" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">void CloseDropsParticles::makeControlOverlay           </td>
+          <td class="md" valign="top">(&nbsp;</td>
+          <td class="mdname1" valign="top" nowrap>          </td>
+          <td class="md" valign="top">&nbsp;)&nbsp;</td>
+          <td class="md" nowrap></td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+control function, to check what the textures look like     </td>
+  </tr>
+</table>
+<a class="anchor" name="7504154f99f56be93e7ebf5e374ef506"></a><!-- doxytag: member="CloseDropsParticles::showPositionBillboards" ref="7504154f99f56be93e7ebf5e374ef506" args="()" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">void CloseDropsParticles::showPositionBillboards           </td>
+          <td class="md" valign="top">(&nbsp;</td>
+          <td class="mdname1" valign="top" nowrap>          </td>
+          <td class="md" valign="top">&nbsp;)&nbsp;</td>
+          <td class="md" nowrap><code> [inline]</code></td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+functions which show the particle position billboards. billboards must be hidden when rendering the scene, and visible when updating the position texture     </td>
+  </tr>
+</table>
+<a class="anchor" name="98be1ed6e9561ed2afbf3b625fc55428"></a><!-- doxytag: member="CloseDropsParticles::updateBoxMax" ref="98be1ed6e9561ed2afbf3b625fc55428" args="(Vector3 boxMax)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">void CloseDropsParticles::updateBoxMax           </td>
+          <td class="md" valign="top">(&nbsp;</td>
+          <td class="md" nowrap valign="top">Vector3&nbsp;</td>
+          <td class="mdname1" valign="top" nowrap> <em>boxMax</em>          </td>
+          <td class="md" valign="top">&nbsp;)&nbsp;</td>
+          <td class="md" nowrap></td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+function to update the different shader parameters used to update the particles positions, or render them     </td>
+  </tr>
+</table>
+<a class="anchor" name="3a2aca7152213edefb89ce819069e47a"></a><!-- doxytag: member="CloseDropsParticles::updateBoxMin" ref="3a2aca7152213edefb89ce819069e47a" args="(Vector3 boxMin)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">void CloseDropsParticles::updateBoxMin           </td>
+          <td class="md" valign="top">(&nbsp;</td>
+          <td class="md" nowrap valign="top">Vector3&nbsp;</td>
+          <td class="mdname1" valign="top" nowrap> <em>boxMin</em>          </td>
+          <td class="md" valign="top">&nbsp;)&nbsp;</td>
+          <td class="md" nowrap></td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+function to update the different shader parameters used to update the particles positions, or render them     </td>
+  </tr>
+</table>
+<a class="anchor" name="1a590aabe2601cf7705423e8724874a9"></a><!-- doxytag: member="CloseDropsParticles::updateFallVector" ref="1a590aabe2601cf7705423e8724874a9" args="(Vector3 fallVect)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">void CloseDropsParticles::updateFallVector           </td>
+          <td class="md" valign="top">(&nbsp;</td>
+          <td class="md" nowrap valign="top">Vector3&nbsp;</td>
+          <td class="mdname1" valign="top" nowrap> <em>fallVect</em>          </td>
+          <td class="md" valign="top">&nbsp;)&nbsp;</td>
+          <td class="md" nowrap></td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+function to update the different shader parameters used to update the particles positions, or render them     </td>
+  </tr>
+</table>
+<a class="anchor" name="abb13ff5aac1fa66da4473c936fc5bed"></a><!-- doxytag: member="CloseDropsParticles::updateFragmentProgramParameter" ref="abb13ff5aac1fa66da4473c936fc5bed" args="(const String &amp;name, Ogre::Vector4 value)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">void CloseDropsParticles::updateFragmentProgramParameter           </td>
+          <td class="md" valign="top">(&nbsp;</td>
+          <td class="md" nowrap valign="top">const String &amp;&nbsp;</td>
+          <td class="mdname" nowrap> <em>name</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td class="md"></td>
+          <td class="md" nowrap>Ogre::Vector4&nbsp;</td>
+          <td class="mdname" nowrap> <em>value</em></td>
+        </tr>
+        <tr>
+          <td class="md"></td>
+          <td class="md">)&nbsp;</td>
+          <td class="md" colspan="2"></td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+function to update the different shader parameters used to update the particles positions, or render them     </td>
+  </tr>
+</table>
+<a class="anchor" name="e6deff9c5de199bff8c4a8b12f57609e"></a><!-- doxytag: member="CloseDropsParticles::updateFragmentProgramParameter" ref="e6deff9c5de199bff8c4a8b12f57609e" args="(const String &amp;name, Ogre::Vector3 value)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">void CloseDropsParticles::updateFragmentProgramParameter           </td>
+          <td class="md" valign="top">(&nbsp;</td>
+          <td class="md" nowrap valign="top">const String &amp;&nbsp;</td>
+          <td class="mdname" nowrap> <em>name</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td class="md"></td>
+          <td class="md" nowrap>Ogre::Vector3&nbsp;</td>
+          <td class="mdname" nowrap> <em>value</em></td>
+        </tr>
+        <tr>
+          <td class="md"></td>
+          <td class="md">)&nbsp;</td>
+          <td class="md" colspan="2"></td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+function to update the different shader parameters used to update the particles positions, or render them     </td>
+  </tr>
+</table>
+<a class="anchor" name="ed530332d6ea95622da6d65d2f453a0f"></a><!-- doxytag: member="CloseDropsParticles::updateFragmentProgramParameter" ref="ed530332d6ea95622da6d65d2f453a0f" args="(const String &amp;name, float value)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">void CloseDropsParticles::updateFragmentProgramParameter           </td>
+          <td class="md" valign="top">(&nbsp;</td>
+          <td class="md" nowrap valign="top">const String &amp;&nbsp;</td>
+          <td class="mdname" nowrap> <em>name</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td class="md"></td>
+          <td class="md" nowrap>float&nbsp;</td>
+          <td class="mdname" nowrap> <em>value</em></td>
+        </tr>
+        <tr>
+          <td class="md"></td>
+          <td class="md">)&nbsp;</td>
+          <td class="md" colspan="2"></td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+function to update the different shader parameters used to update the particles positions, or render them     </td>
+  </tr>
+</table>
+<a class="anchor" name="91e9858663a5155b23c734703b807fd9"></a><!-- doxytag: member="CloseDropsParticles::updateLastMove" ref="91e9858663a5155b23c734703b807fd9" args="(Vector3 lastMove)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">void CloseDropsParticles::updateLastMove           </td>
+          <td class="md" valign="top">(&nbsp;</td>
+          <td class="md" nowrap valign="top">Vector3&nbsp;</td>
+          <td class="mdname1" valign="top" nowrap> <em>lastMove</em>          </td>
+          <td class="md" valign="top">&nbsp;)&nbsp;</td>
+          <td class="md" nowrap></td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+function to update the different shader parameters used to update the particles positions, or render them     </td>
+  </tr>
+</table>
+<a class="anchor" name="b09a148f6d44e4ee87a5081c74757a98"></a><!-- doxytag: member="CloseDropsParticles::updateLightCount" ref="b09a148f6d44e4ee87a5081c74757a98" args="(float nbLights)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">void CloseDropsParticles::updateLightCount           </td>
+          <td class="md" valign="top">(&nbsp;</td>
+          <td class="md" nowrap valign="top">float&nbsp;</td>
+          <td class="mdname1" valign="top" nowrap> <em>nbLights</em>          </td>
+          <td class="md" valign="top">&nbsp;)&nbsp;</td>
+          <td class="md" nowrap></td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+function to update the different shader parameters used to update the particles positions, or render them     </td>
+  </tr>
+</table>
+<a class="anchor" name="d2686c928601912243528dbf93f122e3"></a><!-- doxytag: member="CloseDropsParticles::updateLights" ref="d2686c928601912243528dbf93f122e3" args="()" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">void CloseDropsParticles::updateLights           </td>
+          <td class="md" valign="top">(&nbsp;</td>
+          <td class="mdname1" valign="top" nowrap>          </td>
+          <td class="md" valign="top">&nbsp;)&nbsp;</td>
+          <td class="md" nowrap></td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+function which updates the lights, if they are animated     </td>
+  </tr>
+</table>
+<a class="anchor" name="e7e63a1a54ec6368046e377ef02ed622"></a><!-- doxytag: member="CloseDropsParticles::updatePositionTexture" ref="e7e63a1a54ec6368046e377ef02ed622" args="(bool primary)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">void CloseDropsParticles::updatePositionTexture           </td>
+          <td class="md" valign="top">(&nbsp;</td>
+          <td class="md" nowrap valign="top">bool&nbsp;</td>
+          <td class="mdname1" valign="top" nowrap> <em>primary</em>          </td>
+          <td class="md" valign="top">&nbsp;)&nbsp;</td>
+          <td class="md" nowrap></td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+function to update one of the two position RTT's ; if set to true, the primary texture will be updated     </td>
+  </tr>
+</table>
+<a class="anchor" name="f9de759fa82c8ec7042200d2370e74d6"></a><!-- doxytag: member="CloseDropsParticles::updateRainBilboardSideLength" ref="f9de759fa82c8ec7042200d2370e74d6" args="(float rainBbSide)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">void CloseDropsParticles::updateRainBilboardSideLength           </td>
+          <td class="md" valign="top">(&nbsp;</td>
+          <td class="md" nowrap valign="top">float&nbsp;</td>
+          <td class="mdname1" valign="top" nowrap> <em>rainBbSide</em>          </td>
+          <td class="md" valign="top">&nbsp;)&nbsp;</td>
+          <td class="md" nowrap></td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+function to update the different shader parameters used to update the particles positions, or render them     </td>
+  </tr>
+</table>
+<a class="anchor" name="c6ecb49d550648cf42ca847088ba7f84"></a><!-- doxytag: member="CloseDropsParticles::updateRandomMove" ref="c6ecb49d550648cf42ca847088ba7f84" args="(Vector3 randomMove)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">void CloseDropsParticles::updateRandomMove           </td>
+          <td class="md" valign="top">(&nbsp;</td>
+          <td class="md" nowrap valign="top">Vector3&nbsp;</td>
+          <td class="mdname1" valign="top" nowrap> <em>randomMove</em>          </td>
+          <td class="md" valign="top">&nbsp;)&nbsp;</td>
+          <td class="md" nowrap></td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+function to update the different shader parameters used to update the particles positions, or render them     </td>
+  </tr>
+</table>
+<a class="anchor" name="382d373910aeeca4da9c4c2c21d3c474"></a><!-- doxytag: member="CloseDropsParticles::updateShaderParameters" ref="382d373910aeeca4da9c4c2c21d3c474" args="(float tslf, float rainBbSide, float streaksHeight, int nbLights, Vector3 viewPos, Vector3 viewDir, Vector3 fallVect, Vector3 boxMin, Vector3 boxMax, Vector3 lastMove, Vector3 randomMove, int useShader)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">void CloseDropsParticles::updateShaderParameters           </td>
+          <td class="md" valign="top">(&nbsp;</td>
+          <td class="md" nowrap valign="top">float&nbsp;</td>
+          <td class="mdname" nowrap> <em>tslf</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td class="md"></td>
+          <td class="md" nowrap>float&nbsp;</td>
+          <td class="mdname" nowrap> <em>rainBbSide</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td class="md"></td>
+          <td class="md" nowrap>float&nbsp;</td>
+          <td class="mdname" nowrap> <em>streaksHeight</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td class="md"></td>
+          <td class="md" nowrap>int&nbsp;</td>
+          <td class="mdname" nowrap> <em>nbLights</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td class="md"></td>
+          <td class="md" nowrap>Vector3&nbsp;</td>
+          <td class="mdname" nowrap> <em>viewPos</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td class="md"></td>
+          <td class="md" nowrap>Vector3&nbsp;</td>
+          <td class="mdname" nowrap> <em>viewDir</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td class="md"></td>
+          <td class="md" nowrap>Vector3&nbsp;</td>
+          <td class="mdname" nowrap> <em>fallVect</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td class="md"></td>
+          <td class="md" nowrap>Vector3&nbsp;</td>
+          <td class="mdname" nowrap> <em>boxMin</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td class="md"></td>
+          <td class="md" nowrap>Vector3&nbsp;</td>
+          <td class="mdname" nowrap> <em>boxMax</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td class="md"></td>
+          <td class="md" nowrap>Vector3&nbsp;</td>
+          <td class="mdname" nowrap> <em>lastMove</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td class="md"></td>
+          <td class="md" nowrap>Vector3&nbsp;</td>
+          <td class="mdname" nowrap> <em>randomMove</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td class="md"></td>
+          <td class="md" nowrap>int&nbsp;</td>
+          <td class="mdname" nowrap> <em>useShader</em></td>
+        </tr>
+        <tr>
+          <td class="md"></td>
+          <td class="md">)&nbsp;</td>
+          <td class="md" colspan="2"></td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+function to update the different shader parameters used to update the particles positions, or render them     </td>
+  </tr>
+</table>
+<a class="anchor" name="c12db346d5dcb629eece45cf16827718"></a><!-- doxytag: member="CloseDropsParticles::updateStreaksHeight" ref="c12db346d5dcb629eece45cf16827718" args="(float streaksHeight)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">void CloseDropsParticles::updateStreaksHeight           </td>
+          <td class="md" valign="top">(&nbsp;</td>
+          <td class="md" nowrap valign="top">float&nbsp;</td>
+          <td class="mdname1" valign="top" nowrap> <em>streaksHeight</em>          </td>
+          <td class="md" valign="top">&nbsp;)&nbsp;</td>
+          <td class="md" nowrap></td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+function to update the different shader parameters used to update the particles positions, or render them     </td>
+  </tr>
+</table>
+<a class="anchor" name="faf0938f86626973a5f787a339d68e39"></a><!-- doxytag: member="CloseDropsParticles::updateTimeSinceLastFrame" ref="faf0938f86626973a5f787a339d68e39" args="(float tslf)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">void CloseDropsParticles::updateTimeSinceLastFrame           </td>
+          <td class="md" valign="top">(&nbsp;</td>
+          <td class="md" nowrap valign="top">float&nbsp;</td>
+          <td class="mdname1" valign="top" nowrap> <em>tslf</em>          </td>
+          <td class="md" valign="top">&nbsp;)&nbsp;</td>
+          <td class="md" nowrap></td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+function to update the different shader parameters used to update the particles positions, or render them     </td>
+  </tr>
+</table>
+<a class="anchor" name="f1b8b1a995996677bd75584ef85b1596"></a><!-- doxytag: member="CloseDropsParticles::updateViewDir" ref="f1b8b1a995996677bd75584ef85b1596" args="(Vector3 viewDir)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">void CloseDropsParticles::updateViewDir           </td>
+          <td class="md" valign="top">(&nbsp;</td>
+          <td class="md" nowrap valign="top">Vector3&nbsp;</td>
+          <td class="mdname1" valign="top" nowrap> <em>viewDir</em>          </td>
+          <td class="md" valign="top">&nbsp;)&nbsp;</td>
+          <td class="md" nowrap></td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+function to update the different shader parameters used to update the particles positions, or render them     </td>
+  </tr>
+</table>
+<a class="anchor" name="2925efdc8a09636534a780a34e8bffdf"></a><!-- doxytag: member="CloseDropsParticles::updateViewPos" ref="2925efdc8a09636534a780a34e8bffdf" args="(Vector3 viewPos)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">void CloseDropsParticles::updateViewPos           </td>
+          <td class="md" valign="top">(&nbsp;</td>
+          <td class="md" nowrap valign="top">Vector3&nbsp;</td>
+          <td class="mdname1" valign="top" nowrap> <em>viewPos</em>          </td>
+          <td class="md" valign="top">&nbsp;)&nbsp;</td>
+          <td class="md" nowrap></td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+function to update the different shader parameters used to update the particles positions, or render them     </td>
+  </tr>
+</table>
+<hr><h2>Member Data Documentation</h2>
+<a class="anchor" name="9812ff8eb6059ecc22d1a659a3581262"></a><!-- doxytag: member="CloseDropsParticles::mRainStreaksHeight" ref="9812ff8eb6059ecc22d1a659a3581262" args="" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">float <a class="el" href="classCloseDropsParticles.html#9812ff8eb6059ecc22d1a659a3581262">CloseDropsParticles::mRainStreaksHeight</a>          </td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+public variable : wheight of the particles (for streaks)     </td>
+  </tr>
+</table>
+<a class="anchor" name="1e01a41391f939b3f4e1f2b140f9f192"></a><!-- doxytag: member="CloseDropsParticles::mRainWidth" ref="1e01a41391f939b3f4e1f2b140f9f192" args="" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top">float <a class="el" href="classCloseDropsParticles.html#1e01a41391f939b3f4e1f2b140f9f192">CloseDropsParticles::mRainWidth</a>          </td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+public variable : width of the particles     </td>
+  </tr>
+</table>
+<hr>The documentation for this class was generated from the following files:<ul>
+<li><a class="el" href="RainCloseDropsParticles_8h-source.html">RainCloseDropsParticles.h</a><li>RainCloseDropsParticles.cpp</ul>
+<hr size="1"><address style="align: right;"><small>Generated on Wed May 17 16:55:30 2006 for gametools-rain by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
+</body>
+</html>
Index: /GTP/trunk/App/Demos/Illum/Rain/docs/index.html
===================================================================
--- /GTP/trunk/App/Demos/Illum/Rain/docs/index.html	(revision 2221)
+++ /GTP/trunk/App/Demos/Illum/Rain/docs/index.html	(revision 2221)
@@ -0,0 +1,154 @@
+<html><head>
+<title>Realistic real-time rain rendering</title>
+</head>
+
+<style>
+body
+{
+  padding : 20px;
+  
+}
+h1
+{
+  text-align:center;
+}
+h2
+{
+  width:100%;
+  background-color: black;
+  color: white;
+  padding : 5px;
+  margin-top : 80px;
+}
+h3
+{
+  font-decoration : underline;
+  font-size: 100%;
+  padding : 0px;
+  margin : 0px;
+}
+li
+{
+  margin-bottom : 15px;
+}
+ul
+{
+margin-top:20px;
+  margin-bottom : 20px;
+}
+pre.bibtex
+{
+  border : 1px dashed;
+  background-color : #DDD;
+  padding :10px;
+}
+</style>
+
+<body>
+<center>
+<table width="80%" style="background-color:#DDD; border: 1px groove; text-align: center;">
+<tr>
+  <td width="20%" style="border: 1px groove;"><a href="#screenshot">Screenshot</a></td>
+  <td width="20%" style="border: 1px groove;"><a href="#description">Description of the method</a></td>
+  <td width="20%" style="border: 1px groove;"><a href="#running">Compiling / running the program</a></td>
+  <td width="20%" style="border: 1px groove;"><a href="#publications">Related publications</a></td>
+  <td width="20%" style="border: 1px groove;"><a href="html/index.html">Documentation</a></td>
+</tr>
+</table>
+</center>
+
+
+
+<h1>Realistic real-time rain rendering</h1>
+
+<a name="screenshot">
+<h2>Screenshot</h2>
+<center><img src="screenshot-rain.jpg" alt="screenshot of the method"><br><h4>A screenshot generated with this method, using 16000 regular raindrops, with light illumination.</h4></center><br>
+
+<a name="description">
+<h2>Description of the method</h2>
+This module proposes a full framework to add rain or snow to real-time applications.<br>
+It includes:
+<ul>
+
+<li>A hardware particle simulation :
+  <ul>
+  <li>Particles positions are stored in textures</li>
+  <li>These positions are updated through fragment programs, and take into account a falling speed and direction which can be modified interactively by the user</li>
+  <li>When the particles are rendered, their position is read from the texture, in a vertex program</li>
+  </ul>
+</li>
+
+<li>Several possible rendering techniques.
+  <ul>
+  <li><h3>SNOW :</h3>Particles are rendered with a simple snowflake texture.</li>
+  <li><h3>REGULAR RAINDROPS :</h3>A novel rendering algorithm is used here for high speed rendering of realistic raindrops.
+    <ul>
+    <li>Key idea : what you can see in a raindrop is a distorted image of the scene behind it.</li>
+    <li>We first capture a wide-angle render of the scene to a texture</li>
+    <li>In a pixel shader, this texture is mapped onto the raindrops, according to the physical properties of raindrops, to simulate realistic refraction.</li>
+    </ul>
+  </li>
+  <li><h3>STREAKS :</h3>Because of retinal persistence, raindrops, though roughly spherical, tend to appear like streaks.
+  Each single raindrop impresses the film or retina for a short while.<br>This effect is handled using another pixel shader to render the particles. For each pixel of a streak, we blend the contributions of a few successive positions of the raindrop, computed using the algorithm described above.</li>
+  <li>Optionnaly, regular raindrops or streaks can be combined with illumination from light sources</li>
+  <li>As of now, the different rendering types are NOT COMPLIANT with each other. Each one must be activated, one at a time, with a #define compiler directive in the file <i>CommonRain.h</i>, ant then the program must be recompiled.</li>
+  </ul>
+</li>
+</ul>
+
+
+<a name="running">
+<h2>Compiling and running the program.</h2>
+This program was created using the great <a href="http://www.ogre3d.org">OGRE</a> rendering engine, which must be installed (version 1.2) on your sytem if you wish to run the program. By now, it has only been tested under linux, but should work under windows systems thanks to the multi-platform character of Ogre.<br><br>
+To execute it, you will need a SHADER MODEL 3 capable card, such as an nVidia Geforce 6, and Cg compiler installed.<br><br>
+You must first have a look to CommonRain.h to choose the type of rendering you wish (just uncomment the desired settings).<br><br>
+The particle count can be modified in RainCloseDropsParticles.cpp, by modifying the value of the #define 
+BILLBOARD_POS_TEX_SIZE. Particle count is the square of this value.<br><br>
+This code is given as a running complete program, but shouldn't require too much modifications to be adapted to the needs of another program.<br><br>
+In the proposed implementation, the following key bindings are handled :
+<ul>
+  <li><b>esc : </b>leace the program</li>
+  <li><b>arrows keys / numpad 4, 5, 6, 8 : </b>User movement (translations)</li>
+  <li><b>mouse : </b>User rotations</li>
+  <li><b>R : </b>reinitialize the particle system, in case it would behave inconsistently</li>
+  <li><b>space : </b>pause the system</li>
+  <li><b>E : </b> erase the text on the fps display (little character, bottom left)</li>
+  <li><b>+ and - : </b>increase / decrease the particles size</li>
+  <li><b>S and Q : </b>accelerate / slow down the falling speed of the particles</li>
+  <li><b>W and SHIFT+W : </b>accelerate/ slow down a lateral wind</li>
+  <li><b>SYSRQ : </b>capture a screenshot</li>
+  <li><b>C : </b> begin capturing all the frames, to make a video</li>
+</ul>
+<br>
+You can access the Doxygen-made <a href="html/index.html">documentation</a> for this program !
+
+<a name="publications">
+<h2>Publications</h2>
+Full details about the methods used is given in the following paper :<br>
+<pre class='bibtex'>
+@Article{RJG06,
+  author       = "Rousseau, Pierre and Jolivet, Vincent and Ghazanfarpour, Djamchid",
+  title        = "Realistic real-time rain rendering",
+  journal      = "Computers \&amp; Graphics",
+  number       = "4",
+  volume       = "30",
+  year         = "2006",
+  note         = "special issue on Natural Phenomena Simulation",
+  url          = "<a href="http://www.msi.unilim.fr/basilic/Publications/2006/RJG06">http://www.msi.unilim.fr/basilic/Publications/2006/RJG06</a>"
+}
+</pre>
+    
+
+
+<br><br><br>
+<hr>
+<div align="right">
+Pierre Rousseau<br>
+University of LIMOGES<br>
+<a href="mailto:rousseau@msi.unilim.fr">rousseau@msi.unilim.fr</a><br>
+17th of may, 2006
+</div>
+
+</body>
+</html>
Index: /GTP/trunk/App/Demos/Illum/Rain/Readme.txt.txt
===================================================================
--- /GTP/trunk/App/Demos/Illum/Rain/Readme.txt.txt	(revision 2221)
+++ /GTP/trunk/App/Demos/Illum/Rain/Readme.txt.txt	(revision 2221)
@@ -0,0 +1,40 @@
+This application demonstrates the integration of rain to an Ogre scene. Rain is animated through pixel shaders, and rendered with refraction from the background scene.
+This demo needs Ogre Dagon (1.2.5) and an NVIDIA shader model 3.0 compliant graphics card (Geforce 6 or superior).
+It runs fine under OpenGL, it currently DOES NOT run under DirectX. It will work after porting to Ogre eihort, which introduces vertex texture fetch support.
+
+
+Usage :
+-------
+- Use mouse and arrow keys (or numpad arrow keys) to move the observer.
+- Spacebar pauses the particles.
+- + and - change the particles sizes
+- Q and S change the particles speed
+- W and shift+W introduce wind blowing on the particles
+- O hides the fps overlay
+- printScreen captures a screenshot to a file on disk.
+- esc to quit the application
+
+
+Run :
+-----
+Go to bin/debug or bin/release directory and launch the program 'rain'. You will most certainly need to  modify the 'resources.cfg' file in debug/release directory to reflect your Ogre installation.
+
+
+Build :
+-------
+Run and build the solution (rain.sln)
+
+If you wish to modify the application, the most important parameters are set in the file CommonRain.h.
+There, you can modify the number of particles (there are BILLBOARD_POS_TEX_SIZE² particles in the system), the type of particles (comment/uncomment the #define STREAKS and #define SNOW directives), and witch on/off the interaction between particles and light sources).
+
+
+Documentation :
+---------------
+A 'doc' folder is included, containing Doxygen generated documentation of the application. It also includes a basic overview of the method.
+The following link will give you access to some videos of the application :
+http://www.msi.unilim.fr/~rousseau/rain.html
+
+
+Contact :
+---------
+Pierre Rousseau, University of Limoges (rousseau@msi.unilim.fr)
Index: /GTP/trunk/App/Demos/Illum/Rain/res/rain.rc
===================================================================
--- /GTP/trunk/App/Demos/Illum/Rain/res/rain.rc	(revision 2221)
+++ /GTP/trunk/App/Demos/Illum/Rain/res/rain.rc	(revision 2221)
@@ -0,0 +1,96 @@
+// Microsoft Visual C++ generated resource script.
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include "winres.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// Danish resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DAN)
+#ifdef _WIN32
+LANGUAGE LANG_DANISH, SUBLANG_DEFAULT
+#pragma code_page(1252)
+#endif //_WIN32
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Icon
+//
+
+// Icon with lowest ID value placed first to ensure application icon
+// remains consistent on all systems.
+IDI_ICON1               ICON                    "rain.ico"
+#endif    // Danish resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+/////////////////////////////////////////////////////////////////////////////
+// English (U.S.) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
+#ifdef _WIN32
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+#pragma code_page(1252)
+#endif //_WIN32
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE
+BEGIN
+    "resource.h\0"
+END
+
+2 TEXTINCLUDE
+BEGIN
+    "#include ""winres.h""\r\n"
+    "\0"
+END
+
+3 TEXTINCLUDE
+BEGIN
+    "\r\n"
+    "\0"
+END
+
+#endif    // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// String Table
+//
+
+STRINGTABLE
+BEGIN
+    IDS_APP_TITLE           "rain"
+END
+
+IDI_APPICON             ICON                    "rain.ico"
+#endif    // English (U.S.) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif    // not APSTUDIO_INVOKED
+
Index: /GTP/trunk/App/Demos/Illum/Rain/res/Resource.h
===================================================================
--- /GTP/trunk/App/Demos/Illum/Rain/res/Resource.h	(revision 2221)
+++ /GTP/trunk/App/Demos/Illum/Rain/res/Resource.h	(revision 2221)
@@ -0,0 +1,17 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Visual C++ generated include file.
+// Used by rain.rc
+//
+#define IDI_ICON1                       101
+#define IDS_APP_TITLE                   103
+
+// Next default values for new objects
+//
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE        102
+#define _APS_NEXT_COMMAND_VALUE         40001
+#define _APS_NEXT_CONTROL_VALUE         1000
+#define _APS_NEXT_SYMED_VALUE           101
+#endif
+#endif
Index: /GTP/trunk/App/Demos/Illum/Rain/obj/Release/mt.dep
===================================================================
--- /GTP/trunk/App/Demos/Illum/Rain/obj/Release/mt.dep	(revision 2221)
+++ /GTP/trunk/App/Demos/Illum/Rain/obj/Release/mt.dep	(revision 2221)
@@ -0,0 +1,3 @@
+La ressource de manifeste a t mise 
+ jour pour la dernire fois 
+ 15:53:50,07 le 09/03/2007 
Index: /GTP/trunk/App/Demos/Illum/Rain/obj/Release/rain.exe.intermediate.manifest
===================================================================
--- /GTP/trunk/App/Demos/Illum/Rain/obj/Release/rain.exe.intermediate.manifest	(revision 2221)
+++ /GTP/trunk/App/Demos/Illum/Rain/obj/Release/rain.exe.intermediate.manifest	(revision 2221)
@@ -0,0 +1,8 @@
+<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
+<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
+  <dependency>
+    <dependentAssembly>
+      <assemblyIdentity type='win32' name='Microsoft.VC80.CRT' version='8.0.50608.0' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
+    </dependentAssembly>
+  </dependency>
+</assembly>
Index: /GTP/trunk/App/Demos/Illum/Rain/rain.vcproj
===================================================================
--- /GTP/trunk/App/Demos/Illum/Rain/rain.vcproj	(revision 2221)
+++ /GTP/trunk/App/Demos/Illum/Rain/rain.vcproj	(revision 2221)
@@ -0,0 +1,277 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="8,00"
+	Name="rain"
+	ProjectGUID="{BF9454C7-33EA-48FF-B289-4440775C1DF7}"
+	RootNamespace="rain"
+	>
+	<Platforms>
+		<Platform
+			Name="Win32"
+		/>
+	</Platforms>
+	<ToolFiles>
+	</ToolFiles>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="bin\$(ConfigurationName)"
+			IntermediateDirectory="obj\$(ConfigurationName)"
+			ConfigurationType="1"
+			CharacterSet="2"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalIncludeDirectories="include;$(OGRE_HOME)\include;$(OGRE_HOME)\samples\include"
+				PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS"
+				MinimalRebuild="true"
+				ExceptionHandling="1"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="3"
+				EnableFunctionLevelLinking="true"
+				UsePrecompiledHeader="0"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="true"
+				DebugInformationFormat="4"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="OgreMain_d.lib user32.lib"
+				OutputFile="$(OutDir)\$(ProjectName).exe"
+				LinkIncremental="2"
+				AdditionalLibraryDirectories="$(OGRE_HOME)\lib"
+				GenerateDebugInformation="true"
+				ProgramDatabaseFile="$(OutDir)/rain.pdb"
+				SubSystem="2"
+				TargetMachine="1"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCWebDeploymentTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+				CommandLine=""
+			/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="bin\$(ConfigurationName)"
+			IntermediateDirectory="obj\$(ConfigurationName)"
+			ConfigurationType="1"
+			CharacterSet="2"
+			WholeProgramOptimization="1"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				InlineFunctionExpansion="1"
+				AdditionalIncludeDirectories="include;$(OGRE_HOME)\include;$(OGRE_HOME)\samples\include"
+				PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS"
+				MinimalRebuild="true"
+				ExceptionHandling="1"
+				RuntimeLibrary="2"
+				EnableFunctionLevelLinking="true"
+				UsePrecompiledHeader="0"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="true"
+				DebugInformationFormat="3"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="OgreMain.lib user32.lib"
+				OutputFile="$(OutDir)\$(ProjectName).exe"
+				LinkIncremental="1"
+				AdditionalLibraryDirectories="$(OGRE_HOME)\lib"
+				GenerateDebugInformation="true"
+				SubSystem="2"
+				OptimizeReferences="2"
+				EnableCOMDATFolding="2"
+				TargetMachine="1"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCWebDeploymentTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+				CommandLine=""
+			/>
+		</Configuration>
+	</Configurations>
+	<References>
+	</References>
+	<Files>
+		<Filter
+			Name="Source files"
+			Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+			>
+			<File
+				RelativePath=".\src\main.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\src\RainCloseDropsParticles.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\src\RainFrameListener.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\src\RainLight.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\src\RainTextureFrameListener.cpp"
+				>
+			</File>
+		</Filter>
+		<Filter
+			Name="Resources"
+			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
+			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+			>
+			<File
+				RelativePath=".\res\rain.ico"
+				>
+			</File>
+			<File
+				RelativePath=".\res\rain.rc"
+				>
+			</File>
+			<Filter
+				Name="Headers"
+				Filter="h;hpp;hxx;hm;inl;inc;xsd"
+				UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+				>
+				<File
+					RelativePath=".\include\CommonRain.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\RainCloseDropsParticles.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\RainFrameListener.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\RainLight.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\RainManualHardwareBillboardMeshLoader.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\RainTextureFrameListener.h"
+					>
+				</File>
+			</Filter>
+		</Filter>
+		<Filter
+			Name="Shaders"
+			>
+			<File
+				RelativePath=".\rainMaterials\billboardPosTexUpdaterFP.cg"
+				>
+			</File>
+			<File
+				RelativePath=".\rainMaterials\gouttesTexCoordsFP.cg"
+				>
+			</File>
+			<File
+				RelativePath=".\rainMaterials\gouttesTexCoordsVP.cg"
+				>
+			</File>
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
Index: /GTP/trunk/App/Demos/Illum/Rain/rainMaterials/billboardPosTexUpdaterFP.cg
===================================================================
--- /GTP/trunk/App/Demos/Illum/Rain/rainMaterials/billboardPosTexUpdaterFP.cg	(revision 2221)
+++ /GTP/trunk/App/Demos/Illum/Rain/rainMaterials/billboardPosTexUpdaterFP.cg	(revision 2221)
@@ -0,0 +1,58 @@
+
+///////////////////////////////////////////////////////////////////////////
+//
+//		   fragment program in charge
+//		   of position texture update
+//
+///////////////////////////////////////////////////////////////////////////
+
+
+
+float4 main(float2 coords	   : TEXCOORD0,
+            uniform float tslf,
+            uniform float bbposTexSide,
+            uniform float partCount,
+            uniform float3 randomMove,
+            uniform float3 lastMove,
+            uniform float3 fallVect,
+	    uniform sampler2D oldPos : TEXUNIT0) : COLOR
+{
+  float4 newPos;
+
+    newPos = tex2D(oldPos, coords);
+    newPos.a =1;
+
+    // compute the newt position, based on fall direction and speed, and user movement to compensate
+    newPos.xyz += fallVect * tslf - lastMove;
+
+    // keep the particles within the box
+    if (newPos.y <= 0.05)
+    {
+	    newPos.y += 0.9;
+	    newPos.xz += randomMove.xz;
+    }
+    else if (newPos.y >= 0.95)
+    {
+	    newPos.y -= 0.9;
+    }
+
+    if (newPos.x <= 0.05)
+    {
+	    newPos.x += 0.9;
+    }
+    else if (newPos.x >= 0.95)
+    {
+	    newPos.x -= 0.9;
+    }
+
+    if (newPos.z <= 0.05)
+    {
+	    newPos.z += 0.9;
+    }
+    else if (newPos.z >= 0.95)
+    {
+	    newPos.z -= 0.9;
+    }
+
+  return newPos;
+}
Index: /GTP/trunk/App/Demos/Illum/Rain/rainMaterials/gouttesTexCoordsFP.cg
===================================================================
--- /GTP/trunk/App/Demos/Illum/Rain/rainMaterials/gouttesTexCoordsFP.cg	(revision 2221)
+++ /GTP/trunk/App/Demos/Illum/Rain/rainMaterials/gouttesTexCoordsFP.cg	(revision 2221)
@@ -0,0 +1,357 @@
+
+///////////////////////////////////////////////////////////////////////////
+//
+//		fragment program in charge of the rendering of the particles
+//		Different versions are available, depending on which extensions are enabled.
+//
+///////////////////////////////////////////////////////////////////////////
+
+
+
+// data comming out from the vertex program
+struct sortie
+{
+	float4 position    : POSITION;
+	float2 texCoords0  : TEXCOORD0;
+	float2 texCoords1  : TEXCOORD1;
+	float4 posworld    : TEXCOORD2;
+	float4 normale     : TEXCOORD3;
+	float3 eyetovert   : TEXCOORD4;
+	float4 www	   : WPOS;
+};
+
+
+
+#define PI                3.1415926535
+#define FOVyCam           PI/3.0
+#define FOVyRtt           15.0*PI/18.0
+#define I_REFRACT_EAU     1.33
+
+
+#define ILLUM_FACT	 2.0
+
+////////////////////////////////////////////////
+////////////////////////////////////////////////
+// Lighting function
+////////////////////////////////////////////////
+////////////////////////////////////////////////
+float4 lightMe( sortie IN, 
+	        uniform float4x4 worldview,
+		float4 origColor,
+		float4 lightPos,
+		float4 lightCol,
+		float attenuation)
+{
+      float4 distant = lightPos - IN.posworld;
+      float distFact = 1.0 - min(sqrt(dot(distant.xyz, distant.xyz)) / attenuation, 1.0);
+      distant.xyz = normalize(mul(worldview, distant).xyz);
+      distant.x = 1.0;
+
+      float4 result;
+      float4 a1, a2, a3;
+      
+      a1 = lightCol * distFact * dot(- normalize(IN.eyetovert.xyz), IN.normale.xyz);
+      a2 = max(0, dot(distant.xyz, IN.normale.xyz));
+      a3 = max(0, dot(normalize(distant.xz), -normalize(IN.normale.xz)) * (1.0 - dot(distant.xyz, -IN.normale.xyz)));
+      
+      result = a1 * (a2 + a3);
+      
+      return result;
+}
+
+
+
+
+////////////////////////////////////////////////
+////////////////////////////////////////////////
+// entry point using regular raindrops, and light
+////////////////////////////////////////////////
+////////////////////////////////////////////////
+float4 main_noStreaks_Light(sortie IN,
+                            uniform float nbLights,
+                            uniform float4x4 worldview,
+                            uniform float4 colAmb,
+                            uniform sampler2D image : TEXUNIT0,
+                            uniform sampler2D texPos : TEXUNIT1,
+                            uniform sampler2D masque : TEXUNIT2,
+                            uniform sampler2D lightInfoTexture : TEXUNIT3) : COLOR
+{
+  float4 couleur;
+  float4 retour;
+  
+  float4 colMasque = tex2D(masque, IN.texCoords0);
+
+  if (colMasque.r < 0.2 && colMasque.g < 0.2 && colMasque.b < 0.2)
+      retour.a = 0;
+  else
+  {
+      retour.a = 1;
+      float3 refrac = (colMasque.xyz - 0.5) / 2.0;
+      float2 coords = 0.5 - (0.5 - IN.texCoords1 + refrac.xy / refrac.z) * tan(FOVyCam / 2.0) / tan(FOVyRtt / 2.0) ;
+      couleur.rgb = tex2D(image, coords).rgb;
+            
+      if (coords.x > 1.0 || coords.y > 1.0 || coords.x < 0.0 || coords.y < 0.0)
+      {
+          // we're going out of the texture !
+          couleur.rgb=float3(0, 0, 1);
+      }
+      
+
+      IN.normale.z = 1.0 - sqrt(IN.normale.x * IN.normale.x + IN.normale.y * IN.normale.y);
+      IN.normale.w = 1.0;
+      
+      //lighting
+      retour = couleur * colAmb;
+      
+      for (int l = 0 ; l < nbLights ; l++)
+      {
+		float lightRow = l * (1.0 / nbLights) + (0.5 / nbLights);
+		
+		float4 lightCol = tex2D(lightInfoTexture, float2(1.0 / 8.0, lightRow));
+		float4 lightPos = tex2D(lightInfoTexture, float2(3.0 / 8.0, lightRow));
+		float4 lightDir = tex2D(lightInfoTexture, float2(5.0 / 8.0, lightRow));
+		float lightCut = tex2D(lightInfoTexture, float2(7.0 / 8.0, lightRow)).r;
+		float lightAtt = tex2D(lightInfoTexture, float2(7.0 / 8.0, lightRow)).g;
+		
+		float4 illum = lightMe(IN, worldview, couleur, lightPos, lightCol, lightAtt);
+		
+		// let's check if the particle is within the lighting cone
+		if ( dot( normalize(IN.posworld.xyz - lightPos.xyz) , normalize(lightDir.xyz) ) > cos (lightCut * PI / 180.0) )
+		{
+		    retour += illum * ILLUM_FACT;
+		}
+      }
+  }
+
+  return retour;
+}
+
+
+
+
+
+
+
+////////////////////////////////////////////////
+////////////////////////////////////////////////
+// entry point using snow, and light
+////////////////////////////////////////////////
+////////////////////////////////////////////////
+float4 main_Snow_Light(sortie IN,
+                       uniform float nbLights,
+                       uniform float4x4 worldview,
+                       uniform float4 colAmb,
+                       uniform sampler2D image : TEXUNIT0,
+                       uniform sampler2D texPos : TEXUNIT1,
+                       uniform sampler2D lightInfoTexture : TEXUNIT2) : COLOR
+{
+  float4 couleur;
+  float4 retour;
+  
+  retour = tex2D(image, IN.texCoords0) * colAmb;
+  
+  if (retour.a > 0.01)
+  {
+	for (int l = 0 ; l < nbLights ; l++)
+	{
+		float lightRow = l * (1.0 / nbLights) + (0.5 / nbLights);
+		
+		float4 lightCol = tex2D(lightInfoTexture, float2(1.0 / 8.0, lightRow));
+		float4 lightPos = tex2D(lightInfoTexture, float2(3.0 / 8.0, lightRow));
+		float4 lightDir = tex2D(lightInfoTexture, float2(5.0 / 8.0, lightRow));
+		float lightCut = tex2D(lightInfoTexture, float2(7.0 / 8.0, lightRow)).r;
+		float lightAtt = tex2D(lightInfoTexture, float2(7.0 / 8.0, lightRow)).g;
+		
+		float4 illum = lightMe(IN, worldview, couleur, lightPos, lightCol, lightAtt);
+		
+		// let's check if the snowflake particle is within the lighting cone
+		if ( dot( normalize(IN.posworld.xyz - lightPos.xyz) , normalize(lightDir.xyz) ) > cos (lightCut * PI / 180.0) )
+		{
+		  retour.xyz *= illum.xyz * ILLUM_FACT;
+		}
+	}
+  }
+
+
+    return retour;
+}
+
+
+
+#define DISCRETIZATION		10.0
+
+
+
+////////////////////////////////////////////////
+////////////////////////////////////////////////
+// entry point using streaks, and light
+////////////////////////////////////////////////
+////////////////////////////////////////////////
+float4 main_Streaks_Light(sortie IN,
+                          uniform float nbLights,
+                          uniform float4x4 worldview,
+                          uniform float4 colAmb,
+                          uniform sampler2D image : TEXUNIT0,
+                          uniform sampler2D texPos : TEXUNIT1,
+                          uniform sampler2D masque : TEXUNIT2,
+                          uniform sampler2D shape : TEXUNIT3,
+                          uniform sampler2D lightInfoTexture : TEXUNIT4) : COLOR
+{
+  float4 couleur = float4(0, 0, 0, 0);
+  float4 retour = float4(0, 0, 0, 0);
+  float4 colTexture, colTemp;
+  float4 colMasque;
+  float effective_discretization;
+  int i, l;
+  float3 refrac;
+  float2 coords;
+  
+  float lightRow;
+
+  float4 lightCol;
+  float4 lightPos;
+  float4 lightDir;
+  float lightCut;
+  float lightAtt;
+  float4 illum;
+
+  float4 shapeAlpha = tex2D(shape, 1.0 - IN.texCoords0);
+
+  IN.normale.z = 1.0 - sqrt(IN.normale.x * IN.normale.x + IN.normale.y * IN.normale.y);
+  IN.normale.w = 1.0;
+  
+  
+  if (shapeAlpha.r > 0.2 && shapeAlpha.g > 0.2 && shapeAlpha.b > 0.2 )
+  {
+	effective_discretization = 0;
+		
+	for (i=0 ; i < DISCRETIZATION ; i++)
+	{	
+		colMasque = tex2D(masque, float2(IN.texCoords0.x, (i + 1) / (DISCRETIZATION + 1)));
+		
+		// is this pixel valid to throw a ray ?
+		if (colMasque.r > 0.1 || colMasque.g > 0.1 || colMasque.b > 0.1)
+		{
+			refrac = (colMasque.xyz - 0.5) / 2.0;
+			coords = 0.5 - (0.5 - IN.texCoords1 + refrac.xy / refrac.z) * tan(FOVyCam / 2.0) / tan(FOVyRtt / 2.0) ;
+			
+			colTexture = tex2D(image, coords);
+			couleur += colTexture;
+			effective_discretization++;
+		}
+	}
+
+	colTemp = couleur / (effective_discretization);
+	
+	// lighting
+	retour = colTemp * colAmb;
+	
+	for (l = 0 ; l < nbLights ; l++)
+	{
+		lightRow = l * (1.0 / nbLights) + (0.5 / nbLights);
+		
+		lightCol = tex2D(lightInfoTexture, float2(1.0 / 8.0, lightRow));
+		lightPos = tex2D(lightInfoTexture, float2(3.0 / 8.0, lightRow));
+		lightDir = tex2D(lightInfoTexture, float2(5.0 / 8.0, lightRow));
+		lightCut = tex2D(lightInfoTexture, float2(7.0 / 8.0, lightRow)).r;
+		lightAtt = tex2D(lightInfoTexture, float2(7.0 / 8.0, lightRow)).g;
+		illum = lightMe(IN, worldview, colTemp, lightPos, lightCol, lightAtt);
+		
+		// let's check if the particle is within the lighting cone
+		if ( dot( normalize(IN.posworld.xyz - lightPos.xyz) , normalize(lightDir.xyz) ) > cos (lightCut * PI / 180.0) )
+		{
+		  retour += illum * ILLUM_FACT;
+		}
+	}
+	
+	// alpha blend it a little with the background scene
+        retour.a = 0.6 - abs(IN.texCoords0.x - 0.5) * 1.2;
+  }
+
+  return retour;
+}
+
+
+
+
+
+
+
+////////////////////////////////////////////////
+////////////////////////////////////////////////
+// entry point using regular raindrops, without light
+////////////////////////////////////////////////
+////////////////////////////////////////////////
+float4 main_noStreaks_noLight(sortie IN,
+                              uniform sampler2D image : TEXUNIT0,
+                              uniform sampler2D masque : TEXUNIT2) : COLOR
+{
+  float4 couleur;
+  
+  float4 colMasque = tex2D(masque, IN.texCoords0);
+
+  if (colMasque.r < 0.2 && colMasque.g < 0.2 && colMasque.b < 0.2)
+    couleur.a = 0;
+  else
+    {
+      couleur.a = 1;
+      float3 refrac = (colMasque.xyz - 0.5) / 2.0;
+      float2 coords = 0.5 - (0.5 - IN.texCoords1 + refrac.xy / refrac.z) * tan(FOVyCam / 2.0) / tan(FOVyRtt / 2.0) ;
+      couleur.rgb = tex2D(image, coords).rgb;
+    }
+
+  return couleur;
+}
+
+
+
+
+
+////////////////////////////////////////////////
+////////////////////////////////////////////////
+// entry point using snow, without light
+////////////////////////////////////////////////
+////////////////////////////////////////////////
+float4 main_Snow_noLight(sortie IN,
+                         uniform sampler2D image : TEXUNIT0) : COLOR
+{
+  return tex2D(image, IN.texCoords0);
+}
+
+
+
+
+
+////////////////////////////////////////////////
+////////////////////////////////////////////////
+// entry point using streaks, without light
+////////////////////////////////////////////////
+////////////////////////////////////////////////
+float4 main_Streaks_noLight(sortie IN,
+                            uniform sampler2D image : TEXUNIT0,
+                            uniform sampler2D masque : TEXUNIT2,
+                            uniform sampler2D shape : TEXUNIT3) : COLOR
+{
+  float4 couleur = float4(0, 0, 0, 0);
+  float4 colMasque;
+
+  float4 shapeAlpha = tex2D(shape, IN.texCoords0);
+
+  if (shapeAlpha.r > 0.2 && shapeAlpha.g > 0.2 && shapeAlpha.b > 0.2 )
+    {
+      for (int i=0 ; i <= DISCRETIZATION ; i++)
+	{
+	
+	colMasque = tex2D(masque, float2(IN.texCoords0.x, i / DISCRETIZATION));
+	
+	float3 refrac = (colMasque.xyz - 0.5) / 2.0;
+	float2 coords = 0.5 - (0.5 - IN.texCoords1 + refrac.xy / refrac.z) * tan(FOVyCam / 2.0) / tan(FOVyRtt / 2.0) ;
+	couleur.rgb = couleur.rgb + tex2D(image, coords).rgb;
+	}
+	
+	couleur = couleur / (DISCRETIZATION + 1);
+	couleur.a = 1.0 - abs(IN.texCoords0.x - 0.5) * 2.0;	
+    }
+
+  return couleur;
+}
Index: /GTP/trunk/App/Demos/Illum/Rain/rainMaterials/gouttesTexCoordsVP.cg
===================================================================
--- /GTP/trunk/App/Demos/Illum/Rain/rainMaterials/gouttesTexCoordsVP.cg	(revision 2221)
+++ /GTP/trunk/App/Demos/Illum/Rain/rainMaterials/gouttesTexCoordsVP.cg	(revision 2221)
@@ -0,0 +1,142 @@
+
+///////////////////////////////////////////////////////////////////////////
+//
+//		vertex program used to render the particles.
+//		sets the particle position reading from the position texture
+//		and stretches the particle onscreen.
+//
+///////////////////////////////////////////////////////////////////////////
+
+
+
+struct entree
+{
+	float4 position : POSITION;
+	float4 texCoords0 : TEXCOORD0;
+};
+
+struct sortie
+{
+	float4 position    : POSITION;
+	float2 texCoords0  : TEXCOORD0;
+	float2 texCoords1  : TEXCOORD1;
+	float4 posworld    : TEXCOORD2;
+	float4 normale     : TEXCOORD3;
+	float3 eyetovert   : TEXCOORD4;
+};
+
+
+
+#define SCREEN_RATIO		(1280.0/1024.0)
+
+sortie mainNoStreaks(entree IN,
+                     uniform float3 viewPos,
+                     uniform float3 viewDir,
+                     uniform float3 boxMin,
+                     uniform float3 boxMax,
+                     uniform float rainBbSide,
+                     uniform float4x4  worldviewproj,
+                     uniform float4x4  worldview,
+                     uniform sampler2D texPos : TEXUNIT1)
+{
+	sortie OUT;
+	
+	//we get the position of the vertex from the texture
+	
+	float4 posFromTexture = tex2D(texPos, IN.texCoords0.zw);
+	
+	float4 thePos;
+	thePos.x = viewPos.x + posFromTexture.x * (boxMax.x - boxMin.x) + boxMin.x - viewDir.x * ((boxMax.x - boxMin.x) / 2.0);
+	thePos.y = viewPos.y + posFromTexture.y * (boxMax.y - boxMin.y) + boxMin.y;
+	thePos.z = viewPos.z + posFromTexture.z * (boxMax.z - boxMin.z) + boxMin.z - viewDir.z * ((boxMax.z - boxMin.z) / 2.0);
+	thePos.w = 1.0;
+	
+	// USE FOLLOWING LINE TO AVOID READING POSITION FROM TEXTURE
+	//float4 thePos = IN.position + 0.000000001 * (viewPos.x + boxMax.x + boxMin.x + viewDir.x);
+	
+	// transform it to screen space
+	OUT.position = mul(worldviewproj, thePos);
+	
+	// shape it as a quad (oriented on camera plane)
+	OUT.position.x += rainBbSide * (IN.texCoords0.x - 0.5f);
+	OUT.position.y -= rainBbSide * SCREEN_RATIO * (IN.texCoords0.y - 0.5f);
+
+
+	// don't change the fist texture coordinates
+	OUT.texCoords0 = IN.texCoords0.xy;
+	
+	// second texture coordinates receive the position of the drop, in screen space
+	float4 VposEye = mul(worldviewproj, thePos);
+	VposEye.xyz /= VposEye.w;	
+    OUT.texCoords1 = (1.0 + VposEye.xy).xy / 2.0;
+	OUT.texCoords1.y = 1.0 - OUT.texCoords1.y;
+	
+	OUT.normale.x = (IN.texCoords0.x - 0.5) * 2.0;
+    OUT.normale.y = -(IN.texCoords0.y - 0.5) * 2.0;
+	OUT.normale.zw = 1.0;
+	
+	OUT.posworld = thePos; // unprojected vertex coordinate
+	OUT.eyetovert = mul(worldview, thePos).xyz;
+	
+	return OUT;
+}
+
+
+
+
+
+
+sortie mainStreaks(entree IN,
+                   uniform float3 viewPos,
+                   uniform float3 viewDir,
+                   uniform float3 boxMin,
+                   uniform float3 boxMax,
+                   uniform float3 fallVect,
+                   uniform float rainBbSide,
+                   uniform float streaksHeight,
+                   uniform float4x4  worldviewproj,
+                   uniform float4x4  worldview,
+                   uniform sampler2D texPos : TEXUNIT1)
+{
+	sortie OUT;
+	
+	  
+	//we get the position of the vertex from the texture
+	float4 posFromTexture = tex2D(texPos, IN.texCoords0.zw);
+	float4 thePos;
+	thePos.x = viewPos.x + posFromTexture.x * (boxMax.x - boxMin.x) + boxMin.x - viewDir.x * ((boxMax.x - boxMin.x) / 2.0);
+	thePos.y = viewPos.y + posFromTexture.y * (boxMax.y - boxMin.y) + boxMin.y;
+	thePos.z = viewPos.z + posFromTexture.z * (boxMax.z - boxMin.z) + boxMin.z - viewDir.z * ((boxMax.z - boxMin.z) / 2.0);
+	thePos.w = 1.0;
+	
+	// USE FOLLOWING LINE TO AVOID READING POSITION FROM TEXTURE
+	//float4 thePos = IN.position + 0.000000001 * (viewPos.x + boxMax.x + boxMin.x + viewDir.x);
+	
+// stetch the streak vertically
+	thePos.y += (1.0 - IN.texCoords0.y) * streaksHeight;
+// make it follow the wind direction
+	thePos.xz += (IN.texCoords0.y * 2.0 - 1.0) * fallVect.xz;
+// transform its coordinate to screen space
+	OUT.position = mul(worldviewproj, thePos);
+	
+	// shape it as a quad (oriented on camera plane)
+	OUT.position.x += rainBbSide * (IN.texCoords0.x - 0.5f);
+
+
+// don't change the first texture coordinates
+	OUT.texCoords0 = IN.texCoords0.xy;
+	
+	float4 VposEye = OUT.position;
+	VposEye.xyz /= VposEye.w;
+	OUT.texCoords1 = (1.0 + VposEye.xy).xy / 2.0;
+	OUT.texCoords1.y = 1.0 - OUT.texCoords1.y;
+	
+	OUT.normale.x = (IN.texCoords0.x - 0.5) * 2.0;
+	OUT.normale.y = -(IN.texCoords0.y - 0.5) * 2.0;
+	OUT.normale.zw = 1.0;
+	
+	OUT.posworld = thePos;
+	OUT.eyetovert = mul(worldview, thePos).xyz;
+	
+	return OUT;
+}
Index: /GTP/trunk/App/Demos/Illum/Rain/rainMaterials/rain.material
===================================================================
--- /GTP/trunk/App/Demos/Illum/Rain/rainMaterials/rain.material	(revision 2221)
+++ /GTP/trunk/App/Demos/Illum/Rain/rainMaterials/rain.material	(revision 2221)
@@ -0,0 +1,39 @@
+material lampMat
+{
+	technique
+	{
+		pass
+		{
+			lighting off
+			depth_write on
+			depth_check on
+
+			texture_unit
+			{
+				texture texture_lampadaire.jpg
+			}
+		}
+	}
+}
+
+//----------------------------
+// specific Logo
+//----------------------------
+material rainLogo
+{
+	technique
+	{
+		pass
+		{
+			lighting off
+			scene_blend alpha_blend
+			depth_write off
+			depth_check off
+
+			texture_unit
+			{
+				texture calimero_logo.png
+			}
+		}
+	}
+}
Index: /GTP/trunk/App/Demos/Illum/Rain/rainMaterials/rain.overlay
===================================================================
--- /GTP/trunk/App/Demos/Illum/Rain/rainMaterials/rain.overlay	(revision 2221)
+++ /GTP/trunk/App/Demos/Illum/Rain/rainMaterials/rain.overlay	(revision 2221)
@@ -0,0 +1,35 @@
+// Ogre overlay scripts
+RainOverlay
+{
+	zorder 500
+	// Stats block
+	container Panel(RainLogoPanel)
+	{	
+		metrics_mode pixels
+		horz_align left
+		vert_align bottom
+		top -187
+		left 15
+		width 200
+		height 187
+		material rainLogo
+		
+		
+		element TextArea(RainCurrFps)
+		{
+			metrics_mode pixels
+			left 45
+			top 25
+			width 90
+			height 30
+			font_name BlueHighway
+			char_height 19
+			caption hi
+			colour_top 0.1 0.1 0.9
+			colour_bottom 0.1 0.1 0.5
+		}
+	}
+}
+
+
+
