Cropping code cleanup, fix for cropping textures with inverted texture coords

This commit is contained in:
paibox 2013-05-05 02:27:44 +02:00
parent 1313b3961c
commit e9037cfd5a
3 changed files with 93 additions and 77 deletions

View File

@ -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));

View File

@ -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;

View File

@ -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);
}