;Major mode for editting Renderman Rib files
;copyright 2005 Fred LeMaster fred.lemaster@gmail.com
(defvar rib-mode-hook nil)
;;Define keymap
(defvar rib-mode-map
  (let ((rib-mode-map (make-keymap)))
    (define-key rib-mode-map "\C-j" 'newline-and-indent)
    (define-key rib-mode-map "\M-r" 'rib-render-aqsis)
    (define-key rib-mode-map "\M-\C-f" 'forward-transform)
    rib-mode-map)
  "Keymap for RIB major mode")
;;Launch rib-mode when .rib files are opened
(add-to-list 'auto-mode-alist '("\\.rib\\'" . rib-mode))
;;Syntax highlighting
(defconst rib-font-lock-keywords
  (list
   '("\\(A\\(?:r\\(?:chiveRecord\\|eaLightSource\\)\\|t\\(?:mosphere\\|tribute\\(?:Begin\\|End\\)?\\)\\)\\|B\\(?:asis\\|egin\\|ound\\)\\|C\\(?:lipping\\|o\\(?:lor\\(?:Samples\\)?\\|n\\(?:catTransform\\|e\\)\\|ordinateSystem\\)\\|ropWindow\\|ylinder\\)\\|D\\(?:e\\(?:clare\\|formation\\|pthOfField\\|tail\\(?:Range\\)?\\)\\|is\\(?:k\\|pla\\(?:cement\\|y\\)\\)\\)\\|E\\(?:nd\\|rrorHandler\\|x\\(?:posure\\|terior\\)\\)\\|F\\(?:ormat\\|rame\\(?:AspectRatio\\|Begin\\|End\\)\\)\\|Ge\\(?:neralPolygon\\|ometr\\(?:icApproximation\\|y\\)\\)\\|H\\(?:ider\\|yperboloid\\)\\|I\\(?:dentity\\|lluminate\\|\\(?:mage\\|nterio\\)r\\)\\|LightSource\\|M\\(?:a\\(?:ke\\(?:Bump\\|CubeFaceEnvironment\\|LatLongEnvironment\\|Shadow\\|Texture\\)\\|tte\\)\\|otion\\(?:Begin\\|End\\)\\)\\|NuPatch\\|O\\(?:bject\\(?:Begin\\|End\\|Instance\\)\\|p\\(?:acity\\|tion\\)\\|rientation\\)\\|P\\(?:a\\(?:raboloid\\|tch\\(?:Mesh\\)?\\)\\|erspective\\|ixel\\(?:Filter\\|Samples\\|Variance\\)\\|o\\(?:ints\\(?:\\(?:General\\)?Polygons\\)\\|lygon\\)\\|ro\\(?:cedural\\|jection\\)\\)\\|Quantize\\|R\\(?:e\\(?:lativeDetail\\|verseOrientation\\)\\|otate\\)\\|S\\(?:c\\(?:ale\\|reenWindow\\)\\|h\\(?:ading\\(?:Interpolation\\|Rate\\)\\|utter\\)\\|ides\\|kew\\|olid\\(?:Begin\\|End\\)\\|\\(?:pher\\|urfac\\)e\\)\\|T\\(?:extureCoordinates\\|orus\\|r\\(?:ans\\(?:form\\(?:Begin\\|End\\|Points\\)?\\|late\\)\\|imCurve\\)\\)\\|World\\(?:Begin\\|End\\)\\)" . font-lock-builtin-face)))
;;Indentation

;;Syntax Table
(defvar rib-mode-syntax-table
  (let ((rib-mode-syntax-table (make-syntax-table)))
    (modify-syntax-entry ?# "<   " rib-mode-syntax-table)
    (modify-syntax-entry ?\n ">  " rib-mode-syntax-table)
    (modify-syntax-entry ?\\ "\\" rib-mode-syntax-table)
    (modify-syntax-entry ?\[ "(]" rib-mode-syntax-table)
    (modify-syntax-entry ?\] ")[" rib-mode-syntax-table)
    (modify-syntax-entry ?\" "\"" rib-mode-syntax-table)
    rib-mode-syntax-table)
  "Syntax table for rib-mode")
 
 (setq comment-start "#"
	comment-end   "\n")
(defun forward-transform (arg)
  (interactive "p")
  (search-forward "TransformBegin"))
(defun rib-render-aqsis (args)
  "Render the ."
  (interactive "P")
  (let ((cmd (concat "aqsis -d " (buffer-file-name) " &")))
    (message cmd)
    (shell-command cmd '())))
(defun rib-render-prman (args)
  "Render the RIB file rman.rib in the current directory."
  (interactive "P")
  (let ((cmd (concat "prman " (buffer-file-name) " &")))
    (message cmd)
    (shell-command cmd '())))

 (defun rib-mode ()
   "Major mode for editting Renderman RIB files"
   (interactive)
   (kill-all-local-variables)
   (set-syntax-table rib-mode-syntax-table)
   (use-local-map rib-mode-map)
   (set (make-local-variable 'font-lock-defaults) '(rib-font-lock-keywords))
   (setq major-mode 'rib-mode)
   (setq mode-name "RIB")
   (run-hooks 'rib-mode-hook))
;(define-derived-mode rib-mode fundamental-mode "RIB"
;   "Major mode for editting Renderman RIB files"
;   (set-syntax-table rib-mode-syntax-table)
;   (set (make-local-variable 'font-lock-defaults) '(rib-font-lock-keywords)))
(provide 'rib-mode)
