LZScene

Форк
0
/
GLFileX.pas 
160 строк · 5.0 Кб
1
//
2
// This unit is part of the GLScene Engine https://github.com/glscene
3
//
4
{
5
   Simple X format support for Delphi (Microsoft's favorite format)
6
   
7
    History :  
8
       07/11/09 - DaStr - Initial version (Added from the GLScene-Lazarus SVN)
9
    
10

11

12
    Previous version history :  
13
      $Log$
14
      Revision 1.1  2009/11/07 22:12:25  da_stranger
15
      Initial version (Added from the GLScene-Lazarus SVN)
16

17
      Revision 1.1  2006/01/10 20:50:44  z0m3ie
18
      recheckin to make shure that all is lowercase
19

20
      Revision 1.1  2006/01/09 21:02:31  z0m3ie
21
      *** empty log message ***
22

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
25

26
      Revision 1.2  2005/08/03 00:41:38  z0m3ie
27
      - added automatical generated History from CVS
28
    
29
}
30

31
unit GLFileX;
32

33
interface
34

35
{$I GLScene.inc}
36

37
uses
38
  // VCL
39
  Classes, SysUtils,
40

41
  GLVectorFileObjects, GLApplicationFileIO, GLVectorGeometry, GLTexture,
42
  GLVectorLists, GLMaterial,
43

44
  // Misc
45
  FileX;
46

47
type
48
  TGLXVectorFile = class (TGLVectorFile)
49
    public
50
       
51
      class function Capabilities: TGLDataFileCapabilities; override;
52
      procedure LoadFromStream(aStream : TStream); override;
53
  end;
54

55
implementation
56

57
class function TGLXVectorFile.Capabilities : TGLDataFileCapabilities;
58
begin
59
   Result := [dfcRead];
60
end;
61

62
procedure TGLXVectorFile.LoadFromStream(aStream: TStream);
63
var
64
  DXFile : TDXFile;
65

66
  procedure RecursDXFile(DXNode : TDXNode);
67
  var
68
    i,j,k,l,vertcount : integer;
69
    mo : TGLMeshObject;
70
    mat : TMatrix;
71
    libmat : TGLLibMaterial;
72
    fg : TFGVertexNormalTexIndexList;
73
    str : String;
74
  begin
75
    mat:=IdentityHMGMatrix;
76
    if Assigned(DXNode.Owner) then
77
      if DXNode.Owner is TDXFrame then begin
78
        mat:=TDXFrame(DXNode.Owner).GlobalMatrix;
79
        TransposeMatrix(mat);
80
      end;
81

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);
90

91
      if TDXMesh(DXNode).MaterialList.Count>0 then begin
92
        // Add the materials
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)
98
            else
99
              libmat:=Owner.MaterialLibrary.Materials.Add;
100

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);
107
            end;
108
          end;
109
        end;
110

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]);
116
        end;
117

118
        // Now add the indices per material
119
        vertcount:=0;
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])
130
            end;
131
            vertcount:=vertcount+k;
132
          end;
133
        end;
134

135
      end else begin
136
        fg:=TFGVertexNormalTexIndexList.CreateOwned(mo.FaceGroups);
137
        fg.NormalIndices.Assign(TDXMesh(DXNode).NormalIndices);
138
        fg.VertexIndices.Assign(TDXMesh(DXNode).VertexIndices);
139
      end;
140

141
    end;
142

143
    for i:=0 to DXNode.Count-1 do
144
      RecursDXFile(TDXNode(DXNode[i]));
145
  end;
146

147
begin
148
  DXFile:=TDXFile.Create;
149
  try
150
    DXFile.LoadFromStream(aStream);
151
    RecursDXFile(DXFile.RootNode);
152
  finally
153
    DXFile.Free;
154
  end;
155
end;
156

157
initialization
158
  RegisterVectorFileFormat('x', 'DirectX Model files', TGLXVectorFile);
159

160
end.
161

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.