Reworking VertexData

This commit is contained in:
Dynamitos
2023-10-24 15:01:09 +02:00
parent a47f17481b
commit 28e5c9ff01
61 changed files with 1157 additions and 1144 deletions
-54
View File
@@ -16,7 +16,6 @@ Scene::Scene(Gfx::PGraphics graphics)
: graphics(graphics)
, physics(registry)
{
ShaderBufferCreateInfo structInfo = {
.resourceData = {
.size = sizeof(Component::DirectionalLight) * MAX_DIRECTIONAL_LIGHTS,
@@ -50,59 +49,6 @@ void Scene::update(float deltaTime)
physics.update(deltaTime);
}
Array<MeshBatch> Scene::getStaticMeshes()
{
Array<MeshBatch> result;
auto view = registry.view<Component::StaticMesh, Component::Transform>();
uint32 sceneDataIndex = 0;
sceneData.clear();
for(auto&& [entity, mesh, transform] : view.each())
{
sceneData.add(PrimitiveSceneData {
.localToWorld = transform.toMatrix(),
.worldToLocal = glm::inverse(transform.toMatrix()),
.actorLocation = Vector4(transform.getPosition(), 1.0f)
});
for(auto& m : mesh.mesh->meshes)
{
auto& batch = result.add();
batch.material = m->referencedMaterial->getMaterial();
batch.isBackfaceCullingDisabled = false;
batch.isCastingShadow = true;
batch.topology = Gfx::SE_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
batch.useReverseCulling = false;
batch.useWireframe = false;
batch.vertexInput = m->vertexInput;
MeshBatchElement batchElement;
batchElement.baseVertexIndex = 0;
batchElement.firstIndex = 0;
batchElement.indexBuffer = m->indexBuffer;
batchElement.indirectArgsBuffer = nullptr;
batchElement.isInstanced = false;
batchElement.numInstances = 1;
batchElement.sceneDataIndex = sceneDataIndex;
batch.elements.add(batchElement);
}
sceneDataIndex++;
}
if(sceneDataBuffer == nullptr || sceneDataBuffer->getNumElements() != sceneData.size())
{
ShaderBufferCreateInfo createInfo = ShaderBufferCreateInfo {
.resourceData = {
.size = sceneData.size() * sizeof(PrimitiveSceneData),
.data = nullptr,
},
.stride = (uint32)sceneData.size(),
};
sceneDataBuffer = graphics->createShaderBuffer(createInfo);
}
sceneDataBuffer->updateContents(BulkResourceData {
.size = sceneData.size() * sizeof(PrimitiveSceneData),
.data = (uint8*)sceneData.data(),
});
return result;
}
LightEnv Scene::getLightBuffer()
{
StaticArray<Component::DirectionalLight, MAX_DIRECTIONAL_LIGHTS> dirLights;
+3 -13
View File
@@ -50,26 +50,16 @@ public:
{
return registry.get<Component>(entity);
}
template<typename Component, typename Func>
void view(Func func) requires std::is_invocable_v<Func, Component&>
template<typename... Component, typename Func>
void view(Func func) requires std::is_invocable_v<Func, Component&...> || std::is_invocable_v<Func, entt::entity, Component&...>
{
registry.view<Component>().each(func);
registry.view<Component...>().each(func);
}
Array<MeshBatch> getStaticMeshes();
LightEnv getLightBuffer();
Component::Skybox getSkybox();
Gfx::PShaderBuffer getSceneDataBuffer() const { return sceneDataBuffer; }
Gfx::PGraphics getGraphics() const { return graphics; }
entt::registry registry;
private:
struct PrimitiveSceneData
{
Matrix4 localToWorld;
Matrix4 worldToLocal;
Vector4 actorLocation;
};
Array<PrimitiveSceneData> sceneData;
Gfx::PShaderBuffer sceneDataBuffer;
LightEnv lightEnv;
PhysicsSystem physics;
Gfx::PGraphics graphics;