Subversion Repositories Kolibri OS

Rev

Rev 6523 | 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. offs_X equ 0
  6. offs_Y equ 4
  7. offs_Z equ 8
  8. offs_W equ 12
  9.  
  10. ;enum { OP_ ## a , ... }
  11. sum1 equ 0
  12. macro ADD_OP a,b,c
  13. {
  14.         OP_#a equ sum1
  15.         sum1 equ (sum1+1)
  16. }
  17. include 'opinfo.inc'
  18.  
  19.  
  20. ;initially # of allocated GLVertexes (will grow when necessary)
  21. POLYGON_MAX_VERTEX equ 16
  22.  
  23. ;Max # of specular light pow buffers
  24. MAX_SPECULAR_BUFFERS equ 8
  25. ;# of entries in specular buffer
  26. SPECULAR_BUFFER_SIZE equ 1024
  27. ;specular buffer granularity
  28. SPECULAR_BUFFER_RESOLUTION equ 1024
  29.  
  30.  
  31. MAX_MODELVIEW_STACK_DEPTH  equ 32
  32. MAX_PROJECTION_STACK_DEPTH equ 8
  33. MAX_TEXTURE_STACK_DEPTH    equ 8
  34. MAX_NAME_STACK_DEPTH equ 64
  35. MAX_TEXTURE_LEVELS   equ 11
  36. MAX_LIGHTS equ 16
  37.  
  38. VERTEX_HASH_SIZE equ 1031
  39.  
  40. MAX_DISPLAY_LISTS equ 1024
  41. OP_BUFFER_MAX_SIZE equ 512
  42.  
  43. TGL_OFFSET_FILL    equ 0x1
  44. TGL_OFFSET_LINE    equ 0x2
  45. TGL_OFFSET_POINT   equ 0x4
  46.  
  47. struct GLSpecBuf
  48.         shininess_i dd ? ;int
  49.         last_used dd ? ;int
  50.         buf rd SPECULAR_BUFFER_SIZE+1 ;float[SPECULAR_BUFFER_SIZE+1]
  51.         next dd ? ;struct GLSpecBuf*
  52. ends
  53.  
  54. offs_spec_shininess_i equ 0
  55. offs_spec_last_used equ 4
  56. offs_spec_buf equ 8
  57. offs_spec_next equ 8+4*(SPECULAR_BUFFER_SIZE+1)
  58.  
  59. struct GLLight
  60.         ambient V4
  61.         diffuse V4
  62.         specular V4
  63.         position V4    
  64.         spot_direction V3
  65.         spot_exponent dd ? ;float
  66.         spot_cutoff dd ? ;float
  67.         attenuation rd 3 ;float[3]
  68.         ; precomputed values
  69.         cos_spot_cutoff dd ? ;float
  70.         norm_spot_direction V3
  71.         norm_position V3
  72.         ; we use a linked list to know which are the enabled lights
  73.         enabled dd ? ;int
  74.         next dd ? ;struct GLLight*
  75.         prev dd ? ;struct GLLight*
  76. ends
  77.  
  78. struct GLMaterial
  79.         emission V4
  80.         ambient  V4
  81.         diffuse  V4
  82.         specular V4
  83.         shininess dd ? ;float
  84.  
  85.         ; computed values
  86.         shininess_i dd ? ;int
  87.         do_specular dd ? ;int
  88. ends
  89.  
  90. struct GLViewport
  91.         xmin dd ? ;int
  92.         ymin dd ? ;int
  93.         xsize dd ? ;int
  94.         ysize dd ? ;int
  95.         scale V3
  96.         trans V3
  97.         updated dd ? ;int
  98. ends
  99.  
  100. offs_vpor_xmin   equ 0
  101. offs_vpor_ymin   equ 4
  102. offs_vpor_xsize  equ 8
  103. offs_vpor_ysize equ 12
  104. offs_vpor_scale equ 16
  105. offs_vpor_trans equ 28
  106. offs_vpor_updated equ 40
  107.  
  108. struct GLParamBuffer
  109.         ops rd OP_BUFFER_MAX_SIZE ;GLParam[OP_BUFFER_MAX_SIZE]
  110.         next dd ? ;struct GLParamBuffer*
  111. ends
  112.  
  113. offs_gpbu_ops equ 0
  114. offs_gpbu_next equ 4*OP_BUFFER_MAX_SIZE
  115.  
  116. struct GLList
  117.         first_op_buffer dd ? ;GLParamBuffer*
  118.         ; TODO: extensions for an hash table or a better allocating scheme
  119. ends
  120.  
  121. struct GLVertex
  122.         edge_flag dd ? ;int
  123.         normal V3
  124.         coord V4
  125.         tex_coord V4
  126.         color V4
  127.  
  128.         ; computed values
  129.         ec V4 ; eye coordinates
  130.         pc V4 ; coordinates in the normalized volume
  131.         clip_code dd ? ;int ; clip code
  132.         zp ZBufferPoint ; integer coordinates for the rasterization
  133. ends
  134.  
  135. struct GLImage
  136.         pixmap dd ? ;void*
  137.         xsize dd ? ;int
  138.         ysize dd ? ;int
  139.         xsize_log2 dd ? ;unsigned int
  140.         s_bound dd ? ;unsigned int
  141.         t_bound dd ? ;unsigned int
  142. ends
  143.  
  144. offs_imag_pixmap equ 0
  145. offs_imag_xsize equ 4
  146. offs_imag_ysize equ 8
  147. offs_imag_xsize_log2 equ 12
  148. offs_imag_s_bound equ 16
  149. offs_imag_t_bound equ 20
  150.  
  151. ; textures
  152.  
  153. TEXTURE_HASH_TABLE_SIZE equ 256 ;должно быть кратное 2, в коде берется остаток от деления (через and быстрее чем div)
  154.  
  155. struct GLTexture
  156.         images rb sizeof.GLImage * MAX_TEXTURE_LEVELS ;GLImage[MAX_TEXTURE_LEVELS]
  157.         handle dd ? ;int
  158.         next dd ? ;struct GLTexture*
  159.         prev dd ? ;struct GLTexture*
  160. ends
  161.  
  162. offs_text_images equ 0
  163. offs_text_handle equ sizeof.GLImage*MAX_TEXTURE_LEVELS
  164. offs_text_next equ 4+offs_text_handle
  165. offs_text_prev equ 8+offs_text_handle
  166.  
  167. ; shared state
  168.  
  169. struct GLSharedState
  170.         lists dd ? ;GLList**
  171.         texture_hash_table dd ? ;GLTexture**
  172. ends
  173.  
  174.  
  175. ; display context
  176.  
  177. struct GLContext
  178.         ; Z buffer
  179.         zb dd ? ;ZBuffer*
  180.  
  181.         ; lights
  182.         lights rb sizeof.GLLight * MAX_LIGHTS ;GLLight[MAX_LIGHTS]
  183.         first_light dd ? ;GLLight*
  184.         ambient_light_model V4
  185.         local_light_model dd ? ;int
  186.         lighting_enabled dd ? ;int
  187.         light_model_two_side dd ? ;int
  188.  
  189.         ; materials
  190.         materials rb sizeof.GLMaterial * 2 ;GLMaterial[2]
  191.         color_material_enabled dd ? ;int
  192.         current_color_material_mode dd ? ;int
  193.         current_color_material_type dd ? ;int
  194.  
  195.         ; textures
  196.         current_texture dd ? ;GLTexture*
  197.         texture_2d_enabled dd ? ;int
  198.  
  199.         ; shared state
  200.         shared_state GLSharedState
  201.  
  202.         ; current list
  203.         current_op_buffer dd ? ;GLParamBuffer*
  204.         current_op_buffer_index dd ? ;int
  205.         exec_flag dd ? ;int
  206.         compile_flag dd ? ;int
  207.         print_flag dd ? ;int
  208.  
  209.         ; matrix
  210.  
  211.         matrix_mode dd ? ;int режим активного вида матрицы (один из 3-х: GL_MODELVIEW, GL_PROJECTION, GL_TEXTURE)
  212.         matrix_stack rd 3 ;*M4[3] указатель на начало массива матриц
  213.         matrix_stack_ptr rd 3 ;*M4[3] указатель на активную матрицу из массива
  214.         matrix_stack_depth_max rd 3 ;int[3] максимальное число матриц в массивах matrix_stack
  215.  
  216.         matrix_model_view_inv M4
  217.         matrix_model_projection M4
  218.         matrix_model_projection_updated dd ? ;int
  219.         matrix_model_projection_no_w_transform dd ? ;int
  220.         apply_texture_matrix dd ? ;int
  221.  
  222.         ; viewport
  223.         viewport GLViewport
  224.  
  225.         ; current state
  226.         polygon_mode_back dd ? ;int
  227.         polygon_mode_front dd ? ;int
  228.  
  229.         current_front_face dd ? ;int
  230.         current_shade_model dd ? ;int
  231.         current_cull_face dd ? ;int
  232.         cull_face_enabled dd ? ;int
  233.         normalize_enabled dd ? ;int
  234.         draw_triangle_front dd ? ;gl_draw_triangle_func
  235.         draw_triangle_back  dd ? ;gl_draw_triangle_func
  236.  
  237.         ; selection
  238.         render_mode dd ? ;int
  239.         select_buffer dd ? ;unsigned int*
  240.         select_size dd ? ;int
  241.         select_ptr dd ? ;unsigned int*
  242.         select_hit dd ? ;unsigned int*
  243.         select_overflow dd ? ;int
  244.         select_hits dd ? ;int
  245.  
  246.         ; names
  247.         name_stack rd MAX_NAME_STACK_DEPTH ;unsigned int[MAX_NAME_STACK_DEPTH]
  248.         name_stack_size dd ? ;int
  249.  
  250.         ; clear
  251.         clear_depth dd ? ;float
  252.         clear_color V4
  253.  
  254.         ; current vertex state
  255.         current_color V4
  256.         longcurrent_color rd 3 ;unsigned int[3] ;precomputed integer color
  257.         current_normal V4
  258.         current_tex_coord V4
  259.         current_edge_flag dd ? ;int
  260.  
  261.         ; glBegin / glEnd
  262.         in_begin dd ? ;int
  263.         begin_type dd ? ;int
  264.         vertex_n dd ? ;int
  265.         vertex_cnt dd ? ;int
  266.         vertex_max dd ? ;int
  267.         vertex dd ? ;GLVertex*
  268.  
  269.         ; opengl 1.1 arrays
  270.         vertex_array dd ? ;float*
  271.         vertex_array_size dd ? ;int
  272.         vertex_array_stride dd ? ;int
  273.         normal_array dd ? ;float*
  274.         normal_array_stride dd ? ;int
  275.         color_array dd ? ;float*
  276.         color_array_size dd ? ;int
  277.         color_array_stride dd ? ;int
  278.         texcoord_array dd ? ;float*
  279.         texcoord_array_size dd ? ;int
  280.         texcoord_array_stride dd ? ;int
  281.         client_states dd ? ;int
  282.  
  283.         ; opengl 1.1 polygon offset
  284.         offset_factor dd ? ;float
  285.         offset_units dd ? ;float
  286.         offset_states dd ? ;int
  287.  
  288.         ; specular buffer. could probably be shared between contexts,
  289.         ; but that wouldn't be 100% thread safe
  290.         specbuf_first dd ? ;GLSpecBuf*
  291.         specbuf_used_counter dd ? ;int
  292.         specbuf_num_buffers dd ? ;int
  293.  
  294.         ; opaque structure for user's use
  295.         opaque dd ? ;void*
  296.         ; resize viewport function
  297.         gl_resize_viewport dd ? ;(struct GLContext *c,int *xsize,int *ysize)
  298.  
  299.         ; depth test
  300.         depth_test dd ? ;int
  301. ends
  302.  
  303. align 16
  304. gl_ctx dd ? ;extern GLContext*
  305.  
  306. align 16
  307. proc gl_get_context
  308.         mov eax,[gl_ctx]
  309.         ret
  310. endp
  311.  
  312. ; this clip epsilon is needed to avoid some rounding errors after
  313. ; several clipping stages
  314.  
  315. CLIP_EPSILON dd 1.0e-5
  316.  
  317. align 4
  318. proc gl_clipcode uses ebx, x:dword, y:dword, z:dword, w1:dword
  319.         xor ebx,ebx
  320.  
  321.         fld1
  322.         fadd dword[CLIP_EPSILON]
  323.         fmul dword[w1]
  324.  
  325.         fcom dword[x]
  326.         fstsw ax
  327.         sahf
  328.         ja @f
  329.                 or ebx,2
  330.         @@:
  331.         fcom dword[y]
  332.         fstsw ax
  333.         sahf
  334.         ja @f
  335.                 or ebx,8
  336.         @@:
  337.         fcom dword[z]
  338.         fstsw ax
  339.         sahf
  340.         ja @f
  341.                 or ebx,32
  342.         @@:
  343.  
  344.         fchs
  345.         fcom dword[x]
  346.         fstsw ax
  347.         sahf
  348.         jbe @f
  349.                 or ebx,1
  350.         @@:
  351.         fcom dword[y]
  352.         fstsw ax
  353.         sahf
  354.         jbe @f
  355.                 or ebx,4
  356.         @@:
  357.         fcom dword[z]
  358.         fstsw ax
  359.         sahf
  360.         jbe @f
  361.                 or ebx,16
  362.         @@:
  363.  
  364.         ffree st0
  365.         fincstp
  366.  
  367.         mov eax,ebx
  368.         ret
  369. endp
  370.  
  371. ;input:
  372. ; rf,gf,bf - значения float
  373. ; ri,gi,bi - адреса куда будут записаны rf,gf,bf преобразованые в int
  374. align 4
  375. proc RGBFtoRGBI uses eax, rf:dword,gf:dword,bf:dword, ri:dword,gi:dword,bi:dword
  376. locals
  377.         s dd ?
  378. endl
  379.         mov dword[s],(ZB_POINT_RED_MAX - ZB_POINT_RED_MIN)
  380.         fild dword[s]
  381.         fmul dword[rf]
  382.         mov eax,[ri]
  383.         fistp dword[eax]
  384.         add dword[eax],ZB_POINT_RED_MIN
  385.  
  386.         mov dword[s],(ZB_POINT_GREEN_MAX - ZB_POINT_GREEN_MIN)
  387.         fild dword[s]
  388.         fmul dword[gf]
  389.         mov eax,[gi]
  390.         fistp dword[eax]
  391.         add dword[eax],ZB_POINT_GREEN_MIN
  392.  
  393.         ;bi = (unsigned int) (bf * (ZB_POINT_BLUE_MAX - ZB_POINT_BLUE_MIN) + ZB_POINT_BLUE_MIN);
  394.         mov dword[s],(ZB_POINT_BLUE_MAX - ZB_POINT_BLUE_MIN)
  395.         fild dword[s]
  396.         fmul dword[bf]
  397.         mov eax,[bi]
  398.         fistp dword[eax]
  399.         add dword[eax],ZB_POINT_BLUE_MIN
  400.         ret
  401. endp
  402.