Allgemeine Fragen zur PROFAN Programmierung
Views (Heute): 241079 (2515)
  Suchen
 Zurück zur Übersicht
 AutorThema: Fast3D.dll
Marcel Pursche
Datum:10.06.02 18:24 Antwortenals Email verschicken (mp05@metropolis.de) 


Hallo,

bald werde ich die erste Testversion meiner Fast3D.dll herausbringen.
Es tritt aber ein merkwürdiger Fehler auf:

$O+
$H Fast3D.ph
$I D3DCAPS8.inc

'Variablen
Declare hF3D&,Caps#,ListBox&,Light#
Declare Wand#,mtrl#,Vertex#,Index#,Texture&,Name$,Mesh&,hr&

'Für Mausbewegung
Declare MouseX%,MouseY%
MouseX% = %MouseX
MouseY% = %MouseY

hF3D& = UseDLL("Fast3D.dll")

struct _F3DOBJECT = ~F3DOBJECT
struct _D3DXVECTOR3 = ~D3DXVECTOR3
struct _D3DMATERIAL8 = ~D3DMATERIAL8
struct _D3DSURFACE_DESC = ~D3DSURFACE_DESC
dim Wand#,_F3DOBJECT
dim mtrl#,_D3DMATERIAL8
dim Vertex#,~SizeofVertex(4)
dim Index#,~SizeofIndex(2)
dim Light#,_D3DLIGHT8

WindowStyle 31
WindowTitle "Profan zeigt 3D (beenden mit ESC)"
Window 0,0-800,600
SetTrueColor 1
CLS RGB(192,192,192)

hr& = ~Fast3DInit(%hwnd, ~F3D_WINDOWED, 800, 600, ~Fast3DGetModeInfo(0,0,0,~F3D_FORMAT))

