1 /*
2  * HLLib
3  * Copyright (C) 2006-2010 Ryan Gregg
4 
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2.1 of the License, or (at your option) any later
9  * version.
10  */
11 
12 #ifndef BSPFILE_H
13 #define BSPFILE_H
14 
15 #include "stdafx.h"
16 #include "Package.h"
17 
18 #define HL_BSP_LUMP_COUNT 15
19 
20 namespace HLLib
21 {
22 	class HLLIB_API CBSPFile : public CPackage
23 	{
24 	private:
25 		#pragma pack(1)
26 
27 		struct BSPLump
28 		{
29 			hlUInt uiOffset;
30 			hlUInt uiLength;
31 		};
32 
33 		struct BSPHeader
34 		{
35 			hlUInt uiVersion;
36 			BSPLump lpLumps[HL_BSP_LUMP_COUNT];
37 		};
38 
39 		struct BSPTextureHeader
40 		{
41 			hlUInt uiTextureCount;
42 			hlUInt lpOffsets[1];
43 		};
44 
45 		struct BSPTexture
46 		{
47 			hlChar lpName[16];
48 			hlUInt uiWidth;
49 			hlUInt uiHeight;
50 			hlUInt lpOffsets[4];
51 		};
52 
53 		#pragma pack()
54 
55 	private:
56 		static const char *lpAttributeNames[];
57 		static const char *lpItemAttributeNames[];
58 
59 		Mapping::CView *pHeaderView;
60 		Mapping::CView *pTextureView;
61 
62 		const BSPHeader *pHeader;
63 		const BSPTextureHeader *pTextureHeader;
64 
65 	public:
66 		CBSPFile();
67 		virtual ~CBSPFile();
68 
69 		virtual HLPackageType GetType() const;
70 		virtual const hlChar *GetExtension() const;
71 		virtual const hlChar *GetDescription() const;
72 
73 	protected:
74 		virtual hlBool MapDataStructures();
75 		virtual hlVoid UnmapDataStructures();
76 
77 		virtual CDirectoryFolder *CreateRoot();
78 
79 		virtual hlUInt GetAttributeCountInternal() const;
80 		virtual const hlChar *GetAttributeNameInternal(HLPackageAttribute eAttribute) const;
81 		virtual hlBool GetAttributeInternal(HLPackageAttribute eAttribute, HLAttribute &Attribute) const;
82 
83 		virtual hlUInt GetItemAttributeCountInternal() const;
84 		virtual const hlChar *GetItemAttributeNameInternal(HLPackageAttribute eAttribute) const;
85 		virtual hlBool GetItemAttributeInternal(const CDirectoryItem *pItem, HLPackageAttribute eAttribute, HLAttribute &Attribute) const;
86 
87 		virtual hlBool GetFileSizeInternal(const CDirectoryFile *pFile, hlUInt &uiSize) const;
88 		virtual hlBool GetFileSizeOnDiskInternal(const CDirectoryFile *pFile, hlUInt &uiSize) const;
89 
90 		virtual hlBool CreateStreamInternal(const CDirectoryFile *pFile, Streams::IStream *&pStream) const;
91 		virtual hlVoid ReleaseStreamInternal(Streams::IStream &Stream) const;
92 
93 	private:
94 		hlVoid GetFileName(hlChar *lpBuffer, hlUInt uiBufferSize);
95 
96 		hlBool GetLumpInfo(const CDirectoryFile &File, hlUInt &uiWidth, hlUInt &uiHeight, hlUInt &uiPaletteSize, hlUInt uiMipmap = 0) const;
97 		hlBool GetLumpInfo(const CDirectoryFile &File, hlUInt &uiWidth, hlUInt &uiHeight, hlUInt &uiPaletteSize, const hlByte *&lpPalette, const hlByte *&lpPixels, hlUInt uiMipmap = 0) const;
98 	};
99 }
100 
101 #endif
102