Nate Bross
Well-known member
Ive been worling on this class for a while, and while its 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 havent tested with it as much.
Class Code:
Code:
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 meshs position so next time we dont 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 isnt 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 its 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:
Code:
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 havent tested with it as much.