MCPcopy Create free account
hub / github.com/BohemiaInteractive/CWR / LoadSubdivCache

Method LoadSubdivCache

engine/Poseidon/World/Terrain/LandSave.cpp:975–1028  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

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
977bool 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

Callers 1

AdjustSubdivisionGridMethod · 0.80

Calls 4

GetSubdivCachePathFunction · 0.85
DimMethod · 0.45
RawDataMethod · 0.45
ClearMethod · 0.45

Tested by

no test coverage detected