comparison Render.cpp @ 2206:15a327be07e2

DrawSpriteObjects_ODM() cleaned
author Ritor1
date Thu, 06 Feb 2014 00:38:03 +0600
parents 3445abad44c5
children ff8920a40c21
comparison
equal deleted inserted replaced
2205:db94443ea4e7 2206:15a327be07e2
462 } 462 }
463 463
464 //----- (0047AF11) -------------------------------------------------------- 464 //----- (0047AF11) --------------------------------------------------------
465 void Render::DrawSpriteObjects_ODM() 465 void Render::DrawSpriteObjects_ODM()
466 { 466 {
467 //char *v0; // edi@2 467 SpriteFrame *frame; // eax@10
468 //ObjectDesc *v1; // ebx@4
469 __int16 v2; // cx@5
470 RenderBillboard *v3; // esi@10
471 SpriteFrame *v4; // eax@10
472 //SpriteFrame *v5; // ebx@10
473 unsigned int v6; // eax@10 468 unsigned int v6; // eax@10
474 //int v7; // ecx@10
475 //int v8; // edx@10
476 int v9; // ecx@10 469 int v9; // ecx@10
477 unsigned __int16 v10; // ax@10
478 //int *v11; // eax@14
479 int v12; // eax@22
480 int v13; // ST3C_4@23
481 int v14; // eax@23
482 int v15; // ecx@23
483 int v16; // ebx@23
484 int v17; // ecx@25 470 int v17; // ecx@25
485 int v18; // eax@25 471 int v18; // eax@25
486 int v19; // ST40_4@26
487 int v20; // ecx@26
488 int v21; // ST44_4@28
489 int v22; // ST3C_4@29 472 int v22; // ST3C_4@29
490 signed __int64 v23; // qtt@30 473 signed __int64 v23; // qtt@30
491 int v24; // ebx@30
492 int v25; // ST3C_4@30
493 int v26; // eax@31 474 int v26; // eax@31
494 char v27; // zf@31 475 char v27; // zf@31
495 //SpriteFrame *v28; // [sp+Ch] [bp-34h]@10
496 //__int16 a5; // [sp+10h] [bp-30h]@10
497 int v30; // [sp+14h] [bp-2Ch]@23 476 int v30; // [sp+14h] [bp-2Ch]@23
498 int v31; // [sp+14h] [bp-2Ch]@29
499 __int16 v32; // [sp+14h] [bp-2Ch]@30
500 int v33; // [sp+18h] [bp-28h]@23
501 int v34; // [sp+18h] [bp-28h]@26
502 int v35; // [sp+18h] [bp-28h]@30
503 int v36; // [sp+1Ch] [bp-24h]@10
504 int v37; // [sp+1Ch] [bp-24h]@23 477 int v37; // [sp+1Ch] [bp-24h]@23
505 int a6; // [sp+20h] [bp-20h]@10 478 int a6; // [sp+20h] [bp-20h]@10
506 int a6a; // [sp+20h] [bp-20h]@23
507 int v40; // [sp+24h] [bp-1Ch]@25
508 //signed int v41; // [sp+28h] [bp-18h]@1
509 int v42; // [sp+2Ch] [bp-14h]@23 479 int v42; // [sp+2Ch] [bp-14h]@23
510 int y; // [sp+30h] [bp-10h]@10 480 int y; // [sp+30h] [bp-10h]@10
511 int x; // [sp+34h] [bp-Ch]@10 481 int x; // [sp+34h] [bp-Ch]@10
512 int z; // [sp+38h] [bp-8h]@10 482 int z; // [sp+38h] [bp-8h]@10
513 signed __int16 v46; // [sp+3Ch] [bp-4h]@12 483 signed __int16 v46; // [sp+3Ch] [bp-4h]@12
530 500
531 //v1 = &pObjectList->pObjects[*((short *)v0 - 13)]; 501 //v1 = &pObjectList->pObjects[*((short *)v0 - 13)];
532 //if ( !(v1->uFlags & 1) ) 502 //if ( !(v1->uFlags & 1) )
533 //{ 503 //{
534 //v2 = *((short *)v0 - 14) 504 //v2 = *((short *)v0 - 14)
535 v2 = object->uType; 505 //v2 = object->uType;
536 if ( (v2 < 1000 || v2 >= 10000) && (v2 < 500 || v2 >= 600) || pGame->pStru6Instance->_4A81CA(object) ) 506 if ( (object->uType < 1000 || object->uType >= 10000) && (object->uType < 500 || object->uType >= 600)
507 || pGame->pStru6Instance->_4A81CA(object) )
537 { 508 {
538 //a5 = *(short *)v0; 509 //a5 = *(short *)v0;
539 x = object->vPosition.x; 510 x = object->vPosition.x;
540 y = object->vPosition.y; 511 y = object->vPosition.y;
541 z = object->vPosition.z; 512 z = object->vPosition.z;
542 v3 = &pBillboardRenderList[::uNumBillboardsToDraw]; 513 frame = pSpriteFrameTable->GetFrame(object_desc->uSpriteID, object->uSpriteFrameID);
543 v4 = pSpriteFrameTable->GetFrame(object_desc->uSpriteID, object->uSpriteFrameID); 514 a6 = frame->uGlowRadius * object->field_22_glow_radius_multiplier;
544 //v5 = v4;
545 //v28 = v4;
546 v36 = v4->uFlags;
547 a6 = v4->uGlowRadius * object->field_22_glow_radius_multiplier;
548 v6 = stru_5C6E00->Atan2(object->vPosition.x - pGame->pIndoorCameraD3D->vPartyPos.x, object->vPosition.y - pGame->pIndoorCameraD3D->vPartyPos.y); 515 v6 = stru_5C6E00->Atan2(object->vPosition.x - pGame->pIndoorCameraD3D->vPartyPos.x, object->vPosition.y - pGame->pIndoorCameraD3D->vPartyPos.y);
549 //LOWORD(v7) = object->uFacing; 516 //LOWORD(v7) = object->uFacing;
550 //v8 = v36; 517 //v8 = v36;
551 v9 = ((signed int)(stru_5C6E00->uIntegerPi + ((signed int)stru_5C6E00->uIntegerPi >> 3) + object->uFacing - v6) >> 8) & 7; 518 v9 = ((signed int)(stru_5C6E00->uIntegerPi + ((signed int)stru_5C6E00->uIntegerPi >> 3) + object->uFacing - v6) >> 8) & 7;
552 v10 = v4->pHwSpriteIDs[v9]; 519 pBillboardRenderList[::uNumBillboardsToDraw].uHwSpriteID = frame->pHwSpriteIDs[v9];
553 v3->uHwSpriteID = v10; 520 if ( frame->uFlags & 0x20 )
554 if ( v36 & 0x20 ) 521 {
522 //v8 = v36;
523 z -= fixpoint_mul(frame->scale, pSprites_LOD->pSpriteHeaders[(signed __int16)frame->pHwSpriteIDs[v9]].uHeight) / 2;
524 }
525 v46 = 0;
526 if ( frame->uFlags & 2 )
527 v46 = 2;
528 //v11 = (int *)(256 << v9);
529 if ( (256 << v9) & frame->uFlags )
530 v46 |= 4u;
531 if ( frame->uFlags & 0x40000 )
532 v46 |= 0x40u;
533 if ( frame->uFlags & 0x20000 )
534 LOBYTE(v46) = v46 | 0x80;
535 if ( a6 )
536 {
537 //LOBYTE(v11) = _4E94D3_light_type;
538 pMobileLightsStack->AddLight(x, y, z, object->uSectorID, a6, 0xFFu, 0xFFu, 0xFFu, _4E94D3_light_type);
539 }
540 if (pGame->pIndoorCameraD3D->sRotationX)
541 {
542 v30 = fixpoint_mul((x - pGame->pIndoorCameraD3D->vPartyPos.x) << 16, pGame->pIndoorCameraD3D->int_cosine_y)
543 + fixpoint_mul((y - pGame->pIndoorCameraD3D->vPartyPos.y) << 16, pGame->pIndoorCameraD3D->int_sine_y);
544 v37 = fixpoint_mul((x - pGame->pIndoorCameraD3D->vPartyPos.x) << 16, pGame->pIndoorCameraD3D->int_sine_y);
545 v42 = fixpoint_mul((z - pGame->pIndoorCameraD3D->vPartyPos.z) << 16, pGame->pIndoorCameraD3D->int_sine_x)
546 + fixpoint_mul(v30, pGame->pIndoorCameraD3D->int_cosine_x);
547 if ( v42 >= 0x40000 && v42 <= pODMRenderParams->shading_dist_mist << 16 )
548 {
549 v17 = fixpoint_mul((y - pGame->pIndoorCameraD3D->vPartyPos.y) << 16, pGame->pIndoorCameraD3D->int_cosine_y) - v37;
550 v18 = fixpoint_mul((z - pGame->pIndoorCameraD3D->vPartyPos.z) << 16, pGame->pIndoorCameraD3D->int_cosine_x)
551 - fixpoint_mul(v30, pGame->pIndoorCameraD3D->int_sine_x);
552 if ( abs(v42) >= abs(v17) )
553 {
554 LODWORD(v23) = 0;
555 HIDWORD(v23) = SLOWORD(pODMRenderParams->int_fov_rad);
556
557 object->uAttributes |= 1;
558 pBillboardRenderList[::uNumBillboardsToDraw].uPalette = frame->uPaletteIndex;
559 pBillboardRenderList[::uNumBillboardsToDraw].uIndoorSectorID = object->uSectorID;
560 pBillboardRenderList[::uNumBillboardsToDraw]._screenspace_x_scaler_packedfloat = fixpoint_mul(frame->scale, v23 / v42);
561 pBillboardRenderList[::uNumBillboardsToDraw].pSpriteFrame = frame;
562 pBillboardRenderList[::uNumBillboardsToDraw]._screenspace_y_scaler_packedfloat = fixpoint_mul(frame->scale, v23 / v42);
563 pBillboardRenderList[::uNumBillboardsToDraw].field_1E = v46;
564 pBillboardRenderList[::uNumBillboardsToDraw].world_x = x;
565 pBillboardRenderList[::uNumBillboardsToDraw].world_y = y;
566 pBillboardRenderList[::uNumBillboardsToDraw].world_z = z;
567 pBillboardRenderList[::uNumBillboardsToDraw].uScreenSpaceX = pViewport->uScreenCenterX - ((signed int)(fixpoint_mul(v23 / v42, v17) + 0x8000) >> 16);
568 pBillboardRenderList[::uNumBillboardsToDraw].uScreenSpaceY = pViewport->uScreenCenterY - (((unsigned int)fixpoint_mul(v23 / v42, v18) + 0x8000) >> 16);
569 HIWORD(v26) = HIWORD(v42);
570 LOWORD(v26) = 0;
571 pBillboardRenderList[::uNumBillboardsToDraw].sZValue = v26 + (PID(OBJECT_Item,i));
572 pBillboardRenderList[::uNumBillboardsToDraw].dimming_level = 0;
573 pBillboardRenderList[::uNumBillboardsToDraw].sTintColor = 0;
574 if ( !(object->uAttributes & 0x20) )
555 { 575 {
556 //v8 = v36; 576 if ( !pRenderer->pRenderD3D )
557 z -= (signed int)((unsigned __int64)(v4->scale * (signed __int64)pSprites_LOD->pSpriteHeaders[(signed __int16)v10].uHeight) >> 16) >> 1; 577 pBillboardRenderList[::uNumBillboardsToDraw].sZValue = 0;
558 } 578 }
559 v46 = 0; 579 //if (::uNumBillboardsToDraw >= 500)
560 if ( v36 & 2 ) 580 // return;
561 v46 = 2; 581 assert(::uNumBillboardsToDraw < 500);
562 //v11 = (int *)(256 << v9); 582 ++::uNumBillboardsToDraw;
563 if ( (256 << v9) & v36 ) 583 ++uNumSpritesDrawnThisFrame;
564 v46 |= 4u; 584 }
565 if ( v36 & 0x40000 ) 585 }
566 v46 |= 0x40u; 586 }
567 if ( v36 & 0x20000 ) 587 else
568 LOBYTE(v46) = v46 | 0x80; 588 {
569 if ( a6 ) 589 v42 = fixpoint_mul((y - pGame->pIndoorCameraD3D->vPartyPos.y) << 16, pGame->pIndoorCameraD3D->int_sine_y)
590 + fixpoint_mul((x - pGame->pIndoorCameraD3D->vPartyPos.x) << 16, pGame->pIndoorCameraD3D->int_cosine_y);
591 if ( v42 >= 0x40000 && v42 <= pODMRenderParams->shading_dist_mist << 16 )
592 {
593 v17 = fixpoint_mul((y - pGame->pIndoorCameraD3D->vPartyPos.y) << 16, pGame->pIndoorCameraD3D->int_cosine_y)
594 - fixpoint_mul(((x - pGame->pIndoorCameraD3D->vPartyPos.x) << 16), pGame->pIndoorCameraD3D->int_sine_y);
595 v18 = (z - pGame->pIndoorCameraD3D->vPartyPos.z) << 16;
596 if ( abs(v42) >= abs(v17) )
597 {
598 LODWORD(v23) = 0;
599 HIDWORD(v23) = SLOWORD(pODMRenderParams->int_fov_rad);
600
601 object->uAttributes |= 1;
602 pBillboardRenderList[::uNumBillboardsToDraw].uPalette = frame->uPaletteIndex;
603 pBillboardRenderList[::uNumBillboardsToDraw].uIndoorSectorID = object->uSectorID;
604 pBillboardRenderList[::uNumBillboardsToDraw]._screenspace_x_scaler_packedfloat = fixpoint_mul(frame->scale, v23 / v42);
605 pBillboardRenderList[::uNumBillboardsToDraw].pSpriteFrame = frame;
606 pBillboardRenderList[::uNumBillboardsToDraw]._screenspace_y_scaler_packedfloat = fixpoint_mul(frame->scale, v23 / v42);
607 pBillboardRenderList[::uNumBillboardsToDraw].field_1E = v46;
608 pBillboardRenderList[::uNumBillboardsToDraw].world_x = x;
609 pBillboardRenderList[::uNumBillboardsToDraw].world_y = y;
610 pBillboardRenderList[::uNumBillboardsToDraw].world_z = z;
611 pBillboardRenderList[::uNumBillboardsToDraw].uScreenSpaceX = pViewport->uScreenCenterX - ((signed int)(fixpoint_mul(v23 / v42, v17) + 0x8000) >> 16);
612 pBillboardRenderList[::uNumBillboardsToDraw].uScreenSpaceY = pViewport->uScreenCenterY - (((unsigned int)fixpoint_mul(v23 / v42, v18) + 0x8000) >> 16);
613 HIWORD(v26) = HIWORD(v42);
614 LOWORD(v26) = 0;
615 pBillboardRenderList[::uNumBillboardsToDraw].sZValue = v26 + (PID(OBJECT_Item,i));
616 pBillboardRenderList[::uNumBillboardsToDraw].dimming_level = 0;
617 pBillboardRenderList[::uNumBillboardsToDraw].sTintColor = 0;
618 if ( !(object->uAttributes & 0x20) )
570 { 619 {
571 //LOBYTE(v11) = _4E94D3_light_type; 620 if ( !pRenderer->pRenderD3D )
572 pMobileLightsStack->AddLight(x, y, z, object->uSectorID, a6, 0xFFu, 0xFFu, 0xFFu, _4E94D3_light_type); 621 pBillboardRenderList[::uNumBillboardsToDraw].sZValue = 0;
573 } 622 }
574 v12 = (x - pGame->pIndoorCameraD3D->vPartyPos.x) << 16; 623 //if (::uNumBillboardsToDraw >= 500)
575 if (pGame->pIndoorCameraD3D->sRotationX) 624 // return;
576 { 625 assert(::uNumBillboardsToDraw < 500);
577 v13 = (y - pGame->pIndoorCameraD3D->vPartyPos.y) << 16; 626 ++::uNumBillboardsToDraw;
578 v30 = ((unsigned __int64)(v12 * (signed __int64)pGame->pIndoorCameraD3D->int_cosine_y) >> 16) 627 ++uNumSpritesDrawnThisFrame;
579 + ((unsigned __int64)(v13 * (signed __int64)pGame->pIndoorCameraD3D->int_sine_y) >> 16);
580 v37 = (unsigned __int64)(v12 * (signed __int64)pGame->pIndoorCameraD3D->int_sine_y) >> 16;
581 a6a = (unsigned __int64)(v13 * (signed __int64)pGame->pIndoorCameraD3D->int_cosine_y) >> 16;
582 v33 = (z - pGame->pIndoorCameraD3D->vPartyPos.z) << 16;
583 v14 = (unsigned __int64)(v30 * (signed __int64)pGame->pIndoorCameraD3D->int_cosine_x) >> 16;
584 v15 = (unsigned __int64)(v33 * (signed __int64)pGame->pIndoorCameraD3D->int_sine_x) >> 16;
585 v16 = v15 + v14;
586 v42 = v15 + v14;
587 if ( v15 + v14 >= 262144 && v16 <= pODMRenderParams->shading_dist_mist << 16 )
588 {
589 v17 = a6a - v37;
590 v40 = a6a - v37;
591 v18 = ((unsigned __int64)(v33 * (signed __int64)pGame->pIndoorCameraD3D->int_cosine_x) >> 16)
592 - ((unsigned __int64)(v30 * (signed __int64)pGame->pIndoorCameraD3D->int_sine_x) >> 16);
593 goto LABEL_29;
594 }
595 }
596 else
597 {
598 v34 = (y - pGame->pIndoorCameraD3D->vPartyPos.y) << 16;
599 v19 = (unsigned __int64)(v12 * (signed __int64)pGame->pIndoorCameraD3D->int_cosine_y) >> 16;
600 v20 = (unsigned __int64)(v34 * (signed __int64)pGame->pIndoorCameraD3D->int_sine_y) >> 16;
601 v16 = v20 + v19;
602 v42 = v20 + v19;
603 if ( v20 + v19 >= 262144 && v16 <= pODMRenderParams->shading_dist_mist << 16 )
604 {
605 v21 = (unsigned __int64)(((x - pGame->pIndoorCameraD3D->vPartyPos.x) << 16) * (signed __int64)pGame->pIndoorCameraD3D->int_sine_y) >> 16;
606 v17 = ((unsigned __int64)(v34 * (signed __int64)pGame->pIndoorCameraD3D->int_cosine_y) >> 16) - v21;
607 v40 = ((unsigned __int64)(v34 * (signed __int64)pGame->pIndoorCameraD3D->int_cosine_y) >> 16) - v21;
608 v18 = (z - pGame->pIndoorCameraD3D->vPartyPos.z) << 16;
609 LABEL_29:
610 v31 = v18;
611 v22 = abs(v17);
612 if ( abs(v16) >= v22 )
613 {
614 LODWORD(v23) = 0;
615 HIDWORD(v23) = SLOWORD(pODMRenderParams->int_fov_rad);
616 v24 = v23 / v42;
617 v25 = v23 / v42;
618 LODWORD(v23) = 0;
619 HIDWORD(v23) = SLOWORD(pODMRenderParams->int_fov_rad);
620 v35 = pViewport->uScreenCenterX - ((signed int)(((unsigned __int64)(v25 * (signed __int64)v40) >> 16) + 32768) >> 16);
621 v32 = LOWORD(pViewport->uScreenCenterY) - (((unsigned int)((unsigned __int64)(v23 / v42 * v31) >> 16) + 32768) >> 16);
622
623 //if (::uNumBillboardsToDraw >= 500)
624 // return;
625 assert(::uNumBillboardsToDraw < 500);
626 ++::uNumBillboardsToDraw;
627 ++uNumSpritesDrawnThisFrame;
628
629 object->uAttributes |= 1;
630 v3->uPalette = v4->uPaletteIndex;
631 v3->uIndoorSectorID = object->uSectorID;
632 v3->_screenspace_x_scaler_packedfloat = (unsigned __int64)(v4->scale * (signed __int64)v24) >> 16;
633 v26 = (unsigned __int64)(v4->scale * (signed __int64)v24) >> 16;
634 v3->pSpriteFrame = v4;
635 v3->_screenspace_y_scaler_packedfloat = v26;
636 v3->field_1E = v46;
637 v3->world_x = x;
638 v3->world_y = y;
639 v3->world_z = z;
640 v3->uScreenSpaceX = v35;
641 v3->uScreenSpaceY = v32;
642 HIWORD(v26) = HIWORD(v42);
643 LOWORD(v26) = 0;
644 v27 = (object->uAttributes & 0x20) == 0;
645 v3->sZValue = v26 + (PID(OBJECT_Item,i));
646 v3->dimming_level = 0;
647 v3->sTintColor = 0;
648 if ( !v27 )
649 {
650 if ( !pRenderer->pRenderD3D )
651 v3->sZValue = 0;
652 }
653 }
654 goto LABEL_34;
655 }
656 }
657 } 628 }
658 //} 629 }
659 LABEL_34: 630 }
660 ; 631 }
661 //++v41;
662 //v0 += 112;
663 //}
664 //while ( v41 < (signed int)uNumSpriteObjects );
665 } 632 }
666 } 633 }
667 634
668 //----- (0049D9BC) -------------------------------------------------------- 635 //----- (0049D9BC) --------------------------------------------------------
669 signed int __stdcall RenderD3D__DeviceEnumerator(GUID *lpGUID, const char *lpDevDesc, const char *lpDriverName, RenderD3D__DevInfo *pOut) 636 signed int __stdcall RenderD3D__DeviceEnumerator(GUID *lpGUID, const char *lpDevDesc, const char *lpDriverName, RenderD3D__DevInfo *pOut)