File Game2DLayer.h

File List > engine > include > Game2DLayer.h

Go to the documentation of this file

#ifndef H_GAME2DLAYER
#define H_GAME2DLAYER

#ifdef __cplusplus
extern "C" {
#endif

#include "IntTypes.h"
#include "DynArray.h"
#include "HandleDefs.h"
#include <cglm/cglm.h>
#include "InputContext.h"
#include "FreeLookCameraMode.h"
#include "Entity2DCollection.h"
#include "TimerPool.h"

#define MAX_GAME_LAYER_ASSET_FILE_PATH_LEN 128

typedef struct InputMapping InputMapping;

struct GameFrameworkEventListener;

struct GameLayer2DData;
struct BinarySerializer;
struct Vert2DTexture;
typedef void (*PreFirstInitFn)(struct GameLayer2DData* pGameLayerData);
typedef void (*PreLoadLevelFn)(struct GameLayer2DData* pGameLayerData);

typedef void (*LevelDataPacketExtenderFn)(struct GameLayer2DData* pGameLayerData, struct BinarySerializer* pBS);

typedef void (*LevelDataRequestHandlerExtenderFn)(struct GameLayer2DData* pGameLayerData, struct BinarySerializer* pBS);

typedef void (*LevelDataHandlerExtenderFn)(struct GameLayer2DData* pGameLayerData, struct BinarySerializer* pBS);


struct GameFrameworkLayer;
struct DrawContext;
typedef struct DrawContext DrawContext;

// the real type of this should be hSprite ie u32 but i want to save memory so u16 it is - that 
// should be enough for anyone - just store the tiles in the first 16 bits worth of indexes


struct Transform2D
{
    vec2 position;
    vec2 scale;
    vec2 rotationPointRelative; /* relative to position */
    float rotation;
    bool bMirrored;
};

struct TilemapRenderData;
struct TilemapLayerRenderData;

enum ObjectLayer2DDrawOrder
{
    DrawOrder_TopDown,
    DrawOrder_Index 
};

struct TileMapLayer
{
    struct TilemapLayerRenderData* pRenderData;
    struct Transform2D transform;
    int tileWidthPx;
    int tileHeightPx;
    int widthTiles;
    int heightTiles;
    bool bIsObjectLayer;
    enum ObjectLayer2DDrawOrder drawOrder;
    TileIndex* Tiles;
    u32 type;
};

struct TileMap
{
    VECTOR(struct TileMapLayer) layers;
    char* dataFilePath;
    struct TilemapRenderData* pRenderData;
};

struct GameLayer2DData
{
    struct GameFrameworkLayer* pLayer;

    HEntity2DQuadtreeNode hEntitiesQuadTree;

    hAtlas hAtlas;

    struct TileMap tilemap;

    bool bLoaded;

    bool bFreeLookMode;

    struct Transform2D camera;

    int cameraClampedToTilemapLayer;

    struct FreeLookCameraModeControls freeLookCtrls;

    VECTOR(struct Vert2DTexture) pWorldspaceVertices;
    VECTOR(VertIndexT) pWorldspaceIndices;
    H2DWorldspaceVertexBuffer vertexBuffer;

    char atlasFilePath[MAX_GAME_LAYER_ASSET_FILE_PATH_LEN];

    char tilemapFilePath[MAX_GAME_LAYER_ASSET_FILE_PATH_LEN];

    bool bDebugLayerAttatched;

    char debugMsg[256];

    struct GameFrameworkEventListener* pDebugListener;

    int windowW;

    int windowH;

    HPhysicsWorld hPhysicsWorld;

    struct Entity2DCollection entities;

    void* pUserData;

    PreFirstInitFn preFirstInitCallback;

    PreLoadLevelFn preLoadLevelFn;

    DrawContext* pDrawContext;

    /*
        @brief
        don't draw
    */
    bool bSkipDraw;

    bool bCurrentLocationIsDirty;

    LevelDataPacketExtenderFn levelDataPacketExtender;

    LevelDataRequestHandlerExtenderFn levelDataRequestHandlerExtender;

    LevelDataHandlerExtenderFn levelDataHandlerExtender;

    struct SDTimerPool timerPool; 

    HTimer hNetworkStateUpdateTimer;
};

struct Game2DLayerOptions
{

    const char* atlasFilePath;

    const char* levelFilePath;

};

void TilemapLayer_GetTLBR(vec2 tl, vec2 br, struct TileMapLayer* pTMLayer);

void Game2DLayer_Get(struct GameFrameworkLayer* pLayer, struct Game2DLayerOptions* pOptions, DrawContext* pDC);

void Game2DLayer_SaveLevelFile(struct GameLayer2DData* pData, const char* outputFilePath);

void GameLayer2D_OnPush(struct GameFrameworkLayer* pLayer, DrawContext* drawContext, InputContext* inputContext);

void Game2DLayer_OnPop(struct GameFrameworkLayer* pLayer, DrawContext* drawContext, InputContext* inputContext);

void G2D_SaveLevelDataInternal(struct GameLayer2DData* pData, struct BinarySerializer* pBS);


VECTOR(HEntity2D) Et2D_QueryDynEntities(struct GameFrameworkLayer* pLayer, struct Entity2DCollection* pCollection, vec2 regionTL, vec2 regionBR, VECTOR(HEntity2D) pOutEntities);

void Et2D_Transform2DToMat3(struct Transform2D* pTrans, mat3 out);

#ifdef __cplusplus
}
#endif

#endif // !H_GAME2DLAYER