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();
144 if (
object.
data().
ptr.data != mesh.ptr.data) {
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);
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++) {
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++) {
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) {
568 if (
size.y != 0.0f) {
571 if (
size.z != 0.0f) {
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)
Group Output data from inside of a node group A color picker Mix two input colors RGB to Convert a color s luminance to a grayscale value Generate a normal vector and a dot product Brightness Control the brightness and contrast of the input color Vector Map input vector components with curves Camera Retrieve information about the camera and how it relates to the current shading point s position Clamp a value between a minimum and a maximum Vector Perform vector math operation Invert Invert a color
constexpr PointerRNA PointerRNA_NULL
BPy_StructRNA * depsgraph
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
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)
input_tx image(0, GPU_RGBA16F, Qualifier::WRITE, ImageType::FLOAT_2D, "preview_img") .compute_source("compositor_compute_preview.glsl") .do_static_compilation(true)
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)
#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
MotionType need_motion() const
VecBase< float, 4 > float4
ccl_device_inline int mod(int x, int m)