OO framework, Egg util library László Szécsi

Slides:



Advertisements
Hasonló előadás
GraphGame gg001-Triangle
Advertisements

Mesh betöltés, kirajzolás Szécsi László. dx11-ben nincs – játékfejlesztők írnak maguknak úgyis DXUT-ban van – CDXUTSDKMesh – csak sdkmesh formátumot tud.
Effect framework, HLSL shader László Szécsi. forráskódban elérhető egyszerűsíti a shaderek fordítását, rajzolási állapot beállítását – pass: egy ilyen.
OO framework, Egg util library László Szécsi. Projektek nem osztoznak semmilyen kódon – DXUT mindegyikben – effect betöltés, mesh betöltés, GUI mindegyikbe.
Grafiku rendszerek 09 Model. public class CModel:CObject { Model _model;// modellünk neve Effect _effect;// az effect file a megjelenítéshez string _asset;//
Devosa Iván Szegedi Tudományegyetem C#. A C# A C# (kiejtése: szí-shárp, esetenként cisz) a Microsoft által a.NET keretrendszer részeként kifejlesztett.
Bevezetés a C# nyelvbe Az alapok összefoglalása Farkas Csaba.
ELTINGA és MTA KRTK KTI Horváth Áron április 7. Lakásárak, támogatások és energiahatékonyság.
1 Az önértékelés mint projekt 6. előadás 1 2 Az előadás tartalmi elemei  A projekt fogalma  A projektek elemei  A projekt szervezete  Projektfázisok.
avagy a háromszög technika
Neumann János Informatikai Kar
ERASMUS+ DISSZEMINÁCIÓS PLATFORM
LEHET JOBB A GYEREKEKNEK!
Programstruktúrák.
Microsoft Office Publisher
Java kódolási konvenciók
Scilab programozás alapjai
A közigazgatással foglalkozó tudományok
Alkalmazásfejlesztés gyakorlat
Az iskolai könyvtár szolgáltatás típusai
Programozás III. Gyakorlás.
A C++ programozási nyelv
PHP - függvények.
A KINOVEA mozgáselemző rendszer használata
C# SZINTAKTIKÁJA Az egyes utasítások végén pontosvessző áll
Lexikális elemző: lex (flex)
Dependency Injection Moq Feladat
Visual Studio Code Metrics
Animációk.
Adatbázis-kezelés (PL/SQL)
gg004-Mesh project copy-paste-rename gg002-App folder
☺ Programozási környezetek Validátorok Fazekas Judit PTI 2010.
VB ADATTÍPUSOK.
Kamera, 3D, transzformációk Szécsi László
Rendszerfejlesztés gyakorlat
Számítógépes Hálózatok
OpenGL kiterjesztések (extensions)
Az Endnote bibliográfia adatbázis-kezelő szoftver alapvető használata november Skultéti Attila
Multiplikációs rendezvény – Békéscsaba
STRUKTURÁLT SERVEZETEK: funkció, teljesítmény és megbízhatóság
Tilk Bence Konzulens: Dr. Horváth Gábor
Széchenyi István Egyetem
Vonalkódok Kajdocsi László Informatika tanszék A602 iroda
Informatikai gyakorlatok 11. évfolyam
Programozás I. 4. gyakorlat.
Tevékenységünk Célunk P92rdi Kft - p92rdi.hu Kutatás (Research)
Informatikai gyakorlatok 11. évfolyam
B M Java Programozás 4. Gy: Java GUI IT A N Tipper, MVC kalkulátor
Oracle Adatbázisok kezelése c#-ban
A Microsoft SharePoint testreszabása Online webhely
Az iskolai szervezet és fejlesztése
A távoli asztal, valamint az Endnote használata a távoli asztalon
2. A KVANTUMMECHANIKA AXIÓMÁI
B M Java Programozás 9. Gy: Java alapok IT A N Adatkezelő 5.rész
Environment mapping Szécsi László
Szálszinkronizáció.
A szállítási probléma.
Dr. Varga Beatrix egyetemi docens
Matematika 11.évf. 1-2.alkalom
B M Java Programozás 2. Gy: Java alapok IT A N Adatszerkezetek
Erasmus+ hallgatói mobilitásra jelentkezéshez
SQL jogosultság-kezelés
Szöveges adatok tárolása
JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam
Erasmus+ hallgatói mobilitásra jelentkezéshez
Kód tördelése és a megjelenés
Hagyományos megjelenítés
VÁLTOZÓ EURÓPA (Nemzet)Biztonsági szemmel
Bevezetés a mély tanulásba
Az objektum orientált programozás alapjai
Előadás másolata:

OO framework, Egg util library László Szécsi GraphGame ggl002-Egg OO framework, Egg util library László Szécsi

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

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

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

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)

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

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

Egg project letöltése

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

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

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); }; }

toString, fromString atoi, itoa, printf, scanf C megoldás, nem C++ C++ megoldás: stringstream wide char verzió toWString fromWString

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);

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"

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"

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){ ... }

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\

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

#10.0 SystemEnvironment.h std::string resolveMediaPath(std::string filename); std::string resolveShaderPath(std::string filename);

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

App alaposztály Plusz még egy loadShaderCode metódus render animate processMessage Plusz még egy loadShaderCode metódus

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)

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

Munkakönyvtár, parancssori paraméterek working dir: $(SolutionDir) Project Properties/Configuration Properties/Debugging/Command Arguments --solutionPath:"$(SolutionDir)" --projectPath:"$(ProjectDir)" --projectShaderPath:"$(OutDir)Shaders"

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

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

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

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"

Game tagváltozók ami eddig globális volt, abból tagváltozó lesz ComPtr<ID3D11Buffer> vertexBuffer; ComPtr<ID3D11InputLayout> inputLayout;

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

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

Shader betöltés nem kell string nem kell fordítani csak betölteni a lefordított kódot

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

main.cpp – loop előtt app = Egg::App::create(device); app->createResources(); app->setSwapChain(swapChain); app->createSwapChainResources();

main.cpp – loop után app->releaseSwapChainResources(); app->releaseResources();

main.cpp - loopban app->render(context);

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

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

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

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

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