Loading, Drawing, and Moving a Mesh

Nate Bross

Apr 6, 2005
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:

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

        '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()
    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.
        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
        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
            Return v3Position
        End Get
        Set(ByVal value As Vector3)
            v3Position = value
        End Set
    End Property
End Class

Visual Basic:
Dim x as clsMesh

x = new clsMesh(dxDevice,"pathtomesh.x")

Main 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.
Top Bottom