>
) : activeRightTab === "Transform" ? (
{!selectedObject || !selectedObject.transformProps ? (
Select an object to edit its transform
) : (
<>
{/* Position */}
Position
{['x', 'y', 'z'].map((axis, i) => (
{axis}
{
const newPos = [...selectedObject.transformProps!.position] as [number, number, number];
newPos[i] = parseFloat(e.target.value);
updateObjectTransform(selectedObject.id, { position: newPos });
}}
className="flex-1 bg-zinc-800 border-none rounded py-1 px-2 text-[10px] text-zinc-300"
/>
))}
{/* Rotation */}
Rotation
{['x', 'y', 'z'].map((axis, i) => (
{axis}
{
const newRot = [...selectedObject.transformProps!.rotation] as [number, number, number];
newRot[i] = parseFloat(e.target.value);
updateObjectTransform(selectedObject.id, { rotation: newRot });
}}
className="flex-1 bg-zinc-800 border-none rounded py-1 px-2 text-[10px] text-zinc-300"
/>
))}
{/* Scale */}
Scale
{['x', 'y', 'z'].map((axis, i) => (
{axis}
{
const newScale = [...selectedObject.transformProps!.scale] as [number, number, number];
newScale[i] = parseFloat(e.target.value);
updateObjectTransform(selectedObject.id, { scale: newScale });
}}
className="flex-1 bg-zinc-800 border-none rounded py-1 px-2 text-[10px] text-zinc-300"
/>
))}
>
)}
{/* Mode Toggle */}
{/* Spherical Controls */}
{cameraProps.cameraMode === "spherical" && (
)}
{/* Absolute Position Controls */}
{cameraProps.cameraMode === "absolute" && (
Position (Absolute)
{["x", "y", "z"].map((axis, i) => (
{axis}
{
const newPos = [...cameraProps.position] as [number, number, number];
newPos[i] = parseFloat(e.target.value);
setCameraProps(prev => ({ ...prev, position: newPos }));
if (orbitControlsRef.current) {
orbitControlsRef.current.object.position.set(...newPos);
orbitControlsRef.current.update();
}
}}
className="w-full bg-zinc-900 border border-zinc-800 rounded px-1 py-0.5 text-[10px] text-zinc-300"
/>
))}
)}
{/* Target Controls */}
Target
{["x", "y", "z"].map((axis, i) => (
{axis}
{
const newTarget = [...cameraProps.target] as [number, number, number];
newTarget[i] = parseFloat(e.target.value);
setCameraProps(prev => ({ ...prev, target: newTarget }));
if (orbitControlsRef.current) {
orbitControlsRef.current.target.set(...newTarget);
orbitControlsRef.current.update();
}
}}
className="w-full bg-zinc-900 border border-zinc-800 rounded px-1 py-0.5 text-[10px] text-zinc-300"
/>
))}
{/* Pivot Controls */}
Pivot
{["x", "y", "z"].map((axis, i) => (
{axis}
{
const newPivot = [...cameraProps.pivot] as [number, number, number];
newPivot[i] = parseFloat(e.target.value);
setCameraProps(prev => ({ ...prev, pivot: newPivot }));
}}
className="w-full bg-zinc-900 border border-zinc-800 rounded px-1 py-0.5 text-[10px] text-zinc-300"
/>
))}
{/* Standard Views */}
Standard Views
{["front", "back", "top", "bottom", "left", "right", "isometric"].map((view) => (
))}
{/* Camera Type */}
{/* Focal Length / FOV */}
{!cameraProps.orthographic && (
<>
>
)}
{/* Zoom */}
{/* Depth of Field Toggle */}
Depth of Field
Enable bokeh effect
{/* DOF Settings */}
{cameraProps.depthOfField.enabled && (
)}
{/* Post Processing Section */}
{/* Bloom Toggle */}
Bloom
Add glow to highlights
{/* Bloom Settings */}
{cameraProps.bloom.enabled && (
)}
{/* Vignette Toggle */}
Vignette
Darken image edges
{/* Vignette Settings */}
{cameraProps.vignette.enabled && (
)}
{/* Color Grading Toggle */}
Color Grading
Adjust brightness & color
{/* Color Grading Settings */}
{cameraProps.colorGrading.enabled && (
)}
{/* Grid and Ground Options */}
Ground Grid
Show grid on floor
Stay Above Ground
Limit camera height
{/* Auto Rotate */}
Auto-Rotate
Rotate around model
{/* Camera Presets */}
Camera Presets
{cameraPresets.map((preset) => (
{preset.id !== 'default' && (
)}
))}
{/* Background Type Toggle */}
{/* Background Color & Image Selection */}
{(backgroundType === "color" || backgroundType === "image") && (
Backplate Image
{backgroundType === "image" && (
)}
{[
{ name: "Studio", url: "https://picsum.photos/seed/studio/1920/1080?blur=4" },
{ name: "Outdoor", url: "https://picsum.photos/seed/outdoor/1920/1080?blur=4" },
{ name: "Interior", url: "https://picsum.photos/seed/interior/1920/1080?blur=4" },
{ name: "Abstract", url: "https://picsum.photos/seed/abstract/1920/1080?blur=4" }
].map((plate) => (
))}
)}
{/* Environment Rotation Wheel */}
Environment Rotation
{envRotation}°
{
const rect = e.currentTarget.getBoundingClientRect();
const centerX = rect.left + rect.width / 2;
const centerY = rect.top + rect.height / 2;
const handleMouseMove = (moveEvent: MouseEvent) => {
const angle = Math.atan2(moveEvent.clientY - centerY, moveEvent.clientX - centerX);
let deg = angle * (180 / Math.PI) + 90;
if (deg < 0) deg += 360;
setEnvRotation(Math.round(deg));
};
const handleMouseUp = () => {
window.removeEventListener('mousemove', handleMouseMove);
window.removeEventListener('mouseup', handleMouseUp);
};
window.addEventListener('mousemove', handleMouseMove);
window.addEventListener('mouseup', handleMouseUp);
}}
>
{/* Degree markers */}
{[0, 45, 90, 135, 180, 225, 270, 315].map(deg => (
))}
{/* Pointer */}
{/* Grid Toggle */}
Viewport Grid
Show spatial reference
{/* Light Intensity */}
{/* Light Color */}
{/* Advanced Lighting Controls */}
{/* Additional Lights Section */}
Additional Lights
{/* Additional Lights List */}
{additionalLights.map((light, index) => (
{light.type} Light {index + 1}
))}
{additionalLights.length === 0 && (
No additional lights added
)}
{/* Ground Shadow Toggle */}
Ground Shadow
Enable soft shadows
{/* Shadow Controls */}
{groundProps.showShadow && (
<>
Shadow Rotation
{groundProps.shadowRotation}°
>
)}
{customHdri && (
)}
{[
{ id: 'studio', name: 'Studio', desc: 'Clean, neutral lighting' },
{ id: 'apartment', name: 'Apartment', desc: 'Indoor home lighting' },
{ id: 'city', name: 'City', desc: 'Urban outdoor lighting' },
{ id: 'dawn', name: 'Dawn', desc: 'Soft morning light' },
{ id: 'forest', name: 'Forest', desc: 'Natural outdoor light' },
{ id: 'lobby', name: 'Lobby', desc: 'Commercial indoor light' },
{ id: 'night', name: 'Night', desc: 'Low light, dark environment' },
{ id: 'park', name: 'Park', desc: 'Bright outdoor light' },
{ id: 'sunset', name: 'Sunset', desc: 'Warm evening light' },
{ id: 'warehouse', name: 'Warehouse', desc: 'Industrial lighting' },
].map((preset) => (
))}
{!selectedObject || (selectedObject.type !== 'mesh' && selectedObject.type !== 'model') ? (
Select a model or mesh to edit its material properties
) : (
<>
{selectedObject.name}
{selectedObject.type === 'model' ? "Bulk Editing Model" : "Mesh Editor"}
{/* Fill Settings */}
Mesh Fill
{selectedObject.fillProps?.enabled && (
<>
>
)}
{/* Color Picker */}
{/* Texture Mapping */}
Texture Map
{selectedObject.materialProps?.map ? (
) : (
None
)}
textureInputRef.current?.click()}
className={cn(
"w-full h-24 rounded border-2 border-dashed flex flex-col items-center justify-center gap-2 cursor-pointer transition-all",
selectedObject.materialProps?.map
? "border-blue-500/50 bg-blue-500/5 overflow-hidden"
: "border-zinc-800 hover:border-zinc-700 bg-zinc-800/30"
)}
>
{selectedObject.materialProps?.map ? (

) : (
<>
Upload Texture
>
)}
{/* UV Scale & Mapping */}
{/* UV Projection Dropdown */}
UV Projection
{/* UV Offset */}
{/* UV Scale / Tiling */}
{/* UV Rotation */}
{/* Roughness */}
{/* Metalness */}
{/* Clearcoat */}
{/* Transmission */}
{/* IOR */}
{/* Thickness */}
{/* Sheen */}
{/* Opacity */}
{/* Specular Intensity */}
{/* Emissive */}
{/* Advanced Maps */}
Advanced Maps
{/* Normal Map */}
Normal Map
{selectedObject.materialProps?.normalMap && (
)}
normalInputRef.current?.click()}
className={cn(
"w-full h-12 rounded border border-dashed flex items-center justify-center gap-2 cursor-pointer transition-all",
selectedObject.materialProps?.normalMap ? "border-blue-500/50 bg-blue-500/5" : "border-zinc-800 hover:border-zinc-700 bg-zinc-800/30"
)}
>
{selectedObject.materialProps?.normalMap ? "Normal Map Loaded" : "Upload Normal Map"}
handleTextureUpload(e, 'normalMap')} accept="image/*" className="hidden" />
{/* Specular Map */}
Specular Map
{selectedObject.materialProps?.specularMap && (
)}
specularInputRef.current?.click()}
className={cn(
"w-full h-12 rounded border border-dashed flex items-center justify-center gap-2 cursor-pointer transition-all",
selectedObject.materialProps?.specularMap ? "border-blue-500/50 bg-blue-500/5" : "border-zinc-800 hover:border-zinc-700 bg-zinc-800/30"
)}
>
{selectedObject.materialProps?.specularMap ? "Specular Map Loaded" : "Upload Specular Map"}
handleTextureUpload(e, 'specularMap')} accept="image/*" className="hidden" />
{/* Alpha Map */}
Alpha Map
{selectedObject.materialProps?.alphaMap && (
)}
alphaInputRef.current?.click()}
className={cn(
"w-full h-12 rounded border border-dashed flex items-center justify-center gap-2 cursor-pointer transition-all",
selectedObject.materialProps?.alphaMap ? "border-blue-500/50 bg-blue-500/5" : "border-zinc-800 hover:border-zinc-700 bg-zinc-800/30"
)}
>
{selectedObject.materialProps?.alphaMap ? "Alpha Map Loaded" : "Upload Alpha Map"}
handleTextureUpload(e, 'alphaMap')} accept="image/*" className="hidden" />
>
)}