Mercurial > mm7
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 { |