Sign in to follow this  

rootFrame = Mesh.LoadHierarchyFromFile(error)

This topic is 3562 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Hi, I'm using vb.net 2003 with the dec 2004 sdk. I'm having a problem with .x file animation. I already have the code from Zman and robydx so sending me there won't be of any value. I have the code below which should work. I'm having a problem with rootFrame = Mesh.LoadHierarchyFromFile I've tried everyway I can to fix this problem but I can't find out what it is. You will notice message boxes in the code,that is because stepping through the code isn't telling me anything. After the messagebox("ErrorHere") I get an error in the 3d3x dll. I don't know where to go from here.

Imports System
Imports System.Drawing
Imports System.ComponentModel
Imports System.Windows.Forms

Imports Microsoft.DirectX
Imports Microsoft.DirectX.Direct3D



Public Class Form2
    Inherits System.Windows.Forms.Form
    Private components As System.ComponentModel.Container = Nothing

    Private timer As Timer ' use timer to refresh the display
    Private device As Device ' the device for DX
    Private radius As Single ' the radius and center of the mesh
    Private center As Vector3
    Private rootFrame As AnimationRootFrame
    ' the root frame object 
    Public Sub New()
        InitializeComponent()

        ' we'll do  all our drawing
        SetStyle(ControlStyles.AllPaintingInWmPaint Or ControlStyles.Opaque, True)

        timer = New Timer
        ' we'll update the display 20 times a sec
        timer.Interval = 50
        AddHandler timer.Tick, AddressOf tickHandler

    End Sub 'New


    Protected Overloads Sub Dispose(ByVal disposing As Boolean)
        If disposing Then
            If Not (components Is Nothing) Then
                components.Dispose()
            End If
        End If
        MyBase.Dispose(disposing)

    End Sub 'Dispose

#Region "Windows Form Designer generated code"

    '/ <summary>
    '/ Required method for Designer support - do not modify
    '/ the contents of this method with the code editor.
    '/ </summary>
    Private Sub InitializeComponent()
        Me.components = New System.ComponentModel.Container
        Me.Size = New System.Drawing.Size(640, 480)
        Me.Text = "Form1"

    End Sub 'InitializeComponent
