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) --------------------------------------------------------