2
// This unit is part of the GLScene Engine https://github.com/glscene
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).
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
24
Classes, GLVectorFileObjects, GLVectorGeometry, GLApplicationFileIO,
25
FileOCT, intfgraphics;
31
{ The OCT vector file (FSRad output). }
32
TGLOCTGLVectorFile = class(TGLVectorFile)
35
class function Capabilities: TGLDataFileCapabilities; override;
37
procedure LoadFromStream(aStream: TStream); override;
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)
48
// ------------------------------------------------------------------
49
// ------------------------------------------------------------------
50
// ------------------------------------------------------------------
52
// ------------------------------------------------------------------
53
// ------------------------------------------------------------------
54
// ------------------------------------------------------------------
57
SysUtils, GLTexture, GLMaterial, GLGraphics, GLCrossPlatform, GLState,
58
GLUtils, GLTextureFormat;
61
// ------------------ TGLOCTGLVectorFile ------------------
66
class function TGLOCTGLVectorFile.Capabilities: TGLDataFileCapabilities;
73
procedure TGLOCTGLVectorFile.LoadFromStream(aStream: TStream);
78
octLightmap: POCTLightmap;
80
fg: TFGVertexIndexList;
81
lightmapLib: TGLMaterialLibrary;
82
lightmapBmp: TGLBitmap;
83
lightbitInfo: TLazIntfImage;
84
libMat: TGLLibMaterial;
86
oct := TOCTFile.Create(aStream);
88
mo := TGLMeshObject.CreateOwned(Owner.MeshObjects);
89
mo.Mode := momFaceGroups;
91
lightmapLib := Owner.LightmapLibrary;
92
if (Assigned(lightmapLib)) and (vGLFileOCTAllocateMaterials) then
95
n := oct.Header.numLightmaps;
96
lightmapBmp := TGLBitmap.Create;
98
lightmapBmp.PixelFormat := glpf24bit;
99
lightmapBmp.Width := 128;
100
lightmapBmp.Height := 128;
101
for i := 0 to n - 1 do
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);
110
if vGLFileOCTLightmapGammaCorrection <> 1.0 then
111
GammaCorrectRGBArray(@octLightmap.map,
112
lightmapBmp.Width * lightmapBmp.Height,
113
vGLFileOCTLightmapGammaCorrection);
114
// convert RAW RGB to BMP
116
lightbitInfo := TLazIntfImage.Create(lightmapBmp.RawImage, True);
120
Move(octLightmap.map[y * 128 * 3],
121
lightbitInfo.GetDataLineStart(127 - y)^, 128 * 3);
124
libMat := lightmapLib.AddTextureMaterial(IntToStr(i), lightmapBmp);
125
with libMat.Material.Texture do
127
MinFilter := miLinear;
128
TextureWrap := twNone;
129
TextureFormat := tfRGB;
138
n := oct.Header.numVerts;
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
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);
151
n := oct.Header.numFaces;
152
for i := 0 to n - 1 do
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;
167
// ------------------------------------------------------------------
168
// ------------------------------------------------------------------
169
// ------------------------------------------------------------------
171
// ------------------------------------------------------------------
172
// ------------------------------------------------------------------
173
// ------------------------------------------------------------------
175
RegisterVectorFileFormat('oct', 'FSRad OCT files', TGLOCTGLVectorFile);