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