LINUX.ORG.RU

[cl]opengl callback pointer


0

0

у меня пара вопросов про opengl) что такое callback pointer в cl, что такое SYSTEM-AREA-POINTER, как они обьявляются?

glutDisplayFunc(void (*func)(void)) is the first and most important event callback function you will see. Whenever GLUT determines the contents of the window need to be redisplayed, the callback function registered by glutDisplayFunc() is executed. Therefore, you should put all the routines you need to redraw the scene in the display callback function.
>> (glut:display-func #'display) 

 The value #<FUNCTION DISPLAY> is not of type SYSTEM-AREA-POINTER.
   [Condition of type TYPE-ERROR]

  0: (CL-GLUT:DISPLAY-FUNC #<FUNCTION DISPLAY>)
      Locals:
        SB-DEBUG::ARG-0 = #<FUNCTION DISPLAY>

SAP — это типа void*. Тут обычная функция не подойдёт, нужна специальная, объявленная, например, через cffi:defcallback.

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

А зачем связываться с указателями? Вот есть примерчик и без указателей: http://gist.github.com/217800

там разве не тоже самое происходит, что и здесь -

(glut:display-func callback-pointer)
в вашем примере -
(glut:timer-func millis callback-pointer value)

п.с.- у меня этот пример выдаёт окно, незакрашенное ничем, т.е. мусором пикселей, в большинстве скопипастенными с того места на экране, где оно появилось)

SAP — это типа void*. Тут обычная функция не подойдёт, нужна специальная, объявленная, например, через cffi:defcallback.

работает.

я что-то не очень понимаю как этот код должен работать -

(cffi:defcallback display :void ()
  (gl:clear :color-buffer-bit)
  (gl:color 1.0 1.0 1.0)
  (gl:with-primitives :polygon
    (gl:vertex 0.3 0.3 0.0)
    (gl:vertex 0.3 0.7 0.0)
    (gl:vertex 0.7 0.7 0.0)
    (gl:vertex 0.7 0.3 0.0))
  (gl:flush))

(defun init ()
  (gl:clear-color 0 0 0 0.3)
  (gl:matrix-mode :projection)
  (gl:load-identity)
  (gl:ortho 0.0 1.0 0.0 1.0 -1.0 1.0))

(defun main ()
  (glut:init)
  (glut:init-display-mode :single :rgb)
  (glut:init-window-size 300 300)
  (glut:init-window-position 300 300)
  (glut:create-window "hello")
  (init)
  (glut:display-func (cffi:callback display))
  (glut:main-loop))

при вызове main появляется окошко с белым прямоугольником, но далее оно никак не обновляется, но закрашивается левыми пикселями при перетаскивании. В редбуке пишут:

Whenever GLUT determines the contents of the window need to be redisplayed, the callback function registered by glutDisplayFunc() is executed. Therefore, you should put all the routines you need to redraw the scene in the display callback function.

If your program changes the contents of the window, sometimes you will have to call glutPostRedisplay(void), which gives glutMainLoop() a nudge to call the registered display callback at its next opportunity.

Понимает ли glut:main-loop этот самый «need to be redisplayed», видимо нет, если не обновляет. И откуда вызывать glut:post-redisplay, если в редбук примере последним вызывается glut:main-loop, после которого программа не воспринимает другие инструкции пока не выйдет из main-loop.

Да, что ещё за «opportunity», когда glut:main-loop решает что случай благоприятен)

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

>я что-то не очень понимаю как этот код должен работать

код - копипаст из редбука в common lisp's реалях

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

SBCL-1.0.30, Fedora-12, StumpWM, cl-opengl свежий из darcs'а.

mv ★★★★★
()
Ответ на: комментарий от k_andy

Gentoo, SBCL 1.0.28 + Slime, fluxbox

начало работать после небольшой правки кода. это -

(gl:shader-source vs (file->string "toon_shade.vert"))
(gl:shader-source fs (file->string "toon_shade.frag"))
на это -
(gl:shader-source vs (list (file->string "toon_shade.vert")))
(gl:shader-source fs (list (file->string "toon_shade.frag")))

+ убрал все коменты из .vert && .frag, до этого sbcl ругался

после запуска появляется два чайника - один оранжевый полупрорисованный, другой синий, крутятся какое-то время, затем теряется рантайм в слайме.

Эм, дак меня и не это вовсе интересует, я прошу обьяснить тривиальные вещи, какие шейдеры, если я пока что не могу понять как с этим работать -

