Strukturen als Pointer an Funktionen übergeben

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

LukasBanana

Betreff: Strukturen als Pointer an Funktionen übergeben

BeitragDo, Sep 02, 2010 10:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,
kann mir bitte jemand ein kleines Beispiel zeigen, wei man Strukturen (bzw. Type Fields) in Form eines Pointers an eine Funktion übergeben kann.
Ich brauche das für meinen SPE Wrapper damit in Zunkunft nicht nur Direct3D9 sondern auch Direct3D11 genutzt werden kann.
In dem Shader Model 4 und 5 können Konstanten nämlich nur noch in einer ganzen Struktur an die GPU übertragen werden.
So stelle ich mir das vor:
Code: [AUSKLAPPEN]

Type Matrix4x4
    Field m0n0#, m0n1#, m0n2#, m0n3#
    Field m1n0#, m1n1#, m1n2#, m1n3#
    Field m2n0#, m2n1#, m2n2#, m2n3#
    Field m3n0#, m3n1#, m3n2#, m3n3#
End Type

Type Vec4
    Field X#, Y#, Z#, W#
End Type

Type MainConstantBuffer
    Field WorldViewProjectionMatrix.Matrix4x4
    Field LightDirection.Vec4
    Field DiffuseColor.Vec4
End Type

; SetShaderBuffer ist eine Funktion aus meinem Wrapper
; In PureBasic kann man mit @ den Pointer erhalten. Wie geht es in Blitz3D (bzw. BlitzBasic allgemein)?
SetShaderBuffer(VertexShader, "MainBuffer", @MainConstantBuffer)

Danke schon mal im Voraus Smile
Mein YouTube Channel: http://www.youtube.com/user/SoftPixel
Mein Twitter Profil: https://twitter.com/LukasBanana
Meine Projekte auf github.com: https://github.com/LukasBanana
Meine Projekte auf bitbucket.org: https://bitbucket.org/LukasBanana

Ana

BeitragDo, Sep 02, 2010 12:28
Antworten mit Zitat
Benutzer-Profile anzeigen
ich bin mir nicht sicher ob ich versteh was du da machst aber wenn du einen Typepointer übergeben möchtest machst du das wie folgt

BlitzBasic: [AUSKLAPPEN]

Function Gib_mir_nen_Type(m.matrix4x4)


und wenn du ihn zurückgeben will kannst du das mit
BlitzBasic: [AUSKLAPPEN]
Function geb_dir_nen_type.matrix4x4(x)
m.matrix4x4 = New matrix4x4
[...]
Return m


Damit kannst du ja in der Funktion auf die Felder zugreifen, ob du einen Pointer auf ein spezielles Feld machen kannst weiß ich nicht, aber damit müsste man doch alles nötige bauen können?

LukasBanana

BeitragDo, Sep 02, 2010 14:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie das in B3D geht weiß ich, aber ich habe ja eine Wrapper Funktion. Also eine Funktion die in C geschrieben ist und in der *.decls steht. Ich vermute mal, dass man da nicht so ohne weiteres auch Strukturen übergeben kann. Jeden falls wüsste ich nicht, wie das in der *.delcs Datei aussehen sollte.
Ich brauche einfach nur die Addresse der Struktur bzw. der Variable (vom Typ einer Struktur) im RAM - also eben einfach den Pointer ^^.
Geht das vlt. irgendwie über die "Bank" Funktionen? Ich habe mit denen noch nie etwas gemacht.
Mein YouTube Channel: http://www.youtube.com/user/SoftPixel
Mein Twitter Profil: https://twitter.com/LukasBanana
Meine Projekte auf github.com: https://github.com/LukasBanana
Meine Projekte auf bitbucket.org: https://bitbucket.org/LukasBanana

Thunder

BeitragDo, Sep 02, 2010 15:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du eine Variable des Typs matrix4x4 deklarierst sollte das eine Pointervariable sein und du müsstest sie ohne weiteres an die C-Funktion übergeben können. Also m.matrix4x4 zum Beispiel wäre ein Pointer und mit "New matrix4x4" wird der Speicherbereich auf den der Pointer zeigen soll bereitgestellt.
Aber Achtung! Die BlitzBasic-Types enthalten nicht nur Variablen, die du definiert hast sondern auch Pointer zum vorherigen und zum nächsten Eintrag in der Liste.
Am gescheitesten ist es afaik eine Bank zu erstellen, die die Einträge enthält und die dann zu übergeben (ist auch ein Pointer).

mfg Thunder
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit

LukasBanana

BeitragDo, Sep 02, 2010 16:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok hab's jetzt raus gefunden wie's geht. Und zwar mit CreateBank. Allerdings sind noch 24 Bytes für Informationen über die Bank gespeichert mit denen ich nix anfangen kann. Danach kommt der Speicher den man angelegt hat.

EDIT:
Mh, klappt leider doch nicht so wie ich mir das vor gestellt hatte. Ich löse das jetzt mit einem eigenen Buffer.

Code: [AUSKLAPPEN]

Buffer = CreateBuffer(4)
BufferPokeInt(Buffer, 123)
FreeBuffer(4)
; etc.
Mein YouTube Channel: http://www.youtube.com/user/SoftPixel
Mein Twitter Profil: https://twitter.com/LukasBanana
Meine Projekte auf github.com: https://github.com/LukasBanana
Meine Projekte auf bitbucket.org: https://bitbucket.org/LukasBanana

Noobody

BeitragDo, Sep 02, 2010 20:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Man kann sowohl Types als auch Banks problemlos an DLLs übergeben (wurde übrigens zig dutzend Mal im Forum durchgekaut und steht ausserdem in der userlibs.txt in deinem Userlibs-Ordner Wink ).

Du musst dafür einfach in der .decls folgendes stehen haben Code: [AUSKLAPPEN]
.lib "MeineTolleLib.dll"

Foo( Zeiger* ):"_Foo@4"

So kannst du Foo beliebig mit Types oder Banks aufrufen, übergeben wird dann jeweils der Speicherbereich, bei Banks musst du also nicht erst noch die ersten xy Bytes überspringen.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

LukasBanana

BeitragFr, Sep 03, 2010 9:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Cool danke, funktioniert hervoragend Smile
Mein YouTube Channel: http://www.youtube.com/user/SoftPixel
Mein Twitter Profil: https://twitter.com/LukasBanana
Meine Projekte auf github.com: https://github.com/LukasBanana
Meine Projekte auf bitbucket.org: https://bitbucket.org/LukasBanana

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group