/treegen

Primary LanguageC++

Treegen - generátor modelů stromů

Cílem mé práce bylo vytvořit software - generátor realistikckých modelů stromů

Dokumentace pro uživatele

Spuštění

  • Spuštění provedete následujícími příkazy pro git:

  • Nemáte-li DirectX, program vypíše chybu jako "V počítači chybí knihovna d3dx9_43" V tomto případě si stáhněte chybějící knihovny z branche knihovnyDx9 a vložte je k binárnímu souboru.

Ovládáni:

  • w, s, a, d - dopredu, dozadu, doleva, doprava
  • q, e - nahoru, dolu
  • ↑, ↓, ←, → - pohled nahoru, dolu, vlevo, vpravo
  • myš - směr kamery
  • levé tlačítko myši - přidá strom, náhodně vygenerovaný v reálném čase
  • příkazy:
    • Pro zadání příkazu stiskněte mezerník+příkaz[+mezera+argument]+enter. Argument je celé číslo. Není-li specifikován příkaz, program předpokládá nastavení rychlosti.
    • "testy" - spustí testy programu, které otestují všechny možné příkazy
    • "jeden" - vymaže geometrii scény a vygeneruje jeden strom.
    • "rychl" - nastaví rychlost pohybu kamery, výchozí rychlost je 5000
    • "odebe" - odebere posledně přidaný strom
    • "gener" / "pride" - přidá zadaný počet stromů, je-li menší než 200
    • "eleme" + 0(bod), 1(primka), 2(plocha) - tam, kde je to možné, změní vykreslovaný element na zvolený element
    • "backc" - prohodí barvu pozadí mezi černou/bílou
    • "vymaz" - vymaže všechnu geometrii na scéně
    • "regen" - znovu vygeneruje počáteční scénu
    • "reset" - obnoví počáteční podmínky programu
    • "fovde" + číslo z <2, 50) - změní horizontální zorný úhel, číslo je jmenovatelem pro úhel v radiánech(PI/x)
    • "citli" + číslo z <0, 10> - změní citlivost myši
    • "wiref" - prohodí render state mezi solid/wireframe
    • "osvet" - vypne/zapne osvětlování
    • "nerot" - zastaví rotaci všech modelů
    • "zhasn" - zhasne baterku(světlo ve směru hledí)
    • "rozzn" - rozžne baterku
    • "shadi" - prohodí způsob stínování Goraud/flat
    • "culli" - vypne/zapne culling(technika, kdy se nevykreslují skryté trojuhelníky)

Dokumentace pro programátory

programátorská dokumentace

Kompilace

Budete potřebovat:

Příkazy pro git:

Úprava kompiluj.bat

  • V souboru kompiluj.bat v adresáři projektu změňte hodnotu proměnné CESTA_KOMPILATORU na složku s instalací TDM GCC

  • Nyní je vše připraveno.

    • spusťte soubor kompiluj.bat
    • spusťte bin/mingwTreegen.exe

Instalace prostředí:

Budete potřebovat:

Příkazy pro git:

Další kroky:

  • V Codeblocks nastavte nový kompilátor:

    • Settings -> Compiler -> v selected compiler vyberte položku GNU GCC Compiler -> Copy -> zadat název nového kompilátoru, např.: "Twilight Dragon Media compiler"
    • přejděte na záložku Toolchain executables
    • Compiler´s installation directory nastavte na adresář kompilátoru obsahující podsložku "bin"
    • C++ compiler nastavte na: "x86_64-w64-mingw32-g++.exe"
    • Linker pro dyn. knihovny na totéž
  • Nastavte projektu Build options:

    • Project -> Build options
    • Vlevo vyberte target "tdmDebug"
    • Vyberte nově přidaný kompilátor "Twilight Dragon Media compiler"
    • V záložce "Compiler settings" -> "other options" -> přidejte "-g -std=gnu++1y"
    • V záložce "Linker settings" by již mělo být "d3d9, d3dx9_43, dinput8, dxguid"
    • V záložce "Search directories" -> "compiler" -> add -> najděte cestu kořenového adresáře boostu, pozor cesta nesmí končit lomítkem!
  • Výsledný Build log by měl vypadat nějak takto:

-------------- Build: tdmDebug in mingwTreegen (compiler: Twilight Dragon Media compiler)---------------

