Előadást letölteni
Az előadás letöltése folymat van. Kérjük, várjon
1
OO framework, Egg util library László Szécsi
GraphGame ggl002-Egg OO framework, Egg util library László Szécsi
2
Mi a baj azzal ahogy eddig csináltuk?
Projektek nem osztoznak semmilyen kódon shader betöltés, mesh betöltés, GUI mindegyikbe ugyanúgy kell majd Megoldás: csináljunk egy lib-et amibe ezeket tesszük
3
Mi a baj azzal ahogy eddig csináltuk?
Globális függvények, globális változók nem OO nem túl áttekinthető Megoldás: hozzunk létre egy App osztályt aminek a metódusait hívjuk a globális függvényekből App alaposztály: ami mindig kell (pl. shader betöltés) Ebből lehet származtatni olyat ami többet tud
4
Mi a baj azzal ahogy eddig csináltuk?
Erőforrások kezelése working directory : solution folder ez jó ha a közös Shaders vagy media folderből kell valami de mi van ha a projectnek vannak privát effektjei? Megoldás lehessen az elérési utakat parancssori argumentumként megadni
5
Feladatok Egg (Engine for GraphGame) lib létrehozása
Parancssorfeldolgozó osztály: SystemEnvironment globális eseménykezelők helyett App osztály shader file betöltő metódus (App::loadShaderCode)
6
String reprezentáció char* – 8 bites karakterek, unsafe
wchar_t* – 16 bites karakterek, unsafe std::string – 8 bites, safe std::wstring – 16 bites, safe a kódolás nem specifikált, de nálunk std::string – UTF8 kódolás - ANSI std::wstring – UTF16 kódolás - Unicode
7
Unicode API D3DX11CompileFromFile A mi kódunk mindenhol chart használ
D3DX11CompileFromFileA – char* paraméterek D3DX11CompileFromFileW – wchar_t* paraméterek A mi kódunk mindenhol chart használ Lua is azt fog Kivéve ahol ezt ‘elfelejtették’ itt konvertálnunk kell UTF8 UFT16
8
Egg project letöltése
9
Egg hozzáadása a GraphGame-hez
Egg/Properties/Configuration properties/General Configuration type: Static library (.lib) Egg/Properties/Configuration properties/output, intermediate dir: másoljuk ki valamelyik meglevő projectből
10
Unicode kezelés convertutf.h, .c – hivatalos Unicode konvertáló
UtfConversion.h, .cpp – std stringeket használó wrapper a fentihez a .c fileon jobb klikk/properties/C/C++/Precompiled headers/Precompiled header = not using precompiled headers
11
UtfConverter.h #10.0 namespace Egg{ class UtfConverter { public:
static std::wstring utf8to16( const std::string& utf8string); static std::string utf16to8( const std::wstring& widestring); }; }
12
toString, fromString atoi, itoa, printf, scanf C megoldás, nem C++
C++ megoldás: stringstream wide char verzió toWString fromWString
13
stdConversions.h #10.0 template<class T>
inline std::string toString( const T& t ) { std::ostringstream ss; ss << t; return ss.str(); } //std::string s = toString<int>(3);
14
Parancssori paraméterek
C-ben: const char** ebből kiszedni hogy milyen kapcsolók, paraméterek voltak az nehéz pakoljuk be őket egy ilyenbe std::map<std::string, std::vector<std::string> > paraméter neve értékek listája valami.exe --parambool:on --paramint:3 --parampath:"D:\akarmi";"D:\masik"
15
Solution és Project dir parancssori paraméterként
Ha áthelyezzük a projectet akkor is működik A lib persze nem exe, de a libet használó futtatható alkalmazásnál majd a futtatáshoz a parancssort megadhatjuk így: Project Properties/Configuration Properties/Debugging/Command Arguments --solutionPath:"$(SolutionDir)" --projectPath:"$(ProjectDir)" --projectShaderPath:"$(OutDir)Shaders"
16
SystemEnvironment.cpp #10.0
std::string commandLine( GetCommandLineA() ); escaped_list_separator<char> sep("", " \t:,;", "\""); tokenizer< escaped_list_separator<char>, std::string::const_iterator, std::string > tokens(commandLine, sep); BOOST_FOREACH(std::string t, tokens){ ... }
17
Boost lib include A SystemEnvironment.cpp-ben a Boost-ot használjuk string tokenizálásra Project properties/Configuration/C/C++/General/Additional include directories C:\Program Files\boost\boost_1_52\
18
SystemEnvironment használata
Be akarunk tölteni egy modellt, textúrát tudjuk a file nevét, de a pontos elérési utat nem akarjuk a programba kódolni meg kell nézni a $(ProjectDir)/Media folderben, ha nincs ott akkor a $(SolutionDir)/Media folderben Be akarunk tölteni egy lefordított shadert meg kell nézni az $(OutDir)/Shaders folderben, ha nincs ott akkor a Egg $(OutDir)/Shaders folderben
19
#10.0 SystemEnvironment.h std::string resolveMediaPath(std::string filename); std::string resolveShaderPath(std::string filename);
20
App alaposztály Segédosztályok készen vannak, jöhet a lényeg
Ebből fogunk származtatni saját app osztályt egy globális példánya lesz main.cpp-ből ennek a metódusait hívják majd (ezeket fogjuk implementálni) createResources releaseResources createSwapChainResources releaseSwapChainResources
21
App alaposztály Plusz még egy loadShaderCode metódus render animate
processMessage Plusz még egy loadShaderCode metódus
22
Egg lib fordítható kész van, használhatjuk a jövőbeli projectjeinkben
de bővíthető, ide rakjuk majd mesh kezelés math, vector, matrix GUI entitások kezelése további engine funkciók ebből lesz majd a játékmotor (project a játék)
23
Gyártsunk egy ezt használó projectet! – gg002-App
g001-Triangle egész folder copy-paste átnevezni: gg002-App .vcxproj és .filters gg001-Triangle cserélése gg002-App –re solution/add existing project
24
Munkakönyvtár, parancssori paraméterek
working dir: $(SolutionDir) Project Properties/Configuration Properties/Debugging/Command Arguments --solutionPath:"$(SolutionDir)" --projectPath:"$(ProjectDir)" --projectShaderPath:"$(OutDir)Shaders"
25
gg002-App méretre szabása
main.cpp-n kívül minden kidobunk hiszen az Egg-ben bent van! main.cpp properties/C/C++/Precompiled headers/Precompiled header: Create
26
gg002-App függőségek properties/common/references/add new:App
additional include $(SolutionDir)/Projects/Egg;$(SolutionDir)/Projects/Egg/App set as startup project
27
Használjuk az Egg-et a projectben
kell egy Egg::App-ból származó osztály legyen a neve Game ;) ugyanazt fogja csinálni mint eddig, háromszöget rajzolni – de ha az Egg (lesz) az engine, akkor ez (lesz) a game… main.cpp-ben ennek egy példánya globális függvények ennek a metódusait hívják erőforráslétrehozó, rajzoló funkcionalitás az implementáló metódusokba
28
Game class gg002-App Egg::App not found in the project
add Class… C++ class Class name: Game Base class: Egg::App Egg::App not found in the project nem baj, az Egg libben van Game.h -ba: #include "App/App.h"
29
Game tagváltozók ami eddig globális volt, abból tagváltozó lesz
ComPtr<ID3D11Buffer> vertexBuffer; ComPtr<ID3D11InputLayout> inputLayout;
30
Implementálandó metódusok
konstruktor createResources ami eddig a a loop előtt volt releaseResources veszítsük el a pointereket render ami eddig a loopban volt
31
Megjegyzések nem kell, hogy virtuálisak legyenek
Game.cpp-ben érdemes implementálni konstruktorparamétert az Egg::App ősosztálynak továbbadni ha HRESULT a visszatérési típus, akkor S_OK-t visszaadni
32
Shader betöltés nem kell string nem kell fordítani
csak betölteni a lefordított kódot
33
main.cpp #include "Game.h" Egg::AppP app; ez a globális app példányunk
azért nem GameP, hogy könnyen cserélhető legyen a pointer mögött a konkrét megvalósítás
34
main.cpp – loop előtt app = Egg::App::create(device);
app->createResources(); app->setSwapChain(swapChain); app->createSwapChainResources();
35
main.cpp – loop után app->releaseSwapChainResources();
app->releaseResources();
36
main.cpp - loopban app->render(context);
37
Kész ugyanazt tudja, mint a múltkori, de
van Egg, amibe a közös dolgokat tehetjük konkrétan mit rajzoljunk, milyen erőforrásokkal, milyen shaderrel, az a Game osztályban van
38
Shaderek fordítása Visual Studioval
gg002-App Properties/HLSL Properties/All Options Entrypoint name: %(Filename) Object file name: $(OutDir)%(RelativeDir)%(Filename).cso Shader model: Shader Model 5
39
Hlsl fileok hozzáadás gg002-App/Shaders Add: New item...
browse: a Shaders folderbe HLSL/Vertex Shader file file name: vsIdle.hlsl ebbe kerül a vertex shader kód pixel shader ugyanígy fordítsuk le, keletkező .cso fileokat ellenőrizzük
41
Game.cpp cso betöltés ComPtr<ID3DBlob> vertexShaderByteCode = loadShaderCode("vsIdle.cso"); Egg::ThrowOnFail("Failed to create vertex shader.", __FILE__, __LINE__) ^ device->CreateVertexShader( vertexShaderByteCode-> GetBufferPointer(), vertexShaderByteCode->GetBufferSize(), NULL, vertexShader.GetAddressOf()); //pixel shader ugyanígy
42
Eredmény sima háromszög továbbra is de már a Game-ben van a logika
HLSL kódokat Visual Studio fordítja nézegessük: debug/graphics/start diagnostics
Hasonló előadás
© 2024 SlidePlayer.hu Inc.
All rights reserved.