import { Code, Cpu, Package } from "lucide-react" import { useState } from "react" import { Button } from "@/components/ui/button" import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" import { Switch } from "@/components/ui/switch" import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" import { Textarea } from "@/components/ui/textarea" import { cn } from "@/lib/utils" import type { Effect } from "../../types/effects" import type { ShaderExportOptions, ShaderProject } from "../../types/shader-system" interface ShaderExportDialogProps { open: boolean onOpenChange: (open: boolean) => void project: ShaderProject onExport: (effect: Effect) => void } export function ShaderExportDialog({ open, onOpenChange, project, onExport }: ShaderExportDialogProps) { const [exportOptions, setExportOptions] = useState({ format: "effect", includePresets: true, minify: false, embedTextures: true, targetVersion: "webgl2", }) const [effectMetadata, setEffectMetadata] = useState({ category: "custom", complexity: "advanced" as const, tags: ["custom", "shader", "glsl"], }) const handleExport = () => { // Convert shader to effect format const effect: Effect = { id: `shader-${project.id}`, name: project.name, category: effectMetadata.category, description: project.description || "Custom GLSL shader effect", complexity: effectMetadata.complexity, parameters: project.uniforms.map((uniform) => ({ name: uniform.name, type: mapUniformTypeToParameterType(uniform.type), defaultValue: uniform.value, min: uniform.min, max: uniform.max, step: uniform.step, description: uniform.description, group: uniform.group, })), processor: { type: "webgl", vertexShader: exportOptions.minify ? minifyShader(project.vertexShader) : project.vertexShader, fragmentShader: exportOptions.minify ? minifyShader(project.fragmentShader) : project.fragmentShader, uniforms: project.uniforms.map((u) => u.name), version: exportOptions.targetVersion, }, tags: effectMetadata.tags, version: project.version, author: project.metadata?.author, presets: exportOptions.includePresets ? generatePresets(project) : undefined, } onExport(effect) onOpenChange(false) } return ( Export Shader as Effect Configure how to export your shader as a reusable effect Metadata Format Performance
{ project.name = e.target.value }} placeholder="My Custom Effect" />