feat: move editor to project / add post processing etc
This commit is contained in:
@@ -46,6 +46,7 @@ void MaterialCache::cleanup(GfxDevice& gfxDevice)
|
||||
materialDataBuffer = {};
|
||||
materials.clear();
|
||||
materialKeys.clear();
|
||||
freeIds = std::make_shared<std::vector<MaterialID>>();
|
||||
placeholderMaterialId = NULL_MATERIAL_ID;
|
||||
device = nullptr;
|
||||
}
|
||||
@@ -54,7 +55,7 @@ MaterialID MaterialCache::addMaterial(Material material, std::string key)
|
||||
{
|
||||
MaterialData* data = static_cast<MaterialData*>(materialDataBuffer.info.pMappedData);
|
||||
|
||||
const auto id = getFreeMaterialId();
|
||||
const MaterialID id = getFreeMaterialId();
|
||||
if (id >= MAX_MATERIALS) {
|
||||
throw std::runtime_error("MaterialCache capacity exhausted");
|
||||
}
|
||||
@@ -70,7 +71,7 @@ MaterialID MaterialCache::addMaterial(Material material, std::string key)
|
||||
static_cast<VkDeviceSize>(id) * sizeof(MaterialData),
|
||||
sizeof(MaterialData));
|
||||
|
||||
const auto materialId = static_cast<MaterialID>(materials.size());
|
||||
const MaterialID materialId = id;
|
||||
if (key.empty() && !material.assetReference.empty()) {
|
||||
key = material.assetReference.cacheKey();
|
||||
} else if (key.empty()) {
|
||||
@@ -84,12 +85,29 @@ MaterialID MaterialCache::addMaterial(Material material, std::string key)
|
||||
key = baseKey + "#" + std::to_string(suffix++);
|
||||
}
|
||||
|
||||
materials.push_back(std::move(material));
|
||||
materialKeys.push_back(std::move(key));
|
||||
if (materialId == materials.size()) {
|
||||
materials.push_back(std::move(material));
|
||||
materialKeys.push_back(std::move(key));
|
||||
} else {
|
||||
std::erase(*freeIds, materialId);
|
||||
materials[materialId] = std::move(material);
|
||||
materialKeys[materialId] = std::move(key);
|
||||
}
|
||||
|
||||
return materialId;
|
||||
}
|
||||
|
||||
void MaterialCache::removeMaterial(MaterialID id)
|
||||
{
|
||||
if (!isValid(id) || id == placeholderMaterialId) {
|
||||
return;
|
||||
}
|
||||
|
||||
materials[id] = {};
|
||||
materialKeys[id].clear();
|
||||
device->deferDestroy([ids = freeIds, id] { ids->push_back(id); });
|
||||
}
|
||||
|
||||
MaterialID MaterialCache::addSimpleTextureMaterial(ImageID textureID)
|
||||
{
|
||||
Material material = Material::SimpleColor(
|
||||
@@ -117,6 +135,9 @@ const std::string& MaterialCache::getMaterialKey(MaterialID id) const
|
||||
|
||||
std::optional<MaterialID> MaterialCache::findMaterialByKey(std::string_view key) const
|
||||
{
|
||||
if (key.empty()) {
|
||||
return std::nullopt;
|
||||
}
|
||||
const auto it = std::find(materialKeys.begin(), materialKeys.end(), key);
|
||||
if (it == materialKeys.end()) {
|
||||
return std::nullopt;
|
||||
@@ -131,7 +152,7 @@ std::optional<MaterialID> MaterialCache::findMaterialByName(
|
||||
std::optional<MaterialID> fallback;
|
||||
for (MaterialID id = 0; id < materials.size(); ++id) {
|
||||
const auto& material = materials[id];
|
||||
if (material.name != name) {
|
||||
if (!isValid(id) || material.name != name) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -186,7 +207,7 @@ MaterialData MaterialCache::toMaterialData(const Material& material) const
|
||||
|
||||
MaterialID MaterialCache::getFreeMaterialId() const
|
||||
{
|
||||
return static_cast<MaterialID>(materials.size());
|
||||
return freeIds->empty() ? static_cast<MaterialID>(materials.size()) : freeIds->back();
|
||||
}
|
||||
|
||||
MaterialID MaterialCache::getPlaceholderMaterialId() const
|
||||
|
||||
Reference in New Issue
Block a user