Mesh Editing Mode
Mesh Edit mode collects the tools for placing mesh items in the scene and for converting a 3DGS item into a mesh. Here you generate a closed mesh from the splat, import and place GLB/OBJ meshes, add primitive shapes, and do vertex/edge/face modeling, sculpting, vertex painting and material editing.
Converting to a mesh does not remove the splat. The item's primary representation remains the 3DGS splat; the mesh is saved alongside it as a companion layer for crisp silhouettes, shadows, metal surfaces, floors, and other details that splats do not express well. The saved item renders both layers under the same transform and lighting in the standard viewer.
Getting started
Choose Mesh from the editor mode switcher. The splat stays visible, so you can compare the two representations while aligning the mesh. A fresh scene has no mesh yet, so only the Generate tab does anything at first; once one mesh exists the other tabs operate on it.
Mesh items appear in the left sidebar. Whether you generate, import or add a primitive, the result shows up as a new item in the Meshes section of the left outliner. Click an item to select it: a gizmo appears in the viewport and the Geometry · Sculpt · UV · Texture · Objects tabs on the right edit the selected mesh item. With nothing selected each tab asks you to select a mesh object first. A scene can hold several meshes, and they are saved together with the splat as one item.
The tabs on the right follow the working order.
- Generate (Gen) — build a mesh from the splat, import GLB/OBJ, add primitives, export GLB
- Geometry (Geo) — vertex/edge/face editing, simplify, smooth, subdivide, normal cleanup
- Sculpt — brush-based surface shaping and vertex paint
- UV — unwrap and preview UVs for texturing
- Texture (Tex) — material slots, base-color texture, splat → texture bake
- Objects (Obj) — name, visibility, shadows, position/rotation/scale and order
The recommended flow is Generate → clean up in Geometry → unwrap UVs → bake the texture → place in Objects → save. Saving stores the meshes in the item's companion GLB, so the viewer shows them together with the splat.
Generate tab
- Generate from splat — build a closed mesh from the current splat. There are two methods. Splat density (default) accumulates each splat's center, size and opacity into a voxel grid, treats sufficiently occupied voxels as inside, and fills enclosed empty space automatically to make a solid. It does not depend on views, so concave areas and thin structures survive well. Raising sensitivity picks up faint splats as inside for thicker, smoother results; lowering it keeps only dense parts for thinner, tighter ones. Resolution is the number of voxels per side (16–512, default 96); higher is finer but uses far more memory and time. The quality preset has no effect in density mode and is hidden. Depth capture is the previous method that captures depth from many directions and fuses it into a distance field. Surface smoothing (basic · smooth · very smooth, default smooth) filters spikes out of the captured depth, evens out the distance field and relaxes the surface to remove jagged bumps. Stronger settings also round off small details, so choose basic when fine shape matters. Higher quality takes longer, and generation can be cancelled.
- Import — add static GLB or OBJ files. A GLB must be a self-contained binary file of 64 MiB or less, with no external dependencies. JSON
.gltffiles and external.bin/image bundles are not supported yet. OBJ structure and memory use are checked in a dedicated Worker, and the import remains cancellable. A multi-file batch is committed only after every file passes validation. - Primitives — add a Box, Sphere, Cylinder, or Plane for floors and helper parts.
- Export GLB — download the current mesh scene as a self-contained GLB to continue in an external modeling tool or import into another item.
If a generated surface is heavy or rough, simplify and smooth it first. Save and every companion viewer load enforce a scene-wide limit of 1,200,000 rendered triangles and a 64 MiB GLB. Repeated instances of the same mesh count each time because the GPU renders each instance.
Geometry tab
The Geometry tab edits the shape of the selected mesh directly. Element modes and selection, the modeling commands, and the cleanup and normal tools are stacked from top to bottom.
Element modes and selection
Switch between Object, Vertex, Edge, and Face in the Geometry tab. Click the surface to select; Shift+click adds or removes. A toggles all and Ctrl/Cmd+I inverts the selection. On meshes with explicit authored quad topology, Alt+click selects the complete opposite-edge ring and Shift+Alt+click adds or removes the whole ring.
Press B or choose Box Select in the Geometry panel, then drag in the viewport to select vertices, edges, or faces in one pass. A plain drag replaces the current selection, Shift-drag adds, and Ctrl/Cmd-drag subtracts. Box Select uses X-Ray (select-through), so it includes elements hidden behind the visible surface. Before committing the drag, press Esc or right-click to cancel without changing the selection.
Modeling commands
- Selection
W/E/R— transform in mesh-local axes Delete— delete vertices or faces; Edge mode also removes directly incident faces- Face
X— extrude the selected region - Face
I— inset the selected region - Subdivide selected faces — use 1–3 levels to split selected faces fourfold per level and avoid T-junctions along the selection boundary; Edge smoothness moves only newly created midpoints
- Face
P— separate selected faces into a new object - Edge
Ctrl/Cmd+R— add 1–8 Loop Cuts to an editor-proven quad ring - Edge
Ctrl/Cmd+B— 1–8 segment profile bevel when the safety constraints are met - Boundary edge
F— fill one flat, simple boundary loop with faces
Modeling operations run in the background. Non-manifold topology, flipped or collapsed faces, intersecting boundaries, malformed attributes, and memory overruns reject the whole operation without leaving a partial edit. Bevel accepts disjoint edges, touching chains and L corners, rings, and three-way junctions on a closed orientable triangle manifold, provided no vertex has more than three selected incident edges. Set its segment count and profile in the Geometry panel. Unsafe widths and output or working-memory budget overruns reject the whole bevel without leaving a partial edit. Subdivide Levels are not a cut count: levels 1/2/3 place 1/3/7 divisions on an original edge and turn one selected face into 4/16/64 faces. Edge smoothness 0 uses exact midpoints; 1 uses the opposite faces around each interior edge to smooth only the new midpoints. UV/color/material seams remain authored, and every level is applied by one background operation and one undo step. A projected result beyond the interactive sculpt limits is warned before execution, so reduce the level or selection when needed. Loop Cut is available with exactly one selected edge on meshes that retain explicit quad topology, such as Box, Plane, Sphere, and Cylinder primitives. If the ring meets a triangle, unsupported seam, or anything other than a real mesh boundary, the whole operation is rejected instead of creating a T-junction. Face Fill requires all faces adjacent to the boundary to use the same material slot. Morph-target, instanced, skinned, and partial draw-range sources are rejected for Face Fill.
Cleanup and normals
- Taubin Smooth — clean the surface while limiting volume loss; open boundaries can be preserved.
- Simplify — reduce actual vertices while preserving components, authored UV/normal/color seams, and face-to-material mapping where safe.
- Recalculate normals — keep the shape and rebuild its lighting direction.
Every result is checked for collapsed and reversed faces before commit. Lower the strength or keep ratio if an operation is rejected.
Sculpt tab
Sculpt and vertex paint live in one tab. Choose Grab, Inflate, Smooth, Flatten, or Pinch and drag on the surface. Radius and strength are adjustable, pen pressure is supported, and one drag is one undo step.
- Falloff changes the influence curve from the brush center to its edge. Smooth/Sphere suit broad shaping, Sharp suits detail, Linear gives a predictable ramp, and Constant applies uniform influence inside the brush. Vertex Paint uses the same setting.
- Local-axis symmetry X/Y/Z applies Grab and the four shape brushes around the object's local origin in 2/4/8 directions. Axes can be combined and stay local under rotation, nonuniform scale, and reflected scale. A direction is skipped when it has no unique exact connected-face counterpart, so a nearby or coincident disconnected shell is never used as a fallback. Paint is not affected.
Shiftreverses Inflate, Flatten, and Pinch.- Smooth's Preserve open boundary protects open edges.
Esccancels the entire active stroke.- Paint writes Linear-sRGB vertex color. Hold
Shiftto erase toward white. Each dab follows only the connected brush region from the hit face, so color does not bleed onto a nearby overlapping shell.
Smooth and Paint support up to 50,000 vertices / 100,000 triangles; other shape brushes support up to 150,000 vertices / 300,000 triangles. Symmetry is additionally capped at 400,000 dense vertex visits per dab; reduce the enabled axes or simplify the mesh when that cap is exceeded. Shape sculpt rejects partial draw ranges, and symmetry rejects sheared world transforms, rather than risking edits through a hidden or disconnected surface.
UV tab
The UV tab is where texture work starts. Unwrap UVs splits faces into islands by normal direction (±X · ±Y · ±Z), flattens each and packs them into one atlas; you can pick the target texture size and island padding. The UV preview below draws the packed islands and shows the island count and atlas coverage. The single-axis planar projection card also lives here. On a mesh without UVs the Texture tab shows a "Create UVs first" notice and blocks baking and texture application.
Texture tab
Material slots and base-color texture
The Texture tab preserves imported multi-material slots. Edit base color, roughness, metalness, opacity, emissive color/intensity, flat shading, and double-sided rendering per slot. Imported base-color textures are preserved. On a mesh with UV0, choose a local PNG/JPEG/WebP image to apply or replace the base-color texture in the selected material slot, or explicitly remove only that slot's texture. The editor checks the actual image format, corruption, resolution, and memory budget before applying it. Each apply, replace, or remove action is one Undo step. Images with an alpha channel use depth-writing coverage rendering alongside the splat.
Splat → texture bake
Splat → texture bake bakes the splat exactly as it currently looks into a mesh texture. It runs three steps from one button.
- Unwrap UVs — meshes without UVs are unwrapped automatically. Faces are grouped by normal direction (±X · ±Y · ±Z) into islands (charts) and packed into one atlas with padding. Re-unwrap UVs rebuilds it at any time, as one Undo step
- Render surrounding views — cameras are placed on a sphere around the mesh (Views: 8 · 16 · 32) and only the splat is rendered from each as a square image of the Render size (512 · 1024 · 2048). The source is the screen as shown, including color grading, lights and the environment; mesh items and editing overlays are not captured. Render size is independent of texture size; raise it for large textures or fine detail
- Project into the texture — for every texel of the texture (512 · 1024 · 2048) the point on the mesh is projected into each view; views that face the camera and are not hidden behind the splat surface contribute, weighted more the more frontal they are. Concave areas seen by no view are filled with neighboring colors
The result becomes the base-color texture of every material slot of the selected meshes and the base color is set to white. When the bake finishes, the Texture tab shows a preview of the baked texture with the texture and render sizes, view count and surface coverage. Accuracy improves the closer the mesh sits to the splat surface; coarse triangles give small UV islands, so subdivide before baking for a sharper result. The baked mesh still receives scene lighting, so adjust intensities in the Lighting tab if it looks darker than the splat. The texture is stored inside the GLB and counts toward the 64 MiB save limit.
Opacity below 1 uses depth-safe alpha coverage. Smooth glass/transmission and OIT are not supported yet.
Objects tab
Every mesh node appears in the mesh section of the left outliner. The Object tab edits its name, visibility, cast/receive shadow flags, position, rotation, and scale. The up/down order buttons move selected nodes as one block while preserving their internal order.
Use Shift+click for an ordered range and Ctrl/Cmd+click to toggle objects in either the left outliner or the Objects tab.
Shift+D— independently duplicate selected objectsCtrl/Cmd+J— join the selection in the active object's local spaceDelete— delete selected objectsW/E/R— translate / rotate / scale the whole selection around its median; rotation and scale use the active object's local orientationEsc— cancel the current gizmo drag and restore its starting transform
Batch gizmo, duplicate, delete, and reorder actions occupy one undo step. Object IDs and outliner order are stored in the companion GLB, so selection routing and authored order remain stable after reopening. Imported files always receive fresh IDs instead of reusing IDs authored in another scene.
Save and viewer behavior
Saving writes the mesh scene as one companion GLB and versions it with the splat assets. Node transforms, visibility/shadows, materials, vertex colors, and imported or editor-selected textures are embedded without an external image URL. A stable ID for every node and the exact authored root order are stored as one complete receipt; a malformed or partial receipt fails closed instead of binding state to the wrong node. Standard, shared, and embedded viewers show the splat first and then load the companion mesh. A mesh failure leaves the splat interactive and offers a retry. Companion files must be self-contained binary GLBs no larger than 64 MiB. A load attempt that does not finish within two minutes is stopped and becomes a retryable error instead of an endless loading state. Both save and load preflight mesh data ranges and embedded PNG/JPEG/WebP images. Textures are limited to 8192 px on either axis, 64 MiB decoded per image, and 128 MiB decoded in total. Over-budget assets are stopped before upload or parsing, so reduce their resolution or image count.
Review the mesh-specific history with Ctrl/Cmd+Z and Ctrl/Cmd+Shift+Z. Conflicting edits are locked while generate, import, texture decode, save, or a background modeling operation is active. Cancelling texture application leaves the material, history, and saved state unchanged.
Current limits
Quad inference for arbitrary triangle meshes, bevel junctions with more than three selected edges at one vertex, booleans, automatic UV unwrap, remesh/dynamic topology, skin editing, and smooth transparent mesh blending are not available yet. Prepare those parts as a static GLB in an external modeling tool and import it when needed.