#End Region


    <STAThread()> _
    Shared Sub Main()
        Dim frm As New Form2
        Try
            frm.Show()
            frm.InitializeGraphics()
            Application.Run(frm)
        Finally
            frm.Dispose()
        End Try

    End Sub 'Main


    Sub InitializeGraphics()
        Dim presentParams As New PresentParameters

        presentParams.Windowed = True
        presentParams.SwapEffect = SwapEffect.Discard
        presentParams.AutoDepthStencilFormat = DepthFormat.D16
        presentParams.EnableAutoDepthStencil = True
        device = New Device(0, DeviceType.Hardware, Me, CreateFlags.SoftwareVertexProcessing, presentParams)

        ' avoid weird resource management issues
        device.IsUsingEventHandlers = False
        Dim tinyfile As String
        tinyfile = "tiny.x"
        ' load our x file
        LoadAnim(MediaUtilities.FindFile(tinyfile))
        MessageBox.Show(tinyfile)
        AddHandler device.DeviceReset, AddressOf OnDeviceReset
        OnDeviceReset(device, Nothing)

    End Sub 'InitializeGraphics


    Sub LoadAnim(ByVal fileName As String)
        device = device
        Dim alloc As New MyAllocateHierarchy
        MessageBox.Show(fileName)
        ' build the hierarchy of frames from the x file using our alloc object
        rootFrame = Mesh.LoadHierarchyFromFile(MessageBox.Show(fileName) & fileName, MessageBox.Show("aaa") & MeshFlags.Managed & MessageBox.Show("ErrorHere"), device, alloc, Nothing)
        radius = Frame.CalculateBoundingSphere(rootFrame.FrameHierarchy, center)

        ' connect the bones the frames in the mesh
        AttachBones(CType(rootFrame.FrameHierarchy, MyFrame))

    End Sub 'LoadAnim


    Sub OnDeviceReset(ByVal sender As Object, ByVal e As EventArgs)
        Dim dev As Device = CType(sender, Device)
        dev.Transform.View = Matrix.LookAtLH(New Vector3(0, 0, -2.0F * radius), center, New Vector3(0, 1, 0))

        dev.Transform.Projection = Matrix.PerspectiveFovLH(System.Convert.ToSingle(Math.PI) / 4, 1.3F, 0.1F, 10.0F * radius)

        dev.Lights(0).Type = LightType.Directional
        dev.Lights(0).Direction = New Vector3(0.0F, 0.0F, 1.0F)
        dev.Lights(0).Diffuse = Color.White
        dev.Lights(0).Update()
        dev.Lights(0).Enabled = True

        timer.Start()

    End Sub 'OnDeviceReset


    Sub tickHandler(ByVal o As Object, ByVal e As EventArgs)
        Me.Invalidate()

    End Sub 'tickHandler


    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
        ' move our animation ahead (the constant 0.05 was obtained by trial and error)
        If Not (rootFrame.AnimationController Is Nothing) Then
            rootFrame.AnimationController.AdvanceTime(0.05F, Nothing)
        End If
        ' update all the hierarchy of frames with the new transform values
        If Not (rootFrame.FrameHierarchy Is Nothing) Then
            UpdateFrameMatrices(CType(rootFrame.FrameHierarchy, MyFrame), Matrix.Identity)
        End If
        device.Clear(ClearFlags.Target Or ClearFlags.ZBuffer, Color.Blue, 1.0F, 0)
        device.BeginScene()

        ' draw the animation
        If Not (rootFrame.FrameHierarchy Is Nothing) Then
            DrawFrame(CType(rootFrame.FrameHierarchy, MyFrame))
        End If
        device.EndScene()
        device.Present()

    End Sub 'OnPaint


    '
    ' walk the tree of frames and draw each one
    '
    Sub DrawFrame(ByVal frame As MyFrame)
        Dim mesh As MyMeshContainer = CType(frame.MeshContainer, MyMeshContainer)
        While Not (mesh Is Nothing)
            DrawMeshContainer(mesh)
            mesh = CType(mesh.NextContainer, MyMeshContainer)
        End While

        If Not (frame.FrameSibling Is Nothing) Then
            DrawFrame(CType(frame.FrameSibling, MyFrame))
        End If

        If Not (frame.FrameFirstChild Is Nothing) Then
            DrawFrame(CType(frame.FrameFirstChild, MyFrame))
        End If

    End Sub 'DrawFrame


    '
    ' when we have a mesh container with skin info, we set the proper
    ' blending information
    '
    Sub DrawMeshContainer(ByVal mesh As MyMeshContainer)
        If Not (mesh.SkinInformation Is Nothing) Then
            Dim offsetMatrices As Matrix() = mesh.OffsetMatrices
            Dim frameMatrices As MyFrame() = mesh.FrameMatrices

            ' for each subset with similar attrib, draw it
            Dim iattrib As Integer
            For iattrib = 0 To mesh.NumberAttributes
                ' set the proper world matrix for blending
                Dim boneCombo As BoneCombination = mesh.BoneTable(iattrib)
                Dim i As Integer
                For i = 0 To mesh.NumberInfluences
                    Dim matrixIndex As Integer = boneCombo.BoneId(i)
                    ' it seems when the BoneId is not -1, the matrix index is valid
                    ' where is the doc for this???
                    If matrixIndex <> -1 Then
                        Dim tempMatrix As Matrix = Matrix.Multiply(offsetMatrices(matrixIndex), frameMatrices(matrixIndex).Combined)
                        device.Transform.SetWorldMatrixByIndex(i, tempMatrix)
                    End If
                Next i

                ' set the render state, material and texture
                device.RenderState.VertexBlend = CType(boneCombo.BoneId.Length, VertexBlend) - 1
                device.Material = mesh.GetMaterials()(boneCombo.AttributeId).Material3D
                device.SetTexture(0, mesh.Textures(boneCombo.AttributeId))

                ' draw the subset
                mesh.MeshData.Mesh.DrawSubset(iattrib)
            Next iattrib
        End If

    End Sub 'DrawMeshContainer


    '
    ' walk the tree and attach each bone
    '
    Overloads Sub AttachBones(ByVal frame As MyFrame)
        If Not (frame.MeshContainer Is Nothing) Then
            AttachBones(CType(frame.MeshContainer, MyMeshContainer))
        End If

        If Not (frame.FrameSibling Is Nothing) Then
            AttachBones(CType(frame.FrameSibling, MyFrame))
        End If

        If Not (frame.FrameFirstChild Is Nothing) Then
            AttachBones(CType(frame.FrameFirstChild, MyFrame))
        End If

    End Sub 'AttachBones


    '
    ' when we have a mesh container, we set its frameMatrices accordingly
    '
    Overloads Sub AttachBones(ByVal mesh As MyMeshContainer)
        If Not (mesh.SkinInformation Is Nothing) Then
            Dim numBones As Integer = mesh.SkinInformation.NumberBones

            ' for each bone, find the frame of the same name
            Dim frameMatrices(numBones) As MyFrame
            Dim i As Integer
            For i = 0 To numBones
                Dim frame As MyFrame = CType(frame.Find(rootFrame.FrameHierarchy, mesh.SkinInformation.GetBoneName(i)), MyFrame)

                If frame Is Nothing Then
                    Throw New ArgumentException
                End If
                ' asssign the found frame into the MeshContaienr frameMatrices
                frameMatrices(i) = frame
            Next i
            mesh.FrameMatrices = frameMatrices
        End If

    End Sub 'AttachBones


    '
    ' walk the tree and update the hierarchy
    '
    Sub UpdateFrameMatrices(ByVal frame As MyFrame, ByVal parentMatrix As Matrix)
        ' first transform with the parent
        frame.Combined = Matrix.Multiply(frame.TransformationMatrix, parentMatrix)

        ' if sibling, use transform with parent
        If Not (frame.FrameSibling Is Nothing) Then
            UpdateFrameMatrices(CType(frame.FrameSibling, MyFrame), parentMatrix)
        End If

        ' if child, transform with new combined matrix
        If Not (frame.FrameFirstChild Is Nothing) Then
            UpdateFrameMatrices(CType(frame.FrameFirstChild, MyFrame), frame.Combined)
        End If

    End Sub 'UpdateFrameMatrices
