Skip to content

Commit 7c88e93

Browse files
authored
Merge pull request #150 from edunad/features/particle-engine
[FEATURE] GPU Particle System
2 parents 21851da + 685f199 commit 7c88e93

File tree

86 files changed

+1387
-457
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

86 files changed

+1387
-457
lines changed

README.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,10 @@
5050
- Packet networking support
5151
- I18N (internationalization) support
5252
- GPU picking
53+
- GPU particle engine
5354

5455
# TODO LIST
5556

56-
- Particle engine
5757
- Add animation blending
5858
- Add lights shadow maps
5959

@@ -190,9 +190,9 @@
190190

191191
# SAMPLES
192192

193-
| 001-stencil<br/><a href='/samples/001-stencil'><img src="https://i.rawr.dev/sample1-min-2.gif" width="240" /></a> | 002-generated-models<br/><a href='/samples/002-generated-models'><img src="https://i.rawr.dev/sample2-min-3.gif" width="240" /></a> | 003-light<br/><a href='/samples/003-light'><img src="https://i.rawr.dev/sample3-min-3.gif" width="240" /></a> |
194-
| :-------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------: |
195-
| 004-instancing<br/><a href='/samples/004-instancing'><img src="https://i.rawr.dev/sample4-min.gif" width="240" /></a> | 005-post-process<br/><a href='/samples/005-post-process'><img src="https://i.rawr.dev/sample5-min.gif" width="240" /></a> | 006-decals<br/><a href='/samples/006-decals'><img src="https://i.rawr.dev/sample6-min-2.gif" width="240" /></a> |
196-
| ~~007-particle-system~~ (TODO) | 008-ui<br/><a href='/samples/008-ui'><img src="https://i.rawr.dev/sample8-min.gif" width="240" /></a> | 009-assimp<br/><a href='/samples/009-assimp'><img src="https://i.rawr.dev/sample9-min.gif" width="240" /></a> |
197-
| 010-bass-audio<br/><a href='/samples/010-bass-audio'><img src="https://i.rawr.dev/bylavGsjpB.png" width="240" /></a> | 011-physics-3D<br/><a href='/samples/011-physics-3D'><img src="https://i.rawr.dev/sample11-min.gif" width="240" /></a> | 012-physics-2D<br/><a href='/samples/012-physics-2D'><img src="https://i.rawr.dev/sample12-min.gif" width="240" /></a> |
198-
| 013-webm<br/><a href='/samples/013-webm'><img src="https://i.rawr.dev/sample13-min.gif" width="240" /></a> | 014-scripting<br/><a href='/samples/014-scripting'><img src="https://i.rawr.dev/sample14-min.gif" width="240" /></a> | 015-gpu-picking<br/><a href='/samples/015-gpu-picking'><img src="https://i.rawr.dev/sample15-min.gif" width="240" /></a> |
193+
| 001-stencil<br/><a href='/samples/001-stencil'><img src="https://i.rawr.dev/sample1-min-2.gif" width="240" /></a> | 002-generated-models<br/><a href='/samples/002-generated-models'><img src="https://i.rawr.dev/sample2-min-3.gif" width="240" /></a> | 003-light<br/><a href='/samples/003-light'><img src="https://i.rawr.dev/sample3-min-3.gif" width="240" /></a> |
194+
| :-----------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------: |
195+
| 004-instancing<br/><a href='/samples/004-instancing'><img src="https://i.rawr.dev/sample4-min.gif" width="240" /></a> | 005-post-process<br/><a href='/samples/005-post-process'><img src="https://i.rawr.dev/sample5-min.gif" width="240" /></a> | 006-decals<br/><a href='/samples/006-decals'><img src="https://i.rawr.dev/sample6-min-2.gif" width="240" /></a> |
196+
| 007-particle-system<br/><a href='/samples/007-particle-system'><img src="https://i.rawr.dev/sample7-min.gif" width="240" /></a> | 008-ui<br/><a href='/samples/008-ui'><img src="https://i.rawr.dev/sample8-min.gif" width="240" /></a> | 009-assimp<br/><a href='/samples/009-assimp'><img src="https://i.rawr.dev/sample9-min.gif" width="240" /></a> |
197+
| 010-bass-audio<br/><a href='/samples/010-bass-audio'><img src="https://i.rawr.dev/bylavGsjpB.png" width="240" /></a> | 011-physics-3D<br/><a href='/samples/011-physics-3D'><img src="https://i.rawr.dev/sample11-min.gif" width="240" /></a> | 012-physics-2D<br/><a href='/samples/012-physics-2D'><img src="https://i.rawr.dev/sample12-min.gif" width="240" /></a> |
198+
| 013-webm<br/><a href='/samples/013-webm'><img src="https://i.rawr.dev/sample13-min.gif" width="240" /></a> | 014-scripting<br/><a href='/samples/014-scripting'><img src="https://i.rawr.dev/sample14-min.gif" width="240" /></a> | 015-gpu-picking<br/><a href='/samples/015-gpu-picking'><img src="https://i.rawr.dev/sample15-min.gif" width="240" /></a> |

