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:
Matt Feemster 2016-05-24 07:02:05 -07:00
parent 991275a656
commit ad336bb2b7
2 changed files with 67 additions and 67 deletions

View File

@ -246,7 +246,7 @@ void FractoriumEmberController<T>::AffineSetHelper(double d, int index, bool pre
{ {
UpdateXform([&] (Xform<T>* xform) 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; DoubleSpinBox** spinners = pre ? m_Fractorium->m_PreSpins : m_Fractorium->m_PostSpins;
if (m_Fractorium->ui.PolarAffineCheckBox->isChecked()) if (m_Fractorium->ui.PolarAffineCheckBox->isChecked())
@ -255,21 +255,21 @@ void FractoriumEmberController<T>::AffineSetHelper(double d, int index, bool pre
{ {
case 0: case 0:
case 3: case 3:
affine->A(cos(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()); affine.D(sin(spinners[0]->value() * DEG_2_RAD) * spinners[3]->value());
break; break;
case 1: case 1:
case 4: case 4:
affine->B(cos(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()); affine.E(sin(spinners[1]->value() * DEG_2_RAD) * spinners[4]->value());
break; break;
case 2: case 2:
case 5: case 5:
default: default:
affine->C(cos(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()); affine.F(sin(spinners[2]->value() * DEG_2_RAD) * spinners[5]->value());
break; break;
} }
} }
@ -278,27 +278,27 @@ void FractoriumEmberController<T>::AffineSetHelper(double d, int index, bool pre
switch (index) switch (index)
{ {
case 0: case 0:
affine->A(d); affine.A(d);
break; break;
case 1: case 1:
affine->B(d); affine.B(d);
break; break;
case 2: case 2:
affine->C(d); affine.C(d);
break; break;
case 3: case 3:
affine->D(d); affine.D(d);
break; break;
case 4: case 4:
affine->E(d); affine.E(d);
break; break;
case 5: case 5:
affine->F(d); affine.F(d);
break; break;
} }
} }
@ -328,24 +328,24 @@ void FractoriumEmberController<T>::FlipXforms(bool horizontal, bool vertical, bo
{ {
UpdateXform([&] (Xform<T>* xform) UpdateXform([&] (Xform<T>* xform)
{ {
auto affine = pre ? &xform->m_Affine : &xform->m_Post; auto& affine = pre ? xform->m_Affine : xform->m_Post;
if (horizontal) if (horizontal)
{ {
affine->A(-affine->A()); affine.A(-affine.A());
affine->B(-affine->B()); affine.B(-affine.B());
if (!m_Fractorium->LocalPivot()) if (!m_Fractorium->LocalPivot())
affine->C(-affine->C()); affine.C(-affine.C());
} }
if (vertical) if (vertical)
{ {
affine->D(-affine->D()); affine.D(-affine.D());
affine->E(-affine->E()); affine.E(-affine.E());
if (!m_Fractorium->LocalPivot()) if (!m_Fractorium->LocalPivot())
affine->F(-affine->F()); affine.F(-affine.F());
} }
}, eXformUpdate::UPDATE_SELECTED); }, eXformUpdate::UPDATE_SELECTED);
FillAffineWithXform(CurrentXform(), pre); FillAffineWithXform(CurrentXform(), pre);
@ -365,8 +365,8 @@ void FractoriumEmberController<T>::RotateXformsByAngle(double angle, bool pre)
{ {
UpdateXform([&] (Xform<T>* xform) UpdateXform([&] (Xform<T>* xform)
{ {
auto affine = pre ? &xform->m_Affine : &xform->m_Post; auto& affine = pre ? xform->m_Affine : xform->m_Post;
affine->Rotate(angle * DEG_2_RAD_T); affine.Rotate(angle * DEG_2_RAD_T);
}, eXformUpdate::UPDATE_SELECTED); }, eXformUpdate::UPDATE_SELECTED);
FillAffineWithXform(CurrentXform(), pre); FillAffineWithXform(CurrentXform(), pre);
} }
@ -426,9 +426,9 @@ void FractoriumEmberController<T>::MoveXforms(double x, double y, bool pre)
{ {
UpdateXform([&] (Xform<T>* xform) UpdateXform([&] (Xform<T>* xform)
{ {
auto affine = pre ? &xform->m_Affine : &xform->m_Post; auto& affine = pre ? xform->m_Affine : xform->m_Post;
affine->C(affine->C() + x); affine.C(affine.C() + x);
affine->F(affine->F() + y); affine.F(affine.F() + y);
}, eXformUpdate::UPDATE_SELECTED); }, eXformUpdate::UPDATE_SELECTED);
FillAffineWithXform(CurrentXform(), pre); FillAffineWithXform(CurrentXform(), pre);
} }
@ -512,11 +512,11 @@ void FractoriumEmberController<T>::ScaleXforms(double scale, bool pre)
{ {
UpdateXform([&] (Xform<T>* xform) UpdateXform([&] (Xform<T>* xform)
{ {
auto affine = pre ? &xform->m_Affine : &xform->m_Post; auto& affine = pre ? xform->m_Affine : xform->m_Post;
affine->A(affine->A() * scale); affine.A(affine.A() * scale);
affine->B(affine->B() * scale); affine.B(affine.B() * scale);
affine->D(affine->D() * scale); affine.D(affine.D() * scale);
affine->E(affine->E() * scale); affine.E(affine.E() * scale);
}, eXformUpdate::UPDATE_SELECTED); }, eXformUpdate::UPDATE_SELECTED);
FillAffineWithXform(CurrentXform(), pre); FillAffineWithXform(CurrentXform(), pre);
} }
@ -565,8 +565,8 @@ void FractoriumEmberController<T>::ResetXformsAffine(bool pre)
{ {
UpdateXform([&] (Xform<T>* xform) UpdateXform([&] (Xform<T>* xform)
{ {
auto affine = pre ? &xform->m_Affine : &xform->m_Post; auto& affine = pre ? xform->m_Affine : xform->m_Post;
affine->MakeID(); affine.MakeID();
}, eXformUpdate::UPDATE_SELECTED); }, eXformUpdate::UPDATE_SELECTED);
FillAffineWithXform(CurrentXform(), pre); FillAffineWithXform(CurrentXform(), pre);
} }
@ -583,13 +583,13 @@ void FractoriumEmberController<T>::RandomXformsAffine(bool pre)
{ {
UpdateXform([&](Xform<T>* xform) UpdateXform([&](Xform<T>* xform)
{ {
auto affine = pre ? &xform->m_Affine : &xform->m_Post; auto& affine = pre ? xform->m_Affine : xform->m_Post;
xform->m_Affine.A(m_Rand.Frand11<T>()); affine.A(m_Rand.Frand11<T>());
xform->m_Affine.B(m_Rand.Frand11<T>()); affine.B(m_Rand.Frand11<T>());
xform->m_Affine.C(m_Rand.Frand11<T>()); affine.C(m_Rand.Frand11<T>());
xform->m_Affine.D(m_Rand.Frand11<T>()); affine.D(m_Rand.Frand11<T>());
xform->m_Affine.E(m_Rand.Frand11<T>()); affine.E(m_Rand.Frand11<T>());
xform->m_Affine.F(m_Rand.Frand11<T>()); affine.F(m_Rand.Frand11<T>());
}, eXformUpdate::UPDATE_SELECTED); }, eXformUpdate::UPDATE_SELECTED);
FillAffineWithXform(CurrentXform(), pre); FillAffineWithXform(CurrentXform(), pre);
} }

View File

@ -871,11 +871,11 @@ void GLEmberController<T>::DrawAffine(Xform<T>* xform, bool pre, bool selected)
auto index = ember->GetXformIndex(xform); auto index = ember->GetXformIndex(xform);
auto size = ember->m_Palette.m_Entries.size(); 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 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 //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 //data layout, nothing will work here unless they are flipped to row major order. This is how it was
//done in Fractron. //done in Fractron.
m4T mat = (*affine * m_FractoriumEmberController->AffineScaleCurrentToLocked()).ToMat4RowMajor(); m4T mat = (affine * m_FractoriumEmberController->AffineScaleCurrentToLocked()).ToMat4RowMajor();
m_GL->glPushMatrix(); m_GL->glPushMatrix();
m_GL->glLoadIdentity(); m_GL->glLoadIdentity();
MultMatrix(mat); MultMatrix(mat);
@ -1184,7 +1184,7 @@ void GLEmberController<T>::CalcDragXAxis()
T angle = startAngle - endAngle; T angle = startAngle - endAngle;
m_FractoriumEmberController->UpdateXform([&](Xform<T>* xform) 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++]; auto srcRotated = m_DragSrcTransforms[index++];
if (worldPivotShiftAlt) if (worldPivotShiftAlt)
@ -1192,21 +1192,21 @@ void GLEmberController<T>::CalcDragXAxis()
srcRotated.X(srcRotated.O() + srcRotated.X()); srcRotated.X(srcRotated.O() + srcRotated.X());
srcRotated.O(v2T(0)); srcRotated.O(v2T(0));
srcRotated.Rotate(angle); srcRotated.Rotate(angle);
affine->X(srcRotated.X() - affine->O()); affine.X(srcRotated.X() - affine.O());
} }
else if (GetAlt()) else if (GetAlt())
{ {
srcRotated.Rotate(angle); srcRotated.Rotate(angle);
affine->X(srcRotated.X()); affine.X(srcRotated.X());
} }
else else
{ {
srcRotated.Rotate(angle); srcRotated.Rotate(angle);
*affine = srcRotated; affine = srcRotated;
} }
if (xform == m_FractoriumEmberController->CurrentXform()) 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. }, eXformUpdate::UPDATE_CURRENT_AND_SELECTED, false);//Calling code will update renderer.
} }
else else
@ -1222,16 +1222,16 @@ void GLEmberController<T>::CalcDragXAxis()
auto origXPlusOff = v3T(m_DragSrcTransform.X(), 0) + (diff * scale); auto origXPlusOff = v3T(m_DragSrcTransform.X(), 0) + (diff * scale);
m_FractoriumEmberController->UpdateXform([&](Xform<T>* xform) 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); auto axis = v3T(m_DragSrcTransforms[index++].X(), 0) + (diff * scale);
if (GetAlt()) if (GetAlt())
affine->X(v2T(origXPlusOff));//Absolute, not ratio. affine.X(v2T(origXPlusOff));//Absolute, not ratio.
else else
affine->RotateScaleXTo(v2T(axis)); affine.RotateScaleXTo(v2T(axis));
if (xform == m_FractoriumEmberController->CurrentXform()) 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); }, eXformUpdate::UPDATE_CURRENT_AND_SELECTED, false);
} }
} }
@ -1274,7 +1274,7 @@ void GLEmberController<T>::CalcDragYAxis()
T angle = startAngle - endAngle; T angle = startAngle - endAngle;
m_FractoriumEmberController->UpdateXform([&](Xform<T>* xform) 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++]; auto srcRotated = m_DragSrcTransforms[index++];
if (worldPivotShiftAlt) if (worldPivotShiftAlt)
@ -1282,21 +1282,21 @@ void GLEmberController<T>::CalcDragYAxis()
srcRotated.Y(srcRotated.O() + srcRotated.Y()); srcRotated.Y(srcRotated.O() + srcRotated.Y());
srcRotated.O(v2T(0)); srcRotated.O(v2T(0));
srcRotated.Rotate(angle); srcRotated.Rotate(angle);
affine->Y(srcRotated.Y() - affine->O()); affine.Y(srcRotated.Y() - affine.O());
} }
else if (GetAlt()) else if (GetAlt())
{ {
srcRotated.Rotate(angle); srcRotated.Rotate(angle);
affine->Y(srcRotated.Y()); affine.Y(srcRotated.Y());
} }
else else
{ {
srcRotated.Rotate(angle); srcRotated.Rotate(angle);
*affine = srcRotated; affine = srcRotated;
} }
if (xform == m_FractoriumEmberController->CurrentXform()) 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. }, eXformUpdate::UPDATE_CURRENT_AND_SELECTED, false);//Calling code will update renderer.
} }
else else
@ -1312,16 +1312,16 @@ void GLEmberController<T>::CalcDragYAxis()
auto origXPlusOff = v3T(m_DragSrcTransform.Y(), 0) + (diff * scale); auto origXPlusOff = v3T(m_DragSrcTransform.Y(), 0) + (diff * scale);
m_FractoriumEmberController->UpdateXform([&](Xform<T>* xform) 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); auto axis = v3T(m_DragSrcTransforms[index++].Y(), 0) + (diff * scale);
if (GetAlt()) if (GetAlt())
affine->Y(v2T(origXPlusOff));//Absolute, not ratio. affine.Y(v2T(origXPlusOff));//Absolute, not ratio.
else else
affine->RotateScaleYTo(v2T(axis)); affine.RotateScaleYTo(v2T(axis));
if (xform == m_FractoriumEmberController->CurrentXform()) 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); }, eXformUpdate::UPDATE_CURRENT_AND_SELECTED, false);
} }
} }
@ -1356,18 +1356,18 @@ void GLEmberController<T>::CalcDragTranslation()
T angle = startAngle - endAngle; T angle = startAngle - endAngle;
m_FractoriumEmberController->UpdateXform([&](Xform<T>* xform) 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++]; auto srcRotated = m_DragSrcTransforms[index++];
srcRotated.RotateTrans(angle); srcRotated.RotateTrans(angle);
if (worldPivotShift) if (worldPivotShift)
{ {
srcRotated.Rotate(angle); srcRotated.Rotate(angle);
affine->X(srcRotated.X()); affine.X(srcRotated.X());
affine->Y(srcRotated.Y()); affine.Y(srcRotated.Y());
} }
affine->O(srcRotated.O()); affine.O(srcRotated.O());
if (xform == m_FractoriumEmberController->CurrentXform()) if (xform == m_FractoriumEmberController->CurrentXform())
m_DragHandlePos = v3T(srcRotated.O(), 0) * scaleBack; m_DragHandlePos = v3T(srcRotated.O(), 0) * scaleBack;
@ -1381,10 +1381,10 @@ void GLEmberController<T>::CalcDragTranslation()
{ {
m_FractoriumEmberController->UpdateXform([&](Xform<T>* xform) 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 offset = m_DragSrcTransforms[index++].O() + (scale * v2T(diff));
auto snapped = SnapToGrid(offset); auto snapped = SnapToGrid(offset);
affine->O(v2T(snapped.x, snapped.y)); affine.O(v2T(snapped.x, snapped.y));
}, eXformUpdate::UPDATE_CURRENT_AND_SELECTED, false); }, eXformUpdate::UPDATE_CURRENT_AND_SELECTED, false);
m_DragHandlePos = SnapToGrid(m_MouseWorldPos); m_DragHandlePos = SnapToGrid(m_MouseWorldPos);
} }
@ -1392,8 +1392,8 @@ void GLEmberController<T>::CalcDragTranslation()
{ {
m_FractoriumEmberController->UpdateXform([&](Xform<T>* xform) m_FractoriumEmberController->UpdateXform([&](Xform<T>* xform)
{ {
auto affine = pre ? &xform->m_Affine : &xform->m_Post; auto& affine = pre ? xform->m_Affine : xform->m_Post;
affine->O(m_DragSrcTransforms[index++].O() + (scale * v2T(diff))); affine.O(m_DragSrcTransforms[index++].O() + (scale * v2T(diff)));
}, eXformUpdate::UPDATE_CURRENT_AND_SELECTED, false); }, eXformUpdate::UPDATE_CURRENT_AND_SELECTED, false);
m_DragHandlePos = m_MouseWorldPos; m_DragHandlePos = m_MouseWorldPos;
} }