End Class 'Form1


Public Class MyFrame
    Inherits Frame
    Public Combined As Matrix = Matrix.Identity
End Class 'MyFrame


Public Class MyMeshContainer
    Inherits MeshContainer
    ' I'm not a big fan of properties 
    Public Textures As Texture() = Nothing
    Public NumberAttributes As Integer = 0
    Public NumberInfluences As Integer = 0
    Public BoneTable() As BoneCombination
    Public FrameMatrices() As MyFrame
    Public OffsetMatrices() As Matrix
End Class 'MyMeshContainer


Public Class MyAllocateHierarchy
    Inherits Microsoft.DirectX.Direct3D.AllocateHierarchy
    Public Sub New()
        MessageBox.Show("hello")
    End Sub

    Public Overrides Function CreateFrame(ByVal name As String) As Frame
        MessageBox.Show("CreateFrame")
        Dim frame As New MyFrame
        frame.Name = name
        frame.TransformationMatrix = Matrix.Identity

        Return frame

    End Function 'CreateFrame


    Public Overrides Function CreateMeshContainer(ByVal name As String, ByVal meshData As MeshData, ByVal materials() As ExtendedMaterial, ByVal effectInstances() As EffectInstance, ByVal adjacency As GraphicsStream, ByVal skinInfo As SkinInformation) As MeshContainer
        MessageBox.Show("CreateMeshContainer")
        ' create the container object and set some of its properties
        Dim mesh As New MyMeshContainer

        mesh.Name = name
        Dim numFaces As Integer = meshData.Mesh.NumberFaces
        Dim dev As Device = meshData.Mesh.Device

        mesh.SetMaterials(materials)
        mesh.SetAdjacency(adjacency)

        ' fill in the texture info
        Dim meshTextures(materials.Length) As Texture
        Dim i As Integer
        For i = 0 To materials.Length
            If Not (materials(i).TextureFilename Is Nothing) Then
                'meshTextures(i) = TextureLoader.FromFile(dev, MediaUtilities.FindFile(materials(i).TextureFilename))
            End If
        Next i
        mesh.Textures = meshTextures

        ' if needed, fill in the skin info
        If Not (skinInfo Is Nothing) Then
            mesh.SkinInformation = skinInfo

            ' stores the bone offset matrix away
            Dim numBones As Integer = skinInfo.NumberBones
            Dim offsetMatrices(numBones) As Matrix
            'Dim i As Integer
            For i = 0 To numBones
                offsetMatrices(i) = skinInfo.GetBoneOffsetMatrix(i)
            Next i
            mesh.OffsetMatrices = offsetMatrices

            ' Fill the skin info by calling ConvertToBlendedMesh, this generates the BoneTable
            meshData.Mesh = skinInfo.ConvertToBlendedMesh(meshData.Mesh, MeshFlags.Managed Or MeshFlags.OptimizeVertexCache, mesh.GetAdjacencyStream(), mesh.NumberInfluences, mesh.BoneTable)

            mesh.NumberAttributes = mesh.BoneTable.Length
        End If
        ' use new mesh for our drawing
        mesh.MeshData = meshData
        Return mesh

    End Function 'CreateMeshContainer
