Quick start workflow
Create an account with your email address, verify it with the emailed 6-digit code, then open the editor and write a grammar into the input panel. Save drafts privately while you iterate. When a piece is ready, publish it to the gallery so it becomes browsable in the live viewer.
The PHP shell does not replace the original grammar runtime. It wraps the working modular editor so the same scene engine, SmartEditor, syntax highlighting, STL export, grid, axis widget, and orbit navigation remain available inside a proper site workflow.
- Email-verified accounts with code-based confirmation
- Login-protected editor and file storage
- Public gallery for published grammars
- Read-only public viewer pages
- Copy-to-editor flow for remixing gallery work
Account and recovery
Registration now stores an email address and requires email verification before normal login is allowed. If an unverified user tries to sign in, the site resends a verification code and routes them back to the verification page.
The login screen also exposes a password reset flow. Users can request a 6-digit login code by username or email, choose a new password on the reset page, confirm it, and be logged in automatically after the reset succeeds.
- 6-digit verification codes expire after 15 minutes
- Password reset uses a separate emailed login code
- Successful publish events send an admin notification email
- New registrations also send an admin notification email
Grammar authoring tips
Keep operators readable, but spaces around brackets are optional. The parser accepts forms such as `Tower(h)` and `[T(0 1 0)Part]` as long as the token boundaries stay unambiguous. Expressions may also contain spaces, tabs, newlines, and carriage returns, so multiline math is valid inside transforms and conditionals.
Build from the simplest valid scene first. Start with a single instance, then add parameters, calls, transforms, grouped blocks, and conditionals one layer at a time. That makes scene debugging far easier than writing a large grammar and trying to reason about multiple changes at once.
Use grouped blocks when you want scoped deformation behavior. Local DS*/DT* state and global GDS*/GDT* subset state both clone on group entry and restore on exit.
- Start from one visible primitive
- Add transforms incrementally
- Use brackets to compose multi-part scenes
- Add parameters and conditional calls only after the base form renders correctly
- Use GDS*/GDT* inside groups when you want several cubes to deform together without affecting the whole scene
Publishing and storage
This build now runs against Firebase-only storage at runtime. Firebase Auth signs users in, Firestore stores account and grammar metadata, and Cloud Storage stores the grammar source blobs.
Because the site keeps authored grammar text rather than only baked geometry, published works can be previewed, opened in the public viewer, or copied back into a private editor session for further iteration.
- Firebase Auth for account sign-in and verification
- Firestore for canonical user profiles and file metadata
- Cloud Storage for grammar source blobs
- Legacy JSON files remain offline migration input only
- Runtime storage now lives outside the public web root
Scene viewer controls
The integrated viewer uses the custom SVEC orbit style that was patched into the project. Drag to orbit, use the wheel to zoom, and use the fit/reset controls to reframe the current grammar output. The XZ grid and orientation axis widget are always visible inside the active scene viewer.
Published gallery pieces use the same viewer engine in read-only mode. That gives the live site a consistent visual language between authoring, browsing, and public presentation.
- Drag to orbit
- Ctrl-drag or secondary drag to pan
- Wheel to zoom
- Fit View and Reset View for framing