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