assets/raw/particles.png

64.7 KB
Loading

rawrbox.assimp/include/rawrbox/assimp/utils/model.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ namespace rawrbox {
77

88
class AssimpUtils {
99
public:
10-
template <typename M = MaterialUnlit>
10+
template <typename M = rawrbox::MaterialUnlit>
1111
requires(std::derived_from<M, rawrbox::MaterialBase>)
1212
static rawrbox::Mesh<typename M::vertexBufferType> extractMesh(const rawrbox::AssimpImporter& model, size_t indx) {
1313
const auto& meshes = model.meshes;

rawrbox.bass/include/rawrbox/bass/manager.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ namespace rawrbox {
3939
static void setMasterVolume(float volume, bool set = true);
4040
static void setMuteOnUnfocus(bool set);
4141
static void setHasFocus(bool hasFocus);
42-
static void setListenerLocation(const rawrbox::Vector3f& location, const rawrbox::Vector3f& front = {0, 0, 1}, const rawrbox::Vector3f& top = {0, 1, 0});
42+
static void setListenerLocation(const rawrbox::Vector3f& location, const rawrbox::Vector3f& front = {0, 0, 1}, const rawrbox::Vector3f& up = {0, 1, 0});
4343
// -----
4444
};
4545
} // namespace rawrbox

rawrbox.code-workspace

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@
7676
"workbench.editor.wrapTabs": true,
7777
"files.insertFinalNewline": true,
7878
"files.associations": {
79+
"*.gsh": "hlsl",
7980
"*.csh": "hlsl",
8081
"xstring": "cpp",
8182
"functional": "cpp",

rawrbox.render/assets/shaders/include/camera.fxh

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@
44

55
struct CameraStruct {
66
float4x4 view;
7+
float4x4 viewInv;
78

89
float4x4 world;
910
float4x4 worldViewProj;
1011

11-
float4 pos;
12+
float3 pos;
13+
float deltaTime;
1214
};
1315

1416
// Data that never / very rarelly changes

rawrbox.render/assets/shaders/include/hash.fxh

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,4 +79,22 @@
7979

8080
return v;
8181
}
82+
83+
// Generate random float2 in range [0, 1)
84+
float2 generateRandom(uint2 v) {
85+
uint2 p = pcg2d(v);
86+
return float2(p) / float(0xffffffffu);
87+
}
88+
89+
// Generate random float3 in range [0, 1)
90+
float3 generateRandom(uint3 v) {
91+
uint3 p = pcg3d(v);
92+
return float3(p) / float(0xffffffffu);
93+
}
94+
95+
// Generate random float4 in range [0, 1)
96+
float4 generateRandom(uint4 v) {
97+
uint4 p = pcg4d(v);
98+
return float4(p) / float(0xffffffffu);
99+
}
82100
#endif

rawrbox.render/assets/shaders/include/math.fxh

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
static const float FLT_MIN = 1.175494351e-38F;
55
static const float FLT_MAX = 3.402823466e+38F;
66

7+
static const float GRAVITY = -9.81F;
8+
79
static const float PI = 3.14159265358979323846;
810
static const float INV_PI = 0.31830988618379067154;
911
static const float INV_2PI = 0.15915494309189533577;
@@ -30,5 +32,28 @@
3032
float xx = x * x;
3133
return xx * xx * x;
3234
}
35+
36+
// UTILS -----------------
37+
uint Flatten2D(uint2 index, uint dimensionsX) {
38+
return index.x + index.y * dimensionsX;
39+
}
40+
41+
uint Flatten3D(uint3 index, uint2 dimensionsXY) {
42+
return index.x + index.y * dimensionsXY.x + index.z * dimensionsXY.x * dimensionsXY.y;
43+
}
44+
45+
uint2 UnFlatten2D(uint index, uint dimensionsX) {
46+
return uint2(index % dimensionsX, index / dimensionsX);
47+
}
48+
49+
uint3 UnFlatten3D(uint index, uint2 dimensionsXY) {
50+
uint3 outIndex;
51+
outIndex.z = index / (dimensionsXY.x * dimensionsXY.y);
52+
index -= (outIndex.z * dimensionsXY.x * dimensionsXY.y);
53+
outIndex.y = index / dimensionsXY.x;
54+
outIndex.x = index % dimensionsXY.x;
55+
return outIndex;
56+
}
57+
// -----------------------
3358
#endif
3459

rawrbox.render/assets/shaders/materials/include/model_transforms.fxh

Lines changed: 19 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -8,34 +8,30 @@
88
};
99

