diff --git a/OBSApi/Scene.cpp b/OBSApi/Scene.cpp index 8621e1eb..9ab17850 100644 --- a/OBSApi/Scene.cpp +++ b/OBSApi/Scene.cpp @@ -170,9 +170,9 @@ SceneItem* Scene::InsertImageSource(UINT pos, XElement *sourceElement) item->source = source; item->pos = Vect2(x, y); item->size = Vect2(cx, cy); - item->crop.w = sourceElement->GetFloat(TEXT("crop.left")); - item->crop.x = sourceElement->GetFloat(TEXT("crop.top")); - item->crop.y = sourceElement->GetFloat(TEXT("crop.right")); + item->crop.w = sourceElement->GetFloat(TEXT("crop.right")); + item->crop.x = sourceElement->GetFloat(TEXT("crop.left")); + item->crop.y = sourceElement->GetFloat(TEXT("crop.top")); item->crop.z = sourceElement->GetFloat(TEXT("crop.bottom")); item->SetRender(render); @@ -236,7 +236,7 @@ void Scene::Render() SceneItem *item = sceneItems[i]; if(item->source && item->bRender) { - GS->SetCropping (item->crop.w, item->crop.x, item->crop.y, item->crop.z); + GS->SetCropping (item->crop.x, item->crop.y, item->crop.w, item->crop.z); item->source->Render(item->pos, item->size); GS->SetCropping (0.0f, 0.0f, 0.0f, 0.0f); } @@ -253,11 +253,11 @@ void Scene::RenderSelections(Shader *solidPixelShader) { Vect2 pos = API->MapFrameToWindowPos(item->GetPos())+1.0f; Vect2 scale = API->GetFrameToWindowScale(); - pos.x += item->GetCrop().w * scale.x; - pos.y += item->GetCrop().x * scale.y; + pos.x += item->GetCrop().x * scale.x; + pos.y += item->GetCrop().y * scale.y; Vect2 size = API->MapFrameToWindowSize(item->GetSize())-2.0f; - size.x -= (item->GetCrop().y + item->GetCrop().w) * scale.x; - size.y -= (item->GetCrop().x + item->GetCrop().z) * scale.y; + size.x -= (item->GetCrop().x + item->GetCrop().w) * scale.x; + size.y -= (item->GetCrop().y + item->GetCrop().z) * scale.y; Vect2 selectBoxSize = Vect2(10.0f, 10.0f); @@ -268,17 +268,17 @@ void Scene::RenderSelections(Shader *solidPixelShader) // Top - if (CloseFloat(item->crop.x, 0.0f)) solidPixelShader->SetColor(solidPixelShader->GetParameter(0), 0xFF0000); + if (CloseFloat(item->crop.y, 0.0f)) solidPixelShader->SetColor(solidPixelShader->GetParameter(0), 0xFF0000); else solidPixelShader->SetColor(solidPixelShader->GetParameter(0), 0x00FF00); DrawBox(pos, Vect2(size.x, 0.0f)); // Left - if (CloseFloat(item->crop.w, 0.0f)) solidPixelShader->SetColor(solidPixelShader->GetParameter(0), 0xFF0000); + if (CloseFloat(item->crop.x, 0.0f)) solidPixelShader->SetColor(solidPixelShader->GetParameter(0), 0xFF0000); else solidPixelShader->SetColor(solidPixelShader->GetParameter(0), 0x00FF00); DrawBox(pos, Vect2(0.0f, size.y)); // Right - if (CloseFloat(item->crop.y, 0.0f)) solidPixelShader->SetColor(solidPixelShader->GetParameter(0), 0xFF0000); + if (CloseFloat(item->crop.w, 0.0f)) solidPixelShader->SetColor(solidPixelShader->GetParameter(0), 0xFF0000); else solidPixelShader->SetColor(solidPixelShader->GetParameter(0), 0x00FF00); DrawBox(pos+Vect2(size.x, 0.0f), Vect2(0.0f, size.y)); diff --git a/Source/D3D10System.cpp b/Source/D3D10System.cpp index 6f5a9c12..f5ade5f9 100644 --- a/Source/D3D10System.cpp +++ b/Source/D3D10System.cpp @@ -783,7 +783,7 @@ void D3D10System::SetCropping(float left, float top, float right, float bottom) void D3D10System::DrawSpriteEx(Texture *texture, DWORD color, float x, float y, float x2, float y2, float u, float v, float u2, float v2) { if(!curPixelShader) - return; + return; if(!texture) { @@ -803,6 +803,18 @@ void D3D10System::DrawSpriteEx(Texture *texture, DWORD color, float x, float y, Vect2 invMult = Vect2(totalSize.x < 0.0f ? -1.0f : 1.0f, totalSize.y < 0.0f ? -1.0f : 1.0f); totalSize.Abs(); + if(y2-y < 0) { + float tempFloat = curCropping[1]; + curCropping[1] = curCropping[3]; + curCropping[3] = tempFloat; + } + + if(x2-x < 0) { + float tempFloat = curCropping[0]; + curCropping[0] = curCropping[2]; + curCropping[2] = tempFloat; + } + x += curCropping[0] * invMult.x; y += curCropping[1] * invMult.y; x2 -= curCropping[2] * invMult.x; diff --git a/Source/WindowStuff.cpp b/Source/WindowStuff.cpp index 909c2906..19acff47 100644 --- a/Source/WindowStuff.cpp +++ b/Source/WindowStuff.cpp @@ -2830,8 +2830,8 @@ ItemModifyType GetItemModifyType(const Vect2 &mousePos, const Vect2 &itemPos, co float epsilon = 10.0f; - Vect2 croppedItemPos = itemPos + Vect2(crop.w / scaleVal.x, crop.x / scaleVal.y); - Vect2 croppedLowerRight = lowerRight - Vect2(crop.y / scaleVal.x, crop.z / scaleVal.y); + Vect2 croppedItemPos = itemPos + Vect2(crop.x / scaleVal.x, crop.y / scaleVal.y); + Vect2 croppedLowerRight = lowerRight - Vect2(crop.w / scaleVal.x, crop.z / scaleVal.y); // Corner sizing if(mousePos.CloseTo(croppedItemPos, epsilon)) @@ -2931,20 +2931,20 @@ Vect2 OBS::GetFrameToWindowScale() bool OBS::EnsureCropValid(SceneItem *&scaleItem, Vect2 &minSize, Vect2 &snapSize, bool bControlDown) { // left + if (scaleItem->crop.x > (scaleItem->size.x / 2) - minSize.x) + { + scaleItem->crop.x = (scaleItem->size.x / 2) - minSize.x; + } + // top + if (scaleItem->crop.y > (scaleItem->size.y / 2) - minSize.y) + { + scaleItem->crop.y = (scaleItem->size.y / 2) - minSize.y; + } + // right if (scaleItem->crop.w > (scaleItem->size.x / 2) - minSize.x) { scaleItem->crop.w = (scaleItem->size.x / 2) - minSize.x; } - // top - if (scaleItem->crop.x > (scaleItem->size.y / 2) - minSize.y) - { - scaleItem->crop.x = (scaleItem->size.y / 2) - minSize.y; - } - // right - if (scaleItem->crop.y > (scaleItem->size.x / 2) - minSize.x) - { - scaleItem->crop.y = (scaleItem->size.x / 2) - minSize.x; - } // bottom if (scaleItem->crop.z > (scaleItem->size.y / 2) - minSize.y) { @@ -2954,20 +2954,20 @@ bool OBS::EnsureCropValid(SceneItem *&scaleItem, Vect2 &minSize, Vect2 &snapSize if (!bControlDown) { // left - if(CloseFloat(scaleItem->crop.w, 0.0f, snapSize.x)) - { - scaleItem->crop.w = 0.0f; - } - // top - if(CloseFloat(scaleItem->crop.x, 0.0f, snapSize.y)) + if(CloseFloat(scaleItem->crop.x, 0.0f, snapSize.x)) { scaleItem->crop.x = 0.0f; } - // right - if(CloseFloat(scaleItem->crop.y, 0.0f, snapSize.x)) + // top + if(CloseFloat(scaleItem->crop.y, 0.0f, snapSize.y)) { scaleItem->crop.y = 0.0f; } + // right + if(CloseFloat(scaleItem->crop.w, 0.0f, snapSize.x)) + { + scaleItem->crop.w = 0.0f; + } // bottom if(CloseFloat(scaleItem->crop.z, 0.0f, snapSize.y)) { @@ -3199,22 +3199,22 @@ LRESULT CALLBACK OBS::RenderFrameProc(HWND hwnd, UINT message, WPARAM wParam, LP { Vect2 pos = item->pos; Vect2 bottomRight = pos+item->size; - pos.x += item->crop.w; - pos.y += item->crop.x; - bottomRight.x -= item->crop.y; + pos.x += item->crop.x; + pos.y += item->crop.y; + bottomRight.x -= item->crop.w; bottomRight.y -= item->crop.z; bool bVerticalSnap = true; if(CloseFloat(pos.x, 0.0f, snapSize.x)) - item->pos.x = -item->crop.w; + item->pos.x = -item->crop.x; else if(CloseFloat(bottomRight.x, baseRenderSize.x, snapSize.x)) - item->pos.x = baseRenderSize.x-item->size.x+item->crop.y; + item->pos.x = baseRenderSize.x-item->size.x+item->crop.w; else bVerticalSnap = false; bool bHorizontalSnap = true; if(CloseFloat(pos.y, 0.0f, snapSize.y)) - item->pos.y = -item->crop.x; + item->pos.y = -item->crop.y; else if(CloseFloat(bottomRight.y, baseRenderSize.y, snapSize.y)) item->pos.y = baseRenderSize.y-item->size.y+item->crop.z; else @@ -3264,11 +3264,50 @@ LRESULT CALLBACK OBS::RenderFrameProc(HWND hwnd, UINT message, WPARAM wParam, LP scaleItem->size.x = scaleItem->startSize.x; break; + case ItemModifyType_CropTop: + scaleItem->crop.y = (frameStartMousePos.y - scaleItem->pos.y) + totalAdjust.y; + EnsureCropValid(scaleItem, minSize, snapSize, bControlDown); + break; + case ItemModifyType_CropBottom: scaleItem->crop.z = (scaleItem->pos.y + scaleItem->size.y - frameStartMousePos.y) - totalAdjust.y; EnsureCropValid(scaleItem, minSize, snapSize, bControlDown); break; + case ItemModifyType_CropLeft: + scaleItem->crop.x = (frameStartMousePos.x - scaleItem->pos.x) + totalAdjust.x; + EnsureCropValid(scaleItem, minSize, snapSize, bControlDown); + break; + + case ItemModifyType_CropRight: + scaleItem->crop.w = (scaleItem->pos.x + scaleItem->size.x - frameStartMousePos.x) - totalAdjust.x; + EnsureCropValid(scaleItem, minSize, snapSize, bControlDown); + break; + + case ItemModifyType_CropBottomLeft: + scaleItem->crop.z = (scaleItem->pos.y + scaleItem->size.y - frameStartMousePos.y) - totalAdjust.y; + scaleItem->crop.x = (frameStartMousePos.x - scaleItem->pos.x) + totalAdjust.x; + EnsureCropValid(scaleItem, minSize, snapSize, bControlDown); + break; + + case ItemModifyType_CropBottomRight: + scaleItem->crop.z = (scaleItem->pos.y + scaleItem->size.y - frameStartMousePos.y) - totalAdjust.y; + scaleItem->crop.w = (scaleItem->pos.x + scaleItem->size.x - frameStartMousePos.x) - totalAdjust.x; + EnsureCropValid(scaleItem, minSize, snapSize, bControlDown); + break; + + case ItemModifyType_CropTopLeft: + scaleItem->crop.y = (frameStartMousePos.y - scaleItem->pos.y) + totalAdjust.y; + scaleItem->crop.x = (frameStartMousePos.x - scaleItem->pos.x) + totalAdjust.x; + EnsureCropValid(scaleItem, minSize, snapSize, bControlDown); + break; + + case ItemModifyType_CropTopRight: + scaleItem->crop.y = (frameStartMousePos.y - scaleItem->pos.y) + totalAdjust.y; + scaleItem->crop.w = (scaleItem->pos.x + scaleItem->size.x - frameStartMousePos.x) - totalAdjust.x; + EnsureCropValid(scaleItem, minSize, snapSize, bControlDown); + break; + case ItemModifyType_ScaleTop: EnsureCropValid(scaleItem, minSize, snapSize, bControlDown); @@ -3292,11 +3331,6 @@ LRESULT CALLBACK OBS::RenderFrameProc(HWND hwnd, UINT message, WPARAM wParam, LP scaleItem->pos.y = scaleItem->startPos.y+totalAdjust.y; break; - case ItemModifyType_CropTop: - scaleItem->crop.x = (frameStartMousePos.y - scaleItem->pos.y) + totalAdjust.y; - EnsureCropValid(scaleItem, minSize, snapSize, bControlDown); - break; - case ItemModifyType_ScaleRight: EnsureCropValid(scaleItem, minSize, snapSize, bControlDown); @@ -3320,11 +3354,7 @@ LRESULT CALLBACK OBS::RenderFrameProc(HWND hwnd, UINT message, WPARAM wParam, LP else scaleItem->size.y = scaleItem->startSize.y; break; - case ItemModifyType_CropRight: - scaleItem->crop.y = (scaleItem->pos.x + scaleItem->size.x - frameStartMousePos.x) - totalAdjust.x; - EnsureCropValid(scaleItem, minSize, snapSize, bControlDown); - break; - + case ItemModifyType_ScaleLeft: EnsureCropValid(scaleItem, minSize, snapSize, bControlDown); @@ -3348,10 +3378,6 @@ LRESULT CALLBACK OBS::RenderFrameProc(HWND hwnd, UINT message, WPARAM wParam, LP totalAdjust.x = scaleItem->startSize.x-scaleItem->size.x; scaleItem->pos.x = scaleItem->startPos.x+totalAdjust.x; break; - case ItemModifyType_CropLeft: - scaleItem->crop.w = (frameStartMousePos.x - scaleItem->pos.x) + totalAdjust.x; - EnsureCropValid(scaleItem, minSize, snapSize, bControlDown); - break; case ItemModifyType_ScaleBottomRight: EnsureCropValid(scaleItem, minSize, snapSize, bControlDown); @@ -3386,11 +3412,6 @@ LRESULT CALLBACK OBS::RenderFrameProc(HWND hwnd, UINT message, WPARAM wParam, LP scaleItem->size.y = scaleItem->size.x/baseScaleAspect; } break; - case ItemModifyType_CropBottomRight: - scaleItem->crop.z = (scaleItem->pos.y + scaleItem->size.y - frameStartMousePos.y) - totalAdjust.y; - scaleItem->crop.y = (scaleItem->pos.x + scaleItem->size.x - frameStartMousePos.x) - totalAdjust.x; - EnsureCropValid(scaleItem, minSize, snapSize, bControlDown); - break; case ItemModifyType_ScaleTopLeft: EnsureCropValid(scaleItem, minSize, snapSize, bControlDown); @@ -3422,12 +3443,6 @@ LRESULT CALLBACK OBS::RenderFrameProc(HWND hwnd, UINT message, WPARAM wParam, LP scaleItem->pos = scaleItem->startPos+totalAdjust; break; - case ItemModifyType_CropTopLeft: - scaleItem->crop.x = (frameStartMousePos.y - scaleItem->pos.y) + totalAdjust.y; - scaleItem->crop.w = (frameStartMousePos.x - scaleItem->pos.x) + totalAdjust.x; - EnsureCropValid(scaleItem, minSize, snapSize, bControlDown); - break; - case ItemModifyType_ScaleBottomLeft: EnsureCropValid(scaleItem, minSize, snapSize, bControlDown); @@ -3464,12 +3479,6 @@ LRESULT CALLBACK OBS::RenderFrameProc(HWND hwnd, UINT message, WPARAM wParam, LP scaleItem->pos.x = scaleItem->startPos.x+totalAdjust.x; break; - case ItemModifyType_CropBottomLeft: - scaleItem->crop.z = (scaleItem->pos.y + scaleItem->size.y - frameStartMousePos.y) - totalAdjust.y; - scaleItem->crop.w = (frameStartMousePos.x - scaleItem->pos.x) + totalAdjust.x; - EnsureCropValid(scaleItem, minSize, snapSize, bControlDown); - break; - case ItemModifyType_ScaleTopRight: EnsureCropValid(scaleItem, minSize, snapSize, bControlDown); @@ -3506,11 +3515,6 @@ LRESULT CALLBACK OBS::RenderFrameProc(HWND hwnd, UINT message, WPARAM wParam, LP scaleItem->pos.y = scaleItem->startPos.y+totalAdjust.y; break; - case ItemModifyType_CropTopRight: - scaleItem->crop.x = (frameStartMousePos.y - scaleItem->pos.y) + totalAdjust.y; - scaleItem->crop.y = (scaleItem->pos.x + scaleItem->size.x - frameStartMousePos.x) - totalAdjust.x; - EnsureCropValid(scaleItem, minSize, snapSize, bControlDown); - break; } App->lastMousePos = mousePos; @@ -3628,9 +3632,9 @@ LRESULT CALLBACK OBS::RenderFrameProc(HWND hwnd, UINT message, WPARAM wParam, LP itemElement->SetInt(TEXT("y"), int(item->pos.y)); itemElement->SetInt(TEXT("cx"), int(item->size.x)); itemElement->SetInt(TEXT("cy"), int(item->size.y)); - itemElement->SetFloat(TEXT("crop.left"), item->crop.w); - itemElement->SetFloat(TEXT("crop.top"), item->crop.x); - itemElement->SetFloat(TEXT("crop.right"), item->crop.y); + itemElement->SetFloat(TEXT("crop.left"), item->crop.x); + itemElement->SetFloat(TEXT("crop.top"), item->crop.y); + itemElement->SetFloat(TEXT("crop.right"), item->crop.w); itemElement->SetFloat(TEXT("crop.bottom"), item->crop.z); }