📄 modmd3helper.bas
字号:
' 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 + -