Skip to content

Commit 22d5fed

Browse files
author
Cheng Xie
committed
Did rain splash
1 parent 12fc072 commit 22d5fed

9 files changed

+108
-5
lines changed

src/common.h

+4
Original file line numberDiff line numberDiff line change
@@ -55,4 +55,8 @@ inline float randf(float a, float b) {
5555
return randf() * (b - a) + a;
5656
}
5757

58+
inline float linear_interpolate(float a, float b, float ratio) {
59+
return a * (1 - ratio) + b * ratio;
60+
}
61+
5862
#endif // COMMON_H

src/final.pro

+4-2
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,8 @@ SOURCES += main.cpp \
4949
terrainmaterial.cpp \
5050
material.cpp \
5151
cloud.cpp \
52-
rain.cpp
52+
rain.cpp \
53+
rainsplash.cpp
5354

5455
HEADERS += mainwindow.h \
5556
view.h \
@@ -87,6 +88,7 @@ HEADERS += mainwindow.h \
8788
DustcloudParticleSystem.h \
8889
terrainmaterial.h \
8990
cloud.h \
90-
rain.h
91+
rain.h \
92+
rainsplash.h
9193

9294
FORMS += mainwindow.ui

src/particlematerial.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,14 @@ void ParticleMaterial::apply(DrawContext &context)
2727

2828
//glDisable(GL_DEPTH_TEST);
2929
glDepthMask(GL_FALSE);
30+
glDisable(GL_CULL_FACE);
3031
}
3132

3233
void ParticleMaterial::endRender()
3334
{
3435
//glEnable(GL_DEPTH_TEST);
3536
glDepthMask(GL_TRUE);
37+
glEnable(GL_CULL_FACE);
3638
}
3739

3840
void ParticleMaterial::setTexture(Texture *texture)

src/rain.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,12 @@ Rain::Rain(float radius)
1212
Texture* texture = TextureCache::getInstance()->acquire("rain", TextureType::Texture2D);
1313
setParticleTexture(texture);
1414

15-
setEmissionRate(400);
15+
setEmissionRate(1000);
1616

1717
setMaxParticleCount(10000);
1818

1919
ParticleMaterial* material = static_cast<ParticleMaterial *>(material_);
20-
material->setLengthScale(8);
20+
material->setLengthScale(12);
2121
}
2222

2323
void Rain::spawnParticle(Particle *particle)
@@ -39,7 +39,7 @@ void Rain::spawnParticle(Particle *particle)
3939

4040
particle->maxLife = 2;
4141

42-
particle->size = 0.07;
42+
particle->size = 0.08;
4343

4444
float scale = randf(0.6f, 0.8f);
4545
particle->color = {scale, scale, scale};

src/rainsplash.cpp

+60
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
#include "rainsplash.h"
2+
#include "texture.h"
3+
#include "texturecache.h"
4+
#include "particlematerial.h"
5+
#include "terrain.h"
6+
7+
RainSplash::RainSplash(float radius, bool mist, Terrain* terrain)
8+
{
9+
radius_ = radius;
10+
terrain_ = terrain;
11+
12+
Texture* texture = NULL;
13+
ParticleMaterial* material = static_cast<ParticleMaterial *>(material_);
14+
15+
if (mist) {
16+
texture = TextureCache::getInstance()->acquire("rainmist", TextureType::Texture2D);
17+
material->setHorizontal(false);
18+
}
19+
else {
20+
texture = TextureCache::getInstance()->acquire("raindrop", TextureType::Texture2D);
21+
material->setHorizontal(true);
22+
}
23+
24+
setParticleTexture(texture);
25+
26+
setEmissionRate(1000);
27+
28+
setMaxParticleCount(10000);
29+
}
30+
31+
void RainSplash::spawnParticle(Particle *particle)
32+
{
33+
float phi = randf(0, M_PI * 2);
34+
float r = radius_ * randf(0.3, 1.0);
35+
36+
float x = cosf(phi) * r;
37+
float z = sinf(phi) * r;
38+
float y = terrain_->height(x, z) + 0.1;
39+
40+
particle->position = {x, y, z};
41+
42+
particle->maxLife = randf(0.4, 0.6);
43+
44+
particle->size = startSize_ = randf(0.2, 0.3);
45+
46+
float c = randf(0.6, 0.9);
47+
particle->color = {c, c, c};
48+
49+
particle->opacity = startOpacity_ = randf(0.6, 0.8);
50+
51+
startSize_ = 0.2;
52+
}
53+
54+
void RainSplash::updateParticle(Particle &particle, float dt)
55+
{
56+
float x = particle.life / particle.maxLife;
57+
particle.size = linear_interpolate(startSize_, startSize_ + 0.15, x);
58+
particle.opacity = startOpacity_ * (1 - x);
59+
60+
}

src/rainsplash.h

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#ifndef RAINSPLASH_H
2+
#define RAINSPLASH_H
3+
4+
#include "particlesystem.h"
5+
6+
class Terrain;
7+
8+
class RainSplash : public ParticleSystem
9+
{
10+
public:
11+
RainSplash(float radius, bool mist, Terrain* terrain);
12+
13+
virtual void spawnParticle(Particle *particle) override;
14+
15+
virtual void updateParticle(Particle &particle, float dt) override;
16+
17+
private:
18+
float radius_ = 0;
19+
20+
// weak reference
21+
Terrain* terrain_ = NULL;
22+
23+
float startSize_ = 0;
24+
float startOpacity_ = 0;
25+
};
26+
27+
#endif // RAINSPLASH_H

src/scene.cpp

+8
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "terrain.h"
1414
#include "cloud.h"
1515
#include "rain.h"
16+
#include "rainsplash.h"
1617

1718
Scene::Scene()
1819
{
@@ -93,6 +94,13 @@ void Scene::initialize()
9394
// Rain
9495
Rain* rain = new Rain(30);
9596
sceneObjects_.push_back(rain);
97+
98+
// RainSplash
99+
RainSplash* splash = new RainSplash(50, true, terrain);
100+
sceneObjects_.push_back(splash);
101+
102+
splash = new RainSplash(50, false, terrain);
103+
sceneObjects_.push_back(splash);
96104
}
97105

98106
void Scene::render(DrawContext &context)

src/textures/raindrop.png

20.7 KB
Loading

src/textures/rainmist.png

5.83 KB
Loading

0 commit comments

Comments
 (0)