comparison Render.cpp @ 2245:8817c398b792

for RasterLine2D
author Ritor1
date Tue, 25 Feb 2014 20:02:06 +0600
parents 5944810e88e2
children 47bcb700b74b aff7a7b072b7
comparison
equal deleted inserted replaced
2244:66c509997062 2245:8817c398b792
3565 int v28; // edi@55 3565 int v28; // edi@55
3566 int v29; // edx@55 3566 int v29; // edx@55
3567 int v30; // ebx@60 3567 int v30; // ebx@60
3568 int v31; // edx@61 3568 int v31; // edx@61
3569 int v32; // edi@61 3569 int v32; // edi@61
3570 __int64 v36; // [sp+14h] [bp-8h]@1
3571 signed int upper_bound; // [sp+18h] [bp-4h]@28 3570 signed int upper_bound; // [sp+18h] [bp-4h]@28
3572 unsigned int uXa; // [sp+24h] [bp+8h]@49 3571 unsigned int uXa; // [sp+24h] [bp+8h]@49
3573 int uYb; // [sp+28h] [bp+Ch]@47 3572 int uYb; // [sp+28h] [bp+Ch]@47
3574 3573 bool left_border_x = false;
3575 v36 = 0i64; 3574 bool right_border_x = false;
3575 bool left_border_z = false;
3576 bool right_border_z = false;
3577 bool upper_border_y = false;
3578 bool bottom_border_y = false;
3579 bool upper_border_w = false;
3580 bool bottom_border_w = false;
3581
3576 if ( uX < this->raster_clip_x )// x выходит за рамки левой границы 3582 if ( uX < this->raster_clip_x )// x выходит за рамки левой границы
3577 HIDWORD(v36) = 8; //left_border = true; 3583 left_border_x = true;
3578 if ( uX > this->raster_clip_z )// x выходит за рамки правой границы 3584 if ( uX > this->raster_clip_z )// x выходит за рамки правой границы
3579 HIDWORD(v36) |= 4;//right_border = true; 3585 right_border_x = true;
3580 3586
3581 if ( uZ < this->raster_clip_x )// z выходит за рамки левой границы 3587 if ( uZ < this->raster_clip_x )// z выходит за рамки левой границы
3582 LODWORD(v36) = 8;// 3588 left_border_z = true;
3583 if ( uZ > this->raster_clip_z )// z выходит за рамки правой границы 3589 if ( uZ > this->raster_clip_z )// z выходит за рамки правой границы
3584 LODWORD(v36) |= 4; 3590 right_border_z = true;
3585 3591
3586 if ( uY < this->raster_clip_y )// y выходит за рамки верхней границы 3592 if ( uY < this->raster_clip_y )// y выходит за рамки верхней границы
3587 HIDWORD(v36) |= 2;//upper_border = true; 3593 upper_border_y = true;
3588 if ( uY > this->raster_clip_w )// y выходит за рамки нижней границы 3594 if ( uY > this->raster_clip_w )// y выходит за рамки нижней границы
3589 HIDWORD(v36) |= 1;//bottom_border = true; 3595 bottom_border_y = true;
3590 3596
3591 if ( uW < this->raster_clip_y )// w выходит за рамки верхней границы 3597 if ( uW < this->raster_clip_y )// w выходит за рамки верхней границы
3592 LODWORD(v36) |= 2; 3598 upper_border_w = true;
3593 if ( uW > this->raster_clip_w )// w выходит за рамки нижней границы 3599 if ( uW > this->raster_clip_w )// w выходит за рамки нижней границы
3594 LODWORD(v36) |= 1; 3600 bottom_border_w = true;
3595 3601
3596 //LOBYTE(v12) = v36; 3602 if ( (left_border_x && left_border_z) || (right_border_x && right_border_z )
3597 if ( (unsigned int)v36 & HIDWORD(v36) ) 3603 || (upper_border_y && upper_border_w) || (bottom_border_y && bottom_border_w))
3598 return; 3604 return;
3599 3605
3600 if ( v36 ) //не полностью в рамках 3606 if ( left_border_x || left_border_z || right_border_x || right_border_z
3601 { 3607 || upper_border_y || upper_border_w || bottom_border_y || bottom_border_w)
3602 if ( (BYTE4(v36) ^ (unsigned __int8)v36) & 8 )//for left and right(левая и правая) 3608 {
3603 { 3609 if ( left_border_x || left_border_z )//if ( (BYTE4(v36) ^ (unsigned __int8)v36) & 8 )//for left (левая граница)
3604 if ( BYTE4(v36) & 8 )//left_border = true; 3610 {
3605 { 3611 if ( left_border_x )//left_border = true; х меньше левой границы
3606 uY += ((uW - uY) * (this->raster_clip_x - uX)) / (uZ - uX); 3612 {
3613 uY += (uW - uY) * ((this->raster_clip_x - uX) / (uZ - uX));//t = near_clip - v0.x / v1.x - v0.x (формула получения точки пересечения отрезка с плоскостью)
3607 uX = this->raster_clip_x; 3614 uX = this->raster_clip_x;
3608 } 3615 }
3609 else 3616 else if ( left_border_z )//z меньше левой границы
3610 { 3617 {
3611 uZ = this->raster_clip_x; 3618 uZ = this->raster_clip_x;
3612 uW += ((uY - uW) * (this->raster_clip_x - uZ)) / (uX - uZ); 3619 uW += (uY - uW) * ((this->raster_clip_x - uZ) / (uX - uZ));
3613 } 3620 }
3614 } 3621 }
3615 if ( (BYTE4(v36) ^ (unsigned __int8)v36) & 4 ) 3622
3616 { 3623 if ( right_border_x || right_border_z )//if ( (BYTE4(v36) ^ (unsigned __int8)v36) & 4 )//for right (правая граница)
3617 if ( BYTE4(v36) & 4 ) //right_border = true 3624 {
3618 { 3625 if ( right_border_x ) //right_border = true; х больше правой границы
3619 uY += ((uW - uY) * (this->raster_clip_z - uX)) / (uZ - uX); 3626 {
3627 uY += (uY - uW) * ((this->raster_clip_z - uX) / (uZ - uX));
3620 uX = this->raster_clip_z; 3628 uX = this->raster_clip_z;
3621 } 3629 }
3622 else 3630 else if ( right_border_z )//z больше правой границы
3623 { 3631 {
3624 uW += ((uY - uW) * (this->raster_clip_z - uZ)) / (uX - uZ); 3632 uW += (uW - uY) * ((this->raster_clip_z - uZ) / (uX - uZ));
3625 uZ = this->raster_clip_z; 3633 uZ = this->raster_clip_z;
3626 } 3634 }
3627 } 3635 }
3636
3628 upper_bound = 0; 3637 upper_bound = 0;
3629 if ( uY < this->raster_clip_y ) 3638 if ( uY < this->raster_clip_y )
3630 upper_bound = 2; 3639 upper_bound = 2;
3631 if ( uY > this->raster_clip_w ) 3640 if ( uY > this->raster_clip_w )
3632 upper_bound |= 1; 3641 upper_bound |= 1;
3642 lower_bound ^= upper_bound; 3651 lower_bound ^= upper_bound;
3643 if ( lower_bound & 2 ) 3652 if ( lower_bound & 2 )
3644 { 3653 {
3645 if ( upper_bound & 2 ) 3654 if ( upper_bound & 2 )
3646 { 3655 {
3647 uX += ((uZ - uX) * (this->raster_clip_y - uY)) / (uW - uY); 3656 uX += (uZ - uX) * ((this->raster_clip_y - uY) / (uW - uY));
3648 uY = this->raster_clip_y; 3657 uY = this->raster_clip_y;
3649 } 3658 }
3650 else 3659 else
3651 { 3660 {
3652 uZ += (uX - uZ) * (this->raster_clip_y - uW) / (uY - uW); 3661 uZ += (uX - uZ) * ((this->raster_clip_y - uW) / (uY - uW));
3653 uW = this->raster_clip_y; 3662 uW = this->raster_clip_y;
3654 } 3663 }
3655 } 3664 }
3656 if ( lower_bound & 1 ) 3665 if ( lower_bound & 1 )
3657 { 3666 {
3658 if ( upper_bound & 1 ) 3667 if ( upper_bound & 1 )
3659 { 3668 {
3660 uX += ((uZ - uX) * (this->raster_clip_w - uY)) / (uW - uY); 3669 uX += (uZ - uX) * ((this->raster_clip_w - uY) / (uW - uY));
3661 uY = this->raster_clip_w; 3670 uY = this->raster_clip_w;
3662 } 3671 }
3663 else 3672 else
3664 { 3673 {
3665 uZ += ((uX - uZ) * (this->raster_clip_w - uW)) / (uY - uW); 3674 uZ += (uX - uZ) * ((this->raster_clip_w - uW) / (uY - uW));
3666 uW = this->raster_clip_w; 3675 uW = this->raster_clip_w;
3667 } 3676 }
3668 } 3677 }
3669 } 3678 }
3670 } 3679 }
3764 } 3773 }
3765 3774
3766 //----- (004A0E80) -------------------------------------------------------- 3775 //----- (004A0E80) --------------------------------------------------------
3767 void Render::ClearZBuffer(int a2, int a3) 3776 void Render::ClearZBuffer(int a2, int a3)
3768 { 3777 {
3769 memset32(this->pActiveZBuffer, -65536, 0x4B000u); 3778 memset32(this->pActiveZBuffer, -65536, 0x4B000);
3770 } 3779 }
3771 3780
3772 //----- (004A0E97) -------------------------------------------------------- 3781 //----- (004A0E97) --------------------------------------------------------
3773 void Render::SetRasterClipRect(unsigned int uX, unsigned int uY, unsigned int uZ, unsigned int uW) 3782 void Render::SetRasterClipRect(unsigned int uX, unsigned int uY, unsigned int uZ, unsigned int uW)
3774 { 3783 {