⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 modmd3helper.bas

📁 一个游戏的原代码
💻 BAS
📖 第 1 页 / 共 2 页
字号:
' This first section of code loads all the MD3 data into various container variables.
' All the arrays are contained within UDT's and are dynamically resized depending
' on the data size they are required to hold so there will be no wasted memory as possible.

' Decs
Dim FileNo As Integer
' Set any preliminary values
FileNo = FreeFile()

' Load our MD3
Open sFileName For Binary As FileNo
' Read the model header
Get #FileNo, , MD3.MD3Header

' Check the model is the correct type
If MD3.MD3Header.Identity <> "IDP3" Then
    MsgBox "Model identity <> IDP3. Cannot load this model " + sFileName, vbCritical, "Load error"
    Exit Sub
End If

' Read the bone frames : NB - This appears to be unused in the standard MD3 format.
ReDim MD3.MD3BoneFrames(MD3.MD3Header.NumOfBoneFrames - 1)
For x = 0 To MD3.MD3Header.NumOfBoneFrames - 1
    Get #FileNo, , MD3.MD3BoneFrames(x)
Next x

' Read the tags
ReDim MD3.MD3Tags((MD3.MD3Header.NumOfTags * MD3.MD3Header.NumOfBoneFrames) - 1)
For x = 0 To ((MD3.MD3Header.NumOfTags * MD3.MD3Header.NumOfBoneFrames) - 1)
    Get #FileNo, , MD3.MD3Tags(x)
Next x
    
' Read the meshes
ReDim MD3.MD3Meshes(MD3.MD3Header.NumOfMeshes - 1)
For m = 0 To MD3.MD3Header.NumOfMeshes - 1
    ' Read the mesh header
    Get #FileNo, , MD3.MD3Meshes(m).MD3MeshHeader
    
    ' Read the skin names
    ReDim MD3.MD3Meshes(m).MD3SkinNames(MD3.MD3Meshes(m).MD3MeshHeader.NumOfSkin - 1)
    For s = 0 To MD3.MD3Meshes(m).MD3MeshHeader.NumOfSkin - 1
        MD3.MD3Meshes(m).MD3SkinNames(s) = Space(68)
        Get #FileNo, , MD3.MD3Meshes(m).MD3SkinNames(s)
        
        MD3.MD3Meshes(m).MD3SkinNames(s) = GetPathOnly(sFileName) & GetNameOnly(MD3.MD3Meshes(m).MD3SkinNames(s))
        MD3.MD3Meshes(m).MD3SkinNames(s) = MemMgr.LoadTexture(MD3.MD3Meshes(m).MD3SkinNames(s))
    Next s

    ' Read the triangles
    ReDim MD3.MD3Meshes(m).MD3Triangles(MD3.MD3Meshes(m).MD3MeshHeader.NumOfTriangle - 1)
    Get #FileNo, , MD3.MD3Meshes(m).MD3Triangles()
    
    ' Read the U V texture coordinates
    ReDim MD3.MD3Meshes(m).MD3TexCoords(MD3.MD3Meshes(m).MD3MeshHeader.NumOfVertex - 1)
    Get #FileNo, , MD3.MD3Meshes(m).MD3TexCoords()
    
    ' Read in the frame vertices
    ReDim MD3.MD3Meshes(m).MD3Frames(MD3.MD3Meshes(m).MD3MeshHeader.NumOfMeshFrames - 1)
    For f = 0 To MD3.MD3Meshes(m).MD3MeshHeader.NumOfMeshFrames - 1
        ReDim MD3.MD3Meshes(m).MD3Frames(f).Frame(MD3.MD3Meshes(m).MD3MeshHeader.NumOfVertex - 1)
        ' Read in the vertices and normal data
        Get #FileNo, , MD3.MD3Meshes(m).MD3Frames(f).Frame()
    Next f
Next m
Close #FileNo




' Notes for the following code.

' The following code takes the MD3 data, and fills in our DirectX8 vertex structure with the data.
' All the frames of animation for each mesh are pre-prepared.
' The MD3 format is cleverly done to require little memory to contain.
' This method requires considderably more memory, as we calculate every frame.
' However the speed gain makes this a requirement.
' Using VB you cannot afford the CPU time to calculate each frame on the fly.

' Temp variables
Dim NormalU As Single
Dim NormalV As Single




' Current index variable
Dim CIndex As Long

' Loop number of meshes
ReDim MD3.MD3Vertices(MD3.MD3Header.NumOfMeshes - 1)
For m = 0 To MD3.MD3Header.NumOfMeshes - 1

    ' Loop number of frames this mesh (Should be constant for every mesh)
    ReDim MD3.MD3Vertices(m).MD3FrameVerts(MD3.MD3Meshes(m).MD3MeshHeader.NumOfMeshFrames - 1)
    For f = 0 To MD3.MD3Meshes(m).MD3MeshHeader.NumOfMeshFrames - 1
    
        ' Clear index variable
        VIndex = 0
    
        ' Loop number of vertices this frame
        ReDim MD3.MD3Vertices(m).MD3FrameVerts(f).MD3Verts((MD3.MD3Meshes(m).MD3MeshHeader.NumOfTriangle + 100) * 3)
        For v = 0 To MD3.MD3Meshes(m).MD3MeshHeader.NumOfTriangle - 1

                ' Point 1 of triangle
                CIndex = MakeIndex
                ' x vertex
                MD3.MD3Vertices(m).MD3FrameVerts(f).MD3Verts(CIndex).Position.x = _
                    MD3.MD3Meshes(m).MD3Frames(f).Frame(MD3.MD3Meshes(m).MD3Triangles(v).Triangles(0)).Vertices(0) / 64
                ' y vertex
                MD3.MD3Vertices(m).MD3FrameVerts(f).MD3Verts(CIndex).Position.y = _
                    MD3.MD3Meshes(m).MD3Frames(f).Frame(MD3.MD3Meshes(m).MD3Triangles(v).Triangles(0)).Vertices(1) / 64
                ' z vertex
                MD3.MD3Vertices(m).MD3FrameVerts(f).MD3Verts(CIndex).Position.Z = _
                    MD3.MD3Meshes(m).MD3Frames(f).Frame(MD3.MD3Meshes(m).MD3Triangles(v).Triangles(0)).Vertices(2) / 64
                ' texture-coordinate
                MD3.MD3Vertices(m).MD3FrameVerts(f).MD3Verts(CIndex).Texture = _
                    MD3.MD3Meshes(m).MD3TexCoords(MD3.MD3Meshes(m).MD3Triangles(v).Triangles(0))
                ' normal
                NormalU = MD3.MD3Meshes(m).MD3Frames(f).Frame(MD3.MD3Meshes(m).MD3Triangles(v).Triangles(0)).Normal(0)
                NormalV = MD3.MD3Meshes(m).MD3Frames(f).Frame(MD3.MD3Meshes(m).MD3Triangles(v).Triangles(0)).Normal(1)
                MD3.MD3Vertices(m).MD3FrameVerts(f).MD3Verts(CIndex).Normal = Normals(NormalU, NormalV)


                ' Point 3 of triangle
                CIndex = MakeIndex
                ' x vertex
                MD3.MD3Vertices(m).MD3FrameVerts(f).MD3Verts(CIndex).Position.x = _
                    (MD3.MD3Meshes(m).MD3Frames(f).Frame(MD3.MD3Meshes(m).MD3Triangles(v).Triangles(2)).Vertices(0)) / 64
                ' y vertex
                MD3.MD3Vertices(m).MD3FrameVerts(f).MD3Verts(CIndex).Position.y = _
                    (MD3.MD3Meshes(m).MD3Frames(f).Frame(MD3.MD3Meshes(m).MD3Triangles(v).Triangles(2)).Vertices(1)) / 64
                ' z vertex
                MD3.MD3Vertices(m).MD3FrameVerts(f).MD3Verts(CIndex).Position.Z = _
                   (MD3.MD3Meshes(m).MD3Frames(f).Frame(MD3.MD3Meshes(m).MD3Triangles(v).Triangles(2)).Vertices(2)) / 64
                ' texture-coordinate
                MD3.MD3Vertices(m).MD3FrameVerts(f).MD3Verts(CIndex).Texture = _
                    MD3.MD3Meshes(m).MD3TexCoords(MD3.MD3Meshes(m).MD3Triangles(v).Triangles(2))
                ' normal
                NormalU = MD3.MD3Meshes(m).MD3Frames(f).Frame(MD3.MD3Meshes(m).MD3Triangles(v).Triangles(2)).Normal(0)
                NormalV = MD3.MD3Meshes(m).MD3Frames(f).Frame(MD3.MD3Meshes(m).MD3Triangles(v).Triangles(2)).Normal(1)
                MD3.MD3Vertices(m).MD3FrameVerts(f).MD3Verts(CIndex).Normal = Normals(NormalU, NormalV)


                ' Point 2 of triangle
                CIndex = MakeIndex
                ' x vertex
                MD3.MD3Vertices(m).MD3FrameVerts(f).MD3Verts(CIndex).Position.x = _
                    (MD3.MD3Meshes(m).MD3Frames(f).Frame(MD3.MD3Meshes(m).MD3Triangles(v).Triangles(1)).Vertices(0)) / 64
                ' y vertex
                MD3.MD3Vertices(m).MD3FrameVerts(f).MD3Verts(CIndex).Position.y = _
                    (MD3.MD3Meshes(m).MD3Frames(f).Frame(MD3.MD3Meshes(m).MD3Triangles(v).Triangles(1)).Vertices(1)) / 64
                ' z vertex
                MD3.MD3Vertices(m).MD3FrameVerts(f).MD3Verts(CIndex).Position.Z = _
                   (MD3.MD3Meshes(m).MD3Frames(f).Frame(MD3.MD3Meshes(m).MD3Triangles(v).Triangles(1)).Vertices(2)) / 64
                ' texture-coordinate
                MD3.MD3Vertices(m).MD3FrameVerts(f).MD3Verts(CIndex).Texture = _
                    MD3.MD3Meshes(m).MD3TexCoords(MD3.MD3Meshes(m).MD3Triangles(v).Triangles(1))
                ' normal
                NormalU = MD3.MD3Meshes(m).MD3Frames(f).Frame(MD3.MD3Meshes(m).MD3Triangles(v).Triangles(1)).Normal(0)
                NormalV = MD3.MD3Meshes(m).MD3Frames(f).Frame(MD3.MD3Meshes(m).MD3Triangles(v).Triangles(1)).Normal(1)
                MD3.MD3Vertices(m).MD3FrameVerts(f).MD3Verts(CIndex).Normal = Normals(NormalU, NormalV)

        Next v
    Next f
