diff Engine/LOD.h @ 2499:68cdef6879a0

engine folder
author Ritor1
date Fri, 19 Sep 2014 02:57:42 +0600
parents
children d87bfbd3bb3b
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Engine/LOD.h	Fri Sep 19 02:57:42 2014 +0600
@@ -0,0 +1,332 @@
+#pragma once
+#include <stdio.h>
+#include <memory.h>
+#include <cstdint>
+
+#include "Engine/Graphics/Texture.h"
+
+class Sprite;
+
+
+#define MAX_LOD_TEXTURES 1000
+#define MAX_LOD_SPRITES  1500
+
+/*  354 */
+enum TEXTURE_TYPE
+{
+  TEXTURE_DEFAULT = 0,
+  TEXTURE_24BIT_PALETTE = 0x1,
+  TEXTURE_16BIT_PALETTE = 0x2,
+};
+
+namespace LOD
+{
+  #pragma pack(push, 1)
+  struct FileHeader
+  {
+    //----- (004617B6) --------------------------------------------------------
+    inline FileHeader()
+    {
+      memset(pSignature, 0, 4);
+	  memset(LodVersion, 0, 80);
+      memset(LodDescription, 0, 80);
+      memset(array_0000B0, 0, 28);
+      memset(array_0000CC, 0, 52);
+
+      pSignature[0] = 0;
+      LodVersion[0] = 0;
+      LodDescription[0] = 0;
+      LODSize = 0;
+      dword_0000A8 = 0;
+      uNumIndices = 0;
+    }
+
+    char pSignature[4];
+    char LodVersion[80];
+    //char field_C[32];
+    //char field_2C[40];
+    char LodDescription[80];
+    int LODSize;
+    int dword_0000A8;
+    unsigned int uNumIndices;
+    char array_0000B0[28];
+    char array_0000CC[52];
+  };
+  #pragma pack(pop)
+
+
+  #pragma pack(push, 1)
+  struct Directory
+  {
+    Directory();
+
+    char pFilename[15];
+    char field_F;
+    unsigned int uOfsetFromSubindicesStart;
+    unsigned int uDataSize;
+    int dword_000018;
+    unsigned __int16 uNumSubIndices;
+    __int16 word_00001E;
+  };
+  #pragma pack(pop)
+
+
+  #pragma pack(push, 1)
+  struct File
+  {
+    File();
+    virtual ~File();
+    void *LoadRaw(const char *pContainer, int a3);
+    FILE *FindContainer(const char *pContainerName, bool bLinearSearch);
+    bool DoesContainerExist(const char *pContainer);
+    int CalcIndexFast(int startIndex, int maxIndex, const char *pContainerName);
+    bool LoadHeader(const char *pFilename, bool bWriting);
+    int LoadSubIndices(const char *pContainer);
+    void AllocSubIndicesAndIO(unsigned int uNumSubIndices, unsigned int uBufferSize);
+    void FreeSubIndexAndIO();
+    bool AppendDirectory(LOD::Directory *pDir, const void *pData);
+    void ResetSubIndices();
+    void Close();
+
+    FILE *pFile;
+    char pLODName[256];
+    bool isFileOpened;
+    unsigned __int8 *pIOBuffer;
+    unsigned int uIOBufferSize;
+    struct FileHeader header;
+    struct Directory *pRoot;
+    char pContainerName[16];
+    unsigned int uCurrentIndexDir;
+    unsigned int uLODDataSize;
+    unsigned int uNumSubDirs;
+    struct Directory *pSubIndices;
+    unsigned int uOffsetToSubIndex;
+    FILE *pOutputFileHandle;
+  };
+  #pragma pack(pop)
+};
+
+
+
+
+
+
+/*    6 */
+#pragma pack(push, 1)
+struct LODWriteableFile: public LOD::File
+{
+  bool LoadFile(const char *pFilename, bool bWriting);
+  unsigned int Write(const LOD::Directory *pDir, const void *pDirData, int a4);
+  void CloseWriteFile();
+  int CreateTempFile();
+  int FixDirectoryOffsets();
+  bool _4621A7();
+  int CreateNewLod(LOD::FileHeader *pHeader, LOD::Directory *pDir, const char *Source);
+
+  /*FILE *pFile;
+  char pLODName[256];
+  unsigned int isFileOpened;
+  unsigned __int8 *pIOBuffer;
+  unsigned int uIOBufferSize;
+  struct LOD::FileHeader header;
+  struct LOD::Directory *pRoot;
+  unsigned __int8 pContainerName[16];
+  unsigned int uCurrentIndexDir;
+  unsigned int uLODDataSize;
+  unsigned int uNumSubIndices;
+  struct LOD::Directory *pSubIndices;
+  unsigned int uOffsetToSubIndex;
+  FILE *pOutputFileHandle;*/
+};
+#pragma pack(pop)
+
+
+
+
+#pragma pack(push, 1)
+struct LODFile_IconsBitmaps: public LOD::File
+{
+  LODFile_IconsBitmaps();
+  virtual ~LODFile_IconsBitmaps();
+  void SyncLoadedFilesCount();
+  unsigned int FindTextureByName(const char *pName);
+  bool Load(const char *pFilename, const char *pFolderName);
+  void ReleaseAll();
+  unsigned int LoadTexture(const char *pContainer, enum TEXTURE_TYPE uTextureType = TEXTURE_DEFAULT);
+  struct Texture *LoadTexturePtr(const char *pContainer, enum TEXTURE_TYPE uTextureType = TEXTURE_DEFAULT);
+  int LoadTextureFromLOD(struct Texture *pOutTex, const char *pContainer, enum TEXTURE_TYPE eTextureType);
+  int ReloadTexture(struct Texture *pDst, const char *pContainer, int mode);
+  void ReleaseHardwareTextures();
+  void ReleaseLostHardwareTextures();
+  void _410423_move_textures_to_device();
+  int _410522(struct Texture *pDst, const char *pContainer, unsigned int uTextureType);
+  void SetupPalettes(unsigned int uTargetRBits, unsigned int uTargetGBits, unsigned int uTargetBBits);
+  void ReleaseAll2();
+  void RemoveTexturesPackFromTextureList();
+  void RemoveTexturesFromTextureList();
+  void _inlined_sub0();
+  void _inlined_sub1();
+  void _inlined_sub2();
+
+  inline int LoadDummyTexture()
+  {
+    for (unsigned int i = 0; i < uNumLoadedFiles; ++i)
+      if (!strcmp(pTextures[i].pName, "pending"))
+        return i;
+    return LoadTextureFromLOD(&pTextures[uNumLoadedFiles], "pending", TEXTURE_16BIT_PALETTE);
+  }
+
+  Texture *GetTexture(int idx);
+
+
+  /*FILE *pFile;
+  unsigned __int8 pLODName[256];
+  unsigned int isFileOpened;
+  unsigned __int8 *pIOBuffer;
+  unsigned int uIOBufferSize;
+  struct LOD::FileHeader header;
+  struct LOD::Directory *pRoot;
+  unsigned __int8 pContainerName[16];
+  unsigned int uCurrentIndexDir;
+  unsigned int uLODDataSize;
+  unsigned int uNumSubIndices;
+  struct LOD::Directory *pSubIndices;
+  unsigned int uOffsetToSubIndex;
+  FILE *pOutputFileHandle;*/
+  Texture pTextures[MAX_LOD_TEXTURES];
+  unsigned int uNumLoadedFiles;
+  int dword_11B80;
+  int dword_11B84;
+  int dword_11B88;
+  int uTextureRedBits;
+  int uTextureGreenBits;
+  int uTextureBlueBits;
+  int uNumPrevLoadedFiles;
+  int uTexturePacksCount;
+  int pFacesLock;
+  int dword_011BA4;
+  //int can_load_hardware_sprites;
+  struct IDirectDrawSurface **pHardwareSurfaces;
+  struct IDirect3DTexture2 **pHardwareTextures;
+  char *ptr_011BB4;
+};
+#pragma pack(pop)
+
+
+
+
+
+
+#pragma pack(push, 1)
+struct LODSprite
+{
+  //----- (0046244C) --------------------------------------------------------
+  inline LODSprite()
+  {
+    uHeight = 0;
+    uPaletteId = 0;
+    word_1A = 0;
+    pSpriteLines = nullptr;
+    pDecompressedBytes = nullptr;
+  }
+  ~LODSprite();
+
+  void Release();
+  int DrawSprite_sw(struct RenderBillboardTransform_local0 *a2, char a3);
+  int _4AD2D1(struct RenderBillboardTransform_local0 *a2, int a3);
+  
+  char pName[12]; //0
+  int uSpriteSize; //C
+  __int16 uWidth; //10
+  __int16 uHeight; //12
+  __int16 uPaletteId; //14
+  __int16 word_16;  //16
+  __int16 uTexturePitch; //18
+  __int16 word_1A; //1a
+  int uDecompressedSize;  //1c
+  struct LODSprite_stru0 *pSpriteLines; //20
+  void *pDecompressedBytes;  //24
+};
+#pragma pack(pop)
+
+/*   15 */
+#pragma pack(push, 1)
+struct LODFile_Sprites: public LOD::File
+{
+  LODFile_Sprites();
+  virtual ~LODFile_Sprites();
+
+  void DeleteSomeSprites();
+  void DeleteSpritesRange(int uStartIndex, int uStopIndex);
+  int _461397();
+  void DeleteSomeOtherSprites();
+  int LoadSpriteFromFile(LODSprite *pSpriteHeader, const char *pContainer);
+  bool LoadSprites(const char *pFilename);
+  int LoadSprite(const char *pContainerName, unsigned int uPaletteID);
+  void ReleaseLostHardwareSprites();
+  void ReleaseAll();
+  void MoveSpritesToVideoMemory();
+  void _inlined_sub0();
+  void _inlined_sub1();
+
+
+  /*FILE *pFile;
+  unsigned __int8 pLODName[256];
+  unsigned int isFileOpened;
+  unsigned __int8 *pIOBuffer;
+  unsigned int uIOBufferSize;
+  struct LOD::FileHeader header;
+  struct LOD::Directory *pRoot;
+  unsigned __int8 pContainerName[16];
+  unsigned int uCurrentIndexDir;
+  unsigned int uLODDataSize;
+  unsigned int uNumSubIndices;
+  struct LOD::Directory *pSubIndices;
+  unsigned int uOffsetToSubIndex;
+  FILE *pOutputFileHandle;*/
+  struct LODSprite pSpriteHeaders[MAX_LOD_SPRITES];
+  signed int uNumLoadedSprites;
+  int field_ECA0;
+  int field_ECA4;
+  int field_ECA8;
+  //int can_load_hardware_sprites;
+  Sprite *pHardwareSprites;
+  int field_ECB4;
+};
+#pragma pack(pop)
+
+/*   17 */
+#pragma pack(push, 1)
+struct LODSprite_stru0
+{
+  int16_t a1;
+  int16_t a2;
+  char* pos;
+};
+#pragma pack(pop)
+
+
+
+
+extern LODFile_IconsBitmaps *pEvents_LOD;
+
+extern LODFile_IconsBitmaps *pIcons_LOD;
+extern LODFile_IconsBitmaps *pIcons_LOD_mm6;
+extern LODFile_IconsBitmaps *pIcons_LOD_mm8;
+
+extern LODFile_IconsBitmaps *pBitmaps_LOD;
+extern LODFile_IconsBitmaps *pBitmaps_LOD_mm6;
+extern LODFile_IconsBitmaps *pBitmaps_LOD_mm8;
+
+extern LODFile_Sprites *pSprites_LOD;
+extern LODFile_Sprites *pSprites_LOD_mm6;
+extern LODFile_Sprites *pSprites_LOD_mm8;
+
+extern LODWriteableFile *pNew_LOD;
+extern LODWriteableFile *pGames_LOD;
+
+
+
+
+extern int _6A0CA4_lod_binary_search; // weak
+extern int _6A0CA8_lod_unused; // weak
\ No newline at end of file