Skip to content

Commit 92f1a46

Browse files
feat: rename Freed to Gestalt across the codebase and update related documentation
1 parent 5d5ea6f commit 92f1a46

File tree

20 files changed

+379
-38
lines changed

20 files changed

+379
-38
lines changed

IMPLEMENTATION.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ The reactive foundation and file system are complete and provide:
156156
**Extensibility**: Version-compatible format
157157
**Testing**: Automated validation suite
158158

159-
**The Freed 3D Editor now has a complete reactive foundation and robust file system, ready for 3D rendering implementation.**
159+
**The Gestalt 3D Editor now has a complete reactive foundation and robust file system, ready for 3D rendering implementation.**
160160
- Canvas component with basic scene setup
161161
- ReactiveGeometry component that converts store data to Three.js
162162
- Camera controls integration with viewport store

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Freed - 3D Web Editor
1+
# Gestalt - 3D Web Editor
22

33
A React-first 3D editor with reactive geometry system, built with Next.js and modern web technologies.
44

T3D_FORMAT.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
## Overview
44

5-
The T3D (Three-D) file format is a custom 3D scene format designed for the Freed 3D Editor. It stores complete 3D scenes including meshes, materials, scene hierarchy, and viewport state in a structured, version-controlled format.
5+
The T3D (Three-D) file format is a custom 3D scene format designed for the Gestalt 3D Editor. It stores complete 3D scenes including meshes, materials, scene hierarchy, and viewport state in a structured, version-controlled format.
66

77
## Format Structure
88

@@ -23,7 +23,7 @@ A T3D file is a ZIP archive containing:
2323
"modified": "2025-08-14T10:30:00.000Z",
2424
"author": "User Name",
2525
"description": "Optional scene description",
26-
"application": "Freed 3D Editor",
26+
"application": "Gestalt 3D Editor",
2727
"applicationVersion": "0.1.0"
2828
},
2929
"meshes": [...],

ai-log/agent-conversations/11.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ shortcut-provider.tsx+2-7
9292
Checked shortcut-provider.tsx, no problems found
9393

9494
mesh-view.tsx+2-5
95-
Read changed files in freed
95+
Read changed files in gestalt
9696

9797
mesh-view.tsx+6-6
9898
editor-viewport.tsx+1-1

ai-log/agent-conversations/16.md

Lines changed: 270 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,271 @@
1-
# Vertical 1: Scene Hierarchy
2-
We've got most of the basic functionality as well as some advanced editing tools, now it's time to dive into some of the verticals to ensure they work properly and smoothly
1+
# Bugfixes
2+
Recording a demo i've noticed that are quite a few very subtle bugs. The following prompt is very horizontal but let's see if it can be done oneshot
33

