Physikengine ODE (Open dynamic engine) (dll) ?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Robert Wünsche
Beiträge: 243
Registriert: 29.08.2004 12:46
Wohnort: Irgendwo im nirgendwo
Kontaktdaten:

Physikengine ODE (Open dynamic engine) (dll) ?

Beitrag von Robert Wünsche »

Hallo,

ich mochte gerne die ode physikengine für meine pb sachen nutzen, dabei gibt es leider noch einige schwirigkeiten, wie folgt:

Code: Alles auswählen

;ode include datei:

;Gebaut von robert Wünsche
;benötigt die ode.dll datei im C/windows verzeichniss mit der version 0.5 oder höher.

;setze den debuger auf an
;DebugLevel 10
Global ode_error  ;ist ein debugparameter, ob die funktion zum suchen der dll funktionen weitermachen kann oder nicht
                  ; wenn 0 --> höre beim fehler auf !
                  ; wenn 1 --> suche einfach weiter !
Global ode_errors ;ist die fehleranzahl !
Global ode_direkt ;wenn 1 --> letzter funktionsaufruf war direkt (sehr schnell)
                  ;wenn 0 --> letzter funktionsaufruf war nicht direkt (langsam)


Procedure ODEStart()
  time = ElapsedMilliseconds()
  Debug "ODEStart() | bei "+Str(time),10
  
  ;setze die globalen variablen:
  Global dWorldCreate
  Global dWorldDestroy
  Global dWorldSetGravity
  Global dWorldgetgravity

  
  If OpenLibrary(100,"C:\WINDOWS\ode.dll") <> 0
    ;lade alle pointervariablen:
    Debug " Library wurde erfolgreich geöffnet ! | bei "+Str(ElapsedMilliseconds() - time),10
    If ExamineLibraryFunctions(100) = 0
      Debug "  Funktionen konnten nicht abgefragt werden ! | bei "+Str(ElapsedMilliseconds() - time),10
      If ode_error = 1 : ode_errors + 1 : Else : ProcedureReturn 0 : EndIf
    Else
      ;überprüfe die funktionsnammen und füge ihre adressen hinzu:
      temp = IsFunction(100, "dWorldCreate") 
      If temp = 0
        Debug "  dWorldCreate() wurde nicht gefunden ! | bei "+Str(ElapsedMilliseconds() - time),10
        ;eintrag konnte nicht gefunden werden !"
        If ode_error = 1 : ode_errors + 1 : Else : ProcedureReturn 0 : EndIf
      Else
        ;Eintrag erfolgreich gefunden !
        Debug "  dWorldCreate() wurde gefunden | bei "+Str(ElapsedMilliseconds() - time),10
        Debug "   bei adresse "+Str(temp), 10
        dWorldCreate = temp
      EndIf
      
      temp = IsFunction(100, "dWorldDestroy") 
      If temp = 0
        Debug "  dWorldDestroy() wurde nicht gefunden ! | bei "+Str(ElapsedMilliseconds() - time),10
        ;eintrag konnte nicht gefunden werden !"
        If ode_error = 1 : ode_errors + 1 : Else : ProcedureReturn 0 : EndIf
      Else
        ;Eintrag erfolgreich gefunden !
        Debug "  dWorldDestroy() wurde gefunden | bei "+Str(ElapsedMilliseconds() - time),10
        Debug "   bei adresse "+Str(temp), 10
        dWorldDestroy = temp
      EndIf
      
      temp = IsFunction(100, "dWorldSetGravity") 
      If temp = 0
        Debug "  dWorldSetGravity() wurde nicht gefunden ! | bei "+Str(ElapsedMilliseconds() - time),10
        ;eintrag konnte nicht gefunden werden !"
        If ode_error = 1 : ode_errors + 1 : Else : ProcedureReturn 0 : EndIf
      Else
        ;Eintrag erfolgreich gefunden !
        Debug "  dWorldSetGravity() wurde gefunden | bei "+Str(ElapsedMilliseconds() - time),10
        Debug "   bei adresse "+Str(temp), 10
        dWorldSetGravity = temp
      EndIf
      
      temp = IsFunction(100, "dWorldGetGravity") 
      If temp = 0
        Debug "  dWorldGetGravity() wurde nicht gefunden ! | bei "+Str(ElapsedMilliseconds() - time),10
        ;eintrag konnte nicht gefunden werden !"
        If ode_error = 1 : ode_errors + 1 : Else : ProcedureReturn 0 : EndIf
      Else
        ;Eintrag erfolgreich gefunden !
        Debug "  dWorldGetGravity() wurde gefunden | bei "+Str(ElapsedMilliseconds() - time),10
        Debug "   bei adresse "+Str(temp), 10
        dWorldgetgravity = temp
      EndIf
      
      ;fertig :-)
      ;jetzt geben wir noch das ergebniss aus:
      ProcedureReturn 1
      
    EndIf
  Else
    time = ElapsedMilliseconds() - time
    Debug "  library konnte nicht geladen werden ! | bei "+Str(ElapsedMilliseconds() - time),10
    If ode_error = 1 : ode_errors + 1 : Else : ProcedureReturn 0 : EndIf
  EndIf
EndProcedure

;-Und nun die konvertierten befehle:
Procedure dWorldCreate()
  If dWorldCreate = 0
    ;indirekter aufruf !
    ergebniss = CallFunction(100, "dWorldCreate") 
    ;setze variable:
    ode_direkt = 0
    ProcedureReturn ergebniss
  EndIf
  ;wenn alles gut gegangen ist, direkter aufruf ! (ist sehr schnell)
  dWorldID = CallFunctionFast(dWorldCreate)
  ;setze variable:
  ode_direkt = 1
  ProcedureReturn dWorldID
EndProcedure

Procedure dWorldDestroy (dWorldID)
  If dWorldDestroy = 0
    ;indirekter aufruf !
    CallFunction(100, "dWorldDestroy",dWorldID) 
    ;setze variable:
    ode_direkt = 0
  EndIf
  ;wenn alles gut gegangen ist, direkter aufruf ! (ist sehr schnell)
  CallFunctionFast(dWorldDestroy,dWorldID)
  ;setze variable:
  ode_direkt = 1
EndProcedure

Procedure dWorldSetGravity (dWorldID,x.f,y.f,z.f)
  If dWorldSetGravity = 0
    ;indirekter aufruf !
    CallFunction(100, "dWorldSetGravity",dWorldID,x.f,y.f,z.f) 
    ;setze variable:
    ode_direkt = 0
  EndIf
  ;wenn alles gut gegangen ist, direkter aufruf ! (ist sehr schnell)
  CallFunctionFast(dWorldSetGravity,dWorldID,x.f,y.f,z.f)
  ;setze variable:
  ode_direkt = 1
EndProcedure

Procedure dWorldGetGravity (dWorldID,Gravity)
  If dWorldgetgravity = 0
    ;indirekter aufruf !
    CallFunction(100, "dWorldGetGravity",dWorldID,Gravity) 
    ;setze variable:
    ode_direkt = 0
  EndIf
  ;wenn alles gut gegangen ist, direkter aufruf ! (ist sehr schnell)
  CallFunctionFast(dWorldgetgravity,dWorldID,Gravity)
  ;setze variable:
  ode_direkt = 1
EndProcedure




;:setze den errorparameter auf 1 (nicht gefundene funktionen werden mit einer 0 versehen !
ode_error = 1
Debug ODEStart()
Debug "fehler : "+ Str(ode_errors)

;test:
world = dWorldCreate()
Debug world
Debug ode_direkt

;dWorldSetGravity(world,0,0,-9.0)

;datenplätze reservieren:
memory = AllocateMemory(48)
If memory = 0
  Debug "datenplätze (ram) konnte nicht reserviert werden !"
  End
Else
EndIf

;dWorldSetERP(world,0.3)

End
Die dll müsst ihr euch einfach von www.ode.org runterladen (dll version) und die dll datei dann in C:\windows reinkopieren !

Soweit funktioniert alles aber: wenn ich die richtigen befehle benutze, stürtzt das progi immer ab, warum ?

Im foraus: Danke !
Robert Wünsche
Beiträge: 243
Registriert: 29.08.2004 12:46
Wohnort: Irgendwo im nirgendwo
Kontaktdaten:

Beitrag von Robert Wünsche »

Wieso funktioniert das nicht, wenn ich die normalen befehle verwende ?
Benutzeravatar
freedimension
Admin
Beiträge: 1987
Registriert: 08.09.2004 13:19
Wohnort: Ludwigsburg
Kontaktdaten:

Beitrag von freedimension »

Ich würde mal vermuten weil das kleine d vor den Funktionsnamen darauf hindeutet dass hier Doubles zurückgegeben werden, und die kann PB halt (noch) nicht.
Beginne jeden Tag als ob es Absicht wäre!
Bild
BILDblog
Robert Wünsche
Beiträge: 243
Registriert: 29.08.2004 12:46
Wohnort: Irgendwo im nirgendwo
Kontaktdaten:

Beitrag von Robert Wünsche »

dh. wohl, das man die normale libs garnicht mit pb benutzen kann ?
:( :? :cry: .
Schade ! :freak:
Benutzeravatar
freedimension
Admin
Beiträge: 1987
Registriert: 08.09.2004 13:19
Wohnort: Ludwigsburg
Kontaktdaten:

Beitrag von freedimension »

Du kannst schon, du musst halt einen Wrapper in C bauen der normale Floats zurückgibt und empfängt.
Beginne jeden Tag als ob es Absicht wäre!
Bild
BILDblog
Robert Wünsche
Beiträge: 243
Registriert: 29.08.2004 12:46
Wohnort: Irgendwo im nirgendwo
Kontaktdaten:

Beitrag von Robert Wünsche »

:( !
Leider kann ich kein c und kein c++ !
Gibts irgentwo schon so einen double-float wrapper ?

PS: ich gucke mal in purearea.net nach, feleicht finde ich was.
NetSlayer
Beiträge: 117
Registriert: 21.09.2004 21:18
Kontaktdaten:

Beitrag von NetSlayer »

Robert Wünsche hat geschrieben:PS: ich gucke mal in purearea.net nach, feleicht finde ich was.
Ich weiß es ist OffTopic, aber...

Rechtschreibung. Danke, das musste mal gesagt sein.
...MfG, NetSlayer
"No, I ain't got a problem. It's you with the problem!"
http://netslayer.scpn.net
Antworten