Lenyíló tartalom, klikk a címre...
A GenesX 3D Engine egy OpenGL 3-as vagy annál újabb API-ra épülő grafikus motor, amely elsősorban játékfejlesztés céljából biztosít 3D és 2D megjelenítést. Jelenleg a motor csak Windows platformon érhető el, de tervezzük a Linux, Mac, Android és iOS rendszerek támogatását is a jövőben. A GenesX Engine folyamatos fejlesztés alatt áll, és jelenleg a Delphi és FreePascal fejlesztői környezeteket támogatja, de célunk, hogy más programozási nyelvekből, például C++-ból is könnyen használható legyen.
A motor számos funkciót kínál, többek között beépített ütközésvizsgálatot, amelyhez hamarosan fizikai szimuláció is társul. Támogatja a 3D animációkat, teljes jelenetek kezelését (például anyagok, fények kezelését), valamint egyedi és hatalmas méretű domborzat létrehozását. Emellett lehetőséget biztosít grafikus felhasználói felületek megjelenítésére, és számos egyéb, a játékfejlesztéshez vagy éppen szerkesztőszoftverek készítéséhez nélkülözhetetlen funkciót tartalmaz.
A továbbiakban részletes áttekintést adok a motor képességeiről, a jelenlegi, 24.09.13 verzió alapján. Fontos megjegyezni, hogy a verziószámok dátumalapúak, ami lehetővé teszi a fejlesztések ütemének és aktualitásának nyomon követését.
Lenyíló tartalom, klikk a címre...
Miután a GenesX SDK tartalmát egy tetszőleges helyre elhelyeztük, és az IDE-ben beállítottuk az elérési utat az SDK-hoz, a programunk Uses szakaszában a következő egységeket kell felsorolni: GXHeader, GXTypes, GXInterfaces.
Ez az egység tartalmazza a motor legfontosabb inicializáló és kezelő eljárásait, amelyek segítségével a GenesX.dll betöltésre kerül a memóriába, valamint lehetővé teszi a GenesX Engine példányának létrehozását és megsemmisítését. Ezen kívül számos további eljárást és függvényt is tartalmaz, melyekre a későbbi szakaszokban térünk ki. (A GenesX.dll különálló kiadásban érhető el Delphi és FreePascal környezetek számára. A GenesXF.dll specifikusan a FreePascal, míg a GenesXD.dll a Delphi IDE-ben fejlesztők számára készült.)
Ez az egység összefoglalja a motor által használt összes típust, a legalapvetőbb adatformáktól kezdve az összetett struktúrákig, amelyek a motor használata során elengedhetetlenek.
A motor működése úgynevezett interface-ek segítségével valósul meg. Ezek az interfészek teszik lehetővé, hogy a motor összetevőit struktúrált és átlátható módon kezeljük és használjuk. Minden funkció és komponens ilyen interfészeken keresztül érhető el.
Miután az előbb említett egységeket felsoroltuk, a következő lépés a motor inicializálása és egy IGXEngineSDK nevű interface-en keresztül a motor példányának létrehozása. Az első lépés a motor betöltése a memóriába a GX_LoadEngine függvénnyel, ahol meg kell adnunk a GenesX.dll elérési útvonalát. Ha a betöltés sikeres, a függvény TRUE értékkel tér vissza.
// A motor betöltése a memóriába
if GX_LoadEngine ('saját elérési út\SDK\Bin\') then
// Motor betöltve
Ezt követően a motor inicializálásához a GX_InitEngine függvényt használjuk, amely egy TGXResult típust ad vissza. Ha az inicializálás sikeres volt, a visszatérési érték GX_OK lesz. A függvény több paramétert is vár, amelyek az alábbiak:
Felhasználónév: A GenesX nem nyílt forráskódú, így a teljes funkcionalitást csak a motor tulajdonosa érheti el. Más felhasználók számára bizonyos funkciók korlátozottak lehetnek.
Licensz kulcs: A tulajdonos motorpéldányához tartozó jelszó, amely biztosítja a hozzáférést a teljes funkcionalitáshoz.
Log fájl: Opcionálisan megadhatjuk, hogy készüljön-e log fájl az inicializálás folyamatáról.
Felhasználási mód: Azt is megadhatjuk, hogy szerkesztői módban kívánjuk-e futtatni a motort, amely a későbbiekben a vizuális komponensek használatára lesz hatással.
Egy alapértelmezett inicializálás, demó módban:
// A motor inicializálása
if GX_InitEngine = GX_OK then
// Sikeresen inicializálva
else
// Inicializálási hiba
Demó módban paraméterek nélkül is futtathatjuk a motort, ami korlátozott funkcionalitást biztosít a felhasználó számára.
Lenyíló tartalom, klikk a címre...
Ahhoz, hogy a motort használatba vehessük, szükséges létrehoznunk egy úgynevezett Engine SDK interfészt, amely lehetővé teszi az összes többi eszköz elérését. Ezt az IGXEngineSDK nevű interfész valósítja meg, amelyet a GXCreateEngineSDK segítségével hozhatunk létre. A létrehozott interfészt mint kimenő (out) paraméter kapjuk vissza. A függvény visszatérési értéke egy TGXResult típus, amely megfelelő működés esetén GX_OK értéket ad vissza, hiba esetén pedig a visszatérési érték neve jelzi a probléma jellegét. (Az EngineSDK változót, mint IGXEngineSDK típust kell deklarálnunk).
// az EngineSDK interfész létrehozása
if GXCreateEngineSDK (EngineSDK) = GX_OK then
// a program folytatása a létrehozott EngineSDK használatával
else
// Nem sikerült az interfész létrehozása
Lenyíló tartalom, klikk a címre...
A 3D megjelenítés alapvető feltétele, hogy rendelkezésünkre álljon egy olyan felület, amely lehetővé teszi a tartalom gyors és hatékony megjelenítését. A GenesX-ben ezt az alapfelületet Surface-nek nevezzük, ami tulajdonképpen egy operációs rendszer által kínált ablak. Ez a felület támogatja mind az ablakos, mind a teljesképernyős megjelenítést.
A GenesX 3D-ben ezt a felületet az IGXSurface interfész reprezentálja, amely az IGXWindow kontroll interfészből származik. A kontroll interfészekről és azok használatáról részletesen a későbbi szakaszokban lesz szó.
Az első Surface létrehozásához először meg kell határoznunk, milyen paraméterekkel, vagyis tulajdonságokkal szeretnénk ezt elkészíteni. A GenesX motor többféle módot kínál erre, és az EngineSDK interfész három metódusát használhatjuk a Surface létrehozásához.
A legegyszerűbb módja annak, hogy teljesképernyős felületet hozzunk létre, ha az EngineSDK interfész Display tulajdonságából lekérdezzük a DefaultMode értéket. Ez egy PGXDisplayMode típus, amely tartalmazza az aktuális rendszer képernyőbeállításait (pl. felbontás, színmélység, frissítési frekvencia).
// Alapvető megjelenítési mód lekérdezése
DisplayMode := EngineSDK.Display.DefaultMode;
// Surface létrehozása ennek a DisplayMode-nak megfelelően
EngineSDK.CreateSurface(Surface, DisplayMode);
Itt a visszatérési érték egy TGXResult típus, amely sikeres művelet esetén GX_OK eredményt ad vissza.
Lehetőségünk van az alapértelmezett beállításoktól eltérő módot választani. Ehhez használhatunk egy TGXSurfaceDescriptor típusú változót, amelyen keresztül részletesen megadhatjuk a kívánt képernyőmódot, például felbontást, színmélységet és egyéb paramétereket. Ennek részletezésére később kerül sor.
Egy harmadik megoldás, ha a CreateSurface metódus paramétereként adjuk át a kívánt tulajdonságokat. Így testreszabhatjuk a felületet közvetlenül a metódus hívása során.
A rendszer további két speciális tulajdonságot kínál a felület finomhangolására:
ZBuffer bitmélység, amely alapértelmezés szerint 32 bit,
Antialiasing mértéke, amely alapértelmezés szerint 0.
Ezekről a későbbiekben részletesen szó lesz.
Lenyíló tartalom, klikk a címre...
A motor futtatásának megkezdése előtt fontos eldönteni, hogy milyen üzemmódban kívánjuk működtetni a megjelenítést és a renderelést. Két üzemmód közül választhatunk, amelyeket az EngineSDK.ProcessMode tulajdonság segítségével állíthatunk be. Ezek a következők:
Ebben az üzemmódban a motor folyamatosan fut, és a megjelenítési folyamatok megszakítás nélkül hajtódnak végre. Ez azt jelenti, hogy a rendszer a lehető legnagyobb sebességgel frissíti a képernyőt, amely magas CPU- és GPU-terhelést eredményez, mivel minden egyes ciklusban újrarajzolja a képernyőt.
FPS (Frame per second): Az FPS értéke határozza meg, hogy hány képkockát jelenít meg másodpercenként. Ha nincs korlátozás, a motor a maximális sebességgel próbál dolgozni, ami több ezer képkocka renderelését is jelentheti másodpercenként.
Alkalmazási terület: Ezt az üzemmódot olyan esetekben érdemes használni, amikor a folyamatos, sima animáció és megjelenítés a cél, mint például játékoknál vagy más grafikai alkalmazásoknál.
Korlátozások:
RenderSync: Beállítható a frissítési sebesség korlátozása a RenderSync tulajdonság használatával. Ez lehetővé teszi, hogy ne a maximális sebességgel, hanem előre meghatározott FPS értékkel dolgozzon a motor, például 30, 60 vagy 100 FPS sebességgel.
VerticalSync (VSync): A VerticalSync bekapcsolásával a motor szinkronizálható a monitor frissítési frekvenciájával, elkerülve a képtörést és stabilabb megjelenítést biztosítva. Ez a beállítás a teljes renderelési folyamatot szinkronizálja a képernyő frissítési ciklusához.
Ebben az üzemmódban a motor csak akkor frissíti a képernyőt, ha erre vonatkozó utasítást kap. Az operációs rendszer által küldött eseményekre reagál, például egy ablak újrarajzolása vagy egy felhasználói interakció (pl. gombnyomás) esetén.
Erőforrás-kihasználás: Ez az üzemmód lényegesen kevesebb CPU- és GPU-erőforrást használ, mivel nem történik folyamatos frissítés, csak az események hatására történik meg az újrarajzolás.
Alkalmazási terület: Ideális olyan alkalmazások esetén, ahol nem szükséges folyamatos megjelenítés, például szöveges vagy adatkezelő alkalmazásoknál, ahol az események alapján történik az újrarajzolás.
Kézi vezérlés:
A felület frissítése manuálisan is vezérelhető, ha a Surface.Realize metódust hívjuk meg a szükséges pillanatban. Ez lehetővé teszi, hogy pontosan szabályozzuk, mikor történjen meg a képernyő tartalmának újrarajzolása.
A beállításokat követően nincs más dolgunk, mint elindítani a motort az EngineSDK.Execute metódus meghívásával. Ezzel a parancs végrehajtásával a motor elindítja a Surface felületek kezelését, és a rendszer folyamatosan fogadja majd az operációs rendszer által küldött üzeneteket.
A motor a beállított üzemmódtól függően:
Folyamatos üzenetfeldolgozás esetén állandóan frissíti a képernyőt a lehető leggyorsabb tempóban.
Üzenetre várakozó mód esetén csak akkor rajzol újra, amikor egy esemény vagy a rendszer által küldött üzenet megérkezik.
Az Execute metódus elindítása után a motor automatikusan kezeli a megjelenítést és az események feldolgozását. Az események (például felhasználói interakciók, ablak átméretezése stb.) hatására a felületek frissülnek, és az előzőleg konfigurált paraméterek szerint működnek.
A felhasználói beavatkozásokat, például gombnyomásokat, egérmozgásokat vagy más interakciókat az engine feldolgozza, és ennek megfelelően meghívja az előre beállított eseménykezelőket, biztosítva a kívánt működést és vizuális megjelenítést.
Lenyíló tartalom, klikk a címre...
A GenesX 3D engine nem csupán 3D modellek és jelenetek kezelésére terjed ki, hanem gazdag támogatást nyújt 2D felhasználói felületek és egyéb grafikai elemek megvalósítására és megjelenítésére is. Az eszköz hierarchiája és felépítése az alábbiak szerint alakult ki:
A 2D grafikai megjelenítést két alapvető csoport képezi, amelyek az alábbi funkciókat látják el:
IGXControl: Az IGXControl az alapvető vezérlő komponens, amelyet az összes többi vezérlő, például az IGXButton, IGXWindow és IGXSurface is örököl. Ez a felület biztosítja az alapvető vezérlőelemek működését és megjelenítését.
IGXTexture: Az IGXTexture interfész a 2D grafikák kezelésére és tárolására szolgál, beleértve a GUI elemeket és a jelenetben résztvevő modellek textúráit. A textúra egy speciális képformátum, amelyet a videokártya használ a megjelenítés során. A GenesX több képformátumot is támogat, például BMP, JPG, PNG és a DDS, amely a legjobban ajánlott formátum a textúrák számára. A DDS (DirectDraw Surface) formátum támogatása különösen fontos a textúrák hatékony kezelésében, amelyet részletesebben a textúrák kezelésével foglalkozó fejezetben tárgyalunk.
Az IGXLayer egy olyan interfész, amely lehetővé teszi bármilyen más kontrollon belüli elhelyezést és megjelenítést. A Canvas tulajdonságban használható, amely szintén egy IGXLayer interfészt jelent. Az IGXLayer 32 bites bitmap adatokat tárol, amelyek nem tömörített formátumot jelentenek, ellentétben a DDS formátumú textúrákkal. Ennek következtében az IGXLayer használata gyorsabb lehet a tartalom létrehozásakor, de a megjelenítés sebessége a DDS textúrákhoz képest lassabb lehet. Az IGXLayer-ek a 3D megjelenítés során felület textúráként is alkalmazhatók, lehetővé téve dinamikusan változó tartalom, akár video megjelenítését is egy 3D objektum felületén.
Az IGXControl egy általános vezérlő interfész, amely az összes további vezérlő alapját képezi. Az előre elkészített vezérlők mellett saját vezérlők létrehozására is lehetőség van. Ezek a saját vezérlők rajzolási eseményeiben és egyéb eseménykezelőiben testreszabhatók, meghatározva a kontroll viselkedését és megjelenését. Az IGXControl lehetővé teszi a felhasználói felület és az alkalmazások számára testreszabott, egyedi vezérlők létrehozását.
Lenyíló tartalom, klikk a címre...
A háromdimenziós megjelenítés alapját egy IGXScene névre keresztelt csatoló felület végzi. Ennek az interfésznek a feladata a 3D jelenet renderelése, az objektumok nyilvántartása és kezelése. Számos olyan tulajdonsággal rendelkezik, amelyek meghatározzák a látványt, vagy éppen a szerkesztésben nyújtanak segítséget. De ezen a csatolón keresztül érhető el és használható számos más a 3D térhez és az abban megjelenített dolgokhoz kapcsolódó egyéb kiegészítő, mint például a fizika szimuláció, a Skybox, a domborzat vagy éppen a részecskerendszer. Jelen dokumentum ezek közül részletesen foglalkozik a későbbiekben mindegyikükkel.