| 3487 | } |
| 3488 | |
| 3489 | void PixelGameEngine::DrawPartialDecal(const olc::vf2d& pos, olc::Decal* decal, const olc::vf2d& source_pos, const olc::vf2d& source_size, const olc::vf2d& scale, const olc::Pixel& tint) |
| 3490 | { |
| 3491 | olc::vf2d vScreenSpacePos = |
| 3492 | { |
| 3493 | (pos.x * vInvScreenSize.x) * 2.0f - 1.0f, |
| 3494 | -((pos.y * vInvScreenSize.y) * 2.0f - 1.0f) |
| 3495 | }; |
| 3496 | |
| 3497 | |
| 3498 | olc::vf2d vScreenSpaceDim = |
| 3499 | { |
| 3500 | ((pos.x + source_size.x * scale.x) * vInvScreenSize.x) * 2.0f - 1.0f, |
| 3501 | -(((pos.y + source_size.y * scale.y) * vInvScreenSize.y) * 2.0f - 1.0f) |
| 3502 | }; |
| 3503 | |
| 3504 | olc::vf2d vWindow = olc::vf2d(vViewSize); |
| 3505 | olc::vf2d vQuantisedPos = ((vScreenSpacePos * vWindow) + olc::vf2d(0.5f, 0.5f)).floor() / vWindow; |
| 3506 | olc::vf2d vQuantisedDim = ((vScreenSpaceDim * vWindow) + olc::vf2d(0.5f, -0.5f)).ceil() / vWindow; |
| 3507 | |
| 3508 | DecalInstance di; |
| 3509 | di.points = 4; |
| 3510 | di.decal = decal; |
| 3511 | di.tint = { tint, tint, tint, tint }; |
| 3512 | di.pos = { { vQuantisedPos.x, vQuantisedPos.y }, { vQuantisedPos.x, vQuantisedDim.y }, { vQuantisedDim.x, vQuantisedDim.y }, { vQuantisedDim.x, vQuantisedPos.y } }; |
| 3513 | olc::vf2d uvtl = (source_pos + olc::vf2d(0.0001f, 0.0001f)) * decal->vUVScale; |
| 3514 | olc::vf2d uvbr = (source_pos + source_size - olc::vf2d(0.0001f, 0.0001f)) * decal->vUVScale; |
| 3515 | di.uv = { { uvtl.x, uvtl.y }, { uvtl.x, uvbr.y }, { uvbr.x, uvbr.y }, { uvbr.x, uvtl.y } }; |
| 3516 | di.w = { 1,1,1,1 }; |
| 3517 | di.mode = nDecalMode; |
| 3518 | di.structure = nDecalStructure; |
| 3519 | vLayers[nTargetLayer].vecDecalInstance.push_back(di); |
| 3520 | } |
| 3521 | |
| 3522 | void PixelGameEngine::DrawPartialDecal(const olc::vf2d& pos, const olc::vf2d& size, olc::Decal* decal, const olc::vf2d& source_pos, const olc::vf2d& source_size, const olc::Pixel& tint) |
| 3523 | { |