void SceneTree::SyncSelectionFromTree() { SceneEditor2* curScene = treeModel->GetScene(); if(NULL != curScene) { QSet<DAVA::Entity*> treeSelectedEntities; // select items in scene QModelIndexList indexList = selectionModel()->selection().indexes(); for (int i = 0; i < indexList.size(); ++i) { DAVA::Entity *entity = treeModel->GetEntity(indexList[i]); treeSelectedEntities.insert(entity); curScene->selectionSystem->AddSelection(entity); } // remove from selection system all entities that are not selected in tree EntityGroup selGroup = *(curScene->selectionSystem->GetSelection()); for(size_t i = 0; i < selGroup.Size(); ++i) { if(!treeSelectedEntities.contains(selGroup.GetEntity(i))) { curScene->selectionSystem->RemSelection(selGroup.GetEntity(i)); } } } }
void SceneSelectionSystem::ProcessUIEvent(DAVA::UIEvent *event) { if (IsLocked() || !selectionAllowed) { return; } if(DAVA::UIEvent::PHASE_BEGAN == event->phase) { // we can select only if mouse isn't over hood axis // or if hood is invisible now // or if current mode is NORMAL (no modification) if(!hoodSystem->IsVisible() || ST_MODIF_OFF == hoodSystem->GetModifMode() || ST_AXIS_NONE == hoodSystem->GetPassingAxis()) { if(event->tid == DAVA::UIEvent::BUTTON_1) { const EntityGroup* collisionEntities = collisionSystem->ObjectsRayTestFromCamera(); EntityGroup selectableItems = GetSelecetableFromCollision(collisionEntities); DAVA::Entity *firstEntity = selectableItems.GetEntity(0); DAVA::Entity *nextEntity = selectableItems.GetEntity(0); // sequent selection? if(SettingsManager::GetValue(Settings::Scene_SelectionSequent).AsBool()) { // search possible next item only if now there is no selection or is only single selection if(curSelections.Size() <= 1) { // find first after currently selected items for(size_t i = 0; i < selectableItems.Size(); i++) { DAVA::Entity *entity = selectableItems.GetEntity(i); if(curSelections.HasEntity(entity)) { if((i + 1) < selectableItems.Size()) { nextEntity = selectableItems.GetEntity(i + 1); break; } } } } } int curKeyModifiers = QApplication::keyboardModifiers(); if(curKeyModifiers & Qt::ControlModifier) { AddSelection(firstEntity); } else if(curKeyModifiers & Qt::AltModifier) { RemSelection(firstEntity); } else { // if new selection is NULL or is one of already selected items // we should change current selection only on phase end if(nextEntity == NULL || NULL != curSelections.IntersectedEntity(&selectableItems)) { applyOnPhaseEnd = true; lastSelection = nextEntity; } else { SetSelection(nextEntity); } } } } } else if(DAVA::UIEvent::PHASE_ENDED == event->phase) { if(event->tid == DAVA::UIEvent::BUTTON_1) { if(applyOnPhaseEnd) { applyOnPhaseEnd = false; SetSelection(lastSelection); } } } }
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::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::ApplyMoveValues(ST_Axis axis) { DAVA::float32 x = xAxisModify->value(); DAVA::float32 y = yAxisModify->value(); DAVA::float32 z = 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 origPos = origMatrix.GetTranslationVector(); DAVA::Vector3 newPos = origPos; if(pivotMode == PivotAbsolute) { switch (axis) { case ST_AXIS_X: newPos.x = x; break; case ST_AXIS_Y: newPos.y = y; break; case ST_AXIS_Z: newPos.z = z; break; default: break; } } else { switch (axis) { case ST_AXIS_X: newPos.x += x; break; case ST_AXIS_Y: newPos.y += y; break; case ST_AXIS_Z: newPos.z += z; break; default: break; } } DAVA::Matrix4 newMatrix = origMatrix; newMatrix.SetTranslationVector(newPos); 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(); } } }