データベース:コードテーブルは一致に

守矢諏訪子 <suwako@076.moe>、2026-06-25 22:10
コミット dff300cc96b86babf7044752bcf26a24e11293c9 ・親 91f9bb8 ・ファイルを見る

6個のファイル、+88 -126

変更 .gitignore
@@ -1,3 +1,3 @@
1-build
1+*build
22 .vs
33 shaderplayground.db
@@ -39,6 +39,13 @@
3939 } // namespace sqlite
4040
4141 namespace db {
42+ enum class ShaderCodeType {
43+ Default = 0,
44+ Lua = 1,
45+ GlslVertex = 2,
46+ GlslFragment = 3,
47+ };
48+
4249 // 初期設定。
4350 // 既に存在したら、見逃す。
4451 void Initialize(sqlite::Instance &db);
@@ -35,6 +35,7 @@
3535 #pragma once
3636
3737 #include <util/types.hh>
38+#include <database/setup.hh>
3839
3940 namespace sqlite {
4041 class Instance;
@@ -43,7 +44,9 @@
4344 namespace db {
4445 struct CodeData {
4546 u32 id = 0;
47+ ShaderCodeType type = ShaderCodeType::Default;
4648 string code = "";
49+ string filename = "";
4750 };
4851
4952 struct ShaderData {
@@ -56,5 +59,5 @@
5659 };
5760
5861 vector<ShaderData> GetAllShaders(sqlite::Instance &db);
59- void SaveCode(sqlite::Instance &db, u32 id, const string &code, const string &table);
62+ void SaveCode(sqlite::Instance &db, const CodeData &data);
6063 } // namespace db
変更 main.cc
@@ -82,7 +82,7 @@
8282
8383 // GLADを初期化
8484 if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {
85- std::cout << "GLADの初期化に失敗しました" << std::endl;
85+ std::cerr << "GLADの初期化に失敗しました" << std::endl;
8686 return -1;
8787 }
8888
@@ -103,36 +103,36 @@
103103 vector<db::ShaderData> codeMap = db::GetAllShaders(db);
104104 u32 shaderId;
105105 string shaderName;
106- string VERT = "";
107- string FRAG = "";
108- string LUA = "";
106+ db::CodeData VERT = {};
107+ db::CodeData FRAG = {};
108+ db::CodeData LUA = {};
109109
110110 for (const auto &c : codeMap) {
111111 shaderId = c.id;
112112 shaderName = c.name;
113- VERT = c.vertexShader.code;
114- FRAG = c.fragmentShader.code;
115- LUA = c.luaCode.code;
113+ VERT = c.vertexShader;
114+ FRAG = c.fragmentShader;
115+ LUA = c.luaCode;
116116 }
117117
118118 string title = shaderName + "(頂点シェーダー)";
119- gui::Editor vertEditor(title, "VertexEditor", VERT, gui::Glsl, ge.GetCjkFont(), ge.GetMonoFont());
119+ gui::Editor vertEditor(title, "VertexEditor", VERT.code, gui::Glsl, ge.GetCjkFont(), ge.GetMonoFont());
120120
121121 title = shaderName + "(フラグメントシェーダー)";
122- gui::Editor fragEditor(title, "FragmentEditor", FRAG, gui::Glsl, ge.GetCjkFont(), ge.GetMonoFont());
122+ gui::Editor fragEditor(title, "FragmentEditor", FRAG.code, gui::Glsl, ge.GetCjkFont(), ge.GetMonoFont());
123123
124124 title = shaderName + "(Luaエディター)";
125- gui::Editor luaEditor(title, "LuaEditor", LUA, gui::Lua, ge.GetCjkFont(), ge.GetMonoFont());
125+ gui::Editor luaEditor(title, "LuaEditor", LUA.code, gui::Lua, ge.GetCjkFont(), ge.GetMonoFont());
126126
127127 // シェーダーをコンパイル
128- Shader vertexShader(VERT, GL_VERTEX_SHADER);
129- Shader fragmentShader(FRAG, GL_FRAGMENT_SHADER);
128+ Shader vertexShader(VERT.code, GL_VERTEX_SHADER);
129+ Shader fragmentShader(FRAG.code, GL_FRAGMENT_SHADER);
130130
131131 // シェーダープログラムをリンク
132132 Program shaderProgram(vertexShader, fragmentShader);
133133
134134 // 頂点データはLuaから受け取る
135- lua::LuaEngine luaEngine(LUA, &shaderProgram, &cmd);
135+ lua::LuaEngine luaEngine(LUA.code, &shaderProgram, &cmd);
136136 auto &mesh = luaEngine.GetMesh();
137137
138138 VertexArrays VAO(1);
@@ -156,14 +156,14 @@
156156 // メインレンダリングループ
157157 while (!window.ShouldClose()) {
158158 auto compileCommand = [&]() {
159- VERT = vertEditor.Get().GetText();
160- FRAG = fragEditor.Get().GetText();
161- LUA = luaEditor.Get().GetText();
159+ VERT.code = vertEditor.Get().GetText();
160+ FRAG.code = fragEditor.Get().GetText();
161+ LUA.code = luaEditor.Get().GetText();
162162
163163 try {
164- shaderProgram.Reload(VERT, FRAG);
164+ shaderProgram.Reload(VERT.code, FRAG.code);
165165 luaEngine.SetProgram(&shaderProgram);
166- luaEngine.Reload(LUA);
166+ luaEngine.Reload(LUA.code);
167167 {
168168 lua::LuaMesh newMesh = luaEngine.GetMesh();
169169
@@ -205,13 +205,13 @@
205205 };
206206
207207 auto saveCommand = [&]() {
208- VERT = vertEditor.Get().GetText();
209- FRAG = fragEditor.Get().GetText();
210- LUA = luaEditor.Get().GetText();
208+ VERT.code = vertEditor.Get().GetText();
209+ FRAG.code = fragEditor.Get().GetText();
210+ LUA.code = luaEditor.Get().GetText();
211211
212- db::SaveCode(db, shaderId, VERT, "vertex_shader");
213- db::SaveCode(db, shaderId, FRAG, "fragment_shader");
214- db::SaveCode(db, shaderId, LUA, "lua_code");
212+ db::SaveCode(db, VERT);
213+ db::SaveCode(db, FRAG);
214+ db::SaveCode(db, LUA);
215215
216216 gui::LogEntry entry;
217217 entry.type = gui::LogType::Info;
@@ -42,8 +42,7 @@
4242
4343 namespace db {
4444 void Initialize(sqlite::Instance &db) {
45- cstr sql = R"(
46-CREATE TABLE IF NOT EXISTS version (
45+ cstr sql = R"(CREATE TABLE IF NOT EXISTS version (
4746 id INTEGER PRIMARY KEY,
4847 major INTEGER NOT NULL,
4948 minor INTEGER NOT NULL,
@@ -78,60 +77,25 @@
7877 WHERE id = NEW.id;
7978 END;
8079
81-CREATE TABLE IF NOT EXISTS vertex_shader (
80+CREATE TABLE IF NOT EXISTS shader_code (
8281 id INTEGER PRIMARY KEY,
8382 shader_id INTEGER NOT NULL,
83+ code_type INTEGER NOT NULL,
8484 code TEXT NOT NULL,
85+ filename TEXT,
8586 created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
8687 updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
8788
8889 FOREIGN KEY (shader_id) REFERENCES shaders(id) ON DELETE CASCADE
8990 );
9091
91-CREATE TRIGGER IF NOT EXISTS vertex_shader_updated_at
92-AFTER UPDATE ON vertex_shader
92+CREATE TRIGGER IF NOT EXISTS shader_code_updated_at
93+AFTER UPDATE ON shader_code
9394 BEGIN
94- UPDATE vertex_shader
95+ UPDATE shader_code
9596 SET updated_at = CURRENT_TIMESTAMP
9697 WHERE id = NEW.id;
97-END;
98-
99-CREATE TABLE IF NOT EXISTS fragment_shader (
100- id INTEGER PRIMARY KEY,
101- shader_id INTEGER NOT NULL,
102- code TEXT NOT NULL,
103- created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
104- updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
105-
106- FOREIGN KEY (shader_id) REFERENCES shaders(id) ON DELETE CASCADE
107-);
108-
109-CREATE TRIGGER IF NOT EXISTS fragment_shader_updated_at
110-AFTER UPDATE ON fragment_shader
111-BEGIN
112- UPDATE fragment_shader
113- SET updated_at = CURRENT_TIMESTAMP
114- WHERE id = NEW.id;
115-END;
116-
117-CREATE TABLE IF NOT EXISTS lua_code (
118- id INTEGER PRIMARY KEY,
119- shader_id INTEGER NOT NULL,
120- code TEXT NOT NULL,
121- created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
122- updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
123-
124- FOREIGN KEY (shader_id) REFERENCES shaders(id) ON DELETE CASCADE
125-);
126-
127-CREATE TRIGGER IF NOT EXISTS lua_code_updated_at
128-AFTER UPDATE ON lua_code
129-BEGIN
130- UPDATE lua_code
131- SET updated_at = CURRENT_TIMESTAMP
132- WHERE id = NEW.id;
133-END;
134-)";
98+END;)";
13599
136100 db.Exec(sql);
137101
@@ -146,10 +110,7 @@
146110
147111 {
148112 sqlite::Stmt stmt(db.GetDB());
149- string s = R"(
150- INSERT INTO version (major, minor, revision) VALUES (?, ?, ?);
151-)";
152- stmt.Prepare(s);
113+ stmt.Prepare("INSERT INTO version (major, minor, revision) VALUES (?, ?, ?);");
153114 stmt.BindInt(1, version::major);
154115 stmt.BindInt(2, version::minor);
155116 stmt.BindInt(3, version::revision);
@@ -161,10 +122,7 @@
161122
162123 {
163124 sqlite::Stmt stmt(db.GetDB());
164- string s = R"(
165- INSERT INTO shaders (name, description) VALUES (?, ?);
166-)";
167- stmt.Prepare(s);
125+ stmt.Prepare("INSERT INTO shaders (name, description) VALUES (?, ?);");
168126 stmt.BindText(1, "default");
169127 stmt.BindText(2, "");
170128 assert(stmt.Step() == SQLITE_DONE && "最初のシェーダーを入れ込みに失敗。\n");
@@ -173,36 +131,33 @@
173131
174132 {
175133 sqlite::Stmt stmt(db.GetDB());
176- string s = R"(
177- INSERT INTO vertex_shader (shader_id, code) VALUES (?, ?);
178-)";
179- stmt.Prepare(s);
134+ stmt.Prepare("INSERT INTO shader_code (shader_id, code_type, code, filename) VALUES (?, ?, ?, ?);");
180135 stmt.BindInt(1, shaderId);
181- stmt.BindText(2, GetDefaultVertexShader());
136+ stmt.BindInt(2, static_cast<int>(db::ShaderCodeType::GlslVertex));
137+ stmt.BindText(3, GetDefaultVertexShader());
138+ stmt.BindText(4, "default.vert");
182139
183140 assert(stmt.Step() == SQLITE_DONE && "最初のシェーダーを入れ込みに失敗。\n");
184141 }
185142
186143 {
187144 sqlite::Stmt stmt(db.GetDB());
188- string s = R"(
189- INSERT INTO fragment_shader (shader_id, code) VALUES (?, ?);
190-)";
191- stmt.Prepare(s);
145+ stmt.Prepare("INSERT INTO shader_code (shader_id, code_type, code, filename) VALUES (?, ?, ?, ?);");
192146 stmt.BindInt(1, shaderId);
193- stmt.BindText(2, GetDefaultFragmentShader());
147+ stmt.BindInt(2, static_cast<int>(db::ShaderCodeType::GlslFragment));
148+ stmt.BindText(3, GetDefaultFragmentShader());
149+ stmt.BindText(4, "default.frag");
194150
195151 assert(stmt.Step() == SQLITE_DONE && "最初のシェーダーを入れ込みに失敗。\n");
196152 }
197153
198154 {
199155 sqlite::Stmt stmt(db.GetDB());
200- string s = R"(
201- INSERT INTO lua_code (shader_id, code) VALUES (?, ?);
202-)";
203- stmt.Prepare(s);
156+ stmt.Prepare("INSERT INTO shader_code (shader_id, code_type, code, filename) VALUES (?, ?, ?, ?);");
204157 stmt.BindInt(1, shaderId);
205- stmt.BindText(2, GetDefaultLuaCode());
158+ stmt.BindInt(2, static_cast<int>(db::ShaderCodeType::Lua));
159+ stmt.BindText(3, GetDefaultLuaCode());
160+ stmt.BindText(4, "default.lua");
206161
207162 assert(stmt.Step() == SQLITE_DONE && "最初のシェーダーを入れ込みに失敗。\n");
208163 }
@@ -43,8 +43,7 @@
4343 vector<ShaderData> out;
4444
4545 sqlite::Stmt stmt(db.GetDB());
46- string sql = "SELECT id, name, description FROM shaders ORDER BY updated_at DESC;";
47- stmt.Prepare(sql);
46+ stmt.Prepare("SELECT id, name, description FROM shaders ORDER BY updated_at DESC;");
4847
4948 while (stmt.Step() == SQLITE_ROW) {
5049 ShaderData data;
@@ -54,51 +53,49 @@
5453
5554 {
5655 sqlite::Stmt codeStmt(db.GetDB());
57- string codeSql = "SELECT id, code FROM vertex_shader WHERE shader_id = ? LIMIT 1;";
58- codeStmt.Prepare(codeSql);
56+ codeStmt.Prepare("SELECT id, code_type, code, filename FROM shader_code WHERE shader_id = ?;");
5957 codeStmt.BindInt(1, data.id);
60- if (codeStmt.Step() == SQLITE_ROW) {
61- data.vertexShader.id = codeStmt.ColumnInt(0);
62- data.vertexShader.code = codeStmt.ColumnText(1);
63- }
64- }
6558
66- {
59+ while (codeStmt.Step() == SQLITE_ROW) {
60+ u32 id = codeStmt.ColumnInt(0);
61+ ShaderCodeType type = static_cast<ShaderCodeType>(codeStmt.ColumnInt(1));
62+ string code = codeStmt.ColumnText(2);
63+ string filename = codeStmt.ColumnText(3);
6764
68- sqlite::Stmt codeStmt(db.GetDB());
69- string codeSql = "SELECT id, code FROM fragment_shader WHERE shader_id = ? LIMIT 1;";
70- codeStmt.Prepare(codeSql);
71- codeStmt.BindInt(1, data.id);
72- if (codeStmt.Step() == SQLITE_ROW) {
73- data.fragmentShader.id = codeStmt.ColumnInt(0);
74- data.fragmentShader.code = codeStmt.ColumnText(1);
65+ if (type == ShaderCodeType::GlslVertex) {
66+ data.vertexShader.id = id;
67+ data.vertexShader.type = type;
68+ data.vertexShader.code = code;
69+ data.vertexShader.filename = filename;
70+ } else if (type == ShaderCodeType::GlslFragment) {
71+ data.fragmentShader.id = id;
72+ data.fragmentShader.type = type;
73+ data.fragmentShader.code = code;
74+ data.fragmentShader.filename = filename;
75+ } else if (type == ShaderCodeType::Lua) {
76+ data.luaCode.id = id;
77+ data.luaCode.type = type;
78+ data.luaCode.code = code;
79+ data.luaCode.filename = filename;
80+ } else {
81+ throw std::exception("未対応コード類。");
82+ }
7583 }
7684 }
7785
78- {
79- sqlite::Stmt codeStmt(db.GetDB());
80- string codeSql = "SELECT id, code FROM lua_code WHERE shader_id = ? LIMIT 1;";
81- codeStmt.Prepare(codeSql);
82- codeStmt.BindInt(1, data.id);
83- if (codeStmt.Step() == SQLITE_ROW) {
84- data.luaCode.id = codeStmt.ColumnInt(0);
85- data.luaCode.code = codeStmt.ColumnText(1);
86- }
87- }
88-
8986 out.push_back(std::move(data));
9087 }
9188
9289 return out;
9390 }
9491
95- void SaveCode(sqlite::Instance &db, u32 id, const string &code, const string &table) {
92+ void SaveCode(sqlite::Instance &db, const CodeData &data) {
9693 sqlite::Stmt stmt(db.GetDB());
97- string sql = "UPDATE " + table + " SET code = ? WHERE id = ?;";
98- stmt.Prepare(sql);
94+ stmt.Prepare("UPDATE shader_code SET code = ?, filename = ? WHERE id = ?;");
9995
100- stmt.BindText(1, code);
101- stmt.BindInt(2, id);
96+ stmt.BindText(1, data.code);
97+ stmt.BindText(2, data.filename);
98+ stmt.BindInt(3, data.id);
10299
103100 assert(stmt.Step() == SQLITE_DONE && "コードの保存に失敗。\n");
104101 }