4-
This will blow quite a few prompts but it's good at this stage to not mix up the context with horizontal features.
4+
## No Context Given
5+
## Prompt
6+
There are quite a few bugs in the editor currently:
7+
Problem:
8+
- Switching back and forth between edit and object mode makes objects unselectable in object mode
9+
- New vertices/faces/edges created in edit mode through any of the tools makes the vertex/face/edge unselectable unless i switch back to object mode and back to edit
10+
- Locking an object has no effect whatsoever
11+
- Some tools, such as bevel, extrude, inset, are only available on faces, is that the same in blender?
12+
13+
## Results
14+
I’ll fix selection/locking regressions and clarify the tools behavior, then summarize what changed and how to verify.
15+
16+
## Checklist
17+
- Fix: Switching between Edit/Object mode makes objects unselectable
18+
- Fix: Newly created verts/edges/faces aren’t selectable until mode roundtrip
19+
- Fix: Locking an object should prevent selection and transforms
20+
- Answer: Are bevel/extrude/inset faces-only in Blender?
21+
22+
## Actions taken
23+
24+
### 1) Selection state resets when toggling modes
25+
- Updated `useSelectionStore`:
26+
- `exitEditMode()` now fully clears edit selections, clears objectIds, resets `selectionMode` to `vertex`, and sets `viewMode='object'` and `meshId=null`.
27+
- `setViewMode('object')` also resets `selectionMode` to `vertex`.
28+
- `enterEditMode(meshId)` clears object selection to avoid interference.
29+
Result: No stale edit-state is left blocking object picks after switching modes.
30+
31+
Files: selection-store.ts
32+
33+
### 2) New topology becomes immediately pickable
34+
- Ensured geometry updates propagate to renderers:
35+
- In `useGeometryStore.updateMesh`, also clone `faces` and `edges` arrays in addition to `vertices`.
36+
Result: Vertex/edge/face renderers recompute buffers immediately after tools add geometry; selection works without mode roundtrip.
37+
38+
File: geometry-store.ts
39+
40+
### 3) Locking now has an effect (selection + tools)
41+
- Object selection honors `locked`:
42+
- `selectObjects` and `toggleObjectSelection` filter out locked objects via `useSceneStore.getState()`.
43+
- View and transform respect `locked`:
44+
- `MeshView`: ignores pointer down and double-click on locked objects; disables mesh raycast when locked so clicks pass through.
45+
- `ObjectToolHandler`: excludes locked objects from transform snapshots and skips committing transforms to locked objects.
46+
Result: Locked objects cannot be selected, cannot enter edit mode via double-click, and aren’t moved/rotated/scaled by object tools.
47+
48+
Files:
49+
- selection-store.ts
50+
- mesh-view.tsx
51+
- object-tool-handler.tsx
52+
53+
### Typecheck quick pass
54+
- Checked modified files: no TypeScript errors reported.
55+
56+
## How this addresses each problem
57+
58+
- Objects unselectable after mode toggles: fixed by clearing and resetting selection state consistently on mode changes; no stale edit filters remain.
59+
- New edit-mode geometry unselectable until roundtrip: fixed by cloning faces/edges during mesh updates so renderers rebuild buffers immediately.
60+
- Locking has no effect: locked objects are now unselectable, cannot enter edit mode, and are ignored by object transform tools.
61+
- Tools availability vs Blender:
62+
- Blender:
63+
- Extrude: works on vertices, edges, and faces (different behavior per element).
64+
- Inset: faces only.
65+
- Bevel: typically edges and vertices in edit mode (and also as a modifier).
66+
- Your app: faces-only for extrude/inset/bevel is a current limitation, not Blender’s behavior. You can extend to edges/verts later.
67+
68+
## Notes and next steps
69+
- Optional UX polish:
70+
- Visually indicate “locked” in the hierarchy and viewport (icon/overlay).
71+
- Disable lock-sensitive UI controls (transform buttons) when only locked objects are selected.
72+
- Expand tools:
73+
- Extrude for edges/verts and bevel for edges/verts to match Blender’s coverage.
74+
75+
## Quality gates
76+
- Typecheck modified files: PASS
77+
- Lint/build: Not run end-to-end here; changes are localized and compile clean.
78+
- Smoke: Interaction paths adjusted without API changes.
79+
80+
Requirements coverage:
81+
- Mode toggle unselectable: Done
82+
- New elements selectable immediately: Done
83+
- Locking behavior: Done
84+
- Blender tools availability: Answered
85+
86+
If you want, I can add a small “lock” badge in `MeshView` and disable transform toolbar buttons when selection contains only locked objects.
87+
88+
alightinastorm: I can't verify because the top bar for tools still shows all mentioned tools disabled unless i'm on faces?
89+
90+
The object / edit / object mode switch selection bug still persists
91+
92+
The vertex/face/edge bug seems to be resolved
93+
94+
GitHub Copilot: I’ll scan toolbar components and selection-dependent enabling logic to fix tool buttons being disabled, and re-check mode toggle interaction surfaces that could still block object picking.
95+
```
96+
97+
98+
Made changes.
99+
100+
101+
```
102+
103+
```
104+
105+
106+
Made changes.
107+
108+
109+
```
110+
111+
```
112+
113+
114+
Made changes.
115+
116+
117+
```
118+
119+
```
120+
121+
122+
Made changes.
123+
124+
125+
```
126+
127+
```
128+
129+
130+
Made changes.
131+
132+
133+
```
134+
Thanks for the quick feedback—I'll address the two remaining issues.
135+
136+
## Plan
137+
- Make transform tools enabled in Edit Mode even without face selection (only keep faces-only for extrude/inset/bevel).
138+
- Hunt down the lingering Object/Edit/Object selection bug and fix any leftover state interfering with picking.
139+
140+
## Changes just made
141+
142+
1) Edit toolbar enabling
143+
- edit-tools-toolbar.tsx:
144+
- Move/Rotate/Scale now enable whenever you’re in Edit Mode (no element selection required).
145+
- Extrude/Inset/Bevel still require faces selected.
146+
- Loop Cut enabled in Edit Mode as before.
147+
148+
2) Eliminate leftover tool state on mode switch
149+
- selection-store.ts:
150+
- When changing modes (`setViewMode`, `enterEditMode`, `exitEditMode`), any active tool is reset. This releases pointer lock and global listeners that could block clicks.
151+
152+
3) Stabilize view-mode driven rendering and picking
153+
- mesh-view.tsx:
154+
- Switched to granular selectors: `useViewMode()` and a direct selector for `objectIds`, so raycast/handlers update immediately as you toggle modes or change selection.
155+
- Locked objects are unselectable and can’t enter edit (raycast disabled, pointer handlers early-return).
156+
- scene-content.tsx:
157+
- Use `useViewMode()` so `EditModeOverlay` mounts/unmounts reliably on mode changes.
158+
- top-toolbar.tsx:
159+
- Clicking “Object” now calls `exitEditMode()` (instead of just flipping a flag) ensuring a full clean reset.
160+
- “Edit” button ignores locked objects.
161+
162+
4) New topology pickability (already working for you)
163+
- Kept improvement so faces/edges arrays are also cloned in `updateMesh()` to force re-compute of render buffers.
164+
165+
## What to verify
166+
167+
- Tools panel:
168+
- In Edit Mode with no selection, Move/Rotate/Scale should be enabled; Extrude/Inset/Bevel remain disabled until faces are selected; Loop Cut enabled.
169+
170+
- Mode toggling:
171+
- Select an object in Object Mode, enter Edit Mode, then switch back to Object Mode via toolbar or Tab. You should be able to select objects immediately. No extra click or mode flip needed.
172+
- Ensure no cursor “stuck” behavior from pointer lock—clicks pass through.
173+
174+
- Locking:
175+
- Lock an object: it shouldn’t be selectable; double-click won’t enter edit; object tools ignore it.
176+
177+
If the Object/Edit/Object selection bug still persists, tell me exactly how you’re switching modes (Tab or toolbar), and if a specific object/shape causes it—I’ll trace that exact path next.
178+
179+
alightinastorm: Nope, an object that was in edit mode, if i go back to object mode, is no longer selectable by clicking on it. Only through the hierarchy panel but in the viewport it is broken. Other objects that were not edited remain clickable
180+
181+
GitHub Copilot: I need to investigate what happens to the raycast setup when objects exit edit mode. Let me check if there's a lingering raycast stub or state that blocks object picking. Found the issue! The problem is in the raycast logic. When `viewMode === 'edit'`, we're setting `raycast={raycastStub}` which is an empty function that prevents intersection detection. But the object that was previously in edit mode might still have this viewMode check causing issues.
182+
183+
Let me check the actual viewMode state and see if there's a stale reference:
184+
```
185+
186+
187+
Made changes.
188+
189+
190+
```
191+
Wait, that's getting complex. The real issue is simpler - when we're in edit mode, we shouldn't disable raycast for ALL objects, only for the object being edited (since EditModeOverlay handles picking for that object). Let me fix this properly:
192+
```
193+
194+
195+
Made changes.
196+
197+
198+
```
199+
Actually, let me use a proper selector to avoid calling getState() in render:
200+
```
201+
202+
203+
Made changes.
204+
205+
206+
```
207+
208+
```
209+
210+
211+
Made changes.
212+
213+
214+
```
215+
Perfect! Now let me verify the logic:
216+
217+
1. **When in Object Mode (`viewMode === 'object'`)**: `raycast` is `undefined`, so normal raycasting works for all objects.
218+
219+
2. **When in Edit Mode (`viewMode === 'edit'`)**:
220+
- For the object being edited (`obj.meshId === editMeshId`): `raycast` is set to `raycastStub` (empty function), so clicks are handled by `EditModeOverlay` instead.
221+
- For other objects (`obj.meshId !== editMeshId`): `raycast` is `undefined`, so they remain clickable.
222+
223+
3. **When locked**: `raycast` is always an empty function, so clicks pass through regardless of mode.
224+
225+
The bug was that previously ALL objects had their raycast disabled when in edit mode, making them unclickable when returning to object mode. Now only the object currently being edited has raycast disabled, and when we exit edit mode (`editMeshId` becomes `null`), all objects become clickable again.
226+
227+
This should fix the issue where objects that were previously in edit mode become unselectable in object mode.
228+
229+
alightinastorm: I don't understand: The object that is selected, i change to edit mode, directly back to object. It is now unselected and additionally no matter how many times i click on it i can no longer select it
230+
231+
GitHub Copilot: I see the issue now. When we exit edit mode, the `exitEditMode()` function is clearing the `objectIds` array, which deselects the object. Then the raycast logic might still be interfering. Let me trace this step by step:
232+
233+
1. Object selected in object mode
234+
2. Enter edit mode → `enterEditMode()` clears `objectIds`
235+
3. Exit edit mode → `exitEditMode()` also clears `objectIds`
236+
4. Object becomes unselectable
237+
238+
Let me check what's happening in the selection store: Now let me check the MeshView component to see if there's something preventing the re-selection: I think I see a potential issue. The `exitEditMode()` is clearing the `objectIds`, but when we try to re-select the object, it might not be working properly. Let me also check if there are any issues with the object selection logic when locked status is checked: Let me check the rest of the selectObjects function and also the toggle function: I think I found the problem! The issue is that when we exit edit mode, we clear the `objectIds` array, but we should preserve the object selection to re-select the object we were just editing. Let me fix this:
239+
```
240+
241+
242+
Made changes.
243+
244+
245+
```
246+
247+
```
248+
249+
250+
Made changes.
251+
252+
253+
```
254+
Now let me test this logic and also check if there are any other places where the object selection might be getting cleared: Perfect! Now the fix should work as follows:
255+
256+
1. **Object selected in Object Mode**`objectIds = [objectId]`
257+
2. **Enter Edit Mode**`objectIds` is preserved, `viewMode = 'edit'`, `meshId = meshId`
258+
3. **Exit Edit Mode**`objectIds` is still preserved, `viewMode = 'object'`, `meshId = null`
259+
4. **Object should remain selected and clickable**
260+
261+
The key changes:
262+
- `enterEditMode()` no longer clears `objectIds`
263+
- `exitEditMode()` no longer clears `objectIds`
264+
- This preserves the object selection when transitioning between modes
265+
266+
This should fix the issue where objects become unselectable after being in edit mode. The object should:
267+
1. Remain visually selected (orange color) when you exit edit mode
268+
2. Be clickable again for future selections
269+
3. Allow you to enter edit mode again via double-click
270+
271+
Try this now: select an object, press Tab to enter edit mode, press Tab again to exit edit mode. The object should remain selected and clickable.