The Display Callback

glutDisplayFunc(void (*func)(void)) is the first and most important event callback function you will see. Whenever GLUT determines the contents of the window need to be redisplayed, the callback function registered by glutDisplayFunc() is executed. Therefore, you should put all the routines you need to redraw the scene in the display callback function.

If your program changes the contents of the window, sometimes you will have to call glutPostRedisplay(void), which gives glutMainLoop() a nudge to call the registered display callback at its next opportunity.

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

Ой-вей, сколько небыдла собралось в одном треде.

Взять бы вас всех, да выпороть. Чтобы сами дурью не маялись, и молодежь в свою секту не втягивали.

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

с чайником теперь всё нормально, он светло розовый, один и перерисовывается, правда как-то кусками.

сейчас уже .32 даже вот :)

по-моему, обновившись я лишь успокою совесть)

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

> сейчас уже .32 даже вот :)

Заморозились на .33. И вообще, он каждый месяц выходит ;)

mv ★★★★★
()
Ответ на: комментарий от Kuka

> Взять бы вас всех, да выпороть. Чтобы сами дурью не маялись, и молодежь в свою секту не втягивали.

Я, кстати, тоже заметил рост кол-ва вопросов по Лиспу. Пол Грэм ещё одну статью написал? :)

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

> я пока что не могу понять как с этим работать

Ну а чо тут непонятного? Обычный цикл сообщений. glutPostRedisplay — это как InvalidateWindow.

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

Ну а чо тут непонятного? Обычный цикл сообщений. glutPostRedisplay — это как InvalidateWindow.

можно пример? перепишите пожалуйста мой простой код так, чтобы он правильно работал :)

(cffi:defcallback display :void ()
  (gl:clear :color-buffer-bit)
  (gl:color 1.0 1.0 1.0)
  (gl:with-primitives :polygon
    (gl:vertex 0.1 0.0 0.0)
    (gl:vertex 0.1 1.0 0.0)
    (gl:vertex 1.0 1.0 0.0)
    (gl:vertex 1.0 0.0 0.0))
  (gl:flush))

(defun init ()
  (gl:clear-color 0 0 0 0)
  (gl:matrix-mode :projection)
  (gl:load-identity)
  (gl:ortho 0.0 1.0 0.0 1.0 -1.0 1.0))

(defun main ()
  (glut:init)
  (glut:init-display-mode :single :rgb)
  (glut:init-window-size 300 300)
  (glut:init-window-position 300 300)
  (glut:create-window "hello")
  (init)
  (glut:display-func (cffi:callback display))
  (glut:main-loop))

если это возможно, то воспользовшись только glut:post-redisplay

InvalidateWindow

первый раз слышу

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

> перепишите пожалуйста мой простой код так, чтобы он правильно работал :)

Этот код прекрасно работает. Его не надо переписывать.

glut:post-redisplay нужно вызывать если что-то меняется. Например, если добавить ввод с клавиатуры и перемещать этот прямоугольник, то при его перемещении и надо вызывать glut:post-redisplay.

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

> можно пример? перепишите пожалуйста мой простой код так, чтобы он правильно работал :)

Код работает. Ищи, что у тебя из компонентов системы сломано.

mv ★★★★★
()
Ответ на: комментарий от k_andy

Этот код прекрасно работает.

он закрашивается пикселями при перемещении, поэтому я и хочу, чтобы он сам обновлялся с каким-то фпс, как это сделать, поставить таймер?

glut:post-redisplay нужно вызывать если что-то меняется. Например, если добавить ввод с клавиатуры и перемещать этот прямоугольник, то при его перемещении и надо вызывать glut:post-redisplay.

ок, понял

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

>Код работает. Ищи, что у тебя из компонентов системы сломано.

Да, у меня тоже работает, под 'правильно' я имел ввиду так, чтобы пиксели не сбивались при наложении других окон

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

> Да, у меня тоже работает, под 'правильно' я имел ввиду так, чтобы пиксели не сбивались при наложении других окон

У меня не сбиваются.

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

всем спасибо)

поставил свежий софт, но всё равно закрашивается, пусть так, пока не буду обращать внимания)

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

2.6.29-gentoo-r5 i686 Intel(R) Core(TM) Duo CPU T2350 @ 1.86GHz GenuineIntel GNU/Linux

00:02.0 VGA compatible controller: Intel Corporation Mobile 945GM/GMS, 943/940GML Express Integrated Graphics Controller (rev 03)
00:02.1 Display controller: Intel Corporation Mobile 945GM/GMS/GME, 943/940GML Express Integrated Graphics Controller (rev 03)

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