x86_64-w64-mingw32-g++.exe -g -std=gnu++1y -I"H:\local new\programování\CB\struktury stromu\Treegen\devpaks\boost_1_57_0" -c "H:\local new\programování\CB\struktury stromu\Treegen\Engine.cpp" -o .objs\Engine.o
x86_64-w64-mingw32-g++.exe -g -std=gnu++1y -I"H:\local new\programování\CB\struktury stromu\Treegen\devpaks\boost_1_57_0" -c "H:\local new\programování\CB\struktury stromu\Treegen\Helper.cpp" -o .objs\Helper.o
x86_64-w64-mingw32-g++.exe -g -std=gnu++1y -I"H:\local new\programování\CB\struktury stromu\Treegen\devpaks\boost_1_57_0" -c "H:\local new\programování\CB\struktury stromu\Treegen\Input.cpp" -o .objs\Input.o
x86_64-w64-mingw32-g++.exe -g -std=gnu++1y -I"H:\local new\programování\CB\struktury stromu\Treegen\devpaks\boost_1_57_0" -c "H:\local new\programování\CB\struktury stromu\Treegen\Kamera.cpp" -o .objs\Kamera.o
x86_64-w64-mingw32-g++.exe -g -std=gnu++1y -I"H:\local new\programování\CB\struktury stromu\Treegen\devpaks\boost_1_57_0" -c "H:\local new\programování\CB\struktury stromu\Treegen\Kontroler3d.cpp" -o .objs\Kontroler3d.o
x86_64-w64-mingw32-g++.exe -g -std=gnu++1y -I"H:\local new\programování\CB\struktury stromu\Treegen\devpaks\boost_1_57_0" -c "H:\local new\programování\CB\struktury stromu\Treegen\main.cpp" -o .objs\main.o
x86_64-w64-mingw32-g++.exe -g -std=gnu++1y -I"H:\local new\programování\CB\struktury stromu\Treegen\devpaks\boost_1_57_0" -c "H:\local new\programování\CB\struktury stromu\Treegen\msgProc.cpp" -o .objs\msgProc.o
x86_64-w64-mingw32-g++.exe -g -std=gnu++1y -I"H:\local new\programování\CB\struktury stromu\Treegen\devpaks\boost_1_57_0" -c "H:\local new\programování\CB\struktury stromu\Treegen\SWU\Konzole.cpp" -o .objs\SWU\Konzole.o
x86_64-w64-mingw32-g++.exe -g -std=gnu++1y -I"H:\local new\programování\CB\struktury stromu\Treegen\devpaks\boost_1_57_0" -c "H:\local new\programování\CB\struktury stromu\Treegen\SWU\Okno.cpp" -o .objs\SWU\Okno.o
x86_64-w64-mingw32-g++.exe -g -std=gnu++1y -I"H:\local new\programování\CB\struktury stromu\Treegen\devpaks\boost_1_57_0" -c "H:\local new\programování\CB\struktury stromu\Treegen\Tree.cpp" -o .objs\Tree.o
x86_64-w64-mingw32-g++.exe -g -std=gnu++1y -I"H:\local new\programování\CB\struktury stromu\Treegen\devpaks\boost_1_57_0" -c "H:\local new\programování\CB\struktury stromu\Treegen\Tree3.cpp" -o .objs\Tree3.o
x86_64-w64-mingw32-g++.exe -g -std=gnu++1y -I"H:\local new\programování\CB\struktury stromu\Treegen\devpaks\boost_1_57_0" -c "H:\local new\programování\CB\struktury stromu\Treegen\Tvar.cpp" -o .objs\Tvar.o
x86_64-w64-mingw32-g++.exe -g -std=gnu++1y -I"H:\local new\programování\CB\struktury stromu\Treegen\devpaks\boost_1_57_0" -c "H:\local new\programování\CB\struktury stromu\Treegen\Usecka.cpp" -o .objs\Usecka.o
x86_64-w64-mingw32-g++.exe  -o mingwTreegen.exe .objs\Engine.o .objs\Helper.o .objs\Input.o .objs\Kamera.o .objs\Kontroler3d.o .objs\main.o .objs\msgProc.o .objs\SWU\Konzole.o .objs\SWU\Okno.o .objs\Tree.o .objs\Tree3.o .objs\Tvar.o .objs\Usecka.o  -static  -ld3d9 -ld3dx9_43 -ldinput8 -ldxguid
Output file is mingwTreegen.exe with size 4.33 MB
Process terminated with status 0 (0 minute(s), 17 second(s))
0 error(s), 0 warning(s) (0 minute(s), 17 second(s))
 

Struktura kódu

vstupní bod programu: main

  1. Inicializace statických proměnných pocetInstanciStromu třídy
#include <windows.h>
#include "Engine.hpp"
#include "globals.hpp"

