LINUX.ORG.RU

cl-opengl


0

0

Добрый вечер.

Не подскажите, где можно найти соответствие ф-ций Opengl и ф-ций cl-opengl. Большинство и так совпадает, с условием записи их по-лисповски, но эту, к примеру, я никак не могу найти - UpdateTheWindowAndCheckForEvents()

заранее спасибо

Посмотри в сырцах cl-opengl, там все довольно ясно и понятно, функции там записаны в подобном виде:

;;; GL version: 2.0, NV_depth_buffer_float
(defglextfun ("glDepthBoundsdNV" depth-bounds-d-nv) :void
  (zmin double)
  (zmax double))
во второй форме, как понятно, имя функции в сишке и имя соответствующего враппера в лиспе. Если нужной функции нету - добавь, отошли патч :)

Love5an
()
Ответ на: комментарий от Love5an

>Посмотри в сырцах cl-opengl, там все довольно ясно и понятно

ок, изначально это было прозапас. Натравим на это дело Емакс). спасибо

pseudo-cat ★★★
() автор топика

А что это за функция такая? Гугл не находит ее на сайте opengl.org. По всей видимости, кто-то в каком-то туториале так обозвал какую-то функцию, и после этого вызов этой функции стал кочевать из одного туториала в другой.

dmitry_vk ★★★
()
Ответ на: комментарий от pseudo-cat

Такой функции в openGL не существует. в openGL все функции имеют префикс gl. Это функция просто в примере обозначает что здесь обновляется окно и обрабатываются события, такой функции на самом деле нет. Как-то так.

plambir
()
Ответ на: комментарий от plambir

Later in this chapter, you will see replacements for both InitializeAWindowPlease() and UpdateTheWindowAndCheckForEvents() that actually work but will require restructuring the code to make it efficient.

pseudo-cat ★★★
() автор топика

Use the following code snippet as an opengl demo template:

http://paste.lisp.org/+1XG6

You will also need lispbuilder, cl-opengl and slime in your asdf path.

Then just run it as: sbcl --load demo.lisp

You may override the following functions (same as in RedBook) to implement your own behaviour:

init-scene resize-scene render-scene

anonymous
()
Ответ на: комментарий от anonymous

Thanks, it's work. But I have a few questions.

Firstly, why you used lispbuilder-sdl when you could used OpenGL only? Can glut-utilities be replaced lispbuilder-sdl?

p.s. you don't speak Russian?

p.p.s. sorry for my English

pseudo-cat ★★★
() автор топика
Ответ на: комментарий от pseudo-cat

> Can glut-utilities be replaced lispbuilder-sdl?

... by lispbuilder-sdl?

p.s. sory for my Eng. :)

pseudo-cat ★★★
() автор топика
Ответ на: комментарий от pseudo-cat

> Firstly, why you used lispbuilder-sdl when you could used OpenGL only? Can glut-utilities be replaced lispbuilder-sdl?

Yes, lispbuilder-sdl is used to handle platform-dependent subsystems like screen management, keyboard and mouse events just like glut. But with lispbuilder-sdl you can do much more including font and image processing and music/sound handling. Moreover lispbuilder-sdl is more portable, I can use demo.lisp sample on mac os ox, linux and windows without any changes.

PS: lenivo pisat' na translite

anonymous
()
Ответ на: комментарий от anonymous

Спасибо, ещё пару вопросов, если можно.

Во-первых, интересует релевантность использования sdl:update-display. вызов update-display окружается get-universal-time:

CL-USER> (demo:start-demo)
call start-demo. time: 3466855447
init-scene done. time: 3466855448
update-scene done. time: 3466855451
update-scene done. time: 3466855454
как видно, аж 3 секунды выполняется перерисовка. Можно ли каким-то образом заменить эту конструкцию gl:glush -ом. И куда он сбрасывает накопленную информацию при использовании его в таком коде заместо update-display?