End Class 'MyAllocateHierarchy



[Edited by - Steve5050 on March 13, 2008 11:14:40 AM]

Share this post


Link to post
Share on other sites
Yes that is good,no problem with my static models,
they load in fine,I can load tiny with that loader
just no anim.

I was stepping through some different code that I
have now and I'm coming up with a frame problem.
I'm still trying to figure that out.

Share this post


Link to post
Share on other sites
I'm at the point where I need an animation
class that will work.I found that there is
a problem with the CreateMeshContainer materials.
I tried making my own animation class and I
haven't got it to work.Very frustrated.

Share this post


Link to post
Share on other sites
I'll put up the animation class i'm attempting:

Imports Microsoft.DirectX
Imports Microsoft.DirectX.Direct3D

Public Class AnimPositionedMesh
Private Device As Device = Nothing
Private meshTextures As Texture() = Nothing
Private numAttr As Integer = 0
Private numInfl As Integer = 0
Private bones() As BoneCombination
Private frameMatrices() As Frame
Private offsetMatrices() As Matrix
Private combined As Matrix = Matrix.Identity
Private rootFrame As AnimationRootFrame
Private objectCenter As Vector3
Private objectRadius As Single
Private elapsedTime As Single
Public Sub New()

End Sub
Public Function CreateFrame(ByVal name As String) As Frame
Dim frame As Frame
frame.Name = name
frame.TransformationMatrix = Matrix.Identity
CombinedTransformationMatrix = Matrix.Identity

Return frame

End Function 'CreateFrame
Private Sub DrawFrame(ByVal frame As Frame)
Dim mesh As MeshContainer = CType(frame.MeshContainer, MeshContainer)
While Not (mesh Is Nothing)
DrawMeshContainer(mesh, frame)

mesh = CType(mesh.NextContainer, MeshContainer)
End While

If Not (frame.FrameSibling Is Nothing) Then
DrawFrame(CType(frame.FrameSibling, Frame))
End If

If Not (frame.FrameFirstChild Is Nothing) Then
DrawFrame(CType(frame.FrameFirstChild, Frame))
End If

End Sub 'DrawFrame
Private Sub DrawMeshContainer(ByVal mesh As MeshContainer, ByVal frame As Frame)
' Is there skin information?
If Not (mesh.SkinInformation Is Nothing) Then
If NumberInfluences = 1 Then
Device.RenderState.VertexBlend = VertexBlend.ZeroWeights
Else
Device.RenderState.VertexBlend = CType(NumberInfluences - 1, VertexBlend)
End If
If NumberInfluences > 0 Then
Device.RenderState.IndexedVertexBlendEnable = True
End If
Dim bones As BoneCombination() = GetBones()

Dim iAttrib As Integer
For iAttrib = 0 To NumberAttributes
' first, get world matrices
Dim iPaletteEntry As Integer

