Cropping code cleanup, fix for cropping textures with inverted texture coords
This commit is contained in:
parent
1313b3961c
commit
e9037cfd5a
@ -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));
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user