Subversion Repositories Kolibri OS

Rev

Rev 5381 | Rev 8409 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. use32
  2.         org 0x0
  3.         db 'MENUET01'
  4.         dd 1,start,i_end,mem,stacktop,0,cur_dir_path
  5.  
  6. include '../../../../../proc32.inc'
  7. include '../../../../../macros.inc'
  8. include '../../../../../KOSfuncs.inc'
  9. include '../../../../../develop/libraries/box_lib/load_lib.mac'
  10. include '../../../../../dll.inc'
  11. include '../opengl_const.inc'
  12.  
  13. @use_library
  14.  
  15. align 4
  16. start:
  17.         load_library name_tgl, cur_dir_path, library_path, system_path, \
  18.                 err_message_found_lib, head_f_l, import_lib_tinygl, err_message_import, head_f_i
  19.         cmp eax,SF_TERMINATE_PROCESS
  20.         jz button.exit
  21.  
  22.         mcall SF_SET_EVENTS_MASK,0x27
  23.  
  24.         ;заполняем массив индексов из файла house.3ds (который вшит внутрь данной программы)
  25.         mov esi,house_3ds
  26.         add esi,0x1798 ;смещение по которому идет информация о гранях в файле 3ds (получено с использованием программы info_3ds)
  27.         mov edi,Indices
  28.         mov eax,0x1a6 ;число граней в файле 3ds (получено с использованием программы info_3ds)
  29.         @@:
  30.                 movsd
  31.                 movsw
  32.                 add esi,2 ;пропускаем свойства грани
  33.                 dec eax
  34.                 or eax,eax
  35.         jnz @b
  36.  
  37.         ;первоначальные настройки контекста tinygl
  38.         stdcall [kosglMakeCurrent], 10,10,400,350,ctx1
  39.         stdcall [glEnable], GL_DEPTH_TEST
  40.         stdcall [glClearColor], 0.0,0.0,0.0,0.0
  41.         stdcall [glShadeModel], GL_SMOOTH
  42.  
  43.         call draw_3d
  44.  
  45. align 4
  46. red_win:
  47.         call draw_window
  48.  
  49. align 4
  50. still:
  51.         mcall SF_WAIT_EVENT
  52.         cmp al,1
  53.         jz red_win
  54.         cmp al,2
  55.         jz key
  56.         cmp al,3
  57.         jz button
  58.         jmp still
  59.  
  60. align 4
  61. draw_window:
  62.         pushad
  63.         mcall SF_REDRAW,SSF_BEGIN_DRAW
  64.  
  65.         mov edx,0x33ffffff
  66.         mcall SF_CREATE_WINDOW,(50 shl 16)+430,(30 shl 16)+400,,,caption
  67.         stdcall [kosglSwapBuffers]
  68.  
  69.         mcall SF_REDRAW,SSF_END_DRAW
  70.         popad
  71.         ret
  72.  
  73. align 4
  74. key:
  75.         mcall SF_GET_KEY
  76.  
  77.         cmp ah,27 ;Esc
  78.         je button.exit
  79.  
  80.         cmp ah,61 ;+
  81.         jne @f
  82.                 fld dword[scale]
  83.                 fadd dword[delt_sc]
  84.                 fstp dword[scale]
  85.                 call draw_3d
  86.                 stdcall [kosglSwapBuffers]
  87.         @@:
  88.         cmp ah,45 ;-
  89.         jne @f
  90.                 fld dword[scale]
  91.                 fsub dword[delt_sc]
  92.                 fstp dword[scale]
  93.                 call draw_3d
  94.                 stdcall [kosglSwapBuffers]
  95.         @@:
  96.         cmp ah,178 ;Up
  97.         jne @f
  98.                 fld dword[angle_y]
  99.                 fadd dword[delt_size]
  100.                 fstp dword[angle_y]
  101.                 call draw_3d
  102.                 stdcall [kosglSwapBuffers]
  103.         @@:
  104.         cmp ah,177 ;Down
  105.         jne @f
  106.                 fld dword[angle_y]
  107.                 fsub dword[delt_size]
  108.                 fstp dword[angle_y]
  109.                 call draw_3d
  110.                 stdcall [kosglSwapBuffers]
  111.         @@:
  112.         cmp ah,176 ;Left
  113.         jne @f
  114.                 fld dword[angle_x]
  115.                 fadd dword[delt_size]
  116.                 fstp dword[angle_x]
  117.                 call draw_3d
  118.                 stdcall [kosglSwapBuffers]
  119.         @@:
  120.         cmp ah,179 ;Right
  121.         jne @f
  122.                 fld dword[angle_x]
  123.                 fsub dword[delt_size]
  124.                 fstp dword[angle_x]
  125.                 call draw_3d
  126.                 stdcall [kosglSwapBuffers]
  127.         @@:
  128.  
  129.         jmp still
  130.  
  131. align 4
  132. button:
  133.         mcall SF_GET_BUTTON
  134.         cmp ah,1
  135.         jne still
  136. .exit:
  137.         mcall SF_TERMINATE_PROCESS
  138.  
  139.  
  140. align 4
  141. caption db 'Test opengl 1.1 arrays, [Esc] - exit, [<-],[->],[Up],[Down] - rotate',0
  142. align 4
  143. ctx1 db 28 dup (0) ;TinyGLContext or KOSGLContext
  144. ;sizeof.TinyGLContext = 28
  145.  
  146. align 4
  147. draw_3d:
  148. stdcall [glClear], GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT ;очистим буфер цвета и глубины
  149. stdcall [glPushMatrix]
  150.  
  151.         ;масштаб и повороты
  152.         stdcall [glTranslatef], 0.0,0.0,0.5
  153.         stdcall [glScalef], [scale], [scale], [scale]
  154.         stdcall [glRotatef], [angle_z],0.0,0.0,1.0
  155.         stdcall [glRotatef], [angle_y],0.0,1.0,0.0
  156.         stdcall [glRotatef], [angle_x],1.0,0.0,0.0
  157.  
  158.         ;рисование через тндексный массив
  159.         mov eax,house_3ds ;начало внедренного файла 3ds
  160.         add eax,0xeb ;смещение по которому идут координаты вершин (получено с использованием программы info_3ds)
  161.         stdcall [glVertexPointer], 3, GL_FLOAT, 0, eax ;задаем массив для вершин, 3 - число координат для одной вершины
  162.         stdcall [glEnableClientState], GL_VERTEX_ARRAY ;включаем режим рисования вершин
  163.         stdcall [glDrawElements], GL_TRIANGLES, 0x1a6*3, GL_UNSIGNED_SHORT, Indices ;mode, count, type, *indices
  164.         stdcall [glDisableClientState], GL_VERTEX_ARRAY ;отключаем режим рисования вершин
  165.  
  166. stdcall [glPopMatrix]
  167. ret
  168.  
  169. align 4
  170. scale dd 0.0065 ;начальный масштаб (в идеальном случае должен вычислятся, но для даного примера подобран в ручную на глаз)
  171. delt_sc dd 0.0005
  172. angle_z dd 90.0
  173. angle_y dd 90.0
  174. angle_x dd 0.0
  175. delt_size dd 3.0
  176.  
  177. align 4
  178. house_3ds: ;внедряем файл внутрь программы (в идеальном случае должен открыватся через окно диалога, но для облегчения примера вшит внутрь)
  179. file '../../../../../demos/3DS/3ds_objects/House.3ds'
  180. align 4
  181. Indices rb 0x1a6*6 ;0x1a6 - число граней, на каждую грань по 3 точки, индекс точки 2 байта
  182.  
  183. ;--------------------------------------------------
  184. align 4
  185. import_lib_tinygl:
  186.  
  187. macro E_LIB n
  188. {
  189.         n dd sz_#n
  190. }
  191. include '../export.inc'
  192.         dd 0,0
  193. macro E_LIB n
  194. {
  195.         sz_#n db `n,0
  196. }
  197. include '../export.inc'
  198.  
  199. ;--------------------------------------------------
  200. system_path db '/sys/lib/'
  201. name_tgl db 'tinygl.obj',0
  202. err_message_found_lib db 'Sorry I cannot load library ',39,'tinygl.obj',39,0
  203. head_f_i:
  204. head_f_l db 'System error',0
  205. err_message_import db 'Error on load import library ',39,'tinygl.obj',39,0
  206. ;--------------------------------------------------
  207.  
  208. i_end:
  209.         rb 4096
  210. stacktop:
  211. cur_dir_path:
  212.         rb 4096
  213. library_path:
  214.         rb 4096
  215. mem:
  216.