package tasks import ( "fmt" "os/exec" "strings" ) // mergeEXRFiles averages multiple linear EXR renders into one (Monte Carlo accumulation). func mergeEXRFiles(output string, inputs []string) error { if len(inputs) == 0 { return fmt.Errorf("no input EXR files to merge") } if len(inputs) == 1 { return copyFile(inputs[0], output) } args := append([]string{}, inputs...) args = append(args, "-evaluate-sequence", "mean", output) if path, err := exec.LookPath("magick"); err == nil { cmd := exec.Command(path, args...) if out, err := cmd.CombinedOutput(); err != nil { return fmt.Errorf("magick merge failed: %w (%s)", err, strings.TrimSpace(string(out))) } return nil } if path, err := exec.LookPath("convert"); err == nil { cmd := exec.Command(path, args...) if out, err := cmd.CombinedOutput(); err != nil { return fmt.Errorf("convert merge failed: %w (%s)", err, strings.TrimSpace(string(out))) } return nil } return fmt.Errorf("ImageMagick (magick or convert) required to merge batched EXR renders") } func copyFile(src, dst string) error { cmd := exec.Command("cp", "-f", src, dst) if out, err := cmd.CombinedOutput(); err != nil { return fmt.Errorf("copy %s to %s: %w (%s)", src, dst, err, strings.TrimSpace(string(out))) } return nil }