| 973 | snprintf(buf, sizeof(buf), "%s/cwr_subdiv_%s_L%d.cache", cacheDir.c_str(), base.c_str(), targetSubdivLog); |
| 974 | return std::string(buf); |
| 975 | } |
| 976 | |
| 977 | bool Landscape::LoadSubdivCache(int targetSubdivLog) |
| 978 | { |
| 979 | std::string path = GetSubdivCachePath(_name, targetSubdivLog); |
| 980 | FILE* f = OpenFileUtf8(path.c_str(), "rb"); |
| 981 | if (!f) |
| 982 | return false; |
| 983 | |
| 984 | uint32_t magic, version; |
| 985 | int cachedLandRange, cachedLandRangeLog, cachedTerrainRange, cachedTerrainRangeLog; |
| 986 | float cachedLandGrid, cachedTerrainGrid; |
| 987 | |
| 988 | bool ok = fread(&magic, 4, 1, f) == 1 && magic == SUBDIV_CACHE_MAGIC && fread(&version, 4, 1, f) == 1 && |
| 989 | version == SUBDIV_CACHE_VERSION && fread(&cachedLandRange, 4, 1, f) == 1 && |
| 990 | fread(&cachedLandRangeLog, 4, 1, f) == 1 && fread(&cachedLandGrid, 4, 1, f) == 1 && |
| 991 | fread(&cachedTerrainRange, 4, 1, f) == 1 && fread(&cachedTerrainRangeLog, 4, 1, f) == 1 && |
| 992 | fread(&cachedTerrainGrid, 4, 1, f) == 1; |
| 993 | |
| 994 | if (!ok || cachedLandRange != _landRange || cachedLandRangeLog != _landRangeLog || cachedLandGrid != _landGrid) |
| 995 | { |
| 996 | fclose(f); |
| 997 | return false; |
| 998 | } |
| 999 | |
| 1000 | // Adjust objects to be relative before changing terrain |
| 1001 | MakeObjectsTerrainRelative(); |
| 1002 | |
| 1003 | // Resize _data to match cached terrain dimensions |
| 1004 | _data.Dim(cachedTerrainRange, cachedTerrainRange); |
| 1005 | size_t dataBytes = cachedTerrainRange * cachedTerrainRange * sizeof(RawType); |
| 1006 | ok = fread(_data.RawData(), 1, dataBytes, f) == dataBytes; |
| 1007 | fclose(f); |
| 1008 | |
| 1009 | if (!ok) |
| 1010 | { |
| 1011 | MakeObjectsTerrainAbsolute(); |
| 1012 | return false; |
| 1013 | } |
| 1014 | |
| 1015 | _terrainRange = cachedTerrainRange; |
| 1016 | _terrainRangeMask = _terrainRange - 1; |
| 1017 | _terrainRangeLog = cachedTerrainRangeLog; |
| 1018 | _terrainGrid = cachedTerrainGrid; |
| 1019 | _invTerrainGrid = 1.0f / _terrainGrid; |
| 1020 | |
| 1021 | // Adjust objects back to absolute with new terrain heights |
| 1022 | MakeObjectsTerrainAbsolute(); |
| 1023 | |
| 1024 | _segCache.Clear(); |
| 1025 | if (GScene) |
| 1026 | GScene->GetShadowCache().Clear(); |
| 1027 | |
| 1028 | LOG_DEBUG(Core, "LOAD: SubdivCache HIT from {}", path); |
| 1029 | return true; |
| 1030 | } |
| 1031 |
no test coverage detected