Loading, Drawing, and Moving a Mesh

Loading, Drawing, and Moving a Mesh

Nate Bross

Well-known member
Joined
Apr 6, 2005
Messages
601
Location
Chicago, IL
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:

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.
 
Back
Top