Questa sera mi sono deciso ad iniziare il porting da C a C# di alcune funzioni per il caricamento dei file MD2, i modelli di Quake II per intenderci. Sulla rete c'è già un sacco di materiale, ma io sono masochista e voglio fare un loader per conto mio.
Generalmente tutti i loader si assomigliano e fanno largo uso di strutture contenenti array. Per essere veloci fanno volentieri a meno di object-orientation. Volendo fare un porting pedestre, e non preoccupandomi di questioni stilistiche, mi sono imbattuto nell'esigenza di dover tradurre una struttura C di questo tipo:
struct MD2_POLYGON
{
unsigned short vindex[3]; // vertex indices
unsigned short tindex[3]; // texture indices
};
cosa che in C# con .NET Framework 1.1 non è possibile scrivere.
Dopo aver cercato un po' in giro ho trovato questo post di Eric Gunnerson che spiega come risolvere il problema e quali sono le novità nel Framework 2.0 in tal senso.
Il post è un po' vecchio, ma non importa perché mi è stato di aiuto per capire alcune cose.
Il risultato sarebbe questo:
[StructLayout(LayoutKind.Explicit)]
internal struct Polygon
{
[FieldOffset(0)]
public UInt16 vertexIndex;
[FieldOffset(6)]
public UInt16 textureIndex;
[FieldOffset(12)]
private byte dummy;
};
Purtroppo come scrive Eric: "Because the underlying implementation is still using pointers and there's the possibility of going outside the allocated space, code generated using this feature requires using "unsafe", and therefore requires elevated privilege to execute."
Sicuramente questa osservazione non è una bella notizia e mi fa pensare che, dovendo/volendo fare un porting, sia meglio ripensare all'architettura ed al design già dai primi passi.
powered by IMHO 1.2
posted @ mercoledì 31 agosto 2005 02:36