mirror of
https://github.com/overte-org/overte.git
synced 2025-08-09 22:51:20 +02:00
started working on rendering controllers
This commit is contained in:
parent
b6c0ae4bea
commit
653b0d7789
4 changed files with 102 additions and 5 deletions
|
@ -3743,6 +3743,7 @@ void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool se
|
||||||
}
|
}
|
||||||
renderArgs->_debugFlags = renderDebugFlags;
|
renderArgs->_debugFlags = renderDebugFlags;
|
||||||
_entities.render(renderArgs);
|
_entities.render(renderArgs);
|
||||||
|
ViveControllerManager::getInstance().render(renderArgs);
|
||||||
}
|
}
|
||||||
|
|
||||||
// render the ambient occlusion effect if enabled
|
// render the ambient occlusion effect if enabled
|
||||||
|
|
|
@ -3,7 +3,7 @@ set(TARGET_NAME input-plugins)
|
||||||
setup_hifi_library()
|
setup_hifi_library()
|
||||||
|
|
||||||
# use setup_hifi_library macro to setup our project and link appropriate Qt modules
|
# use setup_hifi_library macro to setup our project and link appropriate Qt modules
|
||||||
link_hifi_libraries(shared plugins)
|
link_hifi_libraries(shared plugins gpu render-utils)
|
||||||
|
|
||||||
GroupSources("src/input-plugins")
|
GroupSources("src/input-plugins")
|
||||||
|
|
||||||
|
|
|
@ -13,6 +13,10 @@
|
||||||
|
|
||||||
#include <PerfStat.h>
|
#include <PerfStat.h>
|
||||||
|
|
||||||
|
#include "GeometryCache.h"
|
||||||
|
#include <gpu/Batch.h>
|
||||||
|
#include <gpu/Context.h>
|
||||||
|
#include <DeferredLightingEffect.h>
|
||||||
#include <display-plugins\openvr\OpenVrHelpers.h>
|
#include <display-plugins\openvr\OpenVrHelpers.h>
|
||||||
#include "NumericalConstants.h"
|
#include "NumericalConstants.h"
|
||||||
#include "UserActivityLogger.h"
|
#include "UserActivityLogger.h"
|
||||||
|
@ -40,6 +44,8 @@ const unsigned int GRIP_BUTTON = 1U << 2;
|
||||||
const unsigned int TRACKPAD_BUTTON = 1U << 3;
|
const unsigned int TRACKPAD_BUTTON = 1U << 3;
|
||||||
const unsigned int TRIGGER_BUTTON = 1U << 4;
|
const unsigned int TRIGGER_BUTTON = 1U << 4;
|
||||||
|
|
||||||
|
const QString CONTROLLER_MODEL_STRING = "vr_controller_05_wireless_b";
|
||||||
|
|
||||||
ViveControllerManager& ViveControllerManager::getInstance() {
|
ViveControllerManager& ViveControllerManager::getInstance() {
|
||||||
static ViveControllerManager sharedInstance;
|
static ViveControllerManager sharedInstance;
|
||||||
return sharedInstance;
|
return sharedInstance;
|
||||||
|
@ -48,7 +54,8 @@ ViveControllerManager& ViveControllerManager::getInstance() {
|
||||||
ViveControllerManager::ViveControllerManager() :
|
ViveControllerManager::ViveControllerManager() :
|
||||||
_isInitialized(false),
|
_isInitialized(false),
|
||||||
_isEnabled(true),
|
_isEnabled(true),
|
||||||
_trackedControllers(0)
|
_trackedControllers(0),
|
||||||
|
_modelLoaded(false)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -98,9 +105,90 @@ void ViveControllerManager::activate() {
|
||||||
Q_ASSERT(eError == vr::HmdError_None);
|
Q_ASSERT(eError == vr::HmdError_None);
|
||||||
}
|
}
|
||||||
Q_ASSERT(_hmd);
|
Q_ASSERT(_hmd);
|
||||||
|
|
||||||
|
vr::RenderModel_t model;
|
||||||
|
if (!_hmd->LoadRenderModel(CONTROLLER_MODEL_STRING.toStdString().c_str(), &model)) {
|
||||||
|
qDebug("Unable to load render model %s\n", CONTROLLER_MODEL_STRING);
|
||||||
|
} else {
|
||||||
|
model::Mesh* mesh = new model::Mesh();
|
||||||
|
model::MeshPointer meshPtr(mesh);
|
||||||
|
_modelGeometry.setMesh(meshPtr);
|
||||||
|
|
||||||
|
auto indexBuffer = new gpu::Buffer(3 * model.unTriangleCount * sizeof(uint16_t), (gpu::Byte*)model.rIndexData);
|
||||||
|
auto indexBufferPtr = gpu::BufferPointer(indexBuffer);
|
||||||
|
auto indexBufferView = new gpu::BufferView(indexBufferPtr, gpu::Element(gpu::SCALAR, gpu::UINT16, gpu::RAW));
|
||||||
|
mesh->setIndexBuffer(*indexBufferView);
|
||||||
|
|
||||||
|
auto vertexBuffer = new gpu::Buffer(model.unVertexCount * sizeof(vr::RenderModel_Vertex_t),
|
||||||
|
(gpu::Byte*)model.rVertexData);
|
||||||
|
auto vertexBufferPtr = gpu::BufferPointer(vertexBuffer);
|
||||||
|
auto vertexBufferView = new gpu::BufferView(vertexBufferPtr,
|
||||||
|
0,
|
||||||
|
vertexBufferPtr->getSize() - sizeof(float) * 3,
|
||||||
|
sizeof(vr::RenderModel_Vertex_t),
|
||||||
|
gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::RAW));
|
||||||
|
mesh->setVertexBuffer(*vertexBufferView);
|
||||||
|
mesh->addAttribute(gpu::Stream::NORMAL,
|
||||||
|
gpu::BufferView(vertexBufferPtr,
|
||||||
|
sizeof(float) * 3,
|
||||||
|
vertexBufferPtr->getSize() - sizeof(float) * 3,
|
||||||
|
sizeof(vr::RenderModel_Vertex_t),
|
||||||
|
gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::RAW)));
|
||||||
|
//mesh->addAttribute(gpu::Stream::TEXCOORD,
|
||||||
|
// gpu::BufferView(vertexBufferPtr,
|
||||||
|
// 2 * sizeof(float) * 3,
|
||||||
|
// vertexBufferPtr->getSize() - sizeof(float) * 3,
|
||||||
|
// sizeof(vr::RenderModel_Vertex_t),
|
||||||
|
// gpu::Element(gpu::VEC2, gpu::FLOAT, gpu::RAW)));
|
||||||
|
|
||||||
|
_modelLoaded = true;
|
||||||
|
}
|
||||||
|
|
||||||
_isInitialized = true;
|
_isInitialized = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ViveControllerManager::render(RenderArgs* args) {
|
||||||
|
PerformanceTimer perfTimer("ViveControllerManager::render");
|
||||||
|
|
||||||
|
if (_modelLoaded) {
|
||||||
|
UserInputMapper::PoseValue leftHand = _poseStateMap[makeInput(JointChannel::LEFT_HAND).getChannel()];
|
||||||
|
UserInputMapper::PoseValue rightHand = _poseStateMap[makeInput(JointChannel::RIGHT_HAND).getChannel()];
|
||||||
|
|
||||||
|
gpu::Batch batch;
|
||||||
|
auto geometryCache = DependencyManager::get<GeometryCache>();
|
||||||
|
geometryCache->useSimpleDrawPipeline(batch);
|
||||||
|
batch.setProjectionTransform(mat4());
|
||||||
|
|
||||||
|
if (leftHand.isValid()) {
|
||||||
|
renderHand(leftHand, batch);
|
||||||
|
}
|
||||||
|
if (rightHand.isValid()) {
|
||||||
|
renderHand(rightHand, batch);
|
||||||
|
}
|
||||||
|
|
||||||
|
args->_context->syncCache();
|
||||||
|
args->_context->render(batch);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ViveControllerManager::renderHand(UserInputMapper::PoseValue pose, gpu::Batch& batch) {
|
||||||
|
Transform transform;
|
||||||
|
transform.setTranslation(pose.getTranslation());
|
||||||
|
transform.setRotation(pose.getRotation());
|
||||||
|
|
||||||
|
auto mesh = _modelGeometry.getMesh();
|
||||||
|
DependencyManager::get<DeferredLightingEffect>()->bindSimpleProgram(batch);
|
||||||
|
batch.setModelTransform(transform);
|
||||||
|
batch.setInputFormat(mesh->getVertexFormat());
|
||||||
|
batch.setInputBuffer(gpu::Stream::POSITION, mesh->getVertexBuffer());
|
||||||
|
batch.setInputBuffer(gpu::Stream::NORMAL,
|
||||||
|
mesh->getVertexBuffer()._buffer,
|
||||||
|
sizeof(float) * 3,
|
||||||
|
mesh->getVertexBuffer()._stride);
|
||||||
|
batch.setIndexBuffer(gpu::UINT16, mesh->getIndexBuffer()._buffer, 0);
|
||||||
|
batch.drawIndexed(gpu::TRIANGLES, mesh->getNumIndices(), 0);
|
||||||
|
}
|
||||||
|
|
||||||
void ViveControllerManager::update() {
|
void ViveControllerManager::update() {
|
||||||
if (!_hmd) {
|
if (!_hmd) {
|
||||||
return;
|
return;
|
||||||
|
@ -108,7 +196,7 @@ void ViveControllerManager::update() {
|
||||||
_buttonPressedMap.clear();
|
_buttonPressedMap.clear();
|
||||||
if (_isInitialized && _isEnabled) {
|
if (_isInitialized && _isEnabled) {
|
||||||
|
|
||||||
PerformanceTimer perfTimer("Vive Controllers");
|
PerformanceTimer perfTimer("ViveControllerManager::update");
|
||||||
|
|
||||||
int numTrackedControllers = 0;
|
int numTrackedControllers = 0;
|
||||||
|
|
||||||
|
|
|
@ -17,8 +17,10 @@
|
||||||
|
|
||||||
#include <GLMHelpers.h>
|
#include <GLMHelpers.h>
|
||||||
|
|
||||||
#include "UserInputMapper.h"
|
#include <model/Geometry.h>
|
||||||
#include "plugins/Plugin.h"
|
#include "plugins/Plugin.h"
|
||||||
|
#include <RenderArgs.h>
|
||||||
|
#include "UserInputMapper.h"
|
||||||
|
|
||||||
class ViveControllerManager : public Plugin {
|
class ViveControllerManager : public Plugin {
|
||||||
public:
|
public:
|
||||||
|
@ -64,7 +66,8 @@ public:
|
||||||
};
|
};
|
||||||
|
|
||||||
void focusOutEvent();
|
void focusOutEvent();
|
||||||
|
|
||||||
|
void render(RenderArgs* args);
|
||||||
void update();
|
void update();
|
||||||
|
|
||||||
static ViveControllerManager& getInstance();
|
static ViveControllerManager& getInstance();
|
||||||
|
@ -89,6 +92,8 @@ public:
|
||||||
private:
|
private:
|
||||||
ViveControllerManager();
|
ViveControllerManager();
|
||||||
~ViveControllerManager();
|
~ViveControllerManager();
|
||||||
|
|
||||||
|
void renderHand(UserInputMapper::PoseValue pose, gpu::Batch& batch);
|
||||||
|
|
||||||
void handleButtonEvent(uint64_t buttons, int index);
|
void handleButtonEvent(uint64_t buttons, int index);
|
||||||
void handleAxisEvent(Axis axis, float x, float y, int index);
|
void handleAxisEvent(Axis axis, float x, float y, int index);
|
||||||
|
@ -98,6 +103,9 @@ private:
|
||||||
bool _isEnabled;
|
bool _isEnabled;
|
||||||
int _trackedControllers;
|
int _trackedControllers;
|
||||||
|
|
||||||
|
bool _modelLoaded;
|
||||||
|
model::Geometry _modelGeometry;
|
||||||
|
|
||||||
static const QString NAME;
|
static const QString NAME;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
Loading…
Reference in a new issue