SparrowEngine/src/tools/scenepicker.cpp

118 lines
3.2 KiB
C++

#include "scenepicker.h"
#include "engine.h"
#include "editor.h"
#include "scene/scenetree.h"
#include "scene/playercharacternode.h"
#include "scene/physicsdebugnode.h"
#include <SparrowRenderer/parametricmesh.h>
#include <SparrowRenderer/pbrmaterial.h>
#include <SparrowRenderer/camera.h>
#include <imgui/imgui.h>
#include <btBulletCollisionCommon.h>
#include <btBulletDynamicsCommon.h>
#include <BulletDynamics/Character/btKinematicCharacterController.h>
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<FirstPersonCamera*>(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<SceneNode*>(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)
{
}