void ModificationWidget::ApplyRotateValues(ST_Axis axis) { DAVA::float32 x = DAVA::DegToRad(xAxisModify->value()); DAVA::float32 y = DAVA::DegToRad(yAxisModify->value()); DAVA::float32 z = DAVA::DegToRad(zAxisModify->value()); if(NULL != curScene) { EntityGroup selection = curScene->selectionSystem->GetSelection(); if(selection.Size() > 1) { curScene->BeginBatch("Multiple transform"); } for (size_t i = 0; i < selection.Size(); ++i) { DAVA::Entity *entity = selection.GetEntity(i); DAVA::Matrix4 origMatrix = entity->GetLocalTransform(); DAVA::Vector3 pos, scale, rotate; if(origMatrix.Decomposition(pos, scale, rotate)) { DAVA::Matrix4 newMatrix; DAVA::Matrix4 rotationMatrix; DAVA::Matrix4 transformMatrix; DAVA::Matrix4 moveToZeroPos; DAVA::Matrix4 moveFromZeroPos; moveToZeroPos.CreateTranslation(-origMatrix.GetTranslationVector()); moveFromZeroPos.CreateTranslation(origMatrix.GetTranslationVector()); if(pivotMode == PivotAbsolute) { switch (axis) { case ST_AXIS_X: rotationMatrix.CreateRotation(DAVA::Vector3(1, 0, 0), x - rotate.x); break; case ST_AXIS_Y: rotationMatrix.CreateRotation(DAVA::Vector3(0, 1, 0), y - rotate.y); break; case ST_AXIS_Z: rotationMatrix.CreateRotation(DAVA::Vector3(0, 0, 1), z - rotate.z); break; default: break; } } else { switch (axis) { case ST_AXIS_X: rotationMatrix.CreateRotation(DAVA::Vector3(1, 0, 0), x); break; case ST_AXIS_Y: rotationMatrix.CreateRotation(DAVA::Vector3(0, 1, 0), y); break; case ST_AXIS_Z: rotationMatrix.CreateRotation(DAVA::Vector3(0, 0, 1), z); break; default: break; } } newMatrix = origMatrix * moveToZeroPos * rotationMatrix * moveFromZeroPos; newMatrix.SetTranslationVector(origMatrix.GetTranslationVector()); curScene->Exec(new TransformCommand(entity, origMatrix, newMatrix)); } } if(selection.Size() > 1) { curScene->EndBatch(); } } }
void ModificationWidget::ApplyScaleValues(ST_Axis axis) { DAVA::float32 scaleValue = 1.0f; switch (axis) { case ST_AXIS_X: scaleValue = xAxisModify->value(); break; case ST_AXIS_Y: scaleValue = yAxisModify->value(); break; case ST_AXIS_Z: scaleValue = zAxisModify->value(); break; default: break; } if(NULL != curScene) { EntityGroup selection = curScene->selectionSystem->GetSelection(); if(selection.Size() > 1) { curScene->BeginBatch("Multiple transform"); } for (size_t i = 0; i < selection.Size(); ++i) { DAVA::Entity *entity = selection.GetEntity(i); DAVA::Matrix4 origMatrix = entity->GetLocalTransform(); DAVA::Vector3 pos, scale, rotate; if(origMatrix.Decomposition(pos, scale, rotate)) { DAVA::Matrix4 newMatrix; DAVA::Matrix4 scaleMatrix; DAVA::Matrix4 transformMatrix; DAVA::Matrix4 moveToZeroPos; DAVA::Matrix4 moveFromZeroPos; moveToZeroPos.CreateTranslation(-origMatrix.GetTranslationVector()); moveFromZeroPos.CreateTranslation(origMatrix.GetTranslationVector()); DAVA::float32 newEntityScale; if(pivotMode == PivotAbsolute) { if(0 != scale.x) { newEntityScale = scaleValue / scale.x; } else { newEntityScale = 0; } } else { newEntityScale = scaleValue; } scaleMatrix.CreateScale(DAVA::Vector3(newEntityScale, newEntityScale, newEntityScale)); newMatrix = origMatrix * moveToZeroPos * scaleMatrix * moveFromZeroPos; newMatrix.SetTranslationVector(origMatrix.GetTranslationVector()); curScene->Exec(new TransformCommand(entity, origMatrix, newMatrix)); } } if(selection.Size() > 1) { curScene->EndBatch(); } } }
void ModificationWidget::ReloadValues() { if(modifMode == ST_MODIF_SCALE) { xLabel->setText("Scale:"); yLabel->setVisible(false); zLabel->setVisible(false); yAxisModify->setVisible(false); zAxisModify->setVisible(false); } else { xLabel->setText("X:"); yLabel->setVisible(true); zLabel->setVisible(true); yAxisModify->setVisible(true); zAxisModify->setVisible(true); } if(NULL != curScene) { EntityGroup selection = curScene->selectionSystem->GetSelection(); if(selection.Size() > 0 && (modifMode == ST_MODIF_MOVE || modifMode == ST_MODIF_ROTATE || modifMode == ST_MODIF_SCALE)) { xAxisModify->setEnabled(true); yAxisModify->setEnabled(true); zAxisModify->setEnabled(true); xAxisModify->showButtons(true); yAxisModify->showButtons(true); zAxisModify->showButtons(true); if(selection.Size() > 1) { groupMode = true; if(pivotMode == PivotRelative) { xAxisModify->setValue(0); yAxisModify->setValue(0); zAxisModify->setValue(0); } else { xAxisModify->showButtons(false); yAxisModify->showButtons(false); zAxisModify->showButtons(false); xAxisModify->clear(); yAxisModify->clear(); zAxisModify->clear(); } } else { groupMode = false; if(pivotMode == PivotRelative) { xAxisModify->setValue(0); yAxisModify->setValue(0); zAxisModify->setValue(0); } else { DAVA::Entity *singleEntity = selection.GetEntity(0); if(NULL != singleEntity) { DAVA::float32 x = 0; DAVA::float32 y = 0; DAVA::float32 z = 0; DAVA::Matrix4 localMatrix = singleEntity->GetLocalTransform(); switch (modifMode) { case ST_MODIF_MOVE: { DAVA::Vector3 translation = localMatrix.GetTranslationVector(); x = translation.x; y = translation.y; z = translation.z; } break; case ST_MODIF_ROTATE: { DAVA::Vector3 pos, scale, rotate; if(localMatrix.Decomposition(pos, scale, rotate)) { x = DAVA::RadToDeg(rotate.x); y = DAVA::RadToDeg(rotate.y); z = DAVA::RadToDeg(rotate.z); } } break; case ST_MODIF_SCALE: { DAVA::Vector3 pos, scale, rotate; if(localMatrix.Decomposition(pos, scale, rotate)) { x = scale.x; y = scale.y; z = scale.z; } } break; default: break; } xAxisModify->setValue(x); yAxisModify->setValue(y); zAxisModify->setValue(z); } } } } else { xAxisModify->showButtons(true); yAxisModify->showButtons(true); zAxisModify->showButtons(true); xAxisModify->setEnabled(false); yAxisModify->setEnabled(false); zAxisModify->setEnabled(false); xAxisModify->clear(); yAxisModify->clear(); zAxisModify->clear(); } } }