#include #include #include namespace XCEngine { namespace Resources { MaterialLoader::MaterialLoader() = default; MaterialLoader::~MaterialLoader() = default; Containers::Array MaterialLoader::GetSupportedExtensions() const { Containers::Array extensions; extensions.PushBack("mat"); extensions.PushBack("material"); extensions.PushBack("json"); return extensions; } bool MaterialLoader::CanLoad(const Containers::String& path) const { Containers::String ext = GetExtension(path); return ext == "mat" || ext == "material" || ext == "json"; } LoadResult MaterialLoader::Load(const Containers::String& path, const ImportSettings* settings) { Containers::Array data = ReadFileData(path); if (data.Empty()) { return LoadResult("Failed to read material file: " + path); } Material* material = new Material(); material->m_path = path; material->m_name = path; material->m_guid = ResourceGUID::Generate(path); Containers::String jsonStr; jsonStr.Reserve(data.Size()); for (size_t i = 0; i < data.Size(); ++i) { jsonStr += static_cast(data[i]); } size_t shaderPos = jsonStr.Find("\"shader\""); if (shaderPos != Containers::String::npos) { size_t colonPos = jsonStr.Find(":", shaderPos); if (colonPos != Containers::String::npos) { size_t quoteStart = jsonStr.Find("\"", colonPos); size_t quoteEnd = jsonStr.Find("\"", quoteStart + 1); if (quoteStart != Containers::String::npos && quoteEnd != Containers::String::npos) { Containers::String shaderPath = jsonStr.Substring(quoteStart + 1, quoteEnd - quoteStart - 1); auto shaderHandle = ResourceManager::Get().Load(shaderPath); if (shaderHandle.IsValid()) { material->SetShader(shaderHandle); } } } } material->m_isValid = true; material->m_memorySize = sizeof(Material) + material->m_name.Length() + material->m_path.Length(); return LoadResult(material); } ImportSettings* MaterialLoader::GetDefaultSettings() const { return nullptr; } bool MaterialLoader::ParseMaterialData(const Containers::Array& data, Material* material) { return true; } } // namespace Resources } // namespace XCEngine