1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
|
/*=========================================================================
Program: Visualization Toolkit
Module: vtkOSPRayCache.h
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
All rights reserved.
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
/**
* @class vtkOSPRayCache
* @brief temporal cache ospray structures to speed flipbooks
*
* A temporal cache of templated objects that are created on the first
* playthrough and reused afterward to speed up animations. Cache is
* first come first serve. In other words the first 'Size' Set()
* calls will succeed, later calls will be silently ignored. Decreasing
* the size of the cache frees all previously held contents.
*
* This class is internal.
*/
#ifndef vtkOSPRayCache_h
#define vtkOSPRayCache_h
#include "vtkRenderingRayTracingModule.h" // For export macro
#include "vtkSystemIncludes.h" //dll warning suppression
#include <map> // for stl
#include <memory>
#include "RTWrapper/RTWrapper.h" // for handle types
VTK_ABI_NAMESPACE_BEGIN
template <class T>
class VTKRENDERINGRAYTRACING_EXPORT vtkOSPRayCache
{
public:
vtkOSPRayCache() { this->Size = 0; }
~vtkOSPRayCache() { this->Empty(); }
/**
* Insert a new object into the cache.
*/
void Set(double tstep, std::shared_ptr<T> payload)
{
if (this->Contents.size() >= this->Size)
{
return;
}
this->Contents[tstep] = payload;
}
/**
* Obtain an object from the cache.
* Return nullptr if none present at tstep.
*/
std::shared_ptr<T> Get(double tstep)
{
auto ret = this->Contents.find(tstep);
if (ret != this->Contents.end())
{
return ret->second;
}
return nullptr;
}
///@{
/**
* Set/Get the number of slots available in the cache.
* Default is 0.
*/
void SetSize(size_t sz)
{
if (sz == this->Size)
{
return;
}
if (sz < this->Size)
{
this->Empty();
}
this->Size = sz;
}
size_t GetSize() { return this->Size; }
///@}
/**
* Query whether cache contains tstep
*/
bool Contains(double tstep) { return this->Get(tstep) != nullptr; }
/**
* Check if the cache has space left.
*/
bool HasRoom() { return this->Contents.size() < this->Size; }
private:
// deletes all of the content in the cache
void Empty()
{
this->Contents.clear();
this->Size = 0;
}
size_t Size;
std::map<double, std::shared_ptr<T>> Contents;
};
class vtkOSPRayCacheItemObject
{
public:
vtkOSPRayCacheItemObject(RTW::Backend* be, OSPObject obj)
: backend(be)
{
object = obj;
}
~vtkOSPRayCacheItemObject() { ospRelease(object); }
OSPObject object{ nullptr };
size_t size{ 0 };
RTW::Backend* backend = nullptr;
};
VTK_ABI_NAMESPACE_END
#endif // vtkOSPRayCache_h
// VTK-HeaderTest-Exclude: vtkOSPRayCache.h
|