Toon posts:

[alg] OpenGL klasse koppelen aan algemene "device" klasse

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hoi,

Sinds enkele dagen geleden ben ik begonnen met het herprogrammeren van m'n 3d engine (die nog niet af was). Hierbij ga ik meer OO te werk om later die engine ook voor andere toepassingen te gebruiken.
Wat ik doe is een pointer naar abstracte basisklasse "device" aanmaken waaraan ik dan een windowsDevice, linuxDevice of pocketpcDevice bijvoorbeeld aankoppel. Aan elk device is onder andere ook een 3d renderer gekoppeld, bijvoorbeeld een opengl of directx video klasse, die gemaakt is van de abstracte basisklasse "video" of iets dergelijks. Nu is mijn vraag: opengl is op zich OS-onafhankelijk (in mijn geval device-onafhankelijk), maar het initialiseren van opengl en soortgelijke libraries hangt natuurlijk af van het device, omdat het oftewel moet gekoppeld worden aan een windows venster of bvb een linux venster. hoe splits ik dat het beste op?
maak ik een klasse openglWindows en een klasse openglLinux of iets dergelijks? of maak ik best een aparte klasse die bijvoorbeeld een brug vormt tussen het device en de video render?

dus bvb:

deviceWindows <> videoBridgeWindows <> openglUniverseel
*2 *2 *1

deviceLinux<> videoBridgeLinux <> openglUniverseel
*2 *2 *1

of eerder dit:

deviceWindows <> openglWindows
*2 *2

deviceLinux <> openglLinux
*2 *2

*2 is OS afhankelijk
*1 is OS onafhankelijk


Dus hoe koppel ik het best opengl aan mijn universele "device" klasse? Ik vermoed dat ik best voor elk specifieke "device" (bvb windowsDevice) een soort brug-klasse maak naar opengl én bvb directx?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:02

.oisyn

Moderator Devschuur®

Demotivational Speaker

Als je wilt weten hoe je iets wilt opsplitsen moet je imho de vraag stellen: wat is er verschillend, en wat blijft er gelijk.

Alle dingen die gelijk blijven, hou je in een universele klasse, en de elementen die platformspecifiek zijn stop je, per platform, in een aparte klasse.

Als ik je opengl voorbeeld neem, dan is het enige wat verschilt de initialisatie en destructie van de OpenGL interface. Je moet imho dus niet zelf een new OpenGL () doen, maar iets als een new LinuxWindow (), waar je vervolgens een methode createOpenGL () op aanroept oid. Deze retourneert dan een OpenGL interface die zich al in een geinitialiseerde staat bevindt.

Of anders, je doet wel een new OpenGL (), maar dan met als parameter een initialiser interface die opengl voor de OpenGL klasse initialiseert.

[ Voor 12% gewijzigd door .oisyn op 10-11-2003 15:58 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Das een heel goed idee! Hartelijk bedankt! _/-\o_

Gisteren viel m'n eurocent, kbesefte dat sommige stukken lineaire programmacode bij een totaal van 20.000 regels nogal onduidelijk zijn. Nouja, 't is niet echt onduidelijk, want ik ken het als m'n achtertuin, maar als ik een klein stukje code wil aanpassen moet ik soms hele structuren daardoor aanpassen.
Het grootste nadeel is dan nog dat ik m'n hele engine zou moeten herschrijven als ik naar linux wil of enkel het 2d gedeelte van de engine wil gebruiken.
'k Had wel al vaker klassen gebruikt, maar nog nooit abstracte basisklassen (terwijl ik wel wist wat ze waren en hoe ze werkten). Soms denk ik nog semi-lineair... waarschijlijk is dat door die gwbasic roots ofzo :p maar daar komt verandering in ;) Nogmaals bedankt :)

Verwijderd

Topicstarter
offtopic:
Aaaaah zalig dat coden :)
Ik kwam daarnet tot besef dat m'n 2d en 3d vector klasse eigenlijk ook wel met integers zouden moeten kunnen werken, evenals met floats of long integers ...
Dus maakte ik een template voor de vector klasse en deed ik iets zoals:

C++:
1
#define CVector3Dfloat CVector3Dabstract<float>

offtopic:
Volgens mij heeft .oisyn m'n abstract denken getriggered :D

Wiiiiiiiiiii
*springt huppelend in het rond als een klein kind* (just kidding ;))

[ Voor 12% gewijzigd door Verwijderd op 10-11-2003 23:54 . Reden: code tag vergeten ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:02

.oisyn

Moderator Devschuur®

Demotivational Speaker

C++:
1
#define CVector3Dfloat CVector3Dabstract<float>


gebruik daar alsjeblieft typedefs voor, anders krijg je in de kortste keren compile errors
verklaar jij maar eens waarom dit niet compilet met jouw code
C++:
1
2
#define CVector3Dfloat CVector3Dabstract<float>
std::vector<CVector3Dfloat> vertices;


;)
Bovendien zijn typedefs namespace-safe, defines niet

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
'k Heb met wat google'n de syntax opgezocht van typedef, want khad het nog nooit toegepast (enkel het woord zei me wat *schaam*). Ik vind het super om bij te leren :D thanks!
Pagina: 1