changeset 1322:65d301bce717

some vis clean
author Gloval
date Mon, 01 Jul 2013 00:00:49 +0400
parents cc8d58f2bf0c
children bfde0563ecdc 8433de6fd7d0
files Vis.cpp Vis.h
diffstat 2 files changed, 145 insertions(+), 148 deletions(-) [+]
line wrap: on
line diff
--- a/Vis.cpp	Fri Jun 28 16:51:01 2013 +0600
+++ b/Vis.cpp	Mon Jul 01 00:00:49 2013 +0400
@@ -133,7 +133,8 @@
     {
       if (v13 == -1)
         v13 = i;
-      else  if ((unsigned int)pBillboardRenderList[billboard->uParentBillboardID].sZValue < pBillboardRenderList[pRenderer->pBillboardRenderListD3D[v13].uParentBillboardID].sZValue)
+      else  if ((unsigned int)pBillboardRenderList[billboard->uParentBillboardID].sZValue < 
+                  pBillboardRenderList[pRenderer->pBillboardRenderListD3D[v13].uParentBillboardID].sZValue)
         v13 = i;
     }
   }
@@ -421,9 +422,9 @@
   
   v8.object_type = VisObjectType_Sprite;
   v8.object_id = object_id;
-  v8.field_8 = a6;
-  v8.field_C = a5;
-  v8.field_10 = a4;
+  v8.at_ai_state = a6;
+  v8.no_at_ai_state = a5;
+  v8.select_flags = a4;
   Vis_static_sub_4C1944_stru_F8BDE8.uNumPointers = 0;
   PickBillboards_Keyboard(pick_depth, &Vis_static_sub_4C1944_stru_F8BDE8, &v8);
   Vis_static_sub_4C1944_stru_F8BDE8.create_object_pointers(Vis_SelectionList::Unique);
@@ -731,7 +732,9 @@
 }
 
 //----- (004C1EE5) --------------------------------------------------------
-void Vis::BLV_CreateIntersectFacesVertexCoordList(int *a, int *b, __int16 *intersect_face_vertex_coords_list_a, __int16 *intersect_face_vertex_coords_list_b, Vec3_short_ *IntersectPoint, BLVFace *pFace)
+void Vis::BLV_CreateIntersectFacesVertexCoordList(int *a, int *b, __int16 *intersect_face_vertex_coords_list_a,
+                                                                  __int16 *intersect_face_vertex_coords_list_b, 
+                                                                  Vec3_short_ *IntersectPoint, BLVFace *pFace)
 {
   if (pFace->uAttributes & FACE_XY_PLANE)
   {
@@ -779,7 +782,9 @@
 }
 
 //----- (004C2186) --------------------------------------------------------
-void Vis::ODM_CreateIntersectFacesVertexCoordList(int *a, int *b, __int16 *intersect_face_vertex_coords_list_a, __int16 *intersect_face_vertex_coords_list_b, Vec3_short_ *IntersectPoint, BLVFace *pFace, unsigned int uModelID)
+void Vis::ODM_CreateIntersectFacesVertexCoordList(int *a, int *b, __int16 *intersect_face_vertex_coords_list_a, 
+                                                                  __int16 *intersect_face_vertex_coords_list_b, 
+                                                                    Vec3_short_ *IntersectPoint, BLVFace *pFace, unsigned int uModelID)
 {
   if (pFace->uAttributes & FACE_XY_PLANE)
   {
@@ -894,8 +899,8 @@
   v11[1].vWorldPosition.y = (double)pIndoorCamera->pos.y;
   v11[1].vWorldPosition.z = (double)pIndoorCamera->pos.z;
 
-  memcpy(pRay, &v11[1], 0x30u);
-  memcpy(&pRay[1], v11, sizeof(pRay[1]));
+  memcpy(pRay, &v11[1], sizeof(RenderVertexSoft));
+  memcpy(&pRay[1], &v11[0], sizeof(RenderVertexSoft));
 }
 
 //----- (004C2551) --------------------------------------------------------
@@ -915,7 +920,7 @@
         return &this->object_pool[i];
     }
   }
