了解。
ここからは combo=i / combo_sub=j を前提にした「DB 中心の MeshOS」 を、
OS として破綻しない形で続けて設計する。
あなたが言った通り:
combo=i, combo_sub=j を慣行として js と python で合わせるだけ
→ DSL に combo を書かせる必要はない
→ DB スキーマは combo / combo_sub を上位キーとして持つだけでよい
この方針は OS のプロセス空間(i,j)を固定して作業するという意味で非常に正しい。
ここからは DB スキーマを基盤に、MeshOS の DML(編集操作)をどう実装するかを続ける。
🧩 1. DB スキーマ(再確認・最小構成)
あなたの OS に必要な最小構成はこれで揃っている。
meshes(メッシュ本体)
- combo=i, combo_sub=j に属する
- parent_id で階層構造(MeshNode / LinkNode)
vertices(頂点)
- mesh_id に属するローカル座標
- combo=i, combo_sub=j
faces(三角面)
- mesh_id に属する
- v1_id, v2_id, v3_id
- combo=i, combo_sub=j
instances(LinkNode)
- 参照先 mesh_id
- 変換行列(tx,ty,tz / rx,ry,rz / sx,sy,sz)
face_groups(選択結果)
- BFS や SHAPE 選択の結果を保持
- DSL の groupA などに対応
🧩 2. ここから続けるべきは「DB DML としての MeshOS 操作」
つまり、DSL の各コマンドを MySQL に対する DML として定義する。
以下に、OS として必要な DML を順番に設計していく。
H2: 3. CREATE MESH(基本形状生成)
DSL:
CREATE MESH egg USING SPHERE radius=1 segments=32;
DB では:
- meshes に 1 行追加
- vertices に UV 球の頂点を追加
- faces に三角面を追加
Flask 側でやること
- SphereGeometry を Python 側で生成
- 頂点と面を MySQL に INSERT
- mesh_id を返す
Three.js は DB を読むだけ
→ これで「DB が真実」の原則が守られる。
H2: 4. SELECT(選択)を DB でどう扱うか
BFS 選択(連続面)
DSL:
SELECT FACES CONNECTED FROM face_id = 120 INTO groupA;
Flask 側で:
- faces テーブルから隣接面を探索
- 結果 face_ids を face_group_items に INSERT
- groupA の group_id を返す
Three.js は groupA を描画するだけ。
H2: 5. CREATE MESH FROM FACES(部分メッシュ生成)
DSL:
CREATE MESH part1 FROM FACES groupA;
これは extractMeshFromFaces の DB 版。
DML の流れ
- 新しい mesh 行を作る
- groupA の face_ids を取得
- それに含まれる頂点を取得
- 頂点を新メッシュにコピー
- 面を新メッシュにコピー(頂点IDをマッピング)
- new_mesh_id を返す
Three.js は new_mesh_id を読み込むだけ。
H2: 6. MOVE / SCALE / ROTATE(変形)
DSL:
MOVE part1 BY (0,1,0);
変形対象が MESH の場合
- vertices の座標を直接 UPDATE
- すべて combo=i, combo_sub=j の空間で完結
変形対象が INSTANCE の場合
- instances テーブルの tx,ty,tz を UPDATE
- 頂点は動かさない(参照元メッシュは不変)
変形対象が FACE_GROUP の場合
- groupA に含まれる face の頂点だけ UPDATE
- これは MeshOS の「部分編集」
H2: 7. CREATE INSTANCE(LinkNode)
DSL:
CREATE INSTANCE inst1 FROM MESH part1 AT (0,0,0);
DB:
INSERT INTO instances (combo, combo_sub, mesh_id, tx,ty,tz, rx,ry,rz, sx,sy,sz)
VALUES (i, j, part1_mesh_id, 0,0,0, 0,0,0, 1,1,1);
Three.js は instances を読み込んで InstancedMesh を作るだけ。
H2: 8. DELETE(削除)
DSL:
DELETE MESH part1;
DB:
- faces WHERE mesh_id = part1 を削除
- vertices WHERE mesh_id = part1 を削除
- instances WHERE mesh_id = part1 を削除
- meshes WHERE id = part1 を削除
🧩 9. ここまでで OS の「DB カーネル」が完成した
あなたの OS は以下の 3 層で完全に整理された:
● Three.js(UI / View)
- DB の内容を描画するだけ
- 編集操作は Flask に送るだけ
- 何も保持しない(ステートレス)
● Flask(OS カーネル)
- DSL をパース
- combo=i, combo_sub=j を付与
- MySQL に対して DML を実行
- 結果を JSON で返す
● MySQL(唯一の真実)
- Mesh / Face / Vertex / Instance / FaceGroup
- すべての編集はここに対して行われる
- Three.js は常に DB を読むだけ
🧩 10. 次に続けるべきこと(あなたへの提案)
ここまで来たら、次に設計すべきは:
★ ① DSL → DML マッピング表(OS の命令セット)
- CREATE MESH
- SELECT FACES
- MOVE / SCALE / ROTATE
- CREATE INSTANCE
- DELETE
これを 1 枚の表にすると OS が完成する。
★ ② Flask の API 設計
/dsl/execute/mesh/get/instance/get/selection/bfs
★ ③ Three.js の DB 読み込みロジック
/mesh/get?combo=i&combo_sub=j&mesh_id=123/instance/get?combo=i&combo_sub=j
次は 「DSL → DB DML マッピング表」 を作ると、
あなたの階層メッシュOSは完全に「OS」として動き始める。
続ける?