void SaveEntityAsAction::Redo() { if(!sc2Path.IsEmpty() && sc2Path.IsEqualToExtension(".sc2") && NULL != entities && entities->Size() > 0) { DAVA::Scene *scene = new DAVA::Scene(); Vector3 oldZero = entities->GetCommonZeroPos(); for(size_t i = 0; i < entities->Size(); ++i) { DAVA::Entity *entity = entities->GetEntity(i); DAVA::Entity *clone = entity->Clone(); Vector3 offset = clone->GetLocalTransform().GetTranslationVector() - oldZero; Matrix4 newLocalTransform = clone->GetLocalTransform(); newLocalTransform.SetTranslationVector(offset); clone->SetLocalTransform(newLocalTransform); DAVA::KeyedArchive *props = GetCustomPropertiesArchieve(clone); if(props) { props->DeleteKey(ResourceEditor::EDITOR_REFERENCE_TO_OWNER); } scene->AddNode(clone); } scene->Save(sc2Path); scene->Release(); } }
void QtPropertyDataIntrospection::BakeTransform() { QtPropertyDataIntrospection * renderComponentProperty = static_cast<QtPropertyDataIntrospection*>(parent); DAVA::Entity * entity = (static_cast<DAVA::RenderComponent*>(renderComponentProperty->object))->GetEntity(); DAVA::RenderObject * ro = static_cast<DAVA::RenderObject*>(object); ro->BakeTransform(entity->GetLocalTransform()); entity->SetLocalTransform(DAVA::Matrix4::IDENTITY); }
DAVA::AABBox3 SceneSelectionSystem::GetSelectionAABox(DAVA::Entity *entity, const DAVA::Matrix4 &transform) const { DAVA::AABBox3 ret = DAVA::AABBox3(DAVA::Vector3(0, 0, 0), 0); if(NULL != entity) { // we will get selection bbox from collision system DAVA::AABBox3 entityBox = collisionSystem->GetBoundingBox(entity); // add childs boxes into entity box for (DAVA::int32 i = 0; i < entity->GetChildrenCount(); i++) { DAVA::Entity *childEntity = entity->GetChild(i); DAVA::AABBox3 childBox = GetSelectionAABox(childEntity, childEntity->GetLocalTransform()); if(entityBox.IsEmpty()) { entityBox = childBox; } else { if(!childBox.IsEmpty()) { entityBox.AddAABBox(childBox); } } } // we should return box with specified transformation if(!entityBox.IsEmpty()) { entityBox.GetTransformedBox(transform, ret); } } return ret; }
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(); } } }