1010
// Snap vertex to achieve PSX look
11-
#ifdef TRANSFORM_PSX
12-
float4 PSXTransform(float4 vertex, float2 resolution) {
13-
float4 snappedPos = vertex;
14-
snappedPos.xyz = vertex.xyz / vertex.w; // convert to normalised device coordinates (NDC)
15-
snappedPos.xy = floor(resolution * snappedPos.xy) / resolution; // snap the vertex to the lower-resolution grid
16-
snappedPos.xyz *= vertex.w; // convert back to projection-space
17-
18-
return snappedPos;
19-
}
20-
#endif
21-
// ----------------------
11+
float4 PSXTransform(float4 vertex, float2 resolution) {
12+
float4 snappedPos = vertex;
13+
snappedPos.xyz = vertex.xyz / vertex.w; // convert to normalised device coordinates (NDC)
14+
snappedPos.xy = floor(resolution * snappedPos.xy) / resolution; // snap the vertex to the lower-resolution grid
15+
snappedPos.xyz *= vertex.w; // convert back to projection-space
2216

23-
#ifdef TRANSFORM_BILLBOARD
24-
float4 billboardTransform(float4 vertex, int billboard) {
25-
float3 right = float3(1, 0, 0);
26-
float3 up = float3(0, 1, 0);
17+
return snappedPos;
18+
}
19+
// ----------------------
2720

28-
if ((billboard & 2) != 0) { // X
29-
right = float3(Camera.view[0][0], Camera.view[1][0], Camera.view[2][0]);
30-
}
21+
float4 billboardTransform(float4 vertex, uint billboard) {
22+
float3 right = float3(1, 0, 0);
23+
float3 up = float3(0, 1, 0);
3124

32-
if ((billboard & 4) != 0) {// Y
33-
up = float3(Camera.view[0][1], Camera.view[1][1], Camera.view[2][1]);
34-
}
25+
if ((billboard & 2) != 0) { // X
26+
right = float3(Camera.view[0][0], Camera.view[1][0], Camera.view[2][0]);
27+
}
3528

36-
return float4((right * vertex.x) + (up * vertex.y), 1.);
29+
if ((billboard & 4) != 0) {// Y
30+
up = float3(Camera.view[0][1], Camera.view[1][1], Camera.view[2][1]);
3731
}
38-
#endif
32+
33+
return float4((right * vertex.x) + (up * vertex.y), 1.);
34+
}
3935

4036
#ifdef SKINNED
4137
#ifdef TRANSFORM_BONES

rawrbox.render/assets/shaders/materials/model/lit/lit.psh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ void main(in PSInput PSIn, out PSOutput PSOut) {
8484
float4 emissionTS = g_Textures[Constants.textureIDs.w].Sample(g_Sampler, float3(PSIn.UV, PSIn.TexIndex)) * PSIn.Color;
8585

8686
// LIGHT ------
87-
float3 V = normalize(Camera.pos.xyz - PSIn.WorldPos.xyz);
87+
float3 V = normalize(Camera.pos - PSIn.WorldPos.xyz);
8888
float dither = InterleavedGradientNoise(PSIn.Pos.xy);
8989

9090
// Apply compute data ----

0 commit comments

Comments
 (0)