void CreateSquareMesh() { struct Vertex { ezVec3 Position; ezVec2 TexCoord0; }; ezGeometry geom; geom.AddRectXY(ezVec2(100, 100), ezColor::Black); ezDynamicArray<Vertex> Vertices; ezDynamicArray<ezUInt16> Indices; Vertices.Reserve(geom.GetVertices().GetCount()); Indices.Reserve(geom.GetPolygons().GetCount() * 6); ezMeshBufferResourceDescriptor desc; desc.AddStream(ezGALVertexAttributeSemantic::Position, ezGALResourceFormat::XYZFloat); desc.AddStream(ezGALVertexAttributeSemantic::TexCoord0, ezGALResourceFormat::UVFloat); desc.AllocateStreams(geom.GetVertices().GetCount(), ezGALPrimitiveTopology::Triangles, geom.GetPolygons().GetCount() * 2); for (ezUInt32 v = 0; v < geom.GetVertices().GetCount(); ++v) { ezVec2 tc(geom.GetVertices()[v].m_vPosition.x / 100.0f, geom.GetVertices()[v].m_vPosition.y / -100.0f); tc += ezVec2(0.5f); desc.SetVertexData<ezVec3>(0, v, geom.GetVertices()[v].m_vPosition); desc.SetVertexData<ezVec2>(1, v, tc); } ezUInt32 t = 0; for (ezUInt32 p = 0; p < geom.GetPolygons().GetCount(); ++p) { for (ezUInt32 v = 0; v < geom.GetPolygons()[p].m_Vertices.GetCount() - 2; ++v) { desc.SetTriangleIndices(t, geom.GetPolygons()[p].m_Vertices[0], geom.GetPolygons()[p].m_Vertices[v + 1], geom.GetPolygons()[p].m_Vertices[v + 2]); ++t; } } m_hQuadMeshBuffer = ezResourceManager::GetExistingResource<ezMeshBufferResource>("{E692442B-9E15-46C5-8A00-1B07C02BF8F7}"); if (!m_hQuadMeshBuffer.IsValid()) m_hQuadMeshBuffer = ezResourceManager::CreateResource<ezMeshBufferResource>("{E692442B-9E15-46C5-8A00-1B07C02BF8F7}", std::move(desc)); }
void ezQtCurve1DEditorWidget::onMoveTangents(float x, float y) { m_TangentMove += ezVec2(x, y); ezInt32 iCurve; ezInt32 iPoint; bool bLeftTangent; if (!CurveEdit->GetSelectedTangent(iCurve, iPoint, bLeftTangent)) return; Q_EMIT BeginCpChangesEvent("Move Tangents"); { const auto& cp = m_CurvesBackup.m_Curves[iCurve]->m_ControlPoints[iPoint]; ezVec2 newPos; if (bLeftTangent) newPos = cp.m_LeftTangent + m_TangentMove; else newPos = cp.m_RightTangent + m_TangentMove; newPos.y = ezMath::Clamp(newPos.y, -100000.0f, +100000.0f); Q_EMIT TangentMovedEvent(iCurve, iPoint, newPos.x, newPos.y, !bLeftTangent); if (cp.m_bTangentsLinked) { Q_EMIT TangentMovedEvent(iCurve, iPoint, -newPos.x, -newPos.y, bLeftTangent); } } Q_EMIT EndCpChangesEvent(); }
void ezQtPropertyAnimAssetDocumentWindow::onCurveTangentMoved(ezUInt32 uiCurveIdx, ezUInt32 cpIdx, float newPosX, float newPosY, bool rightTangent) { if (uiCurveIdx >= m_MapSelectionToTrack.GetCount()) return; ezPropertyAnimAssetDocument* pDoc = GetPropertyAnimDocument(); auto pProp = pDoc->GetPropertyObject(); const ezInt32 iTrackIdx = m_MapSelectionToTrack[uiCurveIdx]; const ezVariant trackGuid = pDoc->GetPropertyObject()->GetTypeAccessor().GetValue("Tracks", iTrackIdx); const ezDocumentObject* trackObject = pDoc->GetObjectManager()->GetObject(trackGuid.Get<ezUuid>()); const ezVariant curveGuid = trackObject->GetTypeAccessor().GetValue("FloatCurve"); const ezDocumentObject* pCurvesArray = pDoc->GetObjectManager()->GetObject(curveGuid.Get<ezUuid>()); const ezVariant cpGuid = pCurvesArray->GetTypeAccessor().GetValue("ControlPoints", cpIdx); ezSetObjectPropertyCommand cmdSet; cmdSet.m_Object = cpGuid.Get<ezUuid>(); // clamp tangents to one side if (rightTangent) newPosX = ezMath::Max(newPosX, 0.0f); else newPosX = ezMath::Min(newPosX, 0.0f); cmdSet.m_sProperty = rightTangent ? "RightTangent" : "LeftTangent"; cmdSet.m_NewValue = ezVec2(newPosX, newPosY); GetDocument()->GetCommandHistory()->AddCommand(cmdSet); }
void SampleGameApp::SetupInput() { m_pWindow->GetInputDevice()->SetClipMouseCursor(true); m_pWindow->GetInputDevice()->SetShowMouseCursor(false); m_pWindow->GetInputDevice()->SetMouseSpeed(ezVec2(0.002f)); ezInputActionConfig cfg; cfg.m_bApplyTimeScaling = true; cfg.m_sInputSlotTrigger[0] = ezInputSlot_KeyEscape; ezInputManager::SetInputActionConfig("Main", "CloseApp", cfg, true); cfg.m_sInputSlotTrigger[0] = ezInputSlot_KeyLeftShift; ezInputManager::SetInputActionConfig("Game", "CamMoveFast", cfg, true); cfg.m_sInputSlotTrigger[0] = ezInputSlot_KeyA; ezInputManager::SetInputActionConfig("Game", "CamMoveLeft", cfg, true); cfg.m_sInputSlotTrigger[0] = ezInputSlot_KeyD; ezInputManager::SetInputActionConfig("Game", "CamMoveRight", cfg, true); cfg.m_sInputSlotTrigger[0] = ezInputSlot_KeyW; ezInputManager::SetInputActionConfig("Game", "CamMoveForwards", cfg, true); cfg.m_sInputSlotTrigger[0] = ezInputSlot_KeyS; ezInputManager::SetInputActionConfig("Game", "CamMoveBackwards", cfg, true); cfg.m_sInputSlotTrigger[0] = ezInputSlot_KeyQ; ezInputManager::SetInputActionConfig("Game", "CamMoveUp", cfg, true); cfg.m_sInputSlotTrigger[0] = ezInputSlot_KeyE; ezInputManager::SetInputActionConfig("Game", "CamMoveDown", cfg, true); cfg.m_sInputSlotTrigger[0] = ezInputSlot_KeyLeft; ezInputManager::SetInputActionConfig("Game", "CamRotateLeft", cfg, true); cfg.m_sInputSlotTrigger[0] = ezInputSlot_KeyRight; ezInputManager::SetInputActionConfig("Game", "CamRotateRight", cfg, true); cfg.m_sInputSlotTrigger[0] = ezInputSlot_KeyUp; ezInputManager::SetInputActionConfig("Game", "CamRotateUp", cfg, true); cfg.m_sInputSlotTrigger[0] = ezInputSlot_KeyDown; ezInputManager::SetInputActionConfig("Game", "CamRotateDown", cfg, true); cfg.m_sInputSlotTrigger[0] = ezInputSlot_MouseButton0; ezInputManager::SetInputActionConfig("Game", "SelectUnit", cfg, true); cfg.m_sInputSlotTrigger[0] = ezInputSlot_MouseButton1; ezInputManager::SetInputActionConfig("Game", "SendUnit", cfg, true); cfg.m_sInputSlotTrigger[0] = ezInputSlot_MouseWheelUp; ezInputManager::SetInputActionConfig("Game", "UnitLarger", cfg, true); cfg.m_sInputSlotTrigger[0] = ezInputSlot_MouseWheelDown; ezInputManager::SetInputActionConfig("Game", "UnitSmaller", cfg, true); }
ezVirtualThumbStick::ezVirtualThumbStick() { SetAreaFocusMode(ezInputActionConfig::RequireKeyUp, ezInputActionConfig::KeepFocus); SetTriggerInputSlot(ezVirtualThumbStick::Input::Touchpoint); SetThumbstickOutput(ezVirtualThumbStick::Output::Controller0_LeftStick); SetInputArea(ezVec2(0.0f), ezVec2(0.0f), 0.0f, 0.0f); ezStringBuilder s; s.Format("Thumbstick_%i", s_iThumbsticks); m_sName = s; ++s_iThumbsticks; m_bEnabled = false; m_bConfigChanged = false; m_bIsActive = false; }
void gpApplicationBase::SetupInput() { m_pWindow->GetInputDevice()->SetClipMouseCursor(false); m_pWindow->GetInputDevice()->SetShowMouseCursor(true); m_pWindow->GetInputDevice()->SetMouseSpeed(ezVec2(0.002f)); RegisterInputAction("Main", "Quit", ezInputSlot_KeyEscape); RegisterInputAction("Main", "ClipMouse", ezInputSlot_KeyC); }
void ezSceneViewContext::PickObjectAt(ezUInt16 x, ezUInt16 y) { // remote processes do not support picking, just ignore this if (ezEditorEngineProcessApp::GetSingleton()->IsRemoteMode()) return; ezViewPickingResultMsgToEditor res; ezView* pView = nullptr; if (ezRenderWorld::TryGetView(m_hView, pView) && pView->IsRenderPassReadBackPropertyExisting("EditorPickingPass", "PickingMatrix")) { pView->SetRenderPassProperty("EditorPickingPass", "PickingPosition", ezVec2(x, y)); ezVariant varMat = pView->GetRenderPassReadBackProperty("EditorPickingPass", "PickingMatrix"); if (varMat.IsA<ezMat4>()) { const ezUInt32 uiPickingID = pView->GetRenderPassReadBackProperty("EditorPickingPass", "PickingID").ConvertTo<ezUInt32>(); // const float fPickingDepth = pView->GetRenderPassReadBackProperty("EditorPickingPass", "PickingDepth").ConvertTo<float>(); res.m_vPickedNormal = pView->GetRenderPassReadBackProperty("EditorPickingPass", "PickingNormal").ConvertTo<ezVec3>(); res.m_vPickingRayStartPosition = pView->GetRenderPassReadBackProperty("EditorPickingPass", "PickingRayStartPosition").ConvertTo<ezVec3>(); res.m_vPickedPosition = pView->GetRenderPassReadBackProperty("EditorPickingPass", "PickingPosition").ConvertTo<ezVec3>(); EZ_ASSERT_DEBUG(!res.m_vPickedPosition.IsNaN(), ""); const ezUInt32 uiComponentID = (uiPickingID & 0x00FFFFFF); const ezUInt32 uiPartIndex = (uiPickingID >> 24) & 0x7F; // highest bit indicates whether the object is dynamic, ignore this res.m_ComponentGuid = GetDocumentContext()->m_Context.m_ComponentPickingMap.GetGuid(uiComponentID); res.m_OtherGuid = GetDocumentContext()->m_Context.m_OtherPickingMap.GetGuid(uiComponentID); if (res.m_ComponentGuid.IsValid()) { ezComponentHandle hComponent = GetDocumentContext()->m_Context.m_ComponentMap.GetHandle(res.m_ComponentGuid); ezEngineProcessDocumentContext* pDocumentContext = GetDocumentContext(); // check whether the component is still valid ezComponent* pComponent = nullptr; if (pDocumentContext->GetWorld()->TryGetComponent<ezComponent>(hComponent, pComponent)) { // if yes, fill out the parent game object guid res.m_ObjectGuid = GetDocumentContext()->m_Context.m_GameObjectMap.GetGuid(pComponent->GetOwner()->GetHandle()); res.m_uiPartIndex = uiPartIndex; } else { res.m_ComponentGuid = ezUuid(); } } } }
void ezQtNodeScene::mouseMoveEvent(QGraphicsSceneMouseEvent* event) { s_LastMouseInteraction = ezVec2(event->scenePos().x(), event->scenePos().y()); if (m_pTempConnection) { event->accept(); ezVec2 bestPos = s_LastMouseInteraction; // snap to the closest pin that we can connect to if (!m_ConnectablePins.IsEmpty()) { const float fPinWidth = m_ConnectablePins[0]->sceneBoundingRect().width(); // this is also the threshold at which we snap to another position float fDistToBest = ezMath::Square(fPinWidth * 2.5f); for (auto pin : m_ConnectablePins) { const QPointF center = pin->sceneBoundingRect().center(); const ezVec2 pt = ezVec2(center.x(), center.y()); const float lenSqr = (pt - s_LastMouseInteraction).GetLengthSquared(); if (lenSqr < fDistToBest) { fDistToBest = lenSqr; bestPos = pt; } } } m_pTempConnection->SetPosOut(QPointF(bestPos.x, bestPos.y)); return; } QGraphicsScene::mouseMoveEvent(event); }
void ezQtNodeScene::contextMenuEvent(QGraphicsSceneContextMenuEvent* contextMenuEvent) { QTransform id; QGraphicsItem* pItem = itemAt(contextMenuEvent->scenePos(), id); int iType = pItem != nullptr ? pItem->type() : -1; while (pItem && !(iType >= Type::Node && iType <= Type::Connection)) { pItem = pItem->parentItem(); iType = pItem != nullptr ? pItem->type() : -1; } ezQtSearchableMenu* pSearchMenu = nullptr; QMenu menu; if (iType == Type::Pin) { ezQtPin* pPin = static_cast<ezQtPin*>(pItem); QAction* pAction = new QAction("Disconnect Pin", &menu); menu.addAction(pAction); connect(pAction, &QAction::triggered, this, [this, pPin](bool bChecked) { DisconnectPinsAction(pPin); }); } else if (iType == Type::Node) { ezQtNode* pNode = static_cast<ezQtNode*>(pItem); // if we clicked on an unselected item, make it the only selected item if (!pNode->isSelected()) { clearSelection(); pNode->setSelected(true); } // Delete Node { QAction* pAction = new QAction("Remove", &menu); menu.addAction(pAction); connect(pAction, &QAction::triggered, this, [this](bool bChecked) { RemoveSelectedNodesAction(); }); } } else if (iType == Type::Connection) { ezQtConnection* pConnection = static_cast<ezQtConnection*>(pItem); QAction* pAction = new QAction("Delete Connection", &menu); menu.addAction(pAction); connect(pAction, &QAction::triggered, this, [this, pConnection](bool bChecked) { DisconnectPinsAction(pConnection); }); } else { pSearchMenu = new ezQtSearchableMenu(&menu); menu.addAction(pSearchMenu); connect(pSearchMenu, &ezQtSearchableMenu::MenuItemTriggered, this, &ezQtNodeScene::OnMenuItemTriggered); connect(pSearchMenu, &ezQtSearchableMenu::MenuItemTriggered, this, [&menu]() { menu.close(); }); ezStringBuilder sFullName; ezHybridArray<const ezRTTI*, 32> types; m_pManager->GetCreateableTypes(types); auto pos = contextMenuEvent->scenePos(); m_vPos = ezVec2(pos.x(), pos.y()); for (const ezRTTI* pRtti : types) { const char* szCleanName = pRtti->GetTypeName(); const char* szColonColon = ezStringUtils::FindLastSubString(szCleanName, "::"); if (szColonColon != nullptr) szCleanName = szColonColon + 2; const char* szUnderscore = ezStringUtils::FindLastSubString(szCleanName, "_"); if (szUnderscore != nullptr) szCleanName = szUnderscore + 1; sFullName = m_pManager->GetTypeCategory(pRtti); sFullName.AppendPath(szCleanName); pSearchMenu->AddItem(sFullName, qVariantFromValue((void*)pRtti)); } pSearchMenu->Finalize(m_sContextMenuSearchText); } menu.exec(contextMenuEvent->screenPos()); if (pSearchMenu) { m_sContextMenuSearchText = pSearchMenu->GetSearchText(); } }
void ezQtNodeScene::mouseReleaseEvent(QGraphicsSceneMouseEvent* event) { if (m_pTempConnection && event->button() == Qt::LeftButton) { event->accept(); QTransform id; QGraphicsItem* item = itemAt(m_pTempConnection->GetOutPos(), id); if (item && item->type() == Type::Pin) { ezQtPin* pPin = static_cast<ezQtPin*>(item); if (pPin != m_pStartPin && pPin->GetPin()->GetType() != m_pStartPin->GetPin()->GetType()) { const ezPin* pSourcePin = (m_pStartPin->GetPin()->GetType() == ezPin::Type::Input) ? pPin->GetPin() : m_pStartPin->GetPin(); const ezPin* pTargetPin = (m_pStartPin->GetPin()->GetType() == ezPin::Type::Input) ? m_pStartPin->GetPin() : pPin->GetPin(); ConnectPinsAction(pSourcePin, pTargetPin); } } delete m_pTempConnection; m_pTempConnection = nullptr; m_pStartPin = nullptr; ResetConnectablePinMarkup(); return; } QGraphicsScene::mouseReleaseEvent(event); bool bSelectionChanged = false; ezSet<const ezDocumentObject*> moved; for (auto it = m_Nodes.GetIterator(); it.IsValid(); ++it) { if (it.Value()->GetFlags().IsSet(ezNodeFlags::Moved)) { moved.Insert(it.Key()); } if (it.Value()->GetFlags().IsSet(ezNodeFlags::SelectionChanged)) { bSelectionChanged = true; } it.Value()->ResetFlags(); } if (bSelectionChanged) { ezDeque<const ezDocumentObject*> selection; GetSelection(selection); m_bIgnoreSelectionChange = true; ((ezSelectionManager*)m_pManager->GetDocument()->GetSelectionManager())->SetSelection(selection); m_bIgnoreSelectionChange = false; } if (!moved.IsEmpty()) { ezCommandHistory* history = GetDocumentNodeManager()->GetDocument()->GetCommandHistory(); history->StartTransaction("Move Node"); ezStatus res; for (auto pObject : moved) { ezMoveNodeCommand move; move.m_Object = pObject->GetGuid(); auto pos = m_Nodes[pObject]->pos(); move.m_NewPos = ezVec2(pos.x(), pos.y()); res = history->AddCommand(move); if (res.m_Result.Failed()) break; } if (res.m_Result.Failed()) history->CancelTransaction(); else history->FinishTransaction(); ezQtUiServices::GetSingleton()->MessageBoxStatus(res, "Move node failed"); } }