Cleanup: IO, reduce code duplication in USD and Alembic exporters
Move the object visibility check from Alembic/USD-specific code into the `io/common` module. No functional changes.
This commit is contained in:
@@ -159,27 +159,7 @@ ModifierData *ABCGenericMeshWriter::get_liquid_sim_modifier(Scene *scene, Object
|
||||
|
||||
bool ABCGenericMeshWriter::is_supported(const HierarchyContext *context) const
|
||||
{
|
||||
Object *object = context->object;
|
||||
bool is_dupli = context->duplicator != nullptr;
|
||||
int base_flag;
|
||||
|
||||
if (is_dupli) {
|
||||
/* Construct the object's base flags from its dupli-parent, just like is done in
|
||||
* deg_objects_dupli_iterator_next(). Without this, the visibility check below will fail. Doing
|
||||
* this here, instead of a more suitable location in AbstractHierarchyIterator, prevents
|
||||
* copying the Object for every dupli. */
|
||||
base_flag = object->base_flag;
|
||||
object->base_flag = context->duplicator->base_flag | BASE_FROM_DUPLI;
|
||||
}
|
||||
|
||||
int visibility = BKE_object_visibility(
|
||||
object, DAG_EVAL_RENDER /* TODO(Sybren): add evaluation mode to export options? */);
|
||||
|
||||
if (is_dupli) {
|
||||
object->base_flag = base_flag;
|
||||
}
|
||||
|
||||
return (visibility & OB_VISIBLE_SELF) != 0;
|
||||
return context->is_object_visible(DAG_EVAL_RENDER);
|
||||
}
|
||||
|
||||
void ABCGenericMeshWriter::do_write(HierarchyContext &context)
|
||||
|
||||
@@ -37,6 +37,8 @@
|
||||
|
||||
#include "IO_dupli_persistent_id.hh"
|
||||
|
||||
#include "DEG_depsgraph.h"
|
||||
|
||||
#include <map>
|
||||
#include <set>
|
||||
#include <string>
|
||||
@@ -111,6 +113,8 @@ struct HierarchyContext {
|
||||
bool is_instance() const;
|
||||
void mark_as_instance_of(const std::string &reference_export_path);
|
||||
void mark_as_not_instanced();
|
||||
|
||||
bool is_object_visible(const enum eEvaluationMode evaluation_mode) const;
|
||||
};
|
||||
|
||||
/* Abstract writer for objects. Create concrete subclasses to write to USD, Alembic, etc.
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
#include "BKE_anim_data.h"
|
||||
#include "BKE_duplilist.h"
|
||||
#include "BKE_key.h"
|
||||
#include "BKE_object.h"
|
||||
#include "BKE_particle.h"
|
||||
|
||||
#include "BLI_assert.h"
|
||||
@@ -77,6 +78,29 @@ void HierarchyContext::mark_as_not_instanced()
|
||||
original_export_path.clear();
|
||||
}
|
||||
|
||||
bool HierarchyContext::is_object_visible(const enum eEvaluationMode evaluation_mode) const
|
||||
{
|
||||
bool is_dupli = duplicator != nullptr;
|
||||
int base_flag;
|
||||
|
||||
if (is_dupli) {
|
||||
/* Construct the object's base flags from its dupli-parent, just like is done in
|
||||
* deg_objects_dupli_iterator_next(). Without this, the visibility check below will fail. Doing
|
||||
* this here, instead of a more suitable location in AbstractHierarchyIterator, prevents
|
||||
* copying the Object for every dupli. */
|
||||
base_flag = object->base_flag;
|
||||
object->base_flag = duplicator->base_flag | BASE_FROM_DUPLI;
|
||||
}
|
||||
|
||||
int visibility = BKE_object_visibility(object, evaluation_mode);
|
||||
|
||||
if (is_dupli) {
|
||||
object->base_flag = base_flag;
|
||||
}
|
||||
|
||||
return (visibility & OB_VISIBLE_SELF) != 0;
|
||||
}
|
||||
|
||||
EnsuredWriter::EnsuredWriter() : writer_(nullptr), newly_created_(false)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -52,27 +52,7 @@ USDGenericMeshWriter::USDGenericMeshWriter(const USDExporterContext &ctx) : USDA
|
||||
|
||||
bool USDGenericMeshWriter::is_supported(const HierarchyContext *context) const
|
||||
{
|
||||
Object *object = context->object;
|
||||
bool is_dupli = context->duplicator != nullptr;
|
||||
int base_flag;
|
||||
|
||||
if (is_dupli) {
|
||||
/* Construct the object's base flags from its dupli-parent, just like is done in
|
||||
* deg_objects_dupli_iterator_next(). Without this, the visibility check below will fail. Doing
|
||||
* this here, instead of a more suitable location in AbstractHierarchyIterator, prevents
|
||||
* copying the Object for every dupli. */
|
||||
base_flag = object->base_flag;
|
||||
object->base_flag = context->duplicator->base_flag | BASE_FROM_DUPLI;
|
||||
}
|
||||
|
||||
int visibility = BKE_object_visibility(object,
|
||||
usd_export_context_.export_params.evaluation_mode);
|
||||
|
||||
if (is_dupli) {
|
||||
object->base_flag = base_flag;
|
||||
}
|
||||
|
||||
return (visibility & OB_VISIBLE_SELF) != 0;
|
||||
return context->is_object_visible(usd_export_context_.export_params.evaluation_mode);
|
||||
}
|
||||
|
||||
void USDGenericMeshWriter::do_write(HierarchyContext &context)
|
||||
|
||||
Reference in New Issue
Block a user