Куб, который можно вращать
Код:
' BYE TO K_F5
" Двигать куб: x: ЛКМ,ПКМ y: HOME,END z: PGUP,PGDOWN" PRINT CR
" Вращать куб: Стрелки" PRINT CR
" Выход: F5" PRINT CR
0 VALUE ActiveLibrary
: FUNCTION ActiveLibrary SWAP GETPROCADDRESS VALUE ; // это чтобы не писать имя dll каждый раз
" opengl32.dll" LOADLIBRARY VALUE OPENGL
OPENGL TO ActiveLibrary
" glViewport" FUNCTION glViewPort@ : glViewPort glViewPort@ API4 DROP ;
" glVertex3dv" FUNCTION glVertex3dv@ : glVertex3dv glVertex3dv@ API1 DROP ;
" glBegin" FUNCTION glBegin@ : glBegin glBegin@ API1 DROP ;
" glEnd" FUNCTION glEnd@ : glEnd glEnd@ API0 DROP ;
" glEnable" FUNCTION glEnable@ : glEnable glEnable@ API1 DROP ;
" glDisable" FUNCTION glDisable@ : glDisable glDisable@ API1 DROP ;
" glClear" FUNCTION glClear@ : glClear glClear@ API1 DROP ;
" glPushMatrix" FUNCTION glPushMatrix@ : glPushMatrix glPushMatrix@ API0 DROP ;
" glPopMatrix" FUNCTION glPopMatrix@ : glPopMatrix glPopMatrix@ API0 DROP ;
" glColor3i" FUNCTION glColor3i@ : glColor3i glColor3i@ API3 DROP ;
" glColor3ubv" FUNCTION glColor3ubv@ : glColor3ubv glColor3ubv@ API1 DROP ;
" USER32.DLL" LOADLIBRARY
" GetKeyState" GETPROCADDRESS CONSTANT 'GetKeyState
: KEY-PRESSED? 'GetKeyState API1 128 AND 0 > ;
37 CONSTANT VK_LEFT
38 CONSTANT VK_UP
39 CONSTANT VK_RIGHT
40 CONSTANT VK_DOWN
: МОДЕЛЬ: // Объявляем начало некоторого трехмерного объекта
HERE HERE ;
: ;МОДЕЛЬ" // Объявляем конец описания этого некоторого трехмерного объекта и его имя
HERE SWAP - CREATE SWAP , , DOES> DUP 4 + >R @ R> @ ;
: POINT // ( F: z y x -- ) Создает "точку" с тремя координатами и указанным именем, берет их с флоат-стека в обратном порядке
CREATE F, F, F, ;
: двигать_x+ // ( a u --) ( F: n --) Двигает объект по оси Х
24 / 0 DO
FDUP
DUP F@ F+ DUP F!
24 +
LOOP DROP
;
: двигать_y+ // ( a u --) ( F: n --) Двигает объект по оси У
>R 8 + R>
двигать_x+
;
: двигать_z+ // ( a u --) ( F: n --) Двигает объект по оси З
>R 16 + R>
двигать_x+
;
МОДЕЛЬ:
// Точки куба
CREATE Point1 -0.4 F, -0.4 F, -0.4 F,
CREATE Point2 -0.4 F, 0.4 F, -0.4 F,
CREATE Point3 0.4 F, 0.4 F, -0.4 F,
CREATE Point4 0.4 F, -0.4 F, -0.4 F,
CREATE Point5 -0.4 F, -0.4 F, 0.4 F,
CREATE Point6 -0.4 F, 0.4 F, 0.4 F,
CREATE Point7 0.4 F, 0.4 F, 0.4 F,
CREATE Point8 0.4 F, -0.4 F, 0.4 F,
// Точки стрелок
// Левая стрелка
CREATE LTPoint1 -0.3 F, 0.0 F, -0.4 F, // Треугольник
CREATE LTPoint2 -0.2 F, 0.1 F, -0.4 F,
CREATE LTPoint3 -0.2 F, -0.1 F, -0.4 F,
CREATE LCPoint1 -0.2 F, 0.05 F, -0.4 F, // Квадрат
CREATE LCPoint2 -0.2 F, -0.05 F, -0.4 F,
CREATE LCPoint3 -0.1 F, -0.05 F, -0.4 F,
CREATE LCPoint4 -0.1 F, 0.05 F, -0.4 F,
// Правая стрелка
CREATE RTPoint1 0.3 F, 0.0 F, -0.4 F, // Треугольник
CREATE RTPoint2 0.2 F, 0.1 F, -0.4 F,
CREATE RTPoint3 0.2 F, -0.1 F, -0.4 F,
CREATE RCPoint1 0.2 F, 0.05 F, -0.4 F, // Квадрат
CREATE RCPoint2 0.2 F, -0.05 F, -0.4 F,
CREATE RCPoint3 0.1 F, -0.05 F, -0.4 F,
CREATE RCPoint4 0.1 F, 0.05 F, -0.4 F,
// Верхняя стрелка
CREATE UTPoint1 0.0 F, 0.3 F, -0.4 F, // Треугольник
CREATE UTPoint2 0.1 F, 0.2 F, -0.4 F,
CREATE UTPoint3 -0.1 F, 0.2 F, -0.4 F,
CREATE UCPoint1 0.05 F, 0.2 F, -0.4 F, // Квадрат
CREATE UCPoint2 -0.05 F, 0.2 F, -0.4 F,
CREATE UCPoint3 -0.05 F, 0.1 F, -0.4 F,
CREATE UCPoint4 0.05 F, 0.1 F, -0.4 F,
// Нижняя стрелка
CREATE DTPoint1 0.0 F, -0.3 F, -0.4 F, // Треугольник
CREATE DTPoint2 0.1 F, -0.2 F, -0.4 F,
CREATE DTPoint3 -0.1 F, -0.2 F, -0.4 F,
CREATE DCPoint1 0.05 F, -0.2 F, -0.4 F, // Квадрат
CREATE DCPoint2 -0.05 F, -0.2 F, -0.4 F,
CREATE DCPoint3 -0.05 F, -0.1 F, -0.4 F,
CREATE DCPoint4 0.05 F, -0.1 F, -0.4 F,
;МОДЕЛЬ" куб
CREATE смещение+ 0.01 F, // Смещение для сдвига куба
CREATE смещение- -0.01 F, // Смещение для сдвига куба
CREATE угол 5.0 F, // Угол поворота
CREATE цвет1 0x00FF9F7F ,
CREATE цвет2 0x0000FF00 ,
: раскрасить glColor3ubv ;
: ?цвет IF цвет2 ELSE цвет1 THEN ;
: куб_x+
смещение+ F@ куб двигать_x+ ;
: куб_x-
смещение- F@ куб двигать_x+ ;
: куб_y+
смещение+ F@ куб двигать_y+ ;
: куб_y-
смещение- F@ куб двигать_y+ ;
: куб_z+
смещение+ F@ куб двигать_z+ ;
: куб_z-
смещение- F@ куб двигать_z+ ;
' куб_x+ TO <MOUSE_RIGHT>
' куб_x- TO <MOUSE_LEFT>
' куб_y+ TO K_HOME
' куб_y- TO K_END
' куб_z+ TO K_PGUP
' куб_z- TO K_PGDOWN
: Левая?
VK_LEFT KEY-PRESSED? ;
: Правая?
VK_RIGHT KEY-PRESSED? ;
: Верхняя?
VK_UP KEY-PRESSED? ;
: Нижняя?
VK_DOWN KEY-PRESSED? ;
: сцена_y+
угол F@ ROTATEANGLE SF!
0.0 glX SF!
1.0 glY SF!
0.0 glZ SF!
3DROTATE
;
: сцена_y-
угол F@ ROTATEANGLE SF!
0.0 glX SF!
-1.0 glY SF!
0.0 glZ SF!
3DROTATE
;
: сцена_x+
угол F@ ROTATEANGLE SF!
1.0 glX SF!
0.0 glY SF!
0.0 glZ SF!
3DROTATE
;
: сцена_x-
угол F@ ROTATEANGLE SF!
-1.0 glX SF!
0.0 glY SF!
0.0 glZ SF!
3DROTATE
;
' сцена_y+ TO K_LEFT
' сцена_y- TO K_RIGHT
' сцена_x+ TO K_UP
' сцена_x- TO K_DOWN
: куб.
// Передняя грань
GL_LINES glBegin
Point1 glVertex3dv Point2 glVertex3dv
glEnd
GL_LINES glBegin
Point2 glVertex3dv Point3 glVertex3dv
glEnd
GL_LINES glBegin
Point3 glVertex3dv Point4 glVertex3dv
glEnd
GL_LINES glBegin
Point4 glVertex3dv Point1 glVertex3dv
glEnd
// Задняя грань
GL_LINES glBegin
Point5 glVertex3dv Point6 glVertex3dv
glEnd
GL_LINES glBegin
Point6 glVertex3dv Point7 glVertex3dv
glEnd
GL_LINES glBegin
Point7 glVertex3dv Point8 glVertex3dv
glEnd
GL_LINES glBegin
Point8 glVertex3dv Point5 glVertex3dv
glEnd
// Соединения граней
GL_LINES glBegin
Point1 glVertex3dv Point5 glVertex3dv
glEnd
GL_LINES glBegin
Point2 glVertex3dv Point6 glVertex3dv
glEnd
GL_LINES glBegin
Point3 glVertex3dv Point7 glVertex3dv
glEnd
GL_LINES glBegin
Point4 glVertex3dv Point8 glVertex3dv
glEnd
;
: левая_стрелка.
GL_TRIANGLE_STRIP glBegin
LTPoint1 glVertex3dv LTPoint2 glVertex3dv LTPoint3 glVertex3dv
glEnd
GL_QUADS glBegin
LCPoint1 glVertex3dv LCPoint2 glVertex3dv
LCPoint3 glVertex3dv LCPoint4 glVertex3dv
glEnd
;
: правая_стрелка.
GL_TRIANGLE_STRIP glBegin
RTPoint1 glVertex3dv RTPoint2 glVertex3dv RTPoint3 glVertex3dv
glEnd
GL_QUADS glBegin
RCPoint1 glVertex3dv RCPoint2 glVertex3dv
RCPoint3 glVertex3dv RCPoint4 glVertex3dv
glEnd
;
: верхняя_стрелка.
GL_TRIANGLE_STRIP glBegin
UTPoint1 glVertex3dv UTPoint2 glVertex3dv UTPoint3 glVertex3dv
glEnd
GL_QUADS glBegin
UCPoint1 glVertex3dv UCPoint2 glVertex3dv
UCPoint3 glVertex3dv UCPoint4 glVertex3dv
glEnd
;
: нижняя_стрелка.
GL_TRIANGLE_STRIP glBegin
DTPoint1 glVertex3dv DTPoint2 glVertex3dv DTPoint3 glVertex3dv
glEnd
GL_QUADS glBegin
DCPoint1 glVertex3dv DCPoint2 glVertex3dv
DCPoint3 glVertex3dv DCPoint4 glVertex3dv
glEnd
;
: Опции_начала_сцены
100 0 600 600 glViewPort // координаты левого нижнего угла, ширина и высота окна просмотра (OpenGL направляет оси вправо и вверх)
glPushMatrix // сохраняем матрицу просмотра
GL_DEPTH_TEST glEnable // разрешаем контроль глубины
GL_DEPTH_BUFFER_BIT glClear // и очищаем буфер глубины (сейчас в трехмерном пространстве ничего нет)
// обращаем внимание, что COLOR_BUFFER_BIT не установлен, поскольку он уже очищен при отрисовке "двумерной" сцены
// (это та, в которую кварк выводит текст)
GL_LIGHTING glEnable // разрешаем расчет освещения
GL_LIGHT0 glEnable // включаем первый
GL_LIGHT1 glEnable // и второй "стандартные" источники света
GL_COLOR_MATERIAL glEnable // разрешаем раскрашивать примитивы
GL_LINE_SMOOTH glEnable // разрешаем "размывание" линий
;
: Опции_конца_сцены
glPopMatrix // восстанавливаем матрицу (раз уж сохраняли)
;
: КУБИК
Опции_начала_сцены
цвет1 раскрасить куб.
Левая? ?цвет раскрасить левая_стрелка.
Правая? ?цвет раскрасить правая_стрелка.
Верхняя? ?цвет раскрасить верхняя_стрелка.
Нижняя? ?цвет раскрасить нижняя_стрелка.
Опции_конца_сцены
;
' КУБИК TO 3D // включаем наше слово как "слово для отрисовки трехмерной сцены"