diff Render.cpp @ 430:58b71c1af7d8

Objects are drawn (items, spells sfx)
author Nomad
date Sun, 24 Feb 2013 00:54:25 +0200
parents edd2d8b7e3c4
children cb0ad52d6a26
line wrap: on
line diff
--- a/Render.cpp	Sat Feb 23 23:04:00 2013 +0200
+++ b/Render.cpp	Sun Feb 24 00:54:25 2013 +0200
@@ -3053,17 +3053,17 @@
 void Render::DrawLayingItems_Shooting_Magic_ODM()
 {
   //char *v0; // edi@2
-  ObjectDesc *v1; // ebx@4
+  //ObjectDesc *v1; // ebx@4
   __int16 v2; // cx@5
   RenderBillboard *v3; // esi@10
   SpriteFrame *v4; // eax@10
-  SpriteFrame *v5; // ebx@10
+  //SpriteFrame *v5; // ebx@10
   unsigned int v6; // eax@10
-  int v7; // ecx@10
-  int v8; // edx@10
+  //int v7; // ecx@10
+  //int v8; // edx@10
   int v9; // ecx@10
   unsigned __int16 v10; // ax@10
-  int *v11; // eax@14
+  //int *v11; // eax@14
   int v12; // eax@22
   int v13; // ST3C_4@23
   int v14; // eax@23
@@ -3080,8 +3080,8 @@
   int v25; // ST3C_4@30
   int v26; // eax@31
   char v27; // zf@31
-  SpriteFrame *v28; // [sp+Ch] [bp-34h]@10
-  __int16 a5; // [sp+10h] [bp-30h]@10
+  //SpriteFrame *v28; // [sp+Ch] [bp-34h]@10
+  //__int16 a5; // [sp+10h] [bp-30h]@10
   int v30; // [sp+14h] [bp-2Ch]@23
   int v31; // [sp+14h] [bp-2Ch]@29
   __int16 v32; // [sp+14h] [bp-2Ch]@30
@@ -3103,56 +3103,61 @@
   //v41 = 0;
   for (int i = 0; i < uNumLayingItems; ++i)
   {
-    auto v0 = (char *)&pLayingItems[i].uSectorID;
+    auto object = pLayingItems + i;
+    //auto v0 = (char *)&pLayingItems[i].uSectorID;
     //v0 = (char *)&pLayingItems[0].uSectorID;
     //do
     //{
-      if ( *((short *)v0 - 13) )
-      {
-        v1 = &pObjectList->pObjects[*((short *)v0 - 13)];
-        if ( !(v1->uFlags & 1) )
-        {
-          if ( ((v2 = *((short *)v0 - 14), v2 < 1000) || v2 >= 10000) && (v2 < 500 || v2 >= 600)
-            || pGame->pStru6Instance->_4A81CA((LayingItem *)(v0 - 28)) )
-          {
-            a5 = *(short *)v0;
-            x = *((int *)v0 - 6);
-            y = *((int *)v0 - 5);
-            z = *((int *)v0 - 4);
-            v3 = &pBillboardRenderList[::uNumBillboardsToDraw];
-            v4 = pSpriteFrameTable->GetFrame(v1->uSpriteID, *((short *)v0 + 1));
-            v5 = v4;
-            v28 = v4;
-            v36 = v4->uFlags;
-            a6 = v4->uGlowRadius * *((short *)v0 + 3);
-            v6 = stru_5C6E00->Atan2(
-                   *((int *)v0 - 6) - pIndoorCamera->pos.x,
-                   *((int *)v0 - 5) - pIndoorCamera->pos.y);
-            LOWORD(v7) = *((short *)v0 - 3);
-            v8 = v36;
-            v9 = ((signed int)(stru_5C6E00->uIntegerPi + ((signed int)stru_5C6E00->uIntegerPi >> 3) + v7 - v6) >> 8) & 7;
-            v10 = v5->pHwSpriteIDs[v9];
+    if (!object->uObjectDescID)  // item probably pciked up
+      continue;
+
+    assert(object->uObjectDescID < pObjectList->uNumObjects);
+    auto object_desc = pObjectList->pObjects + object->uObjectDescID;
+    if (object_desc->NoSprite())
+      continue;
+
+        //v1 = &pObjectList->pObjects[*((short *)v0 - 13)];
+        //if ( !(v1->uFlags & 1) )
+        //{
+          //v2 = *((short *)v0 - 14)
+    v2 = object->uItemType;
+    if ( (v2 < 1000 || v2 >= 10000) && (v2 < 500 || v2 >= 600) || pGame->pStru6Instance->_4A81CA(object) )
+    {
+            //a5 = *(short *)v0;
+      x = object->vPosition.x;
+      y = object->vPosition.y;
+      z = object->vPosition.z;
+      v3 = &pBillboardRenderList[::uNumBillboardsToDraw];
+      v4 = pSpriteFrameTable->GetFrame(object_desc->uSpriteID, object->uSpriteFrameID);
+      //v5 = v4;
+      //v28 = v4;
+      v36 = v4->uFlags;
+      a6 = v4->uGlowRadius * object->field_22_glow_radius_multiplier;
+      v6 = stru_5C6E00->Atan2(object->vPosition.x - pIndoorCamera->pos.x, object->vPosition.y - pIndoorCamera->pos.y);
+      //LOWORD(v7) = object->uFacing;
+      //v8 = v36;
+            v9 = ((signed int)(stru_5C6E00->uIntegerPi + ((signed int)stru_5C6E00->uIntegerPi >> 3) + object->uFacing - v6) >> 8) & 7;
+            v10 = v4->pHwSpriteIDs[v9];
             v3->uHwSpriteID = v10;
             if ( v36 & 0x20 )
             {
-              v8 = v36;
-              z -= (signed int)((unsigned __int64)(v5->scale
-                                                 * (signed __int64)pSprites_LOD->pSpriteHeaders[(signed __int16)v10].uHeight) >> 16) >> 1;
+              //v8 = v36;
+              z -= (signed int)((unsigned __int64)(v4->scale * (signed __int64)pSprites_LOD->pSpriteHeaders[(signed __int16)v10].uHeight) >> 16) >> 1;
             }
             v46 = 0;
-            if ( v8 & 2 )
+            if ( v36 & 2 )
               v46 = 2;
-            v11 = (int *)(256 << v9);
-            if ( (256 << v9) & v8 )
+            //v11 = (int *)(256 << v9);
+            if ( (256 << v9) & v36 )
               v46 |= 4u;
-            if ( v8 & 0x40000 )
+            if ( v36 & 0x40000 )
               v46 |= 0x40u;
-            if ( v8 & 0x20000 )
+            if ( v36 & 0x20000 )
               LOBYTE(v46) = v46 | 0x80;
             if ( a6 )
             {
-              LOBYTE(v11) = byte_4E94D3;
-              pMobileLightsStack->AddLight(x, y, z, a5, a6, 0xFFu, 0xFFu, 0xFFu, byte_4E94D3);
+              //LOBYTE(v11) = byte_4E94D3;
+              pMobileLightsStack->AddLight(x, y, z, object->uSectorID, a6, 0xFFu, 0xFFu, 0xFFu, byte_4E94D3);
             }
             v12 = (x - pIndoorCamera->pos.x) << 16;
             if ( pIndoorCamera->sRotationX )
@@ -3185,12 +3190,9 @@
               v42 = v20 + v19;
               if ( v20 + v19 >= 262144 && v16 <= pOutdoorCamera->shading_dist_mist << 16 )
               {
-                v21 = (unsigned __int64)(((x - pIndoorCamera->pos.x) << 16)
-                                       * (signed __int64)pOutdoorCamera->camera_rotation_y_int_sine) >> 16;
-                v17 = ((unsigned __int64)(v34 * (signed __int64)pOutdoorCamera->camera_rotation_y_int_cosine) >> 16)
-                    - v21;
-                v40 = ((unsigned __int64)(v34 * (signed __int64)pOutdoorCamera->camera_rotation_y_int_cosine) >> 16)
-                    - v21;
+                v21 = (unsigned __int64)(((x - pIndoorCamera->pos.x) << 16) * (signed __int64)pOutdoorCamera->camera_rotation_y_int_sine) >> 16;
+                v17 = ((unsigned __int64)(v34 * (signed __int64)pOutdoorCamera->camera_rotation_y_int_cosine) >> 16) - v21;
+                v40 = ((unsigned __int64)(v34 * (signed __int64)pOutdoorCamera->camera_rotation_y_int_cosine) >> 16) - v21;
                 v18 = (z - pIndoorCamera->pos.z) << 16;
 LABEL_29:
                 v31 = v18;
@@ -3203,30 +3205,31 @@
                   v25 = v23 / v42;
                   LODWORD(v23) = 0;
                   HIDWORD(v23) = SLOWORD(pOutdoorCamera->int_fov_rad);
-                  v35 = pViewport->uScreenCenterX
-                      - ((signed int)(((unsigned __int64)(v25 * (signed __int64)v40) >> 16) + 32768) >> 16);
-                  v32 = LOWORD(pViewport->uScreenCenterY)
-                      - (((unsigned int)((unsigned __int64)(v23 / v42 * v31) >> 16) + 32768) >> 16);
-                  if (::uNumBillboardsToDraw >= 500)
-                    return;
+                  v35 = pViewport->uScreenCenterX - ((signed int)(((unsigned __int64)(v25 * (signed __int64)v40) >> 16) + 32768) >> 16);
+                  v32 = LOWORD(pViewport->uScreenCenterY) - (((unsigned int)((unsigned __int64)(v23 / v42 * v31) >> 16) + 32768) >> 16);
+
+                  //if (::uNumBillboardsToDraw >= 500)
+                  //  return;
+                  assert(::uNumBillboardsToDraw < 500);
                   ++::uNumBillboardsToDraw;
                   ++uNumSpritesDrawnThisFrame;
-                  *(v0 - 2) |= 1u;
-                  v3->uPalette = v28->uPaletteIndex;
-                  v3->uIndoorSectorID = a5;
-                  v3->_screenspace_x_scaler_packedfloat = (unsigned __int64)(v28->scale * (signed __int64)v24) >> 16;
-                  v26 = (unsigned __int64)(v28->scale * (signed __int64)v24) >> 16;
-                  v3->pSpriteFrame = v28;
+
+                  object->uAttributes |= 1;
+                  v3->uPalette = v4->uPaletteIndex;
+                  v3->uIndoorSectorID = object->uSectorID;
+                  v3->_screenspace_x_scaler_packedfloat = (unsigned __int64)(v4->scale * (signed __int64)v24) >> 16;
+                  v26 = (unsigned __int64)(v4->scale * (signed __int64)v24) >> 16;
+                  v3->pSpriteFrame = v4;
                   v3->_screenspace_y_scaler_packedfloat = v26;
                   v3->field_1E = v46;
-                  v3->some_x = x;
-                  v3->some_y = y;
-                  v3->some_z = z;
+                  v3->world_x = x;
+                  v3->world_y = y;
+                  v3->world_z = z;
                   v3->uScreenSpaceX = v35;
                   v3->uScreenSpaceY = v32;
                   HIWORD(v26) = HIWORD(v42);
                   LOWORD(v26) = 0;
-                  v27 = (*(v0 - 2) & 0x20) == 0;
+                  v27 = (object->uAttributes & 0x20) == 0;
                   v3->sZValue = v26 + (8 * i | OBJECT_Item);
                   v3->uPaletteSubindex = 0;
                   v3->uTintColor = 0;
@@ -3240,8 +3243,7 @@
               }
             }
           }
-        }
-      }
+        //}
 LABEL_34:
       ;
       //++v41;
@@ -3659,9 +3661,9 @@
                     HIBYTE(v29) |= 2u;
                     v27->uPalette = v28;
                     v27->field_1E = v29;
-                    v27->some_x = x;
-                    v27->some_y = y;
-                    v27->some_z = v36;
+                    v27->world_x = x;
+                    v27->world_y = y;
+                    v27->world_z = v36;
                     v27->uScreenSpaceY = v40;
                     HIWORD(v30) = HIWORD(v39);
                     v31 = 8 * i | OBJECT_Decoration;