diff --git a/modules/fieldlinessequence/rendering/renderablestreamnodes.cpp b/modules/fieldlinessequence/rendering/renderablestreamnodes.cpp index 3355ac10bb..d2b1e25fb7 100644 --- a/modules/fieldlinessequence/rendering/renderablestreamnodes.cpp +++ b/modules/fieldlinessequence/rendering/renderablestreamnodes.cpp @@ -61,6 +61,9 @@ namespace { constexpr const GLuint VaIndex = 3; // MUST CORRESPOND TO THE SHADER PROGRAM + constexpr int8_t CurrentCacheVersion = 1; + + // ----- KEYS POSSIBLE IN MODFILE. EXPECTED DATA TYPE OF VALUE IN [BRACKETS] ----- // // ---------------------------- MANDATORY MODFILE KEYS ---------------------------- // // [STRING] "cdf", "json" or "osfls" @@ -550,6 +553,72 @@ namespace openspace { return true; } + + void RenderableStreamNodes::WritecachedFile() { + //Todo, write all of the vertexobjects into here + std::ofstream fileStream("StreamnodesCache", std::ofstream::binary); + + if (!fileStream.good()) { + LERROR(fmt::format("Error opening file '{}' for save cache file"), "StreamnodesCache"); + return; + } + + fileStream.write( + reinterpret_cast(&CurrentCacheVersion), + sizeof(int8_t) + ); + + + int32_t nValues = static_cast(_statesPos.size()); + if (nValues == 0) { + throw ghoul::RuntimeError("Error writing cache: No values were loaded"); + return; + } + fileStream.write(reinterpret_cast(&nValues), sizeof(int32_t)); + + size_t nBytes = nValues * sizeof(_statesPos.size()); + fileStream.write(reinterpret_cast(_vertexPositions.data()), nBytes); + //fileStream.write(reinterpret_cast(_vertexColor.data()), nBytes); + //fileStream.write(reinterpret_cast(_vertexRadius.data()), nBytes); + //fileStream.write(reinterpret_cast(_vertexIndex.data()), nBytes); + + //for(int i = 0; i < _statesPos.size(); ) + + } + + bool RenderableStreamNodes::ReadcachedFile() { + const std::string& file = "StreamnodesCache"; + std::ifstream fileStream("StreamnodesCache", std::ifstream::binary); + if (fileStream.good()) { + int8_t version = 0; + fileStream.read(reinterpret_cast(&version), sizeof(int8_t)); + if (version != CurrentCacheVersion) { + LINFO("The format of the cached file has changed: deleting old cache"); + fileStream.close(); + FileSys.deleteFile(file); + return false; + } + + int32_t nValues = 0; + fileStream.read(reinterpret_cast(&nValues), sizeof(int32_t)); + + _statesPos.resize(nValues); + + fileStream.read(reinterpret_cast( + _statesPos.data()), + nValues * sizeof(_statesPos[0]) + ); + bool success = fileStream.good(); + return success; + + } + else { + LERROR(fmt::format("Error opening file '{}' for loading cache file", file)); + return false; + } + + return false; + } /** * Extracts the general information (from the lua modfile) that is mandatory for the class * to function; such as the file type and the location of the source files. diff --git a/modules/fieldlinessequence/rendering/renderablestreamnodes.h b/modules/fieldlinessequence/rendering/renderablestreamnodes.h index 5602f062f7..5bee41b537 100644 --- a/modules/fieldlinessequence/rendering/renderablestreamnodes.h +++ b/modules/fieldlinessequence/rendering/renderablestreamnodes.h @@ -228,6 +228,8 @@ namespace openspace { void computeSequenceEndTime(); void setModelDependentConstants(); + void WritecachedFile(); + void ReadcachedFile(); bool LoadfilesintoRam(); // ------------------------- FUNCTIONS USED DURING RUNTIME ------------------------ //