|
9 | 9 | #include <utility> |
10 | 10 | #include <vector> |
11 | 11 | #include <filesystem> |
| 12 | +#include "texture_atlas_canvas.h" |
12 | 13 |
|
13 | 14 | namespace plateau::texture { |
14 | 15 |
|
15 | | - class AtlasInfo { |
16 | | - public: |
17 | | - |
18 | | - explicit AtlasInfo(const bool valid, const size_t left, const size_t top, |
19 | | - const size_t width, const size_t height, |
20 | | - double u_pos, double v_pos, double u_factor, double v_factor, std::string src_texture_path) : |
21 | | - valid_(valid), left_(left), top_(top), width_(width), height_(height), |
22 | | - u_pos_(u_pos), v_pos_(v_pos), u_factor_(u_factor), v_factor_(v_factor), src_texture_path(std::move(src_texture_path)) { |
23 | | - } |
24 | | - |
25 | | - static AtlasInfo empty() { |
26 | | - return AtlasInfo(false, 0, 0, 0, 0, 0, 0, 0, 0, ""); |
27 | | - } |
28 | | - |
29 | | - size_t getLeft() const { |
30 | | - return left_; |
31 | | - } |
32 | | - size_t getTop() const { |
33 | | - return top_; |
34 | | - } |
35 | | - size_t getWidth() const { |
36 | | - return width_; |
37 | | - } |
38 | | - size_t getHeight() const { |
39 | | - return height_; |
40 | | - } |
41 | | - double getUPos() const { |
42 | | - return u_pos_; |
43 | | - } |
44 | | - double getVPos() const { |
45 | | - return v_pos_; |
46 | | - } |
47 | | - double getUFactor() const { |
48 | | - return u_factor_; |
49 | | - } |
50 | | - double getVFactor() const { |
51 | | - return v_factor_; |
52 | | - } |
53 | | - |
54 | | - bool getValid() const; |
55 | | - |
56 | | - const std::string& getSrcTexturePath() const { |
57 | | - return src_texture_path; |
58 | | - }; |
59 | | - |
60 | | - private: |
61 | | - bool valid_; // パッキングが成功したかどうか |
62 | | - size_t left_; // パッキングされた画像の左上のX座標 |
63 | | - size_t top_; // パッキングされた画像の左上のY座標 |
64 | | - size_t width_; // パッキングされた画像の幅 |
65 | | - size_t height_; // パッキングされた画像の高さ |
66 | | - double u_pos_; // uv座標の左上u座標 |
67 | | - double v_pos_; // uv座標の左上v座標 |
68 | | - double u_factor_; // u座標の倍率 |
69 | | - double v_factor_; // v座標の倍率 |
70 | | - std::string src_texture_path; |
71 | | - }; |
72 | | - |
73 | | - class AtlasContainer { |
74 | | - public: |
75 | | - |
76 | | - explicit AtlasContainer(const size_t _gap, const size_t _horizontal_range, const size_t _vertical_range); |
77 | | - |
78 | | - size_t getGap() const { |
79 | | - return gap; |
80 | | - } |
81 | | - size_t getRootHorizontalRange() const { |
82 | | - return root_horizontal_range; |
83 | | - } |
84 | | - size_t getHorizontalRange() const { |
85 | | - return horizontal_range; |
86 | | - } |
87 | | - size_t getVerticalRange() const { |
88 | | - return vertical_range; |
89 | | - } |
90 | | - void add(const size_t _length); |
91 | | - |
92 | | - private: |
93 | | - size_t gap; // 画像を格納するコンテナの高さ |
94 | | - size_t root_horizontal_range; // コンテナ内で未使用の領域のX座標 |
95 | | - size_t horizontal_range; // 最後の画像をパッキングするための領域のX座標 |
96 | | - size_t vertical_range; // パッキングの対象となる親の画像のコンテナが配置されている左上のY座標 |
97 | | - }; |
98 | | - |
99 | | - |
100 | | - class TextureAtlasCanvas { |
101 | | - public: |
102 | | - |
103 | | - explicit TextureAtlasCanvas(size_t width, size_t height) : |
104 | | - vertical_range_(0), capacity_(0), coverage_(0), |
105 | | - canvas_(TextureImageBase::createNewTexture(width, height)), |
106 | | - canvas_width_(width), canvas_height_(height) { |
107 | | - } |
108 | | - |
109 | | - |
110 | | - void setSaveFilePathIfEmpty(const std::string& original_file_path); |
111 | | - const std::string& getSaveFilePath() const; |
112 | | - |
113 | | - TextureImageBase& getCanvas() { |
114 | | - return *canvas_; |
115 | | - } |
116 | | - |
117 | | - void flush(); |
118 | | - |
119 | | - /** |
120 | | - * \brief テクスチャ全体に対しての既にパックされた画像の占有率(100%) |
121 | | - */ |
122 | | - double getCoverage() const { |
123 | | - return coverage_; |
124 | | - } |
125 | | - |
126 | | - void update(const size_t width, const size_t height, const bool is_new_container, const AtlasInfo& packed_texture_info); // 画像のパッキング成功時の処理、第3引数(TRUE:新規コンテナを作成、FALSE:既存コンテナに追加) |
127 | | - AtlasInfo insert(const size_t width, const size_t height, const std::string& src_texture_path); // 指定された画像領域(width x height)の領域が確保できるか検証、戻り値AtrasInfoの「valid」ブール値(true:成功、false:失敗)で判定可能 |
128 | | - bool isTexturePacked(const std::string& src_file_path, AtlasInfo& out_atlas_info); |
129 | | - |
130 | | - private: |
131 | | - std::vector<AtlasContainer> container_list_; |
132 | | - size_t canvas_width_; |
133 | | - size_t canvas_height_; |
134 | | - size_t vertical_range_; |
135 | | - size_t capacity_; |
136 | | - double coverage_; |
137 | | - std::unique_ptr<TextureImageBase> canvas_; |
138 | | - std::string save_file_path_; |
139 | | - std::vector<AtlasInfo> packed_textures_info; |
140 | | - }; |
141 | | - |
142 | 16 | /// テクスチャのアトラス化をします。 |
143 | 17 | /// 実装上の注意: |
144 | 18 | /// TexturePacker にAPIを増やすとき、変更が必要なのは texture_packer.cpp に加えて texture_packer_dummy.cpp もであることに注意してください。 |
|
0 commit comments