Subversion Repositories Kolibri OS

Rev

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

  1. include 'opengl_const.inc'
  2. include 'zbuffer.inc'
  3. include 'zmath.inc'
  4.  
  5.  
  6. ;enum { OP_ ## a , ... }
  7. sum1 equ 0
  8. macro ADD_OP a,b,c
  9. {
  10.         OP_#a equ sum1
  11.         sum1 equ (sum1+1)
  12. }
  13. include 'opinfo.inc'
  14.  
  15.  
  16. ;initially # of allocated GLVertexes (will grow when necessary)
  17. POLYGON_MAX_VERTEX equ 16
  18.  
  19. ;Max # of specular light pow buffers
  20. MAX_SPECULAR_BUFFERS equ 8
  21. ;# of entries in specular buffer
  22. SPECULAR_BUFFER_SIZE equ 1024
  23. ;specular buffer granularity
  24. SPECULAR_BUFFER_RESOLUTION equ 1024
  25.  
  26.  
  27. MAX_MODELVIEW_STACK_DEPTH  equ 32
  28. MAX_PROJECTION_STACK_DEPTH equ 8
  29. MAX_TEXTURE_STACK_DEPTH    equ 8
  30. MAX_NAME_STACK_DEPTH       equ 64
  31. MAX_TEXTURE_LEVELS         equ 11
  32. MAX_LIGHTS                 equ 16
  33.  
  34. VERTEX_HASH_SIZE equ 1031
  35.  
  36. MAX_DISPLAY_LISTS equ 1024
  37. OP_BUFFER_MAX_SIZE equ 512
  38.  
  39. TGL_OFFSET_FILL    equ 0x1
  40. TGL_OFFSET_LINE    equ 0x2
  41. TGL_OFFSET_POINT   equ 0x4
  42.  
  43. struct GLSpecBuf
  44.         shininess_i dd ? ;int
  45.         last_used dd ? ;int
  46.         buf rd SPECULAR_BUFFER_SIZE+1 ;float[SPECULAR_BUFFER_SIZE+1]
  47.         next dd ? ;struct GLSpecBuf*
  48. ends
  49.  
  50. offs_spec_shininess_i equ 0
  51. offs_spec_last_used equ 4
  52. offs_spec_buf equ 8
  53. offs_spec_next equ 8+4*(SPECULAR_BUFFER_SIZE+1)
  54.  
  55. struct GLLight
  56.         ambient V4
  57.         diffuse V4
  58.         specular V4
  59.         position V4    
  60.         spot_direction V3
  61.         spot_exponent dd ? ;float
  62.         spot_cutoff dd ? ;float
  63.         attenuation rd 3 ;float[3]
  64.         ; precomputed values
  65.         cos_spot_cutoff dd ? ;float
  66.         norm_spot_direction V3
  67.         norm_position V3
  68.         ; we use a linked list to know which are the enabled lights
  69.         enabled dd ? ;int
  70.         next dd ? ;struct GLLight*
  71.         prev dd ? ;struct GLLight*
  72. ends
  73.  
  74. offs_ligh_ambient equ 0 ;V4
  75. offs_ligh_diffuse equ 16 ;V4
  76. offs_ligh_specular equ 32 ;V4
  77. offs_ligh_position equ 48 ;V4  
  78. offs_ligh_spot_direction equ 64 ;V3
  79. offs_ligh_spot_exponent equ 76 ;dd ?
  80. offs_ligh_spot_cutoff equ 80 ;dd ?
  81. offs_ligh_attenuation equ 84 ;rd 3
  82. offs_ligh_cos_spot_cutoff equ 96 ;dd ?
  83. offs_ligh_norm_spot_direction equ 100 ;V3
  84. offs_ligh_norm_position equ 112 ;V3
  85. offs_ligh_enabled equ 124 ;dd ?
  86. offs_ligh_next equ 128 ;dd ?
  87. offs_ligh_prev equ 132 ;dd ?
  88.  
  89. struct GLMaterial
  90.         emission V4
  91.         ambient  V4
  92.         diffuse  V4
  93.         specular V4
  94.         shininess dd ? ;float
  95.  
  96.         ; computed values
  97.         shininess_i dd ? ;int
  98.         do_specular dd ? ;int
  99. ends
  100.  
  101. offs_mate_emission   equ 0 ;V4
  102. offs_mate_ambient   equ 16 ;V4
  103. offs_mate_diffuse   equ 32 ;V4
  104. offs_mate_specular  equ 48 ;V4
  105. offs_mate_shininess equ 64 ;dd
  106. offs_mate_shininess_i equ 68 ;dd
  107. offs_mate_do_specular equ 72 ;dd
  108.  
  109. struct GLViewport
  110.         xmin dd ? ;int
  111.         ymin dd ? ;int
  112.         xsize dd ? ;int
  113.         ysize dd ? ;int
  114.         scale V3
  115.         trans V3
  116.         updated dd ? ;int
  117. ends
  118.  
  119. offs_vpor_xmin   equ 0
  120. offs_vpor_ymin   equ 4
  121. offs_vpor_xsize  equ 8
  122. offs_vpor_ysize equ 12
  123. offs_vpor_scale equ 16
  124. offs_vpor_trans equ 28
  125. offs_vpor_updated equ 40
  126.  
  127. struct GLParamBuffer
  128.         ops rd OP_BUFFER_MAX_SIZE ;GLParam[OP_BUFFER_MAX_SIZE]
  129.         next dd ? ;struct GLParamBuffer*
  130. ends
  131.  
  132. offs_gpbu_ops equ 0
  133. offs_gpbu_next equ 4*OP_BUFFER_MAX_SIZE
  134.  
  135. struct GLList
  136.         first_op_buffer dd ? ;GLParamBuffer*
  137.         ; TODO: extensions for an hash table or a better allocating scheme
  138. ends
  139.  
  140. struct GLVertex
  141.         edge_flag dd ? ;int
  142.         normal V3
  143.         coord V4
  144.         tex_coord V4
  145.         color V4
  146.  
  147.         ; computed values
  148.         ec V4 ; eye coordinates
  149.         pc V4 ; coordinates in the normalized volume
  150.         clip_code dd ? ;int ; clip code
  151.         zp ZBufferPoint ; integer coordinates for the rasterization
  152. ends
  153.  
  154. offs_vert_edge_flag  equ 0
  155. offs_vert_normal     equ 4
  156. offs_vert_coord     equ 16
  157. offs_vert_tex_coord equ 32
  158. offs_vert_color     equ 48
  159. offs_vert_ec        equ 64
  160. offs_vert_pc        equ 80
  161. offs_vert_clip_code equ 96
  162. offs_vert_zp       equ 100
  163.  
  164. struct GLImage
  165.         pixmap dd ? ;void*
  166.         xsize dd ? ;int
  167.         ysize dd ? ;int
  168. ends
  169.  
  170. offs_imag_pixmap equ 0
  171.  
  172. ; textures
  173.  
  174. TEXTURE_HASH_TABLE_SIZE equ 256 ;должно быть кратное 2, в коде берется остаток от деления (через and быстрее чем div)
  175.  
  176. struct GLTexture
  177.         images rb sizeof.GLImage * MAX_TEXTURE_LEVELS ;GLImage[MAX_TEXTURE_LEVELS]
  178.         handle dd ? ;int
  179.         next dd ? ;struct GLTexture*
  180.         prev dd ? ;struct GLTexture*
  181. ends
  182.  
  183. offs_text_images equ 0
  184. offs_text_handle equ sizeof.GLImage*MAX_TEXTURE_LEVELS
  185. offs_text_next equ 4+offs_text_handle
  186. offs_text_prev equ 8+offs_text_handle
  187.  
  188. ; shared state
  189.  
  190. struct GLSharedState
  191.         lists dd ? ;GLList**
  192.         texture_hash_table dd ? ;GLTexture**
  193. ends
  194.  
  195.  
  196. ; display context
  197.  
  198. struct GLContext
  199.         ; Z buffer
  200.         zb dd ? ;ZBuffer*
  201.  
  202.         ; lights
  203.         lights rb sizeof.GLLight * MAX_LIGHTS ;GLLight[MAX_LIGHTS]
  204.         first_light dd ? ;GLLight*
  205.         ambient_light_model V4
  206.         local_light_model dd ? ;int
  207.         lighting_enabled dd ? ;int
  208.         light_model_two_side dd ? ;int
  209.  
  210.         ; materials
  211.         materials rb sizeof.GLMaterial * 2 ;GLMaterial[2]
  212.         color_material_enabled dd ? ;int
  213.         current_color_material_mode dd ? ;int
  214.         current_color_material_type dd ? ;int
  215.  
  216.         ; textures
  217.         current_texture dd ? ;GLTexture*
  218.         texture_2d_enabled dd ? ;int
  219.  
  220.         ; shared state
  221.         shared_state GLSharedState
  222.  
  223.         ; current list
  224.         current_op_buffer dd ? ;GLParamBuffer*
  225.         current_op_buffer_index dd ? ;int
  226.         exec_flag dd ? ;int
  227.         compile_flag dd ? ;int
  228.         print_flag dd ? ;int
  229.  
  230.         ; matrix
  231.  
  232.         matrix_mode dd ? ;int режим активного вида матрицы (один из 3-х: GL_MODELVIEW, GL_PROJECTION, GL_TEXTURE)
  233.         matrix_stack rd 3 ;*M4[3] указатель на начало массива матриц
  234.         matrix_stack_ptr rd 3 ;*M4[3] указатель на активную матрицу из массива
  235.         matrix_stack_depth_max rd 3 ;int[3] максимальное число матриц в массивах matrix_stack
  236.  
  237.         matrix_model_view_inv M4
  238.         matrix_model_projection M4
  239.         matrix_model_projection_updated dd ? ;int
  240.         matrix_model_projection_no_w_transform dd ? ;int
  241.         apply_texture_matrix dd ? ;int
  242.  
  243.         ; viewport
  244.         viewport GLViewport
  245.  
  246.         ; current state
  247.         polygon_mode_back dd ? ;int
  248.         polygon_mode_front dd ? ;int
  249.  
  250.         current_front_face dd ? ;int
  251.         current_shade_model dd ? ;int
  252.         current_cull_face dd ? ;int
  253.         cull_face_enabled dd ? ;int
  254.         normalize_enabled dd ? ;int
  255.         draw_triangle_front dd ? ;gl_draw_triangle_func
  256.         draw_triangle_back  dd ? ;gl_draw_triangle_func
  257.  
  258.         ; selection
  259.         render_mode dd ? ;int
  260.         select_buffer dd ? ;unsigned int*
  261.         select_size dd ? ;int
  262.         select_ptr dd ? ;unsigned int*
  263.         select_hit dd ? ;unsigned int*
  264.         select_overflow dd ? ;int
  265.         select_hits dd ? ;int
  266.  
  267.         ; names
  268.         name_stack rd MAX_NAME_STACK_DEPTH ;unsigned int[MAX_NAME_STACK_DEPTH]
  269.         name_stack_size dd ? ;int
  270.  
  271.         ; clear
  272.         clear_depth dd ? ;float
  273.         clear_color V4
  274.  
  275.         ; current vertex state
  276.         current_color V4
  277.         longcurrent_color rd 3 ;unsigned int[3] ;precomputed integer color
  278.         current_normal V4
  279.         current_tex_coord V4
  280.         current_edge_flag dd ? ;int
  281.  
  282.         ; glBegin / glEnd
  283.         in_begin dd ? ;int
  284.         begin_type dd ? ;int
  285.         vertex_n dd ? ;int
  286.         vertex_cnt dd ? ;int
  287.         vertex_max dd ? ;int
  288.         vertex dd ? ;GLVertex*
  289.  
  290.         ; opengl 1.1 arrays
  291.         vertex_array dd ? ;float*
  292.         vertex_array_size dd ? ;int
  293.         vertex_array_stride dd ? ;int
  294.         normal_array dd ? ;float*
  295.         normal_array_stride dd ? ;int
  296.         color_array dd ? ;float*
  297.         color_array_size dd ? ;int
  298.         color_array_stride dd ? ;int
  299.         texcoord_array dd ? ;float*
  300.         texcoord_array_size dd ? ;int
  301.         texcoord_array_stride dd ? ;int
  302.         client_states dd ? ;int
  303.  
  304.         ; opengl 1.1 polygon offset
  305.         offset_factor dd ? ;float
  306.         offset_units dd ? ;float
  307.         offset_states dd ? ;int
  308.  
  309.         ; specular buffer. could probably be shared between contexts,
  310.         ; but that wouldn't be 100% thread safe
  311.         specbuf_first dd ? ;GLSpecBuf*
  312.         specbuf_used_counter dd ? ;int
  313.         specbuf_num_buffers dd ? ;int
  314.  
  315.         ; opaque structure for user's use
  316.         opaque dd ? ;void*
  317.         ; resize viewport function
  318.         gl_resize_viewport dd ? ;(struct GLContext *c,int *xsize,int *ysize)
  319.  
  320.         ; depth test
  321.         depth_test dd ? ;int
  322. ends
  323.  
  324. offs_cont_s0 equ (4 + sizeof.GLLight * MAX_LIGHTS)
  325. offs_cont_s1 equ (32 + offs_cont_s0 + sizeof.GLMaterial * 2)
  326. offs_cont_s2 equ (228 + offs_cont_s1 + sizeof.GLViewport)
  327. offs_cont_s3 equ (64 + offs_cont_s2 + MAX_NAME_STACK_DEPTH * 4)
  328.  
  329. offs_cont_zb          equ 0 ;ZBuffer*
  330. offs_cont_lights      equ 4 ;GLLight[MAX_LIGHTS]
  331. offs_cont_first_light equ offs_cont_s0 ;GLLight*
  332. offs_cont_ambient_light_model  equ 4+offs_cont_s0 ;V4
  333. offs_cont_local_light_model    equ 20+offs_cont_s0 ;int
  334. offs_cont_lighting_enabled     equ 24+offs_cont_s0 ;int
  335. offs_cont_light_model_two_side  equ 28+offs_cont_s0 ;int
  336. offs_cont_materials              equ 32+offs_cont_s0 ;GLMaterial[2]
  337. offs_cont_color_material_enabled  equ offs_cont_s1 ;int
  338. offs_cont_current_color_material_mode equ 4+offs_cont_s1 ;int
  339. offs_cont_current_color_material_type equ 8+offs_cont_s1 ;int
  340. offs_cont_current_texture         equ 12+offs_cont_s1 ;GLTexture*
  341. offs_cont_texture_2d_enabled      equ 16+offs_cont_s1 ;int
  342. offs_cont_shared_state            equ 20+offs_cont_s1 ;GLSharedState
  343. offs_cont_current_op_buffer       equ 28+offs_cont_s1 ;GLParamBuffer*
  344. offs_cont_current_op_buffer_index equ 32+offs_cont_s1 ;int
  345. offs_cont_exec_flag               equ 36+offs_cont_s1 ;int
  346. offs_cont_compile_flag            equ 40+offs_cont_s1 ;int
  347. offs_cont_print_flag              equ 44+offs_cont_s1 ;int
  348. offs_cont_matrix_mode             equ 48+offs_cont_s1 ;int
  349. offs_cont_matrix_stack            equ 52+offs_cont_s1 ;*M4[3]
  350. offs_cont_matrix_stack_ptr        equ 64+offs_cont_s1 ;*M4[3]
  351. offs_cont_matrix_stack_depth_max  equ 76+offs_cont_s1 ;int[3]
  352. offs_cont_matrix_model_view_inv   equ 88+offs_cont_s1 ;M4
  353. offs_cont_matrix_model_projection equ 152+offs_cont_s1 ;M4
  354. offs_cont_matrix_model_projection_updated equ 216+offs_cont_s1 ;int
  355. offs_cont_matrix_model_projection_no_w_transform equ 220+offs_cont_s1 ;int
  356. offs_cont_apply_texture_matrix    equ 224+offs_cont_s1 ;int
  357. offs_cont_viewport               equ 228+offs_cont_s1 ;GLViewport
  358. offs_cont_polygon_mode_back     equ offs_cont_s2 ;int
  359. offs_cont_polygon_mode_front   equ 4+offs_cont_s2 ;int
  360. offs_cont_current_front_face   equ 8+offs_cont_s2 ;int
  361. offs_cont_current_shade_model  equ 12+offs_cont_s2 ;int
  362. offs_cont_current_cull_face    equ 16+offs_cont_s2 ;int
  363. offs_cont_cull_face_enabled    equ 20+offs_cont_s2 ;int
  364. offs_cont_normalize_enabled    equ 24+offs_cont_s2 ;int
  365. offs_cont_draw_triangle_front  equ 28+offs_cont_s2 ;gl_draw_triangle_func
  366. offs_cont_draw_triangle_back   equ 32+offs_cont_s2 ;gl_draw_triangle_func
  367. offs_cont_render_mode          equ 36+offs_cont_s2 ;int
  368. offs_cont_select_buffer        equ 40+offs_cont_s2 ;unsigned int*
  369. offs_cont_select_size          equ 44+offs_cont_s2 ;int
  370. offs_cont_select_ptr           equ 48+offs_cont_s2 ;unsigned int*
  371. offs_cont_select_hit           equ 52+offs_cont_s2 ;unsigned int*
  372. offs_cont_select_overflow      equ 56+offs_cont_s2 ;int
  373. offs_cont_select_hits          equ 60+offs_cont_s2 ;int
  374. offs_cont_name_stack           equ 64+offs_cont_s2 ;unsigned int[MAX_NAME_STACK_DEPTH]
  375. offs_cont_name_stack_size     equ offs_cont_s3 ;int
  376. offs_cont_clear_depth        equ 4+offs_cont_s3 ;float
  377. offs_cont_clear_color       equ 8+offs_cont_s3 ;V4
  378. offs_cont_current_color     equ 24+offs_cont_s3 ;V4
  379. offs_cont_longcurrent_color equ 40+offs_cont_s3 ;unsigned int[3]
  380. offs_cont_current_normal    equ 52+offs_cont_s3 ;V4
  381. offs_cont_current_tex_coord equ 68+offs_cont_s3 ;V4
  382. offs_cont_current_edge_flag equ 84+offs_cont_s3 ;int
  383. offs_cont_in_begin          equ 88+offs_cont_s3 ;int
  384. offs_cont_begin_type        equ 92+offs_cont_s3 ;int
  385. offs_cont_vertex_n          equ 96+offs_cont_s3 ;int
  386. offs_cont_vertex_cnt        equ 100+offs_cont_s3 ;int
  387. offs_cont_vertex_max        equ 104+offs_cont_s3 ;int
  388. offs_cont_vertex            equ 108+offs_cont_s3 ;GLVertex*
  389. offs_cont_vertex_array      equ 112+offs_cont_s3 ;float*
  390. offs_cont_vertex_array_size  equ 116+offs_cont_s3 ;int
  391. offs_cont_vertex_array_stride equ 120+offs_cont_s3 ;int
  392. offs_cont_normal_array        equ 124+offs_cont_s3 ;float*
  393. offs_cont_normal_array_stride equ 128+offs_cont_s3 ;int
  394. offs_cont_color_array         equ 132+offs_cont_s3 ;float*
  395. offs_cont_color_array_size    equ 136+offs_cont_s3 ;int
  396. offs_cont_color_array_stride  equ 140+offs_cont_s3 ;int
  397. offs_cont_texcoord_array      equ 144+offs_cont_s3 ;float*
  398. offs_cont_texcoord_array_size  equ 148+offs_cont_s3 ;int
  399. offs_cont_texcoord_array_stride equ 152+offs_cont_s3 ;int
  400. offs_cont_client_states        equ 156+offs_cont_s3 ;int
  401. offs_cont_offset_factor        equ 160+offs_cont_s3 ;float
  402. offs_cont_offset_units         equ 164+offs_cont_s3 ;float
  403. offs_cont_offset_states        equ 168+offs_cont_s3 ;int
  404. offs_cont_specbuf_first        equ 172+offs_cont_s3 ;GLSpecBuf*
  405. offs_cont_specbuf_used_counter equ 176+offs_cont_s3 ;int
  406. offs_cont_specbuf_num_buffers  equ 180+offs_cont_s3 ;int
  407. offs_cont_opaque                   equ 184+offs_cont_s3 ;void*
  408. offs_cont_gl_resize_viewport   equ 188+offs_cont_s3 ;(struct GLContext *c,int *xsize,int *ysize)
  409. offs_cont_depth_test           equ 192+offs_cont_s3 ;int
  410.  
  411. align 16
  412. gl_ctx dd ? ;extern GLContext*
  413.  
  414. align 16
  415. proc gl_get_context
  416.         mov eax,[gl_ctx]
  417.         ret
  418. endp
  419.  
  420. ; this clip epsilon is needed to avoid some rounding errors after
  421. ; several clipping stages
  422.  
  423. CLIP_EPSILON dd 1.0e-5
  424.  
  425. align 4
  426. proc gl_clipcode uses ebx, x:dword, y:dword, z:dword, w1:dword
  427.         xor ebx,ebx
  428.  
  429.         fld1
  430.         fadd dword[CLIP_EPSILON]
  431.         fmul dword[w1]
  432.  
  433.         fcom dword[x]
  434.         fstsw ax
  435.         sahf
  436.         ja @f
  437.                 or ebx,2
  438.         @@:
  439.         fcom dword[y]
  440.         fstsw ax
  441.         sahf
  442.         ja @f
  443.                 or ebx,8
  444.         @@:
  445.         fcom dword[z]
  446.         fstsw ax
  447.         sahf
  448.         ja @f
  449.                 or ebx,32
  450.         @@:
  451.  
  452.         fchs
  453.         fcom dword[x]
  454.         fstsw ax
  455.         sahf
  456.         jbe @f
  457.                 or ebx,1
  458.         @@:
  459.         fcom dword[y]
  460.         fstsw ax
  461.         sahf
  462.         jbe @f
  463.                 or ebx,4
  464.         @@:
  465.         fcom dword[z]
  466.         fstsw ax
  467.         sahf
  468.         jbe @f
  469.                 or ebx,16
  470.         @@:
  471.  
  472.         ffree st0
  473.         fincstp
  474.  
  475.         mov eax,ebx
  476. if DEBUG ;gl_clipcode
  477. push edi
  478.         mov ecx,80
  479.         lea edi,[buf_param]
  480.         stdcall convert_int_to_str,ecx
  481.         stdcall str_n_cat,edi,txt_nl,2
  482.         stdcall dbg_print,f_clipcode,buf_param
  483. pop edi
  484. end if
  485.         ret
  486. endp
  487.  
  488. ;input:
  489. ; rf,gf,bf - значения float
  490. ; ri,gi,bi - адреса куда будут записаны rf,gf,bf преобразованые в int
  491. align 4
  492. proc RGBFtoRGBI uses eax, rf:dword,gf:dword,bf:dword, ri:dword,gi:dword,bi:dword
  493. locals
  494.         s dd ?
  495. endl
  496.         mov dword[s],(ZB_POINT_RED_MAX - ZB_POINT_RED_MIN)
  497.         fild dword[s]
  498.         fmul dword[rf]
  499.         mov eax,[ri]
  500.         fistp dword[eax]
  501.         add dword[eax],ZB_POINT_RED_MIN
  502.  
  503.         mov dword[s],(ZB_POINT_GREEN_MAX - ZB_POINT_GREEN_MIN)
  504.         fild dword[s]
  505.         fmul dword[gf]
  506.         mov eax,[gi]
  507.         fistp dword[eax]
  508.         add dword[eax],ZB_POINT_GREEN_MIN
  509.  
  510.         ;bi = (unsigned int) (bf * (ZB_POINT_BLUE_MAX - ZB_POINT_BLUE_MIN) + ZB_POINT_BLUE_MIN);
  511.         mov dword[s],(ZB_POINT_BLUE_MAX - ZB_POINT_BLUE_MIN)
  512.         fild dword[s]
  513.         fmul dword[bf]
  514.         mov eax,[bi]
  515.         fistp dword[eax]
  516.         add dword[eax],ZB_POINT_BLUE_MIN
  517.         ret
  518. endp
  519.