Mercurial > mm7
view Engine/Graphics/Indoor.h @ 2563:65c97624c047
Saving & loading works from both main menu and game
author | a.parshin |
---|---|
date | Tue, 19 May 2015 22:00:56 +0200 |
parents | b8a56afc6ba1 |
children | d87bfbd3bb3b |
line wrap: on
line source
#pragma once #include <array> #include "Render.h" #include "IndoorCameraD3D.h" #include "../mm7_data.h" /* 358 */ #pragma pack(push, 1) struct LightsData { 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 LightsData Lights; // 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_UNKNOW7 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