> 1 <

Автор Сообщение

philimonix

Members


Статус

1 сообщений

Где: Russia
Род занятий:
Возраст:

#7764   2016-12-06 19:44 GMT+3 часа(ов)      
Имеется такой вот код:
 
(ql:quickload :cl-opengl)
(ql:quickload :cl-glut)
(ql:quickload :cl-devil)
(ql:quickload :cl-ilu)
(ql:quickload :cl-ilut)
 
 
(defvar *width* 512 "Ширина окна")
(defvar *height* 512 "Высота окна")
(defvar *number-of-corners* 8 "Количество углов в многоугольнике")
(defvar *radius* 0 "Радиус описанной окружности. Изменяется во время glut:reshape")
(defvar *angle* 0 "Текущий угол поворота по оси Z")
(defvar *rotate-speed* 0 "Текущая скорость изменения *angle*")
(defvar *coordinates* nil "Двумерный массив длиной *number-of-corners*, который содержит X и Y координаты точек многоугольника.
Координаты расположены в отрезке [-1 ; 1]. Чтобы масштабировать их для экрана, умножем координаты
на *radius*. Умножение не производится сразу, так как содержимое этого массива будет использовано
для наложения текстур"
)
 
(defun get-coordinates ()
"Функция осуществляет пересчет X и Y координат точек многоугольника"
(let ((temp (* 2 pi (/ *number-of-corners*))))
(setf *coordinates* (make-array (list *number-of-corners* 2) :element-type 'short-float))
(dotimes (i *number-of-corners*)
(setf (aref *coordinates* i 0) (coerce (cos (* i temp)) 'short-float)
(aref *coordinates* i 1) (coerce (sin (* i temp)) 'short-float)))))
 
(get-coordinates)
 
 
(defclass example-window (glut:window)
()
(:default-initargs :pos-x 100 :pos-y 100 :width *width* :height *height*
:mode '(:double :rgb) :title "Example of OpenGL on Common Lisp"))
 
 
(defmethod glut:idle ((window example-window))
"Метод обновления экрана"
(if (<= 360 (abs (incf *angle* *rotate-speed*)))
(setf *angle* 0))
(glut:post-redisplay))
 
 
(defmethod glut:visibility ((window example-window) state)
"Реакция на сворачивание окна"
(case state
(:visible (glut:enable-event window :idle))
(t (glut:disable-event window :idle))))
 
 
(defmethod glut:keyboard ((window example-window) key x y)
(declare (ignore x y))
"Обработка нажатия клавишы Esc"
(case key
(#\Esc (glut:destroy-current-window))))
 
 
(defmethod glut:special ((window example-window) special-key x y)
(declare (ignore x y))
"Обработка нажатия стрелок"
(case special-key
(:key-up (incf *number-of-corners*) ;увеличение количества углов
(get-coordinates))
(:key-down (if (> *number-of-corners* 3) (decf *number-of-corners*)) ;уменьшение количества углов
(get-coordinates))
(:key-left (decf *rotate-speed* 0.2)) ;уменьшение скорости вращения
(:key-right (incf *rotate-speed* 0.2)))) ;увеличение скорости вращения
 
 
(defmethod glut:reshape ((window example-window) width height)
(declare (type fixnum width height))
"Реакция на изменение размеров окна"
(setf *width* width
*height* height
*radius* (/ (min width height) 4))
(gl:viewport 0 0 width height)
(gl:matrix-mode :projection)
(gl:load-identity)
(gl:ortho 0 width 0 height -1 1)
(gl:matrix-mode :modelview)
(gl:load-identity))
 
 
(defmethod glut:display ((window example-window))
"Собственно отрисовка"
(gl:clear :color-buffer)
(gl:load-identity)
(gl:translate (/ *width* 2) (/ *height* 2) 0)
(gl:rotate *angle* 0 0 1)
(gl:with-primitive :polygon
(dotimes (i *number-of-corners*)
(gl:tex-coord (/ (1+ (aref *coordinates* i 0)) 2) (/ (1+ (aref *coordinates* i 1)) 2))
(gl:vertex (* *radius* (aref *coordinates* i 0)) (* *radius* (aref *coordinates* i 1)))))
(glut:swap-buffers))
 
 
(defmethod glut:display-window :before ((window example-window))
"Загружаем текстуру"
(gl:enable :texture-2d)
(il:init) ; <-
(ilu:init) ; <- инициализация
(ilut:init) ; <- cl-devil
(ilut:renderer :opengl) ; <-
(gl:bind-texture :texture-2d (ilut:gl-load-image "путь к изображению")))
 
(defun run ()
(glut:display-window (make-instance 'example-window)))
 


Код этот замечательно компилится без нареканий. Но при попытке запустить, собственно, функцию run вылетает ошибка "Attempt to call an undefined alien function".
Я вот прям почти совсем новичок ещё, так что, если это не трудно, не могли вы мне доступно растолковать, что же тут не так?
Заранее признателен!

.. забыл уточнить, что использую SBCL под Windows. Чуть позже поставлю себе какую-нибудь бубунту и там ещё попробую.

отредактировал(а) philimonix: 2016-12-06 20:45 GMT+3 часа(ов)
> 1 <


Онлайн :

0 пользователь(ей), 20 гость(ей) :




Реклама на сайте: