8#include "RNA_blender_cpp.hh"
33static inline BL::ID
object_get_data(
const BL::Object &b_ob,
const bool use_adaptive_subdivision)
37 if (!use_adaptive_subdivision && object->
type ==
OB_MESH) {
38 ::Mesh *mesh =
static_cast<::
Mesh *
>(
object->data);
89 (
static_cast<const ::
Mesh *
>(mesh.ptr.data)->normals_domain(
true) ==
98 bool use_corner_normals =
false;
102 if (mesh.is_editmode()) {
110 use_corner_normals =
true;
124 if (use_corner_normals) {
129 mesh.calc_loop_triangles();
153 const int full_size =
size + 1;
154 ramp_color.
resize(full_size);
155 ramp_alpha.
resize(full_size);
157 for (
int i = 0;
i < full_size;
i++) {
160 ramp.evaluate(
float(
i) /
float(
size), color);
161 ramp_color[
i] =
make_float3(color[0], color[1], color[2]);
162 ramp_alpha[
i] = color[3];
168 *min_x =
min(*min_x, curve.points[0].location()[0]);
169 *max_x =
max(*max_x, curve.points[curve.points.length() - 1].location()[0]);
173 const int num_curves,
180 for (
int i = 0;
i < num_curves; ++
i) {
181 BL::CurveMap map(cumap.curves[
i]);
191 BL::CurveMap curve = cumap.curves[0];
192 const int full_size =
size + 1;
193 data.resize(full_size);
194 for (
int i = 0;
i < full_size;
i++) {
196 data[
i] = cumap.evaluate(curve, t);
209 const float range =
max -
min;
213 BL::CurveMap map = cumap.curves[0];
215 const int full_size =
size + 1;
216 data.resize(full_size);
218 for (
int i = 0;
i < full_size;
i++) {
220 data[
i] = cumap.evaluate(map, t);
243 const int num_curves = rgb_curve ? 4 : 3;
246 const float range_x = max_x - min_x;
250 BL::CurveMap mapR = cumap.curves[0];
251 BL::CurveMap mapG = cumap.curves[1];
252 BL::CurveMap mapB = cumap.curves[2];
254 const int full_size =
size + 1;
255 data.resize(full_size);
258 BL::CurveMap mapI = cumap.curves[3];
259 for (
int i = 0;
i < full_size;
i++) {
262 cumap.evaluate(mapG, cumap.evaluate(mapI, t)),
263 cumap.evaluate(mapB, cumap.evaluate(mapI, t)));
267 for (
int i = 0;
i < full_size;
i++) {
270 cumap.evaluate(mapR, t), cumap.evaluate(mapG, t), cumap.evaluate(mapB, t));
277 return self.is_modified(scene, (preview) ? (1 << 0) : (1 << 1)) ?
true :
false;
282 if (!
self.is_real_object_data()) {
288 return self.real_object.is_deform_modified(scene, (preview) ? (1 << 0) : (1 << 1)) ?
true :
294 return b_render.resolution_x() * b_render.resolution_percentage() / 100;
299 return b_render.resolution_y() * b_render.resolution_percentage() / 100;
303 BL::ImageUser &iuser,
310 static_cast<Image *
>(ima.ptr.data),
static_cast<ImageUser *
>(iuser.ptr.data), cfra);
312 static_cast<ImageUser *
>(iuser.ptr.data),
313 static_cast<Image *
>(ima.ptr.data),
318 return string(filepath);
324 static_cast<Image *
>(ima.ptr.data),
static_cast<ImageUser *
>(iuser.ptr.data), cfra);
325 return iuser.frame_current();
330 const BL::Image::source_enum image_source = ima.source();
331 if (image_source == BL::Image::source_TILED) {
333 for (BL::UDIMTile &
tile : ima.tiles) {
334 if (
tile.is_generated_tile()) {
340 return ima.packed_file() || image_source == BL::Image::source_GENERATED ||
341 image_source == BL::Image::source_MOVIE ||
342 (engine.is_preview() && image_source != BL::Image::source_SEQUENCE);
347 b_rr.stamp_data_add_field(
name.c_str(), value.c_str());
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);
516 if (path.size() >= 2 && path[0] ==
'/' && path[1] ==
'/') {
519 if (b_id.library()) {
520 BL::ID b_library_id(b_id.library());
535 if (
ptr.data ==
nullptr) {
540 BL::Text::lines_iterator iter;
541 for (iter.begin(
ptr); iter; ++iter) {
542 content += iter->body() +
"\n";
552 float texspace_location[3];
553 float texspace_size[3];
556 loc =
make_float3(texspace_location[0], texspace_location[1], texspace_location[2]);
557 size =
make_float3(texspace_size[0], texspace_size[1], texspace_size[2]);
559 if (
size.x != 0.0f) {
562 if (
size.y != 0.0f) {
565 if (
size.z != 0.0f) {
575 const int max_steps = INT_MAX)
579 bool use_motion =
get_boolean(cobject,
"use_motion_blur");
584 int steps =
max(1,
get_int(cobject,
"motion_steps"));
588 if (b_parent.ptr.data != b_ob.ptr.data) {
590 use_motion &=
get_boolean(parent_cobject,
"use_motion_blur");
596 steps =
max(steps,
get_int(parent_cobject,
"motion_steps"));
602 return min((2 << (steps - 1)) + 1, max_steps);
609 bool use_deform_motion =
get_boolean(cobject,
"use_deform_motion");
615 if (use_deform_motion && b_parent.ptr.data != b_ob.ptr.data) {
617 use_deform_motion &=
get_boolean(parent_cobject,
"use_deform_motion");
619 return use_deform_motion;
624 for (BL::Modifier &b_mod : b_ob.modifiers) {
625 if (b_mod.is_a(&RNA_FluidModifier)) {
626 BL::FluidModifier b_mmd(b_mod);
628 if (b_mmd.fluid_type() == BL::FluidModifier::fluid_type_DOMAIN &&
629 b_mmd.domain_settings().domain_type() == BL::FluidDomainSettings::domain_type_GAS)
631 return b_mmd.domain_settings();
640 bool *has_subdivision_modifier)
642 for (
int i = b_ob.modifiers.length() - 1;
i >= 0; --
i) {
643 BL::Modifier b_mod = b_ob.modifiers[
i];
645 if (b_mod.type() == BL::Modifier::type_MESH_SEQUENCE_CACHE) {
646 BL::MeshSequenceCacheModifier mesh_cache = BL::MeshSequenceCacheModifier(b_mod);
651 if (b_mod.type() == BL::Modifier::type_PARTICLE_SYSTEM) {
655 if (b_mod.type() == BL::Modifier::type_SUBSURF) {
656 if (has_subdivision_modifier) {
657 *has_subdivision_modifier =
true;
670 if (!b_ob.modifiers.empty()) {
671 BL::Modifier
mod = b_ob.modifiers[b_ob.modifiers.length() - 1];
672 const bool enabled = preview ?
mod.show_viewport() :
mod.show_render();
674 if (
enabled &&
mod.type() == BL::Modifier::type_SUBSURF) {
675 BL::SubsurfModifier subsurf(
mod);
676 if (subsurf.use_adaptive_subdivision()) {
687 const bool use_adaptive_subdivision)
689 if (!use_adaptive_subdivision) {
696 if (subsurf.subdivision_type() == BL::SubsurfModifier::subdivision_type_CATMULL_CLARK) {
708 const bool use_adaptive_subdivision)
710 if (!use_adaptive_subdivision) {
722 if (subsurf.subdivision_type() != BL::SubsurfModifier::subdivision_type_CATMULL_CLARK) {
729 switch (subsurf.boundary_smooth()) {
730 case BL::SubsurfModifier::boundary_smooth_PRESERVE_CORNERS:
733 case BL::SubsurfModifier::boundary_smooth_ALL:
738 switch (subsurf.uv_smooth()) {
739 case BL::SubsurfModifier::uv_smooth_NONE:
742 case BL::SubsurfModifier::uv_smooth_PRESERVE_CORNERS:
745 case BL::SubsurfModifier::uv_smooth_PRESERVE_CORNERS_AND_JUNCTIONS:
748 case BL::SubsurfModifier::uv_smooth_PRESERVE_CORNERS_JUNCTIONS_AND_CONCAVE:
751 case BL::SubsurfModifier::uv_smooth_PRESERVE_BOUNDARIES:
754 case BL::SubsurfModifier::uv_smooth_SMOOTH_ALL:
797 const bool use_motion =
get_boolean(cobject,
"use_motion_blur");
827 edges_.insert(std::pair<int, int>(v0, v1));
833 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)
void BKE_id_free(Main *bmain, void *idv)
void BKE_mesh_texspace_get(Mesh *mesh, float r_texspace_location[3], float r_texspace_size[3])
Mesh * BKE_mesh_new_from_object(Depsgraph *depsgraph, Object *object, bool preserve_all_data_layers, bool preserve_origindex, bool ensure_subdivision)
Mesh * BKE_mesh_wrapper_ensure_subdivision(Mesh *mesh)
const char * dirname(char *path)
Object is a sort of wrapper for general info.
BMesh const char void * data
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(const size_t newsize)
BL::ShaderNodeAttribute::attribute_type_enum BlenderAttributeType
static void set_float3(PointerRNA &ptr, const char *name, const float3 value)
static void curvemapping_minmax(BL::CurveMapping &cumap, const int num_curves, float *min_x, float *max_x)
static void curvemapping_to_array(BL::CurveMapping &cumap, array< float > &data, const int size)
static bool mesh_use_corner_normals(const BObjectInfo &b_ob_info, BL::Mesh &mesh)
static uint object_ray_visibility(BL::Object &b_ob)
static float4 get_float4(const BL::Array< float, 4 > &array)
static BL::Mesh object_to_mesh(BObjectInfo &b_ob_info)
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 float get_float(PointerRNA &ptr, const char *name)
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 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(BObjectInfo &b_ob_info, BL::Mesh &mesh)
static BL::Mesh object_copy_mesh_data(const BObjectInfo &b_ob_info)
static string get_enum_identifier(PointerRNA &ptr, const char *name)
static void set_float(PointerRNA &ptr, const char *name, const float value)
static string get_text_datablock_content(const PointerRNA &ptr)
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 render_add_metadata(BL::RenderResult &b_rr, string name, string value)
BlenderAttributeType blender_attribute_name_split_type(ustring name, string *r_real_name)
static Mesh::SubdivisionType object_subdivision_type(BL::Object &b_ob, const bool preview, const bool use_adaptive_subdivision)
static BL::SubsurfModifier object_subdivision_modifier(BL::Object &b_ob, const bool preview)
static void object_subdivision_to_mesh(BL::Object &b_ob, Mesh &mesh, const bool preview, const bool use_adaptive_subdivision)
static void colorramp_to_array(BL::ColorRamp &ramp, array< float3 > &ramp_color, array< float > &ramp_alpha, const int size)
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 string blender_absolute_path(BL::BlendData &b_data, BL::ID &b_id, const string &path)
static void curvemapping_float_to_array(BL::CurveMapping &cumap, array< float > &data, const int size)
static int3 get_int3(const BL::Array< int, 3 > &array)
static float2 get_float2(const BL::Array< float, 2 > &array)
static void curvemapping_color_to_array(BL::CurveMapping &cumap, array< float3 > &data, const int size, bool rgb_curve)
static int image_user_frame_number(BL::ImageUser &iuser, BL::Image &ima, const int cfra)
static void set_int(PointerRNA &ptr, const char *name, const int value)
static void set_float4(PointerRNA &ptr, const char *name, const float4 value)
static BL::FluidDomainSettings object_fluid_gas_domain_find(BL::Object &b_ob)
void python_thread_state_save(void **python_thread_state)
static CCL_NAMESPACE_BEGIN BL::ID object_get_data(const BL::Object &b_ob, const bool use_adaptive_subdivision)
static void curvemap_minmax_curve(BL::CurveMap &curve, float *min_x, float *max_x)
static string get_string(PointerRNA &ptr, const char *name)
static Transform get_transform(const BL::Array< float, 16 > &array)
static void set_enum(PointerRNA &ptr, const char *name, const int value)
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 bool region_view3d_navigating_or_transforming(const BL::RegionView3D &b_rv3d)
static void set_string(PointerRNA &ptr, const char *name, const string &value)
static string image_user_file_path(BL::BlendData &data, BL::ImageUser &iuser, BL::Image &ima, const int cfra)
#define CCL_NAMESPACE_END
#define assert(assertion)
VecBase< float, D > constexpr mod(VecOp< float, D >, VecOp< float, D >) RET
const ccl_global KernelWorkTile * tile
@ PATH_RAY_VOLUME_SCATTER
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)
const PointerRNA PointerRNA_NULL
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)
float RNA_float_get(PointerRNA *ptr, const char *name)
std::string RNA_string_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)
PointerRNA RNA_id_pointer_create(ID *id)
bool use_adaptive_subdivision
bool is_real_object_data() const
@ SUBDIVISION_FVAR_LINEAR_NONE
@ SUBDIVISION_FVAR_LINEAR_CORNERS_PLUS2
@ SUBDIVISION_FVAR_LINEAR_CORNERS_ONLY
@ SUBDIVISION_FVAR_LINEAR_ALL
@ SUBDIVISION_FVAR_LINEAR_BOUNDARIES
@ SUBDIVISION_FVAR_LINEAR_CORNERS_PLUS1
@ SUBDIVISION_CATMULL_CLARK
@ SUBDIVISION_BOUNDARY_EDGE_ONLY
@ SUBDIVISION_BOUNDARY_EDGE_AND_CORNER
MotionType need_motion() const