Subversion Repositories Kolibri OS

Rev

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