rlm@530: (ns com.aurellem.run.final-cut rlm@530: (:use (com.aurellem.gb saves gb-driver util constants rlm@530: items vbm characters money rlm@530: rlm-assembly)) rlm@530: (:use (com.aurellem.run util sound music title save-corruption rlm@530: bootstrap-0 bootstrap-1 rlm@530: ram-display rlm@530: )) rlm@530: (:require clojure.string) rlm@530: (:import [com.aurellem.gb.gb_driver SaveState]) rlm@530: (:import java.awt.image.BufferedImage) rlm@530: (:import java.io.File) rlm@530: (:import com.aurellem.gb.WaveWriter)) rlm@530: rlm@530: rlm@530: (def render-dir (File. user-home "proj/vba-clojure/render")) rlm@530: rlm@530: (defn render-files! rlm@530: ([^File target-dir initial-state moves] rlm@530: (let [ram-map-dir (File. target-dir "ram-map") rlm@530: frames-dir (File. target-dir "frames") rlm@530: audio-file (File. target-dir "audio.wav") rlm@530: _ (.mkdirs ram-map-dir) rlm@530: _ (.mkdirs frames-dir) rlm@530: wave-writer (WaveWriter. audio-file) rlm@530: moves (vec moves)] rlm@530: (set-state! initial-state) rlm@530: (dorun rlm@530: (map rlm@530: (fn [index] rlm@530: (run-moves @current-state (vector (moves index))) rlm@530: rlm@530: ;; record audio rlm@530: (.process wave-writer (sound-bytes) rlm@530: gb-sound-format) rlm@530: rlm@530: ;; write screenshot rlm@530: (write-png! rlm@530: @current-state rlm@530: (File. frames-dir (format "%07d.png" index))) rlm@530: rlm@530: ;; write ram-image rlm@530: (write-ram-image! rlm@530: @current-state rlm@530: (File. ram-map-dir (format "%07d.png" index)))) rlm@530: (range (count moves)))) rlm@530: (.cleanup wave-writer))) rlm@530: ([initial-state moves] rlm@530: (render-files! render-dir initial-state moves)) rlm@530: ([moves] rlm@530: (render-files! (root) moves))) rlm@530: rlm@531: (defn file-names [#^File dir] rlm@531: (mapv #(.getCanonicalPath %) (next (sort (file-seq dir))))) rlm@531: rlm@531: (defn composite-frames-command rlm@531: [screenshot ram-map target] rlm@531: ["convert" rlm@531: "-size" "318x276" "xc:white" rlm@531: screenshot "-geometry" "+10+10" "-composite" rlm@531: ram-map "-geometry" "+180+10" "-composite" rlm@531: target]) rlm@531: rlm@531: (defn generate-composite-frames! rlm@531: ([^File rendered-dir] rlm@531: (let [final-frames (File. rendered-dir "final") rlm@531: _ (.mkdir final-frames) rlm@531: screenshots (file-names (File. rendered-dir "frames")) rlm@531: ram-maps (file-names (File. rendered-dir "ram-map")) rlm@531: targets (map #(File. final-frames (format "%07d.png")) rlm@531: (range (count screenshots)))] rlm@531: (dorun rlm@531: (map rlm@531: ;; (comp ;;clojure.java.shell/sh rlm@531: ;; println rlm@531: ;; flatten rlm@531: composite-frames-command rlm@531: screenshots ram-maps targets)) rlm@531: rlm@531: )) rlm@531: ([] (generate-composite-frames! render-dir))) rlm@531: rlm@531: rlm@531: rlm@531: