シェーダーの保存ボタン

守矢諏訪子 <suwako@076.moe>、2026-06-25 03:16
コミット f8b12a7088f2574b60beb212be4b38167fec8f00 ・親 a43d6c3 ・ファイルを見る

4個のファイル、+27 -2

@@ -56,4 +56,5 @@
5656 };
5757
5858 vector<ShaderData> GetAllShaders(sqlite::Instance &db);
59+ void SaveCode(sqlite::Instance &db, u32 id, const string &code, const string &table);
5960 } // namespace db
変更 main.cc
@@ -75,7 +75,9 @@
7575 window.MakeContextCurrent();
7676 glfw.SwapInterval(1);
7777
78+#ifndef PRODUCTION_BUILD
7879 bool showDemo = true;
80+#endif
7981
8082 // GLADを初期化
8183 if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {
@@ -95,12 +97,14 @@
9597
9698 // データベースからシェーダーとLuaコードの受け取り
9799 vector<db::ShaderData> codeMap = db::GetAllShaders(db);
100+ u32 shaderId;
98101 string shaderName;
99102 string VERT = "";
100103 string FRAG = "";
101104 string LUA = "";
102105
103106 for (const auto &c : codeMap) {
107+ shaderId = c.id;
104108 shaderName = c.name;
105109 VERT = c.vertexShader.code;
106110 FRAG = c.fragmentShader.code;
@@ -153,7 +157,9 @@
153157
154158 gui::showTitleBar();
155159
160+#ifndef PRODUCTION_BUILD
156161 if (showDemo) ImGui::ShowDemoWindow(&showDemo);
162+#endif
157163
158164 vertEditor.Render();
159165 fragEditor.Render();
@@ -174,7 +180,6 @@
174180 shaderProgram.Reload(VERT, FRAG);
175181 luaEngine.Reload(LUA);
176182 {
177- //lua::LuaEngine newLua(LUA);
178183 lua::LuaMesh newMesh = luaEngine.GetMesh();
179184
180185 VAO.BindVertexArray();
@@ -211,6 +216,13 @@
211216 ImGui::SameLine();
212217
213218 if (ImGui::Button("保存(CTRL + S)")) {
219+ VERT = vertEditor.Get().GetText();
220+ FRAG = fragEditor.Get().GetText();
221+ LUA = luaEditor.Get().GetText();
222+
223+ db::SaveCode(db, shaderId, VERT, "vertex_shader");
224+ db::SaveCode(db, shaderId, FRAG, "fragment_shader");
225+ db::SaveCode(db, shaderId, LUA, "lua_code");
214226 }
215227
216228 ImGui::Text("現在フレームレート: %.3f ms/frame (%.1f FPS)", 1000.0f / ge.GetIO().Framerate, ge.GetIO().Framerate);
@@ -36,6 +36,7 @@
3636 #include <util/sqlite.hh>
3737 #include <sqlite3.h>
3838 #include <iostream>
39+#include <cassert>
3940
4041 namespace db {
4142 vector<ShaderData> GetAllShaders(sqlite::Instance &db) {
@@ -89,5 +90,16 @@
8990 }
9091
9192 return out;
93+ }
94+
95+ void SaveCode(sqlite::Instance &db, u32 id, const string &code, const string &table) {
96+ sqlite::Stmt stmt(db.GetDB());
97+ string sql = "UPDATE " + table + " SET code = ? WHERE id = ?;";
98+ stmt.Prepare(sql);
99+
100+ stmt.BindText(1, code);
101+ stmt.BindInt(2, id);
102+
103+ assert(stmt.Step() == SQLITE_DONE && "コードの保存に失敗。\n");
92104 }
93105 } // namespace db
@@ -81,7 +81,7 @@
8181
8282 bool Stmt::Prepare(const std::string &sql) {
8383 if (sqlite3_prepare_v2(m_pDB, sql.c_str(), static_cast<int>(sql.size() + 1), &m_pSTMT, nullptr) != SQLITE_OK) {
84- throw std::runtime_error("SQLの準備に失敗。");
84+ throw std::runtime_error("SQLの準備に失敗: " + std::string(sqlite3_errmsg(m_pDB)));
8585 }
8686
8787 return true;