Nate Bross
Contributor
- Joined
- Apr 6, 2005
- Location
- Chicago, IL
I've been worling on this class for a while, and while it's not finished it works pretty good and should be a great starting point for anyone looking to build d3d apps.
Class Code:
Usage:
The usage code is untested, but should be pretty simple to get working, the class code should compile aginst the 2005 October SDK. The December SDK may work as well, but I haven't tested with it as much.
Class Code:
Visual Basic:
Imports System
Imports Microsoft.DirectX
Imports Microsoft.DirectX.Direct3D
Imports Microsoft.DirectX.Direct3D.D3DX
Public Class clsMesh
'Variable Declerations
Private Device As Device 'Reference do the main Device
Private v3Position As New Vector3(0, 0, 0) 'Location of our Mesh in 3D space
Private Mesh As Mesh 'Our mesh file
Private Materials() As Material 'Mesh Materials
Private Textures() As Texture 'Mesh Textures
Private pitchRadians As Single = 0
Private yawRadians As Single = 0
'Amount to increase the pitch by
Public Sub Pitch(ByVal radians As Single)
'Device.Transform.World = Matrix.RotationAxis(New Vector3(0, 1, 0), radians)
pitchRadians += radians
End Sub
'Amount to increase yaw by
Public Sub Yaw(ByVal radians As Single)
yawRadians += radians
End Sub
Sub New(ByRef ldev As Device, ByVal path As String)
xNew(ldev, path, New Vector3(0, 0, 0))
End Sub
Sub New(ByRef ldev As Device, ByVal path As String, ByVal v3pos As Vector3)
xNew(ldev, path, v3pos)
End Sub
'All other 'new' routines call this one, this one has all of the parapaters
Private Sub xNew(ByRef ldev As Device, ByVal path As String, ByVal v3 As Vector3)
'Set our local referance to the main device
Device = ldev
'Create the mesh file from the path to the .X file
CreateMesh(path)
'set our position in 3D Space
Position = v3
End Sub
Public Sub Move(ByVal pos As Vector3)
'Set our mesh's position so next time we don't have to call the Move sub
Position = pos
End Sub
Public Sub Update()
'Transform the matrix world to the location we want our
'mesh to be at, additionally adjust the pitch and yaw of our mesh
Dim FinalMatrix As Matrix
FinalMatrix = Matrix.Multiply(Matrix.RotationAxis(New Vector3(0, 1, 0), pitchRadians), Matrix.RotationAxis(New Vector3(1, 0, 0), yawRadians))
FinalMatrix = Matrix.Multiply(FinalMatrix, Matrix.Translation(Position))
Device.Transform.World = FinalMatrix
End Sub
Public Sub DrawMesh()
DrawMesh(v3Position)
End Sub
Public Sub DrawMesh(ByVal v3 As Vector3)
'Are we moving to the same location?
If v3 <> v3Position Then
'If not move to the location provided.
Move(v3)
End If
'Loop through the materials and set the textures
For i As Integer = 0 To Materials.Length - 1
'If the texture isn't null
If Not Textures(i) Is System.DBNull.Value Then
'Set the device texture
Device.SetTexture(0, Textures(i))
End If
'set the materials
Device.Material = Materials(i)
'draw the mesh
Mesh.DrawSubset(i)
Next i
End Sub
Private Sub CreateMesh(ByVal path As String)
'Define extended materials
Dim extendedMaterials() As ExtendedMaterial = Nothing
'Actually load our mesh from a file
Mesh = Direct3D.Mesh.FromFile(path, MeshFlags.SystemMemory, Device, extendedMaterials)
If Not Textures Is System.DBNull.Value Then
'we should dispose textures at this point
'functionallity needs to be written.
End If
'Begin setting up our textures
Textures = New Texture(extendedMaterials.Length) {}
'Begin setting up the materials
Materials = New Material(extendedMaterials.Length) {}
'Loop through the materials
For i As Integer = 0 To extendedMaterials.Length - 1
'If the texture file name is nothing skip this section
If extendedMaterials(i).TextureFilename <> "" Then
'Define variable
Dim texturePath As String
'set the texture path via standard .NET methods
texturePath = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(path), extendedMaterials(i).TextureFilename)
'Now we load the texutre into it's respective place in the array
Textures(i) = TextureLoader.FromFile(Device, texturePath)
End If
Materials(i) = extendedMaterials(i).Material3D
Materials(i).Ambient = Materials(i).Diffuse
Next i
End Sub
Public Property Position() As Vector3
Get
Return v3Position
End Get
Set(ByVal value As Vector3)
v3Position = value
End Set
End Property
End Class
Usage:
Visual Basic:
Dim x as clsMesh
x = new clsMesh(dxDevice,"pathtomesh.x")
Main Loop
dxDevice.beginscene()
x.DrawMesh()
dxDevice.endscene()
Loop
The usage code is untested, but should be pretty simple to get working, the class code should compile aginst the 2005 October SDK. The December SDK may work as well, but I haven't tested with it as much.