Cleanup: Use const for Blender data in Hydra exporter

As a render engine, this code generally shouldn't modify Blender data.
const helps to use the type system to enforce that.
This commit is contained in:
Hans Goudey
2023-08-04 13:35:21 -04:00
parent 39c3a86d8e
commit 66dd1657b8
21 changed files with 96 additions and 86 deletions

View File

@@ -12,9 +12,9 @@
namespace blender::io::hydra {
CameraData::CameraData(View3D *v3d, ARegion *region)
CameraData::CameraData(const View3D *v3d, const ARegion *region)
{
RegionView3D *region_data = (RegionView3D *)region->regiondata;
const RegionView3D *region_data = (const RegionView3D *)region->regiondata;
/* TODO: refactor use BKE_camera_params API. */
float VIEWPORT_SENSOR_SIZE = DEFAULT_SENSOR_WIDTH * 2.0f;
@@ -86,9 +86,9 @@ CameraData::CameraData(View3D *v3d, ARegion *region)
}
}
CameraData::CameraData(Object *camera_obj, pxr::GfVec2i res, pxr::GfVec4f tile)
CameraData::CameraData(const Object *camera_obj, pxr::GfVec2i res, pxr::GfVec4f tile)
{
Camera *camera = (Camera *)camera_obj->data;
const Camera *camera = (const Camera *)camera_obj->data;
float t_pos[2] = {tile[0], tile[1]};
float t_size[2] = {tile[2], tile[3]};
@@ -113,7 +113,7 @@ CameraData::CameraData(Object *camera_obj, pxr::GfVec2i res, pxr::GfVec4f tile)
std::max(focus_distance, 0.001f), camera->dof.aperture_fstop, camera->dof.aperture_blades);
}
float ratio = (float)res[0] / res[1];
float ratio = float(res[0]) / res[1];
switch (camera->sensor_fit) {
case CAMERA_SENSOR_FIT_VERT:

View File

@@ -26,8 +26,8 @@ class CameraData {
std::tuple<float, float, int> dof_data_;
public:
CameraData(View3D *v3d, ARegion *region);
CameraData(Object *camera_obj, pxr::GfVec2i res, pxr::GfVec4f tile);
CameraData(const View3D *v3d, const ARegion *region);
CameraData(const Object *camera_obj, pxr::GfVec2i res, pxr::GfVec4f tile);
pxr::GfCamera gf_camera();
pxr::GfCamera gf_camera(pxr::GfVec4f tile);

View File

@@ -9,12 +9,14 @@
#include "BKE_customdata.h"
#include "BKE_material.h"
#include "BKE_curves.hh"
#include "hydra_scene_delegate.h"
namespace blender::io::hydra {
CurvesData::CurvesData(HydraSceneDelegate *scene_delegate,
Object *object,
const Object *object,
pxr::SdfPath const &prim_id)
: ObjectData(scene_delegate, object, prim_id)
{
@@ -24,8 +26,8 @@ void CurvesData::init()
{
ID_LOGN(1, "");
Object *object = (Object *)id;
write_curves((Curves *)object->data);
const Object *object = (const Object *)id;
write_curves((const Curves *)object->data);
write_transform();
write_materials();
}
@@ -45,7 +47,7 @@ void CurvesData::remove()
void CurvesData::update()
{
Object *object = (Object *)id;
const Object *object = (const Object *)id;
pxr::HdDirtyBits bits = pxr::HdChangeTracker::Clean;
if ((id->recalc & ID_RECALC_GEOMETRY) || (((ID *)object->data)->recalc & ID_RECALC_GEOMETRY)) {
init();
@@ -130,16 +132,16 @@ pxr::HdPrimvarDescriptorVector CurvesData::primvar_descriptors(
void CurvesData::write_materials()
{
Object *object = (Object *)id;
Material *mat = nullptr;
const Object *object = (const Object *)id;
const Material *mat = nullptr;
/* TODO: Using only first material. Add support for multimaterial. */
if (BKE_object_material_count_eval(object) > 0) {
mat = BKE_object_material_get_eval(object, 0);
mat = BKE_object_material_get_eval(const_cast<Object *>(object), 0);
}
mat_data_ = get_or_create_material(mat);
}
void CurvesData::write_curves(Curves *curves)
void CurvesData::write_curves(const Curves *curves)
{
curve_vertex_counts_.clear();
widths_.clear();
@@ -167,7 +169,7 @@ void CurvesData::write_curves(Curves *curves)
write_uv_maps(curves);
}
void CurvesData::write_uv_maps(Curves *curves)
void CurvesData::write_uv_maps(const Curves *curves)
{
uvs_.clear();

View File

@@ -27,7 +27,9 @@ class CurvesData : public ObjectData {
MaterialData *mat_data_ = nullptr;
public:
CurvesData(HydraSceneDelegate *scene_delegate, Object *object, pxr::SdfPath const &prim_id);
CurvesData(HydraSceneDelegate *scene_delegate,
const Object *object,
pxr::SdfPath const &prim_id);
void init() override;
void insert() override;
@@ -45,8 +47,8 @@ class CurvesData : public ObjectData {
void write_materials() override;
private:
void write_curves(Curves *curves);
void write_uv_maps(Curves *curves);
void write_curves(const Curves *curves);
void write_uv_maps(const Curves *curves);
};
} // namespace blender::io::hydra

View File

@@ -234,7 +234,7 @@ void HydraSceneDelegate::clear()
view3d = nullptr;
}
pxr::SdfPath HydraSceneDelegate::prim_id(ID *id, const char *prefix) const
pxr::SdfPath HydraSceneDelegate::prim_id(const ID *id, const char *prefix) const
{
/* Making id of object in form like <prefix>_<pointer in 16 hex digits format> */
char name[32];
@@ -242,12 +242,12 @@ pxr::SdfPath HydraSceneDelegate::prim_id(ID *id, const char *prefix) const
return GetDelegateID().AppendElementString(name);
}
pxr::SdfPath HydraSceneDelegate::object_prim_id(Object *object) const
pxr::SdfPath HydraSceneDelegate::object_prim_id(const Object *object) const
{
return prim_id((ID *)object, "O");
}
pxr::SdfPath HydraSceneDelegate::material_prim_id(Material *mat) const
pxr::SdfPath HydraSceneDelegate::material_prim_id(const Material *mat) const
{
return prim_id((ID *)mat, "M");
}

View File

@@ -48,7 +48,7 @@ class HydraSceneDelegate : public pxr::HdSceneDelegate {
};
Depsgraph *depsgraph = nullptr;
View3D *view3d = nullptr;
const View3D *view3d = nullptr;
Main *bmain = nullptr;
Scene *scene = nullptr;
ShadingSettings shading_settings;
@@ -88,9 +88,9 @@ class HydraSceneDelegate : public pxr::HdSceneDelegate {
void clear();
private:
pxr::SdfPath prim_id(ID *id, const char *prefix) const;
pxr::SdfPath object_prim_id(Object *object) const;
pxr::SdfPath material_prim_id(Material *mat) const;
pxr::SdfPath prim_id(const ID *id, const char *prefix) const;
pxr::SdfPath object_prim_id(const Object *object) const;
pxr::SdfPath material_prim_id(const Material *mat) const;
pxr::SdfPath instancer_prim_id() const;
pxr::SdfPath world_prim_id() const;

View File

@@ -7,7 +7,7 @@
namespace blender::io::hydra {
IdData::IdData(HydraSceneDelegate *scene_delegate, ID *id, pxr::SdfPath const &prim_id)
IdData::IdData(HydraSceneDelegate *scene_delegate, const ID *id, pxr::SdfPath const &prim_id)
: id(id), prim_id(prim_id), scene_delegate_(scene_delegate)
{
}

View File

@@ -31,14 +31,14 @@ class HydraSceneDelegate;
class IdData {
public:
ID *id;
const ID *id;
pxr::SdfPath prim_id;
protected:
HydraSceneDelegate *scene_delegate_;
public:
IdData(HydraSceneDelegate *scene_delegate, ID *id, pxr::SdfPath const &prim_id);
IdData(HydraSceneDelegate *scene_delegate, const ID *id, pxr::SdfPath const &prim_id);
virtual ~IdData() = default;
virtual void init() = 0;

View File

@@ -16,7 +16,7 @@
namespace blender::io::hydra {
LightData::LightData(HydraSceneDelegate *scene_delegate,
Object *object,
const Object *object,
pxr::SdfPath const &prim_id)
: ObjectData(scene_delegate, object, prim_id)
{
@@ -26,7 +26,7 @@ void LightData::init()
{
ID_LOGN(1, "");
Light *light = (Light *)((Object *)id)->data;
const Light *light = (const Light *)((const Object *)id)->data;
data_.clear();
switch (light->type) {
@@ -109,8 +109,8 @@ void LightData::remove()
void LightData::update()
{
Object *object = (Object *)id;
Light *light = (Light *)object->data;
const Object *object = (const Object *)id;
const Light *light = (const Light *)object->data;
pxr::HdDirtyBits bits = pxr::HdLight::Clean;
if (id->recalc & ID_RECALC_GEOMETRY || light->id.recalc & ID_RECALC_GEOMETRY) {
if (prim_type(light) != prim_type_) {
@@ -143,7 +143,7 @@ pxr::VtValue LightData::get_data(pxr::TfToken const &key) const
return pxr::VtValue();
}
pxr::TfToken LightData::prim_type(Light *light)
pxr::TfToken LightData::prim_type(const Light *light)
{
switch (light->type) {
case LA_AREA:

View File

@@ -23,7 +23,7 @@ class LightData : public ObjectData {
pxr::TfToken prim_type_;
public:
LightData(HydraSceneDelegate *scene_delegate, Object *object, pxr::SdfPath const &prim_id);
LightData(HydraSceneDelegate *scene_delegate, const Object *object, pxr::SdfPath const &prim_id);
void init() override;
void insert() override;
@@ -33,7 +33,7 @@ class LightData : public ObjectData {
pxr::VtValue get_data(pxr::TfToken const &key) const override;
protected:
pxr::TfToken prim_type(Light *light);
pxr::TfToken prim_type(const Light *light);
};
} // namespace blender::io::hydra

View File

@@ -26,9 +26,9 @@
namespace blender::io::hydra {
MaterialData::MaterialData(HydraSceneDelegate *scene_delegate,
Material *material,
const Material *material,
pxr::SdfPath const &prim_id)
: IdData(scene_delegate, (ID *)material, prim_id)
: IdData(scene_delegate, (const ID *)material, prim_id)
{
}

View File

@@ -18,7 +18,7 @@ namespace blender::io::hydra {
class MaterialData : public IdData {
public:
MaterialData(HydraSceneDelegate *scene_delegate,
Material *material,
const Material *material,
pxr::SdfPath const &prim_id);
void init() override;

View File

@@ -18,7 +18,9 @@ PXR_NAMESPACE_CLOSE_SCOPE
namespace blender::io::hydra {
MeshData::MeshData(HydraSceneDelegate *scene_delegate, Object *object, pxr::SdfPath const &prim_id)
MeshData::MeshData(HydraSceneDelegate *scene_delegate,
const Object *object,
pxr::SdfPath const &prim_id)
: ObjectData(scene_delegate, object, prim_id)
{
}
@@ -188,10 +190,10 @@ pxr::SdfPathVector MeshData::submesh_paths() const
void MeshData::write_materials()
{
Object *object = (Object *)id;
const Object *object = (const Object *)id;
for (int i = 0; i < submeshes_.size(); ++i) {
SubMesh &m = submeshes_[i];
Material *mat = BKE_object_material_get_eval(object, m.mat_index + 1);
Material *mat = BKE_object_material_get_eval(const_cast<Object *>(object), m.mat_index + 1);
m.mat_data = get_or_create_material(mat);
}
}
@@ -210,12 +212,12 @@ const MeshData::SubMesh &MeshData::submesh(pxr::SdfPath const &id) const
return submeshes_[index];
}
void MeshData::write_submeshes(Mesh *mesh)
void MeshData::write_submeshes(const Mesh *mesh)
{
submeshes_.clear();
/* Insert base submeshes */
int mat_count = BKE_object_material_count_eval((Object *)id);
const int mat_count = BKE_object_material_count_eval((const Object *)id);
for (int i = 0; i < std::max(mat_count, 1); ++i) {
SubMesh sm;
sm.mat_index = i;
@@ -225,11 +227,11 @@ void MeshData::write_submeshes(Mesh *mesh)
/* Fill submeshes data */
const int *material_indices = BKE_mesh_material_indices(mesh);
blender::Span<int> looptri_faces = mesh->looptri_faces();
blender::Span<int> corner_verts = mesh->corner_verts();
blender::Span<MLoopTri> looptris = mesh->looptris();
const Span<int> looptri_faces = mesh->looptri_faces();
const Span<int> corner_verts = mesh->corner_verts();
const Span<MLoopTri> looptris = mesh->looptris();
BKE_mesh_calc_normals_split(mesh);
BKE_mesh_calc_normals_split(const_cast<Mesh *>(mesh));
const float(*lnors)[3] = (float(*)[3])CustomData_get_layer(&mesh->loop_data, CD_NORMAL);
const float(*luvs)[2] = (float(*)[2])CustomData_get_layer(&mesh->loop_data, CD_PROP_FLOAT2);
@@ -271,7 +273,7 @@ void MeshData::write_submeshes(Mesh *mesh)
}
/* vertices */
blender::Span<blender::float3> verts = mesh->vert_positions();
const blender::Span<blender::float3> verts = mesh->vert_positions();
pxr::VtVec3fArray vertices(mesh->totvert);
int i = 0;
for (blender::float3 v : verts) {

View File

@@ -31,7 +31,7 @@ class MeshData : public ObjectData {
int submeshes_count_ = 0;
public:
MeshData(HydraSceneDelegate *scene_delegate, Object *object, pxr::SdfPath const &prim_id);
MeshData(HydraSceneDelegate *scene_delegate, const Object *object, pxr::SdfPath const &prim_id);
void init() override;
void insert() override;
@@ -56,7 +56,7 @@ class MeshData : public ObjectData {
private:
pxr::SdfPath submesh_prim_id(int index) const;
const SubMesh &submesh(pxr::SdfPath const &id) const;
void write_submeshes(Mesh *mesh);
void write_submeshes(const Mesh *mesh);
void update_prims();
};

View File

@@ -13,14 +13,14 @@
namespace blender::io::hydra {
ObjectData::ObjectData(HydraSceneDelegate *scene_delegate,
Object *object,
const Object *object,
pxr::SdfPath const &prim_id)
: IdData(scene_delegate, (ID *)object, prim_id), transform(pxr::GfMatrix4d(1.0))
: IdData(scene_delegate, &object->id, prim_id), transform(pxr::GfMatrix4d(1.0))
{
}
std::unique_ptr<ObjectData> ObjectData::create(HydraSceneDelegate *scene_delegate,
Object *object,
const Object *object,
pxr::SdfPath const &prim_id)
{
std::unique_ptr<ObjectData> obj_data;
@@ -53,7 +53,7 @@ std::unique_ptr<ObjectData> ObjectData::create(HydraSceneDelegate *scene_delegat
return obj_data;
}
bool ObjectData::is_supported(Object *object)
bool ObjectData::is_supported(const Object *object)
{
switch (object->type) {
case OB_MESH:
@@ -72,7 +72,7 @@ bool ObjectData::is_supported(Object *object)
return false;
}
bool ObjectData::is_mesh(Object *object)
bool ObjectData::is_mesh(const Object *object)
{
switch (object->type) {
case OB_MESH:
@@ -90,7 +90,7 @@ bool ObjectData::is_mesh(Object *object)
return false;
}
bool ObjectData::is_visible(HydraSceneDelegate *scene_delegate, Object *object, int mode)
bool ObjectData::is_visible(HydraSceneDelegate *scene_delegate, const Object *object, int mode)
{
eEvaluationMode deg_mode = DEG_get_mode(scene_delegate->depsgraph);
bool ret = BKE_object_visibility(object, deg_mode) & mode;
@@ -120,12 +120,12 @@ void ObjectData::available_materials(Set<pxr::SdfPath> & /* paths */) const {}
void ObjectData::write_transform()
{
transform = gf_matrix_from_transform(((Object *)id)->object_to_world);
transform = gf_matrix_from_transform(((const Object *)id)->object_to_world);
}
void ObjectData::write_materials() {}
MaterialData *ObjectData::get_or_create_material(Material *mat)
MaterialData *ObjectData::get_or_create_material(const Material *mat)
{
if (!mat) {
return nullptr;
@@ -143,7 +143,7 @@ MaterialData *ObjectData::get_or_create_material(Material *mat)
return mat_data;
}
pxr::GfMatrix4d gf_matrix_from_transform(float m[4][4])
pxr::GfMatrix4d gf_matrix_from_transform(const float m[4][4])
{
pxr::GfMatrix4d ret;
for (int i = 0; i < 4; i++) {

View File

@@ -25,15 +25,17 @@ class ObjectData : public IdData {
bool visible = true;
public:
ObjectData(HydraSceneDelegate *scene_delegate, Object *object, pxr::SdfPath const &prim_id);
ObjectData(HydraSceneDelegate *scene_delegate,
const Object *object,
pxr::SdfPath const &prim_id);
static std::unique_ptr<ObjectData> create(HydraSceneDelegate *scene_delegate,
Object *object,
const Object *object,
pxr::SdfPath const &prim_id);
static bool is_supported(Object *object);
static bool is_mesh(Object *object);
static bool is_supported(const Object *object);
static bool is_mesh(const Object *object);
static bool is_visible(HydraSceneDelegate *scene_delegate,
Object *object,
const Object *object,
int mode = OB_VISIBLE_SELF);
using IdData::get_data;
@@ -45,11 +47,11 @@ class ObjectData : public IdData {
protected:
virtual void write_transform();
virtual void write_materials();
MaterialData *get_or_create_material(Material *mat);
MaterialData *get_or_create_material(const Material *mat);
};
using ObjectDataMap = Map<pxr::SdfPath, std::unique_ptr<ObjectData>>;
pxr::GfMatrix4d gf_matrix_from_transform(float m[4][4]);
pxr::GfMatrix4d gf_matrix_from_transform(const float m[4][4]);
} // namespace blender::io::hydra

View File

@@ -19,7 +19,7 @@
namespace blender::io::hydra {
VolumeData::VolumeData(HydraSceneDelegate *scene_delegate,
Object *object,
const Object *object,
pxr::SdfPath const &prim_id)
: ObjectData(scene_delegate, object, prim_id)
{
@@ -29,7 +29,7 @@ void VolumeData::init()
{
field_descriptors_.clear();
Volume *volume = (Volume *)((Object *)this->id)->data;
Volume *volume = (Volume *)((const Object *)this->id)->data;
if (!BKE_volume_load(volume, scene_delegate_->bmain)) {
return;
}
@@ -81,7 +81,7 @@ void VolumeData::remove()
void VolumeData::update()
{
Object *object = (Object *)id;
const Object *object = (const Object *)id;
pxr::HdDirtyBits bits = pxr::HdChangeTracker::Clean;
if ((id->recalc & ID_RECALC_GEOMETRY) || (((ID *)object->data)->recalc & ID_RECALC_GEOMETRY)) {
init();
@@ -150,11 +150,11 @@ pxr::HdVolumeFieldDescriptorVector VolumeData::field_descriptors() const
void VolumeData::write_materials()
{
Object *object = (Object *)id;
Material *mat = nullptr;
const Object *object = (Object *)id;
const Material *mat = nullptr;
/* TODO: Using only first material. Add support for multimaterial. */
if (BKE_object_material_count_eval(object) > 0) {
mat = BKE_object_material_get_eval(object, 0);
mat = BKE_object_material_get_eval(const_cast<Object *>(object), 0);
}
mat_data_ = get_or_create_material(mat);
}

View File

@@ -16,7 +16,9 @@ class VolumeData : public ObjectData {
MaterialData *mat_data_ = nullptr;
public:
VolumeData(HydraSceneDelegate *scene_delegate, Object *object, pxr::SdfPath const &prim_id);
VolumeData(HydraSceneDelegate *scene_delegate,
const Object *object,
pxr::SdfPath const &prim_id);
void init() override;
void insert() override;

View File

@@ -22,19 +22,19 @@ PXR_NAMESPACE_CLOSE_SCOPE
namespace blender::io::hydra {
VolumeModifierData::VolumeModifierData(HydraSceneDelegate *scene_delegate,
Object *object,
const Object *object,
pxr::SdfPath const &prim_id)
: VolumeData(scene_delegate, object, prim_id)
{
}
bool VolumeModifierData::is_volume_modifier(Object *object)
bool VolumeModifierData::is_volume_modifier(const Object *object)
{
if (object->type != OB_MESH) {
return false;
}
FluidModifierData *modifier = (FluidModifierData *)BKE_modifiers_findby_type(
const FluidModifierData *modifier = (const FluidModifierData *)BKE_modifiers_findby_type(
object, eModifierType_Fluid);
return modifier && modifier->type & MOD_FLUID_TYPE_DOMAIN &&
modifier->domain->type == FLUID_DOMAIN_TYPE_GAS;
@@ -44,10 +44,10 @@ void VolumeModifierData::init()
{
field_descriptors_.clear();
Object *object = (Object *)this->id;
ModifierData *md = BKE_modifiers_findby_type(object, eModifierType_Fluid);
modifier_ = (FluidModifierData *)BKE_modifier_get_evaluated(
scene_delegate_->depsgraph, object, md);
const Object *object = (const Object *)this->id;
const ModifierData *md = BKE_modifiers_findby_type(object, eModifierType_Fluid);
modifier_ = (const FluidModifierData *)BKE_modifier_get_evaluated(
scene_delegate_->depsgraph, const_cast<Object *>(object), const_cast<ModifierData *>(md));
if ((modifier_->domain->cache_data_format & FLUID_DOMAIN_FILE_OPENVDB) == 0) {
CLOG_WARN(LOG_HYDRA_SCENE,

View File

@@ -13,9 +13,9 @@ class VolumeModifierData : public VolumeData {
public:
VolumeModifierData(HydraSceneDelegate *scene_delegate,
Object *object,
const Object *object,
pxr::SdfPath const &prim_id);
static bool is_volume_modifier(Object *object);
static bool is_volume_modifier(const Object *object);
void init() override;
void update() override;
@@ -26,7 +26,7 @@ class VolumeModifierData : public VolumeData {
private:
std::string get_cached_file_path(std::string directory, int frame);
FluidModifierData *modifier_;
const FluidModifierData *modifier_;
};
} // namespace blender::io::hydra

View File

@@ -49,7 +49,7 @@ void WorldData::init()
pxr::SdfAssetPath texture_file;
if (scene_delegate_->shading_settings.use_scene_world) {
World *world = scene_delegate_->scene->world;
const World *world = scene_delegate_->scene->world;
ID_LOG(1, "%s", world->id.name);
exposure = world->exposure;
@@ -57,7 +57,7 @@ void WorldData::init()
/* TODO: Create nodes parsing system */
bNode *output_node = ntreeShaderOutputNode(world->nodetree, SHD_OUTPUT_ALL);
blender::Span<bNodeSocket *> input_sockets = output_node->input_sockets();
const Span<bNodeSocket *> input_sockets = output_node->input_sockets();
bNodeSocket *input_socket = nullptr;
for (auto socket : input_sockets) {