Next m

PrepareVertexBuffers MD3
End Sub

Private Sub PrepareVertexBuffers(ByRef MD3 As udtMD3Model)
' Loop for the number of meshes
For m = 0 To MD3.MD3Header.NumOfMeshes - 1
    
    ' Dynamically redimesion the vertex buffer array.
    ReDim MD3.MD3Meshes(m).MD3VertexBuffer(MD3.MD3Meshes(m).MD3MeshHeader.NumOfMeshFrames - 1)
    
    ' Loop for the number of frames this mesh
    For f = 0 To MD3.MD3Meshes(m).MD3MeshHeader.NumOfMeshFrames - 1

        ' create the D3D vertex buffer
        Set MD3.MD3Meshes(m).MD3VertexBuffer(f) = D3Ddevice.CreateVertexBuffer _
        (MDLVERTEX_SIZE * (MD3.MD3Meshes(m).MD3MeshHeader.NumOfTriangle * 3), _
         D3DUSAGE_WRITEONLY, MDLVERTEX_FVF, D3DPOOL_MANAGED)
        
        ' fill the vertex buffer with the triangle data
        D3DVertexBuffer8SetData MD3.MD3Meshes(m).MD3VertexBuffer(f), 0, _
        MDLVERTEX_SIZE * (MD3.MD3Meshes(m).MD3MeshHeader.NumOfTriangle * 3), _
        0, MD3.MD3Vertices(m).MD3FrameVerts(f).MD3Verts(0)

    Next f
Next m
End Sub

Private Function MakeIndex() As Long
MakeIndex = VIndex
VIndex = VIndex + 1
End Function

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -