mirror of
https://github.com/lubosz/overte.git
synced 2025-04-16 14:16:36 +02:00
Remove uniforms from item status
This commit is contained in:
parent
271651737b
commit
07fba89f0f
3 changed files with 44 additions and 10 deletions
|
@ -170,13 +170,45 @@ void DrawStatus::run(const RenderContextPointer& renderContext, const Input& inp
|
|||
batch.setPipeline(getDrawItemStatusPipeline());
|
||||
|
||||
if (_showNetwork) {
|
||||
for (size_t i = 0; i < itemBounds.size(); i++) {
|
||||
batch._glUniform3fv(gpu::slot::uniform::Extra0, 1, (const float*)&itemBounds[i].bound.getCorner());
|
||||
batch._glUniform3fv(gpu::slot::uniform::Extra1, 1, ((const float*)&itemBounds[i].bound.getScale()));
|
||||
batch._glUniform4iv(gpu::slot::uniform::Extra2, 1, (const int*)&(itemStatus[i].first));
|
||||
batch._glUniform4iv(gpu::slot::uniform::Extra3, 1, (const int*)&(itemStatus[i].second));
|
||||
batch.draw(gpu::TRIANGLES, 24 * NUM_STATUS_VEC4_PER_ITEM, 0);
|
||||
if (!_instanceBuffer) {
|
||||
_instanceBuffer = std::make_shared<gpu::Buffer>();
|
||||
}
|
||||
|
||||
struct InstanceData {
|
||||
vec4 boundPos;
|
||||
vec4 boundDim;
|
||||
ivec4 status0;
|
||||
ivec4 status1;
|
||||
};
|
||||
|
||||
if (!_vertexFormat) {
|
||||
_vertexFormat = std::make_shared<gpu::Stream::Format>();
|
||||
_vertexFormat->setAttribute(0, 0, gpu::Element(gpu::VEC4, gpu::FLOAT, gpu::XYZW), offsetof(InstanceData, boundPos), gpu::Stream::PER_INSTANCE);
|
||||
_vertexFormat->setAttribute(1, 0, gpu::Element(gpu::VEC4, gpu::FLOAT, gpu::XYZW), offsetof(InstanceData, boundDim), gpu::Stream::PER_INSTANCE);
|
||||
_vertexFormat->setAttribute(2, 0, gpu::Element(gpu::VEC4, gpu::INT32, gpu::XYZW), offsetof(InstanceData, status0), gpu::Stream::PER_INSTANCE);
|
||||
_vertexFormat->setAttribute(3, 0, gpu::Element(gpu::VEC4, gpu::INT32, gpu::XYZW), offsetof(InstanceData, status1), gpu::Stream::PER_INSTANCE);
|
||||
}
|
||||
|
||||
batch.setInputFormat(_vertexFormat);
|
||||
std::vector<InstanceData> instanceData;
|
||||
instanceData.resize(itemBounds.size());
|
||||
for (size_t i = 0; i < itemBounds.size(); i++) {
|
||||
InstanceData& item = instanceData[i];
|
||||
const auto& bound = itemBounds[i].bound;
|
||||
const auto& status = itemStatus[i];
|
||||
item.boundPos = vec4(bound.getCorner(), 1.0f);
|
||||
item.boundDim = vec4(bound.getScale(), 1.0f);
|
||||
item.status0 = status.first;
|
||||
item.status1 = status.second;
|
||||
}
|
||||
|
||||
auto instanceBufferSize = sizeof(InstanceData) * instanceData.size();
|
||||
if (_instanceBuffer->getSize() < instanceBufferSize) {
|
||||
_instanceBuffer->resize(instanceBufferSize);
|
||||
}
|
||||
_instanceBuffer->setSubData(0, instanceData);
|
||||
batch.setInputBuffer(0, _instanceBuffer, 0, sizeof(InstanceData));
|
||||
batch.drawInstanced(instanceData.size(), gpu::TRIANGLES, 24 * NUM_STATUS_VEC4_PER_ITEM);
|
||||
}
|
||||
batch.setResourceTexture(0, 0);
|
||||
});
|
||||
|
|
|
@ -63,6 +63,8 @@ namespace render {
|
|||
gpu::PipelinePointer _drawItemStatusPipeline;
|
||||
|
||||
gpu::BufferPointer _boundsBuffer;
|
||||
gpu::BufferPointer _instanceBuffer;
|
||||
gpu::Stream::FormatPointer _vertexFormat;
|
||||
gpu::TexturePointer _statusIconMap;
|
||||
};
|
||||
}
|
||||
|
|
|
@ -20,10 +20,10 @@
|
|||
layout(location=0) out vec4 varColor;
|
||||
layout(location=1) out vec3 varTexcoord;
|
||||
|
||||
layout(location=GPU_UNIFORM_EXTRA0) uniform vec3 inBoundPos;
|
||||
layout(location=GPU_UNIFORM_EXTRA1) uniform vec3 inBoundDim;
|
||||
layout(location=GPU_UNIFORM_EXTRA2) uniform ivec4 inStatus0;
|
||||
layout(location=GPU_UNIFORM_EXTRA3) uniform ivec4 inStatus1;
|
||||
layout(location=0) in vec3 inBoundPos;
|
||||
layout(location=1) in vec3 inBoundDim;
|
||||
layout(location=2) in ivec4 inStatus0;
|
||||
layout(location=3) in ivec4 inStatus1;
|
||||
|
||||
vec3 paintRainbow(float normalizedHue) {
|
||||
float v = normalizedHue * 6.f;
|
||||
|
|
Loading…
Reference in a new issue