Mercurial > mm7
diff Render.cpp @ 2245:8817c398b792
for RasterLine2D
author | Ritor1 |
---|---|
date | Tue, 25 Feb 2014 20:02:06 +0600 |
parents | 5944810e88e2 |
children | 47bcb700b74b aff7a7b072b7 |
line wrap: on
line diff
--- a/Render.cpp Mon Feb 24 16:54:21 2014 +0600 +++ b/Render.cpp Tue Feb 25 20:02:06 2014 +0600 @@ -3567,64 +3567,73 @@ int v30; // ebx@60 int v31; // edx@61 int v32; // edi@61 - __int64 v36; // [sp+14h] [bp-8h]@1 signed int upper_bound; // [sp+18h] [bp-4h]@28 unsigned int uXa; // [sp+24h] [bp+8h]@49 int uYb; // [sp+28h] [bp+Ch]@47 - - v36 = 0i64; + bool left_border_x = false; + bool right_border_x = false; + bool left_border_z = false; + bool right_border_z = false; + bool upper_border_y = false; + bool bottom_border_y = false; + bool upper_border_w = false; + bool bottom_border_w = false; + if ( uX < this->raster_clip_x )// x выходит за рамки левой границы - HIDWORD(v36) = 8; //left_border = true; + left_border_x = true; if ( uX > this->raster_clip_z )// x выходит за рамки правой границы - HIDWORD(v36) |= 4;//right_border = true; + right_border_x = true; if ( uZ < this->raster_clip_x )// z выходит за рамки левой границы - LODWORD(v36) = 8;// + left_border_z = true; if ( uZ > this->raster_clip_z )// z выходит за рамки правой границы - LODWORD(v36) |= 4; + right_border_z = true; if ( uY < this->raster_clip_y )// y выходит за рамки верхней границы - HIDWORD(v36) |= 2;//upper_border = true; + upper_border_y = true; if ( uY > this->raster_clip_w )// y выходит за рамки нижней границы - HIDWORD(v36) |= 1;//bottom_border = true; + bottom_border_y = true; if ( uW < this->raster_clip_y )// w выходит за рамки верхней границы - LODWORD(v36) |= 2; + upper_border_w = true; if ( uW > this->raster_clip_w )// w выходит за рамки нижней границы - LODWORD(v36) |= 1; - - //LOBYTE(v12) = v36; - if ( (unsigned int)v36 & HIDWORD(v36) ) + bottom_border_w = true; + + if ( (left_border_x && left_border_z) || (right_border_x && right_border_z ) + || (upper_border_y && upper_border_w) || (bottom_border_y && bottom_border_w)) return; - if ( v36 ) //не полностью в рамках - { - if ( (BYTE4(v36) ^ (unsigned __int8)v36) & 8 )//for left and right(левая и правая) - { - if ( BYTE4(v36) & 8 )//left_border = true; - { - uY += ((uW - uY) * (this->raster_clip_x - uX)) / (uZ - uX); + if ( left_border_x || left_border_z || right_border_x || right_border_z + || upper_border_y || upper_border_w || bottom_border_y || bottom_border_w) + { + if ( left_border_x || left_border_z )//if ( (BYTE4(v36) ^ (unsigned __int8)v36) & 8 )//for left (левая граница) + { + if ( left_border_x )//left_border = true; х меньше левой границы + { + uY += (uW - uY) * ((this->raster_clip_x - uX) / (uZ - uX));//t = near_clip - v0.x / v1.x - v0.x (формула получения точки пересечения отрезка с плоскостью) uX = this->raster_clip_x; } - else + else if ( left_border_z )//z меньше левой границы { uZ = this->raster_clip_x; - uW += ((uY - uW) * (this->raster_clip_x - uZ)) / (uX - uZ); - } - } - if ( (BYTE4(v36) ^ (unsigned __int8)v36) & 4 ) - { - if ( BYTE4(v36) & 4 ) //right_border = true - { - uY += ((uW - uY) * (this->raster_clip_z - uX)) / (uZ - uX); + uW += (uY - uW) * ((this->raster_clip_x - uZ) / (uX - uZ)); + } + } + + if ( right_border_x || right_border_z )//if ( (BYTE4(v36) ^ (unsigned __int8)v36) & 4 )//for right (правая граница) + { + if ( right_border_x ) //right_border = true; х больше правой границы + { + uY += (uY - uW) * ((this->raster_clip_z - uX) / (uZ - uX)); uX = this->raster_clip_z; } - else - { - uW += ((uY - uW) * (this->raster_clip_z - uZ)) / (uX - uZ); + else if ( right_border_z )//z больше правой границы + { + uW += (uW - uY) * ((this->raster_clip_z - uZ) / (uX - uZ)); uZ = this->raster_clip_z; } } + upper_bound = 0; if ( uY < this->raster_clip_y ) upper_bound = 2; @@ -3644,12 +3653,12 @@ { if ( upper_bound & 2 ) { - uX += ((uZ - uX) * (this->raster_clip_y - uY)) / (uW - uY); + uX += (uZ - uX) * ((this->raster_clip_y - uY) / (uW - uY)); uY = this->raster_clip_y; } else { - uZ += (uX - uZ) * (this->raster_clip_y - uW) / (uY - uW); + uZ += (uX - uZ) * ((this->raster_clip_y - uW) / (uY - uW)); uW = this->raster_clip_y; } } @@ -3657,12 +3666,12 @@ { if ( upper_bound & 1 ) { - uX += ((uZ - uX) * (this->raster_clip_w - uY)) / (uW - uY); + uX += (uZ - uX) * ((this->raster_clip_w - uY) / (uW - uY)); uY = this->raster_clip_w; } else { - uZ += ((uX - uZ) * (this->raster_clip_w - uW)) / (uY - uW); + uZ += (uX - uZ) * ((this->raster_clip_w - uW) / (uY - uW)); uW = this->raster_clip_w; } } @@ -3766,7 +3775,7 @@ //----- (004A0E80) -------------------------------------------------------- void Render::ClearZBuffer(int a2, int a3) { - memset32(this->pActiveZBuffer, -65536, 0x4B000u); + memset32(this->pActiveZBuffer, -65536, 0x4B000); } //----- (004A0E97) --------------------------------------------------------