# IPA projekt 2024  

## Cíl projektu  

Cílem projektu je optimalizovat algoritmus pro výpočet vln na vodě. Tento algoritmus je implementován v souboru `Ocean.cpp`, konkrétně ve funkci `updateVertices` a jejích volaných funkcích. Vaším úkolem bude vytvořit optimalizovanou verzi této funkce pomocí **SSE, AVX** nebo **AVX2**.  

Kód můžete implementovat pomocí **intrinsic funkcí** (změňte v `Ocean.h` makro `ASM_TYPE` na `INTRINSIC`) nebo čistě v **GCC inline assembly** v souboru `xlogin00.s` (změňte `ASM_TYPE` na `CLEAR_ASM`). Pokud použijete intrinsic funkce, budete řešit zadání v jednodušší variantě, a projekt bude hodnocen přísněji.

## Struktura dat  

V konstruktoru třídy `Ocean` se definují jednotlivé složky finální vlny, které se ukládají do **C++ vektoru**. Jednotlivé vlny se pak skládají do jednoho celku, přičemž s rostoucím počtem složek se zvyšuje i výpočetní náročnost.  

Váš projekt by měl podporovat **1 až N složek**. Každá jednotlivá vlna (složka) je definována pomocí následující struktury:  

```cpp
struct GerstnerWave {
    float amplitude;      // Amplituda vlny (výška)
    float wavelength;     // Vlnová délka (vzdálenost mezi hřebeny)
    float speed;          // Rychlost vlny
    glm::vec2 direction;  // Směr vlny (normalizovaný 2D vektor v XZ rovině)
    float phase;          // Fázový posun
};
```  

## Dokumentace  

V dokumentaci **podrobně popište** postup optimalizace. Pro lepší přehlednost můžete využít:  

- Blokové diagramy  
- Popisy klíčových částí kódu  
- Vysvětlení způsobu zpracování dat  

Na závěr **uveďte dosažené zrychlení**. Pokud projekt provádíte v **několika iteracích**, uveďte výkon pro jednotlivé verze.  


## Ovládání loďky

Ačkoliv to není z hlediska projektů tohoto zadání potřeba, loďku na vlnách můžete ovládat pomocí ASWD a kameru na povrch vody pomocí pravého tlačíka myši.


## Odevzdání  

Odevzdávat budete následující soubory:  

- `Ocean.cpp`  
- `Ocean.h`  
- `xlogin00.s`  
- `dokumentace.pdf`  


## Použití velkých jazykových modelů (ChatGPT, ....).

Během řešení projektu můžete využít jazykové modely za následujících podmínek: budou použity pouze na části kódu, danému kódu budete rozumět a v dokumentaci uvedete, k čemu jste jazykový model použili.

## Obhajoba

Na poslední cvičení bude obhajoba projektu, cílem je ukázat, že projektu rozumíte a víte, co jednotlivé části kódu dělají. V případě, že nebudete schopni vysvětlit, co váš kód dělá, bude to mít negativní vliv na hodnocení.


## Překlad a spuštění  

### Windows + VS Code  

Projekt spusťte ve **VS Code** z **2. cvičení**, které obsahuje všechny potřebné knihovny.  

### Linux  

Překlad můžete provádět pomocí **Makefile** nebo využít VS Code soubory pro spuštění. Na Linuxu je nutné mít nainstalované následující knihovny:  

Pro **Debian-based OS** (Ubuntu, Debian):  

```sh
sudo apt update
sudo apt install freeglut3-dev libglew-dev libsoil-dev libgl-dev libglu-dev libglm-dev
```

V případě, že používaté VS Code na linuxu, povolte si v nastavení (Preferences) přidávání breakpoint do neznámých souboru (volba Allow Breakpoints Everywhere).


## Bug, bugs,....

Pokud narazíte na problém, napište na goldmann@fit.vutbr.cz. 

