Pour ce projet, vous devez avoir sur votre machine :
- Une distribution d'OpenGL 4.5
- La bibliothèque glew
- La bibliothèque GLUT
- La bibliothèque glfw3
- Un compilateur C++
./linux.sh
./fireworkLe projet Firework a pour but de modéliser en 3D un feu d'artifice ainsi que le canon par lequel ceux-ci sont lancé. Pour cela, nous utilisons l'API OpenGL.
graph LR
%% STYLE DEFINITIONS
classDef hub fill:transparent, stroke:none;
classDef buffer fill:#d1e7ff,stroke:#1e88e5,stroke-width:1px,color:#003366;
classDef uniform fill:#ffe6b3,stroke:#ffb300,stroke-width:1px,color:#664400;
classDef shaderLauncher fill:#c8e6c9,stroke:#388e3c,stroke-width:1px,color:#1b5e20;
classDef shaderFirework fill:#ffcdd2,stroke:#e53935,stroke-width:1px,color:#b71c1c;
classDef shaderCompute fill:#d1c4e9,stroke:#673ab7,stroke-width:1px,color:#311b92;
classDef output fill:#fff3e0,stroke:#fb8c00,stroke-width:1px,color:#e65100;
%% DATA
subgraph buffers[Buffers]
subgraph ssbo[SSBOs]
fd[/Firework Data/]:::buffer
fp[/Firework Positions/]:::buffer
fc[/Firework Colors/]:::buffer
end
subgraph vbo[VBOs]
lv[/Launcher Vertex/]:::buffer
lns[/Launcher Normal Smooth/]:::buffer
end
vboHub(( )):::hub
end
subgraph u[Uniforms]
lWM([Launcher WorldView Matrix]):::uniform
fWM([Firework WorldView Matrix]):::uniform
cM([Camera Matrix]):::uniform
at([Animation Time]):::uniform
mt([Max Time]):::uniform
mc([Max Count]):::uniform
me([Max Explosion]):::uniform
end
%% SHADERS
subgraph launcher[Launcher Shaders]
direction LR
lV[Vertex Shader]:::shaderLauncher --> lTC[Tessellation Control]:::shaderLauncher
lTC --> lTE[Tessellation Evaluation]:::shaderLauncher
lTE --> lF[Fragment Shader]:::shaderLauncher
end
subgraph firework[Firework Shaders]
direction LR
fV[Vertex Shader]:::shaderFirework --> fG[Geometry Shader]:::shaderFirework
fG --> fF[Fragment Shader]:::shaderFirework
end
subgraph generate[Generate Shaders]
direction TB
gC[Compute Shader]:::shaderCompute
end
subgraph mouvement[Movement Shaders]
direction TB
mC[Compute Shader]:::shaderCompute
end
%% OUTPUT
R([Final Image]):::output
%% HUBS
timeHub(( )):::hub
computeHub(( )):::hub
ssboHub(( )):::hub
rHub(( )):::hub
camHub(( )):::hub
fireworkHub(( )):::hub
%% DATA FLOWS
fd -.-> mC
fp -.- fireworkHub
fc -.- fireworkHub
fireworkHub -.-> fV
lv -.- vboHub
lns -.- vboHub
vboHub -.-> lV
at -.- timeHub
timeHub -.-> launcher
timeHub -.-> firework
cM -.- camHub
camHub -.-> launcher
camHub -.-> firework
lWM -.-> launcher
fWM -.-> firework
mt -.- computeHub
mc -.- computeHub
me -.- computeHub
at -.- computeHub
computeHub -.-> gC
computeHub -.-> mC
%% SHADER PIPELINES
gC --> fd
mC --- ssboHub
ssboHub --> fp
ssboHub --> fc
fF --- rHub
lF --- rHub
rHub --> R
graph LR
%% STYLE DEFINITIONS
classDef hub fill:transparent, stroke:none;
classDef shaderLauncher fill:#c8e6c9,stroke:#388e3c,stroke-width:1px,color:#1b5e20;
classDef shaderFirework fill:#ffcdd2,stroke:#e53935,stroke-width:1px,color:#b71c1c;
classDef shaderCompute fill:#d1c4e9,stroke:#673ab7,stroke-width:1px,color:#311b92;
classDef output fill:#fff3e0,stroke:#fb8c00,stroke-width:1px,color:#e65100;
subgraph generator[Generator Shaders]
gC[Compute Shader]:::shaderCompute
end
subgraph movement[Movement Shaders]
mC[Compute Shader]:::shaderCompute
end
subgraph launcher[Launcher Shaders]
lV[Vertex Shader]:::shaderLauncher --> lTC[Tessellation Control]:::shaderLauncher
lTC --> lTE[Tessellation Evaluation]:::shaderLauncher
lTE --> lF[Fragment Shader]:::shaderLauncher
end
subgraph firework[Firework Shaders]
fV[Vertex Shader]:::shaderFirework --> fG[Geometry Shader]:::shaderFirework
fG --> fF[Fragment Shader]:::shaderFirework
end
%% OUTPUT
R([Final Image]):::output
%% HUBS
rHub(( )):::hub
%% SHADER PIPELINES
generator -.-> movement
movement -.-> firework
movement -.-> launcher
fF --- rHub
lF --- rHub
rHub --> R
Voici un graph simple du cycle de vie d'une ligne de feu d'artifices :
graph LR
classDef l1 fill:#c8e6c9,stroke:#388e3c,stroke-width:1px,color:#1b5e20;
classDef l2 fill:#ffcdd2,stroke:#e53935,stroke-width:1px,color:#b71c1c;
i[initialisation de la ligne de lancement]:::l1
e[explosion]:::l1
i2[initialisation des lignes de secondaires]:::l2
f[disparait]:::l2
i -- si la ligne a expiré --> e
e --> i
e --> i2
i2 --si la ligne a expiré--> f