|
'3D Objekt
Public gMesh As D3DXMesh
'Array für die Material Daten
Public gMeshMaterials() As D3DMATERIAL8
'Array für die Texturen
Public gMeshTextures() As Direct3DTexture8
'Anzahl der Material-Daten im Mesh
Public gNumMaterials As Long
'X-File laden und die Texturen dazu
Public Function LoadMesh(ByVal filename As String) As Boolean
Dim strTexturName As String
On Error GoTo ErrOut
Buffer für die Material-Daten im 3D-Objekt
Dim MtrlBuffer As D3DXBuffer
Dim i As Long
'Laden des X Files
'Gleichzeitig werden die Material-Daten in den Buffer geladen
'und auch die Anzahl der Material-Daten im X-File zurückgegeben
Set gMesh = gD3DX8.LoadMeshFromX(App.Path & "\" & filename, _
D3DXMESH_MANAGED, gD3DDevice8, Nothing, MtrlBuffer, _
gNumMaterials)
If gMesh Is Nothing Then Exit Function
'Anhand der Anzahl von Materialien im X-File Arrays
'für die Materialdaten und Texturen dimensionieren
ReDim gMeshMaterials(gNumMaterials - 1)
ReDim gMeshTextures(gNumMaterials - 1)
'Aus dem Buffer die Material-Daten und Textur-Namen auslesen
For i = 0 To gNumMaterials - 1
'Die Material-Daten werden in diesem Beispiel nicht gebraucht
'aber trotzdem der passende Code dazu
'Mittels dem D3DX-Objekt holen wir uns die Material-Daten
gD3DX8.BufferGetMaterial MtrlBuffer, i, gMeshMaterials(i)
'Umkopieren der Farbwerte für Ambient
'(D3DX tut dies nicht von selbst)
gMeshMaterials(i).Ambient = gMeshMaterials(i).diffuse
'Die im XFile verwendete Textur laden
strTexturName = gD3DX8.BufferGetTextureName(MtrlBuffer, i)
If strTexturName <> "" Then
Set gMeshTextures(i) = gD3DX8.CreateTextureFromFile( _
gD3DDevice8, App.Path & "\" & strTexturName)
End If
Next
'Daten-Buffer löschen
Set MtrlBuffer = Nothing
LoadMesh = True
Exit Function
ErrOut:
Debug.Print Err.Number & " - " & Err.Description
End Function
Private Sub Render3D()
Dim i As Long
On Error GoTo ErrOut
If gD3DDevice8 Is Nothing Then Exit Sub
'Bereinigen des BackBuffers und des ZBuffers
gD3DDevice8.Clear 0, ByVal 0, D3DCLEAR_TARGET Or _
D3DCLEAR_ZBUFFER, 0#, 1#, 0
'Szene beginnen
gD3DDevice8.BeginScene
'Vertex-Format setzen
gD3DDevice8.SetVertexShader D3DFVF_CUSTOMVERTEX
'Textur setzen
gD3DDevice8.SetTexture 0, texTextur
'Textur-Koordinaten ausserhalb der Textur werden nicht gespiegelt
gD3DDevice8.SetTextureStageState 0, D3DTSS_ADDRESSW, _
D3DTADDRESS_WRAP
'Bilinearen Texturfilter verwenden, damit die Skybox nicht so
'grob gerastert wird
gD3DDevice8.SetTextureStageState 0, D3DTSS_MAGFILTER, _
D3DTEXF_LINEAR
'Die Box rendern
gD3DDevice8.DrawPrimitiveUP D3DPT_TRIANGLELIST, 12, vxBox(0), _
Len(vxBox(0))
gD3DDevice8.SetTextureStageState 0, D3DTSS_ADDRESSW, 0
'Mesh Objekte sind in Unterelemente unterteilt.
'Eines pro Material. Daher muss über eine Schleife
'gerendert werden.
For i = 0 To gNumMaterials - 1
'pro Unterelement die Textur setzen
gD3DDevice8.SetTexture 0, gMeshTextures(i)
'Unterelement rendern
gMesh.DrawSubset i
Next
'Mit der Draw-Methode des D3DX8Sprite-Objektes werden die
'Bilder gezeichnet
Call gD3DX8Sprite.Draw(texFadenkreuz, recFadenkreuz, _
vecScalingDummy, vecRotationCenterDummy, 0, vecFadenkreuz, _
lngColorDummy)
'Text zeichnen
myDXFont.DrawTextW strText, Len(strText), recText, _
DT_WORDBREAK, D3DColorMake(1, 1, 1, 1)
'Szene beenden
gD3DDevice8.EndScene
'Kompletten BackBuffer zum FrontBuffer kopieren
gD3DDevice8.Present ByVal 0, ByVal 0, 0, ByVal 0
Exit Sub
ErrOut:
Debug.Print Err.Number & " - " & Err.Description
End Sub
|
|