Rev 8063 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
5153 | IgorA | 1 | include 'opengl_const.inc' |
2 | include 'zbuffer.inc' |
||
3 | include 'zmath.inc' |
||
4 | |||
6017 | IgorA | 5 | offs_X equ 0 |
6 | offs_Y equ 4 |
||
7 | offs_Z equ 8 |
||
8 | offs_W equ 12 |
||
5153 | IgorA | 9 | |
10 | ;enum { OP_ ## a , ... } |
||
5175 | IgorA | 11 | sum1 equ 0 |
5153 | IgorA | 12 | macro ADD_OP a,b,c |
13 | { |
||
5175 | IgorA | 14 | OP_#a equ sum1 |
15 | sum1 equ (sum1+1) |
||
5153 | IgorA | 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 |
||
6108 | IgorA | 34 | MAX_NAME_STACK_DEPTH equ 64 |
35 | MAX_TEXTURE_LEVELS equ 11 |
||
36 | MAX_LIGHTS equ 16 |
||
5153 | IgorA | 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 | |||
5256 | IgorA | 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 | |||
5153 | IgorA | 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 | struct GLParamBuffer |
||
101 | ops rd OP_BUFFER_MAX_SIZE ;GLParam[OP_BUFFER_MAX_SIZE] |
||
102 | next dd ? ;struct GLParamBuffer* |
||
103 | ends |
||
104 | |||
5171 | IgorA | 105 | offs_gpbu_ops equ 0 |
106 | offs_gpbu_next equ 4*OP_BUFFER_MAX_SIZE |
||
107 | |||
5153 | IgorA | 108 | struct GLList |
109 | first_op_buffer dd ? ;GLParamBuffer* |
||
5171 | IgorA | 110 | ; TODO: extensions for an hash table or a better allocating scheme |
5153 | IgorA | 111 | ends |
112 | |||
113 | struct GLVertex |
||
114 | edge_flag dd ? ;int |
||
115 | normal V3 |
||
116 | coord V4 |
||
117 | tex_coord V4 |
||
118 | color V4 |
||
119 | |||
120 | ; computed values |
||
121 | ec V4 ; eye coordinates |
||
122 | pc V4 ; coordinates in the normalized volume |
||
123 | clip_code dd ? ;int ; clip code |
||
124 | zp ZBufferPoint ; integer coordinates for the rasterization |
||
125 | ends |
||
126 | |||
127 | struct GLImage |
||
128 | pixmap dd ? ;void* |
||
129 | xsize dd ? ;int |
||
130 | ysize dd ? ;int |
||
6243 | IgorA | 131 | xsize_log2 dd ? ;unsigned int |
132 | s_bound dd ? ;unsigned int |
||
133 | t_bound dd ? ;unsigned int |
||
5153 | IgorA | 134 | ends |
135 | |||
136 | offs_imag_pixmap equ 0 |
||
6108 | IgorA | 137 | offs_imag_xsize equ 4 |
138 | offs_imag_ysize equ 8 |
||
6243 | IgorA | 139 | offs_imag_xsize_log2 equ 12 |
140 | offs_imag_s_bound equ 16 |
||
141 | offs_imag_t_bound equ 20 |
||
5153 | IgorA | 142 | |
143 | ; textures |
||
144 | |||
145 | TEXTURE_HASH_TABLE_SIZE equ 256 ;должно быть кратное 2, в коде берется остаток от деления (через and быстрее чем div) |
||
146 | |||
147 | struct GLTexture |
||
148 | images rb sizeof.GLImage * MAX_TEXTURE_LEVELS ;GLImage[MAX_TEXTURE_LEVELS] |
||
149 | handle dd ? ;int |
||
150 | next dd ? ;struct GLTexture* |
||
151 | prev dd ? ;struct GLTexture* |
||
152 | ends |
||
153 | |||
154 | offs_text_images equ 0 |
||
155 | offs_text_handle equ sizeof.GLImage*MAX_TEXTURE_LEVELS |
||
156 | offs_text_next equ 4+offs_text_handle |
||
157 | offs_text_prev equ 8+offs_text_handle |
||
158 | |||
159 | ; shared state |
||
160 | |||
161 | struct GLSharedState |
||
162 | lists dd ? ;GLList** |
||
163 | texture_hash_table dd ? ;GLTexture** |
||
164 | ends |
||
165 | |||
166 | |||
167 | ; display context |
||
168 | |||
169 | struct GLContext |
||
170 | ; Z buffer |
||
171 | zb dd ? ;ZBuffer* |
||
172 | |||
173 | ; lights |
||
174 | lights rb sizeof.GLLight * MAX_LIGHTS ;GLLight[MAX_LIGHTS] |
||
175 | first_light dd ? ;GLLight* |
||
176 | ambient_light_model V4 |
||
177 | local_light_model dd ? ;int |
||
178 | lighting_enabled dd ? ;int |
||
179 | light_model_two_side dd ? ;int |
||
180 | |||
181 | ; materials |
||
182 | materials rb sizeof.GLMaterial * 2 ;GLMaterial[2] |
||
183 | color_material_enabled dd ? ;int |
||
184 | current_color_material_mode dd ? ;int |
||
185 | current_color_material_type dd ? ;int |
||
186 | |||
187 | ; textures |
||
188 | current_texture dd ? ;GLTexture* |
||
189 | texture_2d_enabled dd ? ;int |
||
190 | |||
191 | ; shared state |
||
192 | shared_state GLSharedState |
||
193 | |||
194 | ; current list |
||
195 | current_op_buffer dd ? ;GLParamBuffer* |
||
196 | current_op_buffer_index dd ? ;int |
||
197 | exec_flag dd ? ;int |
||
198 | compile_flag dd ? ;int |
||
199 | print_flag dd ? ;int |
||
200 | |||
201 | ; matrix |
||
202 | |||
203 | matrix_mode dd ? ;int режим активного вида матрицы (один из 3-х: GL_MODELVIEW, GL_PROJECTION, GL_TEXTURE) |
||
204 | matrix_stack rd 3 ;*M4[3] указатель на начало массива матриц |
||
205 | matrix_stack_ptr rd 3 ;*M4[3] указатель на активную матрицу из массива |
||
206 | matrix_stack_depth_max rd 3 ;int[3] максимальное число матриц в массивах matrix_stack |
||
207 | |||
208 | matrix_model_view_inv M4 |
||
209 | matrix_model_projection M4 |
||
210 | matrix_model_projection_updated dd ? ;int |
||
211 | matrix_model_projection_no_w_transform dd ? ;int |
||
212 | apply_texture_matrix dd ? ;int |
||
213 | |||
214 | ; viewport |
||
215 | viewport GLViewport |
||
216 | |||
217 | ; current state |
||
218 | polygon_mode_back dd ? ;int |
||
219 | polygon_mode_front dd ? ;int |
||
220 | |||
221 | current_front_face dd ? ;int |
||
222 | current_shade_model dd ? ;int |
||
223 | current_cull_face dd ? ;int |
||
224 | cull_face_enabled dd ? ;int |
||
225 | normalize_enabled dd ? ;int |
||
226 | draw_triangle_front dd ? ;gl_draw_triangle_func |
||
227 | draw_triangle_back dd ? ;gl_draw_triangle_func |
||
228 | |||
229 | ; selection |
||
230 | render_mode dd ? ;int |
||
231 | select_buffer dd ? ;unsigned int* |
||
232 | select_size dd ? ;int |
||
233 | select_ptr dd ? ;unsigned int* |
||
234 | select_hit dd ? ;unsigned int* |
||
235 | select_overflow dd ? ;int |
||
236 | select_hits dd ? ;int |
||
237 | |||
238 | ; names |
||
239 | name_stack rd MAX_NAME_STACK_DEPTH ;unsigned int[MAX_NAME_STACK_DEPTH] |
||
240 | name_stack_size dd ? ;int |
||
241 | |||
242 | ; clear |
||
243 | clear_depth dd ? ;float |
||
244 | clear_color V4 |
||
245 | |||
246 | ; current vertex state |
||
247 | current_color V4 |
||
248 | longcurrent_color rd 3 ;unsigned int[3] ;precomputed integer color |
||
249 | current_normal V4 |
||
250 | current_tex_coord V4 |
||
251 | current_edge_flag dd ? ;int |
||
252 | |||
253 | ; glBegin / glEnd |
||
254 | in_begin dd ? ;int |
||
255 | begin_type dd ? ;int |
||
256 | vertex_n dd ? ;int |
||
257 | vertex_cnt dd ? ;int |
||
258 | vertex_max dd ? ;int |
||
259 | vertex dd ? ;GLVertex* |
||
260 | |||
261 | ; opengl 1.1 arrays |
||
262 | vertex_array dd ? ;float* |
||
263 | vertex_array_size dd ? ;int |
||
264 | vertex_array_stride dd ? ;int |
||
265 | normal_array dd ? ;float* |
||
266 | normal_array_stride dd ? ;int |
||
267 | color_array dd ? ;float* |
||
268 | color_array_size dd ? ;int |
||
269 | color_array_stride dd ? ;int |
||
270 | texcoord_array dd ? ;float* |
||
271 | texcoord_array_size dd ? ;int |
||
272 | texcoord_array_stride dd ? ;int |
||
273 | client_states dd ? ;int |
||
274 | |||
275 | ; opengl 1.1 polygon offset |
||
276 | offset_factor dd ? ;float |
||
277 | offset_units dd ? ;float |
||
278 | offset_states dd ? ;int |
||
279 | |||
280 | ; specular buffer. could probably be shared between contexts, |
||
281 | ; but that wouldn't be 100% thread safe |
||
282 | specbuf_first dd ? ;GLSpecBuf* |
||
283 | specbuf_used_counter dd ? ;int |
||
284 | specbuf_num_buffers dd ? ;int |
||
285 | |||
286 | ; opaque structure for user's use |
||
287 | opaque dd ? ;void* |
||
288 | ; resize viewport function |
||
289 | gl_resize_viewport dd ? ;(struct GLContext *c,int *xsize,int *ysize) |
||
290 | |||
291 | ; depth test |
||
292 | depth_test dd ? ;int |
||
293 | ends |
||
294 | |||
295 | align 16 |
||
296 | gl_ctx dd ? ;extern GLContext* |
||
297 | |||
298 | align 16 |
||
299 | proc gl_get_context |
||
300 | mov eax,[gl_ctx] |
||
301 | ret |
||
302 | endp |
||
303 | |||
304 | ; this clip epsilon is needed to avoid some rounding errors after |
||
305 | ; several clipping stages |
||
306 | |||
307 | CLIP_EPSILON dd 1.0e-5 |
||
308 | |||
309 | align 4 |
||
310 | proc gl_clipcode uses ebx, x:dword, y:dword, z:dword, w1:dword |
||
311 | xor ebx,ebx |
||
312 | |||
313 | fld1 |
||
314 | fadd dword[CLIP_EPSILON] |
||
315 | fmul dword[w1] |
||
316 | |||
317 | fcom dword[x] |
||
318 | fstsw ax |
||
319 | sahf |
||
320 | ja @f |
||
321 | or ebx,2 |
||
322 | @@: |
||
323 | fcom dword[y] |
||
324 | fstsw ax |
||
325 | sahf |
||
326 | ja @f |
||
327 | or ebx,8 |
||
328 | @@: |
||
329 | fcom dword[z] |
||
330 | fstsw ax |
||
331 | sahf |
||
332 | ja @f |
||
333 | or ebx,32 |
||
334 | @@: |
||
335 | |||
336 | fchs |
||
337 | fcom dword[x] |
||
338 | fstsw ax |
||
339 | sahf |
||
340 | jbe @f |
||
341 | or ebx,1 |
||
342 | @@: |
||
343 | fcom dword[y] |
||
344 | fstsw ax |
||
345 | sahf |
||
346 | jbe @f |
||
347 | or ebx,4 |
||
348 | @@: |
||
349 | fcom dword[z] |
||
350 | fstsw ax |
||
351 | sahf |
||
352 | jbe @f |
||
353 | or ebx,16 |
||
354 | @@: |
||
355 | |||
5208 | IgorA | 356 | ffree st0 |
357 | fincstp |
||
358 | |||
5153 | IgorA | 359 | mov eax,ebx |
360 | ret |
||
361 | endp |
||
362 | |||
363 | ;input: |
||
364 | ; rf,gf,bf - значения float |
||
365 | ; ri,gi,bi - адреса куда будут записаны rf,gf,bf преобразованые в int |
||
366 | align 4 |
||
367 | proc RGBFtoRGBI uses eax, rf:dword,gf:dword,bf:dword, ri:dword,gi:dword,bi:dword |
||
368 | locals |
||
369 | s dd ? |
||
370 | endl |
||
371 | mov dword[s],(ZB_POINT_RED_MAX - ZB_POINT_RED_MIN) |
||
372 | fild dword[s] |
||
373 | fmul dword[rf] |
||
374 | mov eax,[ri] |
||
375 | fistp dword[eax] |
||
376 | add dword[eax],ZB_POINT_RED_MIN |
||
377 | |||
378 | mov dword[s],(ZB_POINT_GREEN_MAX - ZB_POINT_GREEN_MIN) |
||
379 | fild dword[s] |
||
380 | fmul dword[gf] |
||
381 | mov eax,[gi] |
||
382 | fistp dword[eax] |
||
383 | add dword[eax],ZB_POINT_GREEN_MIN |
||
384 | |||
385 | ;bi = (unsigned int) (bf * (ZB_POINT_BLUE_MAX - ZB_POINT_BLUE_MIN) + ZB_POINT_BLUE_MIN); |
||
386 | mov dword[s],(ZB_POINT_BLUE_MAX - ZB_POINT_BLUE_MIN) |
||
387 | fild dword[s] |
||
388 | fmul dword[bf] |
||
389 | mov eax,[bi] |
||
390 | fistp dword[eax] |
||
391 | add dword[eax],ZB_POINT_BLUE_MIN |
||
392 | ret |
||
393 | endp |