Megjelenítő-motor, színtér- menedzsment Szécsi László
Mesh::Multi – többanyagos, több üzemmódos háromszögháló – Mesh::Flip gyűjtemény Mesh::Flip – több üzemmódos háromszögháló – párok gyűjteménye Mesh::Mien – üzemmód-azonosító: pl: basic, deferred, shadowMap üzemmódok lehetnek
a következő diákon Mesh::Indexed, Mesh::Material, Mesh::Shaded létrehozása, ez nem újdonság A Material nem csak egy pass beállításáról szól: effect változó beállítások is lehetnek – ezek az apply meghívásakor állítódnak be Flip és Multi létrehozása, egyelőre egy üzemmód van a Flipben, és egy Flip a Multiban
Egg::Mesh::Indexed::P indexedMesh = loadIndexedMesh("giraffe.obj"); ID3DX11EffectPass* envmappedPass = effect ->GetTechniqueByName("envmapped") ->GetPassByName("envmapped"); Egg::Mesh::Material::P envmappedGiraffeMaterial = Egg::Mesh::Material::create(envmap pedPass, 0);
envmappedGiraffeMaterial->set( effect ->GetVariableByName("kdTexture")) ->AsShaderResource() ->SetResource( loadSrv("giraffe.jpg") ); envmappedGiraffeMaterial->set( effect ->GetVariableByName("envTexture")) ->AsShaderResource() ->SetResource( loadSrv("cloudyNoon.dds") );
Egg::Mesh::Shaded::P shadedMesh = binder->bindMaterial( envmappedGiraffeMaterial, indexedMesh);
Egg::Mesh::Mien basicMien; Egg::Mesh::Flip::P giraffeFlipMesh = Egg::Mesh::Flip::create(); giraffeFlipMesh->add( basicMien, shadedMesh);
Egg::Mesh::Multi::P giraffeMultiMesh = Egg::Mesh::Multi::create(); giraffeMultiMesh->add( giraffeFlipMesh);
a giraffeMultiMesh rajzolása pont ugyanazt eredményezi, mint a shadedMesh rajzolása de lehetne több üzemmódot és több, eltérő módon rajzolt geometriát hozzáadni összetettebb modellre is jó lesz AssImp: többanyagos mesh-t több meshként importál – minden meshből csinálunk egy Flip-et, a flipeket berakjuk a multiba
Directory – map ManagerApp : public SasApp – erőforrás és színtérkezelés – egy csomó Directory adattag – Directory entities; - ez a színtérreprezentációnk Entity alaposztály, StaticEntity implementáló Paraméter-struktúrák
map > typedef helyett privát öröklés, de az eredmény kábé ugyanaz DxResourceDirectory – D3Ds COM objektumok tárolására – sima pointerek, nem shared – van releaseAll függvény
Senki sem tiltja, hogy ugyanaz az objektum több néven is szerepeljen – shared pointer miatt a felszabadítás is jó lesz Nem muszáj mindenkinek szerepelni a saját típusának a tárolójában – pl. Mesh::Indexed élhet úgy is, hogy nincs neve, de egy Mesh::Multi-ban valahol hivatkozva van Ugyanazon a néven különböző típusok külön tárolókban lehetnek (giraffe indexed, multi)
tárolók – erőforrások: olyasmiket tárolhatunk név szerint, amiket egyszer szeretnénk létrehozni aztán többször felhasználni shaderResourceViews – fileból betöltött textúrák indexedMeshes – fileból betöltött geometriák materials – effect pass + beállítások multiMeshes – kézzel…. lehetne fileból is? – színtérelemek entitások, kamerák
MienDirectory miens; – ez egy sima értékeket tartalmazó map, semmi shared pointer – ebben vannak az üzemmódjaink azonosítói – getMien(string mienName) metódus ha van már ilyen nevű, azt adja vissza ha nincs, csinál egy újat, és letárolja – pl. getMien("basic") inicializáláskor – futásidőben nincs string
loadSrv(string filename, string alias) – megkeresi a filet a media könyvtárakban – megnézi, bent van-e a directoryban már ha igen, visszadja azt – betölti a fileból a textúrát D3DX11CreateShaderResourceViewFromFile – eltárolja a directoryban (path, alias neveken) – visszaadja loadIndexedMesh – ugyanez csak AssImppal tölt be egy mesht
modellfileban több submesh, anyaginfó AssImp ebből több aiMesh-t, aiMaterial-t gyárt ezek alapján már tudunk Mesh::Material-t, Mesh::Shaded-et gyártani – ha tudjuk, milyen shaderekkel (effect pass-szal) akarjuk rajzolni, és ott melyik textúrát, ill. anyagjellemzőt hogy kell bekötni – mindezt tudjuk minden üzemmódra – de ezt nem szeretnénk kőbe vésni!
ha már van ilyen a tárolóban, adjuk vissza azt ha nincs, betöltés AssImppal hozzunk létre egy Mesh::Multi-t minden aiMeshre – indexed létrehozása, tárolás alias[i] néven – hozzunk létre egy Mesh::Flipet – pakoljunk bele Mesh::Shaded-eket, ahány üzemmódot akarunk támogatni – adjuk hozzá a Flipet a Multihoz adjuk vissza a Multit
virtuális – később változtathatjuk, hogy milyen üzemmódok, azokhoz milyen shaderek legyenek alapimplementáció: minden Flipben – 1 üzemmód: basic – textured/textured effect pass – kdTexture beállítása az anyag diffúz textúrája alapján
kamerák gyűjteménye
currentCamera – iterátor – mindig, amikor új kamerát rakunk a tárolóba, frissíteni kell az iterátort processMessage – ‘B’ lenyomására váltsunk kamerát
ManagerApp::render és ManagerApp::animate végighívja az elemeit render metódus paraméterei a RenderParameters struktúrában – fix elemek a ManagerApp::createResources-ban beállítva – változó elemek a render-ben
van hozzá egy Mesh::Multi – ez a “render komponens”, ez tudja mit kell rajzolni render metódus – transzformációk beállítása – multimesh rajzolása transzformációk lekérdezésére tisztán virtuális metódusok (leszármazott osztálytól függ) – lehet fixen adott [StaticEntity] – fizikai szimulációból [PhysicsEntity]
modelMatrix tagváltozó translate, rotate-tel állítgatható összes függvény ez alapján adja vissza a az eredményt
hozzunk létre egy új projectet amiben a Game osztály az Egg::Scene::ManagerApp-ból származik minden eseménykezelő csak hívja az ős hasonló metódusát createResources-ben építsünk színteret entitásokból
copy-paste-rename gg011-Particles folder vcxproj, filters átnevezés solution/add existing project rename project working dir: $(SolutionDir) Project Properties/Configuration Properties/Debugging/Command Arguments --solutionPath:"$(SolutionDir)" --projectPath:"$(ProjectDir)" build, run
kamera létrehozása berakni a kamera directoryba currentCamera = cameras.begin(); legyen több kamera és váltogassunk B-vel
zsiráf multimesh építése (lásd a diákat a diasor elején) zsiráf példányok (entitások) létrehozása – entities-be tegyük be őket legyen textúrázott és envmappelt zsiráf is – több anyag létrehozása – többféle multimesh létrehozása ugyanazzal a geometriával, más anyaggal – különböző entitások eltérő multimeshsel
égbolt multimesh építése mint a zsiráf, csak más material és indexedMesh – envTexture : cloudyNoon.dds Egg::Mesh::Indexed::P indexedQuad = Egg::Mesh::Indexed::createQuad(device);
geopod multimesh fileból (media/geopod.x) – loadMultiMesh több geopod entitás létrehozása
geopod entitás építése kódból 2 db submesh van, 2 db Flip-et kell hozzáadni – az első simán a fileból szedett multiMesh 0-s submesh-e – a másodikat rakjuk össze nulláról, mint a zsiráfét a másodikban envmapped materiallal – a kdTexture legyen white.png, nem a zsiráfpacák