summaryrefslogtreecommitdiffstats
path: root/src/AssetManager.hpp
blob: 50d9bbf83f46c3329ad5bc5a750a4809a0b16115 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
#pragma once

#include <map>
#include <optional>

#include <GL/glew.h>
#include <glm/vec4.hpp>
#include <nlohmann/json.hpp>

#include "Block.hpp"
#include "Texture.hpp"
#include "Vector.hpp"

struct TextureCoordinates {
	TextureCoordinates(float x = -1, float y = -1, float w = -1, float h = -1) : x(x), y(y), w(w), h(h) {}

	bool operator==(const TextureCoordinates &rhs) const {
		return x == rhs.x &&
		       y == rhs.y &&
		       w == rhs.w &&
		       h == rhs.h;
	}

	explicit operator bool() const {
		return !(*this == TextureCoordinates(-1, -1, -1, -1));
	}

	double x, y, w, h;

    operator glm::vec4() const {
        return glm::vec4(x, y, w, h);
    }
};

struct BlockTextureId {
	//Block sides: 0 - bottom, 1 - top, 2 - north, 3 - south, 4 - west, 5 - east 6 - every side
	BlockTextureId(int id = 0, int state = 0, int side = 6) : id(id), state(state), side(side) {}

	int id:9;
	int state:4;
	int side:3;


	bool operator<(const BlockTextureId &rhs) const {
		if (id < rhs.id)
			return true;
		if (rhs.id < id)
			return false;
		if (state < rhs.state)
			return true;
		if (rhs.state < state)
			return false;
		return side < rhs.side;
	}
};

struct BlockModel {
    bool IsBlock = false;
    std::string BlockName;

    bool AmbientOcclusion=true;

    enum DisplayVariants {
        thirdperson_righthand,
        thirdperson_lefthand,
        firstperson_righthand,
        firstperson_lefthand,
        gui,
        head,
        ground,
        fixed,
        DisplayVariantsCount,
    };
    struct DisplayData {
        Vector rotation;
        Vector translation;
        Vector scale;
    };
    std::map<DisplayVariants, DisplayData> Display;

    std::map<std::string, std::string> Textures;

    struct ElementData {
        Vector from;
        Vector to;

        Vector rotationOrigin = Vector(8, 8, 8);
        enum Axis {
            x,
            y,
            z,
        } rotationAxis = Axis::x;
        int rotationAngle = 0;
        bool rotationRescale = false;

        bool shade = true;

        enum FaceDirection {
            down,
            up,
            north,
            south,
            west,
            east,
            none,
        };
        struct FaceData {
            struct Uv {
                int x1, y1, x2, y2;
            } uv = { 0,0,0,0 };
            std::string texture;
            FaceDirection cullface = FaceDirection::none;
            int rotation = 0;
            bool tintIndex = false;
            
        };
        std::map<FaceDirection, FaceData> faces;
    };

    std::vector<ElementData> Elements;
};

class AssetManager {
	Texture *textureAtlas;
	std::map<std::string, BlockId> assetIds;
	std::map<std::string, TextureCoordinates> assetTextures;
	std::map<BlockTextureId,glm::vec4> textureAtlasIndexes;
    std::map<std::string, BlockModel> models;
    std::map<BlockId, std::string> blockIdToBlockName;
public:
	AssetManager();

	~AssetManager();

	void LoadTextureResources();

	TextureCoordinates GetTextureByAssetName(std::string AssetName);

	std::string GetTextureAssetNameByBlockId(BlockTextureId block);

	GLuint GetTextureAtlas();

	const std::map<BlockTextureId,glm::vec4> &GetTextureAtlasIndexes();

	void LoadIds();

	TextureCoordinates GetTextureByBlock(BlockTextureId block);

	static AssetManager& Instance();

    const BlockModel *GetBlockModelByBlockId(BlockId block);

    void LoadBlockModels();

    std::string GetAssetNameByBlockId(BlockId block);
};