Skip to content

Commit e1b68df

Browse files
authored
テクスチャ結合で出力されるjpegが、Unrealで読み込めない問題 (Synesthesias#194)
* TexturePackerでファイルが存在することのテストを記述 * TexturePackerのテストで出力ファイルを画像として読めるかのテストを追加 * TexturePacker微修正 * 微修正 * リファクタ: 要らないメソッドを削除 * JpegTextureImageの初期化タイミングをコンストラクタに限定 * PngTextureImageの初期化タイミングをコンストラクタに限定 * TiffTextureImageの初期化タイミングをコンストラクタに限定 * TextureImageロードエラー処理 * TextureImageの初期化タイミングをコンストラクタに限定 * 微修正 * 未初期化で不要だったデフォルトカラーのインスタンス変数を削除 * TexturePackerのclearでクリアし忘れていたメンバ変数を修正 * 不要関数削除とエラー処理追加 * JpegTextureImageの警告に対処 * 微修正 * 警告に対処 * TexturePack後のテクスチャサイズのテスト * TexturePackerの初期化タイミングをコンストラクタ時に限定 * AtlasInfoの初期化タイミングをコンストラクタに限定 * JpegTextureImage, PngTextureImage, TiffTextureImageの3つをポリモーフィズムで扱うようにした * コード整理 * fix mac error * 微修正 * Fix Valgrind Warning in JpegTextureImage * 微修正 * libjpegのread apiをjpet-turbo api に置き換え * unique_ptrのdeleteでfree漏れ防止 * same as above * 微修正 * 微修正 * jpeg書き込みもtjに置き換え中 * 微修正 * texturePacker調整 * Pngの出力とTexturePackを実装し、TexturePackerの出力をjpgからpngに変更 * PngTextureImage修正 * コメント追記
1 parent 797198a commit e1b68df

File tree

18 files changed

+563
-503
lines changed

18 files changed

+563
-503
lines changed

.idea/inspectionProfiles/Project_Default.xml

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

data/日本語パステスト/test_texture_packer/test_image_16.jpg renamed to data/日本語パステスト/test_texture_packer/test_image_15.jpg

File renamed without changes.

include/plateau/texture/jpeg_texture_image.h

Lines changed: 56 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5,52 +5,85 @@
55
#include <memory>
66
#include <string>
77
#include <vector>
8+
#include <stdexcept>
89

910
#include "png_texture_image.h"
11+
#include <plateau/texture/texture_image_base.h>
1012

1113
struct jpeg_error_mgr;
1214

1315
namespace plateau::texture {
14-
class JpegTextureImage {
16+
/**
17+
* jpeg画像を扱うクラスです。
18+
*
19+
* 重要:
20+
* このクラスではjpegの読込はできますが、書き込みにはバグがあります。
21+
* このクラスでMacで書き込んだjpegファイルは、MacのUnrealで7割くらいの確率で読込に失敗します。
22+
* 書き込んだjpegに問題があるようです。
23+
* 問題の画像(7割の確率で問題画像になる)はMacの標準ビューワーでは開くので一見すると大丈夫そうですが、Gimpで開くと警告ダイアログが出現し、Unrealではインポートできません。
24+
* 私はこのバグの解決に20時間以上を費やしましたが解決せず、結局pngで実装し直すことで事なきを得ました。
25+
* 画像の出力にはPngTextureImageを利用してください。
26+
*/
27+
class JpegTextureImage : public TextureImageBase {
1528
public:
16-
explicit JpegTextureImage() {
17-
}
1829

19-
~JpegTextureImage() = default;
30+
/**
31+
* jpegファイルをロードします。
32+
*/
33+
explicit JpegTextureImage(const std::string& file_name, size_t height_limit) :
34+
load_succeed_(init(file_name, height_limit))
35+
{
36+
};
2037

2138
/**
22-
* \brief 指定されたファイルから画像を読み込み、テクスチャ画像を作成します。
23-
* \param file_name 画像ファイルのパス
24-
* \param height_limit 画像の高さがこの値を超える場合画像データは読み込まれません。
25-
* \return 読み込みに成功した場合true、それ以外はfalse
39+
* 新規の画像をメモリ上に作ります。
2640
*/
27-
bool init(const std::string& file_name, const size_t height_limit);
28-
void init(size_t width, size_t height, size_t color);
41+
explicit JpegTextureImage(size_t width, size_t height, uint8_t color){
42+
init(width, height, color);
43+
};
2944

30-
size_t getWidth() const {
45+
size_t getWidth() const override {
3146
return image_width_;
32-
}
47+
};
3348

34-
size_t getHeight() const {
49+
size_t getHeight() const override {
3550
return image_height;
36-
}
51+
};
52+
53+
const std::string& getFilePath() const override{
54+
return filePath;
55+
};
3756

38-
std::vector<uint8_t>& getBitmapData() {
57+
std::vector<uint8_t>& getBitmapData() override {
3958
return bitmap_data_;
40-
}
59+
};
60+
61+
virtual bool loadSucceed() const override {
62+
return load_succeed_;
63+
};
64+
65+
bool save(const std::string& file_path) override;
66+
67+
void packTo(TextureImageBase* dest, const size_t x_delta, const size_t y_delta) override;
4168

42-
bool save(const std::string& file_name);
43-
void pack(size_t x_delta, size_t y_delta, const JpegTextureImage& image);
44-
void packPng(const size_t x_delta, const size_t y_delta, PngTextureImage& image);
4569

4670
private:
71+
/**
72+
* \brief 指定されたファイルから画像を読み込み、テクスチャ画像を作成します。
73+
* \param file_name 画像ファイルのパス
74+
* \param height_limit 画像の高さがこの値を超える場合画像データは読み込まれません。
75+
* \return 読み込みに成功した場合true、それ以外はfalse
76+
*/
77+
bool init(const std::string& file_name, size_t height_limit);
78+
void init(size_t width, size_t height, uint8_t color);
79+
4780
std::shared_ptr<::jpeg_error_mgr> jpegErrorManager;
4881
std::vector<uint8_t> bitmap_data_;
4982
std::string filePath;
50-
size_t image_width_;
51-
size_t image_height;
52-
size_t image_channels_;
53-
int colourSpace;
83+
size_t image_width_ = 0;
84+
size_t image_height = 0;
85+
int image_channels_ = 0;
86+
bool load_succeed_;
5487
};
5588

5689
} // namespace plateau::texture
Lines changed: 33 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,54 @@
11

22
#pragma once
33

4-
#include <plateau/texture/png_texture_image.h>
5-
4+
#include <plateau/texture/texture_image_base.h>
65
#include <cstdint>
76
#include <string>
87
#include <vector>
8+
#include <stdexcept>
99

1010
namespace plateau::texture {
11-
class PngTextureImage {
11+
/**
12+
* png画像を扱うクラスです。
13+
*/
14+
class PngTextureImage : public TextureImageBase {
1215
public:
13-
explicit PngTextureImage();
14-
15-
~PngTextureImage() {
16-
}
16+
explicit PngTextureImage(const std::string& file_path) :
17+
file_path_(file_path),
18+
load_succeed(init(file_path)) {
19+
};
1720

18-
bool init(const std::string& file_name);
21+
PngTextureImage(size_t width, size_t height, uint8_t initial_color);
1922

20-
size_t getWidth() const {
23+
size_t getWidth() const override {
2124
return image_width_;
2225
}
2326

24-
size_t getHeight() const {
27+
size_t getHeight() const override {
2528
return image_height_;
2629
}
2730

28-
std::vector<std::vector<uint8_t>>& getBitmapData();
31+
bool save(const std::string& file_path) override;
32+
33+
void packTo(TextureImageBase* dest, size_t x_delta, size_t y_delta) override;
34+
35+
const std::string& getFilePath() const override {
36+
return file_path_;
37+
}
38+
39+
virtual bool loadSucceed() const override {
40+
return load_succeed;
41+
}
42+
43+
virtual std::vector<uint8_t>& getBitmapData() override;
2944

3045
private:
31-
std::vector<std::vector<uint8_t>> bitmap_data_;
32-
unsigned int image_width_;
33-
unsigned int image_height_;
34-
unsigned int image_channels_;
46+
bool init(const std::string& file_name);
47+
std::vector<uint8_t> bitmap_data_;
48+
unsigned int image_width_ = 0;
49+
unsigned int image_height_ = 0;
50+
unsigned int image_channels_ = 0;
51+
bool load_succeed;
52+
std::string file_path_;
3553
};
3654
}

include/plateau/texture/texture_image.h

Lines changed: 0 additions & 69 deletions
This file was deleted.

0 commit comments

Comments
 (0)