-
Notifications
You must be signed in to change notification settings - Fork 86
Expand file tree
/
Copy pathConfig.cpp
More file actions
150 lines (120 loc) · 3.25 KB
/
Config.cpp
File metadata and controls
150 lines (120 loc) · 3.25 KB
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
///
/// 設定構造体の実装
///
/// @file
/// @author Kohe Tokoi
/// @date November 15, 2022
///
#include "Config.h"
// 標準ライブラリ
#include <fstream>
// デフォルトの光源データ
constexpr GgSimpleShader::Light defaultLight
{
{ 0.2f, 0.2f, 0.2f, 1.0f }, // 環境光成分
{ 1.0f, 1.0f, 1.0f, 0.0f }, // 拡散反射光成分
{ 1.0f, 1.0f, 1.0f, 0.0f }, // 鏡面反射光成分
{ 0.5f, 0.5f, 1.0f, 1.0f } // 光源位置
};
//
// コンストラクタ
//
Config::Config() :
winSize{ 960, 540 },
menuFont{ "Mplus1-Regular.ttf" },
menuFontSize{ 20.0f },
light{ defaultLight },
model{ "logo.obj" },
#if defined(GL_GLES_PROTOTYPES)
shader{ "simple_es3.vert", "simple_es3.frag" }
#else
shader{ "simple.vert", "simple.frag" }
#endif
{
}
//
// ファイルから構成データを読み込むコンストラクタ
//
Config::Config(const std::string& filename) :
Config{}
{
// 構成ファイルが読み込めなかったらデフォルト値の構成ファイルを作る
if (!load(filename)) save(filename);
}
//
// デストラクタ
//
Config::~Config()
{
}
//
// 設定ファイルを読み込む
//
bool Config::load(const std::string& filename)
{
// 構成ファイルを開く
std::ifstream file{ Utf8ToTChar(filename) };
// 開けなかったらエラー
if (!file) return false;
// JSON の読み込み
picojson::value value;
file >> value;
file.close();
// 構成データの取り出し
const auto& object{ value.get<picojson::object>() };
//
// 構成データの読み込み
//
// ウィンドウサイズ
getValue(object, "window_size", winSize);
// メニューフォント
getString(object, "menu_font", menuFont);
// メニューフォントサイズ
getValue(object, "menu_font_size", menuFontSize);
// 光源
getVector(object, "ambient", light.ambient);
getVector(object, "diffuse", light.diffuse);
getVector(object, "specular", light.specular);
getVector(object, "position", light.position);
// モデル
getString(object, "model", model);
// シェーダ
getString(object, "shader", shader);
// オブジェクトが空だったらエラー
if (object.empty()) return false;
return true;
}
//
// 設定ファイルを書き出す
//
bool Config::save(const std::string& filename) const
{
// 構成ファイルを開く
std::ofstream file{ Utf8ToTChar(filename) };
// 開けなかったらエラー
if (!file) return false;
// 構成データの書き出しに使うオブジェクト
picojson::object object;
//
// 構成データの書き出し
//
// ウィンドウサイズ
setValue(object, "window_size", winSize);
// メニューフォント
setString(object, "menu_font", menuFont);
// メニューフォントサイズ
setValue(object, "menu_font_size", menuFontSize);
// 光源
setVector(object, "ambient", light.ambient);
setVector(object, "diffuse", light.diffuse);
setVector(object, "specular", light.specular);
setVector(object, "position", light.position);
// モデル
setString(object, "model", model);
// シェーダ
setString(object, "shader", shader);
// 構成出データをシリアライズして JSON で保存
picojson::value v{ object };
file << v.serialize(true);
return true;
}