Fixed bug where changes to meshes were not saved by batching system
This commit is contained in:
parent
cc1fe71d4b
commit
e733cd2e1c
|
@ -84,7 +84,7 @@ namespace Sandbox
|
|||
auto& collider = *SHComponentManager::GetComponent_s<SHColliderComponent>(entity);
|
||||
|
||||
//renderable.Mesh = handles.front();
|
||||
renderable.Mesh = CUBE_MESH;
|
||||
renderable.SetMesh(CUBE_MESH);
|
||||
renderable.SetMaterial(customMat);
|
||||
|
||||
if (y == 50)
|
||||
|
@ -108,7 +108,7 @@ namespace Sandbox
|
|||
auto& renderable = *SHComponentManager::GetComponent_s<SHRenderable>(raccoonSpin);
|
||||
auto& transform = *SHComponentManager::GetComponent_s<SHTransformComponent>(raccoonSpin);
|
||||
|
||||
renderable.Mesh = handles.front();
|
||||
renderable.SetMesh(handles.front());
|
||||
renderable.SetMaterial(customMat);
|
||||
renderable.GetModifiableMaterial()->SetProperty("data.color", SHVec4(0.0f, 0.0f, 0.0f, 0.0f));
|
||||
renderable.GetModifiableMaterial()->SetProperty("data.alpha", 1.0f);
|
||||
|
@ -123,7 +123,7 @@ namespace Sandbox
|
|||
auto& floorRigidBody = *SHComponentManager::GetComponent_s<SHRigidBodyComponent>(floor);
|
||||
auto& floorCollider = *SHComponentManager::GetComponent_s<SHColliderComponent>(floor);
|
||||
|
||||
floorRenderable.Mesh = CUBE_MESH;
|
||||
floorRenderable.SetMesh(CUBE_MESH);
|
||||
floorRenderable.SetMaterial(customMat);
|
||||
floorRenderable.GetModifiableMaterial()->SetProperty("data.color", SHVec4(1.0f, 1.0f, 1.0f, 1.0f));
|
||||
|
||||
|
@ -149,7 +149,7 @@ namespace Sandbox
|
|||
auto& renderableShowcase = *SHComponentManager::GetComponent_s<SHRenderable>(raccoonShowcase);
|
||||
auto& transformShowcase = *SHComponentManager::GetComponent_s<SHTransformComponent>(raccoonShowcase);
|
||||
|
||||
renderableShowcase.Mesh = handles.front();
|
||||
renderableShowcase.SetMesh(handles.front());
|
||||
renderableShowcase.SetMaterial(customMat);
|
||||
renderableShowcase.GetModifiableMaterial()->SetProperty("data.color", SHVec4(0.0f, 0.0f, 0.0f, 0.0f));
|
||||
renderableShowcase.GetModifiableMaterial()->SetProperty("data.alpha", 1.0f);
|
||||
|
|
|
@ -45,16 +45,20 @@ namespace SHADE
|
|||
|
||||
void SHBatch::Add(const SHRenderable* renderable)
|
||||
{
|
||||
// Ignore if null
|
||||
if (!renderable->GetMesh())
|
||||
return;
|
||||
|
||||
// Check if we have a SubBatch with the same mesh yet
|
||||
auto subBatch = std::find_if(subBatches.begin(), subBatches.end(), [&](const SHSubBatch& batch)
|
||||
{
|
||||
return batch.Mesh == renderable->Mesh;
|
||||
});
|
||||
{
|
||||
return batch.Mesh == renderable->GetMesh();
|
||||
});
|
||||
|
||||
// Create one if not found
|
||||
if (subBatch == subBatches.end())
|
||||
{
|
||||
subBatches.emplace_back(renderable->Mesh);
|
||||
subBatches.emplace_back(renderable->GetMesh());
|
||||
subBatch = subBatches.end() - 1;
|
||||
}
|
||||
|
||||
|
@ -73,7 +77,7 @@ namespace SHADE
|
|||
// Check if we have a SubBatch with the same mesh yet
|
||||
auto subBatch = std::find_if(subBatches.begin(), subBatches.end(), [&](const SHSubBatch& batch)
|
||||
{
|
||||
return batch.Mesh == renderable->Mesh;
|
||||
return batch.Mesh == renderable->GetMesh();
|
||||
});
|
||||
|
||||
// Attempt to remove if it exists
|
||||
|
@ -84,13 +88,18 @@ namespace SHADE
|
|||
|
||||
// Check if other renderables in subBatches contain the same material instance
|
||||
bool matUnused = true;
|
||||
|
||||
Handle<SHMaterialInstance> matToCheck = renderable->HasMaterialChanged() ? renderable->GetPrevMaterial() : renderable->GetMaterial();
|
||||
|
||||
for (const auto& sb : subBatches)
|
||||
{
|
||||
// Check material usage
|
||||
for (const auto& rendId : sb.Renderables)
|
||||
{
|
||||
auto rend = SHComponentManager::GetComponent<SHRenderable>(rendId);
|
||||
if (rend)
|
||||
{
|
||||
if (rend->GetMaterial() == renderable->GetMaterial())
|
||||
if (rend->GetMaterial() == matToCheck)
|
||||
{
|
||||
matUnused = false;
|
||||
break;
|
||||
|
@ -101,10 +110,15 @@ namespace SHADE
|
|||
SHLOG_WARNING("[SHBatch] Entity with a missing SHRenderable found!");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Material is no longer in this library, so we remove it
|
||||
if (matUnused)
|
||||
referencedMatInstances.erase(renderable->WasMaterialChanged() ? renderable->GetPrevMaterial() : renderable->GetMaterial());
|
||||
referencedMatInstances.erase(renderable->HasChanged() ? renderable->GetPrevMaterial() : renderable->GetMaterial());
|
||||
|
||||
// Mesh is no longer in this batch, so we remove the associated sub batch
|
||||
if (subBatch->Renderables.empty())
|
||||
subBatches.erase(subBatch);
|
||||
|
||||
// Mark all as dirty
|
||||
setAllDirtyFlags();
|
||||
|
|
|
@ -680,7 +680,7 @@ namespace SHADE
|
|||
auto& renderables = SHComponentManager::GetDense<SHRenderable>();
|
||||
for (auto& renderable : renderables)
|
||||
{
|
||||
if (!renderable.WasMaterialChanged())
|
||||
if (!renderable.HasChanged())
|
||||
continue;
|
||||
|
||||
// Remove from old material's SuperBatch
|
||||
|
|
|
@ -23,7 +23,7 @@ namespace SHADE
|
|||
/*-----------------------------------------------------------------------------------*/
|
||||
void SHRenderable::OnCreate()
|
||||
{
|
||||
materialChanged = true;
|
||||
matChanged = true;
|
||||
sharedMaterial = {};
|
||||
material = {};
|
||||
oldMaterial = {};
|
||||
|
@ -55,7 +55,7 @@ namespace SHADE
|
|||
return;
|
||||
|
||||
// Flag that material was changed
|
||||
materialChanged = true;
|
||||
matChanged = true;
|
||||
|
||||
// Free copies of materials if any
|
||||
if (material)
|
||||
|
@ -92,16 +92,34 @@ namespace SHADE
|
|||
|
||||
return material;
|
||||
}
|
||||
|
||||
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
/* Mesh Functions */
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
void SHRenderable::SetMesh(Handle<SHMesh> newMesh)
|
||||
{
|
||||
oldMesh = mesh;
|
||||
mesh = newMesh;
|
||||
meshChanged = true;
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
/* Light Functions */
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
uint8_t SHRenderable::GetLightLayer(void) const noexcept
|
||||
{
|
||||
return lightLayer;
|
||||
}
|
||||
|
||||
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
/* Batcher Dispatcher Functions */
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
void SHRenderable::ResetChangedFlag()
|
||||
{
|
||||
materialChanged = false;
|
||||
oldMaterial = {};
|
||||
matChanged = false;
|
||||
meshChanged = false;
|
||||
oldMaterial = {};
|
||||
oldMesh = {};
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -51,31 +51,38 @@ namespace SHADE
|
|||
void SetMaterial(Handle<SHMaterialInstance> materialInstance);
|
||||
Handle<SHMaterialInstance> GetMaterial() const;
|
||||
Handle<SHMaterialInstance> GetModifiableMaterial();
|
||||
Handle<SHMaterialInstance> GetPrevMaterial() const noexcept { return oldMaterial; }
|
||||
bool HasMaterialChanged() const noexcept { return matChanged; }
|
||||
|
||||
/*-------------------------------------------------------------------------------*/
|
||||
/* Getter Functions */
|
||||
/* Mesh Functions */
|
||||
/*-------------------------------------------------------------------------------*/
|
||||
void SetMesh(Handle<SHMesh> newMesh);
|
||||
Handle<SHMesh> GetMesh() const noexcept { return mesh; }
|
||||
Handle<SHMesh> GetPrevMesh() const noexcept { return oldMesh; }
|
||||
bool HasMeshChanged() const noexcept { return meshChanged; }
|
||||
|
||||
/*-------------------------------------------------------------------------------*/
|
||||
/* Light Functions */
|
||||
/*-------------------------------------------------------------------------------*/
|
||||
bool WasMaterialChanged() const noexcept { return materialChanged; }
|
||||
Handle<SHMaterialInstance> GetPrevMaterial() const noexcept { return oldMaterial; }
|
||||
uint8_t GetLightLayer (void) const noexcept;
|
||||
|
||||
/*-------------------------------------------------------------------------------*/
|
||||
/* Batcher Dispatcher Functions */
|
||||
/*-------------------------------------------------------------------------------*/
|
||||
bool HasChanged() const noexcept { return matChanged || meshChanged; } // Whether or not the mesh or material has changed
|
||||
void ResetChangedFlag(); // TODO: Lock it so that only SHBatcherDispatcher can access this
|
||||
|
||||
/*-------------------------------------------------------------------------------*/
|
||||
/* Data Members */
|
||||
/*-------------------------------------------------------------------------------*/
|
||||
Handle<SHMesh> Mesh;
|
||||
|
||||
private:
|
||||
/*-------------------------------------------------------------------------------*/
|
||||
/* Data Members */
|
||||
/*-------------------------------------------------------------------------------*/
|
||||
Handle<SHMesh> mesh;
|
||||
Handle<SHMesh> oldMesh;
|
||||
bool meshChanged = true;
|
||||
Handle<SHMaterialInstance> sharedMaterial;
|
||||
Handle<SHMaterialInstance> material;
|
||||
bool materialChanged = true;
|
||||
bool matChanged = true;
|
||||
Handle<SHMaterialInstance> oldMaterial;
|
||||
uint8_t lightLayer;
|
||||
|
||||
|
|
|
@ -186,7 +186,7 @@ namespace YAML
|
|||
static YAML::Node encode(SHRenderable const& rhs)
|
||||
{
|
||||
YAML::Node node;
|
||||
node[MESH_YAML_TAG.data()] = SHResourceManager::GetAssetID<SHMesh>(rhs.Mesh).value_or(0);
|
||||
node[MESH_YAML_TAG.data()] = SHResourceManager::GetAssetID<SHMesh>(rhs.GetMesh()).value_or(0);
|
||||
node[MAT_YAML_TAG.data()] = 0; // TODO: Asset ID
|
||||
return node;
|
||||
}
|
||||
|
@ -194,11 +194,16 @@ namespace YAML
|
|||
{
|
||||
if (node[MESH_YAML_TAG.data()])
|
||||
{
|
||||
rhs.Mesh = SHResourceManager::LoadOrGet<SHMesh>(node[MESH_YAML_TAG.data()].as<AssetID>());
|
||||
rhs.SetMesh(SHResourceManager::LoadOrGet<SHMesh>(node[MESH_YAML_TAG.data()].as<AssetID>()));
|
||||
}
|
||||
if (node[MAT_YAML_TAG.data()])
|
||||
{
|
||||
// TODO: Convert Asset ID To Material HAndle
|
||||
// Temporarily, use default material
|
||||
auto gfxSystem = SHSystemManager::GetSystem<SHGraphicsSystem>();
|
||||
if (!gfxSystem)
|
||||
return false;
|
||||
rhs.SetMaterial(gfxSystem->AddOrGetBaseMaterialInstance(gfxSystem->GetDefaultMaterial()));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue