Gå til innhold

Anbefalte innlegg

Hei

 

Jeg sitter og skriver en software renderer i C# (for morroskyld) og prøver å gjøre det så generisk som mulig.

Det jeg har gjort, er at jeg har et BufferObject som skal representere alt fra teksturer til modeller.

 

Det jeg trenger, er en måte å kunne skrive til et rendertarget uten å måtte tenke på hva slags data som ligger i bunnen. Derfor tenkte jeg å legge til et interface, som het ISupportsVector som rett og slett legger til muligheten til å konvertere til og fra Vector4.

 

Men så er problemet at disse formatene er value types (som de må være)

 

Så jeg kan ikke gjøre slik:

((ISupportVector)data[index]).FromVector(new Vector4(1, 2, 3))

ettersom verdien forsvinner umiddelbart.

 

Halp?

 

edit: data er generisk av datatype, og skal ikke nødvendigvis implementere ISupportVector ettersom denne funksjonen skal kun brukes i Texture klassen.

Endret av GeirGrusom
Lenke til kommentar
Videoannonse
Annonse

Fikk laget en slags løsning:

 

public void SetValue<T>(int index, Vector4 vec)
where T : struct, ISupportsVector
{
var b = buffer as BufferObject<T>;
b.data[index].FromVector4(vec);
}
public Vector4 GetValue<T>(int index)
where T : struct, ISupportsVector
{
return (buffer as BufferObject<T>).data[index].ToVector4();
}

 

Men det hadde vært fint om en ikke trengte å vite den underliggende datatypen.

Lenke til kommentar

Value types som muterer seg selv har en tendens til å skape sånne problemstillinger.

 

Funskjonell approach funker kanskje bedre? La FromVector returnere resultatet og tilordne det. (hvis jeg har forstått det du prøver på riktig)

data[index] = ((ISupportVector)data[index]).FromVector(new Vector4(1, 2, 3))

public ISupportVector FromVector(ISupportVector this supportVector, Vector4 vector) {
   ...
   return supportVector;
}

Lenke til kommentar

Ah glem det. Ordnet det på en litt annen måte. Ettersom kun teksturer skal kunne gjøre dette, laget jeg det slik at at Texture er definert slik:

 

public class Texture<T> : BufferObject<T>
 where T : struct, ISupportsVector

sammen med et interface:

public interface ITexture
{
 Vector4 GetValue(params int[] dimensions);
 void SetValue(Vector4 value, params int[] dimensions);
}

Da funker det fint, ettersom <T> blir abstrahert vekk av interfacet.

Lenke til kommentar

Hmmm har litt vanskeligheter med å få dette til å funke skikkelig med generics...

Idéen er nå at en skal skrive en shader for prosessering av vertexbuffer, men jeg kan ikke tenke på noen måte å gjøre det uten boxing.

Idéen er at en skriver mer eller mindre hele rendering pipen: input skal være vertex av generisk datatype, output skal være en vector4 (farge) men selve programmet må kunne interpolere mellom verdiene i vertex formatet...uten reflection...og uten boxing hvis det lar seg gjøre.

Jeg skal jo allerede kompilere kode, så kan jo finne på noe der kanskje... men fortsatt vanskelig :S

Lenke til kommentar

Ser ut som problemene dine kommer av at du prøver å anvende prinsipper fra OO design med datatyper som ikke er objekter. Value types er glimrende for immuterbare data. Som muterbare variable oppfører dem seg dårlig. Value type som property, value type i readonly variabel, cast av value type osv... alle oppfører seg motsatt av det et OO design forutsetter. Som du har oppdaget skaper det fort problemer når man prøver å legge abstraksjoner på toppen.

 

Jeg ville skrevet om i litt mer funksjonell stil. La metodene returnere verdien av det det dem beregner, og eksplisitt tilordne det dit det skal. Eller bruk objekter om du vil ha et objektorientert design.

Lenke til kommentar

Problemene kommer nok av at jeg prøver å bruke generics på en måte det ikke er beregnet for (nemlig kalkulasjoner)

Så derfor ser det ut til at jeg må bygge en slags template compiler for å få dette til, men fortsatt er det mye "Hømm hømm hømm" som må betenkes.

 

Alle problemene hadde forsvunnet hvis jeg fjernet generics, men det har jeg ikke tenkt til å gjøre.

 

Men takk for innspillet. Jeg kan jo alltids se om denne delen er enklere å implementere i F#, men jeg tror ikke det.

Endret av GeirGrusom
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...