[Bf-blender-cvs] [aba0cc48a66] cycles_procedural_api: avoid reloading data that was already loaded
Kévin Dietrich
noreply at git.blender.org
Sun Dec 6 06:26:28 CET 2020
Commit: aba0cc48a669e6cdc0c305dccf3b9390c488c8a9
Author: Kévin Dietrich
Date: Thu Dec 3 15:50:18 2020 +0100
Branches: cycles_procedural_api
https://developer.blender.org/rBaba0cc48a669e6cdc0c305dccf3b9390c488c8a9
avoid reloading data that was already loaded
===================================================================
M intern/cycles/render/alembic.cpp
M intern/cycles/render/alembic.h
===================================================================
diff --git a/intern/cycles/render/alembic.cpp b/intern/cycles/render/alembic.cpp
index 6825d0660b4..bb87a56a909 100644
--- a/intern/cycles/render/alembic.cpp
+++ b/intern/cycles/render/alembic.cpp
@@ -224,8 +224,9 @@ static void read_default_uvs(const IV2fGeomParam &uvs, CachedData &cached_data)
continue;
}
- const array<int3> *triangles = cached_data.triangles.data_for_time(time);
- const array<int3> *triangles_loops = cached_data.triangles_loops.data_for_time(time);
+ const array<int3> *triangles = cached_data.triangles.data_for_time_no_check(time);
+ const array<int3> *triangles_loops = cached_data.triangles_loops.data_for_time_no_check(
+ time);
if (!triangles || !triangles_loops) {
continue;
@@ -282,7 +283,7 @@ static void add_normals(const Int32ArraySamplePtr face_indices,
CachedData::CachedAttribute &attr = cached_data.add_attribute(ustring(normals.getName()));
attr.std = ATTR_STD_VERTEX_NORMAL;
- const array<float3> *vertices = cached_data.vertices.data_for_time(time);
+ const array<float3> *vertices = cached_data.vertices.data_for_time_no_check(time);
if (!vertices) {
return;
@@ -321,7 +322,7 @@ static void add_normals(const Int32ArraySamplePtr face_indices,
CachedData::CachedAttribute &attr = cached_data.add_attribute(ustring(normals.getName()));
attr.std = ATTR_STD_VERTEX_NORMAL;
- const array<float3> *vertices = cached_data.vertices.data_for_time(time);
+ const array<float3> *vertices = cached_data.vertices.data_for_time_no_check(time);
if (!vertices) {
return;
@@ -739,8 +740,9 @@ void AlembicObject::read_attribute(const ICompoundProperty &arb_geom_params,
attribute.element = ATTR_ELEMENT_CORNER;
attribute.type_desc = TypeFloat2;
- const array<int3> *triangles = cached_data.triangles.data_for_time(time);
- const array<int3> *triangles_loops = cached_data.triangles_loops.data_for_time(time);
+ const array<int3> *triangles = cached_data.triangles.data_for_time_no_check(time);
+ const array<int3> *triangles_loops = cached_data.triangles_loops.data_for_time_no_check(
+ time);
if (!triangles || !triangles_loops) {
continue;
@@ -782,7 +784,7 @@ void AlembicObject::read_attribute(const ICompoundProperty &arb_geom_params,
attribute.element = ATTR_ELEMENT_CORNER_BYTE;
attribute.type_desc = TypeRGBA;
- const array<int3> *triangles = cached_data.triangles.data_for_time(time);
+ const array<int3> *triangles = cached_data.triangles.data_for_time_no_check(time);
if (!triangles) {
continue;
@@ -827,7 +829,7 @@ void AlembicObject::read_attribute(const ICompoundProperty &arb_geom_params,
attribute.element = ATTR_ELEMENT_CORNER_BYTE;
attribute.type_desc = TypeRGBA;
- const array<int3> *triangles = cached_data.triangles.data_for_time(time);
+ const array<int3> *triangles = cached_data.triangles.data_for_time_no_check(time);
if (!triangles) {
continue;
diff --git a/intern/cycles/render/alembic.h b/intern/cycles/render/alembic.h
index fcb98caea07..4112c28d27f 100644
--- a/intern/cycles/render/alembic.h
+++ b/intern/cycles/render/alembic.h
@@ -53,6 +53,8 @@ template<typename T> class DataStore {
vector<DataTimePair> data{};
Alembic::AbcCoreAbstract::TimeSampling time_sampling{};
+ double last_loaded_time = std::numeric_limits<double>::max();
+
public:
void set_time_sampling(Alembic::AbcCoreAbstract::TimeSampling time_sampling_)
{
@@ -64,16 +66,39 @@ template<typename T> class DataStore {
return time_sampling;
}
+ /* Get the data for the specified time.
+ * Return nullptr if there is no data or if the data for this time was already loaded. */
T *data_for_time(double time)
{
if (size() == 0) {
return nullptr;
}
- auto index_pair = time_sampling.getNearIndex(time, data.size());
- auto ptr = &data[index_pair.first];
+ std::pair<size_t, Alembic::Abc::chrono_t> index_pair;
+ index_pair = time_sampling.getNearIndex(time, data.size());
+ DataTimePair &data_pair = data[index_pair.first];
+
+ if (last_loaded_time == data_pair.time) {
+ return nullptr;
+ }
+
+ last_loaded_time = data_pair.time;
+
+ return &data_pair.data;
+ }
+
+ /* get the data for the specified time, but do not check if the data was already loaded for this
+ * time return nullptr if there is no data */
+ T *data_for_time_no_check(double time)
+ {
+ if (size() == 0) {
+ return nullptr;
+ }
- return &ptr->data;
+ std::pair<size_t, Alembic::Abc::chrono_t> index_pair;
+ index_pair = time_sampling.getNearIndex(time, data.size());
+ DataTimePair &data_pair = data[index_pair.first];
+ return &data_pair.data;
}
void add_data(T &data_, double time)
@@ -100,6 +125,7 @@ template<typename T> class DataStore {
void clear()
{
+ last_loaded_time = std::numeric_limits<double>::max();
data.clear();
}
};
More information about the Bf-blender-cvs
mailing list