diff Engine/Graphics/Indoor.h @ 2496:5abd8fc8f1c6

for ITEM_ARTIFACT_LADYS_ESCORT
author Ritor1
date Thu, 18 Sep 2014 17:38:54 +0600
parents
children 68cdef6879a0
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Engine/Graphics/Indoor.h	Thu Sep 18 17:38:54 2014 +0600
@@ -0,0 +1,921 @@
+#pragma once
+#include <array>
+
+#include "Render.h"
+#include "IndoorCameraD3D.h"
+#include "mm7_data.h"
+
+/*  358 */
+#pragma pack(push, 1)
+struct stru320
+{
+	int field_0;
+	Plane_int_ plane_4;
+	Vec3_int_ vec_14;
+	Vec3_int_ vec_20;
+	unsigned int uCurrentAmbientLightLevel;
+	int field_30;
+	int field_34;
+	int field_38;
+	int pDeltaUV[2];
+	int field_44;
+	int field_48;
+	char field_4C[8];
+	Vec3_int_ rotated_normal;
+	Vec3_int_ vec_60;
+	int field_6C;
+	Vec3_int_ vec_70;
+	int field_7C;
+	Vec3_int_ vec_80;
+	Vec3_int_ vec_8C;
+	int field_98;
+	Vec3_int_ vec_9C;
+	int field_A8;
+	unsigned int uNumLightsApplied;
+	int _blv_lights_radii[20];
+	int _blv_lights_inv_radii[20];
+	int _blv_lights_xs[20];
+	int _blv_lights_ys[20];
+	int _blv_lights_light_dot_faces[20];
+	int field_240;
+	int field_244;
+	int field_248;
+	int field_24C;
+	int field_250;
+	int field_254;
+	int field_258;
+	int field_25C;
+	int field_260;
+	int field_264;
+	int field_268;
+	int field_26C;
+	int field_270;
+	int field_274;
+	int field_278;
+	int field_27C;
+	int field_280;
+	int field_284;
+	int field_288;
+	int field_28C;
+	int _blv_lights_zs[20];
+	float _blv_lights_rs[20];
+	float _blv_lights_gs[20];
+	float _blv_lights_bs[20];
+	char _blv_lights_types[20];
+	int field_3E4;
+	int field_3E8;
+	int field_3EC;
+	int field_3F0;
+	int field_3F4;
+	unsigned int uDefaultAmbientLightLevel;
+};
+#pragma pack(pop)
+
+extern stru320 stru_F8AD28; // idb
+
+
+
+
+
+
+
+
+/*  345 */
+#pragma pack(push, 1)
+struct stru315
+{
+	int field_0;
+	int field_4;
+	int field_8;
+	int field_C;
+	int field_10;
+	int field_14;
+	int field_18;
+	int field_1C;
+	int field_20;
+	int field_24;
+	int field_28;
+	int field_2C;
+	int field_30;
+	unsigned __int16 *field_34_palette;
+	unsigned __int16 *pTextureLOD;
+	unsigned int *pDepthBuffer;
+	unsigned __int16 *pColorBuffer;
+};
+#pragma pack(pop)
+
+
+
+
+
+/*  346 */
+#pragma pack(push, 1)
+struct stru316
+{
+	int field_0;
+	int field_4;
+	int field_8;
+	int field_C;
+	int field_10;
+	int field_14;
+	int field_18;
+	int field_1C;
+	int field_20;
+	unsigned __int16 *field_24_palette;
+};
+#pragma pack(pop)
+
+
+
+
+
+
+/*  134 */
+#pragma pack(push, 1)
+struct stru141_actor_collision_object
+{
+	int _47050A(int a2);
+
+	int field_0;
+	int prolly_normal_d;
+	int field_8_radius;
+	int height;
+	int field_10;
+	int field_14;
+	int field_18;
+	Vec3_int_ velocity;
+	Vec3_int_ normal;
+	Vec3_int_ position;
+	Vec3_int_ normal2;
+	int field_4C;
+	int field_50;
+	int field_54;
+	Vec3_int_ direction; // velocity's unit vector
+	int speed;
+	int inv_speed;
+	int field_6C;
+	int field_70;
+	unsigned int uSectorID;
+	unsigned int uFaceID;
+	int field_7C;
+	int field_80;
+	int field_84;
+	int field_88;
+	int sMaxX;
+	int sMinX;
+	int sMaxY;
+	int sMinY;
+	int sMaxZ;
+	int sMinZ;
+	int field_A4;
+};
+#pragma pack(pop)
+extern stru141_actor_collision_object stru_721530;
+
+
+
+
+
+
+/*  378 */
+#pragma pack(push, 1)
+struct stru337_stru0
+{
+	int field_0;
+	int field_4;
+	int field_8;
+	int field_C;
+	int field_10;
+};
+#pragma pack(pop)
+
+
+
+/*  377 */
+#pragma pack(push, 1)
+struct stru337
+{
+	stru337_stru0 field_0;
+	int field_14;
+	int field_18;
+	int field_1C;
+	int field_20;
+	int field_24;
+	int field_28;
+	int field_2C;
+	int field_30;
+	stru337_stru0 field_34;
+};
+#pragma pack(pop)
+extern stru337 stru_F81018;
+
+
+/*  291 */
+enum PolygonType : __int8
+{
+	POLYGON_Invalid = 0x0,
+	POLYGON_VerticalWall = 0x1,
+	POLYGON_unk = 0x2,
+	POLYGON_Floor = 0x3,
+	POLYGON_InBetweenFloorAndWall = 0x4,
+	POLYGON_Ceiling = 0x5,
+	POLYGON_InBetweenCeilingAndWall = 0x6,
+};
+
+
+/*  147 */
+#pragma pack(push, 1)
+
+struct stru154
+{
+	//----- (0049B001) --------------------------------------------------------
+	inline stru154()
+	{}
+
+	//----- (0049B027) --------------------------------------------------------
+	inline ~stru154()
+	{}
+
+	void GetFacePlaneAndClassify(struct ODMFace *a2, struct BSPVertexBuffer *a3);
+	void ClassifyPolygon(struct Vec3_float_ *pNormal, float dist);
+	void GetFacePlane(struct ODMFace *pFace, struct BSPVertexBuffer *pVertices, struct Vec3_float_ *pOutNormal, float *pOutDist);
+
+
+	void(***vdestructor_ptr)(stru154 *, bool);
+	Plane_float_ face_plane;
+	PolygonType polygonType;
+	char field_15;
+	char field_16;
+	char field_17;
+};
+#pragma pack(pop)
+
+
+
+
+
+/*  392 */
+#pragma pack(push, 1)
+struct stru352
+{
+	int field_0;
+	int field_4;
+	int field_8;
+	int field_C;
+	int field_10;
+	int field_14;
+	int field_18;
+	int field_1C;
+	int field_20;
+	int field_24;
+	int field_28;
+	int field_2C;
+	int field_30;
+	int field_34;
+};
+#pragma pack(pop)
+//extern std::array<stru352, 480> stru_F83B80;
+
+#pragma pack(push, 1)
+struct LocationTime_stru1
+{
+  unsigned __int64 uLastVisitDay;
+  char sky_texture_name[12];
+  int day_attrib;
+  int day_fogrange_1;
+  int day_fogrange_2;
+  char field_2F4[24];
+};
+#pragma pack(pop)
+
+/*  319 */
+enum LEVEL_TYPE
+{
+  LEVEL_null = 0,
+  LEVEL_Indoor = 0x1,
+  LEVEL_Outdoor = 0x2,
+};
+extern LEVEL_TYPE uCurrentlyLoadedLevelType;
+
+
+
+
+
+
+
+
+
+
+
+
+
+/*   86 */
+#pragma pack(push, 1)
+struct SpawnPointMM6
+{
+  Vec3_int_ vPosition;
+  unsigned __int16 uRadius;
+  unsigned __int16 uKind;
+  unsigned __int16 uIndex;
+  unsigned __int16 uAttributes;
+};
+#pragma pack(pop)
+
+
+
+/*  102 */
+#pragma pack(push, 1)
+struct SpawnPointMM7
+{
+  //----- (00448DD6) --------------------------------------------------------
+  SpawnPointMM7()
+  {
+    uRadius = 32;
+    uAttributes = 0;
+    uIndex = 0;
+    uKind = 0;
+    uGroup = 0;
+  }
+
+
+  Vec3_int_ vPosition;
+  unsigned __int16 uRadius;
+  unsigned __int16 uKind;
+  unsigned __int16 uIndex;
+  unsigned __int16 uAttributes;
+  unsigned int uGroup;
+};
+#pragma pack(pop)
+
+
+
+
+
+
+/*   90 */
+#pragma pack(push, 1)
+struct BLVHeader
+{
+  char field_0[104];
+  unsigned int uFaces_fdata_Size;
+  unsigned int uSector_rdata_Size;
+  unsigned int uSector_lrdata_Size;
+  unsigned int uDoors_ddata_Size;
+  char field_78[16];
+};
+#pragma pack(pop)
+
+
+
+/*   96 */
+#pragma pack(push, 1)
+struct BLVSectorMM8
+{
+  int dword_000074;
+};
+#pragma pack(pop)
+
+/*   97 */
+#pragma pack(push, 1)
+struct BLVLightMM6
+{
+  Vec3_short_ vPosition;
+  __int16 uRadius;
+  __int16 uAttributes;
+  unsigned __int16 uBrightness;
+};
+#pragma pack(pop)
+
+/*   98 */
+#pragma pack(push, 1)
+struct BLVLightMM7 //10h
+{
+  struct Vec3_short_ vPosition;
+  __int16 uRadius;
+  char uRed;
+  char uGreen;
+  char uBlue;
+  char uType;
+  __int16 uAtributes;           // & 0x08    doesn't light faces
+  __int16 uBrightness;
+};
+#pragma pack(pop)
+
+/*   99 */
+#pragma pack(push, 1)
+struct BLVLightMM8
+{
+  int uID;
+};
+#pragma pack(pop)
+
+
+
+/*  100 */
+#pragma pack(push, 1)
+struct BLVDoor //50h
+{
+  enum State: unsigned __int16
+  {
+    Closed = 0,
+    Opening = 1,
+    Open = 2,
+    Closing = 3
+  };
+
+  unsigned int uAttributes;
+  unsigned int uDoorID;
+  unsigned int uTimeSinceTriggered;
+  Vec3_int_ vDirection;
+  int uMoveLength;
+  int uOpenSpeed;
+  int uCloseSpeed;
+  unsigned __int16 *pVertexIDs;
+  unsigned __int16 *pFaceIDs;
+  unsigned __int16 *pSectorIDs;
+  __int16 *pDeltaUs;
+  __int16 *pDeltaVs;
+  unsigned __int16 *pXOffsets;
+  unsigned __int16 *pYOffsets;
+  unsigned __int16 *pZOffsets;
+  unsigned __int16 uNumVertices;
+  unsigned __int16 uNumFaces;
+  __int16 field_48;
+  unsigned __int16 uNumOffsets;
+  State uState;
+  __int16 field_4E;
+};
+#pragma pack(pop)
+
+/*  101 */
+#pragma pack(push, 1)
+struct BLVMapOutline //0C
+{
+  unsigned __int16 uVertex1ID;
+  unsigned __int16 uVertex2ID;
+  unsigned __int16 uFace1ID;
+  unsigned __int16 uFace2ID;
+  __int16 sZ;
+  unsigned __int16 uFlags;
+};
+#pragma pack(pop)
+
+
+#define FACE_PORTAL             0x00000001 // portal/two-sided
+#define FACE_CAN_SATURATE_COLOR 0x00000002
+#define FACE_FLOW_DIAGONAL      0x00000004 // Diagonal flow of the lava or water
+#define FACE_UNKNOW5            0x00000006
+#define FACE_UNKNOW6            0x00000008
+#define FACE_FLUID              0x00000010 // wavy animated water or lava
+#define FACE_FLOW_VERTICAL      0x00000020 // Vertical flow of the lava or water
+#define FACE_DONT_CACHE_TEXTURE 0x00000040 // do not load face texture if it isn't loaded already
+#define FACE_UNKNOW4            0x00000080
+#define FACE_XY_PLANE           0x00000100
+#define FACE_XZ_PLANE           0x00000200
+#define FACE_YZ_PLANE           0x00000400
+#define FACE_FLOW_HORIZONTAL    0x00000800 // Horizontal flow of the lava or water
+#define FACE_HAS_EVENT_HINT     0x00001000
+#define FACE_INVISIBLE          0x00002000
+#define FACE_TEXTURE_FRAME      0x00004000 // Texture ID is a frameset from TextureFrameTable, otherwise BitmapID
+#define FACE_OUTLINED           0x00010000 // outline face edges
+#define FACE_INDOOR_DOOR        0x00020000
+#define FACE_TEXTURE_FLOW       0x00040000 // The texture moves slowly. For horizontal facets only.
+#define FACE_HAS_EVENT          0x00100000
+#define FACE_INDOOR_CARPET      0x00200000
+#define FACE_INDOOR_SKY         0x00400000
+#define FACE_UNKNOW3            0x00800000
+#define FACE_UNKNOW4            0x01000000
+#define FACE_CLICKABLE          0x02000000 // Event can be triggered by clicking on the facet.
+#define FACE_PRESSURE_PLATE     0x04000000 // Event can be triggered by stepping on the facet.
+#define FACE_INDICATE           0x06000000 // Event can be triggered by indicating on the facet.
+#define FACE_UNKNOW1            0x08000000
+#define FACE_UNKNOW2            0x10000000
+#define FACE_ETHEREAL           0x20000000 // Untouchable. You can pass through it.
+#define FACE_INDOOR_LAVA        0x40000000
+#define FACE_PICKED             0x80000000
+
+/*   93 */
+#pragma pack(push, 1)
+struct BLVFace  //60h
+{
+  //----- (0046ED02) --------------------------------------------------------
+  inline BLVFace()
+  {
+    this->uNumVertices = 0;
+    this->uAttributes = 0;
+    this->uFaceExtraID = 0;
+    this->pVertexIDs = nullptr;
+    this->pZInterceptDisplacements = nullptr;
+    this->pYInterceptDisplacements = nullptr;
+    this->pXInterceptDisplacements = nullptr;
+  }
+
+  void _get_normals(Vec3_int_ *a2, Vec3_int_ *a3);
+  struct Texture *GetTexture();
+  void FromODM(struct ODMFace *face);
+
+  inline bool Invisible() const {return (uAttributes & FACE_INVISIBLE) != 0;}
+  inline bool Visible() const   {return !Invisible();}
+  inline bool Portal() const    {return (uAttributes & FACE_PORTAL) != 0;}
+  inline bool Fluid() const     {return (uAttributes & FACE_FLUID) != 0;}
+  inline bool Indoor_sky() const     {return (uAttributes & FACE_INDOOR_SKY) != 0;}
+  inline bool Clickable() const {return (uAttributes & FACE_CLICKABLE) != 0;}
+  inline bool Pressure_Plate() const {return (uAttributes & FACE_PRESSURE_PLATE) != 0;}
+  inline bool Ethereal() const {return (uAttributes & FACE_ETHEREAL) != 0;}
+
+  struct Plane_float_ pFacePlane;
+  struct Plane_int_ pFacePlane_old;
+  int zCalc1;
+  int zCalc2;
+  int zCalc3;
+  unsigned int uAttributes;
+  unsigned __int16 *pVertexIDs;
+  signed __int16 *pXInterceptDisplacements;
+  signed __int16 *pYInterceptDisplacements;
+  signed __int16 *pZInterceptDisplacements;
+  signed __int16   *pVertexUIDs;
+  signed __int16   *pVertexVIDs;
+  unsigned __int16  uFaceExtraID;
+  unsigned __int16  uBitmapID;
+  unsigned __int16  uSectorID;
+  __int16 uBackSectorID;
+  struct BBox_short_ pBounding;
+  PolygonType uPolygonType;
+  unsigned __int8 uNumVertices;
+  char field_5E;
+  char field_5F;
+};
+#pragma pack(pop)
+
+/*   94 */
+#pragma pack(push, 1)
+struct BLVFaceExtra  //24h
+{
+bool HasEventint();
+
+  __int16 field_0;
+  __int16 field_2;
+  __int16 field_4;
+  __int16 field_6;
+  __int16 field_8;
+  __int16 field_A;
+  __int16 field_C;
+  unsigned __int16 uAdditionalBitmapID;
+  __int16 field_10;
+  __int16 field_12;
+  __int16 sTextureDeltaU;
+  __int16 sTextureDeltaV;
+  __int16 sCogNumber;
+  unsigned __int16 uEventID;
+  __int16 field_1C;
+  __int16 field_1E;
+  __int16 field_20;
+  __int16 field_22;
+};
+#pragma pack(pop)
+
+/*   95 */
+#pragma pack(push, 1)
+struct BLVSector //0x74
+{
+  int field_0;
+  unsigned __int16 uNumFloors;
+  __int16 field_6;
+  unsigned __int16 *pFloors;
+  unsigned __int16 uNumWalls;
+  __int16 field_E;
+  unsigned __int16 *pWalls;
+  unsigned __int16 uNumCeilings;
+  __int16 field_16;
+  unsigned __int16 *pCeilings;
+  unsigned __int16 uNumFluids;
+  __int16 field_1E;
+  unsigned __int16 *pFluids;
+  __int16 uNumPortals;
+  __int16 field_26;
+  unsigned __int16 *pPortals;
+  unsigned __int16 uNumFaces;
+  unsigned __int16 uNumNonBSPFaces;
+  unsigned __int16 *pFaceIDs;
+  unsigned __int16 uNumCylinderFaces;
+  __int16 field_36;
+  int pCylinderFaces;
+  unsigned __int16 uNumCogs;
+  __int16 field_3E;
+  unsigned __int16 *pCogs;
+  unsigned __int16 uNumDecorations;
+  __int16 field_46;
+  unsigned __int16 *pDecorationIDs;
+  unsigned __int16 uNumMarkers;
+  __int16 field_4E;
+  unsigned __int16 *pMarkers;
+  unsigned __int16 uNumLights;
+  __int16 field_56;
+  unsigned __int16 *pLights;
+  __int16 uWaterLevel;
+  __int16 uMistLevel;
+  __int16 uLightDistanceMultiplier;
+  __int16 uMinAmbientLightLevel;
+  __int16 uFirstBSPNode;
+  __int16 exit_tag;
+  BBox_short_ pBounding;
+};
+#pragma pack(pop)
+
+
+#pragma pack(push, 1)
+struct BLVMapOutlines
+{
+  int          uNumOutlines;
+  BLVMapOutline pOutlines[7000];
+};
+#pragma pack(pop)
+
+
+
+
+
+
+
+/*   89 */
+#pragma pack(push, 1)
+struct IndoorLocation
+{
+  //----- (00462592) --------------------------------------------------------
+  inline IndoorLocation()
+  {
+    bLoaded = 0;
+    ptr_0002B8_sector_lrdata = 0;
+    ptr_0002B4_doors_ddata = 0;
+    ptr_0002B0_sector_rdata = 0;
+    pLFaces = 0;
+    pVertices = 0;
+    pFaces = 0;
+    pFaceExtras = 0;
+    pSectors = 0;
+    pLights = 0;
+    pDoors = 0;
+    pNodes = 0;
+    pMapOutlines = 0;
+    uNumSpawnPoints = 0;
+    pSpawnPoints = 0;
+	uNumSectors = 0;
+  }
+
+  int GetSector(int sX, int sY, int sZ);
+  void Release();
+  bool Alloc();
+  bool Load(char *pFilename, int a3, size_t i, char *pDest);
+  void Draw();
+  void ToggleLight(signed int uLightID, unsigned int bToggle);
+
+  static unsigned int GetLocationIndex(const char *Str1);
+  static void ExecDraw(bool bD3D);
+  //static void ExecDraw_sw(unsigned int uFaceID);
+  static void ExecDraw_d3d(unsigned int uFaceID, struct IndoorCameraD3D_Vec4 *pVertices, unsigned int uNumVertices, struct RenderVertexSoft *pPortalBounding);
+
+  char pFilename[32];
+  char field_20[48];
+  unsigned int bLoaded;
+  char field_54[404];
+  struct BLVHeader blv;
+  unsigned int uNumVertices;
+  struct Vec3_short_ *pVertices;
+  unsigned int uNumFaces;
+  struct BLVFace *pFaces;
+  unsigned int uNumFaceExtras;
+  struct BLVFaceExtra *pFaceExtras;
+  int uNumSectors;
+  struct BLVSector *pSectors;
+  int uNumLights;
+  struct BLVLightMM7 *pLights;
+  int uNumDoors;
+  struct BLVDoor *pDoors;
+  unsigned int uNumNodes;
+  struct BSPNode *pNodes;
+  BLVMapOutlines *pMapOutlines;
+  unsigned __int16 *pLFaces;
+  unsigned __int16 *ptr_0002B0_sector_rdata;
+  unsigned __int16 *ptr_0002B4_doors_ddata;
+  unsigned __int16 *ptr_0002B8_sector_lrdata;
+  unsigned int uNumSpawnPoints;
+  struct SpawnPointMM7 *pSpawnPoints;
+  struct DDM_DLV_Header dlv;
+  LocationTime_stru1 stru1;
+  char _visible_outlines[875];
+  char padding;
+};
+#pragma pack(pop)
+
+extern IndoorLocation *pIndoor;
+
+
+
+
+
+
+
+
+
+
+
+
+
+/*  162 */
+#pragma pack(push, 1)
+struct BLVRenderParams
+{
+  inline BLVRenderParams()
+  {
+    uViewportX = 0;
+    uViewportY = 0;
+    uViewportZ = 0;
+    uViewportW = 0;
+  }
+
+  void Reset();
+
+  int field_0_timer_;
+  int _unused_uFlags;              // & INDOOR_CAMERA_DRAW_D3D_OUTLINES:  render d3d outlines
+  Vec3_int_ _unused_vPartyPos;
+  int _unused_sPartyRotY;
+  int _unused_sPartyRotX;
+  int uPartySectorID;
+  int _unused_sCosineY;      // matches ODMRenderParams::int sines and cosines
+  int _unused_sSineY;        // computed in 0048600E
+  int _unused_sCosineNegX;   // merged into IndoorCameraD3D
+  int _unused_sSineNegX;     // --//--
+  float _unused_fCosineY;    // matches old IndoorCamera::fRotationCosineY (new IndoorCameraD3D::fRotationCosineY)
+  float _unused_fSineY;      // matches old IndoorCamera::fRotationSineY   (new IndoorCameraD3D::fRotationSineY)
+  float _unused_fCosineNegX; // the same
+  float _unused_fSineNegX;   // the same
+  int fov_rad_fixpoint;
+  int fov_rad_inv_fixpoint;//float
+  void *pRenderTarget;
+  unsigned int uTargetWidth;
+  unsigned int uTargetHeight;
+  unsigned int uViewportX;
+  unsigned int uViewportY;
+  unsigned int uViewportZ;
+  unsigned int uViewportW;
+  int field_64;
+  int *pTargetZBuffer;
+  int uViewportHeight;
+  int uViewportWidth;
+  int uViewportCenterX;
+  int uViewportCenterY;
+  struct BspRenderer_PortalViewportData *field_7C;
+  unsigned int uNumFacesRenderedThisFrame;
+  int field_84;
+  int field_88;
+  int field_8C;
+  int field_90;
+  int field_94;
+};
+#pragma pack(pop)
+extern BLVRenderParams *pBLVRenderParams;
+
+
+
+
+
+int __fastcall GetPortalScreenCoord(unsigned int uFaceID);
+bool PortalFrustrum(int pNumVertices, struct BspRenderer_PortalViewportData *a2, struct BspRenderer_PortalViewportData *near_portal, int uFaceID);
+void PrepareBspRenderList_BLV();
+void PrepareDecorationsRenderList_BLV(unsigned int uDecorationID, unsigned int uSectorID);
+void PrepareActorRenderList_BLV();
+void PrepareItemsRenderList_BLV();
+void AddBspNodeToRenderList(unsigned int node_id);
+void __fastcall sub_4406BC(unsigned int node_id, unsigned int uFirstNode); // idb
+char __fastcall DoInteractionWithTopmostZObject(int a1, int a2);
+int __fastcall sub_4AAEA6_transform(struct RenderVertexSoft *a1);
+unsigned int __fastcall sub_4B0E07(unsigned int uFaceID); // idb
+void BLV_UpdateUserInputAndOther();
+int BLV_GetFloorLevel(int x, int y, int z, unsigned int uSectorID, unsigned int *pFaceID);
+void BLV_UpdateDoors();
+void UpdateActors_BLV();
+void BLV_ProcessPartyActions();
+void Door_switch_animation(unsigned int uDoorID, int a2); // idb: sub_449A49
+int __fastcall sub_4088E9(int a1, int a2, int a3, int a4, int a5, int a6);
+void __fastcall PrepareDrawLists_BLV();
+void PrepareToLoadBLV(unsigned int bLoading);
+int GetAlertStatus();
+int __fastcall _45063B_spawn_some_monster(struct MapInfo *a1, int a2);
+int __fastcall sub_450521_ProllyDropItemAt(int ecx0, signed int a2, int a3, int a4, int a5, unsigned __int16 a6);
+
+bool __fastcall sub_4075DB(int a1, int a2, int a3, struct BLVFace *face);
+bool __fastcall sub_4077F1(int a1, int a2, int a3, struct ODMFace *face, struct BSPVertexBuffer *a5);
+
+#pragma once
+
+
+
+
+
+/*  165 */
+#pragma pack(push, 1)
+struct BspRenderer_PortalViewportData
+{
+	void GetViewportData(__int16 x, int y, __int16 z, int w);
+
+	int _viewport_space_y;
+	int _viewport_space_w;
+	int _viewport_space_x;
+	int _viewport_space_z;
+	int _viewport_x_minID;
+	int _viewport_z_maxID;
+	__int16 viewport_left_side[480];
+	__int16 viewport_right_side[480];
+};
+#pragma pack(pop)
+extern BspRenderer_PortalViewportData stru_F8A590;
+
+
+
+
+/*  164 */
+#pragma pack(push, 1)
+struct BspRenderer_stru0
+{
+	//----- (0043F2BF) --------------------------------------------------------
+	inline BspRenderer_stru0()
+	{
+		//_eh_vector_constructor_iterator_(std__vector_0007AC, 24, 4,
+		//    (void ( *)(void *))IndoorCameraD3D_Vec4::IndoorCameraD3D_Vec4,
+		//    (void ( *)(void *))IndoorCameraD3D_Vec4::dtor);
+		//for (int i = 0; i < 4; ++i)
+		//  pVertices[i].flt_2C = 0.0f;
+	}
+
+	//----- (0043F2A9) --------------------------------------------------------
+	~BspRenderer_stru0()
+	{
+		//_eh_vector_destructor_iterator_(this->std__vector_0007AC, 24, 4, IndoorCameraD3D_Vec4::dtor);
+	}
+
+	unsigned __int16 uSectorID;
+	unsigned __int16 uViewportX;
+	unsigned __int16 uViewportY;
+	unsigned __int16 uViewportZ;
+	unsigned __int16 uViewportW;
+	__int16 field_A;
+	BspRenderer_PortalViewportData PortalScreenData;
+	unsigned __int16 uFaceID;
+	__int16 field_7A6;
+	unsigned int         viewing_portal_id;             // portal through which we're seeing this node
+	IndoorCameraD3D_Vec4 std__vector_0007AC[4];
+	RenderVertexSoft     pPortalBounding[4];
+};
+#pragma pack(pop)
+
+
+
+
+#pragma pack(push, 1)
+struct BspFace
+{
+	unsigned __int16 uFaceID;
+	unsigned __int16 uNodeID;
+};
+#pragma pack(pop)
+
+
+/*  163 */
+#pragma pack(push, 1)
+struct BspRenderer // stru170
+{
+	//----- (0043F282) --------------------------------------------------------
+	inline BspRenderer()
+	{
+		// _eh_vector_constructor_iterator_(field_FA8, 2252, 150,
+		//    (void ( *)(void *))stru170_stru0::stru170_stru0,
+		//    (void ( *)(void *))stru170_stru0::dtor);
+		num_faces = 0;
+		num_nodes = 0;
+		uNumVisibleNotEmptySectors = 0;
+	}
+
+	//void AddFaceToRenderList_sw(unsigned int node_id, unsigned int uFaceID);
+	void AddFaceToRenderList_d3d(unsigned int node_id, unsigned int uFaceID);
+	void MakeVisibleSectorList();
+	//void DrawFaceOutlines();
+
+	unsigned int num_faces;
+	//__int16 pFaceIDs[2000];
+	BspFace faces[1000];
+	//char field_130[3700];
+	unsigned int num_nodes;
+	BspRenderer_stru0 nodes[150];
+	unsigned int uNumVisibleNotEmptySectors;
+	unsigned __int16 pVisibleSectorIDs_toDrawDecorsActorsEtcFrom[6];
+};
+#pragma pack(pop)
+
+
+extern struct BspRenderer *pBspRenderer; // idb
+
+void FindBillboardsLightLevels_BLV();
+
+int collide_against_floor_approximate(int x, int y, int z, unsigned int *pSectorID, unsigned int *pFaceID); // idb
+
+bool __fastcall sub_407A1C(int x, int z, int y, struct Vec3_int_ v); // idb