#include "scenepicker.h" #include "engine.h" #include "editor.h" #include "scene/scenetree.h" #include "scene/playercharacternode.h" #include "scene/physicsdebugnode.h" #include #include #include #include #include #include #include Mesh* ScenePicker::generateMesh() { SphereGenerator generator; PBRMaterial* mat = new PBRMaterial(); mat->albedo = glm::vec3(1, 0, 0); // red mat->emission = glm::vec3(0.3, 0, 0); // emits some red mat->metallic = 0.6f; mat->roughness = 0.3f; // quite shiny Mesh* m = generator.generateGeodesicMesh(mat, 2, 0.3f); m->computeNormals(); m->setName("scenePicker"); m->initGL(); return m; } ScenePicker::ScenePicker() : m_pickSucceeded(false) { m_geometry.mesh = generateMesh(); } ScenePicker::~ScenePicker() { delete m_geometry.mesh->getMaterial(); delete m_geometry.mesh; } void ScenePicker::update() { pick(); bool isEnabled = true; ImGui::Begin("Picker", &isEnabled); if(m_pickSucceeded) { ImGui::Text("Intersection : ( %.3f, %.3f, %.3f )", m_pickedPos.x, m_pickedPos.y, m_pickedPos.z); if(!isVisible()) setVisible(m_pickSucceeded); } else { ImGui::Text("No intesection"); if(isVisible()) setVisible(m_pickSucceeded); } // if(ImGui::Button("Teleport")) //move player to target coordinate ImGui::End(); if(!isEnabled) getEngine().getEditor()->togglePicker(); } void ScenePicker::pick() { FirstPersonCamera* cam = dynamic_cast(getEngine().getScene()->getCamera()); if(cam != nullptr) { glm::vec3 dir_cam = cam->getDirection()*100; btVector3 start(cam->getEyePosition().x, cam->getEyePosition().y, cam->getEyePosition().z); btVector3 end = start; end += btVector3(start.x() + dir_cam.x, start.y() + dir_cam.y, start.z() + dir_cam.z); btCollisionWorld::ClosestRayResultCallback rayCallback(start, end); PhysicsDebugNode* pdnode= getEngine().getPhysicsDebug(); if (pdnode != nullptr) pdnode->drawLine(start,end,btVector3(1,0,1)); getEngine().getScene()->getPhysics()->rayTest(start, end, rayCallback); m_pickSucceeded = rayCallback.hasHit(); m_pickedNode = nullptr; if(m_pickSucceeded) { m_pickedNode = static_cast(rayCallback.m_collisionObject->getUserPointer()); btVector3 target = rayCallback.m_hitPointWorld; m_pickedPos = glm::vec3(target.x(), target.y(), target.z()); m_geometry.modelMatrix = glm::translate(glm::mat4(), m_pickedPos); } } else m_pickSucceeded = false; } btCollisionWorld::ClosestRayResultCallback ScenePicker::pickFromCamera(glm::ivec2 pickPos) { } btCollisionWorld::ClosestRayResultCallback ScenePicker::pickFromCamera() { } btCollisionWorld::ClosestRayResultCallback ScenePicker::pick(glm::vec3 start, glm::vec3 end) { } glm::vec3 ScenePicker::pickPixel(glm::ivec2 pixelPos) { }