2
// This unit is part of the GLScene Engine https://github.com/glscene
5
Simple X format support for Delphi (Microsoft's favorite format)
8
07/11/09 - DaStr - Initial version (Added from the GLScene-Lazarus SVN)
12
Previous version history :
14
Revision 1.1 2009/11/07 22:12:25 da_stranger
15
Initial version (Added from the GLScene-Lazarus SVN)
17
Revision 1.1 2006/01/10 20:50:44 z0m3ie
18
recheckin to make shure that all is lowercase
20
Revision 1.1 2006/01/09 21:02:31 z0m3ie
21
*** empty log message ***
23
Revision 1.3 2005/12/04 16:53:04 z0m3ie
24
renamed everything to lowercase to get better codetools support and avoid unit finding bugs
26
Revision 1.2 2005/08/03 00:41:38 z0m3ie
27
- added automatical generated History from CVS
41
GLVectorFileObjects, GLApplicationFileIO, GLVectorGeometry, GLTexture,
42
GLVectorLists, GLMaterial,
48
TGLXVectorFile = class (TGLVectorFile)
51
class function Capabilities: TGLDataFileCapabilities; override;
52
procedure LoadFromStream(aStream : TStream); override;
57
class function TGLXVectorFile.Capabilities : TGLDataFileCapabilities;
62
procedure TGLXVectorFile.LoadFromStream(aStream: TStream);
66
procedure RecursDXFile(DXNode : TDXNode);
68
i,j,k,l,vertcount : integer;
71
libmat : TGLLibMaterial;
72
fg : TFGVertexNormalTexIndexList;
75
mat:=IdentityHMGMatrix;
76
if Assigned(DXNode.Owner) then
77
if DXNode.Owner is TDXFrame then begin
78
mat:=TDXFrame(DXNode.Owner).GlobalMatrix;
82
if DXNode is TDXMesh then begin
83
mo:=TGLMeshObject.CreateOwned(Owner.MeshObjects);
84
mo.Mode:=momFaceGroups;
85
mo.Vertices.Assign(TDXMesh(DXNode).Vertices);
86
mo.Vertices.TransformAsPoints(mat);
87
mo.Normals.Assign(TDXMesh(DXNode).Normals);
88
mo.Normals.TransformAsVectors(mat);
89
mo.TexCoords.Assign(TDXMesh(DXNode).TexCoords);
91
if TDXMesh(DXNode).MaterialList.Count>0 then begin
93
if (Owner.UseMeshMaterials) and Assigned(Owner.MaterialLibrary) then begin
94
for i:=0 to TDXMesh(DXNode).MaterialList.Count-1 do begin
95
Str:=TDXMesh(DXNode).MaterialList.Items[i].Texture;
96
if FileExists(Str) then
97
libmat:=Owner.MaterialLibrary.AddTextureMaterial('', Str)
99
libmat:=Owner.MaterialLibrary.Materials.Add;
101
libmat.Name:=Format('%s_%d',[DXNode.Name,i]);
102
with libmat.Material.FrontProperties do begin
103
Diffuse.Color:=TDXMesh(DXNode).MaterialList.Items[i].Diffuse;
104
Shininess:=Round(TDXMesh(DXNode).MaterialList.Items[i].SpecPower/2);
105
Specular.Color:=VectorMake(TDXMesh(DXNode).MaterialList.Items[i].Specular);
106
Emission.Color:=VectorMake(TDXMesh(DXNode).MaterialList.Items[i].Emissive);
111
// Add the facegroups (separate since material library
112
// can be unassigned)
113
for i:=0 to TDXMesh(DXNode).MaterialList.Count-1 do begin
114
fg:=TFGVertexNormalTexIndexList.CreateOwned(mo.FaceGroups);
115
fg.MaterialName:=Format('%s_%d',[DXNode.Name,i]);
118
// Now add the indices per material
120
for i:=0 to TDXMesh(DXNode).VertCountIndices.Count-1 do begin
121
if (i<TDXMesh(DXNode).MaterialIndices.Count) then begin
122
j:=TDXMesh(DXNode).MaterialIndices[i];
123
k:=TDXMesh(DXNode).VertCountIndices[i];
124
for l:=vertcount to vertcount+k-1 do begin
125
TFGVertexNormalTexIndexList(mo.FaceGroups[j]).VertexIndices.Add(TDXMesh(DXNode).VertexIndices[l]);
126
if mo.TexCoords.Count>0 then
127
TFGVertexNormalTexIndexList(mo.FaceGroups[j]).TexCoordIndices.Add(TDXMesh(DXNode).VertexIndices[l]);
128
if TDXMesh(DXNode).NormalIndices.Count>0 then
129
TFGVertexNormalTexIndexList(mo.FaceGroups[j]).NormalIndices.Add(TDXMesh(DXNode).NormalIndices[l])
131
vertcount:=vertcount+k;
136
fg:=TFGVertexNormalTexIndexList.CreateOwned(mo.FaceGroups);
137
fg.NormalIndices.Assign(TDXMesh(DXNode).NormalIndices);
138
fg.VertexIndices.Assign(TDXMesh(DXNode).VertexIndices);
143
for i:=0 to DXNode.Count-1 do
144
RecursDXFile(TDXNode(DXNode[i]));
148
DXFile:=TDXFile.Create;
150
DXFile.LoadFromStream(aStream);
151
RecursDXFile(DXFile.RootNode);
158
RegisterVectorFileFormat('x', 'DirectX Model files', TGLXVectorFile);