Zwei meiner Klassen müssen vermutlich geändert werden: es geht um Texture und ShaderConstantBuffer. Beide haben gemeinsam, dass sie mit verschiedenen Eingabedaten umgehen müssen. Bei der Textur sind es die verschiedenen Texelformate und bei den Shaderkonstanten alle möglichen Arten von Skalar, Vektor, Matrix mit bool, int, float als Typ.
Jetzt dachte ich mir lass ich den Compiler die Arbeit machen und verpacke das ganze in Templates.
Am Beispiel der Textur: ich schreibe mir also eine Klasse für jedes Texelformat und eine Konvertierungsfunktion:
Code: Alles auswählen
enum TexelFormat {
R8, RGBA32, ..., RGBA128F, ... // insgesamt 34 verschiedene
};
template<TexelFormat FORMAT>
class Texel { /* ... */ };
template<TexelFormat DEST, TexelFormat SRC>
void Convert(const Texel<SRC>* _pSrc, Texel<DEST>* _pDest, ...)
{
for(int x ...)
_pDest[x] = (Texel<DEST>)(_pSrc[x]);
}
// Textur
class Texture {
void* m_pData;
TexelFormat m_Format;
/* ... */
template<TexelFormat SRC>
void Write(const Texel<SRC>* _pData, ...)
{
template_for<0, 34> // template for loop über alle möglichen Zielformate
if(template_x == m_Format)
Convert<SRC, template_x>(_pData, m_pData, ...);
}
}
Wie würdet ihr das handhaben? Muss beim Aufruf von Write/Read das Format/der Typ bekannt sein? Oder soll ich mir eine Convert-Funktion ohne Template schreiben (Performance?)
Vielen Dank fürs Durchlesen :)
mfg JFF_B.G.Michi