Yurich » 07.10.2004 (Чт) 19:05
Принципиально задача решабельная, но с упорами. Если внимательно смотреть мои примеры по анимации, то там видно, что меш грузится в память в порядке:
Select Case MainData.GetType()
Case "TID_D3DRMMesh"
Set ChildXMesh = New XMesh
ChildXMesh.CreateMeshFromData MainData
...
End Select
Public Sub CreateMeshFromData(ParentData As DirectXFileData)
Set Mesh = D3DX.LoadMeshFromXof(ParentData, _
D3DXMESH_MANAGED, D3DDevice, _
RetBuffer, MtrlBuffer, MaterialsCount)
InitMaterials
End Sub
Для решения задачи Sub CreateMeshFromData надо будет досконально переработать, или дополнить существующую (т.к. она грузит меш фрейма только целиком, без деталей). А до этого посмотреть х-файл в текстовом виде, например, такой кусочек:
Frame x3ds_Cylinder01 {
FrameTransformMatrix {
1.000000, 0.000000, 0.000000, 0.000000, ' тут должно быть понятно
...
}
Mesh Cylinder01 { ' непосредственно меш
43; ' колич. вертексов
0.000000; 0.000000; 0.000000;, ' кординаты вертексов
...
72; ' колич. полигонов
3;0,1,2;, ' индексы вертексов в полигонах
...
MeshMaterialList {
1; ' КОЛИЧЕСТВО материалов в меше!
72; ' колич. полигонов
0, ' ВОТ ОН, индекс материала для полигона!
...
{x3ds_mat_x2_-_Default} ' имя материала
' дальше идут номали и всяк не нужный здесь мусор
}
}
}
А теперь сам процесс загрузки. Извините за возможные ошибки, пишу сходу, без проверки:
Dim FrameName As String
Dim VertNumbers As Long
Type Vert
x As Long
y As Long
z As Long
End Type
Dim Vertices() As Long
Dim PolygonNumbers as Long
Type Polygon
VertNum As Long
Vi1 As Long
Vi2 As Long
Vi3 As Long
End Type
Dim Poly() As Polygon
Dim MaterialsCount As Long
Dim PolyMatIndex() As Long
Public Sub CreateMeshFromData(ParentData As DirectXFileData)
Dim S as Long
Dim ChildData As DirectxFileData
FrameName=ParentData.GetName()
ParentData.GetDataFromOffset "", 0, 4, VertNumbers
Redim Vertices(VertNumbers)
S= Len(Vertices(0)* VertNumbers
ParentData.GetDataFromOffset "", 4, S, Vertices(0)
S=S+4
ParentData.GetDataFromOffset "", S, 4, PolygonNumbers
Redim Poly(PolygonNumbers)
ParentData.GetDataFromOffset "", S+4, Len(Poly(0))*PolygonNumbers, Poly(0)
' Это были только полигоны и вертксы, дальше индексы материалов
do
Set ChildData = ParentData.GetNextObject()
If ChildData is Nothing Then Exit Sub
If ChildData.GetType="TID_D3DRMMeshMaterialList" Then
GetMatIndex ParentData
End If
loop
End Sub
Private Sub GetMatIndex(ParentData As DirectXFileData)
ParentData.GetDataFromOffset "", 0, 4, MaterialsCount
ReDim PolyMatIndex(MaterialsCount)
ParentData.GetDataFromOffset "", 0, 4 * MaterialsCount, PolyMatIndex(0)
End Sub
Теперь у Вас есть все, что надо, Применяйте!