' Vertexliste füllen
' Vertice links oben
~Fast3DVertexBuffer(Vertex#, 0, 0.0, 0.0, Single(0.0), 0.0, 0.0, Single(1.0), 0.0, 0.0) 'x, y, z, nx, ny, nz, tu, tv
' Vertice rechts oben
~Fast3DVertexBuffer(Vertex#, 1, Single(10.0), 0.0, Single(0.0), 0.0, 0.0, Single(1.0), Single(1.0), 0.0)
' Vertice links unten
~Fast3DVertexBuffer(Vertex#, 2, Single(10.0), Single(10.0), Single(0.0), 0.0, 0.0, Single(1.0), Single(1.0), Single(1.0))
' Vertice rechts unten
~Fast3DVertexBuffer(Vertex#, 3, 0.0, Single(10.0), Single(0.0), 0.0, 0.0, Single(1.0), 0.0, Single(1.0))

'Indexliste füllen
' erstes Dreieck
~Fast3DIndexBuffer(Index#, 0, 0, 1, 2) 'p1, p2, p3
' zweites Dreieck
~Fast3DIndexBuffer(Index#, 1, 0, 2, 3)

'Material erstellen
hr& = ~Fast3DInitMaterial(mtrl#, Single(1.0), Single(1.0), Single(1.0))
'Object erstellen
hr& = ~Fast3DCreateObject(Vertex#, 4, Index#, 6, mtrl#, Wand#)

'Texture laden
Name$ = "lake.bmp"
Texture& = ~Fast3DLoadTexture(Addr(Name$),D3DCOLOR_XRGB(0,0,0))

hr& = ~Fast3DSetTexture(Wand#, 0, Texture&)
AddText "Texture setzen",hr&

~Fast3DAddToList(Wand#)

'Mesh laden
Name$ = "teapot.x" 'LoadFile$("Mesh laden:","Mesh-Datei|*.x")
Mesh& = ~Fast3DLoadMesh(Addr(Name$))
IF equ(Mesh&,~F3DERR_LOADMESH)
MessageBox("Das Mesh konnte nicht geladen werden","Fehler",16)
hr& = ~Fast3DDeinit()
AddText "Fast3D deintialisieren",hr&
dispose Vertex#
dispose Index#
dispose mtrl#
dispose Light#
~Fast3DReleaseObject(Wand#)
dispose Wand#
FreeDll hF3D&
End
Else
~Fast3DAddMesh(Mesh&)
EndIF
~Fast3DSetMeshPos(Mesh&, Single(1.0), 0.0, 0.0)

'Licht erstellen
~Fast3DInitLight(Light#, ~D3DLIGHT_DIRECTIONAL, Single(1.0), 0.0, Single(-1.0), Single(1.0), Single(1.0), Single(0.3))
~Fast3DSetLight(2, Light#)
~Fast3DLightEnable(2, 0)

'Anisotropischen-Filter setzen
~Fast3DSetFilter(~F3D_ANISOTROPICFILTER)

'Scene einmal rendern um mögliche Fehler zu entdecken
hr& = ~Fast3DRenderScene(0)
WhileNot scankey(27)
sendmessage(ListBox&,$0186,-1,0)
SetWindowPos %hwnd=0,0-800,600,1
CASE scankey(37):~Fast3DMoveCamera(Single(-0.1), 0.0, 0.0)
CASE scankey(39):~Fast3DMoveCamera(Single(0.1), 0.0, 0.0)
CASE scankey(38):~Fast3DMoveCamera(0.0, Single(0.1), 0.0)
CASE scankey(40):~Fast3DMoveCamera(0.0, Single(-0.1), 0.0)
CASE scankey(36):~Fast3DMoveCamera(0.0, 0.0, Single(0.1))
CASE scankey(35):~Fast3DMoveCamera(0.0, 0.0, Single(-0.1))

IF lt(MouseX%,%MouseX)
~Fast3DRotateCamera(Single(0.1), 0.0, 0.0)
MouseX% = %MouseX
ElseIF gt(MouseX%,%MouseX)
~Fast3DRotateCamera(Single(-0.1), 0.0, 0.0)
MouseX% = %MouseX
EndIF
IF lt(MouseY%,%MouseY)
~Fast3DRotateCamera(0.0, Single(0.1), 0.0)
MouseY% = %MouseY
ElseIF gt(MouseY%,%MouseY)
~Fast3DRotateCamera(0.0, Single(-0.1), 0.0)
MouseY% = %MouseY
EndIF

~Fast3DRenderScene(0)
EndWhile
hr& = ~Fast3DDeinit()
dispose Vertex#
dispose Index#
dispose mtrl#
dispose Light#
~Fast3DReleaseObject(Wand#)
~Fast3DReleaseMesh(Mesh&)
dispose Wand#
FreeDll hF3D&
End


Wenn ich nun statt CLS RGB(192,192,192) CLS External("USER32","GetSysColor",15)
schreibe kommt die Fehlermeldung:

"Exception EAccessViolation im Modul PROFAN.EXE bei 010C6230.
Zugriffsverletzung bei Adresse 014C7410. Schreiben von Adresse 28263FE8."

Auch wenn ich andere Sachen leicht verändere kommt oft diese Fehlermeldung
(z.B. eine andere Datei als Textur).

Kann mir jemand helfen?

P.S. Mir würde es auch helfen wenn mir jemand sagen kann was die Fehlermeldung bedeutet.



Frank Abbing
Datum:10.06.02 20:20 Antwortenals Email verschicken  


Hallo,

am besten versuchst du diese Variante, die funktioniert:

Def GetSysColor(1) !"USER32","GetSysColor"
farbe&=GetSysColor(15)
Cls farbe&

ansonsten sollte...

CLS External("USER32","GetSysColor",1)

... auch funktionieren. GetSysColor hat nur einen Parameter und nicht 15...

Die Fehlermeldung bedeutet, das ein Speicherbereich überschrieben wurde, für den keine Zugriffsrechte bestehen.

Gruß, Frank


Bernhard Künzel
Datum:10.06.02 20:42 Antwortenals Email verschicken (b.kuenzel@chello.at) 


Hallo Frank,
die Funktion von Marcel
CLS External("USER32","GetSysColor",15)
ist so schon richtig, die 15 sind nicht die Anzahl der Parameter sondern die Farbindex (COLOR_BTNFACE).

Gruß
Bernhard



Frank Abbing
Datum:10.06.02 21:16 Antwortenals Email verschicken  


Hallo,

ups, 'tschuldigung.
Ich benutze External eigentlich nie.
Die erste Möglichkeit funktioniert aber, das ist sicher... ;-))

Gruß, Frank


Alexander Schoenfeld
Datum:11.06.02 08:12 Antwortenals Email verschicken (alexander.schoenfeld@chronologic.de) 


Hallo Marcel!

bin mir zwar nicht sicher, aber ich glaube da war irgendwas, das Profan je nach External() oder mit Def andere Wertetypen zurückliefert ( Long / Integer ? ).
Grundsätzlich müsste das aber Funktionieren, ich selbst benutze die Funktion mit einem Headerfile ( ~GetSysColor ) und habe keine Probleme ( Profan² 7.5; WinXP Home).

Mit freundlichem Gruss / kind regards,
Alexander Schoenfeld

Email: alexander.schoenfeld@chronologic.de


Horst Horn
Datum: 11.06.02 19:47 Antwortenals Email verschicken (info@web-treffpunkt.de) 


...
...noch ne *.DLL

;o)
CU
horst


 Zurück zur Übersicht