2020-08-06 00:54:43 +02:00
|
|
|
#include "VertexShaderInput.h"
|
|
|
|
|
#include "Graphics/Mesh.h"
|
2020-10-03 11:00:10 +02:00
|
|
|
#include "Graphics/Graphics.h"
|
2020-08-06 00:54:43 +02:00
|
|
|
#include <sstream>
|
|
|
|
|
#include <memory>
|
|
|
|
|
|
|
|
|
|
using namespace Seele;
|
|
|
|
|
|
2020-09-19 14:36:50 +02:00
|
|
|
List<VertexInputType*> VertexInputType::globalTypeList;
|
|
|
|
|
|
2020-10-03 11:00:10 +02:00
|
|
|
List<VertexInputType*>& VertexInputType::getTypeList()
|
2020-09-19 14:36:50 +02:00
|
|
|
{
|
|
|
|
|
return globalTypeList;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
VertexInputType* VertexInputType::getVertexInputByName(const std::string& name)
|
|
|
|
|
{
|
|
|
|
|
for(auto type : globalTypeList)
|
|
|
|
|
{
|
|
|
|
|
if(name.compare(type->getName()) == 0)
|
|
|
|
|
{
|
|
|
|
|
return type;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return nullptr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
VertexInputType::VertexInputType(const char* name,
|
|
|
|
|
const char* shaderFilename)
|
|
|
|
|
: name(name)
|
|
|
|
|
, shaderFilename(shaderFilename)
|
|
|
|
|
{
|
|
|
|
|
globalTypeList.add(this);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
VertexInputType::~VertexInputType()
|
|
|
|
|
{
|
|
|
|
|
globalTypeList.remove(globalTypeList.find(this));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const char* VertexInputType::getName()
|
|
|
|
|
{
|
|
|
|
|
return name;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const char* VertexInputType::getShaderFilename()
|
|
|
|
|
{
|
|
|
|
|
return shaderFilename;
|
|
|
|
|
}
|
2020-08-06 00:54:43 +02:00
|
|
|
|
|
|
|
|
VertexShaderInput::VertexShaderInput(std::string name)
|
|
|
|
|
: name(name)
|
|
|
|
|
{
|
2020-09-19 14:36:50 +02:00
|
|
|
declaration = new Gfx::VertexDeclaration();
|
2020-08-06 00:54:43 +02:00
|
|
|
positionDeclaration = new Gfx::VertexDeclaration();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
VertexShaderInput::~VertexShaderInput()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
2021-11-18 12:48:21 +01:00
|
|
|
void VertexShaderInput::init(Gfx::PGraphics) {}
|
|
|
|
|
|
2020-08-06 00:54:43 +02:00
|
|
|
void VertexShaderInput::getStreams(VertexInputStreamArray& outVertexStreams) const
|
|
|
|
|
{
|
|
|
|
|
for(uint32 i = 0; i < streams.size(); ++i)
|
|
|
|
|
{
|
2020-10-03 11:00:10 +02:00
|
|
|
const VertexStream& stream = streams[i];
|
2020-08-06 00:54:43 +02:00
|
|
|
if(stream.vertexBuffer == nullptr)
|
|
|
|
|
{
|
|
|
|
|
outVertexStreams.add(VertexInputStream(i, 0, nullptr));
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
outVertexStreams.add(VertexInputStream(i, stream.offset, stream.vertexBuffer));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void VertexShaderInput::getPositionOnlyStream(VertexInputStreamArray& outVertexStreams) const
|
|
|
|
|
{
|
|
|
|
|
for (uint32 i = 0; i < positionStreams.size(); ++i)
|
|
|
|
|
{
|
2020-10-03 11:00:10 +02:00
|
|
|
const VertexStream& stream = positionStreams[i];
|
2020-08-06 00:54:43 +02:00
|
|
|
outVertexStreams.add(VertexInputStream(i, stream.offset, stream.vertexBuffer));
|
|
|
|
|
}
|
2020-10-03 11:00:10 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Gfx::VertexElement VertexShaderInput::accessStreamComponent(const VertexStreamComponent& component, uint8 attributeIndex)
|
|
|
|
|
{
|
|
|
|
|
VertexStream vertexStream;
|
|
|
|
|
vertexStream.vertexBuffer = component.vertexBuffer;
|
|
|
|
|
vertexStream.stride = component.stride;
|
|
|
|
|
vertexStream.offset = component.offset;
|
|
|
|
|
|
2021-03-31 12:18:16 +02:00
|
|
|
return Gfx::VertexElement((uint8)streams.indexOf(streams.addUnique(vertexStream)), component.offset, component.type, attributeIndex, vertexStream.stride);
|
2020-10-03 11:00:10 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Gfx::VertexElement VertexShaderInput::accessPositionStreamComponent(const VertexStreamComponent& component, uint8 attributeIndex)
|
|
|
|
|
{
|
|
|
|
|
VertexStream vertexStream;
|
|
|
|
|
vertexStream.vertexBuffer = component.vertexBuffer;
|
|
|
|
|
vertexStream.stride = component.stride;
|
|
|
|
|
vertexStream.offset = component.offset;
|
|
|
|
|
|
2021-05-06 17:02:10 +02:00
|
|
|
return Gfx::VertexElement((uint8)positionStreams.indexOf(positionStreams.addUnique(vertexStream)), component.offset, component.type, attributeIndex, vertexStream.stride);
|
2020-10-03 11:00:10 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void VertexShaderInput::initDeclaration(Gfx::PGraphics graphics, Array<Gfx::VertexElement>& elements)
|
|
|
|
|
{
|
|
|
|
|
declaration = graphics->createVertexDeclaration(elements);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void VertexShaderInput::initPositionDeclaration(Gfx::PGraphics graphics, const Array<Gfx::VertexElement>& elements)
|
|
|
|
|
{
|
|
|
|
|
positionDeclaration = graphics->createVertexDeclaration(elements);
|
2020-08-06 00:54:43 +02:00
|
|
|
}
|