LZScene

Форк
0
/
GLFileOCT.pas 
177 строк · 5.7 Кб
1
//
2
// This unit is part of the GLScene Engine https://github.com/glscene
3
//
4
{
5
    Support-code to load OCT Files into TGLFreeForm-Components in GLScene. 
6
    (OCT being the format output from FSRad, http://www.fluidstudios.com/fsrad.html).
7

8
   History :  
9
       19/06/11 - Yar - Fixed problem with image converting in Lazarus (thanks to Johannes Pretorius, Bugtracker ID = 3322324)
10
       22/01/10 - Yar - Added GLTextureFormat to uses
11
       31/03/07 - DaStr - Added $I GLScene.inc
12
       19/09/03 - EG - "Lighmap" -> "LightMap"
13
       06/05/03 - mrqzzz - added Gamma and Brightness correction variables (vGLFileOCTLightmapBrightness, vGLFileOCTLightmapGammaCorrection)
14
       02/02/03 - EG     - Creation
15
    
16
}
17
unit GLFileOCT;
18

19
interface
20

21
{$I GLScene.inc}
22

23
uses
24
  Classes, GLVectorFileObjects, GLVectorGeometry, GLApplicationFileIO,
25
  FileOCT, intfgraphics;
26

27
type
28

29
  // TGLOCTGLVectorFile
30

31
  { The OCT vector file (FSRad output). }
32
  TGLOCTGLVectorFile = class(TGLVectorFile)
33
  public
34
     
35
    class function Capabilities: TGLDataFileCapabilities; override;
36

37
    procedure LoadFromStream(aStream: TStream); override;
38
  end;
39

40
var
41
  vGLFileOCTLightmapBrightness: single = 1;
42
  // Mrqzzz : scaling factor, 1.0 = unchanged
43
  vGLFileOCTLightmapGammaCorrection: single = 1;
44
  // Mrqzzz : scaling factor, 1.0 = unchanged
45
  vGLFileOCTAllocateMaterials: boolean = True;
46
// Mrqzzz : Flag to avoid loading materials (useful for IDE Extensions or scene editors)
47

48
// ------------------------------------------------------------------
49
// ------------------------------------------------------------------
50
// ------------------------------------------------------------------
51
implementation
52
// ------------------------------------------------------------------
53
// ------------------------------------------------------------------
54
// ------------------------------------------------------------------
55

56
uses
57
  SysUtils, GLTexture, GLMaterial, GLGraphics, GLCrossPlatform, GLState,
58
  GLUtils, GLTextureFormat;
59

60
// ------------------
61
// ------------------ TGLOCTGLVectorFile ------------------
62
// ------------------
63

64
// Capabilities
65

66
class function TGLOCTGLVectorFile.Capabilities: TGLDataFileCapabilities;
67
begin
68
  Result := [dfcRead];
69
end;
70

71
// LoadFromStream
72

73
procedure TGLOCTGLVectorFile.LoadFromStream(aStream: TStream);
74
var
75
  i, y, n: integer;
76
  oct: TOCTFile;
77
  octFace: POCTFace;
78
  octLightmap: POCTLightmap;
79
  mo: TGLMeshObject;
80
  fg: TFGVertexIndexList;
81
  lightmapLib: TGLMaterialLibrary;
82
  lightmapBmp: TGLBitmap;
83
  lightbitInfo: TLazIntfImage;
84
  libMat: TGLLibMaterial;
85
begin
86
  oct := TOCTFile.Create(aStream);
87
  try
88
    mo := TGLMeshObject.CreateOwned(Owner.MeshObjects);
89
    mo.Mode := momFaceGroups;
90

91
    lightmapLib := Owner.LightmapLibrary;
92
    if (Assigned(lightmapLib)) and (vGLFileOCTAllocateMaterials) then
93
    begin
94
      // import lightmaps
95
      n := oct.Header.numLightmaps;
96
      lightmapBmp := TGLBitmap.Create;
97
      try
98
        lightmapBmp.PixelFormat := glpf24bit;
99
        lightmapBmp.Width := 128;
100
        lightmapBmp.Height := 128;
101
        for i := 0 to n - 1 do
102
        begin
103
          octLightmap := @oct.Lightmaps[i];
104
          // Brightness correction
105
          if vGLFileOCTLightmapBrightness <> 1.0 then
106
            BrightenRGBArray(@octLightmap.map,
107
              lightmapBmp.Width * lightmapBmp.Height,
108
              vGLFileOCTLightmapBrightness);
109
          // Gamma correction
110
          if vGLFileOCTLightmapGammaCorrection <> 1.0 then
111
            GammaCorrectRGBArray(@octLightmap.map,
112
              lightmapBmp.Width * lightmapBmp.Height,
113
              vGLFileOCTLightmapGammaCorrection);
114
          // convert RAW RGB to BMP
115

116
          lightbitInfo := TLazIntfImage.Create(lightmapBmp.RawImage, True);
117

118
          for y := 0 to 127 do
119

120
            Move(octLightmap.map[y * 128 * 3],
121
              lightbitInfo.GetDataLineStart(127 - y)^, 128 * 3);
122

123
          // spawn lightmap
124
          libMat := lightmapLib.AddTextureMaterial(IntToStr(i), lightmapBmp);
125
          with libMat.Material.Texture do
126
          begin
127
            MinFilter := miLinear;
128
            TextureWrap := twNone;
129
            TextureFormat := tfRGB;
130
          end;
131
        end;
132
      finally
133
        lightmapBmp.Free;
134
      end;
135
    end;
136

137
    // import geometry
138
    n := oct.Header.numVerts;
139

140
    mo.Vertices.AdjustCapacityToAtLeast(n);
141
    mo.TexCoords.AdjustCapacityToAtLeast(n);
142
    mo.LightMapTexCoords.AdjustCapacityToAtLeast(n);
143
    for i := 0 to n - 1 do
144
      with oct.Vertices[i] do
145
      begin
146
        mo.Vertices.Add(pos.V[0], pos.V[1], pos.V[2]);
147
        mo.TexCoords.Add(tv.s, tv.t);
148
        mo.LightMapTexCoords.Add(lv.s, lv.t);
149
      end;
150
    // import faces
151
    n := oct.Header.numFaces;
152
    for i := 0 to n - 1 do
153
    begin
154
      octFace := @oct.Faces[i];
155
      fg := TFGVertexIndexList.CreateOwned(mo.FaceGroups);
156
      fg.Mode := fgmmTriangleFan;
157
      fg.VertexIndices.AddSerie(octFace.start, 1, octFace.num);
158
      if (Assigned(lightmapLib)) and (vGLFileOCTAllocateMaterials) then
159
        fg.LightMapIndex := octFace.lid;
160
    end;
161

162
  finally
163
    oct.Free;
164
  end;
165
end;
166

167
// ------------------------------------------------------------------
168
// ------------------------------------------------------------------
169
// ------------------------------------------------------------------
170
initialization
171
  // ------------------------------------------------------------------
172
  // ------------------------------------------------------------------
173
  // ------------------------------------------------------------------
174

175
  RegisterVectorFileFormat('oct', 'FSRad OCT files', TGLOCTGLVectorFile);
176

177
end.
178

179

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

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

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

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