1 | |
---|
2 | /////////////////////////////////////////////////////////////////////////// |
---|
3 | // |
---|
4 | // Realistic rain real-time simulation program |
---|
5 | // |
---|
6 | // Pierre Rousseau |
---|
7 | // |
---|
8 | /////////////////////////////////////////////////////////////////////////// |
---|
9 | // |
---|
10 | // Particle systems handling |
---|
11 | // |
---|
12 | /////////////////////////////////////////////////////////////////////////// |
---|
13 | |
---|
14 | #ifndef __RAIN_CLOSE_DROPS_PARTICLES__ |
---|
15 | #define __RAIN_CLOSE_DROPS_PARTICLES__ |
---|
16 | |
---|
17 | |
---|
18 | #include "CommonRain.h" |
---|
19 | #include "RainTextureFrameListener.h" |
---|
20 | #include "RainManualHardwareBillboardMeshLoader.h" |
---|
21 | #include "RainLight.h" |
---|
22 | |
---|
23 | |
---|
24 | |
---|
25 | |
---|
26 | |
---|
27 | |
---|
28 | /** Class : CloseDropsParticles |
---|
29 | * defines a rain system, with cameras and shaders |
---|
30 | */ |
---|
31 | class CloseDropsParticles |
---|
32 | { |
---|
33 | private : |
---|
34 | SceneManager *mSceneMgr; |
---|
35 | RainLightManager *mRainLightMgr; |
---|
36 | SceneNode *mParticlesNode, *mParentCam, *mParentSyst; |
---|
37 | |
---|
38 | // wide angle camera used to render the drops |
---|
39 | Ogre::Camera *mCamera; |
---|
40 | RenderTexture *dropsTexture; |
---|
41 | MaterialPtr dropsTexturesMaterial; |
---|
42 | |
---|
43 | // simulation textures, containing particle positions |
---|
44 | unsigned int mActiveParticlesCount; |
---|
45 | RenderTexture *particlePosTexture, *particlePosTextureBackup; |
---|
46 | |
---|
47 | BillboardSet *bbSet1, *bbSet2; // billboardsets for ping-pong position textures |
---|
48 | |
---|
49 | |
---|
50 | public : |
---|
51 | /** public variable : width of the particles */ |
---|
52 | float mRainWidth; |
---|
53 | /** public variable : wheight of the particles (for streaks) */ |
---|
54 | float mRainStreaksHeight; |
---|
55 | |
---|
56 | |
---|
57 | /** public functions */ |
---|
58 | |
---|
59 | /** constructor, taking in parameters : |
---|
60 | * - the SceneManager used in the scene |
---|
61 | * - the SceneNode to which the particle system should be attached |
---|
62 | * - the SceneNode to which the auxiliary camera (which we use to texture our drops) should be attached |
---|
63 | */ |
---|
64 | CloseDropsParticles(SceneManager *sceneMgr, SceneNode *parentSyst, SceneNode *parentCam); |
---|
65 | |
---|
66 | /** Destructor */ |
---|
67 | ~CloseDropsParticles(); |
---|
68 | |
---|
69 | /** function wich creates the lights (streetlights and bindings to light the drops) */ |
---|
70 | void createLights(); |
---|
71 | |
---|
72 | /** function to retrieve a pointer to the rainLightManager associate with this CloseDropsParticles */ |
---|
73 | RainLightManager *getLightManagerPtr(); |
---|
74 | |
---|
75 | /** function which updates the lights, if they are animated */ |
---|
76 | void updateLights(); |
---|
77 | |
---|
78 | /** function which creates the position texture and it's backup. should be called when initiaiting the rendering of the first frame (through frame listener) */ |
---|
79 | void definePosTextureAndBackup(); |
---|
80 | |
---|
81 | /** control function, to check what the textures look like */ |
---|
82 | void makeControlOverlay(); |
---|
83 | |
---|
84 | /** function to update one of the two position RTT's ; if set to true, the primary texture will be updated */ |
---|
85 | void updatePositionTexture(bool primary); |
---|
86 | |
---|
87 | /** function to update the different shader parameters used to update the particles positions, or render them */ |
---|
88 | void updateFragmentProgramParameter(const String &name, float value); |
---|
89 | /** function to update the different shader parameters used to update the particles positions, or render them */ |
---|
90 | void updateFragmentProgramParameter(const String &name, Ogre::Vector3 value); |
---|
91 | /** function to update the different shader parameters used to update the particles positions, or render them */ |
---|
92 | void updateFragmentProgramParameter(const String &name, Ogre::Vector4 value); |
---|
93 | /** function to update the different shader parameters used to update the particles positions, or render them */ |
---|
94 | |
---|
95 | /** function to update the different shader parameters used to update the particles positions, or render them */ |
---|
96 | void updateShaderParameters(float tslf, float rainBbSide, float streaksHeight, int nbLights, |
---|
97 | Vector3 viewPos, Vector3 viewDir, Vector3 fallVect, Vector3 boxMin, Vector3 boxMax, Vector3 lastMove, Vector3 randomMove, int useShader); |
---|
98 | |
---|
99 | |
---|
100 | /** function to update the different shader parameters used to update the particles positions, or render them */ |
---|
101 | void updateTimeSinceLastFrame(float tslf); |
---|
102 | /** function to update the different shader parameters used to update the particles positions, or render them */ |
---|
103 | void updateRainBilboardSideLength(float rainBbSide); |
---|
104 | /** function to update the different shader parameters used to update the particles positions, or render them */ |
---|
105 | void updateStreaksHeight(float streaksHeight); |
---|
106 | /** function to update the different shader parameters used to update the particles positions, or render them */ |
---|
107 | void updateLightCount(float nbLights); |
---|
108 | /** function to update the different shader parameters used to update the particles positions, or render them */ |
---|
109 | void updateViewPos(Vector3 viewPos); |
---|
110 | /** function to update the different shader parameters used to update the particles positions, or render them */ |
---|
111 | void updateViewDir(Vector3 viewDir); |
---|
112 | /** function to update the different shader parameters used to update the particles positions, or render them */ |
---|
113 | void updateFallVector(Vector3 fallVect); |
---|
114 | /** function to update the different shader parameters used to update the particles positions, or render them */ |
---|
115 | void updateBoxMin(Vector3 boxMin); |
---|
116 | /** function to update the different shader parameters used to update the particles positions, or render them */ |
---|
117 | void updateBoxMax(Vector3 boxMax); |
---|
118 | /** function to update the different shader parameters used to update the particles positions, or render them */ |
---|
119 | void updateLastMove(Vector3 lastMove); |
---|
120 | /** function to update the different shader parameters used to update the particles positions, or render them */ |
---|
121 | void updateRandomMove(Vector3 randomMove); |
---|
122 | |
---|
123 | /** functions which hide the particle position billboards. |
---|
124 | billboards must be hidden when rendering the scene, and visible when updating the position texture */ |
---|
125 | void hidePositionBillboards() |
---|
126 | { |
---|
127 | bbSet1->setVisible(false); |
---|
128 | bbSet2->setVisible(false); |
---|
129 | } |
---|
130 | /** functions which show the particle position billboards. |
---|
131 | billboards must be hidden when rendering the scene, and visible when updating the position texture */ |
---|
132 | void showPositionBillboards() |
---|
133 | { |
---|
134 | bbSet1->setVisible(true); |
---|
135 | bbSet2->setVisible(true); |
---|
136 | } |
---|
137 | |
---|
138 | private : |
---|
139 | |
---|
140 | /** this function defines the material used to texture the particles */ |
---|
141 | void createMaterial(String name); |
---|
142 | |
---|
143 | /** creation of the auxiliary camera used to texture our particles */ |
---|
144 | Camera* createDropsCamera(); |
---|
145 | |
---|
146 | /** definition of the shader parameters used for the particles material */ |
---|
147 | void GPUmaterial(); |
---|
148 | |
---|
149 | /** function used to initialize the position texture */ |
---|
150 | void initializeBillboardsPositionTexture(); |
---|
151 | |
---|
152 | /** function which creates a simple quad mesh to use on our hardware billboards */ |
---|
153 | MeshPtr createHardwareBillboardMesh(String materialName, String meshName=BILLBOARD_MESH_NAME); |
---|
154 | |
---|
155 | /** function to update a billboard mesh created as a manual resource, used to give it the appropriate texture coordinates */ |
---|
156 | void modifyClonedHardwareBillboardMesh(MeshPtr &msh, int partNumber); |
---|
157 | |
---|
158 | /** function which initializes the vertex buffers and textures */ |
---|
159 | void initParticles(); |
---|
160 | |
---|
161 | /** function which defines the position renderTexture */ |
---|
162 | void createBillboardsPositionRenderTexture(RenderTexture *PSPosTexture, Vector3 nodePos, BillboardSet *bbSet); |
---|
163 | |
---|
164 | /** function which defines the material used to update the particles position texture */ |
---|
165 | void createBillboardsPositionTextureMaterial(String inputTextureName); |
---|
166 | }; |
---|
167 | |
---|
168 | |
---|
169 | |
---|
170 | |
---|
171 | #endif // __RAIN_CLOSE_DROPS_PARTICLES__ |
---|