Subversion Repositories Kolibri OS

Rev

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

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