А остальные opengl программы нормально работают? Может быть баг в видеодрайвере (хотя у меня тоже интел, x4500, и работает) или даже в оконном менеджере.

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

А остальные opengl программы нормально работают?

оказывается у меня таких и нету) Зато заново прогнал opengl examples, тот же лаг там, где нет постоянной перерисовки, и, к примеру, здесь нет лага:


(in-package #:cl-glut-examples)

(defclass planet-window (glut:window)
  ((year :accessor year :initform 0)
   (day :accessor day :initform 0))
  (:default-initargs
   :pos-x 100 :pos-y 100 :width 500 :height 500
   :mode '(:double :rgb) :title "planet.lisp"))

(defmethod glut:display-window :before ((w planet-window))
  (gl:clear-color 0 0 0 0)
  (gl:shade-model :flat))

(defmethod glut:display ((w planet-window))
  (gl:clear :color-buffer)
  (gl:color 1 1 1)
  (gl:with-pushed-matrix
    ;; draw sun
    (glut:wire-sphere 1 20 16)
    ;; draw smaller planet
    (gl:rotate (year w) 0 1 0)
    (gl:translate 2 0 0)
    (gl:rotate (day w) 0 1 0)
    (glut:wire-sphere 0.2 10 8))
  (glut:swap-buffers))

(defmethod glut:reshape ((w planet-window) width height)
  (gl:viewport 0 0 width height)
  (gl:matrix-mode :projection)
  (gl:load-identity)
  (glu:perspective 60 (/ width height) 1 20)
  (gl:matrix-mode :modelview)
  (gl:load-identity)
  (glu:look-at 0 0 5 0 0 0 0 1 0))

(defmethod glut:keyboard ((w planet-window) key x y)
  (declare (ignore x y))
  (flet ((update (slot n)
           (setf (slot-value w slot) (mod (+ (slot-value w slot) n) 360))
           (glut:post-redisplay)))
    (case key
      (#\d (update 'day 10))
      (#\D (update 'day -10))
      (#\y (update 'year 5))
      (#\Y (update 'year -5))
      (#\Esc (glut:destroy-current-window)))))

(defun rb-planet ()
  (glut:display-window (make-instance 'planet-window)))

а здесь есть:

(in-package #:cl-glut-examples)

(gl:define-gl-array-format position-color
  (gl:vertex :type :float :components (x y))
  (gl:color :type :unsigned-char :components (r g b)))

(defclass opengl-array-window (glut:window)
  ((vertex-array :accessor vertex-array
                 :initform (gl:alloc-gl-array 'position-color 5))
   (indices-array :accessor indices-array
                  :initform (gl:alloc-gl-array :unsigned-short 10)))
  (:default-initargs :title "opengl-array.lisp"))

(defmethod glut:display-window :before ((w opengl-array-window))
  (dotimes (i 5)
    (let ((phi (float (+ (/ pi 2) (* (/ i 5) (* 2 pi))) 0.0)))
      ;; vertices
      (setf (gl:glaref (vertex-array w) i 'x) (cos phi))
      (setf (gl:glaref (vertex-array w) i 'y) (sin phi))
      ;; indices
      (setf (gl:glaref (indices-array w) (* 2 i)) i)
      (setf (gl:glaref (indices-array w) (1+ (* 2 i))) (mod (+ i 2) 5))
      ;; colors
      (setf (gl:glaref (vertex-array w) i 'r) 255)
      (setf (gl:glaref (vertex-array w) i 'g) 0)
      (setf (gl:glaref (vertex-array w) i 'b) 0)))
  (gl:clear-color 0 0 0 0))

(defmethod glut:display ((w opengl-array-window))
  (gl:clear :color-buffer)
  (gl:enable-client-state :vertex-array)
  (gl:enable-client-state :color-array)
  (gl:bind-gl-vertex-array (vertex-array w))
  (gl:draw-elements :lines (indices-array w))
  (gl:flush))

(defmethod glut:close ((w opengl-array-window))
  (gl:free-gl-array (vertex-array w))
  (gl:free-gl-array (indices-array w)))

(defun misc-opengl-array ()
  (glut:display-window (make-instance 'opengl-array-window)))

или даже в оконном менеджере

я думал, что он не влияет на выполнение других программ. но почему без него(только в X) у меня не получилось запустить cl-glut?

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