Второй вопрос - (gl:begin arg) требует arg из перечислимого типа, как достать это значение? (я пока что использую просто (gl:begin #x9))

(defcenum (enum :unsigned-int)
  (:1pass-ext #x80A1)
   ...
  (:polygon #x9)
   ...)

pseudo-cat ★★★
() автор топика
Ответ на: комментарий от pseudo-cat

> как видно, аж 3 секунды выполняется перерисовка.

huh? never had that problem with update. Check you code and compare with my example. No delays. If you want to reevaluate the exported functions don't forget to press 'r' to call init-scene in a demo window ('esc' to stop and quit the main event loop).

(defparameter *spin* 0.0)

(defun spin-display ()
(incf *spin* 2.0)
(if (> *spin* 360.0)
(decf *spin* 360.0)))

(defun init-scene (width height)
(gl:viewport 0 0 width height)
(gl:clear-color 0 0 0 0)

(gl:shade-model :flat)
(gl:matrix-mode :projection)
(gl:load-identity)
(gl:ortho -50.0 50.0 -50.0 50.0 -1.0 1.0)
(gl:matrix-mode :modelview)
(gl:load-identity))

(defun resize-scene (width height)
(gl:viewport 0 0 width height)

(gl:matrix-mode :projection)
(gl:load-identity)
(gl:ortho -50.0 50.0 -50.0 50.0 -1.0 1.0)
(gl:matrix-mode :modelview)
(gl:load-identity))

(defun render-scene (width height)
(declare (ignore width height))
(gl:clear :color-buffer-bit)

(spin-display)

(gl:with-pushed-matrix
(gl:rotate *spin* 0.0 0.0 1.0)
(gl:color 1.0 1.0 1.0)
(gl:rect -25.0 -25.0 25.0 25.0)))


> Второй вопрос - (gl:begin arg) требует arg из перечислимого типа, как достать это значение? (я пока что использую просто (gl:begin #x9))


Use symbols and helper gl:with-* macros, eg.:

(gl:with-primitive :polygon
(gl:vertex 0.25 0.25 0)
(gl:vertex 0.75 0.25 0)
(gl:vertex 0.75 0.75 0)
(gl:vertex 0.25 0.75 0))

expands to:

(PROG2 (CL-OPENGL-BINDINGS:BEGIN :POLYGON)
(PROGN
(CL-OPENGL:VERTEX 0.25 0.25 0)
(CL-OPENGL:VERTEX 0.75 0.25 0)
(CL-OPENGL:VERTEX 0.75 0.75 0)
(CL-OPENGL:VERTEX 0.25 0.75 0))
(CL-OPENGL-BINDINGS:END))

anonymous
()
Ответ на: комментарий от anonymous

> как видно, аж 3 секунды выполняется перерисовка.

huh? never had that problem with update. Check you code and compare with my example. No delays. If you want to reevaluate the exported functions don't forget to press 'r' to call init-scene in a demo window ('esc' to stop and quit the main event loop).

(defparameter *spin* 0.0)

(defun spin-display ()
(incf *spin* 2.0)
(if (> *spin* 360.0)
(decf *spin* 360.0)))

(defun init-scene (width height)
(gl:viewport 0 0 width height)
(gl:clear-color 0 0 0 0)

(gl:shade-model :flat)
(gl:matrix-mode :projection)
(gl:load-identity)
(gl:ortho -50.0 50.0 -50.0 50.0 -1.0 1.0)
(gl:matrix-mode :modelview)
(gl:load-identity))

(defun resize-scene (width height)
(gl:viewport 0 0 width height)

(gl:matrix-mode :projection)
(gl:load-identity)
(gl:ortho -50.0 50.0 -50.0 50.0 -1.0 1.0)
(gl:matrix-mode :modelview)
(gl:load-identity))

(defun render-scene (width height)
(declare (ignore width height))
(gl:clear :color-buffer-bit)

(spin-display)

(gl:with-pushed-matrix
(gl:rotate *spin* 0.0 0.0 1.0)
(gl:color 1.0 1.0 1.0)
(gl:rect -25.0 -25.0 25.0 25.0)))


> Второй вопрос - (gl:begin arg) требует arg из перечислимого типа, как достать это значение? (я пока что использую просто (gl:begin #x9))

Use symbols and helper gl:with-* macros, eg.:

(gl:with-primitive :polygon
(gl:vertex 0.25 0.25 0)
(gl:vertex 0.75 0.25 0)
(gl:vertex 0.75 0.75 0)
(gl:vertex 0.25 0.75 0))

expands to:

(PROG2 (CL-OPENGL-BINDINGS:BEGIN :POLYGON)
(PROGN
(CL-OPENGL:VERTEX 0.25 0.25 0)
(CL-OPENGL:VERTEX 0.75 0.25 0)
(CL-OPENGL:VERTEX 0.75 0.75 0)
(CL-OPENGL:VERTEX 0.25 0.75 0))
(CL-OPENGL-BINDINGS:END))

anonymous
()
Ответ на: комментарий от anonymous

это лаги моего железа, при 1024х768 окне на отрисовку тратится ~3 секунды, при 300х300 меньше одной. Спасибо за помошь, больше вопросов нет)

pseudo-cat ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.