Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'intern/cycles/render/alembic.cpp')
-rw-r--r--intern/cycles/render/alembic.cpp83
1 files changed, 53 insertions, 30 deletions
diff --git a/intern/cycles/render/alembic.cpp b/intern/cycles/render/alembic.cpp
index 627ffe2318a..468ebf7140f 100644
--- a/intern/cycles/render/alembic.cpp
+++ b/intern/cycles/render/alembic.cpp
@@ -1017,6 +1017,10 @@ void AlembicObject::setup_transform_cache(float scale)
cached_data.transforms.clear();
cached_data.transforms.invalidate_last_loaded_time();
+ if (xform_time_sampling) {
+ cached_data.transforms.set_time_sampling(*xform_time_sampling);
+ }
+
if (xform_samples.size() == 0) {
Transform tfm = transform_scale(make_float3(scale));
cached_data.transforms.add_data(tfm, 0.0);
@@ -1358,11 +1362,16 @@ void AlembicProcedural::generate(Scene *scene, Progress &progress)
}
bool need_shader_updates = false;
+ bool need_data_updates = false;
- /* Check for changes in shaders (newly requested attributes). */
foreach (Node *object_node, objects) {
AlembicObject *object = static_cast<AlembicObject *>(object_node);
+ if (object->is_modified()) {
+ need_data_updates = true;
+ }
+
+ /* Check for changes in shaders (e.g. newly requested attributes). */
foreach (Node *shader_node, object->get_used_shaders()) {
Shader *shader = static_cast<Shader *>(shader_node);
@@ -1373,7 +1382,7 @@ void AlembicProcedural::generate(Scene *scene, Progress &progress)
}
}
- if (!is_modified() && !need_shader_updates) {
+ if (!is_modified() && !need_shader_updates && !need_data_updates) {
return;
}
@@ -1411,13 +1420,13 @@ void AlembicProcedural::generate(Scene *scene, Progress &progress)
}
if (object->schema_type == AlembicObject::POLY_MESH) {
- read_mesh(scene, object, frame_time, progress);
+ read_mesh(object, frame_time, progress);
}
else if (object->schema_type == AlembicObject::CURVES) {
- read_curves(scene, object, frame_time, progress);
+ read_curves(object, frame_time, progress);
}
else if (object->schema_type == AlembicObject::SUBD) {
- read_subd(scene, object, frame_time, progress);
+ read_subd(object, frame_time, progress);
}
object->clear_modified();
@@ -1471,7 +1480,7 @@ void AlembicProcedural::load_objects(Progress &progress)
IObject root = archive.getTop();
for (size_t i = 0; i < root.getNumChildren(); ++i) {
- walk_hierarchy(root, root.getChildHeader(i), nullptr, object_map, progress);
+ walk_hierarchy(root, root.getChildHeader(i), {}, object_map, progress);
}
/* Create nodes in the scene. */
@@ -1506,8 +1515,7 @@ void AlembicProcedural::load_objects(Progress &progress)
}
}
-void AlembicProcedural::read_mesh(Scene *scene,
- AlembicObject *abc_object,
+void AlembicProcedural::read_mesh(AlembicObject *abc_object,
Abc::chrono_t frame_time,
Progress &progress)
{
@@ -1536,6 +1544,10 @@ void AlembicProcedural::read_mesh(Scene *scene,
Object *object = abc_object->get_object();
cached_data.transforms.copy_to_socket(frame_time, object, object->get_tfm_socket());
+ if (object->is_modified()) {
+ object->tag_update(scene_);
+ }
+
cached_data.vertices.copy_to_socket(frame_time, mesh, mesh->get_verts_socket());
cached_data.shader.copy_to_socket(frame_time, mesh, mesh->get_shader_socket());
@@ -1566,7 +1578,7 @@ void AlembicProcedural::read_mesh(Scene *scene,
/* we don't yet support arbitrary attributes, for now add vertex
* coordinates as generated coordinates if requested */
- if (mesh->need_attribute(scene, ATTR_STD_GENERATED)) {
+ if (mesh->need_attribute(scene_, ATTR_STD_GENERATED)) {
Attribute *attr = mesh->attributes.add(ATTR_STD_GENERATED);
memcpy(
attr->data_float3(), mesh->get_verts().data(), sizeof(float3) * mesh->get_verts().size());
@@ -1574,12 +1586,11 @@ void AlembicProcedural::read_mesh(Scene *scene,
if (mesh->is_modified()) {
bool need_rebuild = mesh->triangles_is_modified();
- mesh->tag_update(scene, need_rebuild);
+ mesh->tag_update(scene_, need_rebuild);
}
}
-void AlembicProcedural::read_subd(Scene *scene,
- AlembicObject *abc_object,
+void AlembicProcedural::read_subd(AlembicObject *abc_object,
Abc::chrono_t frame_time,
Progress &progress)
{
@@ -1631,6 +1642,10 @@ void AlembicProcedural::read_subd(Scene *scene,
Object *object = abc_object->get_object();
cached_data.transforms.copy_to_socket(frame_time, object, object->get_tfm_socket());
+ if (object->is_modified()) {
+ object->tag_update(scene_);
+ }
+
cached_data.vertices.copy_to_socket(frame_time, mesh, mesh->get_verts_socket());
/* cached_data.shader is also used for subd_shader */
@@ -1666,7 +1681,7 @@ void AlembicProcedural::read_subd(Scene *scene,
/* we don't yet support arbitrary attributes, for now add vertex
* coordinates as generated coordinates if requested */
- if (mesh->need_attribute(scene, ATTR_STD_GENERATED)) {
+ if (mesh->need_attribute(scene_, ATTR_STD_GENERATED)) {
Attribute *attr = mesh->attributes.add(ATTR_STD_GENERATED);
memcpy(
attr->data_float3(), mesh->get_verts().data(), sizeof(float3) * mesh->get_verts().size());
@@ -1680,12 +1695,11 @@ void AlembicProcedural::read_subd(Scene *scene,
(mesh->subd_start_corner_is_modified()) ||
(mesh->subd_face_corners_is_modified());
- mesh->tag_update(scene, need_rebuild);
+ mesh->tag_update(scene_, need_rebuild);
}
}
-void AlembicProcedural::read_curves(Scene *scene,
- AlembicObject *abc_object,
+void AlembicProcedural::read_curves(AlembicObject *abc_object,
Abc::chrono_t frame_time,
Progress &progress)
{
@@ -1711,6 +1725,10 @@ void AlembicProcedural::read_curves(Scene *scene,
Object *object = abc_object->get_object();
cached_data.transforms.copy_to_socket(frame_time, object, object->get_tfm_socket());
+ if (object->is_modified()) {
+ object->tag_update(scene_);
+ }
+
cached_data.curve_keys.copy_to_socket(frame_time, hair, hair->get_curve_keys_socket());
cached_data.curve_radius.copy_to_socket(frame_time, hair, hair->get_curve_radius_socket());
@@ -1725,7 +1743,7 @@ void AlembicProcedural::read_curves(Scene *scene,
/* we don't yet support arbitrary attributes, for now add first keys as generated coordinates if
* requested */
- if (hair->need_attribute(scene, ATTR_STD_GENERATED)) {
+ if (hair->need_attribute(scene_, ATTR_STD_GENERATED)) {
Attribute *attr_generated = hair->attributes.add(ATTR_STD_GENERATED);
float3 *generated = attr_generated->data_float3();
@@ -1735,13 +1753,13 @@ void AlembicProcedural::read_curves(Scene *scene,
}
const bool rebuild = (hair->curve_keys_is_modified() || hair->curve_radius_is_modified());
- hair->tag_update(scene, rebuild);
+ hair->tag_update(scene_, rebuild);
}
void AlembicProcedural::walk_hierarchy(
IObject parent,
const ObjectHeader &header,
- MatrixSampleMap *xform_samples,
+ MatrixSamplesData matrix_samples_data,
const unordered_map<std::string, AlembicObject *> &object_map,
Progress &progress)
{
@@ -1763,7 +1781,7 @@ void AlembicProcedural::walk_hierarchy(
MatrixSampleMap local_xform_samples;
MatrixSampleMap *temp_xform_samples = nullptr;
- if (xform_samples == nullptr) {
+ if (matrix_samples_data.samples == nullptr) {
/* If there is no parent transforms, fill the map directly. */
temp_xform_samples = &concatenated_xform_samples;
}
@@ -1778,11 +1796,13 @@ void AlembicProcedural::walk_hierarchy(
temp_xform_samples->insert({sample_time, sample.getMatrix()});
}
- if (xform_samples != nullptr) {
- concatenate_xform_samples(*xform_samples, local_xform_samples, concatenated_xform_samples);
+ if (matrix_samples_data.samples != nullptr) {
+ concatenate_xform_samples(
+ *matrix_samples_data.samples, local_xform_samples, concatenated_xform_samples);
}
- xform_samples = &concatenated_xform_samples;
+ matrix_samples_data.samples = &concatenated_xform_samples;
+ matrix_samples_data.time_sampling = ts;
}
next_object = xform;
@@ -1798,8 +1818,9 @@ void AlembicProcedural::walk_hierarchy(
abc_object->iobject = subd;
abc_object->schema_type = AlembicObject::SUBD;
- if (xform_samples) {
- abc_object->xform_samples = *xform_samples;
+ if (matrix_samples_data.samples) {
+ abc_object->xform_samples = *matrix_samples_data.samples;
+ abc_object->xform_time_sampling = matrix_samples_data.time_sampling;
}
}
@@ -1816,8 +1837,9 @@ void AlembicProcedural::walk_hierarchy(
abc_object->iobject = mesh;
abc_object->schema_type = AlembicObject::POLY_MESH;
- if (xform_samples) {
- abc_object->xform_samples = *xform_samples;
+ if (matrix_samples_data.samples) {
+ abc_object->xform_samples = *matrix_samples_data.samples;
+ abc_object->xform_time_sampling = matrix_samples_data.time_sampling;
}
}
@@ -1834,8 +1856,9 @@ void AlembicProcedural::walk_hierarchy(
abc_object->iobject = curves;
abc_object->schema_type = AlembicObject::CURVES;
- if (xform_samples) {
- abc_object->xform_samples = *xform_samples;
+ if (matrix_samples_data.samples) {
+ abc_object->xform_samples = *matrix_samples_data.samples;
+ abc_object->xform_time_sampling = matrix_samples_data.time_sampling;
}
}
@@ -1852,7 +1875,7 @@ void AlembicProcedural::walk_hierarchy(
if (next_object.valid()) {
for (size_t i = 0; i < next_object.getNumChildren(); ++i) {
walk_hierarchy(
- next_object, next_object.getChildHeader(i), xform_samples, object_map, progress);
+ next_object, next_object.getChildHeader(i), matrix_samples_data, object_map, progress);
}
}
}