Rev 5353 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 5353 | Rev 5380 | ||
---|---|---|---|
Line 304... | Line 304... | ||
304 | stdcall gl_add_op,eax |
304 | stdcall gl_add_op,eax |
305 | ret |
305 | ret |
306 | endp |
306 | endp |
Line 307... | Line 307... | ||
307 | 307 | ||
308 | align 4 |
308 | align 4 |
309 | proc glopDrawElements uses eax ebx edx, context:dword, param:dword |
309 | proc glopDrawElements, context:dword, param:dword |
- | 310 | locals |
|
- | 311 | ii dd ? |
|
- | 312 | idx dd ? |
|
- | 313 | states dd ? |
|
- | 314 | type dd ? |
|
- | 315 | size dd ? |
|
310 | locals |
316 | indices dd ? ;указатель на 16 или 32 битные индексы |
311 | p rd 8 |
317 | p rd 8 |
312 | endl |
318 | endl |
313 | 319 | pushad |
|
314 | mov edx,[context] |
320 | mov edx,[context] |
315 | mov ebx,[param] |
- | |
316 | ;int i; |
- | |
317 | ;int idx; |
321 | mov ebx,[param] |
318 | ;int states = c->client_states; |
- | |
319 | ;int count = param[2].i; |
322 | mov eax,[edx+offs_cont_client_states] |
320 | ;int type = param[3].i; |
- | |
321 | ;unsigned int *indices_u32 = (unsigned int*)param[4].p; |
- | |
322 | ;unsigned short *indices_u16 = (unsigned short*)indices_u32; |
- | |
323 | 323 | mov [states],eax |
|
324 | mov eax,[ebx+4] |
324 | mov eax,[ebx+4] |
- | 325 | mov [p+4],eax ;p[1].i = param[1].i |
|
- | 326 | mov ecx,[ebx+8] ;count = param[2].i |
|
- | 327 | mov eax,[ebx+12] |
|
- | 328 | mov [type],eax ;type = param[3].i |
|
- | 329 | mov eax,[ebx+16] |
|
325 | mov [p+4],eax ;p[1].i = param[1].i |
330 | mov [indices],eax ;*indices = param[4].p |
326 | mov eax,ebp |
331 | mov eax,ebp |
327 | sub eax,32 ;=sizeof(dd)*8 |
332 | sub eax,32 ;=sizeof(dd)*8 |
Line -... | Line 333... | ||
- | 333 | stdcall glopBegin, edx,eax |
|
- | 334 | ||
328 | stdcall glopBegin, edx,eax |
335 | mov dword[ii],0 |
- | 336 | align 4 |
|
- | 337 | .cycle_0: ;for (int ii=0; ii |
|
- | 338 | cmp dword[ii],ecx |
|
329 | 339 | jge .cycle_0_end |
|
- | 340 | mov esi,[ii] |
|
- | 341 | cmp dword[type],GL_UNSIGNED_INT |
|
- | 342 | jne @f |
|
- | 343 | shl esi,2 |
|
- | 344 | add esi,[indices] |
|
- | 345 | mov esi,[esi] |
|
- | 346 | jmp .end_0 |
|
- | 347 | @@: |
|
- | 348 | shl esi,1 |
|
- | 349 | add esi,[indices] |
|
- | 350 | movzx esi,word[esi] |
|
- | 351 | .end_0: |
|
330 | ; for (int ii=0; ii |
352 | mov [idx],esi |
331 | ; idx = (type == GL_UNSIGNED_INT) ? indices_u32[ii] : indices_u16[ii]; |
353 | |
332 | ; if (states & COLOR_ARRAY) { |
354 | bt dword[states],1 ;2^1=COLOR_ARRAY |
- | 355 | jnc @f |
|
333 | ; GLParam p[5]; |
356 | mov esi,[edx+offs_cont_color_array_size] |
- | 357 | mov [size],esi |
|
- | 358 | add esi,[edx+offs_cont_color_array_stride] |
|
334 | ; int size = c->color_array_size; |
359 | imul esi,[idx] ;esi = i |
- | 360 | shl esi,2 |
|
- | 361 | add esi,[edx+offs_cont_color_array] ;esi = &context.color_array[i] |
|
- | 362 | mov edi,ebp |
|
335 | ; i = idx * (size + c->color_array_stride); |
363 | sub edi,28 ;edi = &p[1] |
- | 364 | mov ebx,[esi+8] |
|
336 | ; p[1].f = c->color_array[i]; |
365 | mov [edi],ebx ;p[1].f = context.color_array[i+2] |
- | 366 | mov ebx,[esi+4] |
|
337 | ; p[2].f = c->color_array[i+1]; |
367 | mov [edi+4],ebx ;p[2].f = context.color_array[i+1] |
- | 368 | mov ebx,[esi] |
|
338 | ; p[3].f = c->color_array[i+2]; |
369 | mov [edi+8],ebx ;p[3].f = context.color_array[i] |
- | 370 | add edi,12 |
|
- | 371 | cmp dword[size],3 |
|
- | 372 | jle .e1 |
|
- | 373 | add esi,12 |
|
- | 374 | movsd |
|
- | 375 | jmp .e2 |
|
- | 376 | .e1: |
|
- | 377 | mov dword[edi],1.0 ;если задано 3 параметра, то 4-й ставим по умолчанию 1.0 |
|
- | 378 | .e2: |
|
- | 379 | mov edi,ebp |
|
- | 380 | sub edi,32 ;edi = &p[0] |
|
- | 381 | mov ebx,ebp |
|
- | 382 | sub ebx,12 ;ebp-12 = &p[5] |
|
- | 383 | push ebx |
|
- | 384 | add ebx,4 ;ebp-8 = &p[6] |
|
- | 385 | push ebx |
|
- | 386 | add ebx,4 ;ebp-4 = &p[7] |
|
- | 387 | push ebx |
|
339 | ; p[4].f = size > 3 ? c->color_array[i+3] : 1.0f; |
388 | stdcall RGBFtoRGBI,[edi+12],[edi+8],[edi+4] ;call: r,g,b,&p[7],&p[6],&p[5] |
340 | ; glopColor(c, p); |
389 | stdcall glopColor, edx,edi ;(context, p(op,rf,gf,bf,af,ri,gi,bi)) |
- | 390 | @@: |
|
341 | ; } |
391 | bt dword[states],2 ;2^2=NORMAL_ARRAY |
- | 392 | jnc @f |
|
342 | ; if (states & NORMAL_ARRAY) { |
393 | mov esi,[edx+offs_cont_normal_array_stride] |
- | 394 | add esi,3 |
|
343 | ; i = idx * (3 + c->normal_array_stride); |
395 | imul esi,[idx] ;esi = idx * (3 + context.normal_array_stride) |
- | 396 | shl esi,2 |
|
- | 397 | add esi,[edx+offs_cont_normal_array] |
|
344 | ; c->current_normal.X = c->normal_array[i]; |
398 | mov edi,edx |
- | 399 | add edi,offs_cont_current_normal |
|
- | 400 | movsd ;context.current_normal.X = context.normal_array[i] |
|
345 | ; c->current_normal.Y = c->normal_array[i+1]; |
401 | movsd |
346 | ; c->current_normal.Z = c->normal_array[i+2]; |
402 | movsd |
347 | ; c->current_normal.W = 0.0f; |
403 | mov dword[edi],0.0 ;context.current_normal.W = 0.0f |
- | 404 | @@: |
|
348 | ; } |
405 | bt dword[states],3 ;2^3=TEXCOORD_ARRAY |
- | 406 | jnc @f |
|
349 | ; if (states & TEXCOORD_ARRAY) { |
407 | mov esi,[edx+offs_cont_texcoord_array_size] |
- | 408 | mov [size],esi |
|
- | 409 | add esi,[edx+offs_cont_texcoord_array_stride] |
|
350 | ; int size = c->texcoord_array_size; |
410 | imul esi,[idx] ;esi = i |
- | 411 | shl esi,2 |
|
351 | ; i = idx * (size + c->texcoord_array_stride); |
412 | add esi,[edx+offs_cont_texcoord_array] ;esi = &context.texcoord_array[i] |
352 | ; c->current_tex_coord.X = c->texcoord_array[i]; |
413 | mov edi,edx |
- | 414 | add edi,offs_cont_current_tex_coord |
|
- | 415 | movsd ;context.current_tex_coord.X = ccontext.texcoord_array[i] |
|
- | 416 | movsd |
|
- | 417 | cmp dword[size],2 |
|
- | 418 | jle .e3 |
|
- | 419 | movsd |
|
- | 420 | jmp .e4 |
|
- | 421 | .e3: |
|
- | 422 | mov dword[edi],0.0 ;если задано 2 параметра, то 3-й ставим по умолчанию 0.0 |
|
- | 423 | add edi,4 |
|
- | 424 | .e4: |
|
- | 425 | cmp dword[size],3 |
|
- | 426 | jle .e5 |
|
- | 427 | movsd |
|
353 | ; c->current_tex_coord.Y = c->texcoord_array[i+1]; |
428 | jmp @f |
354 | ; c->current_tex_coord.Z = size > 2 ? c->texcoord_array[i+2] : 0.0f; |
429 | .e5: |
355 | ; c->current_tex_coord.W = size > 3 ? c->texcoord_array[i+3] : 1.0f; |
430 | mov dword[edi],1.0 ;если задано 3 параметра, то 4-й ставим по умолчанию 1.0 |
356 | ; } |
431 | @@: |
357 | ; if (states & VERTEX_ARRAY) { |
432 | bt dword[states],0 ;2^0=VERTEX_ARRAY |
- | 433 | jnc @f |
|
358 | ; GLParam p[5]; |
434 | mov esi,[edx+offs_cont_vertex_array_size] |
- | 435 | mov [size],esi |
|
- | 436 | add esi,[edx+offs_cont_vertex_array_stride] |
|
359 | ; int size = c->vertex_array_size; |
437 | imul esi,[idx] ;esi = i |
- | 438 | shl esi,2 |
|
360 | ; i = idx * (size + c->vertex_array_stride); |
439 | add esi,[edx+offs_cont_vertex_array] ;esi = &context.vertex_array[i] |
361 | ; p[1].f = c->vertex_array[i]; |
440 | mov edi,ebp |
- | 441 | sub edi,28 ;edi = &p[1] |
|
- | 442 | movsd ;p[1].f = context.vertex_array[i] |
|
- | 443 | movsd |
|
- | 444 | cmp dword[size],2 |
|
- | 445 | jle .e6 |
|
- | 446 | movsd |
|
- | 447 | jmp .e7 |
|
- | 448 | .e6: |
|
362 | ; p[2].f = c->vertex_array[i+1]; |
449 | mov dword[edi],0.0 ;если задано 2 параметра, то 3-й ставим по умолчанию 0.0 |
- | 450 | add edi,4 |
|
- | 451 | jmp .e8 ;и 4-й тоже ставим по умолчанию |
|
- | 452 | .e7: |
|
- | 453 | cmp dword[size],3 |
|
- | 454 | jle .e8 |
|
- | 455 | movsd |
|
- | 456 | sub edi,20 ;edi=&p[0] |
|
- | 457 | jmp .e9 |
|
- | 458 | .e8: |
|
- | 459 | mov dword[edi],1.0 ;если задано 3 параметра, то 4-й ставим по умолчанию 1.0 |
|
363 | ; p[3].f = size > 2 ? c->vertex_array[i+2] : 0.0f; |
460 | sub edi,16 ;edi=&p[0] |
364 | ; p[4].f = size > 3 ? c->vertex_array[i+3] : 1.0f; |
461 | .e9: |
- | 462 | stdcall glopVertex, edx,edi |
|
- | 463 | @@: |
|
- | 464 | inc dword[ii] |
|
365 | ; glopVertex(c, p); |
465 | jmp .cycle_0 |
366 | ; } |
466 | .cycle_0_end: |
367 | ; } |
467 | |
368 | mov eax,ebp |
468 | mov eax,ebp |
- | 469 | sub eax,32 ;=sizeof(dd)*8 |
|
369 | sub eax,32 ;=sizeof(dd)*8 |
470 | stdcall glopEnd, edx,eax |
370 | stdcall glopEnd, edx,eax |
471 | popad |
Line 371... | Line 472... | ||
371 | ret |
472 | ret |
372 | endp |
473 | endp |