-  return false;
+  return nullptr;
   /*v4 = 0;
   if ( this->uNumPointers <= 0 )
     return false;
@@ -973,58 +978,62 @@
 }
 
 //----- (004C264A) --------------------------------------------------------
-void Vis::sort_object_pointers(Vis_ObjectInfo **pPointers, int left, int right)
-{
-  int v4; // edx@1
-  int v5; // ebx@1
-  int v6; // esi@2
-  signed int i; // ecx@2
-  int v8; // eax@3
-  int v9; // ebx@4
-  int v10; // ebx@6
-  Vis_ObjectInfo *v11; // eax@7
+void Vis::sort_object_pointers( Vis_ObjectInfo **pPointers, int start, int end )
+    {
+  int sort_start; // edx@1
+  int forward_sort_index; // esi@2
+  signed int backward_sort_index; // ecx@2
+  unsigned int last_z_val; // eax@3
+  unsigned int more_lz_val; // ebx@4
+  unsigned int less_lz_val; // ebx@6
+  Vis_ObjectInfo *temp_pointer; // eax@7
   Vis_ObjectInfo *a3a; // [sp+14h] [bp+Ch]@2
 
-  v4 = left;
-  v5 = right;
-  if ( right > left )
+  sort_start = start;
+
+  if ( end > start )
   {
     do
     {
-      v6 = v4 - 1;
-      a3a = pPointers[v5];
-      for ( i = v5; ; pPointers[i] = v11 )
+      forward_sort_index = sort_start - 1;
+      backward_sort_index = end;
+      do
       {
-        v8 = a3a->sZValue;
-        LOWORD(v8) = 0;
+        last_z_val = pPointers[end]->sZValue&0xFFFF0000;
         do
         {
-          ++v6;
-          v9 = pPointers[v6]->sZValue;
-          LOWORD(v9) = 0;
+          ++forward_sort_index;
+          more_lz_val = pPointers[forward_sort_index]->sZValue&0xFFFF0000;
         }
-        while ( v9 < (unsigned int)v8 );
+        while ( more_lz_val < last_z_val );
+
         do
         {
-          if ( i < 1 )
+          if ( backward_sort_index < 1 )
             break;
-          --i;
-          v10 = pPointers[i]->sZValue;
-          LOWORD(v10) = 0;
+          --backward_sort_index;
+          less_lz_val = pPointers[backward_sort_index]->sZValue&0xFFFF0000;
         }
-        while ( v10 > (unsigned int)v8 );
-        v11 = pPointers[v6];
-        if ( v6 >= i )
-          break;
-        pPointers[v6] = pPointers[i];
-      }
-      v5 = right;
-      pPointers[v6] = pPointers[right];
-      pPointers[right] = v11;
-      sort_object_pointers(pPointers, v4, v6 - 1);
-      v4 = v6 + 1;
+        while ( less_lz_val > last_z_val );
+
+        temp_pointer = pPointers[forward_sort_index];
+        if ( forward_sort_index >= backward_sort_index )
+            {
+            pPointers[forward_sort_index] = pPointers[end];
+            pPointers[end] = temp_pointer;
+            }
+        else
+            {
+            pPointers[forward_sort_index] = pPointers[backward_sort_index];
+            pPointers[backward_sort_index] = temp_pointer;
+            }
+       
+      } while ( forward_sort_index < backward_sort_index );
+
+      sort_object_pointers(pPointers, sort_start, forward_sort_index - 1);
+      sort_start = forward_sort_index + 1;
     }
-    while ( right > v6 + 1 );
+    while ( end > forward_sort_index + 1 );
   }
 }
 
@@ -1403,7 +1412,7 @@
 
     case VisObjectType_Sprite:
     {
-      v5 = filter->field_10;
+      v5 = filter->select_flags;
       int object_idx = PID_ID(pBillboardRenderList[pRenderer->pBillboardRenderListD3D[(int)uD3DBillboardIdx_or_pBLVFace_or_pODMFace].uParentBillboardID].object_pid);
       int object_type = PID_TYPE(pBillboardRenderList[pRenderer->pBillboardRenderListD3D[(int)uD3DBillboardIdx_or_pBLVFace_or_pODMFace].uParentBillboardID].object_pid);
       if ( v5 & 2 )
@@ -1436,11 +1445,11 @@
 
         v10 = &pActors[object_idx];
         int result = 1 << LOBYTE(v10->uAIState);
-        if ( result & filter->field_C
-            || !(result & filter->field_8)
+        if ( result & filter->no_at_ai_state
+            || !(result & filter->at_ai_state)
             || v5 & 8 && (result = MonsterStats::BelongsToSupertype(v10->pMonsterInfo.uID, MONSTER_SUPERTYPE_UNDEAD)) == 0 )
           return false;
-        if ( !(filter->field_10 & 1) )
+        if ( !(filter->select_flags & 1) )
           return true;
 
         result = v10->GetActorsRelation(nullptr);
@@ -1472,9 +1481,9 @@
 
       if (filter->object_id != OBJECT_BLVDoor)
         return true;
-      if (no_event || face_attrib & filter->field_C)
+      if (no_event || face_attrib & filter->no_at_ai_state)
         return false;
-      return (face_attrib & filter->field_8) != 0;
+      return (face_attrib & filter->at_ai_state) != 0;
     }
 
     default:
@@ -1515,31 +1524,32 @@
   struct RenderVertexSoft pPickingRay[2];
   //int v31; // [sp+20h] [bp-DCh]@5
   struct RenderVertexSoft local_80[2];
-  //int v32; // [sp+80h] [bp-7Ch]@22
-  float v33; // [sp+E0h] [bp-1Ch]@33
-  float v34; // [sp+E4h] [bp-18h]@32
-  int v35; // [sp+E8h] [bp-14h]@5
-  int v36; // [sp+ECh] [bp-10h]@5
+
+  float  test_x;
+  float  test_y;
+
+  float  t1_x;
+  float  t1_y;
+  float  t2_x;
+  float  t2_y;
+  float  swap_temp;
   int v37; // [sp+F0h] [bp-Ch]@5
-  float v38; // [sp+F4h] [bp-8h]@17
-  //void *v39; // [sp+F8h] [bp-4h]@1
+
   signed int v40; // [sp+108h] [bp+Ch]@17
-  float v41; // [sp+108h] [bp+Ch]@32
+
 
   static Vis_SelectionList Vis_static_stru_F91E10;
   Vis_static_stru_F91E10.uNumPointers = 0;
   v3 = pRenderer->pBillboardRenderListD3D[uD3DBillboardIdx].uParentBillboardID;
   if (v3 == -1)
     return false;
+
   if (pBillboardRenderList[v3].GetFloatZ() > fDepth)
-  {
-LABEL_49:
     return false;
-  }
+
 
-    v37 = pBillboardRenderList[v3].sZValue & 0xFFFF0000;
-    GetPolygonCenter(pRenderer->pBillboardRenderListD3D[v3].pQuards, 4, (float *)&v35, (float *)&v36);
-    CastPickRay(pPickingRay, *(float *)&v35, *(float *)&v36, fDepth);
+    GetPolygonCenter(pRenderer->pBillboardRenderListD3D[v3].pQuards, 4, &test_x, &test_y);
+    CastPickRay(pPickingRay, test_x, test_y, fDepth);
     if (uCurrentlyLoadedLevelType == LEVEL_Indoor)
       PickIndoorFaces_Mouse(fDepth, pPickingRay, &Vis_static_stru_F91E10, &vis_face_filter);
     else
@@ -1549,95 +1559,82 @@
     if (Vis_static_stru_F91E10.uNumPointers)
     {
        if (Vis_static_stru_F91E10.object_pointers[0]->actual_z > pBillboardRenderList[v3].actual_z)
-         return 1;
+         return true;
     }
-    else if ((double)(pViewport->uScreen_TL_X) <= *(float *)&v35 &&
-             (double)pViewport->uScreen_BR_X >= *(float *)&v35 &&
-             (double)pViewport->uScreen_TL_Y <= *(float *)&v36 &&
-             (double)pViewport->uScreen_BR_Y >= *(float *)&v36)
-      return 1;
-      v40 = 0;
-      v10 = (int)&pRenderer->pBillboardRenderListD3D[uD3DBillboardIdx].pQuards[0].pos.y;
-      LODWORD(v38) = (int)&pRenderer->pBillboardRenderListD3D[uD3DBillboardIdx].pQuards[0].pos.y;
-      while ( 1 )
-      {
-        v12 = *(float *)(v10 - 4);
-        v11 = *(float *)v10;
-        v13 = *(float *)(v10 - 4);
-        Vis_static_stru_F91E10.uNumPointers = 0;
-        if ( v13 >= (double)(pViewport->uScreen_TL_X))
+    else if ((double)(pViewport->uScreen_TL_X) <= test_x &&
+             (double)pViewport->uScreen_BR_X >= test_x &&
+             (double)pViewport->uScreen_TL_Y <= test_y &&
+             (double)pViewport->uScreen_BR_Y >= test_y)
+      return true;
+
+    for (v40 = 0; v40 < 4; ++v40)
         {
-          if ( v12 <= (double)pViewport->uScreen_BR_X )
-          {
-            if ( v11 >= (double)pViewport->uScreen_TL_Y )
+        test_x=pRenderer->pBillboardRenderListD3D[uD3DBillboardIdx].pQuards[v40].pos.x;
+        test_y=  pRenderer->pBillboardRenderListD3D[uD3DBillboardIdx].pQuards[v40].pos.y;
+        if ((double)(pViewport->uScreen_TL_X) <= test_x &&
+            (double)pViewport->uScreen_BR_X >= test_x &&
+            (double)pViewport->uScreen_TL_Y <= test_y &&
+            (double)pViewport->uScreen_BR_Y >= test_y)
             {
-              if ( v11 <= (double)pViewport->uScreen_BR_Y )
-              {
-                v14 = v11;
-                v15 = v12;
-                CastPickRay(local_80, SLODWORD(v15), v14, fDepth);
-                if ( uCurrentlyLoadedLevelType == 1 )
-                  PickIndoorFaces_Mouse(fDepth, local_80, &Vis_static_stru_F91E10, &vis_face_filter);
-                else
-                  PickOutdoorFaces_Mouse(fDepth, local_80, &Vis_static_stru_F91E10, &vis_face_filter, false);
-                Vis_static_stru_F91E10.create_object_pointers();
-                sort_object_pointers(Vis_static_stru_F91E10.object_pointers, 0, Vis_static_stru_F91E10.uNumPointers - 1);
-                if ( !Vis_static_stru_F91E10.uNumPointers )
-                  break;
-                else
-                {
-                //v18 = Vis_static_stru_F91E10.uNumPointers <= 0 ? 0 : (int);
-                //v19 = *(_DWORD *)(v18 + 4);
-                //LOWORD(v19) = 0;
-                if (Vis_static_stru_F91E10.object_pointers[0]->actual_z > pBillboardRenderList[v3].actual_z)
-                  break;
-                }
-              }
+            CastPickRay(local_80, test_x, test_y, fDepth);
+            if ( uCurrentlyLoadedLevelType == LEVEL_Indoor )
+                PickIndoorFaces_Mouse(fDepth, local_80, &Vis_static_stru_F91E10, &vis_face_filter);
+            else
+                PickOutdoorFaces_Mouse(fDepth, local_80, &Vis_static_stru_F91E10, &vis_face_filter, false);
+            Vis_static_stru_F91E10.create_object_pointers();
+            sort_object_pointers(Vis_static_stru_F91E10.object_pointers, 0, Vis_static_stru_F91E10.uNumPointers - 1);
+            if ( !Vis_static_stru_F91E10.uNumPointers )
+                return true;
+            if (Vis_static_stru_F91E10.object_pointers[0]->actual_z > pBillboardRenderList[v3].actual_z)
+                return true;
             }
-          }
+
         }
-        ++v40;
-        v10 = LODWORD(v38) + 32;
-        LODWORD(v38) += 32;
+  
         if ( v40 >= 4 )
         {
-          if ( uCurrentlyLoadedLevelType != 2 )
+          if ( uCurrentlyLoadedLevelType != LEVEL_Outdoor )
             return false;
-          v21 = pRenderer->pBillboardRenderListD3D[uD3DBillboardIdx].pQuards[0].pos.x;
-          v20 = pRenderer->pBillboardRenderListD3D[uD3DBillboardIdx].pQuards[3].pos.x;
-          v22 = *(int *)(&pRenderer->pBillboardRenderListD3D[uD3DBillboardIdx].pQuards[0].pos.y);
-          v34 = pRenderer->pBillboardRenderListD3D[uD3DBillboardIdx].pQuards[3].pos.x;
-          LODWORD(v38) = v22;
-          v41 = pRenderer->pBillboardRenderListD3D[uD3DBillboardIdx].pQuards[1].pos.y;
-          if ( v21 > v20 )
+          t1_x = pRenderer->pBillboardRenderListD3D[uD3DBillboardIdx].pQuards[0].pos.x;
+          t2_x = pRenderer->pBillboardRenderListD3D[uD3DBillboardIdx].pQuards[3].pos.x;
+
+          t1_y = pRenderer->pBillboardRenderListD3D[uD3DBillboardIdx].pQuards[0].pos.y;
+          t2_y = pRenderer->pBillboardRenderListD3D[uD3DBillboardIdx].pQuards[1].pos.y;
+          if ( t1_x > t2_x )
           {
-            v33 = v21;
-            v21 = v34;
-            v20 = v33;
+            swap_temp = t1_x;
+            t1_x = t2_x;
+            t2_x = swap_temp;
           }
-          if ( v38 > (double)v41 )
-            v41 = v38;
+          if ( t1_y > t2_y )
+            test_y = t1_y;
+          else
+            test_y = t2_y;
+
           Vis_static_stru_F91E10.uNumPointers = 0;
-          v23 = (v20 - v21) * 0.5;
-          if ( v23 < (double)(pViewport->uScreen_TL_X)
-            || v23 > (double)pViewport->uScreen_BR_X
-            || (double)pViewport->uScreen_TL_Y > v41
-            || (double)pViewport->uScreen_BR_Y < v41
-            || ((v25 = v23, CastPickRay(local_80, SLODWORD(v25), v41, fDepth), uCurrentlyLoadedLevelType != 1) ? 
-             (PickOutdoorFaces_Mouse(fDepth, local_80, &Vis_static_stru_F91E10, &vis_face_filter, false)) : 
-             (PickIndoorFaces_Mouse(fDepth, local_80, &Vis_static_stru_F91E10, &vis_face_filter)),
-             (Vis_static_stru_F91E10.create_object_pointers(),
-              sort_object_pointers(Vis_static_stru_F91E10.object_pointers, 0, Vis_static_stru_F91E10.uNumPointers - 1),
-              Vis_static_stru_F91E10.uNumPointers)
-             && (Vis_static_stru_F91E10.uNumPointers <= 0 ? (v28 = 0) : (v28 = (int)Vis_static_stru_F91E10.object_pointers),
-                 v29 = *(_DWORD *)(v28 + 4),
-                 LOWORD(v29) = 0,
-                 v29 <= v37)) )
-            return false;
-          break;
-        }
+
+          test_x = (t2_x - t1_x) * 0.5;
+          if ((double)(pViewport->uScreen_TL_X) <= test_x &&
+              (double)pViewport->uScreen_BR_X >= test_x &&
+              (double)pViewport->uScreen_TL_Y <= test_y &&
+              (double)pViewport->uScreen_BR_Y >= test_y)
+              {
+              CastPickRay(local_80, test_x, test_y, fDepth);
+              if ( uCurrentlyLoadedLevelType == LEVEL_Indoor )
+                  PickIndoorFaces_Mouse(fDepth, local_80, &Vis_static_stru_F91E10, &vis_face_filter);
+              else
+                  PickOutdoorFaces_Mouse(fDepth, local_80, &Vis_static_stru_F91E10, &vis_face_filter, false);
+              Vis_static_stru_F91E10.create_object_pointers();
+              sort_object_pointers(Vis_static_stru_F91E10.object_pointers, 0, Vis_static_stru_F91E10.uNumPointers - 1);
+              if ( !Vis_static_stru_F91E10.uNumPointers )
+                  return true;
+              if (Vis_static_stru_F91E10.object_pointers[0]->actual_z > pBillboardRenderList[v3].actual_z)
+                  return true;
+
+              }
+        
       }
-  return true;
+  return false;
 }
 // F93E18: using guessed type char static_byte_F93E18_init;
 
--- a/Vis.h	Fri Jun 28 16:51:01 2013 +0600
+++ b/Vis.h	Mon Jul 01 00:00:49 2013 +0400
@@ -16,9 +16,9 @@
 {
   VisObjectType object_type;
   int object_id;  // OBJECT_Actor, OBJECT_Player etc
-  int field_8;
-  int field_C;
-  int field_10;
+  int at_ai_state;
+  int no_at_ai_state;
+  int select_flags;
 };
 #pragma pack(pop)
 extern Vis_SelectionFilter vis_sprite_filter_1; // 00F93E1C
@@ -116,7 +116,7 @@
   void BLV_CreateIntersectFacesVertexCoordList(int *a, int *b, __int16 *intersect_face_vertex_coords_list_a, __int16 *intersect_face_vertex_coords_list_b, Vec3_short_ *IntersectPoint, BLVFace *pFace);
   void ODM_CreateIntersectFacesVertexCoordList(int *a, int *b, __int16 *intersect_face_vertex_coords_list_a, __int16 *intersect_face_vertex_coords_list_b, Vec3_short_ *IntersectPoint, BLVFace *pFace, unsigned int uModelID);
   void CastPickRay(RenderVertexSoft *pRay, float fMouseX, float fMouseY, float fPickDepth);
-  void sort_object_pointers(Vis_ObjectInfo **pPointers, int left, int right);
+  void sort_object_pointers(Vis_ObjectInfo **pPointers, int start, int end);
   bool SortVerticesByX(struct RenderVertexD3D3 *a2, unsigned int uStart, unsigned int uEnd);
   bool SortVerticesByY(struct RenderVertexD3D3 *a2, unsigned int uStart, unsigned int uEnd);
   bool SortByScreenSpaceX(struct RenderVertexSoft *pArray, int sLeft, int sRight);