2020-06-02 11:46:18 +02:00
|
|
|
#include "MeshProcessor.h"
|
|
|
|
|
#include "Graphics/Graphics.h"
|
2020-08-06 00:54:43 +02:00
|
|
|
#include "Graphics/VertexShaderInput.h"
|
2020-06-02 11:46:18 +02:00
|
|
|
|
|
|
|
|
using namespace Seele;
|
|
|
|
|
|
|
|
|
|
MeshProcessor::MeshProcessor(const PScene scene, Gfx::PGraphics graphics)
|
|
|
|
|
: scene(scene)
|
|
|
|
|
, graphics(graphics)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
MeshProcessor::~MeshProcessor()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
2020-06-08 01:44:47 +02:00
|
|
|
void MeshProcessor::buildMeshDrawCommand(
|
2020-06-02 11:46:18 +02:00
|
|
|
const MeshBatch& meshBatch,
|
2020-06-08 01:44:47 +02:00
|
|
|
const PPrimitiveComponent primitiveComponent,
|
|
|
|
|
const Gfx::PRenderPass renderPass,
|
|
|
|
|
Gfx::PRenderCommand drawCommand,
|
2020-06-02 11:46:18 +02:00
|
|
|
PMaterial material,
|
|
|
|
|
Gfx::PVertexShader vertexShader,
|
|
|
|
|
Gfx::PControlShader controlShader,
|
|
|
|
|
Gfx::PEvaluationShader evaluationShader,
|
|
|
|
|
Gfx::PGeometryShader geometryShader,
|
|
|
|
|
Gfx::PFragmentShader fragmentShader,
|
|
|
|
|
bool positionOnly)
|
|
|
|
|
{
|
2020-08-06 00:54:43 +02:00
|
|
|
const PVertexShaderInput vertexInput = meshBatch.vertexInput;
|
2020-06-02 11:46:18 +02:00
|
|
|
|
|
|
|
|
GraphicsPipelineCreateInfo pipelineInitializer;
|
|
|
|
|
pipelineInitializer.topology = meshBatch.topology;
|
2020-08-06 00:54:43 +02:00
|
|
|
Gfx::PVertexDeclaration vertexDecl = positionOnly ? vertexInput->getPositionDeclaration() : vertexInput->getDeclaration();
|
2020-06-02 11:46:18 +02:00
|
|
|
pipelineInitializer.vertexDeclaration = vertexDecl;
|
|
|
|
|
pipelineInitializer.vertexShader = vertexShader;
|
|
|
|
|
pipelineInitializer.controlShader = controlShader;
|
|
|
|
|
pipelineInitializer.evalShader = evaluationShader;
|
|
|
|
|
pipelineInitializer.geometryShader = geometryShader;
|
|
|
|
|
pipelineInitializer.fragmentShader = fragmentShader;
|
2020-06-08 01:44:47 +02:00
|
|
|
pipelineInitializer.renderPass = renderPass;
|
2020-06-02 11:46:18 +02:00
|
|
|
|
|
|
|
|
VertexInputStreamArray vertexStreams;
|
|
|
|
|
if(positionOnly)
|
|
|
|
|
{
|
2020-08-06 00:54:43 +02:00
|
|
|
vertexInput->getPositionOnlyStream(vertexStreams);
|
2020-06-02 11:46:18 +02:00
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2020-08-06 00:54:43 +02:00
|
|
|
vertexInput->getStreams(vertexStreams);
|
2020-06-02 11:46:18 +02:00
|
|
|
}
|
2020-06-08 01:44:47 +02:00
|
|
|
drawCommand->bindVertexBuffer(vertexStreams);
|
|
|
|
|
Gfx::PGraphicsPipeline pipeline = graphics->createGraphicsPipeline(pipelineInitializer);
|
|
|
|
|
drawCommand->bindPipeline(pipeline);
|
|
|
|
|
for(auto element : meshBatch.elements)
|
2020-06-02 11:46:18 +02:00
|
|
|
{
|
2020-06-08 01:44:47 +02:00
|
|
|
drawCommand->bindIndexBuffer(element.indexBuffer);
|
|
|
|
|
drawCommand->draw(element);
|
|
|
|
|
}
|
2020-06-02 11:46:18 +02:00
|
|
|
}
|