Blending (Redbook Ch6)
Greg Bennett <gwbennett <at> sentex.ca>
2013-11-16 18:49:48 GMT
;; I am trying to learn to use cl-opengl by translating some of those
;; examples from the redbook which are not in the distributed code
;; under ../examples/redbook.
;; In particular, I should like to understand some of Ch6 of the Redbook
;; dealing with blending and antialiasing. I began with blending.
;; While I seem to have pieces working, the code below, and its author,
;; are obviously missing one or more essential ideas. I would be happy
;; to learn what they are, so that I can discover how I might had found
;; them out without bothering the list about possibly trivial matters.
;; (lisp-implementation-version) returns
;; Version 1.9-r15972M (linuxX8664) for ccl.
;; I use 2-pane emacs with C-c C-c to move forms from source
;; buffer to *slime-repl ccl* buffer
;; all under Linux Mint 14 (64 bit).
;; Thanks for any and all assistance
;; Cheers /Greg Bennett
;;+ Code and comments on its execution follow.
;; This is blender.lisp
;; An attempt to adapt the code in the
;; OpenGL Programming Guide P230/1
;; to cl-opengl
;; borrowing from redbook/examples/lines.lisp for basic windowing code,
;; and with helpful hints from Bart Botta about how to convert the C
;; code to opengl's forms.
;; Comparing the Guide with the examples files, I infer that
;; the contents of void inint(void) go to (defmethod
;; while void display(void) -> (defmethod (glut:display( )))
;; *Typically executing the forms below down to and including
;; (defun (gb-blend( ..))
;; and then running (gb-blend) produces a solid yellow
;; window. The x in its top right does indeed kill it.
;; Adding the (defmethod keyboard ...) form and running
;; (gb-blend) produces that yellow window, the keys a,s,r,m,x
;; have no effect on it at all.
;; The x in its top right kills it. Esc kills it too and
;; leads to this in the message
;; window of what was the repl:
;+ Lisp connection closed unexpectedly: connection broken
;+ by remote peer
;+ alt-x slime asks whether I want to start another lisp
;+ answer no -> (presumably) the lisp with which contact
;+ had been severed. This repl knows about nothing which
;+ preceded its interruption.
;; I said Typically, because just ONCE the code without
;; the keyboard method produced a yellow pane with a white
;; square in its centre.
;; Adding the keyboard method to this -> that same pair
;; which reacted to the keys as described on P230 in respect
;; of the white square:
;; a no change
;; s white -> blue
;; r blue -> yellow
;; m yellow -> black
;; x black -> white
;; Esc graceful fold.
;; Having closed the window,
;; immediately re-doing (gb-blend) -> that same collection
;; of responses to keys.
;; Closing lisp, redoing the whole exercise from
;; the same, unchanged, source file -> only the
;; solid yellow pane, unchanged by key presses, save Esc which
;; produces the train wreck described earlier.
;; A package
;; Use it
;; Class for windows in which blending actions should occur
(defclass blender-window (glut:window)
:width 400 :height 400 :pos-x 50 :pos-y 50
:mode '(:single :rgb) :title "Blender Window"))
;; Set up some attributes
;; Described as in void init(void) on P230
(defmethod glut:display-window ((w blender-window))
(gl:clear-color 1.0 1.0 0.0 0.0)
(gl:blend-func :one :one)
;; We seem to need this reshape method
;; in order that anything show on the screen
(defmethod glut:reshape ((w blender-window) width height)
(gl:viewport 0 0 width height)
(glu:ortho-2d 0 width 0 height))
;; A method on display to get what seems
;; to be a rectangle to be modified by blending actions
;; code in void display(void) on P230
(defmethod glut:display ((w blender-window))
(gl:color 0.0 0.0 1.0)
(gl:rect -0.5 -0.5 0.5 0.5)
(defun gb-blend ()
(glut:display-window (make-instance 'blender-window)))
;; If I have translated correctly, that's all I need.
;; Let's make a blender-window
;; There is it in the top left of the screen
;; correct title, solid yellow background.
;; (? Should there have been a yellow square in the middle ?)
;; On to blending through the keyboard.
;; The keyboard method to drive the blender options
;; in the OpenGL P G P231
(defmethod glut:keyboard ((w blender-window) key x y)
(declare (ignore x y))
((#\a) (gl:blend-equation :func-add))
((#\s) (gl:blend-equation :func-subtract))
((#\r) (gl:blend-equation :func-reverse-subtract))
((#\m) (gl:blend-equation :min))
((#\x) (gl:blend-equation :max))
;; Assuming correct translation, run (gb-blend) and press 'a'
;; The story is at the top of the file.