| 177 | } |
| 178 | |
| 179 | skr::task::event_t SCookSystemImpl::AddCookTask(skr_guid_t guid) |
| 180 | { |
| 181 | SCookContext* jobContext; |
| 182 | { |
| 183 | skr::task::event_t result{ nullptr }; |
| 184 | cooking.lazy_emplace_l( |
| 185 | guid, |
| 186 | [&](const auto& ctx_kv) { result = ctx_kv.second->GetCounter(); }, |
| 187 | [&](const CookingMap::constructor& ctor) { |
| 188 | jobContext = SCookContext::Create(getIOService()); |
| 189 | ctor(guid, jobContext); |
| 190 | }); |
| 191 | if (result) return result; |
| 192 | } |
| 193 | jobContext->record = GetAssetRecord(guid); |
| 194 | skr::task::event_t counter; |
| 195 | jobContext->SetCounter(counter); |
| 196 | auto guidName = skr::format(u8"Fiber{}", jobContext->record->guid); |
| 197 | mainCounter.add(1); |
| 198 | skr::task::schedule([jobContext]() { |
| 199 | auto system = static_cast<SCookSystemImpl*>(GetCookSystem()); |
| 200 | const auto metaAsset = jobContext->record; |
| 201 | auto cooker = system->GetCooker(metaAsset); |
| 202 | SKR_ASSERT(cooker); |
| 203 | // Trace |
| 204 | SkrZoneScopedN("CookingTask"); |
| 205 | const auto rtti_type = skr::rttr::get_type_from_guid(metaAsset->type); |
| 206 | const auto cookerTypeName = rtti_type ? rtti_type->name().raw().c_str() : (const ochar_t*)u8"UnknownResource"; |
| 207 | const auto guidString = skr::format(u8"Guid: {}", metaAsset->guid); |
| 208 | const auto assetTypeGuidString = skr::format(u8"TypeGuid: {}", metaAsset->type); |
| 209 | const auto scopeName = skr::format(u8"Cook.[{}]", (const ochar8_t*)cookerTypeName); |
| 210 | const auto assetString = skr::format(u8"Asset: {}", metaAsset->path.u8string().c_str()); |
| 211 | ZoneName(scopeName.c_str(), scopeName.size()); |
| 212 | SkrMessage(guidString.c_str(), guidString.size()); |
| 213 | SkrMessage(assetTypeGuidString.c_str(), assetTypeGuidString.size()); |
| 214 | SkrMessage(assetString.c_str(), assetString.size()); |
| 215 | |
| 216 | SKR_DEFER({ |
| 217 | auto system = static_cast<SCookSystemImpl*>(GetCookSystem()); |
| 218 | auto guid = jobContext->record->guid; |
| 219 | system->cooking.erase_if(guid, [](const auto& ctx_kv) { SCookContext::Destroy(ctx_kv.second); return true; }); |
| 220 | system->mainCounter.decrement(); |
| 221 | }); |
| 222 | |
| 223 | // Create output dir |
| 224 | auto outputPath = metaAsset->project->GetOutputPath(); |
| 225 | std::error_code ec = {}; |
| 226 | skr::filesystem::create_directories(outputPath, ec); |
| 227 | |
| 228 | // TODO: platform dependent directory |
| 229 | jobContext->SetOutputPath(outputPath / skr::format(u8"{}.bin", metaAsset->guid).c_str()); |
| 230 | if (!cooker) |
| 231 | { |
| 232 | return; |
| 233 | } |
| 234 | |
| 235 | // Cook |
| 236 | jobContext->SetCookerVersion(cooker->Version()); |
nothing calls this directly
no test coverage detected