int t::Tree::pocetInstanciStromu = 0;   // inicializace staticke promenne tridy Tree, slouzi k uchovani poctu strukturovych stromu. Inicializace statickych promennych je nutne provest vzdy mimo tridu.
int t3::Tree3::pocetInstanciStromu = 0;     // inicializace staticke promenne tridy Tree3, slouzi k uchovani poctu 3D stromu
int se::Svetlo::pocetInstanciSvetla = 0;       // inicializace staticke promenne tridy Svetlo, slouzi k uchovani poctu svetel sceny

int main (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nCmdShow)
{
    sk::Konzole iKonzole;       // inicializace  instance tridy Konzole, ktera se stara o okno konzole, vstup a vystup konzole
    sw::Pozice iPozice {0, 0};      // inicializace objektu Pozice, ktery nese informace o pozici okna
    sw::Rozmery iRozmery {windowWidth, windowHeight};
    sw::Okno iOkno(iPozice, "Tree", hThisInstance);    // inicializace objektu tridy Okno, ktery ma za ukol starat se o okno Win programu, jeho presouvani do popredi a zpravy z systemu
    se::Engine iEngine(&iOkno);         // inicializace objektu tridy Engine, jehoz funkce potrebuji(zejmena kvuli DX) pristup k informacim o oknu
    iEngine.dejKonzoli(iKonzole);           // predani reference na iKonzoli objektu iEngine, aby mohl pouzivat jeji funkce
    iEngine.priprav();    // Pripravi rozhrani DirectX, vyhradi pristup ke graficke karte, nastavi BackBuffer, Depth stencil, svetla, Render state, vytvori geometrii stromu
    iOkno.ukaz();       // ukaze okno
    while ( iOkno.jeOtevrene() ) {              // smycka programu
        iEngine.prectiVstupAUpravKameru();      // zavola metodu Kontroleru3d iKontroler3d.prectiVstupAUpravKameru(arg), ktera aktualizuje matice View podle uzivatelskeho vstupu
        if(!iOkno.postarejSeOZpravy()){                     // Zmacknul-li uzivatel krizek, ukonci program.
            iEngine.releaseD3d();               // uvolni pamet alokovanou v prubehu programu, uvolni pristup ke GP, klavesnici a mysi
            break;
        }
        else if(iEngine.prikaz == "odejdi" ){               // , v pripade zpravy odejdi ukonci program (prave tlacitko mysi, nebo prikaz)
            break;
        }
        iEngine.render3d();                     // vykresli scenu, neboli prohodi back a front buffer, predchozi obsah backbuffru je smazan
    }
    return 0;
}

(Changelog)

oblémů: + fractal stromu + základy DX + promýšlení indexování vertexů + zkoumání shaderů + přemýšlení nad využitím možností jazyka c++11

27.10.2014>>

10.11.2014>>

  • Instalace codeblocks
  • Řešení problémů s knihovnami DX
  • Instalace GitBash na ntb

18.11.2014>>

  • Přidání konzole k GUI screenshot.jpg

25.11.2014>>

  • Přidání ovládání kamery myší + volný pohyb ve směrech hledícího vektoru.

8.12.2014>>

  • Jetbrains CLion IDE

5.1.2015>>

  • Řešení problému s CodeBlocks a VC++2013

  • Úprava struktury programu

12.1.2015>>

  • Sem se zaseknul. Nejde mi rozchodit kompilátor VC++, který potřebuju kvůli podpoře knihoven DirectX. Kód se normálně zkompiluje, ale po chvíli se zaseknou Codeblocks. Vůbec nevim proč. Clion IDE nepodporuje VC++ zatim.

19.1.2015>>

  • Předělal jsem to tak, že to funguje s mingw.

26.1.2015>>

  • Vyřešil jsem problém s Code:blocks a nainstaloval nová TDM, takže můžu psát podle standardu c++14 a mít Code:blocks a používat DirectX. Taky jsem vylepšil strukturu programu. Plánuju teď dát konzoli do jednoho vlákna a renderování do jiného, abych mohl psát do konzole příkazy.

16.2.2015>>

  • Kompletně jsem přepsal třídu stromu. Instance stromů se nyní alokují dynamicky, o jejich paměť se stará template třída std::vector<>. Bylo potřeba připsat speciální členné funkce move ctor, move assign. Implementoval jsem dále Mersenne twister algoritmus pro generování náhodných čísel z knihovny boost boost::random::mt11213b. Nyní se již pseudonáhodná čísla neopakují.

Screenshoty, obrázky

Tento obrázek ukazuje graficky znázorněné normály každého vertexu modelu. Grafickou reprezentaci normál je možné zapnout v souboru globals.h odkomentováním definice konstanty ZOBRAZ_NORMALY. Normaly.png

Následující dvojice obrázků ukazuje rozdíl mezi Goraud a Flat technikou stínování.

Goraud.png Flat.png