5#ifndef __BLENDER_UTIL_H__
6#define __BLENDER_UTIL_H__
56 (
static_cast<const ::
Mesh *
>(mesh.ptr.data)->normals_domain(
true) ==
68 bool subsurf_mod_show_render =
false;
69 bool subsurf_mod_show_viewport =
false;
72 BL::Modifier subsurf_mod =
object.modifiers[
object.modifiers.length() - 1];
74 subsurf_mod_show_render = subsurf_mod.show_render();
75 subsurf_mod_show_viewport = subsurf_mod.show_viewport();
77 subsurf_mod.show_render(
false);
78 subsurf_mod.show_viewport(
false);
85 bool use_corner_normals =
false;
89 if (mesh.is_editmode()) {
99 use_corner_normals =
true;
115 BL::Modifier subsurf_mod =
object.modifiers[
object.modifiers.length() - 1];
117 subsurf_mod.show_render(subsurf_mod_show_render);
118 subsurf_mod.show_viewport(subsurf_mod_show_viewport);
123 if (use_corner_normals) {
128 mesh.calc_loop_triangles();
145 object.to_mesh_clear();
154 const int full_size = size + 1;
155 ramp_color.
resize(full_size);
156 ramp_alpha.
resize(full_size);
158 for (
int i = 0; i < full_size; i++) {
161 ramp.evaluate(
float(i) /
float(size), color);
162 ramp_color[i] =
make_float3(color[0], color[1], color[2]);
163 ramp_alpha[i] = color[3];
169 *min_x =
min(*min_x, curve.points[0].location()[0]);
170 *max_x =
max(*max_x, curve.points[curve.points.length() - 1].location()[0]);
181 for (
int i = 0; i < num_curves; ++i) {
182 BL::CurveMap map(cumap.curves[i]);
190 BL::CurveMap curve = cumap.curves[0];
191 const int full_size = size + 1;
192 data.resize(full_size);
193 for (
int i = 0; i < full_size; i++) {
195 data[i] = cumap.evaluate(curve, t);
203 float min = 0.0f, max = 1.0f;
207 const float range = max -
min;
211 BL::CurveMap map = cumap.curves[0];
213 const int full_size = size + 1;
214 data.resize(full_size);
216 for (
int i = 0; i < full_size; i++) {
218 data[i] = cumap.evaluate(map, t);
227 float min_x = 0.0f, max_x = 1.0f;
240 const int num_curves = rgb_curve ? 4 : 3;
243 const float range_x = max_x - min_x;
247 BL::CurveMap mapR = cumap.curves[0];
248 BL::CurveMap mapG = cumap.curves[1];
249 BL::CurveMap mapB = cumap.curves[2];
251 const int full_size = size + 1;
252 data.resize(full_size);
255 BL::CurveMap mapI = cumap.curves[3];
256 for (
int i = 0; i < full_size; i++) {
257 const float t = min_x +
float(i) /
float(size) * range_x;
258 data[i] =
make_float3(cumap.evaluate(mapR, cumap.evaluate(mapI, t)),
259 cumap.evaluate(mapG, cumap.evaluate(mapI, t)),
260 cumap.evaluate(mapB, cumap.evaluate(mapI, t)));
264 for (
int i = 0; i < full_size; i++) {
265 float t = min_x +
float(i) /
float(size) * range_x;
267 cumap.evaluate(mapR, t), cumap.evaluate(mapG, t), cumap.evaluate(mapB, t));
274 return self.is_modified(scene, (preview) ? (1 << 0) : (1 << 1)) ?
true :
false;
279 if (!
self.is_real_object_data()) {
285 return self.real_object.is_deform_modified(scene, (preview) ? (1 << 0) : (1 << 1)) ?
true :
291 return b_render.resolution_x() * b_render.resolution_percentage() / 100;
296 return b_render.resolution_y() * b_render.resolution_percentage() / 100;
300 BL::ImageUser &iuser,
307 static_cast<Image *
>(ima.ptr.data),
static_cast<ImageUser *
>(iuser.ptr.data), cfra);
309 static_cast<ImageUser *
>(iuser.ptr.data),
310 static_cast<Image *
>(ima.ptr.data),
315 return string(filepath);
321 static_cast<Image *
>(ima.ptr.data),
static_cast<ImageUser *
>(iuser.ptr.data), cfra);
322 return iuser.frame_current();
337 const BL::Image::source_enum image_source = ima.source();
338 if (image_source == BL::Image::source_TILED) {
340 for (BL::UDIMTile &
tile : ima.tiles) {
341 if (
tile.is_generated_tile()) {
347 return ima.packed_file() || image_source == BL::Image::source_GENERATED ||
348 image_source == BL::Image::source_MOVIE ||
349 (engine.is_preview() && image_source != BL::Image::source_SEQUENCE);
354 b_rr.stamp_data_add_field(name.c_str(), value.c_str());
365 memcpy((
void *)&projection, &
array,
sizeof(
float) * 16);
471 int default_value = -1)
474 if (num_values != -1 && value >= num_values) {
475 assert(default_value != -1);
476 value = default_value;
484 const char *identifier =
"";
489 return string(identifier);
507 if (cstr != cstrbuf) {
523 if (path.size() >= 2 && path[0] ==
'/' && path[1] ==
'/') {
526 if (b_id.library()) {
527 BL::ID b_library_id(b_id.library());
547 BL::Text::lines_iterator iter;
548 for (iter.begin(
ptr); iter; ++iter) {
549 content += iter->body() +
"\n";
559 float texspace_location[3], texspace_size[3];
562 loc =
make_float3(texspace_location[0], texspace_location[1], texspace_location[2]);
563 size =
make_float3(texspace_size[0], texspace_size[1], texspace_size[2]);
565 if (size.x != 0.0f) {
566 size.x = 0.5f / size.x;
568 if (size.y != 0.0f) {
569 size.y = 0.5f / size.y;
571 if (size.z != 0.0f) {
572 size.z = 0.5f / size.z;
581 const int max_steps = INT_MAX)
585 bool use_motion =
get_boolean(cobject,
"use_motion_blur");
594 if (b_parent.ptr.data != b_ob.ptr.data) {
596 use_motion &=
get_boolean(parent_cobject,
"use_motion_blur");
608 return min((2 << (
steps - 1)) + 1, max_steps);
615 bool use_deform_motion =
get_boolean(cobject,
"use_deform_motion");
621 if (use_deform_motion && b_parent.ptr.data != b_ob.ptr.data) {
623 use_deform_motion &=
get_boolean(parent_cobject,
"use_deform_motion");
625 return use_deform_motion;
630 for (BL::Modifier &b_mod : b_ob.modifiers) {
631 if (b_mod.is_a(&RNA_FluidModifier)) {
632 BL::FluidModifier b_mmd(b_mod);
634 if (b_mmd.fluid_type() == BL::FluidModifier::fluid_type_DOMAIN &&
635 b_mmd.domain_settings().domain_type() == BL::FluidDomainSettings::domain_type_GAS)
637 return b_mmd.domain_settings();
646 bool *has_subdivision_modifier)
648 for (
int i = b_ob.modifiers.length() - 1; i >= 0; --i) {
649 BL::Modifier b_mod = b_ob.modifiers[i];
651 if (b_mod.type() == BL::Modifier::type_MESH_SEQUENCE_CACHE) {
652 BL::MeshSequenceCacheModifier mesh_cache = BL::MeshSequenceCacheModifier(b_mod);
657 if (b_mod.type() == BL::Modifier::type_PARTICLE_SYSTEM) {
661 if (b_mod.type() == BL::Modifier::type_SUBSURF) {
662 if (has_subdivision_modifier) {
663 *has_subdivision_modifier =
true;
680 if (cobj.
data && !b_ob.modifiers.empty() && experimental) {
681 BL::Modifier
mod = b_ob.modifiers[b_ob.modifiers.length() - 1];
682 bool enabled = preview ?
mod.show_viewport() :
mod.show_render();
684 if (enabled &&
mod.type() == BL::Modifier::type_SUBSURF &&
687 BL::SubsurfModifier subsurf(
mod);
689 if (subsurf.subdivision_type() == BL::SubsurfModifier::subdivision_type_CATMULL_CLARK) {
738 const bool use_motion =
get_boolean(cobject,
"use_motion_blur");
761 edges_.insert(std::pair<int, int>(v0, v1));
767 return edges_.find(std::pair<int, int>(v0, v1)) !=
edges_.end();
void BKE_image_user_frame_calc(Image *ima, ImageUser *iuser, int cfra)
void BKE_image_user_file_path_ex(const Main *bmain, const ImageUser *iuser, const Image *ima, char *filepath, const bool resolve_udim, const bool resolve_multiview)
unsigned char * BKE_image_get_pixels_for_frame(Image *image, int frame, int tile)
float * BKE_image_get_float_pixels_for_frame(Image *image, int frame, int tile)
void BKE_mesh_texspace_get(Mesh *mesh, float r_texspace_location[3], float r_texspace_size[3])
const char * dirname(char *path)
constexpr PointerRNA PointerRNA_NULL
set< std::pair< int, int > > edges_
void insert(int v0, int v1)
bool exists(int v0, int v1)
void get_sorted_verts(int &v0, int &v1)
T * resize(size_t newsize)
static string image_user_file_path(BL::BlendData &data, BL::ImageUser &iuser, BL::Image &ima, int cfra)
static float * image_get_float_pixels_for_frame(BL::Image &image, int frame, int tile)
static uint object_ray_visibility(BL::Object &b_ob)
static float4 get_float4(const BL::Array< float, 4 > &array)
static bool image_is_builtin(BL::Image &ima, BL::RenderEngine &engine)
static uint object_motion_steps(BL::Object &b_parent, BL::Object &b_ob, const int max_steps=INT_MAX)
static int render_resolution_x(BL::RenderSettings &b_render)
static bool mesh_use_corner_normals(BL::Mesh &mesh, Mesh::SubdivisionType subdivision_type)
static float get_float(PointerRNA &ptr, const char *name)
static void curvemapping_float_to_array(BL::CurveMapping &cumap, array< float > &data, int size)
void python_thread_state_restore(void **python_thread_state)
static void mesh_texture_space(const ::Mesh &b_mesh, float3 &loc, float3 &size)
static void set_boolean(PointerRNA &ptr, const char *name, bool value)
static bool get_boolean(PointerRNA &ptr, const char *name)
static void set_float3(PointerRNA &ptr, const char *name, float3 value)
static bool BKE_object_is_modified(BL::Object &self, BL::Scene &scene, bool preview)
static int get_int(PointerRNA &ptr, const char *name)
static void free_object_to_mesh(BL::BlendData &, BObjectInfo &b_ob_info, BL::Mesh &mesh)
static string get_enum_identifier(PointerRNA &ptr, const char *name)
static BL::Mesh object_to_mesh(BL::BlendData &, BObjectInfo &b_ob_info, BL::Depsgraph &, bool, Mesh::SubdivisionType subdivision_type)
static string get_text_datablock_content(const PointerRNA &ptr)
static void colorramp_to_array(BL::ColorRamp &ramp, array< float3 > &ramp_color, array< float > &ramp_alpha, int size)
static void curvemapping_to_array(BL::CurveMapping &cumap, array< float > &data, int size)
static float3 get_float3(const BL::Array< float, 2 > &array)
static int render_resolution_y(BL::RenderSettings &b_render)
static bool object_need_motion_attribute(BObjectInfo &b_ob_info, Scene *scene)
static int get_enum(PointerRNA &ptr, const char *name, int num_values=-1, int default_value=-1)
static void set_enum(PointerRNA &ptr, const char *name, int value)
static void render_add_metadata(BL::RenderResult &b_rr, string name, string value)
BlenderAttributeType blender_attribute_name_split_type(ustring name, string *r_real_name)
static void set_float4(PointerRNA &ptr, const char *name, float4 value)
static bool BKE_object_is_deform_modified(BObjectInfo &self, BL::Scene &scene, bool preview)
static int4 get_int4(const BL::Array< int, 4 > &array)
static void curvemapping_color_to_array(BL::CurveMapping &cumap, array< float3 > &data, int size, bool rgb_curve)
static string blender_absolute_path(BL::BlendData &b_data, BL::ID &b_id, const string &path)
static int3 get_int3(const BL::Array< int, 3 > &array)
static unsigned char * image_get_pixels_for_frame(BL::Image &image, int frame, int tile)
static float2 get_float2(const BL::Array< float, 2 > &array)
static Mesh::SubdivisionType object_subdivision_type(BL::Object &b_ob, bool preview, bool experimental)
static void set_int(PointerRNA &ptr, const char *name, int value)
static BL::FluidDomainSettings object_fluid_gas_domain_find(BL::Object &b_ob)
void python_thread_state_save(void **python_thread_state)
static void curvemap_minmax_curve(BL::CurveMap &curve, float *min_x, float *max_x)
static string get_string(PointerRNA &ptr, const char *name)
static void set_float(PointerRNA &ptr, const char *name, float value)
static Transform get_transform(const BL::Array< float, 16 > &array)
static void curvemapping_minmax(BL::CurveMapping &cumap, int num_curves, float *min_x, float *max_x)
static BL::MeshSequenceCacheModifier object_mesh_cache_find(BL::Object &b_ob, bool *has_subdivision_modifier)
static bool object_use_deform_motion(BL::Object &b_parent, BL::Object &b_ob)
static void set_string(PointerRNA &ptr, const char *name, const string &value)
BL::ShaderNodeAttribute::attribute_type_enum BlenderAttributeType
static int image_user_frame_number(BL::ImageUser &iuser, BL::Image &ima, int cfra)
ccl_device_inline Transform projection_to_transform(const ProjectionTransform &a)
ccl_device_inline ProjectionTransform projection_transpose(const ProjectionTransform &a)
const Depsgraph * depsgraph
#define CCL_NAMESPACE_END
draw_view in_light_buf[] float
ccl_global const KernelWorkTile * tile
@ PATH_RAY_VOLUME_SCATTER
void MEM_freeN(void *vmemh)
string path_dirname(const string &path)
string path_join(const string &dir, const string &file)
bool RNA_property_enum_identifier(bContext *C, PointerRNA *ptr, PropertyRNA *prop, const int value, const char **r_identifier)
void RNA_string_set(PointerRNA *ptr, const char *name, const char *value)
PointerRNA RNA_pointer_get(PointerRNA *ptr, const char *name)
PropertyRNA * RNA_struct_find_property(PointerRNA *ptr, const char *identifier)
void RNA_boolean_set(PointerRNA *ptr, const char *name, bool value)
void RNA_int_set(PointerRNA *ptr, const char *name, int value)
void RNA_float_get_array(PointerRNA *ptr, const char *name, float *values)
void RNA_enum_set_identifier(bContext *C, PointerRNA *ptr, const char *name, const char *id)
int RNA_int_get(PointerRNA *ptr, const char *name)
char * RNA_string_get_alloc(PointerRNA *ptr, const char *name, char *fixedbuf, int fixedlen, int *r_len)
float RNA_float_get(PointerRNA *ptr, const char *name)
void RNA_float_set(PointerRNA *ptr, const char *name, float value)
int RNA_property_enum_get(PointerRNA *ptr, PropertyRNA *prop)
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
void RNA_enum_set(PointerRNA *ptr, const char *name, int value)
void RNA_float_set_array(PointerRNA *ptr, const char *name, const float *values)
int RNA_enum_get(PointerRNA *ptr, const char *name)
bool is_real_object_data() const
@ SUBDIVISION_CATMULL_CLARK
ccl_device_inline int mod(int x, int m)