While iPaletteEntry < NumberPaletteEntries
Dim iMatrixIndex As Integer = bones(iAttrib).BoneId(iPaletteEntry)
If iMatrixIndex <> -1 Then
'''''Device.Transform.SetWorldMatrixByIndex(iPaletteEntry, Matrix.Multiply(GetOffsetMatrices()(iMatrixIndex), GetFrames())
End If
iPaletteEntry += 1
End While


'device.Material = mesh.GetMaterials()[bones[iAttrib].AttribId].Material3D;
'device.SetTexture(0, mesh.GetTextures()[bones[iAttrib].AttribId]);
Device.Material = mesh.GetMaterials()(bones(iAttrib).AttributeId).Material3D
Device.SetTexture(0, GetTextures()(bones(iAttrib).AttributeId))

' Finally draw the subset
mesh.MeshData.Mesh.DrawSubset(iAttrib)
Next iAttrib
' standard mesh, just draw it after setting material properties
Else
Device.Transform.World = CombinedTransformationMatrix

Dim mtrl As ExtendedMaterial() = mesh.GetMaterials()
Dim iMaterial As Integer
For iMaterial = 0 To mtrl.Length
Device.Material = mtrl(iMaterial).Material3D
Device.SetTexture(0, GetTextures()(iMaterial))
mesh.MeshData.Mesh.DrawSubset(iMaterial)
Next iMaterial
End If

End Sub 'DrawMeshContainer
Public Sub GenerateSkinnedMesh(ByVal mesh As MeshContainer)
If mesh.SkinInformation Is Nothing Then
Throw New ArgumentException
End If
Dim numMaxFaceInfl As Integer
Dim flags As MeshFlags = MeshFlags.OptimizeVertexCache

Dim m As MeshData = mesh.MeshData

Dim ib As IndexBuffer = m.Mesh.IndexBuffer
Try
numMaxFaceInfl = mesh.SkinInformation.GetMaxFaceInfluences(ib, m.Mesh.NumberFaces)
Finally
ib.Dispose()
End Try
' 12 entry palette guarantees that any triangle (4 independent
' influences per vertex of a tri) can be handled
numMaxFaceInfl = Fix(Math.Min(numMaxFaceInfl, 12))

If Device.DeviceCaps.MaxVertexBlendMatrixIndex + 1 >= numMaxFaceInfl Then
NumberPaletteEntries = Fix(Math.Min((Device.DeviceCaps.MaxVertexBlendMatrixIndex + 1) / 2, mesh.SkinInformation.NumberBones))

flags = flags Or MeshFlags.Managed
End If

Dim bones() As BoneCombination
Dim numInfl As Integer

m.Mesh = mesh.SkinInformation.ConvertToIndexedBlendedMesh(m.Mesh, flags, mesh.GetAdjacencyStream(), NumberPaletteEntries, numInfl, bones)

SetBones(bones)
NumberInfluences = numInfl
NumberAttributes = bones.Length
mesh.MeshData = m

End Sub 'GenerateSkinnedMesh
Public Sub ProcessNextFrame()
' Get the current elapsed time
elapsedTime = DXUtil.Timer(DirectXTimer.GetElapsedTime)

' Set the world matrix
Dim worldMatrix As Matrix = Matrix.Translation(objectCenter)
Device.Transform.World = worldMatrix

If Not (rootFrame.AnimationController Is Nothing) Then
rootFrame.AnimationController.AdvanceTime(elapsedTime, Nothing)
End If
UpdateFrameMatrices(CType(rootFrame.FrameHierarchy, Frame), worldMatrix)

End Sub 'ProcessNextFrame
Private Overloads Sub SetupBoneMatrices(ByVal frame As Frame)
If Not (frame.MeshContainer Is Nothing) Then
SetupBoneMatrices(CType(frame.MeshContainer, MeshContainer))
End If

If Not (frame.FrameSibling Is Nothing) Then
SetupBoneMatrices(CType(frame.FrameSibling, Frame))
End If

If Not (frame.FrameFirstChild Is Nothing) Then
SetupBoneMatrices(CType(frame.FrameFirstChild, Frame))
End If

End Sub 'SetupBoneMatrices
Private Overloads Sub SetupBoneMatrices(ByVal mesh As MeshContainer)
' Is there skin information? If so, setup the matrices
If Not (mesh.SkinInformation Is Nothing) Then
Dim numBones As Integer = mesh.SkinInformation.NumberBones

Dim frameMatrices(numBones) As Frame
Dim i As Integer
For i = 0 To numBones
Dim frame As Frame = CType(frame.Find(rootFrame.FrameHierarchy, mesh.SkinInformation.GetBoneName(i)), Frame)

If frame Is Nothing Then
Throw New ArgumentException
End If
frameMatrices(i) = frame
Next i
SetFrames(frameMatrices)
End If

End Sub 'SetupBoneMatrices
Private Sub UpdateFrameMatrices(ByVal frame As Frame, ByVal parentMatrix As Matrix)
CombinedTransformationMatrix = Matrix.Multiply(frame.TransformationMatrix, parentMatrix)

If Not (frame.FrameSibling Is Nothing) Then
UpdateFrameMatrices(CType(frame.FrameSibling, Frame), parentMatrix)
End If

If Not (frame.FrameFirstChild Is Nothing) Then
UpdateFrameMatrices(CType(frame.FrameFirstChild, Frame), CombinedTransformationMatrix)
End If

End Sub 'UpdateFrameMatrices
' Public properties
Public Function GetTextures() As Texture()
Return meshTextures

End Function 'GetTextures

Public Sub SetTextures(ByVal textures() As Texture)
meshTextures = textures

End Sub 'SetTextures

Public Function GetBones() As BoneCombination()
Return bones

End Function 'GetBones

Public Sub SetBones(ByVal b() As BoneCombination)
bones = b

End Sub 'SetBones

Public Function GetFrames() As Frame()
Return frameMatrices

End Function 'GetFrames

Public Sub SetFrames(ByVal frames() As Frame)
frameMatrices = frames

End Sub 'SetFrames

Public Function GetOffsetMatrices() As Matrix()
Return offsetMatrices

End Function 'GetOffsetMatrices

Public Sub SetOffsetMatrices(ByVal matrices() As Matrix)
offsetMatrices = matrices

End Sub 'SetOffsetMatrices
Public Property CombinedTransformationMatrix() As Matrix
Get
Return combined
End Get
Set(ByVal Value As Matrix)
combined = Value
End Set
End Property

Public Property NumberAttributes() As Integer
Get
Return numAttr
End Get
Set(ByVal Value As Integer)
numAttr = Value
End Set
End Property

Public Property NumberInfluences() As Integer
Get
Return numInfl
End Get
Set(ByVal Value As Integer)
numInfl = Value
End Set
End Property
Private numPal As Integer = 0

Public Property NumberPaletteEntries() As Integer
Get
Return numPal
End Get
Set(ByVal Value As Integer)
numPal = Value
End Set
End Property

Public Overloads Function CreateMeshContainer(ByVal name As String, ByVal meshData As MeshData, ByVal materials() As ExtendedMaterial, ByVal effectInstances As EffectInstance, ByVal adjacency As GraphicsStream, ByVal skinInfo As SkinInformation) As MeshContainer
If meshData.Mesh Is Nothing Then
Throw New ArgumentException
End If
' We must have a vertex format mesh
If meshData.Mesh.VertexFormat = VertexFormats.None Then
Throw New ArgumentException
End If
Dim mesh As MeshContainer

mesh.Name = name
Dim numFaces As Integer = meshData.Mesh.NumberFaces
Dim dev As Device = meshData.Mesh.Device

' Make sure there are normals
If (meshData.Mesh.VertexFormat And VertexFormats.Normal) = 0 Then
' Clone the mesh
Dim tempMesh As Mesh = meshData.Mesh.Clone(meshData.Mesh.Options.Value, meshData.Mesh.VertexFormat Or VertexFormats.Normal, dev)

meshData.Mesh = tempMesh
meshData.Mesh.ComputeNormals()
End If

' Store the materials
mesh.SetMaterials(materials)
mesh.SetAdjacency(adjacency)
''Dim meshTextures(materials.Length) As Texture
'Dim meshTextures As Texture() = New Texture(materials.Length - 1) {}
'''Dim meshMaterials As Material() = New Material(materials.Length - 1) {}
'''Dim textureNames As String() = New String(materials.Length - 1) {}
'''Dim xFilePath As String = Path.GetDirectoryName(app.MeshPath)
''''''''''''''''''''''
meshTextures = New Texture(materials.Length - 1) {}
' Create any textures
Dim i As Integer
For i = 0 To materials.Length
If Not (materials(i).TextureFilename Is Nothing) Then
meshTextures(i) = TextureLoader.FromFile(dev, MediaUtilities.FindFile(materials(i).TextureFilename))
End If
Next i
SetTextures(meshTextures)
mesh.MeshData = meshData
''Dim i As Integer
' If there is skinning info, save any required data
If Not (skinInfo Is Nothing) Then
mesh.SkinInformation = skinInfo
Dim numBones As Integer = skinInfo.NumberBones
Dim offsetMatrices(numBones) As Matrix


For i = 0 To numBones
offsetMatrices(i) = skinInfo.GetBoneOffsetMatrix(i)
Next i
SetOffsetMatrices(offsetMatrices)

Me.GenerateSkinnedMesh(mesh)
End If

Return mesh

End Function 'CreateMeshContainer
Public Sub CreateAnimation(ByVal file As String)
' Create our allocate hierarchy derived class
Dim alloc As AllocateHierarchy

' Load our file
rootFrame = Mesh.LoadHierarchyFromFile(file, MeshFlags.Managed, Device, alloc, Nothing)
' Calculate the center and radius of a bounding sphere
objectRadius = Frame.CalculateBoundingSphere(rootFrame.FrameHierarchy, objectCenter)

' Setup the matrices for animation
SetupBoneMatrices(CType(rootFrame.FrameHierarchy, Frame))

' Start the timer
DXUtil.Timer(DirectXTimer.Start)

End Sub 'CreateAnimation
Public Sub Render()
DrawFrame(CType(rootFrame.FrameHierarchy, Frame))

End Sub
End Class



Share this post


Link to post
Share on other sites
I can see two errors in the CreateAnimation(ByVal file As String) function.

1. alloc has not been initialized before using it.

2. AllocateHierarchy class can not be used directly. You should use a class derived from it, and the derived class should have the contents the the application needs. I have seen one in your code in the starting of this thread.

einstone

Share this post


Link to post
Share on other sites
I was attempting to make a class that way.
I'm now no longer doing that. I tried adding
code to my static mesh class, and yet the problem
still exists, I stepped through my code in disassembly
the problem lies here:

For i = 0 To materials.Length
If Not (materials(i).TextureFilename Is Nothing) Then
meshTextures(i) = TextureLoader.FromFile(dev, MediaUtilities.FindFile(materials(i).TextureFilename))
End If
Next i


I'm not getting the texture path right with the model path
I have seen some fixes for it using path.combine but that
doesn't work either,I can run through:

meshTextures(i) = TextureLoader.FromFile(dev, MediaUtilities.FindFile(materials(i).TextureFilename))
End If
Next i



Then I error on:

If Not (materials(i).TextureFilename Is Nothing) Then



I've tried so many ways to make "any" code work and it is not working.
A couple weeks easy fooling around with directx 9.0 dec 2004 animation code.

I need an example that works at this point.

Atleast I need to know how to in vb.net 2003 to get the path.combine fix
to work. A working example would be good.I've already tried it and deleted,
cut,pasted,all kinds of things and the same error.

It is the materials or textures that is causing the problem.
I haven't punched a monitor before but I am very close to doing it,
that is how hard I have been trying to get animation working,very frustrated.



Share this post


Link to post
Share on other sites
I use C#. Since C# and VB.Net use the same base classes, they could be simillar.
I just show you how I did it in C#, hope it can help.

I put the x file and the textures files in the same folder inside the Debug folder of the project. Then I use this method to locate them in code.

string modelFile = Application.StartUpPath + @"\Models\" + tiny.x;
string txFile = Application.StartUpPath + @"\Models\" + tiny.jpg;

StartUpPath is the static property of class Application, which will point straight to the Debug folder.

I recall that the symbol @ is not neccessary in VB.Net.

I also suppose you to create a try block in your code both for the model and the texture, in case the file not found or the file damaged.


einstone

Share this post


Link to post
Share on other sites
There was a common problem where although the allocate hierarchy class created a texture from the file the extendedmaterial was automatically disposed somehow(odd, since the GC does not get rid of unmanaged objs.) before it was accessed in the main class. Don't know if that's the prob. here though.

Share this post


Link to post
Share on other sites

This topic is 3562 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this