void CharacterDemo::HandleUpdate(StringHash eventType, VariantMap& eventData) { using namespace Update; float timeStep = eventData[P_TIMESTEP].GetFloat(); Input* input = GetSubsystem<Input>(); if (character_) { UI* ui = GetSubsystem<UI>(); // Get movement controls and assign them to the character logic component. If UI has a focused element, clear controls if (!ui->GetFocusElement()) { character_->controls_.Set(CTRL_FORWARD, input->GetKeyDown('W')); character_->controls_.Set(CTRL_BACK, input->GetKeyDown('S')); character_->controls_.Set(CTRL_LEFT, input->GetKeyDown('A')); character_->controls_.Set(CTRL_RIGHT, input->GetKeyDown('D')); character_->controls_.Set(CTRL_JUMP, input->GetKeyDown(KEY_SPACE)); // Add character yaw & pitch from the mouse motion character_->controls_.yaw_ += (float)input->GetMouseMoveX() * YAW_SENSITIVITY; character_->controls_.pitch_ += (float)input->GetMouseMoveY() * YAW_SENSITIVITY; // Limit pitch character_->controls_.pitch_ = Clamp(character_->controls_.pitch_, -80.0f, 80.0f); // Switch between 1st and 3rd person if (input->GetKeyPress('F')) firstPerson_ = !firstPerson_; // Check for loading / saving the scene if (input->GetKeyPress(KEY_F5)) { File saveFile(context_, GetSubsystem<FileSystem>()->GetProgramDir() + "Data/Scenes/CharacterDemo.xml", FILE_WRITE); scene_->SaveXML(saveFile); } if (input->GetKeyPress(KEY_F7)) { File loadFile(context_, GetSubsystem<FileSystem>()->GetProgramDir() + "Data/Scenes/CharacterDemo.xml", FILE_READ); scene_->LoadXML(loadFile); // After loading we have to reacquire the weak pointer to the Character component, as it has been recreated // Simply find the character's scene node by name as there's only one of them Node* characterNode = scene_->GetChild("Jack", true); if (characterNode) character_ = characterNode->GetComponent<Character>(); } } else character_->controls_.Set(CTRL_FORWARD | CTRL_BACK | CTRL_LEFT | CTRL_RIGHT | CTRL_JUMP, false); // Set rotation already here so that it's updated every rendering frame instead of every physics frame character_->GetNode()->SetRotation(Quaternion(character_->controls_.yaw_, Vector3::UP)); } }
void VehicleDemo::HandleUpdate(StringHash eventType, VariantMap& eventData) { using namespace Update; float timeStep = eventData[P_TIMESTEP].GetFloat(); Input* input = GetSubsystem<Input>(); if (vehicle_) { UI* ui = GetSubsystem<UI>(); // Get movement controls and assign them to the vehicle component. If UI has a focused element, clear controls if (!ui->GetFocusElement()) { vehicle_->controls_.Set(CTRL_FORWARD, input->GetKeyDown('W')); vehicle_->controls_.Set(CTRL_BACK, input->GetKeyDown('S')); vehicle_->controls_.Set(CTRL_LEFT, input->GetKeyDown('A')); vehicle_->controls_.Set(CTRL_RIGHT, input->GetKeyDown('D')); // Add yaw & pitch from the mouse motion. Used only for the camera, does not affect motion vehicle_->controls_.yaw_ += (float)input->GetMouseMoveX() * YAW_SENSITIVITY; vehicle_->controls_.pitch_ += (float)input->GetMouseMoveY() * YAW_SENSITIVITY; // Limit pitch vehicle_->controls_.pitch_ = Clamp(vehicle_->controls_.pitch_, 0.0f, 80.0f); // Check for loading / saving the scene if (input->GetKeyPress(KEY_F5)) { File saveFile(context_, GetSubsystem<FileSystem>()->GetProgramDir() + "Data/Scenes/VehicleDemo.xml", FILE_WRITE); scene_->SaveXML(saveFile); } if (input->GetKeyPress(KEY_F7)) { File loadFile(context_, GetSubsystem<FileSystem>()->GetProgramDir() + "Data/Scenes/VehicleDemo.xml", FILE_READ); scene_->LoadXML(loadFile); // After loading we have to reacquire the weak pointer to the Vehicle component, as it has been recreated // Simply find the vehicle's scene node by name as there's only one of them Node* vehicleNode = scene_->GetChild("Vehicle", true); if (vehicleNode) vehicle_ = vehicleNode->GetComponent<Vehicle>(); } } else vehicle_->controls_.Set(CTRL_FORWARD | CTRL_BACK | CTRL_LEFT | CTRL_RIGHT, false); } }
void VehicleDemo::HandleUpdate(StringHash eventType, VariantMap& eventData) { using namespace Update; Input* input = GetSubsystem<Input>(); if (vehicle_) { UI* ui = GetSubsystem<UI>(); // Get movement controls and assign them to the vehicle component. If UI has a focused element, clear controls if (!ui->GetFocusElement()) { vehicle_->controls_.Set(CTRL_FORWARD, input->GetKeyDown(KEY_W)); vehicle_->controls_.Set(CTRL_BACK, input->GetKeyDown(KEY_S)); vehicle_->controls_.Set(CTRL_LEFT, input->GetKeyDown(KEY_A)); vehicle_->controls_.Set(CTRL_RIGHT, input->GetKeyDown(KEY_D)); // Add yaw & pitch from the mouse motion or touch input. Used only for the camera, does not affect motion if (touchEnabled_) { for (unsigned i = 0; i < input->GetNumTouches(); ++i) { TouchState* state = input->GetTouch(i); if (!state->touchedElement_) // Touch on empty space { Camera* camera = cameraNode_->GetComponent<Camera>(); if (!camera) return; Graphics* graphics = GetSubsystem<Graphics>(); vehicle_->controls_.yaw_ += TOUCH_SENSITIVITY * camera->GetFov() / graphics->GetHeight() * state->delta_.x_; vehicle_->controls_.pitch_ += TOUCH_SENSITIVITY * camera->GetFov() / graphics->GetHeight() * state->delta_.y_; } } } else { vehicle_->controls_.yaw_ += (float)input->GetMouseMoveX() * YAW_SENSITIVITY; vehicle_->controls_.pitch_ += (float)input->GetMouseMoveY() * YAW_SENSITIVITY; } // Limit pitch vehicle_->controls_.pitch_ = Clamp(vehicle_->controls_.pitch_, 0.0f, 80.0f); // Check for loading / saving the scene if (input->GetKeyPress(KEY_F5)) { File saveFile(context_, GetSubsystem<FileSystem>()->GetProgramDir() + "Data/Scenes/VehicleDemo.xml", FILE_WRITE); scene_->SaveXML(saveFile); } if (input->GetKeyPress(KEY_F7)) { File loadFile(context_, GetSubsystem<FileSystem>()->GetProgramDir() + "Data/Scenes/VehicleDemo.xml", FILE_READ); scene_->LoadXML(loadFile); // After loading we have to reacquire the weak pointer to the Vehicle component, as it has been recreated // Simply find the vehicle's scene node by name as there's only one of them Node* vehicleNode = scene_->GetChild("Vehicle", true); if (vehicleNode) vehicle_ = vehicleNode->GetComponent<Vehicle>(); } } else vehicle_->controls_.Set(CTRL_FORWARD | CTRL_BACK | CTRL_LEFT | CTRL_RIGHT, false); } }
void CharacterDemo::HandleUpdate(StringHash eventType, VariantMap& eventData) { using namespace Update; Input* input = GetSubsystem<Input>(); if (character_) { // Clear previous controls character_->controls_.Set(CTRL_FORWARD | CTRL_BACK | CTRL_LEFT | CTRL_RIGHT | CTRL_JUMP, false); // Update controls using touch utility class if (touch_) touch_->UpdateTouches(character_->controls_); // Update controls using keys UI* ui = GetSubsystem<UI>(); if (!ui->GetFocusElement()) { if (!touch_ || !touch_->useGyroscope_) { character_->controls_.Set(CTRL_FORWARD, input->GetKeyDown(KEY_W)); character_->controls_.Set(CTRL_BACK, input->GetKeyDown(KEY_S)); character_->controls_.Set(CTRL_LEFT, input->GetKeyDown(KEY_A)); character_->controls_.Set(CTRL_RIGHT, input->GetKeyDown(KEY_D)); } character_->controls_.Set(CTRL_JUMP, input->GetKeyDown(KEY_SPACE)); // Add character yaw & pitch from the mouse motion or touch input if (touchEnabled_) { for (unsigned i = 0; i < input->GetNumTouches(); ++i) { TouchState* state = input->GetTouch(i); if (!state->touchedElement_) // Touch on empty space { Camera* camera = cameraNode_->GetComponent<Camera>(); if (!camera) return; Graphics* graphics = GetSubsystem<Graphics>(); character_->controls_.yaw_ += TOUCH_SENSITIVITY * camera->GetFov() / graphics->GetHeight() * state->delta_.x_; character_->controls_.pitch_ += TOUCH_SENSITIVITY * camera->GetFov() / graphics->GetHeight() * state->delta_.y_; } } } else { character_->controls_.yaw_ += (float)input->GetMouseMoveX() * YAW_SENSITIVITY; character_->controls_.pitch_ += (float)input->GetMouseMoveY() * YAW_SENSITIVITY; } // Limit pitch character_->controls_.pitch_ = Clamp(character_->controls_.pitch_, -80.0f, 80.0f); // Set rotation already here so that it's updated every rendering frame instead of every physics frame character_->GetNode()->SetRotation(Quaternion(character_->controls_.yaw_, Vector3::UP)); // Switch between 1st and 3rd person if (input->GetKeyPress(KEY_F)) firstPerson_ = !firstPerson_; // Turn on/off gyroscope on mobile platform if (touch_ && input->GetKeyPress(KEY_G)) touch_->useGyroscope_ = !touch_->useGyroscope_; // Check for loading / saving the scene if (input->GetKeyPress(KEY_F5)) { File saveFile(context_, GetSubsystem<FileSystem>()->GetProgramDir() + "Data/Scenes/CharacterDemo.xml", FILE_WRITE); scene_->SaveXML(saveFile); } if (input->GetKeyPress(KEY_F7)) { File loadFile(context_, GetSubsystem<FileSystem>()->GetProgramDir() + "Data/Scenes/CharacterDemo.xml", FILE_READ); scene_->LoadXML(loadFile); // After loading we have to reacquire the weak pointer to the Character component, as it has been recreated // Simply find the character's scene node by name as there's only one of them Node* characterNode = scene_->GetChild("Jack", true); if (characterNode) character_ = characterNode->GetComponent<Character>(); } } } }
void SceneView3D::HandlePostRenderUpdate(StringHash eventType, VariantMap& eventData) { // Visualize the currently selected nodes if (selectedNode_.NotNull()) { DrawNodeDebug(selectedNode_, debugRenderer_); } if (!MouseInView()) return; Input* input = GetSubsystem<Input>(); mouseLeftDown_ = false; if (input->GetMouseButtonPress(MOUSEB_LEFT)) { if (!mouseMoved_ && !sceneEditor_->GetGizmo()->Selected()) { Ray camRay = GetCameraRay(); PODVector<RayQueryResult> result; RayOctreeQuery query(result, camRay, RAY_TRIANGLE, camera_->GetFarClip(), DRAWABLE_GEOMETRY, 0x7fffffff); octree_->RaycastSingle(query); if (query.result_.Size()) { const RayQueryResult& r = result[0]; if (r.drawable_) { VariantMap neventData; neventData[EditorActiveNodeChange::P_NODE] = r.drawable_->GetNode(); SendEvent(E_EDITORACTIVENODECHANGE, neventData); } } } mouseMoved_ = false; } else if (!input->GetMouseButtonDown(MOUSEB_LEFT)) { Ray camRay = GetCameraRay(); PODVector<RayQueryResult> result; mouseMoved_ = false; /* Array<int> pickModeDrawableFlags = { DRAWABLE_GEOMETRY, DRAWABLE_LIGHT, DRAWABLE_ZONE }; */ RayOctreeQuery query(result, camRay, RAY_TRIANGLE, camera_->GetFarClip(), DRAWABLE_GEOMETRY, 0x7fffffff); octree_->RaycastSingle(query); if (query.result_.Size()) { const RayQueryResult& r = result[0]; if (r.drawable_) { debugRenderer_->AddNode(r.drawable_->GetNode(), 1.0, false); r.drawable_->DrawDebugGeometry(debugRenderer_, false); } } } else { mouseLeftDown_ = true; if (Abs(input->GetMouseMoveX() > 3 || input->GetMouseMoveY() > 3)) { mouseMoved_ = true; } } }