mirror of
https://bitbucket.org/mfeemster/fractorium.git
synced 2025-02-01 10:30:08 -05:00
Fix randomization of post affines.
-Bug fixes: --Make post affines properly randomize. -Code changes: --Use references rather than pointers when grabbing pre/post affines.
This commit is contained in:
parent
991275a656
commit
ad336bb2b7
@ -246,7 +246,7 @@ void FractoriumEmberController<T>::AffineSetHelper(double d, int index, bool pre
|
||||
{
|
||||
UpdateXform([&] (Xform<T>* xform)
|
||||
{
|
||||
auto affine = pre ? &xform->m_Affine : &xform->m_Post;
|
||||
auto& affine = pre ? xform->m_Affine : xform->m_Post;
|
||||
DoubleSpinBox** spinners = pre ? m_Fractorium->m_PreSpins : m_Fractorium->m_PostSpins;
|
||||
|
||||
if (m_Fractorium->ui.PolarAffineCheckBox->isChecked())
|
||||
@ -255,21 +255,21 @@ void FractoriumEmberController<T>::AffineSetHelper(double d, int index, bool pre
|
||||
{
|
||||
case 0:
|
||||
case 3:
|
||||
affine->A(cos(spinners[0]->value() * DEG_2_RAD) * spinners[3]->value());
|
||||
affine->D(sin(spinners[0]->value() * DEG_2_RAD) * spinners[3]->value());
|
||||
affine.A(cos(spinners[0]->value() * DEG_2_RAD) * spinners[3]->value());
|
||||
affine.D(sin(spinners[0]->value() * DEG_2_RAD) * spinners[3]->value());
|
||||
break;
|
||||
|
||||
case 1:
|
||||
case 4:
|
||||
affine->B(cos(spinners[1]->value() * DEG_2_RAD) * spinners[4]->value());
|
||||
affine->E(sin(spinners[1]->value() * DEG_2_RAD) * spinners[4]->value());
|
||||
affine.B(cos(spinners[1]->value() * DEG_2_RAD) * spinners[4]->value());
|
||||
affine.E(sin(spinners[1]->value() * DEG_2_RAD) * spinners[4]->value());
|
||||
break;
|
||||
|
||||
case 2:
|
||||
case 5:
|
||||
default:
|
||||
affine->C(cos(spinners[2]->value() * DEG_2_RAD) * spinners[5]->value());
|
||||
affine->F(sin(spinners[2]->value() * DEG_2_RAD) * spinners[5]->value());
|
||||
affine.C(cos(spinners[2]->value() * DEG_2_RAD) * spinners[5]->value());
|
||||
affine.F(sin(spinners[2]->value() * DEG_2_RAD) * spinners[5]->value());
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -278,27 +278,27 @@ void FractoriumEmberController<T>::AffineSetHelper(double d, int index, bool pre
|
||||
switch (index)
|
||||
{
|
||||
case 0:
|
||||
affine->A(d);
|
||||
affine.A(d);
|
||||
break;
|
||||
|
||||
case 1:
|
||||
affine->B(d);
|
||||
affine.B(d);
|
||||
break;
|
||||
|
||||
case 2:
|
||||
affine->C(d);
|
||||
affine.C(d);
|
||||
break;
|
||||
|
||||
case 3:
|
||||
affine->D(d);
|
||||
affine.D(d);
|
||||
break;
|
||||
|
||||
case 4:
|
||||
affine->E(d);
|
||||
affine.E(d);
|
||||
break;
|
||||
|
||||
case 5:
|
||||
affine->F(d);
|
||||
affine.F(d);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -328,24 +328,24 @@ void FractoriumEmberController<T>::FlipXforms(bool horizontal, bool vertical, bo
|
||||
{
|
||||
UpdateXform([&] (Xform<T>* xform)
|
||||
{
|
||||
auto affine = pre ? &xform->m_Affine : &xform->m_Post;
|
||||
auto& affine = pre ? xform->m_Affine : xform->m_Post;
|
||||
|
||||
if (horizontal)
|
||||
{
|
||||
affine->A(-affine->A());
|
||||
affine->B(-affine->B());
|
||||
affine.A(-affine.A());
|
||||
affine.B(-affine.B());
|
||||
|
||||
if (!m_Fractorium->LocalPivot())
|
||||
affine->C(-affine->C());
|
||||
affine.C(-affine.C());
|
||||
}
|
||||
|
||||
if (vertical)
|
||||
{
|
||||
affine->D(-affine->D());
|
||||
affine->E(-affine->E());
|
||||
affine.D(-affine.D());
|
||||
affine.E(-affine.E());
|
||||
|
||||
if (!m_Fractorium->LocalPivot())
|
||||
affine->F(-affine->F());
|
||||
affine.F(-affine.F());
|
||||
}
|
||||
}, eXformUpdate::UPDATE_SELECTED);
|
||||
FillAffineWithXform(CurrentXform(), pre);
|
||||
@ -365,8 +365,8 @@ void FractoriumEmberController<T>::RotateXformsByAngle(double angle, bool pre)
|
||||
{
|
||||
UpdateXform([&] (Xform<T>* xform)
|
||||
{
|
||||
auto affine = pre ? &xform->m_Affine : &xform->m_Post;
|
||||
affine->Rotate(angle * DEG_2_RAD_T);
|
||||
auto& affine = pre ? xform->m_Affine : xform->m_Post;
|
||||
affine.Rotate(angle * DEG_2_RAD_T);
|
||||
}, eXformUpdate::UPDATE_SELECTED);
|
||||
FillAffineWithXform(CurrentXform(), pre);
|
||||
}
|
||||
@ -426,9 +426,9 @@ void FractoriumEmberController<T>::MoveXforms(double x, double y, bool pre)
|
||||
{
|
||||
UpdateXform([&] (Xform<T>* xform)
|
||||
{
|
||||
auto affine = pre ? &xform->m_Affine : &xform->m_Post;
|
||||
affine->C(affine->C() + x);
|
||||
affine->F(affine->F() + y);
|
||||
auto& affine = pre ? xform->m_Affine : xform->m_Post;
|
||||
affine.C(affine.C() + x);
|
||||
affine.F(affine.F() + y);
|
||||
}, eXformUpdate::UPDATE_SELECTED);
|
||||
FillAffineWithXform(CurrentXform(), pre);
|
||||
}
|
||||
@ -512,11 +512,11 @@ void FractoriumEmberController<T>::ScaleXforms(double scale, bool pre)
|
||||
{
|
||||
UpdateXform([&] (Xform<T>* xform)
|
||||
{
|
||||
auto affine = pre ? &xform->m_Affine : &xform->m_Post;
|
||||
affine->A(affine->A() * scale);
|
||||
affine->B(affine->B() * scale);
|
||||
affine->D(affine->D() * scale);
|
||||
affine->E(affine->E() * scale);
|
||||
auto& affine = pre ? xform->m_Affine : xform->m_Post;
|
||||
affine.A(affine.A() * scale);
|
||||
affine.B(affine.B() * scale);
|
||||
affine.D(affine.D() * scale);
|
||||
affine.E(affine.E() * scale);
|
||||
}, eXformUpdate::UPDATE_SELECTED);
|
||||
FillAffineWithXform(CurrentXform(), pre);
|
||||
}
|
||||
@ -565,8 +565,8 @@ void FractoriumEmberController<T>::ResetXformsAffine(bool pre)
|
||||
{
|
||||
UpdateXform([&] (Xform<T>* xform)
|
||||
{
|
||||
auto affine = pre ? &xform->m_Affine : &xform->m_Post;
|
||||
affine->MakeID();
|
||||
auto& affine = pre ? xform->m_Affine : xform->m_Post;
|
||||
affine.MakeID();
|
||||
}, eXformUpdate::UPDATE_SELECTED);
|
||||
FillAffineWithXform(CurrentXform(), pre);
|
||||
}
|
||||
@ -583,13 +583,13 @@ void FractoriumEmberController<T>::RandomXformsAffine(bool pre)
|
||||
{
|
||||
UpdateXform([&](Xform<T>* xform)
|
||||
{
|
||||
auto affine = pre ? &xform->m_Affine : &xform->m_Post;
|
||||
xform->m_Affine.A(m_Rand.Frand11<T>());
|
||||
xform->m_Affine.B(m_Rand.Frand11<T>());
|
||||
xform->m_Affine.C(m_Rand.Frand11<T>());
|
||||
xform->m_Affine.D(m_Rand.Frand11<T>());
|
||||
xform->m_Affine.E(m_Rand.Frand11<T>());
|
||||
xform->m_Affine.F(m_Rand.Frand11<T>());
|
||||
auto& affine = pre ? xform->m_Affine : xform->m_Post;
|
||||
affine.A(m_Rand.Frand11<T>());
|
||||
affine.B(m_Rand.Frand11<T>());
|
||||
affine.C(m_Rand.Frand11<T>());
|
||||
affine.D(m_Rand.Frand11<T>());
|
||||
affine.E(m_Rand.Frand11<T>());
|
||||
affine.F(m_Rand.Frand11<T>());
|
||||
}, eXformUpdate::UPDATE_SELECTED);
|
||||
FillAffineWithXform(CurrentXform(), pre);
|
||||
}
|
||||
|
@ -871,11 +871,11 @@ void GLEmberController<T>::DrawAffine(Xform<T>* xform, bool pre, bool selected)
|
||||
auto index = ember->GetXformIndex(xform);
|
||||
auto size = ember->m_Palette.m_Entries.size();
|
||||
auto color = ember->m_Palette.m_Entries[Clamp<T>(xform->m_ColorX * size, 0, size - 1)];
|
||||
auto affine = pre ? &xform->m_Affine : &xform->m_Post;
|
||||
auto& affine = pre ? xform->m_Affine : xform->m_Post;
|
||||
//For some incredibly strange reason, even though glm and OpenGL use matrices with a column-major
|
||||
//data layout, nothing will work here unless they are flipped to row major order. This is how it was
|
||||
//done in Fractron.
|
||||
m4T mat = (*affine * m_FractoriumEmberController->AffineScaleCurrentToLocked()).ToMat4RowMajor();
|
||||
m4T mat = (affine * m_FractoriumEmberController->AffineScaleCurrentToLocked()).ToMat4RowMajor();
|
||||
m_GL->glPushMatrix();
|
||||
m_GL->glLoadIdentity();
|
||||
MultMatrix(mat);
|
||||
@ -1184,7 +1184,7 @@ void GLEmberController<T>::CalcDragXAxis()
|
||||
T angle = startAngle - endAngle;
|
||||
m_FractoriumEmberController->UpdateXform([&](Xform<T>* xform)
|
||||
{
|
||||
auto affine = pre ? &xform->m_Affine : &xform->m_Post;
|
||||
auto& affine = pre ? xform->m_Affine : xform->m_Post;
|
||||
auto srcRotated = m_DragSrcTransforms[index++];
|
||||
|
||||
if (worldPivotShiftAlt)
|
||||
@ -1192,21 +1192,21 @@ void GLEmberController<T>::CalcDragXAxis()
|
||||
srcRotated.X(srcRotated.O() + srcRotated.X());
|
||||
srcRotated.O(v2T(0));
|
||||
srcRotated.Rotate(angle);
|
||||
affine->X(srcRotated.X() - affine->O());
|
||||
affine.X(srcRotated.X() - affine.O());
|
||||
}
|
||||
else if (GetAlt())
|
||||
{
|
||||
srcRotated.Rotate(angle);
|
||||
affine->X(srcRotated.X());
|
||||
affine.X(srcRotated.X());
|
||||
}
|
||||
else
|
||||
{
|
||||
srcRotated.Rotate(angle);
|
||||
*affine = srcRotated;
|
||||
affine = srcRotated;
|
||||
}
|
||||
|
||||
if (xform == m_FractoriumEmberController->CurrentXform())
|
||||
m_DragHandlePos = v3T((affine->O() + affine->X()) * scaleBack, 0);
|
||||
m_DragHandlePos = v3T((affine.O() + affine.X()) * scaleBack, 0);
|
||||
}, eXformUpdate::UPDATE_CURRENT_AND_SELECTED, false);//Calling code will update renderer.
|
||||
}
|
||||
else
|
||||
@ -1222,16 +1222,16 @@ void GLEmberController<T>::CalcDragXAxis()
|
||||
auto origXPlusOff = v3T(m_DragSrcTransform.X(), 0) + (diff * scale);
|
||||
m_FractoriumEmberController->UpdateXform([&](Xform<T>* xform)
|
||||
{
|
||||
auto affine = pre ? &xform->m_Affine : &xform->m_Post;
|
||||
auto& affine = pre ? xform->m_Affine : xform->m_Post;
|
||||
auto axis = v3T(m_DragSrcTransforms[index++].X(), 0) + (diff * scale);
|
||||
|
||||
if (GetAlt())
|
||||
affine->X(v2T(origXPlusOff));//Absolute, not ratio.
|
||||
affine.X(v2T(origXPlusOff));//Absolute, not ratio.
|
||||
else
|
||||
affine->RotateScaleXTo(v2T(axis));
|
||||
affine.RotateScaleXTo(v2T(axis));
|
||||
|
||||
if (xform == m_FractoriumEmberController->CurrentXform())
|
||||
m_DragHandlePos = v3T((affine->O() + affine->X()) * scaleBack, 0);
|
||||
m_DragHandlePos = v3T((affine.O() + affine.X()) * scaleBack, 0);
|
||||
}, eXformUpdate::UPDATE_CURRENT_AND_SELECTED, false);
|
||||
}
|
||||
}
|
||||
@ -1274,7 +1274,7 @@ void GLEmberController<T>::CalcDragYAxis()
|
||||
T angle = startAngle - endAngle;
|
||||
m_FractoriumEmberController->UpdateXform([&](Xform<T>* xform)
|
||||
{
|
||||
auto affine = pre ? &xform->m_Affine : &xform->m_Post;
|
||||
auto& affine = pre ? xform->m_Affine : xform->m_Post;
|
||||
auto srcRotated = m_DragSrcTransforms[index++];
|
||||
|
||||
if (worldPivotShiftAlt)
|
||||
@ -1282,21 +1282,21 @@ void GLEmberController<T>::CalcDragYAxis()
|
||||
srcRotated.Y(srcRotated.O() + srcRotated.Y());
|
||||
srcRotated.O(v2T(0));
|
||||
srcRotated.Rotate(angle);
|
||||
affine->Y(srcRotated.Y() - affine->O());
|
||||
affine.Y(srcRotated.Y() - affine.O());
|
||||
}
|
||||
else if (GetAlt())
|
||||
{
|
||||
srcRotated.Rotate(angle);
|
||||
affine->Y(srcRotated.Y());
|
||||
affine.Y(srcRotated.Y());
|
||||
}
|
||||
else
|
||||
{
|
||||
srcRotated.Rotate(angle);
|
||||
*affine = srcRotated;
|
||||
affine = srcRotated;
|
||||
}
|
||||
|
||||
if (xform == m_FractoriumEmberController->CurrentXform())
|
||||
m_DragHandlePos = v3T((affine->O() + affine->Y()) * scaleBack, 0);
|
||||
m_DragHandlePos = v3T((affine.O() + affine.Y()) * scaleBack, 0);
|
||||
}, eXformUpdate::UPDATE_CURRENT_AND_SELECTED, false);//Calling code will update renderer.
|
||||
}
|
||||
else
|
||||
@ -1312,16 +1312,16 @@ void GLEmberController<T>::CalcDragYAxis()
|
||||
auto origXPlusOff = v3T(m_DragSrcTransform.Y(), 0) + (diff * scale);
|
||||
m_FractoriumEmberController->UpdateXform([&](Xform<T>* xform)
|
||||
{
|
||||
auto affine = pre ? &xform->m_Affine : &xform->m_Post;
|
||||
auto& affine = pre ? xform->m_Affine : xform->m_Post;
|
||||
auto axis = v3T(m_DragSrcTransforms[index++].Y(), 0) + (diff * scale);
|
||||
|
||||
if (GetAlt())
|
||||
affine->Y(v2T(origXPlusOff));//Absolute, not ratio.
|
||||
affine.Y(v2T(origXPlusOff));//Absolute, not ratio.
|
||||
else
|
||||
affine->RotateScaleYTo(v2T(axis));
|
||||
affine.RotateScaleYTo(v2T(axis));
|
||||
|
||||
if (xform == m_FractoriumEmberController->CurrentXform())
|
||||
m_DragHandlePos = v3T((affine->O() + affine->Y()) * scaleBack, 0);
|
||||
m_DragHandlePos = v3T((affine.O() + affine.Y()) * scaleBack, 0);
|
||||
}, eXformUpdate::UPDATE_CURRENT_AND_SELECTED, false);
|
||||
}
|
||||
}
|
||||
@ -1356,18 +1356,18 @@ void GLEmberController<T>::CalcDragTranslation()
|
||||
T angle = startAngle - endAngle;
|
||||
m_FractoriumEmberController->UpdateXform([&](Xform<T>* xform)
|
||||
{
|
||||
auto affine = pre ? &xform->m_Affine : &xform->m_Post;
|
||||
auto& affine = pre ? xform->m_Affine : xform->m_Post;
|
||||
auto srcRotated = m_DragSrcTransforms[index++];
|
||||
srcRotated.RotateTrans(angle);
|
||||
|
||||
if (worldPivotShift)
|
||||
{
|
||||
srcRotated.Rotate(angle);
|
||||
affine->X(srcRotated.X());
|
||||
affine->Y(srcRotated.Y());
|
||||
affine.X(srcRotated.X());
|
||||
affine.Y(srcRotated.Y());
|
||||
}
|
||||
|
||||
affine->O(srcRotated.O());
|
||||
affine.O(srcRotated.O());
|
||||
|
||||
if (xform == m_FractoriumEmberController->CurrentXform())
|
||||
m_DragHandlePos = v3T(srcRotated.O(), 0) * scaleBack;
|
||||
@ -1381,10 +1381,10 @@ void GLEmberController<T>::CalcDragTranslation()
|
||||
{
|
||||
m_FractoriumEmberController->UpdateXform([&](Xform<T>* xform)
|
||||
{
|
||||
auto affine = pre ? &xform->m_Affine : &xform->m_Post;
|
||||
auto& affine = pre ? xform->m_Affine : xform->m_Post;
|
||||
auto offset = m_DragSrcTransforms[index++].O() + (scale * v2T(diff));
|
||||
auto snapped = SnapToGrid(offset);
|
||||
affine->O(v2T(snapped.x, snapped.y));
|
||||
affine.O(v2T(snapped.x, snapped.y));
|
||||
}, eXformUpdate::UPDATE_CURRENT_AND_SELECTED, false);
|
||||
m_DragHandlePos = SnapToGrid(m_MouseWorldPos);
|
||||
}
|
||||
@ -1392,8 +1392,8 @@ void GLEmberController<T>::CalcDragTranslation()
|
||||
{
|
||||
m_FractoriumEmberController->UpdateXform([&](Xform<T>* xform)
|
||||
{
|
||||
auto affine = pre ? &xform->m_Affine : &xform->m_Post;
|
||||
affine->O(m_DragSrcTransforms[index++].O() + (scale * v2T(diff)));
|
||||
auto& affine = pre ? xform->m_Affine : xform->m_Post;
|
||||
affine.O(m_DragSrcTransforms[index++].O() + (scale * v2T(diff)));
|
||||
}, eXformUpdate::UPDATE_CURRENT_AND_SELECTED, false);
|
||||
m_DragHandlePos = m_MouseWorldPos;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user