'use client' import type { MaterialProperties, MaterialSchema } from '@pascal-app/core' import { Input } from '../primitives/input' const DEFAULT_MATERIAL_PROPERTIES: MaterialProperties = { color: '#ffffff', roughness: 0.5, metalness: 0, opacity: 1, transparent: false, side: 'front', } export function MaterialPropertiesEditor({ value, onChange, }: { value: MaterialSchema onChange: (next: MaterialSchema) => void }) { const currentProps = value.properties ?? DEFAULT_MATERIAL_PROPERTIES const updateMaterial = ( updates: Partial, nextTransparent = currentProps.transparent, ) => { onChange({ ...value, preset: value.preset ?? 'custom', properties: { ...currentProps, ...updates, transparent: nextTransparent, }, }) } return (
updateMaterial({ color: e.target.value })} type="color" value={currentProps.color} /> updateMaterial({ color: e.target.value })} value={currentProps.color} />
{currentProps.roughness.toFixed(2)}
updateMaterial({ roughness: Number.parseFloat(e.target.value) })} step={0.01} type="range" value={currentProps.roughness} />
{currentProps.metalness.toFixed(2)}
updateMaterial({ metalness: Number.parseFloat(e.target.value) })} step={0.01} type="range" value={currentProps.metalness} />
{currentProps.opacity.toFixed(2)}
{ const opacity = Number.parseFloat(e.target.value) updateMaterial({ opacity }, opacity < 1 || currentProps.transparent) }} step={0.01} type="range" value={currentProps.opacity} />
) }