|
|
|
|
@ -26,10 +26,8 @@
|
|
|
|
|
#include "ObjectRenderer.h" |
|
|
|
|
|
|
|
|
|
#include "Magnum/DebugTools/ResourceManager.h" |
|
|
|
|
#include "Magnum/GL/Buffer.h" |
|
|
|
|
#include "Magnum/GL/Mesh.h" |
|
|
|
|
#include "Magnum/MeshTools/CompressIndices.h" |
|
|
|
|
#include "Magnum/MeshTools/Interleave.h" |
|
|
|
|
#include "Magnum/MeshTools/Compile.h" |
|
|
|
|
#include "Magnum/Primitives/Axis.h" |
|
|
|
|
#include "Magnum/SceneGraph/Camera.h" |
|
|
|
|
#include "Magnum/Shaders/VertexColor.h" |
|
|
|
|
@ -44,16 +42,12 @@ template<UnsignedInt> struct Renderer;
|
|
|
|
|
|
|
|
|
|
template<> struct Renderer<2> { |
|
|
|
|
static ResourceKey shader() { return {"VertexColorShader2D"}; } |
|
|
|
|
static ResourceKey vertexBuffer() { return {"object2d-vertices"}; } |
|
|
|
|
static ResourceKey indexBuffer() { return {"object2d-indices"}; } |
|
|
|
|
static ResourceKey mesh() { return {"object2d"}; } |
|
|
|
|
static Trade::MeshData2D meshData() { return Primitives::axis2D(); } |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
template<> struct Renderer<3> { |
|
|
|
|
static ResourceKey shader() { return {"VertexColorShader3D"}; } |
|
|
|
|
static ResourceKey vertexBuffer() { return {"object3d-vertices"}; } |
|
|
|
|
static ResourceKey indexBuffer() { return {"object3d-indices"}; } |
|
|
|
|
static ResourceKey mesh() { return {"object3d"}; } |
|
|
|
|
static Trade::MeshData3D meshData() { return Primitives::axis3D(); } |
|
|
|
|
}; |
|
|
|
|
@ -66,32 +60,9 @@ template<UnsignedInt dimensions> ObjectRenderer<dimensions>::ObjectRenderer(Scen
|
|
|
|
|
_shader = ResourceManager::instance().get<GL::AbstractShaderProgram, Shaders::VertexColor<dimensions>>(Renderer<dimensions>::shader()); |
|
|
|
|
if(!_shader) ResourceManager::instance().set<GL::AbstractShaderProgram>(_shader.key(), new Shaders::VertexColor<dimensions>); |
|
|
|
|
|
|
|
|
|
/* Mesh and vertex buffer */ |
|
|
|
|
/* Mesh */ |
|
|
|
|
_mesh = ResourceManager::instance().get<GL::Mesh>(Renderer<dimensions>::mesh()); |
|
|
|
|
_vertexBuffer = ResourceManager::instance().get<GL::Buffer>(Renderer<dimensions>::vertexBuffer()); |
|
|
|
|
_indexBuffer = ResourceManager::instance().get<GL::Buffer>(Renderer<dimensions>::indexBuffer()); |
|
|
|
|
if(_mesh) return; |
|
|
|
|
|
|
|
|
|
/* Create the mesh */ |
|
|
|
|
GL::Buffer* vertexBuffer = new GL::Buffer{GL::Buffer::TargetHint::Array}; |
|
|
|
|
GL::Buffer* indexBuffer = new GL::Buffer{GL::Buffer::TargetHint::ElementArray}; |
|
|
|
|
GL::Mesh* mesh = new GL::Mesh; |
|
|
|
|
|
|
|
|
|
auto data = Renderer<dimensions>::meshData(); |
|
|
|
|
|
|
|
|
|
vertexBuffer->setData(MeshTools::interleave(data.positions(0), data.colors(0)), GL::BufferUsage::StaticDraw); |
|
|
|
|
ResourceManager::instance().set(_vertexBuffer.key(), vertexBuffer, ResourceDataState::Final, ResourcePolicy::Manual); |
|
|
|
|
|
|
|
|
|
indexBuffer->setData(MeshTools::compressIndicesAs<UnsignedByte>(data.indices()), GL::BufferUsage::StaticDraw); |
|
|
|
|
ResourceManager::instance().set(_indexBuffer.key(), indexBuffer, ResourceDataState::Final, ResourcePolicy::Manual); |
|
|
|
|
|
|
|
|
|
mesh->setPrimitive(GL::MeshPrimitive::Lines) |
|
|
|
|
.setCount(data.indices().size()) |
|
|
|
|
.addVertexBuffer(*vertexBuffer, 0, |
|
|
|
|
typename Shaders::VertexColor<dimensions>::Position(), |
|
|
|
|
typename Shaders::VertexColor<dimensions>::Color4{}) |
|
|
|
|
.setIndexBuffer(*indexBuffer, 0, GL::MeshIndexType::UnsignedByte, 0, data.positions(0).size()); |
|
|
|
|
ResourceManager::instance().set<GL::Mesh>(_mesh.key(), mesh, ResourceDataState::Final, ResourcePolicy::Manual); |
|
|
|
|
if(!_mesh) ResourceManager::instance().set<GL::Mesh>(_mesh.key(), MeshTools::compile(Renderer<dimensions>::meshData())); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* To avoid deleting pointers to incomplete type on destruction of Resource members */ |
|
|
|
|
|