ai-log/agent-conversations/17.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# Vertical 1: Scene Hierarchy
2+
We've got most of the basic functionality as well as some advanced editing tools, now it's time to dive into some of the verticals to ensure they work properly and smoothly
3+
4+
This will blow quite a few prompts but it's good at this stage to not mix up the context with horizontal features.
5+
6+
## Prompt
7+
Task: Implement a proper and full scene hierarchy panel.
8+
User Interactions:
9+
- On the top of the panel should be a search, which filters the objects
10+
- Hierarchy: Users should be able to group nodes in groups (called collections/folders in blender)
11+
- Select multiple by holding shift and clicking nodes (toggle select/unselect)
12+
- Selecting a group selects all nodes in it's subhierarchy
13+
- Locking / Unlocking
14+
- View / Hide
15+
- Camera / No Camera (Part of final render or not)
16+
- Delete
17+
- Copy
18+
- Paste
19+
- Cut
20+
Rendering:
21+
- Some features such as view/hide, locking, camera should be visible when the node is hovered (and clickable)
22+
- All others and the above are available via a context menu on right click, you may use base-ui for context menus, it is already installed
23+
https://base-ui.com/react/components/context-menu
24+
-

ai-log/agent-conversations/9.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ Read page.tsx
115115
page.tsx+2-2
116116
Checked page.tsx, no problems found
117117

118-
Read changed files in freed
118+
Read changed files in gestalt
119119

120120
Read package.json
121121

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"name": "freed",
2+
"name": "gestalt",
33
"version": "0.1.0",
44
"private": true,
55
"scripts": {

src/app/layout.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ const geistMono = Geist_Mono({
1313
});
1414

1515
export const metadata: Metadata = {
16-
title: "FreeD 3D Editor",
16+
title: "Gestalt 3D Editor",
1717
description: "A (soon) powerful 3D editing tool",
1818
};
1919

0 commit comments

Comments
 (0)