diff options
author | Julian Eisel <eiseljulian@gmail.com> | 2015-10-21 12:32:24 +0300 |
---|---|---|
committer | Julian Eisel <eiseljulian@gmail.com> | 2015-10-21 12:54:28 +0300 |
commit | 6ec01dcbf29104a6f323b54f8afb2adfd2163ada (patch) | |
tree | 521b87e62ba8651f8bb3ffc35cc3cabb09342404 /source/blender/blenkernel | |
parent | 7c1f329f286f464c77f970204a3b617ce6e56086 (diff) | |
parent | 6bc007610263c879f6bb30b844ba9d9a0fb9433c (diff) |
Merge branch 'master' into wiggly-widgets
Diffstat (limited to 'source/blender/blenkernel')
87 files changed, 1851 insertions, 691 deletions
diff --git a/source/blender/blenkernel/BKE_blender.h b/source/blender/blenkernel/BKE_blender.h index bb00752db66..607f2a98939 100644 --- a/source/blender/blenkernel/BKE_blender.h +++ b/source/blender/blenkernel/BKE_blender.h @@ -51,7 +51,7 @@ extern "C" { /* can be left blank, otherwise a,b,c... etc with no quotes */ #define BLENDER_VERSION_CHAR /* alpha/beta/rc/release, docs use this */ -#define BLENDER_VERSION_CYCLE rc +#define BLENDER_VERSION_CYCLE alpha extern char versionstr[]; /* from blender.c */ diff --git a/source/blender/blenkernel/BKE_brush.h b/source/blender/blenkernel/BKE_brush.h index aff3fb08df6..bb3ad0efb63 100644 --- a/source/blender/blenkernel/BKE_brush.h +++ b/source/blender/blenkernel/BKE_brush.h @@ -40,6 +40,7 @@ void BKE_brush_system_init(void); void BKE_brush_system_exit(void); /* datablock functions */ +void BKE_brush_init(struct Brush *brush); struct Brush *BKE_brush_add(struct Main *bmain, const char *name, short ob_mode); struct Brush *BKE_brush_first_search(struct Main *bmain, short ob_mode); struct Brush *BKE_brush_copy(struct Brush *brush); diff --git a/source/blender/blenkernel/BKE_bvhutils.h b/source/blender/blenkernel/BKE_bvhutils.h index 18eda63bcf1..749b0db7c27 100644 --- a/source/blender/blenkernel/BKE_bvhutils.h +++ b/source/blender/blenkernel/BKE_bvhutils.h @@ -68,7 +68,8 @@ typedef struct BVHTreeFromMesh { float sphere_radius; /* Private data */ - void *em_evil; /* var only for snapping */ + void *em_evil; + bool em_evil_all; /* ignore selection/hidden state, adding all loops to the tree */ bool cached; } BVHTreeFromMesh; @@ -141,8 +142,11 @@ enum { BVHTREE_FROM_VERTS = 0, BVHTREE_FROM_EDGES = 1, BVHTREE_FROM_FACES = 2, - BVHTREE_FROM_FACES_EDITMESH = 3, - BVHTREE_FROM_LOOPTRI = 4, + BVHTREE_FROM_LOOPTRI = 3, + /* all faces */ + BVHTREE_FROM_FACES_EDITMESH_ALL = 4, + /* visible unselected, only used for transform snapping */ + BVHTREE_FROM_FACES_EDITMESH_SNAP = 5, }; typedef struct LinkNode *BVHCache; diff --git a/source/blender/blenkernel/BKE_camera.h b/source/blender/blenkernel/BKE_camera.h index aacb7a4066b..118153a9163 100644 --- a/source/blender/blenkernel/BKE_camera.h +++ b/source/blender/blenkernel/BKE_camera.h @@ -50,6 +50,7 @@ struct GPUFXSettings; /* Camera Datablock */ +void BKE_camera_init(struct Camera *cam); void *BKE_camera_add(struct Main *bmain, const char *name); struct Camera *BKE_camera_copy(struct Camera *cam); void BKE_camera_make_local(struct Camera *cam); diff --git a/source/blender/blenkernel/BKE_curve.h b/source/blender/blenkernel/BKE_curve.h index a03dd287146..061270b8b41 100644 --- a/source/blender/blenkernel/BKE_curve.h +++ b/source/blender/blenkernel/BKE_curve.h @@ -69,6 +69,7 @@ typedef struct CurveCache { void BKE_curve_unlink(struct Curve *cu); void BKE_curve_free(struct Curve *cu); void BKE_curve_editfont_free(struct Curve *cu); +void BKE_curve_init(struct Curve *cu); struct Curve *BKE_curve_add(struct Main *bmain, const char *name, int type); struct Curve *BKE_curve_copy(struct Curve *cu); void BKE_curve_make_local(struct Curve *cu); diff --git a/source/blender/blenkernel/BKE_customdata.h b/source/blender/blenkernel/BKE_customdata.h index 3e784752f10..a7c5c210061 100644 --- a/source/blender/blenkernel/BKE_customdata.h +++ b/source/blender/blenkernel/BKE_customdata.h @@ -472,6 +472,8 @@ typedef struct CustomDataTransferLayerMap { size_t data_offset; /* Offset of actual data we transfer (in element contained in data_src/dst). */ uint64_t data_flag; /* For bitflag transfer, flag(s) to affect in transfered data. */ + void *interp_data; /* Opaque pointer, to be used by specific interp callback (e.g. transformspace for normals). */ + cd_datatransfer_interp interp; } CustomDataTransferLayerMap; diff --git a/source/blender/blenkernel/BKE_font.h b/source/blender/blenkernel/BKE_font.h index 137670215cc..5dcc6f8d981 100644 --- a/source/blender/blenkernel/BKE_font.h +++ b/source/blender/blenkernel/BKE_font.h @@ -79,8 +79,11 @@ void BKE_vfont_builtin_register(void *mem, int size); void BKE_vfont_free_data(struct VFont *vfont); void BKE_vfont_free(struct VFont *sc); +void BKE_vfont_init(struct VFont *vfont); struct VFont *BKE_vfont_builtin_get(void); -struct VFont *BKE_vfont_load(struct Main *bmain, const char *name); +struct VFont *BKE_vfont_load(struct Main *bmain, const char *filepath); +struct VFont *BKE_vfont_load_exists_ex(struct Main *bmain, const char *filepath, bool *r_exists); +struct VFont *BKE_vfont_load_exists(struct Main *bmain, const char *filepath); bool BKE_vfont_to_curve_ex(struct Main *bmain, struct Object *ob, int mode, struct ListBase *r_nubase, diff --git a/source/blender/blenkernel/BKE_idcode.h b/source/blender/blenkernel/BKE_idcode.h index ebad0d42232..6de0efe2709 100644 --- a/source/blender/blenkernel/BKE_idcode.h +++ b/source/blender/blenkernel/BKE_idcode.h @@ -32,15 +32,15 @@ * \ingroup bke */ -const char *BKE_idcode_to_name(int code); -const char *BKE_idcode_to_name_plural(int code); -const char *BKE_idcode_to_translation_context(int code); -int BKE_idcode_from_name(const char *name); -bool BKE_idcode_is_linkable(int code); -bool BKE_idcode_is_valid(int code); +const char *BKE_idcode_to_name(short idcode); +const char *BKE_idcode_to_name_plural(short idcode); +const char *BKE_idcode_to_translation_context(short idcode); +short BKE_idcode_from_name(const char *name); +bool BKE_idcode_is_linkable(short idcode); +bool BKE_idcode_is_valid(short idcode); -int BKE_idcode_to_idfilter(const int idcode); -int BKE_idcode_from_idfilter(const int idfilter); +int BKE_idcode_to_idfilter(const short idcode); +short BKE_idcode_from_idfilter(const int idfilter); /** * Return an ID code and steps the index forward 1. @@ -48,6 +48,6 @@ int BKE_idcode_from_idfilter(const int idfilter); * \param index start as 0. * \return the code, 0 when all codes have been returned. */ -int BKE_idcode_iter_step(int *index); +short BKE_idcode_iter_step(int *index); #endif diff --git a/source/blender/blenkernel/BKE_image.h b/source/blender/blenkernel/BKE_image.h index 94afc8a16ea..ea63161e008 100644 --- a/source/blender/blenkernel/BKE_image.h +++ b/source/blender/blenkernel/BKE_image.h @@ -212,6 +212,8 @@ void BKE_image_multiview_index(struct Image *ima, struct ImageUser *iuser); /* for multilayer images as well as for render-viewer */ bool BKE_image_is_multilayer(struct Image *ima); +bool BKE_image_is_multiview(struct Image *ima); +bool BKE_image_is_stereo(struct Image *ima); struct RenderResult *BKE_image_acquire_renderresult(struct Scene *scene, struct Image *ima); void BKE_image_release_renderresult(struct Scene *scene, struct Image *ima); diff --git a/source/blender/blenkernel/BKE_key.h b/source/blender/blenkernel/BKE_key.h index abe12282a1b..1edbb455ca4 100644 --- a/source/blender/blenkernel/BKE_key.h +++ b/source/blender/blenkernel/BKE_key.h @@ -65,6 +65,8 @@ float *BKE_key_evaluate_object_ex( float *BKE_key_evaluate_object( struct Object *ob, int *r_totelem); +struct Key **BKE_key_from_id_p(struct ID *id); +struct Key *BKE_key_from_id(struct ID *id); struct Key **BKE_key_from_object_p(struct Object *ob); struct Key *BKE_key_from_object(struct Object *ob); struct KeyBlock *BKE_keyblock_from_object(struct Object *ob); @@ -101,6 +103,8 @@ void BKE_keyblock_convert_to_curve(struct KeyBlock *kb, struct Curve *cu, st void BKE_keyblock_update_from_mesh(struct Mesh *me, struct KeyBlock *kb); void BKE_keyblock_convert_from_mesh(struct Mesh *me, struct KeyBlock *kb); void BKE_keyblock_convert_to_mesh(struct KeyBlock *kb, struct Mesh *me); +void BKE_keyblock_mesh_calc_normals( + struct KeyBlock *kb, struct Mesh *mesh, float (*r_vertnors)[3], float (*r_polynors)[3], float (*r_loopnors)[3]); void BKE_keyblock_update_from_vertcos(struct Object *ob, struct KeyBlock *kb, float (*vertCos)[3]); void BKE_keyblock_convert_from_vertcos(struct Object *ob, struct KeyBlock *kb, float (*vertCos)[3]); diff --git a/source/blender/blenkernel/BKE_lamp.h b/source/blender/blenkernel/BKE_lamp.h index fb2c4da91ea..d830c19651f 100644 --- a/source/blender/blenkernel/BKE_lamp.h +++ b/source/blender/blenkernel/BKE_lamp.h @@ -42,6 +42,7 @@ struct Lamp; struct Main; struct Scene; +void BKE_lamp_init(struct Lamp *la); struct Lamp *BKE_lamp_add(struct Main *bmain, const char *name) ATTR_WARN_UNUSED_RESULT; struct Lamp *BKE_lamp_copy(struct Lamp *la) ATTR_WARN_UNUSED_RESULT; struct Lamp *localize_lamp(struct Lamp *la) ATTR_WARN_UNUSED_RESULT; diff --git a/source/blender/blenkernel/BKE_lattice.h b/source/blender/blenkernel/BKE_lattice.h index 677d8e34229..828a40de1c9 100644 --- a/source/blender/blenkernel/BKE_lattice.h +++ b/source/blender/blenkernel/BKE_lattice.h @@ -45,6 +45,7 @@ struct BPoint; struct MDeformVert; void BKE_lattice_resize(struct Lattice *lt, int u, int v, int w, struct Object *ltOb); +void BKE_lattice_init(struct Lattice *lt); struct Lattice *BKE_lattice_add(struct Main *bmain, const char *name); struct Lattice *BKE_lattice_copy(struct Lattice *lt); void BKE_lattice_free(struct Lattice *lt); diff --git a/source/blender/blenkernel/BKE_library.h b/source/blender/blenkernel/BKE_library.h index 5b12858fc7d..f46ae5617ac 100644 --- a/source/blender/blenkernel/BKE_library.h +++ b/source/blender/blenkernel/BKE_library.h @@ -49,11 +49,14 @@ struct bContext; struct PointerRNA; struct PropertyRNA; +void *BKE_libblock_alloc_notest(short type); void *BKE_libblock_alloc(struct Main *bmain, short type, const char *name) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(); +void BKE_libblock_init_empty(struct ID *id); void *BKE_libblock_copy_ex(struct Main *bmain, struct ID *id) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(); void *BKE_libblock_copy_nolib(struct ID *id, const bool do_action) ATTR_NONNULL(); void *BKE_libblock_copy(struct ID *id) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(); void BKE_libblock_copy_data(struct ID *id, const struct ID *id_from, const bool do_action); +void BKE_libblock_relink(struct ID *id); void BKE_id_lib_local_paths(struct Main *bmain, struct Library *lib, struct ID *id); void id_lib_extern(struct ID *id); diff --git a/source/blender/blenkernel/BKE_library_query.h b/source/blender/blenkernel/BKE_library_query.h index 50958f8ee80..194b6f0e6b3 100644 --- a/source/blender/blenkernel/BKE_library_query.h +++ b/source/blender/blenkernel/BKE_library_query.h @@ -38,6 +38,16 @@ enum { IDWALK_NOP = 0, IDWALK_NEVER_NULL = (1 << 0), IDWALK_NEVER_SELF = (1 << 1), + + /** + * Adjusts #ID.us reference-count. + * \note keep in sync with 'newlibadr_us' use in readfile.c + */ + IDWALK_USER = (1 << 8), + /** + * Ensure #ID.us is at least 1 on use. + */ + IDWALK_USER_ONE = (1 << 9), }; /* Call a callback for each ID link which the given ID uses. @@ -53,5 +63,6 @@ enum { /* Loop over all of the ID's this datablock links to. */ void BKE_library_foreach_ID_link(struct ID *id, LibraryIDLinkCallback callback, void *user_data, int flag); +void BKE_library_update_ID_link_user(struct ID *id_dst, struct ID *id_src, const int cd_flag); #endif /* __BKE_LIBRARY_QUERY_H__ */ diff --git a/source/blender/blenkernel/BKE_linestyle.h b/source/blender/blenkernel/BKE_linestyle.h index e77b4f5e8fe..e3eead4102c 100644 --- a/source/blender/blenkernel/BKE_linestyle.h +++ b/source/blender/blenkernel/BKE_linestyle.h @@ -49,6 +49,7 @@ struct Object; struct ColorBand; struct bContext; +void BKE_linestyle_init(struct FreestyleLineStyle *linestyle); FreestyleLineStyle *BKE_linestyle_new(struct Main *bmain, const char *name); void BKE_linestyle_free(FreestyleLineStyle *linestyle); FreestyleLineStyle *BKE_linestyle_copy(struct Main *bmain, FreestyleLineStyle *linestyle); diff --git a/source/blender/blenkernel/BKE_material.h b/source/blender/blenkernel/BKE_material.h index a3c61f44ff2..d32d679e7ed 100644 --- a/source/blender/blenkernel/BKE_material.h +++ b/source/blender/blenkernel/BKE_material.h @@ -49,7 +49,7 @@ void BKE_material_free(struct Material *sc); void BKE_material_free_ex(struct Material *ma, bool do_id_user); void test_object_materials(struct Main *bmain, struct ID *id); void BKE_material_resize_object(struct Object *ob, const short totcol, bool do_id_user); -void init_material(struct Material *ma); +void BKE_material_init(struct Material *ma); void BKE_material_remap_object(struct Object *ob, const unsigned int *remap); struct Material *BKE_material_add(struct Main *bmain, const char *name); struct Material *BKE_material_copy(struct Material *ma); diff --git a/source/blender/blenkernel/BKE_mball.h b/source/blender/blenkernel/BKE_mball.h index 62cd50099fd..0574b88bef3 100644 --- a/source/blender/blenkernel/BKE_mball.h +++ b/source/blender/blenkernel/BKE_mball.h @@ -40,6 +40,7 @@ struct MetaElem; void BKE_mball_unlink(struct MetaBall *mb); void BKE_mball_free(struct MetaBall *mb); +void BKE_mball_init(struct MetaBall *mb); struct MetaBall *BKE_mball_add(struct Main *bmain, const char *name); struct MetaBall *BKE_mball_copy(struct MetaBall *mb); diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h index a27688c1c61..f35613f8bf7 100644 --- a/source/blender/blenkernel/BKE_mesh.h +++ b/source/blender/blenkernel/BKE_mesh.h @@ -82,6 +82,7 @@ int BKE_mesh_edge_other_vert(const struct MEdge *e, int v); void BKE_mesh_unlink(struct Mesh *me); void BKE_mesh_free(struct Mesh *me, int unlink); +void BKE_mesh_init(struct Mesh *me); struct Mesh *BKE_mesh_add(struct Main *bmain, const char *name); struct Mesh *BKE_mesh_copy_ex(struct Main *bmain, struct Mesh *me); struct Mesh *BKE_mesh_copy(struct Mesh *me); @@ -170,7 +171,7 @@ void BKE_mesh_calc_normals_mapping_ex( const struct MFace *mfaces, int numFaces, const int *origIndexFace, float (*r_faceNors)[3], const bool only_face_normals); void BKE_mesh_calc_normals_poly( - struct MVert *mverts, int numVerts, + struct MVert *mverts, float (*r_vertnors)[3], int numVerts, const struct MLoop *mloop, const struct MPoly *mpolys, int numLoops, int numPolys, float (*r_polyNors)[3], const bool only_face_normals); diff --git a/source/blender/blenkernel/BKE_modifier.h b/source/blender/blenkernel/BKE_modifier.h index ded6e13e003..455912ab819 100644 --- a/source/blender/blenkernel/BKE_modifier.h +++ b/source/blender/blenkernel/BKE_modifier.h @@ -104,8 +104,9 @@ typedef enum { eModifierTypeFlag_UsesPreview = (1 << 9) } ModifierTypeFlag; -typedef void (*ObjectWalkFunc)(void *userData, struct Object *ob, struct Object **obpoin); -typedef void (*IDWalkFunc)(void *userData, struct Object *ob, struct ID **idpoin); +/* IMPORTANT! Keep ObjectWalkFunc and IDWalkFunc signatures compatible. */ +typedef void (*ObjectWalkFunc)(void *userData, struct Object *ob, struct Object **obpoin, int cd_flag); +typedef void (*IDWalkFunc)(void *userData, struct Object *ob, struct ID **idpoin, int cd_flag); typedef void (*TexWalkFunc)(void *userData, struct Object *ob, struct ModifierData *md, const char *propname); typedef enum ModifierApplyFlag { diff --git a/source/blender/blenkernel/BKE_movieclip.h b/source/blender/blenkernel/BKE_movieclip.h index 7d7675270de..afca326c727 100644 --- a/source/blender/blenkernel/BKE_movieclip.h +++ b/source/blender/blenkernel/BKE_movieclip.h @@ -43,6 +43,8 @@ void BKE_movieclip_free(struct MovieClip *clip); void BKE_movieclip_unlink(struct Main *bmain, struct MovieClip *clip); struct MovieClip *BKE_movieclip_file_add(struct Main *bmain, const char *name); +struct MovieClip *BKE_movieclip_file_add_exists_ex(struct Main *bmain, const char *name, bool *r_exists); +struct MovieClip *BKE_movieclip_file_add_exists(struct Main *bmain, const char *name); void BKE_movieclip_reload(struct MovieClip *clip); void BKE_movieclip_clear_cache(struct MovieClip *clip); void BKE_movieclip_clear_proxy_cache(struct MovieClip *clip); diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h index b97bf203a7c..88e54d0ff2c 100644 --- a/source/blender/blenkernel/BKE_node.h +++ b/source/blender/blenkernel/BKE_node.h @@ -337,6 +337,7 @@ struct GHashIterator *ntreeTypeGetIterator(void); void ntreeSetTypes(const struct bContext *C, struct bNodeTree *ntree); +void ntreeInitDefault(struct bNodeTree *ntree); struct bNodeTree *ntreeAddTree(struct Main *bmain, const char *name, const char *idname); /* copy/free funcs, need to manage ID users */ diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h index 6c5081d1ea9..45d14a35539 100644 --- a/source/blender/blenkernel/BKE_object.h +++ b/source/blender/blenkernel/BKE_object.h @@ -85,6 +85,7 @@ bool BKE_object_is_in_editmode(struct Object *ob); bool BKE_object_is_in_editmode_vgroup(struct Object *ob); bool BKE_object_is_in_wpaint_select_vert(struct Object *ob); +void BKE_object_init(struct Object *ob); struct Object *BKE_object_add_only_object( struct Main *bmain, int type, const char *name) @@ -234,6 +235,7 @@ int BKE_object_is_modified(struct Scene *scene, struct Object *ob); int BKE_object_is_deform_modified(struct Scene *scene, struct Object *ob); void BKE_object_relink(struct Object *ob); +void BKE_object_data_relink(struct Object *ob); struct MovieClip *BKE_object_movieclip_get(struct Scene *scene, struct Object *ob, bool use_default); diff --git a/source/blender/blenkernel/BKE_particle.h b/source/blender/blenkernel/BKE_particle.h index 89cfb3a2aac..00cc48cf713 100644 --- a/source/blender/blenkernel/BKE_particle.h +++ b/source/blender/blenkernel/BKE_particle.h @@ -378,6 +378,11 @@ void psys_get_birth_coords(struct ParticleSimulationData *sim, struct ParticleDa void particle_system_update(struct Scene *scene, struct Object *ob, struct ParticleSystem *psys); +/* Callback format for performing operations on ID-pointers for particle systems */ +typedef void (*ParticleSystemIDFunc)(struct ParticleSystem *psys, struct ID **idpoin, void *userdata, int cd_flag); + +void BKE_particlesystem_id_loop(struct ParticleSystem *psys, ParticleSystemIDFunc func, void *userdata); + /* ----------- functions needed only inside particlesystem ------------ */ /* particle.c */ void psys_disable_all(struct Object *ob); diff --git a/source/blender/blenkernel/BKE_rigidbody.h b/source/blender/blenkernel/BKE_rigidbody.h index a30ce6cda79..272abc42899 100644 --- a/source/blender/blenkernel/BKE_rigidbody.h +++ b/source/blender/blenkernel/BKE_rigidbody.h @@ -53,6 +53,11 @@ struct RigidBodyOb *BKE_rigidbody_copy_object(struct Object *ob); struct RigidBodyCon *BKE_rigidbody_copy_constraint(struct Object *ob); void BKE_rigidbody_relink_constraint(struct RigidBodyCon *rbc); +/* Callback format for performing operations on ID-pointers for rigidbody world. */ +typedef void (*RigidbodyWorldIDFunc)(struct RigidBodyWorld *rbw, struct ID **idpoin, void *userdata, int cd_flag); + +void BKE_rigidbody_world_id_loop(struct RigidBodyWorld *rbw, RigidbodyWorldIDFunc func, void *userdata); + /* -------------- */ /* Setup */ diff --git a/source/blender/blenkernel/BKE_sca.h b/source/blender/blenkernel/BKE_sca.h index ebdd159b40c..fa448aa97b8 100644 --- a/source/blender/blenkernel/BKE_sca.h +++ b/source/blender/blenkernel/BKE_sca.h @@ -73,6 +73,16 @@ void sca_move_sensor(struct bSensor *sens_to_move, struct Object *ob, int move_u void sca_move_controller(struct bController *cont_to_move, struct Object *ob, int move_up); void sca_move_actuator(struct bActuator *act_to_move, struct Object *ob, int move_up); +/* Callback format for performing operations on ID-pointers for sensors/controllers/actuators. */ +typedef void (*SCASensorIDFunc)(struct bSensor *sensor, struct ID **idpoin, void *userdata, int cd_flag); +typedef void (*SCAControllerIDFunc)(struct bController *controller, struct ID **idpoin, void *userdata, int cd_flag); +typedef void (*SCAActuatorIDFunc)(struct bActuator *actuator, struct ID **idpoin, void *userdata, int cd_flag); + +void BKE_sca_sensors_id_loop(struct ListBase *senslist, SCASensorIDFunc func, void *userdata); +void BKE_sca_controllers_id_loop(struct ListBase *contlist, SCAControllerIDFunc func, void *userdata); +void BKE_sca_actuators_id_loop(struct ListBase *atclist, SCAActuatorIDFunc func, void *userdata); + + const char *sca_state_name_get(Object *ob, short bit); #endif diff --git a/source/blender/blenkernel/BKE_scene.h b/source/blender/blenkernel/BKE_scene.h index 027bdbbbe58..aa698317e33 100644 --- a/source/blender/blenkernel/BKE_scene.h +++ b/source/blender/blenkernel/BKE_scene.h @@ -67,6 +67,7 @@ void free_avicodecdata(struct AviCodecData *acd); void free_qtcodecdata(struct QuicktimeCodecData *acd); void BKE_scene_free(struct Scene *sce); +void BKE_scene_init(struct Scene *sce); struct Scene *BKE_scene_add(struct Main *bmain, const char *name); /* base functions */ diff --git a/source/blender/blenkernel/BKE_sequencer.h b/source/blender/blenkernel/BKE_sequencer.h index f73548373ef..06f46131c68 100644 --- a/source/blender/blenkernel/BKE_sequencer.h +++ b/source/blender/blenkernel/BKE_sequencer.h @@ -35,6 +35,7 @@ struct EvaluationContext; struct StripColorBalance; struct Editing; struct GSet; +struct GPUOffScreen; struct ImBuf; struct Main; struct Mask; @@ -101,6 +102,10 @@ typedef struct SeqRenderData { bool skip_cache; bool is_proxy_render; size_t view_id; + + /* special case for OpenGL render */ + struct GPUOffScreen *gpu_offscreen; + int gpu_samples; } SeqRenderData; void BKE_sequencer_new_render_data( @@ -108,6 +113,8 @@ void BKE_sequencer_new_render_data( int rectx, int recty, int preview_render_size, SeqRenderData *r_context); +int BKE_sequencer_cmp_time_startdisp(const void *a, const void *b); + /* Wipe effect */ enum { DO_SINGLE_WIPE, @@ -406,7 +413,11 @@ struct Sequence *BKE_sequencer_add_sound_strip(struct bContext *C, ListBase *seq struct Sequence *BKE_sequencer_add_movie_strip(struct bContext *C, ListBase *seqbasep, struct SeqLoadInfo *seq_load); /* view3d draw callback, run when not in background view */ -typedef struct ImBuf *(*SequencerDrawView)(struct Scene *, struct Object *, int, int, unsigned int, int, bool, bool, bool, int, const char *, char[256]); +typedef struct ImBuf *(*SequencerDrawView)( + struct Scene *, struct Object *, int, int, + unsigned int, int, bool, bool, bool, + int, int, const char *, + struct GPUOffScreen *, char[256]); extern SequencerDrawView sequencer_view3d_cb; /* copy/paste */ diff --git a/source/blender/blenkernel/BKE_sound.h b/source/blender/blenkernel/BKE_sound.h index e68be701b61..67db2537c8f 100644 --- a/source/blender/blenkernel/BKE_sound.h +++ b/source/blender/blenkernel/BKE_sound.h @@ -61,7 +61,9 @@ void BKE_sound_exit(void); void BKE_sound_force_device(const char *device); -struct bSound *BKE_sound_new_file(struct Main *main, const char *filename); +struct bSound *BKE_sound_new_file(struct Main *main, const char *filepath); +struct bSound *BKE_sound_new_file_exists_ex(struct Main *bmain, const char *filepath, bool *r_exists); +struct bSound *BKE_sound_new_file_exists(struct Main *bmain, const char *filepath); // XXX unused currently #if 0 diff --git a/source/blender/blenkernel/BKE_speaker.h b/source/blender/blenkernel/BKE_speaker.h index 5d93b9844ab..5f30df1d6e3 100644 --- a/source/blender/blenkernel/BKE_speaker.h +++ b/source/blender/blenkernel/BKE_speaker.h @@ -29,7 +29,9 @@ */ struct Main; +struct Speaker; +void BKE_speaker_init(struct Speaker *spk); void *BKE_speaker_add(struct Main *bmain, const char *name); struct Speaker *BKE_speaker_copy(struct Speaker *spk); void BKE_speaker_make_local(struct Speaker *spk); diff --git a/source/blender/blenkernel/BKE_text.h b/source/blender/blenkernel/BKE_text.h index a5a59d14c92..50e4fa4c41d 100644 --- a/source/blender/blenkernel/BKE_text.h +++ b/source/blender/blenkernel/BKE_text.h @@ -44,6 +44,7 @@ struct TextLine; void BKE_text_free (struct Text *text); void txt_set_undostate (int u); int txt_get_undostate (void); +void BKE_text_init(struct Text *ta); struct Text *BKE_text_add (struct Main *bmain, const char *name); int txt_extended_ascii_as_utf8(char **str); bool BKE_text_reload(struct Text *text); diff --git a/source/blender/blenkernel/BKE_world.h b/source/blender/blenkernel/BKE_world.h index 7f4ba6c615e..8d7ab230919 100644 --- a/source/blender/blenkernel/BKE_world.h +++ b/source/blender/blenkernel/BKE_world.h @@ -38,6 +38,7 @@ struct World; void BKE_world_free(struct World *sc); void BKE_world_free_ex(struct World *sc, bool do_id_user); +void BKE_world_init(struct World *wrld); struct World *add_world(struct Main *bmian, const char *name); struct World *BKE_world_copy(struct World *wrld); struct World *localize_world(struct World *wrld); diff --git a/source/blender/blenkernel/intern/CCGSubSurf_opensubdiv.c b/source/blender/blenkernel/intern/CCGSubSurf_opensubdiv.c index 39669fd76d7..9d5ef1079b8 100644 --- a/source/blender/blenkernel/intern/CCGSubSurf_opensubdiv.c +++ b/source/blender/blenkernel/intern/CCGSubSurf_opensubdiv.c @@ -911,6 +911,10 @@ void ccgSubSurf_getMinMax(CCGSubSurf *ss, float r_min[3], float r_max[3]) { int i; BLI_assert(ss->skip_grids == true); + if (ss->osd_num_coarse_coords == 0) { + zero_v3(r_min); + zero_v3(r_max); + } for (i = 0; i < ss->osd_num_coarse_coords; i++) { /* Coarse coordinates has normals interleaved into the array. */ DO_MINMAX(ss->osd_coarse_coords[2 * i], r_min, r_max); diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c index 20dabbdc323..4cf9885c716 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.c +++ b/source/blender/blenkernel/intern/DerivedMesh.c @@ -1561,8 +1561,8 @@ void DM_update_weight_mcol( ml = mloop + mp->loopstart; for (j = 0; j < mp->totloop; j++, ml++, l_index++) { - copy_v4_v4_char((char *)&wtcol_l[l_index], - (char *)&wtcol_v[ml->v]); + copy_v4_v4_uchar(&wtcol_l[l_index][0], + &wtcol_v[ml->v][0]); } } MEM_freeN(wtcol_v); @@ -2626,13 +2626,13 @@ static CustomDataMask object_get_datamask(const Scene *scene, Object *ob, bool * { Object *actob = scene->basact ? scene->basact->object : NULL; CustomDataMask mask = ob->customdata_mask; - bool editing = BKE_paint_select_face_test(ob); if (r_need_mapping) { *r_need_mapping = false; } if (ob == actob) { + bool editing = BKE_paint_select_face_test(ob); /* weight paint and face select need original indices because of selection buffer drawing */ if (r_need_mapping) { @@ -3453,7 +3453,7 @@ void DM_draw_attrib_vertex(DMVertexAttribs *attribs, int a, int index, int vert, if (attribs->mcol[b].array) { const MLoopCol *cp = &attribs->mcol[b].array[loop]; - copy_v4_v4_char((char *)col, &cp->r); + copy_v4_v4_uchar(col, &cp->r); } else { col[0] = 0; col[1] = 0; col[2] = 0; col[3] = 0; diff --git a/source/blender/blenkernel/intern/appdir.c b/source/blender/blenkernel/intern/appdir.c index ee6710e1130..639a502fb83 100644 --- a/source/blender/blenkernel/intern/appdir.c +++ b/source/blender/blenkernel/intern/appdir.c @@ -548,15 +548,7 @@ static void where_am_i(char *fullname, const size_t maxlen, const char *name) BLI_strncpy(fullname, name, maxlen); if (name[0] == '.') { - char wdir[FILE_MAX] = ""; - BLI_current_working_dir(wdir, sizeof(wdir)); /* backup cwd to restore after */ - - // not needed but avoids annoying /./ in name - if (name[1] == SEP) - BLI_join_dirfile(fullname, maxlen, wdir, name + 2); - else - BLI_join_dirfile(fullname, maxlen, wdir, name); - + BLI_path_cwd(fullname, maxlen); #ifdef _WIN32 BLI_path_program_extensions_add_win32(fullname, maxlen); #endif diff --git a/source/blender/blenkernel/intern/blender.c b/source/blender/blenkernel/intern/blender.c index 9aad3cf564b..f1300697b85 100644 --- a/source/blender/blenkernel/intern/blender.c +++ b/source/blender/blenkernel/intern/blender.c @@ -1069,11 +1069,11 @@ int BKE_copybuffer_paste(bContext *C, const char *libname, ReportList *reports) BKE_main_id_flag_all(bmain, LIB_PRE_EXISTING, true); /* here appending/linking starts */ - mainl = BLO_library_append_begin(bmain, &bh, libname); + mainl = BLO_library_link_begin(bmain, &bh, libname); - BLO_library_append_all(mainl, bh); + BLO_library_link_all(mainl, bh); - BLO_library_append_end(C, mainl, &bh, 0, 0); + BLO_library_link_end(mainl, &bh, 0, scene, CTX_wm_view3d(C)); /* mark all library linked objects to be updated */ BKE_main_lib_objects_recalc_all(bmain); diff --git a/source/blender/blenkernel/intern/brush.c b/source/blender/blenkernel/intern/brush.c index e0ffd830804..c2a66adbf92 100644 --- a/source/blender/blenkernel/intern/brush.c +++ b/source/blender/blenkernel/intern/brush.c @@ -131,11 +131,9 @@ static void brush_defaults(Brush *brush) /* Datablock add/copy/free/make_local */ -Brush *BKE_brush_add(Main *bmain, const char *name, short ob_mode) +void BKE_brush_init(Brush *brush) { - Brush *brush; - - brush = BKE_libblock_alloc(bmain, ID_BR, name); + BLI_assert(MEMCMP_STRUCT_OFS_IS_ZERO(brush, id)); /* enable fake user by default */ brush->id.flag |= LIB_FAKEUSER; @@ -143,10 +141,20 @@ Brush *BKE_brush_add(Main *bmain, const char *name, short ob_mode) brush_defaults(brush); brush->sculpt_tool = SCULPT_TOOL_DRAW; /* sculpting defaults to the draw tool for new brushes */ - brush->ob_mode = ob_mode; /* the default alpha falloff curve */ BKE_brush_curve_preset(brush, CURVE_PRESET_SMOOTH); +} + +Brush *BKE_brush_add(Main *bmain, const char *name, short ob_mode) +{ + Brush *brush; + + brush = BKE_libblock_alloc(bmain, ID_BR, name); + + BKE_brush_init(brush); + + brush->ob_mode = ob_mode; return brush; } diff --git a/source/blender/blenkernel/intern/bvhutils.c b/source/blender/blenkernel/intern/bvhutils.c index 626be0eaf4e..9004985aebd 100644 --- a/source/blender/blenkernel/intern/bvhutils.c +++ b/source/blender/blenkernel/intern/bvhutils.c @@ -597,7 +597,8 @@ BVHTree *bvhtree_from_mesh_edges(BVHTreeFromMesh *data, DerivedMesh *dm, float e static BVHTree *bvhtree_from_mesh_faces_create_tree( float epsilon, int tree_type, int axis, - BMEditMesh *em, MVert *vert, MFace *face, const int numFaces, + BMEditMesh *em, const bool em_all, + MVert *vert, MFace *face, const int numFaces, BLI_bitmap *mask, int numFaces_active) { BVHTree *tree = NULL; @@ -646,7 +647,10 @@ static BVHTree *bvhtree_from_mesh_faces_create_tree( insert = insert_prev; } else if (insert) { - if (BM_elem_flag_test(f, BM_ELEM_SELECT) || BM_elem_flag_test(f, BM_ELEM_HIDDEN)) { + if (em_all) { + /* pass */ + } + else if (BM_elem_flag_test(f, BM_ELEM_SELECT) || BM_elem_flag_test(f, BM_ELEM_HIDDEN)) { /* Don't insert triangles tessellated from faces that are hidden or selected */ insert = false; } @@ -746,7 +750,9 @@ static void bvhtree_from_mesh_faces_setup_data( BVHTree *bvhtree_from_mesh_faces(BVHTreeFromMesh *data, DerivedMesh *dm, float epsilon, int tree_type, int axis) { BMEditMesh *em = data->em_evil; - const int bvhcache_type = em ? BVHTREE_FROM_FACES_EDITMESH : BVHTREE_FROM_FACES; + const int bvhcache_type = em ? + (data->em_evil_all ? BVHTREE_FROM_FACES_EDITMESH_ALL : BVHTREE_FROM_FACES_EDITMESH_SNAP) : + BVHTREE_FROM_FACES; BVHTree *tree; MVert *vert = NULL; MFace *face = NULL; @@ -781,7 +787,10 @@ BVHTree *bvhtree_from_mesh_faces(BVHTreeFromMesh *data, DerivedMesh *dm, float e BLI_assert(!(numFaces == 0 && dm->getNumPolys(dm) != 0)); } - tree = bvhtree_from_mesh_faces_create_tree(epsilon, tree_type, axis, em, vert, face, numFaces, NULL, -1); + tree = bvhtree_from_mesh_faces_create_tree( + epsilon, tree_type, axis, + em, (bvhcache_type == BVHTREE_FROM_FACES_EDITMESH_ALL), + vert, face, numFaces, NULL, -1); if (tree) { /* Save on cache for later use */ /* printf("BVHTree built and saved on cache\n"); */ @@ -813,7 +822,9 @@ BVHTree *bvhtree_from_mesh_faces_ex( BLI_bitmap *mask, int numFaces_active, float epsilon, int tree_type, int axis) { BVHTree *tree = bvhtree_from_mesh_faces_create_tree( - epsilon, tree_type, axis, NULL, vert, face, numFaces, + epsilon, tree_type, axis, + NULL, false, + vert, face, numFaces, mask, numFaces_active); /* Setup BVHTreeFromMesh */ @@ -832,7 +843,8 @@ BVHTree *bvhtree_from_mesh_faces_ex( static BVHTree *bvhtree_from_mesh_looptri_create_tree( float epsilon, int tree_type, int axis, - BMEditMesh *em, const MVert *vert, const MLoop *mloop, const MLoopTri *looptri, const int looptri_num, + BMEditMesh *em, const bool em_all, + const MVert *vert, const MLoop *mloop, const MLoopTri *looptri, const int looptri_num, BLI_bitmap *mask, int looptri_num_active) { BVHTree *tree = NULL; @@ -881,7 +893,10 @@ static BVHTree *bvhtree_from_mesh_looptri_create_tree( insert = insert_prev; } else if (insert) { - if (BM_elem_flag_test(f, BM_ELEM_SELECT) || BM_elem_flag_test(f, BM_ELEM_HIDDEN)) { + if (em_all) { + /* pass */ + } + else if (BM_elem_flag_test(f, BM_ELEM_SELECT) || BM_elem_flag_test(f, BM_ELEM_HIDDEN)) { /* Don't insert triangles tessellated from faces that are hidden or selected */ insert = false; } @@ -972,6 +987,9 @@ static void bvhtree_from_mesh_looptri_setup_data( if (vert_allocated) { MEM_freeN((void *)vert); } + if (loop_allocated) { + MEM_freeN((void *)mloop); + } if (looptri_allocated) { MEM_freeN((void *)looptri); } @@ -986,7 +1004,9 @@ static void bvhtree_from_mesh_looptri_setup_data( BVHTree *bvhtree_from_mesh_looptri(BVHTreeFromMesh *data, DerivedMesh *dm, float epsilon, int tree_type, int axis) { BMEditMesh *em = data->em_evil; - const int bvhcache_type = em ? BVHTREE_FROM_FACES_EDITMESH : BVHTREE_FROM_LOOPTRI; + const int bvhcache_type = em ? + (data->em_evil_all ? BVHTREE_FROM_FACES_EDITMESH_ALL : BVHTREE_FROM_FACES_EDITMESH_SNAP) : + BVHTREE_FROM_LOOPTRI; BVHTree *tree; MVert *mvert = NULL; MLoop *mloop = NULL; @@ -1041,7 +1061,8 @@ BVHTree *bvhtree_from_mesh_looptri(BVHTreeFromMesh *data, DerivedMesh *dm, float } tree = bvhtree_from_mesh_looptri_create_tree( - epsilon, tree_type, axis, em, + epsilon, tree_type, axis, + em, (bvhcache_type == BVHTREE_FROM_FACES_EDITMESH_ALL), mvert, mloop, looptri, looptri_num, NULL, -1); if (tree) { /* Save on cache for later use */ @@ -1074,7 +1095,9 @@ BVHTree *bvhtree_from_mesh_looptri_ex( float epsilon, int tree_type, int axis) { BVHTree *tree = bvhtree_from_mesh_looptri_create_tree( - epsilon, tree_type, axis, NULL, vert, mloop, looptri, looptri_num, + epsilon, tree_type, axis, + NULL, false, + vert, mloop, looptri, looptri_num, mask, looptri_num_active); /* Setup BVHTreeFromMesh */ diff --git a/source/blender/blenkernel/intern/camera.c b/source/blender/blenkernel/intern/camera.c index 07ce96461e5..2d1f8ef664d 100644 --- a/source/blender/blenkernel/intern/camera.c +++ b/source/blender/blenkernel/intern/camera.c @@ -57,11 +57,9 @@ /****************************** Camera Datablock *****************************/ -void *BKE_camera_add(Main *bmain, const char *name) +void BKE_camera_init(Camera *cam) { - Camera *cam; - - cam = BKE_libblock_alloc(bmain, ID_CA, name); + BLI_assert(MEMCMP_STRUCT_OFS_IS_ZERO(cam, id)); cam->lens = 35.0f; cam->sensor_x = DEFAULT_SENSOR_WIDTH; @@ -78,6 +76,15 @@ void *BKE_camera_add(Main *bmain, const char *name) /* stereoscopy 3d */ cam->stereo.interocular_distance = 0.065f; cam->stereo.convergence_distance = 30.f * 0.065f; +} + +void *BKE_camera_add(Main *bmain, const char *name) +{ + Camera *cam; + + cam = BKE_libblock_alloc(bmain, ID_CA, name); + + BKE_camera_init(cam); return cam; } diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c index f94e4ec8187..54ee5c373c6 100644 --- a/source/blender/blenkernel/intern/cdderivedmesh.c +++ b/source/blender/blenkernel/intern/cdderivedmesh.c @@ -967,7 +967,7 @@ static void cdDM_drawMappedFacesGLSL( int *mat_orig_to_new; int tot_active_mat; GPUBuffer *buffer = NULL; - char *varray; + unsigned char *varray; size_t max_element_size = 0; int tot_loops = 0; @@ -1072,17 +1072,15 @@ static void cdDM_drawMappedFacesGLSL( if (matconv[i].attribs.mcol[b].array) { const MLoopCol *mloopcol = matconv[i].attribs.mcol[b].array; for (j = 0; j < mpoly->totloop; j++) - copy_v4_v4_char((char *)&varray[offset + j * max_element_size], &mloopcol[mpoly->loopstart + j].r); + copy_v4_v4_uchar(&varray[offset + j * max_element_size], &mloopcol[mpoly->loopstart + j].r); offset += sizeof(unsigned char) * 4; } } if (matconv[i].attribs.tottang && matconv[i].attribs.tang.array) { - if (matconv[i].attribs.tface[b].array) { - const float (*looptang)[4] = (const float (*)[4])matconv[i].attribs.tang.array; - for (j = 0; j < mpoly->totloop; j++) - copy_v4_v4((float *)&varray[offset + j * max_element_size], looptang[mpoly->loopstart + j]); - offset += sizeof(float) * 4; - } + const float (*looptang)[4] = (const float (*)[4])matconv[i].attribs.tang.array; + for (j = 0; j < mpoly->totloop; j++) + copy_v4_v4((float *)&varray[offset + j * max_element_size], looptang[mpoly->loopstart + j]); + offset += sizeof(float) * 4; } } @@ -1484,7 +1482,7 @@ static void cdDM_buffer_copy_mcol( for (i = 0; i < totpoly; i++, mpoly++) { for (j = 0; j < mpoly->totloop; j++) { - copy_v3_v3_char((char *)&varray[start], &mloopcol[mpoly->loopstart + j].r); + copy_v3_v3_uchar(&varray[start], &mloopcol[mpoly->loopstart + j].r); start += 3; } } @@ -2609,7 +2607,7 @@ void CDDM_calc_normals_mapping_ex(DerivedMesh *dm, const bool only_face_normals) /* calculate face normals */ BKE_mesh_calc_normals_poly( - cddm->mvert, dm->numVertData, CDDM_get_loops(dm), CDDM_get_polys(dm), + cddm->mvert, NULL, dm->numVertData, CDDM_get_loops(dm), CDDM_get_polys(dm), dm->numLoopData, dm->numPolyData, face_nors, only_face_normals); @@ -2659,7 +2657,7 @@ void CDDM_calc_normals(DerivedMesh *dm) /* we don't want to overwrite any referenced layers */ cddm->mvert = CustomData_duplicate_referenced_layer(&dm->vertData, CD_MVERT, dm->numVertData); - BKE_mesh_calc_normals_poly(cddm->mvert, dm->numVertData, CDDM_get_loops(dm), CDDM_get_polys(dm), + BKE_mesh_calc_normals_poly(cddm->mvert, NULL, dm->numVertData, CDDM_get_loops(dm), CDDM_get_polys(dm), dm->numLoopData, dm->numPolyData, NULL, false); cddm->dm.dirty &= ~DM_DIRTY_NORMALS; @@ -2708,7 +2706,7 @@ void CDDM_calc_loop_normals_spacearr( if (!pnors) { pnors = CustomData_add_layer(pdata, CD_NORMAL, CD_CALLOC, NULL, numPolys); } - BKE_mesh_calc_normals_poly(mverts, numVerts, mloops, mpolys, numLoops, numPolys, pnors, + BKE_mesh_calc_normals_poly(mverts, NULL, numVerts, mloops, mpolys, numLoops, numPolys, pnors, (dm->dirty & DM_DIRTY_NORMALS) ? false : true); dm->dirty &= ~DM_DIRTY_NORMALS; diff --git a/source/blender/blenkernel/intern/constraint.c b/source/blender/blenkernel/intern/constraint.c index ed2e609ae53..03406c6c2a0 100644 --- a/source/blender/blenkernel/intern/constraint.c +++ b/source/blender/blenkernel/intern/constraint.c @@ -4882,11 +4882,12 @@ void BKE_constraints_solve(ListBase *conlist, bConstraintOb *cob, float ctime) * since some constraints may not convert the solution back to the input space before blending * but all are guaranteed to end up in good "worldspace" result */ - /* Note: all kind of stuff here before (caused trouble), much easier to just interpolate, or did I miss something? -jahka (r.32105) */ + /* Note: all kind of stuff here before (caused trouble), much easier to just interpolate, + * or did I miss something? -jahka (r.32105) */ if (enf < 1.0f) { float solution[4][4]; copy_m4_m4(solution, cob->matrix); - blend_m4_m4m4(cob->matrix, oldmat, solution, enf); + interp_m4_m4m4(cob->matrix, oldmat, solution, enf); } } } diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c index 8d7d62be7e4..3e0bdbe31af 100644 --- a/source/blender/blenkernel/intern/curve.c +++ b/source/blender/blenkernel/intern/curve.c @@ -161,15 +161,14 @@ void BKE_curve_free(Curve *cu) MEM_freeN(cu->tb); } -Curve *BKE_curve_add(Main *bmain, const char *name, int type) +void BKE_curve_init(Curve *cu) { - Curve *cu; + /* BLI_assert(MEMCMP_STRUCT_OFS_IS_ZERO(cu, id)); */ /* cu->type is already initialized... */ - cu = BKE_libblock_alloc(bmain, ID_CU, name); copy_v3_fl(cu->size, 1.0f); cu->flag = CU_FRONT | CU_BACK | CU_DEFORM_BOUNDS_OFF | CU_PATH_RADIUS; cu->pathlen = 100; - cu->resolu = cu->resolv = (type == OB_SURF) ? 4 : 12; + cu->resolu = cu->resolv = (cu->type == OB_SURF) ? 4 : 12; cu->width = 1.0; cu->wordspace = 1.0; cu->spacing = cu->linedist = 1.0; @@ -179,7 +178,6 @@ Curve *BKE_curve_add(Main *bmain, const char *name, int type) cu->smallcaps_scale = 0.75f; /* XXX: this one seems to be the best one in most cases, at least for curve deform... */ cu->twist_mode = CU_TWIST_MINIMUM; - cu->type = type; cu->bevfac1 = 0.0f; cu->bevfac2 = 1.0f; cu->bevfac1_mapping = CU_BEVFAC_MAP_RESOLU; @@ -187,7 +185,7 @@ Curve *BKE_curve_add(Main *bmain, const char *name, int type) cu->bb = BKE_boundbox_alloc_unit(); - if (type == OB_FONT) { + if (cu->type == OB_FONT) { cu->vfont = cu->vfontb = cu->vfonti = cu->vfontbi = BKE_vfont_builtin_get(); cu->vfont->id.us += 4; cu->str = MEM_mallocN(12, "str"); @@ -198,6 +196,16 @@ Curve *BKE_curve_add(Main *bmain, const char *name, int type) cu->tb = MEM_callocN(MAXTEXTBOX * sizeof(TextBox), "textbox"); cu->tb[0].w = cu->tb[0].h = 0.0; } +} + +Curve *BKE_curve_add(Main *bmain, const char *name, int type) +{ + Curve *cu; + + cu = BKE_libblock_alloc(bmain, ID_CU, name); + cu->type = type; + + BKE_curve_init(cu); return cu; } diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c index 0d43fc7a8d9..1525087e9af 100644 --- a/source/blender/blenkernel/intern/customdata.c +++ b/source/blender/blenkernel/intern/customdata.c @@ -61,6 +61,8 @@ #include "BKE_mesh_remap.h" #include "BKE_multires.h" +#include "data_transfer_intern.h" + #include "bmesh.h" #include <math.h> @@ -305,13 +307,16 @@ static void layerInterp_normal( const void **sources, const float *weights, const float *UNUSED(sub_weights), int count, void *dest) { + /* Note: This is linear interpolation, which is not optimal for vectors. + * Unfortunately, spherical interpolation of more than two values is hairy, so for now it will do... */ float no[3] = {0.0f}; while (count--) { madd_v3_v3fl(no, (const float *)sources[count], weights[count]); } - copy_v3_v3((float *)dest, no); + /* Weighted sum of normalized vectors will **not** be normalized, even if weights are. */ + normalize_v3_v3((float *)dest, no); } static void layerCopyValue_normal(const void *source, void *dest, const int mixmode, const float mixfactor) @@ -926,6 +931,7 @@ static void layerInterp_mloopuv( } /* delay writing to the destination incase dest is in sources */ + ((MLoopUV *)dest)->flag = ((MLoopUV *)sources)->flag; copy_v2_v2(((MLoopUV *)dest)->uv, uv); } @@ -3924,6 +3930,38 @@ static void customdata_data_transfer_interp_generic( MEM_freeN(tmp_dst); } +/* Normals are special, we need to take care of source & destination spaces... */ +void customdata_data_transfer_interp_normal_normals( + const CustomDataTransferLayerMap *laymap, void *data_dst, + const void **sources, const float *weights, const int count, + const float mix_factor) +{ + const int data_type = laymap->data_type; + const int mix_mode = laymap->mix_mode; + + SpaceTransform *space_transform = laymap->interp_data; + + const LayerTypeInfo *type_info = layerType_getInfo(data_type); + cd_interp interp_cd = type_info->interp; + + float tmp_dst[3]; + + BLI_assert(data_type == CD_NORMAL); + + if (!sources) { + /* Not supported here, abort. */ + return; + } + + interp_cd(sources, weights, NULL, count, tmp_dst); + if (space_transform) { + /* tmp_dst is in source space so far, bring it back in destination space. */ + BLI_space_transform_invert_normal(space_transform, tmp_dst); + } + + CustomData_data_mix_value(data_type, tmp_dst, data_dst, mix_mode, mix_factor); +} + void CustomData_data_transfer(const MeshPairRemap *me_remap, const CustomDataTransferLayerMap *laymap) { MeshPairRemapItem *mapit = me_remap->items; diff --git a/source/blender/blenkernel/intern/data_transfer.c b/source/blender/blenkernel/intern/data_transfer.c index 53b6f4a1019..43d23e92901 100644 --- a/source/blender/blenkernel/intern/data_transfer.c +++ b/source/blender/blenkernel/intern/data_transfer.c @@ -291,7 +291,7 @@ static void data_transfer_dtdata_type_preprocess( poly_nors_dst = CustomData_add_layer(pdata_dst, CD_NORMAL, CD_CALLOC, NULL, num_polys_dst); CustomData_set_layer_flag(pdata_dst, CD_NORMAL, CD_FLAG_TEMPORARY); } - BKE_mesh_calc_normals_poly(verts_dst, num_verts_dst, loops_dst, polys_dst, + BKE_mesh_calc_normals_poly(verts_dst, NULL, num_verts_dst, loops_dst, polys_dst, num_loops_dst, num_polys_dst, poly_nors_dst, true); } /* Cache loop nors into a temp CDLayer. */ @@ -428,7 +428,7 @@ void data_transfer_layersmapping_add_item( ListBase *r_map, const int cddata_type, const int mix_mode, const float mix_factor, const float *mix_weights, const void *data_src, void *data_dst, const int data_src_n, const int data_dst_n, const size_t elem_size, const size_t data_size, const size_t data_offset, const uint64_t data_flag, - cd_datatransfer_interp interp) + cd_datatransfer_interp interp, void *interp_data) { CustomDataTransferLayerMap *item = MEM_mallocN(sizeof(*item), __func__); @@ -450,17 +450,18 @@ void data_transfer_layersmapping_add_item( item->data_flag = data_flag; item->interp = interp; + item->interp_data = interp_data; BLI_addtail(r_map, item); } static void data_transfer_layersmapping_add_item_cd( ListBase *r_map, const int cddata_type, const int mix_mode, const float mix_factor, const float *mix_weights, - void *data_src, void *data_dst) + void *data_src, void *data_dst, cd_datatransfer_interp interp, void *interp_data) { data_transfer_layersmapping_add_item( r_map, cddata_type, mix_mode, mix_factor, mix_weights, data_src, data_dst, - 0, 0, 0, 0, 0, 0, NULL); + 0, 0, 0, 0, 0, 0, interp, interp_data); } /* Note: All those layer mapping handlers return false *only* if they were given invalid parameters. @@ -473,7 +474,8 @@ static bool data_transfer_layersmapping_cdlayers_multisrc_to_dst( ListBase *r_map, const int cddata_type, const int mix_mode, const float mix_factor, const float *mix_weights, const int num_elem_dst, const bool use_create, const bool use_delete, CustomData *cd_src, CustomData *cd_dst, const bool use_dupref_dst, - const int tolayers, bool *use_layers_src, const int num_layers_src) + const int tolayers, bool *use_layers_src, const int num_layers_src, + cd_datatransfer_interp interp, void *interp_data) { void *data_src, *data_dst = NULL; int idx_src = num_layers_src; @@ -527,7 +529,7 @@ static bool data_transfer_layersmapping_cdlayers_multisrc_to_dst( data_dst = CustomData_get_layer_n(cd_dst, cddata_type, idx_src); } data_transfer_layersmapping_add_item_cd(r_map, cddata_type, mix_mode, mix_factor, mix_weights, - data_src, data_dst); + data_src, data_dst, interp, interp_data); } } break; @@ -571,7 +573,7 @@ static bool data_transfer_layersmapping_cdlayers_multisrc_to_dst( data_dst = CustomData_get_layer_n(cd_dst, cddata_type, idx_dst); } data_transfer_layersmapping_add_item_cd(r_map, cddata_type, mix_mode, mix_factor, mix_weights, - data_src, data_dst); + data_src, data_dst, interp, interp_data); } } @@ -599,7 +601,8 @@ static bool data_transfer_layersmapping_cdlayers( ListBase *r_map, const int cddata_type, const int mix_mode, const float mix_factor, const float *mix_weights, const int num_elem_dst, const bool use_create, const bool use_delete, CustomData *cd_src, CustomData *cd_dst, const bool use_dupref_dst, - const int fromlayers, const int tolayers) + const int fromlayers, const int tolayers, + cd_datatransfer_interp interp, void *interp_data) { int idx_src, idx_dst; void *data_src, *data_dst = NULL; @@ -626,7 +629,7 @@ static bool data_transfer_layersmapping_cdlayers( if (r_map) { data_transfer_layersmapping_add_item_cd(r_map, cddata_type, mix_mode, mix_factor, mix_weights, - data_src, data_dst); + data_src, data_dst, interp, interp_data); } } else if (fromlayers == DT_LAYERS_ACTIVE_SRC || fromlayers >= 0) { @@ -719,7 +722,7 @@ static bool data_transfer_layersmapping_cdlayers( if (r_map) { data_transfer_layersmapping_add_item_cd( - r_map, cddata_type, mix_mode, mix_factor, mix_weights, data_src, data_dst); + r_map, cddata_type, mix_mode, mix_factor, mix_weights, data_src, data_dst, interp, interp_data); } } else if (fromlayers == DT_LAYERS_ALL_SRC) { @@ -734,7 +737,8 @@ static bool data_transfer_layersmapping_cdlayers( ret = data_transfer_layersmapping_cdlayers_multisrc_to_dst( r_map, cddata_type, mix_mode, mix_factor, mix_weights, num_elem_dst, use_create, use_delete, cd_src, cd_dst, use_dupref_dst, - tolayers, use_layers_src, num_src); + tolayers, use_layers_src, num_src, + interp, interp_data); if (use_layers_src) { MEM_freeN(use_layers_src); @@ -751,10 +755,14 @@ static bool data_transfer_layersmapping_cdlayers( static bool data_transfer_layersmapping_generate( ListBase *r_map, Object *ob_src, Object *ob_dst, DerivedMesh *dm_src, DerivedMesh *dm_dst, Mesh *me_dst, const int elem_type, int cddata_type, int mix_mode, float mix_factor, const float *mix_weights, - const int num_elem_dst, const bool use_create, const bool use_delete, const int fromlayers, const int tolayers) + const int num_elem_dst, const bool use_create, const bool use_delete, const int fromlayers, const int tolayers, + SpaceTransform *space_transform) { CustomData *cd_src, *cd_dst; + cd_datatransfer_interp interp = NULL; + void *interp_data = NULL; + if (elem_type == ME_VERT) { if (!(cddata_type & CD_FAKE)) { cd_src = dm_src->getVertDataLayout(dm_src); @@ -763,7 +771,8 @@ static bool data_transfer_layersmapping_generate( if (!data_transfer_layersmapping_cdlayers(r_map, cddata_type, mix_mode, mix_factor, mix_weights, num_elem_dst, use_create, use_delete, cd_src, cd_dst, dm_dst != NULL, - fromlayers, tolayers)) + fromlayers, tolayers, + interp, interp_data)) { /* We handle specific source selection cases here. */ return false; @@ -795,7 +804,7 @@ static bool data_transfer_layersmapping_generate( dm_src->getNumVerts(dm_src), dm_dst ? dm_dst->getNumVerts(dm_dst) : me_dst->totvert, elem_size, data_size, data_offset, data_flag, - data_transfer_interp_char); + data_transfer_interp_char, interp_data); } return true; } @@ -827,7 +836,8 @@ static bool data_transfer_layersmapping_generate( if (!data_transfer_layersmapping_cdlayers(r_map, cddata_type, mix_mode, mix_factor, mix_weights, num_elem_dst, use_create, use_delete, cd_src, cd_dst, dm_dst != NULL, - fromlayers, tolayers)) + fromlayers, tolayers, + interp, interp_data)) { /* We handle specific source selection cases here. */ return false; @@ -859,7 +869,7 @@ static bool data_transfer_layersmapping_generate( dm_src->getNumEdges(dm_src), dm_dst ? dm_dst->getNumEdges(dm_dst) : me_dst->totedge, elem_size, data_size, data_offset, data_flag, - data_transfer_interp_char); + data_transfer_interp_char, interp_data); } return true; } @@ -888,7 +898,7 @@ static bool data_transfer_layersmapping_generate( dm_src->getNumEdges(dm_src), dm_dst ? dm_dst->getNumEdges(dm_dst) : me_dst->totedge, elem_size, data_size, data_offset, data_flag, - data_transfer_interp_char); + data_transfer_interp_char, interp_data); } return true; } @@ -904,7 +914,7 @@ static bool data_transfer_layersmapping_generate( dm_dst ? dm_dst->getEdgeArray(dm_dst) : me_dst->medge, dm_src->getNumEdges(dm_src), dm_dst ? dm_dst->getNumEdges(dm_dst) : me_dst->totedge, - elem_size, data_size, data_offset, data_flag, NULL); + elem_size, data_size, data_offset, data_flag, NULL, interp_data); return true; } else { @@ -918,6 +928,8 @@ static bool data_transfer_layersmapping_generate( else if (cddata_type == CD_FAKE_LNOR) { /* Preprocess should have generated it, Postprocess will convert it back to CD_CUSTOMLOOPNORMAL. */ cddata_type = CD_NORMAL; + interp_data = space_transform; + interp = customdata_data_transfer_interp_normal_normals; } if (!(cddata_type & CD_FAKE)) { @@ -927,7 +939,8 @@ static bool data_transfer_layersmapping_generate( if (!data_transfer_layersmapping_cdlayers( r_map, cddata_type, mix_mode, mix_factor, mix_weights, num_elem_dst, use_create, use_delete, cd_src, cd_dst, dm_dst != NULL, - fromlayers, tolayers)) + fromlayers, tolayers, + interp, interp_data)) { /* We handle specific source selection cases here. */ return false; @@ -950,7 +963,8 @@ static bool data_transfer_layersmapping_generate( if (!data_transfer_layersmapping_cdlayers( r_map, cddata_type, mix_mode, mix_factor, mix_weights, num_elem_dst, use_create, use_delete, cd_src, cd_dst, dm_dst != NULL, - fromlayers, tolayers)) + fromlayers, tolayers, + interp, interp_data)) { /* We handle specific source selection cases here. */ return false; @@ -969,7 +983,7 @@ static bool data_transfer_layersmapping_generate( dm_dst ? dm_dst->getPolyArray(dm_dst) : me_dst->mpoly, dm_src->getNumPolys(dm_src), dm_dst ? dm_dst->getNumPolys(dm_dst) : me_dst->totpoly, - elem_size, data_size, data_offset, data_flag, NULL); + elem_size, data_size, data_offset, data_flag, NULL, interp_data); return true; } else { @@ -1035,28 +1049,28 @@ void BKE_object_data_transfer_layout( data_transfer_layersmapping_generate( NULL, ob_src, ob_dst, dm_src, NULL, me_dst, ME_VERT, cddata_type, 0, 0.0f, NULL, - num_elem_dst, use_create, use_delete, fromlayers, tolayers); + num_elem_dst, use_create, use_delete, fromlayers, tolayers, NULL); } if (DT_DATATYPE_IS_EDGE(dtdata_type)) { const int num_elem_dst = me_dst->totedge; data_transfer_layersmapping_generate( NULL, ob_src, ob_dst, dm_src, NULL, me_dst, ME_EDGE, cddata_type, 0, 0.0f, NULL, - num_elem_dst, use_create, use_delete, fromlayers, tolayers); + num_elem_dst, use_create, use_delete, fromlayers, tolayers, NULL); } if (DT_DATATYPE_IS_LOOP(dtdata_type)) { const int num_elem_dst = me_dst->totloop; data_transfer_layersmapping_generate( NULL, ob_src, ob_dst, dm_src, NULL, me_dst, ME_LOOP, cddata_type, 0, 0.0f, NULL, - num_elem_dst, use_create, use_delete, fromlayers, tolayers); + num_elem_dst, use_create, use_delete, fromlayers, tolayers, NULL); } if (DT_DATATYPE_IS_POLY(dtdata_type)) { const int num_elem_dst = me_dst->totpoly; data_transfer_layersmapping_generate( NULL, ob_src, ob_dst, dm_src, NULL, me_dst, ME_POLY, cddata_type, 0, 0.0f, NULL, - num_elem_dst, use_create, use_delete, fromlayers, tolayers); + num_elem_dst, use_create, use_delete, fromlayers, tolayers, NULL); } } } @@ -1198,7 +1212,7 @@ bool BKE_object_data_transfer_dm( if (data_transfer_layersmapping_generate( &lay_map, ob_src, ob_dst, dm_src, dm_dst, me_dst, ME_VERT, cddata_type, mix_mode, mix_factor, weights[VDATA], - num_verts_dst, use_create, use_delete, fromlayers, tolayers)) + num_verts_dst, use_create, use_delete, fromlayers, tolayers, space_transform)) { CustomDataTransferLayerMap *lay_mapit; @@ -1249,7 +1263,7 @@ bool BKE_object_data_transfer_dm( if (data_transfer_layersmapping_generate( &lay_map, ob_src, ob_dst, dm_src, dm_dst, me_dst, ME_EDGE, cddata_type, mix_mode, mix_factor, weights[EDATA], - num_edges_dst, use_create, use_delete, fromlayers, tolayers)) + num_edges_dst, use_create, use_delete, fromlayers, tolayers, space_transform)) { CustomDataTransferLayerMap *lay_mapit; @@ -1312,7 +1326,7 @@ bool BKE_object_data_transfer_dm( if (data_transfer_layersmapping_generate( &lay_map, ob_src, ob_dst, dm_src, dm_dst, me_dst, ME_LOOP, cddata_type, mix_mode, mix_factor, weights[LDATA], - num_loops_dst, use_create, use_delete, fromlayers, tolayers)) + num_loops_dst, use_create, use_delete, fromlayers, tolayers, space_transform)) { CustomDataTransferLayerMap *lay_mapit; @@ -1367,7 +1381,7 @@ bool BKE_object_data_transfer_dm( if (data_transfer_layersmapping_generate( &lay_map, ob_src, ob_dst, dm_src, dm_dst, me_dst, ME_POLY, cddata_type, mix_mode, mix_factor, weights[PDATA], - num_polys_dst, use_create, use_delete, fromlayers, tolayers)) + num_polys_dst, use_create, use_delete, fromlayers, tolayers, space_transform)) { CustomDataTransferLayerMap *lay_mapit; diff --git a/source/blender/blenkernel/intern/data_transfer_intern.h b/source/blender/blenkernel/intern/data_transfer_intern.h index 501b749b464..352eedc6ec2 100644 --- a/source/blender/blenkernel/intern/data_transfer_intern.h +++ b/source/blender/blenkernel/intern/data_transfer_intern.h @@ -45,7 +45,7 @@ void data_transfer_layersmapping_add_item( const float mix_factor, const float *mix_weights, const void *data_src, void *data_dst, const int data_src_n, const int data_dst_n, const size_t elem_size, const size_t data_size, const size_t data_offset, const uint64_t data_flag, - cd_datatransfer_interp interp); + cd_datatransfer_interp interp, void *interp_data); /* Type-specific. */ @@ -55,4 +55,10 @@ bool data_transfer_layersmapping_vgroups( struct Object *ob_src, struct Object *ob_dst, struct CustomData *cd_src, struct CustomData *cd_dst, const bool use_dupref_dst, const int fromlayers, const int tolayers); +/* Defined in customdata.c */ +void customdata_data_transfer_interp_normal_normals( + const CustomDataTransferLayerMap *laymap, void *data_dst, + const void **sources, const float *weights, const int count, + const float mix_factor); + #endif /* __DATA_TRANSFER_INTERN_H__ */ diff --git a/source/blender/blenkernel/intern/deform.c b/source/blender/blenkernel/intern/deform.c index 6670c3359d7..f904369ae97 100644 --- a/source/blender/blenkernel/intern/deform.c +++ b/source/blender/blenkernel/intern/deform.c @@ -1163,7 +1163,7 @@ static bool data_transfer_layersmapping_vgroups_multisrc_to_dst( } data_transfer_layersmapping_add_item(r_map, CD_FAKE_MDEFORMVERT, mix_mode, mix_factor, mix_weights, data_src, data_dst, idx_src, idx_src, - elem_size, 0, 0, 0, vgroups_datatransfer_interp); + elem_size, 0, 0, 0, vgroups_datatransfer_interp, NULL); } } break; @@ -1211,7 +1211,7 @@ static bool data_transfer_layersmapping_vgroups_multisrc_to_dst( data_transfer_layersmapping_add_item( r_map, CD_FAKE_MDEFORMVERT, mix_mode, mix_factor, mix_weights, data_src, data_dst, idx_src, idx_dst, - elem_size, 0, 0, 0, vgroups_datatransfer_interp); + elem_size, 0, 0, 0, vgroups_datatransfer_interp, NULL); } } break; @@ -1317,7 +1317,7 @@ bool data_transfer_layersmapping_vgroups( data_transfer_layersmapping_add_item(r_map, CD_FAKE_MDEFORMVERT, mix_mode, mix_factor, mix_weights, data_src, data_dst, idx_src, idx_dst, - elem_size, 0, 0, 0, vgroups_datatransfer_interp); + elem_size, 0, 0, 0, vgroups_datatransfer_interp, NULL); } } else { diff --git a/source/blender/blenkernel/intern/depsgraph.c b/source/blender/blenkernel/intern/depsgraph.c index 4373e797dfe..42b6b311dff 100644 --- a/source/blender/blenkernel/intern/depsgraph.c +++ b/source/blender/blenkernel/intern/depsgraph.c @@ -513,7 +513,6 @@ static void build_dag_object(DagForest *dag, DagNode *scenenode, Main *bmain, Sc } /* also build a custom data mask for dependencies that need certain layers */ - node->customdata_mask = 0; if (ob->type == OB_ARMATURE) { if (ob->pose) { @@ -1447,7 +1446,7 @@ static void dag_scene_free(Scene *sce) } } -/* Chech whether object data needs to be evaluated before it +/* Check whether object data needs to be evaluated before it * might be used by others. * * Means that mesh object needs to have proper derivedFinal, @@ -1659,7 +1658,7 @@ static void dag_scene_build(Main *bmain, Scene *sce) /* temporal...? */ sce->recalc |= SCE_PRV_CHANGED; /* test for 3d preview */ - /* Make sure that new dependencies which came from invisble layers + /* Make sure that new dependencies which came from invisible layers * are tagged for update (if they're needed for objects which were * tagged for update). */ @@ -2521,7 +2520,8 @@ void DAG_on_visible_update(Main *bmain, const bool do_time) } } -static void dag_id_flush_update__isDependentTexture(void *userData, Object *UNUSED(ob), ID **idpoin) +static void dag_id_flush_update__isDependentTexture( + void *userData, Object *UNUSED(ob), ID **idpoin, int UNUSED(cd_flag)) { struct { ID *id; bool is_dependent; } *data = userData; diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c index c83050627e9..a2d555d0918 100644 --- a/source/blender/blenkernel/intern/displist.c +++ b/source/blender/blenkernel/intern/displist.c @@ -1521,7 +1521,7 @@ static void do_makeDispListCurveTypes(Scene *scene, Object *ob, ListBase *dispba BKE_curve_bevelList_free(&ob->curve_cache->bev); - /* We only re-evlauate path if evaluation is not happening for orco. + /* We only re-evaluate path if evaluation is not happening for orco. * If the calculation happens for orco, we should never free data which * was needed before and only not needed for orco calculation. */ diff --git a/source/blender/blenkernel/intern/editderivedmesh.c b/source/blender/blenkernel/intern/editderivedmesh.c index 840935c090b..88ae279050c 100644 --- a/source/blender/blenkernel/intern/editderivedmesh.c +++ b/source/blender/blenkernel/intern/editderivedmesh.c @@ -1248,7 +1248,7 @@ static void emdm_pass_attrib_vertex_glsl(const DMVertexAttribs *attribs, const B GLubyte col[4]; if (attribs->mcol[i].em_offset != -1) { const MLoopCol *cp = BM_ELEM_CD_GET_VOID_P(loop, attribs->mcol[i].em_offset); - copy_v4_v4_char((char *)col, &cp->r); + copy_v4_v4_uchar(col, &cp->r); } else { col[0] = 0; col[1] = 0; col[2] = 0; col[3] = 0; @@ -2170,8 +2170,8 @@ static void statvis_calc_overhang( rgb_float_to_uchar(r_face_colors[index], fcol); } else { - unsigned char *fallback = is_max ? col_fallback_max : col_fallback; - copy_v4_v4_char((char *)r_face_colors[index], (const char *)fallback); + const unsigned char *fallback = is_max ? col_fallback_max : col_fallback; + copy_v4_v4_uchar(r_face_colors[index], fallback); } } } @@ -2210,7 +2210,7 @@ static void statvis_calc_thickness( struct BMLoop *(*looptris)[3] = em->looptris; /* fallback */ - const char col_fallback[4] = {64, 64, 64, 255}; + const unsigned char col_fallback[4] = {64, 64, 64, 255}; struct BMBVHTree *bmtree; @@ -2305,7 +2305,7 @@ static void statvis_calc_thickness( rgb_float_to_uchar(r_face_colors[i], fcol); } else { - copy_v4_v4_char((char *)r_face_colors[i], (const char *)col_fallback); + copy_v4_v4_uchar(r_face_colors[i], col_fallback); } } } @@ -2357,7 +2357,7 @@ static void statvis_calc_intersect( index = BM_elem_index_get(f_hit); - copy_v3_v3_char((char *)r_face_colors[index], (const char *)col); + copy_v3_v3_uchar(r_face_colors[index], col); } } MEM_freeN(overlap); @@ -2382,7 +2382,7 @@ static void statvis_calc_distort( const float minmax_irange = 1.0f / (max - min); /* fallback */ - const char col_fallback[4] = {64, 64, 64, 255}; + const unsigned char col_fallback[4] = {64, 64, 64, 255}; /* now convert into global space */ BM_ITER_MESH_INDEX (f, &iter, bm, BM_FACES_OF_MESH, index) { @@ -2431,7 +2431,7 @@ static void statvis_calc_distort( rgb_float_to_uchar(r_face_colors[index], fcol); } else { - copy_v4_v4_char((char *)r_face_colors[index], (const char *)col_fallback); + copy_v4_v4_uchar(r_face_colors[index], col_fallback); } } } @@ -2453,7 +2453,7 @@ static void statvis_calc_sharp( int i; /* fallback */ - const char col_fallback[4] = {64, 64, 64, 255}; + const unsigned char col_fallback[4] = {64, 64, 64, 255}; (void)vertexCos; /* TODO */ @@ -2481,7 +2481,7 @@ static void statvis_calc_sharp( rgb_float_to_uchar(r_vert_colors[i], fcol); } else { - copy_v4_v4_char((char *)r_vert_colors[i], (const char *)col_fallback); + copy_v4_v4_uchar(r_vert_colors[i], col_fallback); } } } diff --git a/source/blender/blenkernel/intern/fmodifier.c b/source/blender/blenkernel/intern/fmodifier.c index 2305ae89abd..2c301c04100 100644 --- a/source/blender/blenkernel/intern/fmodifier.c +++ b/source/blender/blenkernel/intern/fmodifier.c @@ -103,8 +103,8 @@ static FModifierTypeInfo FMI_MODNAME = { /* Generators available: * 1) simple polynomial generator: - * - Exanded form - (y = C[0]*(x^(n)) + C[1]*(x^(n-1)) + ... + C[n]) - * - Factorized form - (y = (C[0][0]*x + C[0][1]) * (C[1][0]*x + C[1][1]) * ... * (C[n][0]*x + C[n][1])) + * - Expanded form - (y = C[0]*(x^(n)) + C[1]*(x^(n-1)) + ... + C[n]) + * - Factorized form - (y = (C[0][0]*x + C[0][1]) * (C[1][0]*x + C[1][1]) * ... * (C[n][0]*x + C[n][1])) */ static void fcm_generator_free(FModifier *fcm) @@ -849,7 +849,7 @@ static FModifierTypeInfo FMI_FILTER = { NULL, /* copy data */ NULL, /* new data */ NULL /*fcm_filter_verify*/, /* verify */ - NULL, /* evlauate time */ + NULL, /* evaluate time */ fcm_filter_evaluate, /* evaluate */ NULL, /* evaluate time with storage */ NULL /* evaluate with storage */ diff --git a/source/blender/blenkernel/intern/font.c b/source/blender/blenkernel/intern/font.c index 23261b63486..b12e16d9502 100644 --- a/source/blender/blenkernel/intern/font.c +++ b/source/blender/blenkernel/intern/font.c @@ -203,7 +203,27 @@ static VFontData *vfont_get_data(Main *bmain, VFont *vfont) return vfont->data; } -VFont *BKE_vfont_load(Main *bmain, const char *name) +/* Bad naming actually in this case... */ +void BKE_vfont_init(VFont *vfont) +{ + PackedFile *pf = get_builtin_packedfile(); + + if (pf) { + VFontData *vfd; + + vfd = BLI_vfontdata_from_freetypefont(pf); + if (vfd) { + vfont->data = vfd; + + BLI_strncpy(vfont->name, FO_BUILTIN_NAME, sizeof(vfont->name)); + } + + /* Free the packed file */ + freePackedFile(pf); + } +} + +VFont *BKE_vfont_load(Main *bmain, const char *filepath) { char filename[FILE_MAXFILE]; VFont *vfont = NULL; @@ -211,16 +231,16 @@ VFont *BKE_vfont_load(Main *bmain, const char *name) PackedFile *temp_pf = NULL; bool is_builtin; - if (STREQ(name, FO_BUILTIN_NAME)) { - BLI_strncpy(filename, name, sizeof(filename)); + if (STREQ(filepath, FO_BUILTIN_NAME)) { + BLI_strncpy(filename, filepath, sizeof(filename)); pf = get_builtin_packedfile(); is_builtin = true; } else { - BLI_split_file_part(name, filename, sizeof(filename)); - pf = newPackedFile(NULL, name, bmain->name); - temp_pf = newPackedFile(NULL, name, bmain->name); + BLI_split_file_part(filepath, filename, sizeof(filename)); + pf = newPackedFile(NULL, filepath, bmain->name); + temp_pf = newPackedFile(NULL, filepath, bmain->name); is_builtin = false; } @@ -237,7 +257,7 @@ VFont *BKE_vfont_load(Main *bmain, const char *name) if (vfd->name[0] != '\0') { BLI_strncpy(vfont->id.name + 2, vfd->name, sizeof(vfont->id.name) - 2); } - BLI_strncpy(vfont->name, name, sizeof(vfont->name)); + BLI_strncpy(vfont->name, filepath, sizeof(vfont->name)); /* if autopack is on store the packedfile in de font structure */ if (!is_builtin && (G.fileflags & G_AUTOPACK)) { @@ -259,6 +279,37 @@ VFont *BKE_vfont_load(Main *bmain, const char *name) return vfont; } +VFont *BKE_vfont_load_exists_ex(struct Main *bmain, const char *filepath, bool *r_exists) +{ + VFont *vfont; + char str[FILE_MAX], strtest[FILE_MAX]; + + BLI_strncpy(str, filepath, sizeof(str)); + BLI_path_abs(str, bmain->name); + + /* first search an identical filepath */ + for (vfont = bmain->vfont.first; vfont; vfont = vfont->id.next) { + BLI_strncpy(strtest, vfont->name, sizeof(vfont->name)); + BLI_path_abs(strtest, ID_BLEND_PATH(bmain, &vfont->id)); + + if (BLI_path_cmp(strtest, str) == 0) { + vfont->id.us++; /* officially should not, it doesn't link here! */ + if (r_exists) + *r_exists = true; + return vfont; + } + } + + if (r_exists) + *r_exists = false; + return BKE_vfont_load(bmain, filepath); +} + +VFont *BKE_vfont_load_exists(struct Main *bmain, const char *filepath) +{ + return BKE_vfont_load_exists_ex(bmain, filepath, NULL); +} + static VFont *which_vfont(Curve *cu, CharInfo *info) { switch (info->flag & (CU_CHINFO_BOLD | CU_CHINFO_ITALIC)) { diff --git a/source/blender/blenkernel/intern/idcode.c b/source/blender/blenkernel/intern/idcode.c index cf1eb8838e9..68a741bc3fc 100644 --- a/source/blender/blenkernel/intern/idcode.c +++ b/source/blender/blenkernel/intern/idcode.c @@ -103,12 +103,12 @@ static IDType *idtype_from_name(const char *str) return NULL; } -static IDType *idtype_from_code(int code) +static IDType *idtype_from_code(short idcode) { int i = ARRAY_SIZE(idtypes); while (i--) - if (code == idtypes[i].code) + if (idcode == idtypes[i].code) return &idtypes[i]; return NULL; @@ -120,9 +120,9 @@ static IDType *idtype_from_code(int code) * \param code The code to check. * \return Boolean, 0 when invalid. */ -bool BKE_idcode_is_valid(int code) +bool BKE_idcode_is_valid(short idcode) { - return idtype_from_code(code) ? true : false; + return idtype_from_code(idcode) ? true : false; } /** @@ -131,9 +131,9 @@ bool BKE_idcode_is_valid(int code) * \param code The code to check. * \return Boolean, 0 when non linkable. */ -bool BKE_idcode_is_linkable(int code) +bool BKE_idcode_is_linkable(short idcode) { - IDType *idt = idtype_from_code(code); + IDType *idt = idtype_from_code(idcode); BLI_assert(idt); return idt ? ((idt->flags & IDTYPE_FLAGS_ISLINKABLE) != 0) : false; } @@ -145,9 +145,9 @@ bool BKE_idcode_is_linkable(int code) * \return A static string representing the name of * the code. */ -const char *BKE_idcode_to_name(int code) +const char *BKE_idcode_to_name(short idcode) { - IDType *idt = idtype_from_code(code); + IDType *idt = idtype_from_code(idcode); BLI_assert(idt); return idt ? idt->name : NULL; } @@ -158,7 +158,7 @@ const char *BKE_idcode_to_name(int code) * \param name The name to convert. * \return The code for the name, or 0 if invalid. */ -int BKE_idcode_from_name(const char *name) +short BKE_idcode_from_name(const char *name) { IDType *idt = idtype_from_name(name); BLI_assert(idt); @@ -168,7 +168,7 @@ int BKE_idcode_from_name(const char *name) /** * Convert an idcode into an idfilter (e.g. ID_OB -> FILTER_ID_OB). */ -int BKE_idcode_to_idfilter(const int idcode) +int BKE_idcode_to_idfilter(const short idcode) { #define CASE_IDFILTER(_id) case ID_##_id: return FILTER_ID_##_id @@ -211,7 +211,7 @@ int BKE_idcode_to_idfilter(const int idcode) /** * Convert an idfilter into an idcode (e.g. FILTER_ID_OB -> ID_OB). */ -int BKE_idcode_from_idfilter(const int idfilter) +short BKE_idcode_from_idfilter(const int idfilter) { #define CASE_IDFILTER(_id) case FILTER_ID_##_id: return ID_##_id @@ -258,9 +258,9 @@ int BKE_idcode_from_idfilter(const int idfilter) * \return A static string representing the name of * the code. */ -const char *BKE_idcode_to_name_plural(int code) +const char *BKE_idcode_to_name_plural(short idcode) { - IDType *idt = idtype_from_code(code); + IDType *idt = idtype_from_code(idcode); BLI_assert(idt); return idt ? idt->plural : NULL; } @@ -271,9 +271,9 @@ const char *BKE_idcode_to_name_plural(int code) * \param code The code to convert. * \return A static string representing the i18n context of the code. */ -const char *BKE_idcode_to_translation_context(int code) +const char *BKE_idcode_to_translation_context(short idcode) { - IDType *idt = idtype_from_code(code); + IDType *idt = idtype_from_code(idcode); BLI_assert(idt); return idt ? idt->i18n_context : BLT_I18NCONTEXT_DEFAULT; } @@ -284,7 +284,7 @@ const char *BKE_idcode_to_translation_context(int code) * \param index start as 0. * \return the code, 0 when all codes have been returned. */ -int BKE_idcode_iter_step(int *index) +short BKE_idcode_iter_step(int *index) { return (*index < ARRAY_SIZE(idtypes)) ? idtypes[(*index)++].code : 0; } diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c index 4a76c704130..3ffd03dc3be 100644 --- a/source/blender/blenkernel/intern/image.c +++ b/source/blender/blenkernel/intern/image.c @@ -280,14 +280,9 @@ void BKE_image_free_packedfiles(Image *ima) image_free_packedfiles(ima); } -static void image_free_views(Image *ima) -{ - BLI_freelistN(&ima->views); -} - void BKE_image_free_views(Image *image) { - image_free_views(image); + BLI_freelistN(&image->views); } static void image_free_anims(Image *ima) @@ -350,7 +345,7 @@ void BKE_image_free(Image *ima) } } - image_free_views(ima); + BKE_image_free_views(ima); MEM_freeN(ima->stereo3d_format); } @@ -704,8 +699,7 @@ void BKE_image_alpha_mode_from_extension(Image *image) Image *BKE_image_load(Main *bmain, const char *filepath) { Image *ima; - int file, len; - const char *libname; + int file; char str[FILE_MAX]; BLI_strncpy(str, filepath, sizeof(str)); @@ -717,13 +711,7 @@ Image *BKE_image_load(Main *bmain, const char *filepath) return NULL; close(file); - /* create a short library name */ - len = strlen(filepath); - - while (len > 0 && filepath[len - 1] != '/' && filepath[len - 1] != '\\') len--; - libname = filepath + len; - - ima = image_alloc(bmain, libname, IMA_SRC_FILE, IMA_TYPE_IMAGE); + ima = image_alloc(bmain, BLI_path_basename(filepath), IMA_SRC_FILE, IMA_TYPE_IMAGE); BLI_strncpy(ima->name, filepath, sizeof(ima->name)); if (BLI_testextensie_array(filepath, imb_ext_movie)) @@ -746,7 +734,7 @@ Image *BKE_image_load_exists_ex(const char *filepath, bool *r_exists) BLI_strncpy(str, filepath, sizeof(str)); BLI_path_abs(str, G.main->name); - /* first search an identical image */ + /* first search an identical filepath */ for (ima = G.main->image.first; ima; ima = ima->id.next) { if (ima->source != IMA_SRC_VIEWER && ima->source != IMA_SRC_GENERATED) { BLI_strncpy(strtest, ima->name, sizeof(ima->name)); @@ -873,8 +861,6 @@ Image *BKE_image_add_generated(Main *bmain, unsigned int width, unsigned int hei } ima->ok = IMA_OK_LOADED; - if (stereo3d) - ima->flag |= IMA_IS_STEREO | IMA_IS_MULTIVIEW; } return ima; @@ -964,7 +950,7 @@ void BKE_image_memorypack(Image *ima) { ImBuf *ibuf; - if ((ima->flag & IMA_IS_MULTIVIEW)) { + if (BKE_image_is_multiview(ima)) { image_memorypack_multiview(ima); return; } @@ -2490,15 +2476,8 @@ void BKE_image_verify_viewer_views(const RenderData *rd, Image *ima, ImageUser * BLI_lock_thread(LOCK_DRAW_IMAGE); - if (BKE_scene_multiview_is_stereo3d(rd)) { - ima->flag |= IMA_IS_STEREO; - ima->flag |= IMA_IS_MULTIVIEW; - } - else { - ima->flag &= ~IMA_IS_STEREO; - ima->flag &= ~IMA_IS_MULTIVIEW; + if (!BKE_scene_multiview_is_stereo3d(rd)) iuser->flag &= ~IMA_SHOW_STEREO; - } /* see if all scene render views are in the image view list */ do_reset = (BKE_scene_multiview_num_views_get(rd) != BLI_listbase_count(&ima->views)); @@ -2544,6 +2523,17 @@ void BKE_image_walk_all_users(const Main *mainp, void *customdata, if (tex->type == TEX_IMAGE && tex->ima) { callback(tex->ima, &tex->iuser, customdata); } + + if (tex->nodetree) { + bNode *node; + for (node = tex->nodetree->nodes.first; node; node = node->next) { + if (node->id && node->type == TEX_NODE_IMAGE) { + Image *ima = (Image *)node->id; + ImageUser *iuser = node->storage; + callback(ima, iuser, customdata); + } + } + } } /* image window, compo node users */ @@ -2828,7 +2818,7 @@ RenderPass *BKE_image_multilayer_index(RenderResult *rr, ImageUser *iuser) void BKE_image_multiview_index(Image *ima, ImageUser *iuser) { if (iuser) { - bool is_stereo = (ima->flag & IMA_IS_STEREO) && (iuser->flag & IMA_SHOW_STEREO); + bool is_stereo = BKE_image_is_stereo(ima) && (iuser->flag & IMA_SHOW_STEREO); if (is_stereo) { iuser->multi_index = iuser->multiview_eye; } @@ -2861,27 +2851,27 @@ bool BKE_image_is_multilayer(Image *ima) return false; } -static void image_init_multilayer_multiview_flag(Image *ima, RenderResult *rr) +bool BKE_image_is_multiview(Image *ima) { + return (BLI_listbase_count_ex(&ima->views, 2) > 1); +} + +bool BKE_image_is_stereo(Image *ima) +{ + return BKE_image_is_multiview(ima) && + (BLI_findstring(&ima->views, STEREO_LEFT_NAME, offsetof(ImageView, name)) && + BLI_findstring(&ima->views, STEREO_RIGHT_NAME, offsetof(ImageView, name))); +} + +static void image_init_multilayer_multiview(Image *ima, RenderResult *rr) +{ + BKE_image_free_views(ima); if (rr) { - if (RE_RenderResult_is_stereo(rr)) { - ima->flag |= IMA_IS_STEREO; - ima->flag |= IMA_IS_MULTIVIEW; - } - else { - ima->flag &= ~IMA_IS_STEREO; - if (BLI_listbase_count_ex(&rr->views, 2) > 1) - ima->flag |= IMA_IS_MULTIVIEW; - else - ima->flag &= ~IMA_IS_MULTIVIEW; - } - } - else { - ima->flag &= ~IMA_IS_STEREO; - ima->flag &= ~IMA_IS_MULTIVIEW; + BLI_duplicatelist(&ima->views, &rr->views); } } + RenderResult *BKE_image_acquire_renderresult(Scene *scene, Image *ima) { RenderResult *rr = NULL; @@ -2894,8 +2884,8 @@ RenderResult *BKE_image_acquire_renderresult(Scene *scene, Image *ima) else rr = ima->renders[ima->render_slot]; - /* set proper multiview flag */ - image_init_multilayer_multiview_flag(ima, rr); + /* set proper views */ + image_init_multilayer_multiview(ima, rr); } return rr; @@ -3053,39 +3043,15 @@ static void image_add_buffer_cb(void *base, const char *str, ImBuf *ibuf, const } #endif /* WITH_OPENEXR */ -#ifdef WITH_OPENEXR -static void image_update_multiview_flags(Image *ima) -{ - if (BLI_listbase_count_ex(&ima->views, 2) > 1) { - ima->flag |= IMA_IS_MULTIVIEW; - - if (BLI_findstring(&ima->views, STEREO_LEFT_NAME, offsetof(ImageView, name)) && - BLI_findstring(&ima->views, STEREO_RIGHT_NAME, offsetof(ImageView, name))) - { - ima->flag |= IMA_IS_STEREO; - } - else { - ima->flag &= ~IMA_IS_STEREO; - } - } - else { - ima->flag &= ~IMA_IS_STEREO; - ima->flag &= ~IMA_IS_MULTIVIEW; - } -} -#endif /* WITH_OPENEXR */ - /* after imbuf load, openexr type can return with a exrhandle open */ /* in that case we have to build a render-result */ #ifdef WITH_OPENEXR static void image_create_multiview(Image *ima, ImBuf *ibuf, const int frame) { - image_free_views(ima); + BKE_image_free_views(ima); IMB_exr_multiview_convert(ibuf->userdata, ima, image_add_view_cb, image_add_buffer_cb, frame); - image_update_multiview_flags(ima); - IMB_exr_close(ibuf->userdata); } #endif /* WITH_OPENEXR */ @@ -3098,7 +3064,9 @@ static void image_create_multilayer(Image *ima, ImBuf *ibuf, int framenr) const char *colorspace = ima->colorspace_settings.name; bool predivide = (ima->alpha_mode == IMA_ALPHA_PREMUL); - ima->rr = RE_MultilayerConvert(ibuf->userdata, colorspace, predivide, ibuf->x, ibuf->y); + /* only load rr once for multiview */ + if (!ima->rr) + ima->rr = RE_MultilayerConvert(ibuf->userdata, colorspace, predivide, ibuf->x, ibuf->y); IMB_exr_close(ibuf->userdata); @@ -3106,8 +3074,8 @@ static void image_create_multilayer(Image *ima, ImBuf *ibuf, int framenr) if (ima->rr) ima->rr->framenr = framenr; - /* set proper multiview flag */ - image_init_multilayer_multiview_flag(ima, ima->rr); + /* set proper views */ + image_init_multilayer_multiview(ima, ima->rr); } #endif /* WITH_OPENEXR */ @@ -3145,7 +3113,7 @@ static int imbuf_alpha_flags_for_image(Image *ima) /* the number of files will vary according to the stereo format */ static size_t image_num_files(Image *ima) { - const bool is_multiview = (ima->flag & IMA_IS_MULTIVIEW) != 0; + const bool is_multiview = BKE_image_is_multiview(ima); if (!is_multiview) { return 1; @@ -3227,7 +3195,7 @@ static ImBuf *load_sequence_single(Image *ima, ImageUser *iuser, int frame, cons static ImBuf *image_load_sequence_file(Image *ima, ImageUser *iuser, int frame) { struct ImBuf *ibuf = NULL; - const bool is_multiview = (ima->flag & IMA_IS_MULTIVIEW) != 0; + const bool is_multiview = BKE_image_is_multiview(ima); const size_t totfiles = image_num_files(ima); bool assign = false; @@ -3247,7 +3215,7 @@ static ImBuf *image_load_sequence_file(Image *ima, ImageUser *iuser, int frame) for (i = 0; i < totfiles; i++) ibuf_arr[i] = load_sequence_single(ima, iuser, frame, i, &assign); - if ((ima->flag & IMA_IS_STEREO) && ima->views_format == R_IMF_VIEWS_STEREO_3D) + if (BKE_image_is_stereo(ima) && ima->views_format == R_IMF_VIEWS_STEREO_3D) IMB_ImBufFromStereo3d(ima->stereo3d_format, ibuf_arr[0], &ibuf_arr[0], &ibuf_arr[1]); /* return the original requested ImBuf */ @@ -3384,7 +3352,7 @@ static ImBuf *load_movie_single(Image *ima, ImageUser *iuser, int frame, const s static ImBuf *image_load_movie_file(Image *ima, ImageUser *iuser, int frame) { struct ImBuf *ibuf = NULL; - const bool is_multiview = (ima->flag & IMA_IS_MULTIVIEW) != 0; + const bool is_multiview = BKE_image_is_multiview(ima); const size_t totfiles = image_num_files(ima); size_t i; @@ -3412,7 +3380,7 @@ static ImBuf *image_load_movie_file(Image *ima, ImageUser *iuser, int frame) ibuf_arr[i] = load_movie_single(ima, iuser, frame, i); } - if ((ima->flag & IMA_IS_STEREO) && ima->views_format == R_IMF_VIEWS_STEREO_3D) + if (BKE_image_is_stereo(ima) && ima->views_format == R_IMF_VIEWS_STEREO_3D) IMB_ImBufFromStereo3d(ima->stereo3d_format, ibuf_arr[0], &ibuf_arr[0], &ibuf_arr[1]); for (i = 0; i < totviews; i++) { @@ -3540,7 +3508,7 @@ static ImBuf *image_load_image_file(Image *ima, ImageUser *iuser, int cfra) { struct ImBuf *ibuf = NULL; bool assign = false; - const bool is_multiview = (ima->flag & IMA_IS_MULTIVIEW) != 0; + const bool is_multiview = BKE_image_is_multiview(ima); const size_t totfiles = image_num_files(ima); bool has_packed = BKE_image_has_packedfile(ima); @@ -3573,7 +3541,7 @@ static ImBuf *image_load_image_file(Image *ima, ImageUser *iuser, int cfra) ibuf_arr[i] = load_image_single(ima, iuser, cfra, i, has_packed, &assign); /* multi-views/multi-layers OpenEXR files directly populate ima, and return NULL ibuf... */ - if ((ima->flag & IMA_IS_STEREO) && ima->views_format == R_IMF_VIEWS_STEREO_3D && + if (BKE_image_is_stereo(ima) && ima->views_format == R_IMF_VIEWS_STEREO_3D && ibuf_arr[0] && totfiles == 1 && totviews >= 2) { IMB_ImBufFromStereo3d(ima->stereo3d_format, ibuf_arr[0], &ibuf_arr[0], &ibuf_arr[1]); @@ -3673,7 +3641,7 @@ static ImBuf *image_get_render_result(Image *ima, ImageUser *iuser, void **r_loc pass = iuser->pass; actview = iuser->view; - if ((ima->flag & IMA_IS_STEREO) && (iuser->flag & IMA_SHOW_STEREO)) + if (BKE_image_is_stereo(ima) && (iuser->flag & IMA_SHOW_STEREO)) actview = iuser->multiview_eye; if (from_render) { @@ -3847,12 +3815,12 @@ static size_t image_get_multiview_index(Image *ima, ImageUser *iuser) return iuser ? iuser->multi_index : index; } else if (is_backdrop) { - if ((ima->flag & IMA_IS_STEREO)) { + if (BKE_image_is_stereo(ima)) { /* backdrop hackaround (since there is no iuser */ return ima->eye; } } - else if ((ima->flag & IMA_IS_MULTIVIEW)) { + else if (BKE_image_is_multiview(ima)) { return iuser ? iuser->multi_index : index; } @@ -4341,9 +4309,12 @@ void BKE_image_update_frame(const Main *bmain, int cfra) void BKE_image_user_file_path(ImageUser *iuser, Image *ima, char *filepath) { - if ((ima->flag & IMA_IS_MULTIVIEW) && (ima->rr == NULL)) { + if (BKE_image_is_multiview(ima) && (ima->rr == NULL)) { ImageView *iv = BLI_findlink(&ima->views, iuser->view); - BLI_strncpy(filepath, iv->filepath, FILE_MAX); + if (iv->filepath[0]) + BLI_strncpy(filepath, iv->filepath, FILE_MAX); + else + BLI_strncpy(filepath, ima->name, FILE_MAX); } else { BLI_strncpy(filepath, ima->name, FILE_MAX); @@ -4473,14 +4444,7 @@ float *BKE_image_get_float_pixels_for_frame(struct Image *image, int frame) int BKE_image_sequence_guess_offset(Image *image) { - unsigned short numlen; - char head[FILE_MAX], tail[FILE_MAX]; - char num[FILE_MAX] = {0}; - - BLI_stringdec(image->name, head, tail, &numlen); - BLI_strncpy(num, image->name + strlen(head), numlen + 1); - - return atoi(num); + return BLI_stringdec(image->name, NULL, NULL, NULL); } bool BKE_image_has_anim(Image *ima) @@ -4638,15 +4602,12 @@ static void image_update_views_format(Image *ima, ImageUser *iuser) BKE_image_free_views(ima); if (!is_multiview) { - goto monoview; + /* nothing to do */ } else if (ima->views_format == R_IMF_VIEWS_STEREO_3D) { size_t i; const char *names[2] = {STEREO_LEFT_NAME, STEREO_RIGHT_NAME}; - ima->flag |= IMA_IS_MULTIVIEW; - ima->flag |= IMA_IS_STEREO; - for (i = 0; i < 2; i++) { image_add_view(ima, names[i], ima->name); } @@ -4661,7 +4622,8 @@ static void image_update_views_format(Image *ima, ImageUser *iuser) BKE_scene_multiview_view_prefix_get(scene, name, prefix, &ext); if (prefix[0] == '\0') { - goto monoview; + BKE_image_free_views(ima); + return; } /* create all the image views */ @@ -4697,15 +4659,7 @@ static void image_update_views_format(Image *ima, ImageUser *iuser) } /* all good */ - if (BLI_listbase_count_ex(&ima->views, 2) > 1) { - ima->flag |= IMA_IS_MULTIVIEW; - if (BKE_scene_multiview_is_stereo3d(&scene->r)) - ima->flag |= IMA_IS_STEREO; - } - else { -monoview: - ima->flag &= ~IMA_IS_STEREO; - ima->flag &= ~IMA_IS_MULTIVIEW; + if (!BKE_image_is_multiview(ima)) { BKE_image_free_views(ima); } } diff --git a/source/blender/blenkernel/intern/key.c b/source/blender/blenkernel/intern/key.c index b591dc19685..362f41335d2 100644 --- a/source/blender/blenkernel/intern/key.c +++ b/source/blender/blenkernel/intern/key.c @@ -58,6 +58,7 @@ #include "BKE_key.h" #include "BKE_lattice.h" #include "BKE_library.h" +#include "BKE_mesh.h" #include "BKE_editmesh.h" #include "BKE_scene.h" @@ -1392,26 +1393,51 @@ float *BKE_key_evaluate_object(Object *ob, int *r_totelem) return BKE_key_evaluate_object_ex(ob, r_totelem, NULL, 0); } -Key **BKE_key_from_object_p(Object *ob) +Key **BKE_key_from_id_p(ID *id) { - if (ob == NULL) - return NULL; - - if (ob->type == OB_MESH) { - Mesh *me = ob->data; - return &me->key; - } - else if (ELEM(ob->type, OB_CURVE, OB_SURF)) { - Curve *cu = ob->data; - return &cu->key; + switch (GS(id->name)) { + case ID_ME: + { + Mesh *me = (Mesh *)id; + return &me->key; + } + case ID_CU: + { + Curve *cu = (Curve *)id; + if (cu->vfont == NULL) { + return &cu->key; + } + break; + } + case ID_LT: + { + Lattice *lt = (Lattice *)id; + return <->key; + } } - else if (ob->type == OB_LATTICE) { - Lattice *lt = ob->data; - return <->key; + + return NULL; +} + +Key *BKE_key_from_id(ID *id) +{ + Key **key_p; + key_p = BKE_key_from_id_p(id); + if (key_p) { + return *key_p; } + return NULL; } +Key **BKE_key_from_object_p(Object *ob) +{ + if (ob == NULL || ob->data == NULL) + return NULL; + + return BKE_key_from_id_p(ob->data); +} + Key *BKE_key_from_object(Object *ob) { Key **key_p; @@ -1774,6 +1800,66 @@ void BKE_keyblock_convert_to_mesh(KeyBlock *kb, Mesh *me) } } +/** + * Computes normals (vertices, polygons and/or loops ones) of given mesh for given shape key. + * + * \param kb the KeyBlock to use to compute normals. + * \param mesh the Mesh to apply keyblock to. + * \param r_vertnors if non-NULL, an array of vectors, same length as number of vertices. + * \param r_polynors if non-NULL, an array of vectors, same length as number of polygons. + * \param r_loopnors if non-NULL, an array of vectors, same length as number of loops. + */ +void BKE_keyblock_mesh_calc_normals( + struct KeyBlock *kb, struct Mesh *mesh, + float (*r_vertnors)[3], float (*r_polynors)[3], float (*r_loopnors)[3]) +{ + /* We use a temp, shallow copy of mesh to work. */ + Mesh me; + bool free_polynors = false; + + if (r_vertnors == NULL && r_polynors == NULL && r_loopnors == NULL) { + return; + } + + me = *mesh; + me.mvert = MEM_dupallocN(mesh->mvert); + CustomData_reset(&me.vdata); + CustomData_reset(&me.edata); + CustomData_reset(&me.pdata); + CustomData_reset(&me.ldata); + CustomData_reset(&me.fdata); + + BKE_keyblock_convert_to_mesh(kb, &me); + + if (r_polynors == NULL && r_loopnors != NULL) { + r_polynors = MEM_mallocN(sizeof(float[3]) * me.totpoly, __func__); + free_polynors = true; + } + BKE_mesh_calc_normals_poly( + me.mvert, r_vertnors, me.totvert, me.mloop, me.mpoly, me.totloop, me.totpoly, r_polynors, false); + + if (r_loopnors) { + short (*clnors)[2] = CustomData_get_layer(&mesh->ldata, CD_CUSTOMLOOPNORMAL); /* May be NULL. */ + + BKE_mesh_normals_loop_split( + me.mvert, me.totvert, me.medge, me.totedge, + me.mloop, r_loopnors, me.totloop, me.mpoly, r_polynors, me.totpoly, + (me.flag & ME_AUTOSMOOTH) != 0, me.smoothresh, NULL, clnors, NULL); + } + + CustomData_free(&me.vdata, me.totvert); + CustomData_free(&me.edata, me.totedge); + CustomData_free(&me.pdata, me.totpoly); + CustomData_free(&me.ldata, me.totloop); + CustomData_free(&me.fdata, me.totface); + MEM_freeN(me.mvert); + + if (free_polynors) { + MEM_freeN(r_polynors); + } +} + + /************************* raw coords ************************/ void BKE_keyblock_update_from_vertcos(Object *ob, KeyBlock *kb, float (*vertCos)[3]) { diff --git a/source/blender/blenkernel/intern/lamp.c b/source/blender/blenkernel/intern/lamp.c index 44e35c645de..8e350896eb8 100644 --- a/source/blender/blenkernel/intern/lamp.c +++ b/source/blender/blenkernel/intern/lamp.c @@ -53,12 +53,10 @@ #include "BKE_main.h" #include "BKE_node.h" -Lamp *BKE_lamp_add(Main *bmain, const char *name) +void BKE_lamp_init(Lamp *la) { - Lamp *la; - - la = BKE_libblock_alloc(bmain, ID_LA, name); - + BLI_assert(MEMCMP_STRUCT_OFS_IS_ZERO(la, id)); + la->r = la->g = la->b = la->k = 1.0f; la->haint = la->energy = 1.0f; la->dist = 25.0f; @@ -100,6 +98,16 @@ Lamp *BKE_lamp_add(Main *bmain, const char *name) la->shadow_frustum_size = 10.0f; curvemapping_initialize(la->curfalloff); +} + +Lamp *BKE_lamp_add(Main *bmain, const char *name) +{ + Lamp *la; + + la = BKE_libblock_alloc(bmain, ID_LA, name); + + BKE_lamp_init(la); + return la; } diff --git a/source/blender/blenkernel/intern/lattice.c b/source/blender/blenkernel/intern/lattice.c index 009e1d20328..0e5228a6db4 100644 --- a/source/blender/blenkernel/intern/lattice.c +++ b/source/blender/blenkernel/intern/lattice.c @@ -251,12 +251,10 @@ void BKE_lattice_resize(Lattice *lt, int uNew, int vNew, int wNew, Object *ltOb) MEM_freeN(vertexCos); } -Lattice *BKE_lattice_add(Main *bmain, const char *name) +void BKE_lattice_init(Lattice *lt) { - Lattice *lt; - - lt = BKE_libblock_alloc(bmain, ID_LT, name); - + BLI_assert(MEMCMP_STRUCT_OFS_IS_ZERO(lt, id)); + lt->flag = LT_GRID; lt->typeu = lt->typev = lt->typew = KEY_BSPLINE; @@ -264,7 +262,16 @@ Lattice *BKE_lattice_add(Main *bmain, const char *name) lt->def = MEM_callocN(sizeof(BPoint), "lattvert"); /* temporary */ BKE_lattice_resize(lt, 2, 2, 2, NULL); /* creates a uniform lattice */ lt->actbp = LT_ACTBP_NONE; - +} + +Lattice *BKE_lattice_add(Main *bmain, const char *name) +{ + Lattice *lt; + + lt = BKE_libblock_alloc(bmain, ID_LT, name); + + BKE_lattice_init(lt); + return lt; } diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c index 9fb0cb42dfc..f8f92825479 100644 --- a/source/blender/blenkernel/intern/library.c +++ b/source/blender/blenkernel/intern/library.c @@ -59,6 +59,7 @@ #include "DNA_movieclip_types.h" #include "DNA_mask_types.h" #include "DNA_node_types.h" +#include "DNA_object_types.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" #include "DNA_speaker_types.h" @@ -95,6 +96,7 @@ #include "BKE_lamp.h" #include "BKE_lattice.h" #include "BKE_library.h" +#include "BKE_library_query.h" #include "BKE_linestyle.h" #include "BKE_mesh.h" #include "BKE_material.h" @@ -647,7 +649,7 @@ int set_listbasepointers(Main *main, ListBase **lb) * Allocates and returns memory of the right size for the specified block type, * initialized to zero. */ -static ID *alloc_libblock_notest(short type) +void *BKE_libblock_alloc_notest(short type) { ID *id = NULL; @@ -769,7 +771,7 @@ void *BKE_libblock_alloc(Main *bmain, short type, const char *name) ID *id = NULL; ListBase *lb = which_libbase(bmain, type); - id = alloc_libblock_notest(type); + id = BKE_libblock_alloc_notest(type); if (id) { BKE_main_lock(bmain); BLI_addtail(lb, id); @@ -784,6 +786,121 @@ void *BKE_libblock_alloc(Main *bmain, short type, const char *name) return id; } +/** + * Initialize an ID of given type, such that it has valid 'empty' data. + * ID is assumed to be just calloc'ed. + */ +void BKE_libblock_init_empty(ID *id) +{ + /* Note that only ID types that are not valid when filled of zero should have a callback here. */ + switch (GS(id->name)) { + case ID_SCE: + BKE_scene_init((Scene *)id); + break; + case ID_LI: + /* Nothing to do. */ + break; + case ID_OB: + { + Object *ob = (Object *)id; + ob->type = OB_EMPTY; + BKE_object_init(ob); + break; + } + case ID_ME: + BKE_mesh_init((Mesh *)id); + break; + case ID_CU: + BKE_curve_init((Curve *)id); + break; + case ID_MB: + BKE_mball_init((MetaBall *)id); + break; + case ID_MA: + BKE_material_init((Material *)id); + break; + case ID_TE: + BKE_texture_default((Tex *)id); + break; + case ID_IM: + /* Image is a bit complicated, for now assume NULLified im is OK. */ + break; + case ID_LT: + BKE_lattice_init((Lattice *)id); + break; + case ID_LA: + BKE_lamp_init((Lamp *)id); + break; + case ID_SPK: + BKE_speaker_init((Speaker *)id); + break; + case ID_CA: + BKE_camera_init((Camera *)id); + break; + case ID_IP: + /* Should not be needed - animation from lib pre-2.5 is broken anyway. */ + BLI_assert(0); + break; + case ID_KE: + /* Shapekeys are a complex topic too - they depend on their 'user' data type... + * They are not linkable, though, so it should never reach here anyway. */ + BLI_assert(0); + break; + case ID_WO: + BKE_world_init((World *)id); + break; + case ID_SCR: + /* Nothing to do. */ + break; + case ID_VF: + BKE_vfont_init((VFont *)id); + break; + case ID_TXT: + BKE_text_init((Text *)id); + break; + case ID_SCRIPT: + BLI_assert(0); + break; + case ID_SO: + /* Another fuzzy case, think NULLified content is OK here... */ + break; + case ID_GR: + /* Nothing to do. */ + break; + case ID_AR: + /* Nothing to do. */ + break; + case ID_AC: + /* Nothing to do. */ + break; + case ID_NT: + ntreeInitDefault((bNodeTree *)id); + break; + case ID_BR: + BKE_brush_init((Brush *)id); + break; + case ID_PA: + /* Nothing to do. */ + break; + case ID_PC: + /* Nothing to do. */ + break; + case ID_WM: + /* We should never reach this. */ + BLI_assert(0); + break; + case ID_GD: + /* Nothing to do. */ + break; + case ID_MSK: + /* Nothing to do. */ + break; + case ID_LS: + BKE_linestyle_init((FreestyleLineStyle *)id); + break; + } +} + /* by spec, animdata is first item after ID */ /* and, trust that BKE_animdata_from_id() will only find AnimData for valid ID-types */ static void id_copy_animdata(ID *id, const bool do_action) @@ -837,7 +954,7 @@ void *BKE_libblock_copy_nolib(ID *id, const bool do_action) ID *idn; size_t idn_len; - idn = alloc_libblock_notest(GS(id->name)); + idn = BKE_libblock_alloc_notest(GS(id->name)); assert(idn != NULL); BLI_strncpy(idn->name, id->name, sizeof(idn->name)); @@ -864,6 +981,31 @@ void *BKE_libblock_copy(ID *id) return BKE_libblock_copy_ex(G.main, id); } +static bool id_relink_looper(void *UNUSED(user_data), ID **id_pointer, const int cd_flag) +{ + ID *id = *id_pointer; + if (id) { + /* See: NEW_ID macro */ + if (id->newid) { + BKE_library_update_ID_link_user(id->newid, id, cd_flag); + *id_pointer = id->newid; + } + else if (id->flag & LIB_NEW) { + id->flag &= ~LIB_NEW; + BKE_libblock_relink(id); + } + } + return true; +} + +void BKE_libblock_relink(ID *id) +{ + if (id->lib) + return; + + BKE_library_foreach_ID_link(id, id_relink_looper, NULL, 0); +} + static void BKE_library_free(Library *lib) { if (lib->packedfile) @@ -1694,7 +1836,7 @@ void rename_id(ID *id, const char *name) */ void name_uiprefix_id(char *name, const ID *id) { - name[0] = id->lib ? 'L' : ' '; + name[0] = id->lib ? (ID_MISSING(id) ? 'M' : 'L') : ' '; name[1] = (id->flag & LIB_FAKEUSER) ? 'F' : ((id->us == 0) ? '0' : ' '); name[2] = ' '; diff --git a/source/blender/blenkernel/intern/library_query.c b/source/blender/blenkernel/intern/library_query.c index 6d2e2f1ecd4..a800b3d8834 100644 --- a/source/blender/blenkernel/intern/library_query.c +++ b/source/blender/blenkernel/intern/library_query.c @@ -30,10 +30,12 @@ #include <stdlib.h> +#include "DNA_actuator_types.h" #include "DNA_anim_types.h" #include "DNA_brush_types.h" #include "DNA_camera_types.h" #include "DNA_constraint_types.h" +#include "DNA_controller_types.h" #include "DNA_group_types.h" #include "DNA_gpencil_types.h" #include "DNA_key_types.h" @@ -47,7 +49,9 @@ #include "DNA_mask_types.h" #include "DNA_node_types.h" #include "DNA_object_force.h" +#include "DNA_rigidbody_types.h" #include "DNA_scene_types.h" +#include "DNA_sensor_types.h" #include "DNA_sequence_types.h" #include "DNA_screen_types.h" #include "DNA_speaker_types.h" @@ -61,9 +65,12 @@ #include "BKE_animsys.h" #include "BKE_constraint.h" #include "BKE_fcurve.h" +#include "BKE_library.h" #include "BKE_library_query.h" #include "BKE_modifier.h" #include "BKE_particle.h" +#include "BKE_rigidbody.h" +#include "BKE_sca.h" #include "BKE_sequencer.h" #include "BKE_tracking.h" @@ -80,16 +87,19 @@ /* TODO(sergey): Make it less creepy without too much duplicated code.. */ \ return; \ } \ - } (void) 0 + } ((void)0) #define FOREACH_CALLBACK_INVOKE_ID(self_id, id, flag, callback, user_data, cb_flag) \ - FOREACH_CALLBACK_INVOKE_ID_PP(self_id, &(id), flag, callback, user_data, cb_flag) \ + { \ + CHECK_TYPE_ANY(id, ID *, void *); \ + FOREACH_CALLBACK_INVOKE_ID_PP(self_id, (ID **)&(id), flag, callback, user_data, cb_flag); \ + } ((void)0) #define FOREACH_CALLBACK_INVOKE(self_id, id_super, flag, callback, user_data, cb_flag) \ { \ CHECK_TYPE(&((id_super)->id), ID *); \ FOREACH_CALLBACK_INVOKE_ID_PP(self_id, (ID **)&id_super, flag, callback, user_data, cb_flag); \ - } (void) 0 + } ((void)0) typedef struct LibraryForeachIDData { ID *self_id; @@ -98,11 +108,18 @@ typedef struct LibraryForeachIDData { void *user_data; } LibraryForeachIDData; -static void library_foreach_modifiersForeachIDLink(void *user_data, Object *UNUSED(object), - ID **id_pointer) +static void library_foreach_rigidbodyworldSceneLooper( + struct RigidBodyWorld *UNUSED(rbw), ID **id_pointer, void *user_data, int cd_flag) { LibraryForeachIDData *data = (LibraryForeachIDData *) user_data; - FOREACH_CALLBACK_INVOKE_ID_PP(data->self_id, id_pointer, data->flag, data->callback, data->user_data, IDWALK_NOP); + FOREACH_CALLBACK_INVOKE_ID_PP(data->self_id, id_pointer, data->flag, data->callback, data->user_data, cd_flag); +} + +static void library_foreach_modifiersForeachIDLink( + void *user_data, Object *UNUSED(object), ID **id_pointer, int cd_flag) +{ + LibraryForeachIDData *data = (LibraryForeachIDData *) user_data; + FOREACH_CALLBACK_INVOKE_ID_PP(data->self_id, id_pointer, data->flag, data->callback, data->user_data, cd_flag); } static void library_foreach_constraintObjectLooper(bConstraint *UNUSED(con), ID **id_pointer, @@ -112,6 +129,34 @@ static void library_foreach_constraintObjectLooper(bConstraint *UNUSED(con), ID FOREACH_CALLBACK_INVOKE_ID_PP(data->self_id, id_pointer, data->flag, data->callback, data->user_data, IDWALK_NOP); } +static void library_foreach_particlesystemsObjectLooper( + ParticleSystem *UNUSED(psys), ID **id_pointer, void *user_data, int cd_flag) +{ + LibraryForeachIDData *data = (LibraryForeachIDData *) user_data; + FOREACH_CALLBACK_INVOKE_ID_PP(data->self_id, id_pointer, data->flag, data->callback, data->user_data, cd_flag); +} + +static void library_foreach_sensorsObjectLooper( + bSensor *UNUSED(sensor), ID **id_pointer, void *user_data, int cd_flag) +{ + LibraryForeachIDData *data = (LibraryForeachIDData *) user_data; + FOREACH_CALLBACK_INVOKE_ID_PP(data->self_id, id_pointer, data->flag, data->callback, data->user_data, cd_flag); +} + +static void library_foreach_controllersObjectLooper( + bController *UNUSED(controller), ID **id_pointer, void *user_data, int cd_flag) +{ + LibraryForeachIDData *data = (LibraryForeachIDData *) user_data; + FOREACH_CALLBACK_INVOKE_ID_PP(data->self_id, id_pointer, data->flag, data->callback, data->user_data, cd_flag); +} + +static void library_foreach_actuatorsObjectLooper( + bActuator *UNUSED(actuator), ID **id_pointer, void *user_data, int cd_flag) +{ + LibraryForeachIDData *data = (LibraryForeachIDData *) user_data; + FOREACH_CALLBACK_INVOKE_ID_PP(data->self_id, id_pointer, data->flag, data->callback, data->user_data, cd_flag); +} + static void library_foreach_animationData(LibraryForeachIDData *data, AnimData *adt) { FCurve *fcu; @@ -131,11 +176,10 @@ static void library_foreach_animationData(LibraryForeachIDData *data, AnimData * } } - static void library_foreach_mtex(LibraryForeachIDData *data, MTex *mtex) { FOREACH_CALLBACK_INVOKE(data->self_id, mtex->object, data->flag, data->callback, data->user_data, IDWALK_NOP); - FOREACH_CALLBACK_INVOKE(data->self_id, mtex->tex, data->flag, data->callback, data->user_data, IDWALK_NOP); + FOREACH_CALLBACK_INVOKE(data->self_id, mtex->tex, data->flag, data->callback, data->user_data, IDWALK_USER); } @@ -170,12 +214,15 @@ void BKE_library_foreach_ID_link(ID *id, LibraryIDLinkCallback callback, void *u case ID_SCE: { Scene *scene = (Scene *) id; + ToolSettings *toolsett = scene->toolsettings; SceneRenderLayer *srl; Base *base; CALLBACK_INVOKE(scene->camera, IDWALK_NOP); - CALLBACK_INVOKE(scene->world, IDWALK_NOP); + CALLBACK_INVOKE(scene->world, IDWALK_USER); CALLBACK_INVOKE(scene->set, IDWALK_NOP); + CALLBACK_INVOKE(scene->clip, IDWALK_NOP); + CALLBACK_INVOKE(scene->nodetree, IDWALK_NOP); if (scene->basact) { CALLBACK_INVOKE(scene->basact->object, IDWALK_NOP); } @@ -186,10 +233,10 @@ void BKE_library_foreach_ID_link(ID *id, LibraryIDLinkCallback callback, void *u FreestyleLineSet *fls; if (srl->mat_override) { - CALLBACK_INVOKE(srl->mat_override, IDWALK_NOP); + CALLBACK_INVOKE(srl->mat_override, IDWALK_USER); } if (srl->light_override) { - CALLBACK_INVOKE(srl->light_override, IDWALK_NOP); + CALLBACK_INVOKE(srl->light_override, IDWALK_USER); } for (fmc = srl->freestyleConfig.modules.first; fmc; fmc = fmc->next) { if (fmc->script) { @@ -198,10 +245,10 @@ void BKE_library_foreach_ID_link(ID *id, LibraryIDLinkCallback callback, void *u } for (fls = srl->freestyleConfig.linesets.first; fls; fls = fls->next) { if (fls->group) { - CALLBACK_INVOKE(fls->group, IDWALK_NOP); + CALLBACK_INVOKE(fls->group, IDWALK_USER); } if (fls->linestyle) { - CALLBACK_INVOKE(fls->linestyle, IDWALK_NOP); + CALLBACK_INVOKE(fls->linestyle, IDWALK_USER); } } } @@ -212,74 +259,136 @@ void BKE_library_foreach_ID_link(ID *id, LibraryIDLinkCallback callback, void *u { CALLBACK_INVOKE(seq->scene, IDWALK_NOP); CALLBACK_INVOKE(seq->scene_camera, IDWALK_NOP); - CALLBACK_INVOKE(seq->clip, IDWALK_NOP); - CALLBACK_INVOKE(seq->mask, IDWALK_NOP); + CALLBACK_INVOKE(seq->clip, IDWALK_USER); + CALLBACK_INVOKE(seq->mask, IDWALK_USER); + CALLBACK_INVOKE(seq->sound, IDWALK_USER); } SEQ_END } - CALLBACK_INVOKE(scene->gpd, IDWALK_NOP); + CALLBACK_INVOKE(scene->gpd, IDWALK_USER); for (base = scene->base.first; base; base = base->next) { - CALLBACK_INVOKE(base->object, IDWALK_NOP); + CALLBACK_INVOKE(base->object, IDWALK_USER); + } + + if (toolsett) { + CALLBACK_INVOKE(toolsett->skgen_template, IDWALK_NOP); + CALLBACK_INVOKE(toolsett->particle.scene, IDWALK_NOP); + CALLBACK_INVOKE(toolsett->particle.object, IDWALK_NOP); + CALLBACK_INVOKE(toolsett->particle.shape_object, IDWALK_NOP); + CALLBACK_INVOKE(toolsett->imapaint.stencil, IDWALK_NOP); + CALLBACK_INVOKE(toolsett->imapaint.clone, IDWALK_NOP); + CALLBACK_INVOKE(toolsett->imapaint.canvas, IDWALK_NOP); + if (toolsett->vpaint) { + CALLBACK_INVOKE(toolsett->vpaint->paint.brush, IDWALK_NOP); + CALLBACK_INVOKE(toolsett->vpaint->paint.palette, IDWALK_NOP); + } + if (toolsett->wpaint) { + CALLBACK_INVOKE(toolsett->wpaint->paint.brush, IDWALK_NOP); + CALLBACK_INVOKE(toolsett->wpaint->paint.palette, IDWALK_NOP); + } + if (toolsett->sculpt) { + CALLBACK_INVOKE(toolsett->sculpt->paint.brush, IDWALK_NOP); + CALLBACK_INVOKE(toolsett->sculpt->paint.palette, IDWALK_NOP); + CALLBACK_INVOKE(toolsett->sculpt->gravity_object, IDWALK_NOP); + } + if (toolsett->uvsculpt) { + CALLBACK_INVOKE(toolsett->uvsculpt->paint.brush, IDWALK_NOP); + CALLBACK_INVOKE(toolsett->uvsculpt->paint.palette, IDWALK_NOP); + } } + + if (scene->rigidbody_world) { + BKE_rigidbody_world_id_loop(scene->rigidbody_world, library_foreach_rigidbodyworldSceneLooper, &data); + } + break; } case ID_OB: { Object *object = (Object *) id; + ParticleSystem *psys; + + /* object data special case */ + if (object->type == OB_EMPTY) { + /* empty can have NULL or Image */ + CALLBACK_INVOKE_ID(object->data, IDWALK_USER); + } + else { + /* when set, this can't be NULL */ + if (object->data) { + CALLBACK_INVOKE_ID(object->data, IDWALK_USER | IDWALK_NEVER_NULL); + } + } + CALLBACK_INVOKE(object->parent, IDWALK_NOP); CALLBACK_INVOKE(object->track, IDWALK_NOP); - CALLBACK_INVOKE(object->proxy, IDWALK_NOP); + /* object->proxy is refcounted, but not object->proxy_group... *sigh* */ + CALLBACK_INVOKE(object->proxy, IDWALK_USER); CALLBACK_INVOKE(object->proxy_group, IDWALK_NOP); CALLBACK_INVOKE(object->proxy_from, IDWALK_NOP); - CALLBACK_INVOKE(object->poselib, IDWALK_NOP); + CALLBACK_INVOKE(object->poselib, IDWALK_USER); for (i = 0; i < object->totcol; i++) { - CALLBACK_INVOKE(object->mat[i], IDWALK_NOP); + CALLBACK_INVOKE(object->mat[i], IDWALK_USER); } - CALLBACK_INVOKE(object->gpd, IDWALK_NOP); - CALLBACK_INVOKE(object->dup_group, IDWALK_NOP); + CALLBACK_INVOKE(object->gpd, IDWALK_USER); + CALLBACK_INVOKE(object->dup_group, IDWALK_USER); + if (object->particlesystem.first) { - ParticleSystem *particle_system; - for (particle_system = object->particlesystem.first; - particle_system; - particle_system = particle_system->next) - { - CALLBACK_INVOKE(particle_system->target_ob, IDWALK_NOP); - CALLBACK_INVOKE(particle_system->parent, IDWALK_NOP); + ParticleSystem *psys; + for (psys = object->particlesystem.first; psys; psys = psys->next) { + CALLBACK_INVOKE(psys->target_ob, IDWALK_NOP); + CALLBACK_INVOKE(psys->parent, IDWALK_NOP); } } + if (object->pd) { + CALLBACK_INVOKE(object->pd->tex, IDWALK_USER); + CALLBACK_INVOKE(object->pd->f_source, IDWALK_NOP); + } + if (object->pose) { - bPoseChannel *pose_channel; - for (pose_channel = object->pose->chanbase.first; - pose_channel; - pose_channel = pose_channel->next) - { - CALLBACK_INVOKE(pose_channel->custom, IDWALK_NOP); - BKE_constraints_id_loop(&pose_channel->constraints, - library_foreach_constraintObjectLooper, - &data); + bPoseChannel *pchan; + for (pchan = object->pose->chanbase.first; pchan; pchan = pchan->next) { + CALLBACK_INVOKE(pchan->custom, IDWALK_USER); + BKE_constraints_id_loop(&pchan->constraints, library_foreach_constraintObjectLooper, &data); + } + } + + if (object->rigidbody_constraint) { + CALLBACK_INVOKE(object->rigidbody_constraint->ob1, IDWALK_NOP); + CALLBACK_INVOKE(object->rigidbody_constraint->ob2, IDWALK_NOP); + } + + if (object->lodlevels.first) { + LodLevel *level; + for (level = object->lodlevels.first; level; level = level->next) { + CALLBACK_INVOKE(level->source, IDWALK_NOP); } } - modifiers_foreachIDLink(object, - library_foreach_modifiersForeachIDLink, - &data); - BKE_constraints_id_loop(&object->constraints, - library_foreach_constraintObjectLooper, - &data); + modifiers_foreachIDLink(object, library_foreach_modifiersForeachIDLink, &data); + BKE_constraints_id_loop(&object->constraints, library_foreach_constraintObjectLooper, &data); + + for (psys = object->particlesystem.first; psys; psys = psys->next) { + BKE_particlesystem_id_loop(psys, library_foreach_particlesystemsObjectLooper, &data); + } + + BKE_sca_sensors_id_loop(&object->sensors, library_foreach_sensorsObjectLooper, &data); + BKE_sca_controllers_id_loop(&object->controllers, library_foreach_controllersObjectLooper, &data); + BKE_sca_actuators_id_loop(&object->actuators, library_foreach_actuatorsObjectLooper, &data); break; } case ID_ME: { Mesh *mesh = (Mesh *) id; - CALLBACK_INVOKE(mesh->texcomesh, IDWALK_NOP); - CALLBACK_INVOKE(mesh->key, IDWALK_NOP); + CALLBACK_INVOKE(mesh->texcomesh, IDWALK_USER); + CALLBACK_INVOKE(mesh->key, IDWALK_USER); for (i = 0; i < mesh->totcol; i++) { - CALLBACK_INVOKE(mesh->mat[i], IDWALK_NOP); + CALLBACK_INVOKE(mesh->mat[i], IDWALK_USER); } break; } @@ -290,14 +399,14 @@ void BKE_library_foreach_ID_link(ID *id, LibraryIDLinkCallback callback, void *u CALLBACK_INVOKE(curve->bevobj, IDWALK_NOP); CALLBACK_INVOKE(curve->taperobj, IDWALK_NOP); CALLBACK_INVOKE(curve->textoncurve, IDWALK_NOP); - CALLBACK_INVOKE(curve->key, IDWALK_NOP); + CALLBACK_INVOKE(curve->key, IDWALK_USER); for (i = 0; i < curve->totcol; i++) { - CALLBACK_INVOKE(curve->mat[i], IDWALK_NOP); + CALLBACK_INVOKE(curve->mat[i], IDWALK_USER); } - CALLBACK_INVOKE(curve->vfont, IDWALK_NOP); - CALLBACK_INVOKE(curve->vfontb, IDWALK_NOP); - CALLBACK_INVOKE(curve->vfonti, IDWALK_NOP); - CALLBACK_INVOKE(curve->vfontbi, IDWALK_NOP); + CALLBACK_INVOKE(curve->vfont, IDWALK_USER); + CALLBACK_INVOKE(curve->vfontb, IDWALK_USER); + CALLBACK_INVOKE(curve->vfonti, IDWALK_USER); + CALLBACK_INVOKE(curve->vfontbi, IDWALK_USER); break; } @@ -305,7 +414,7 @@ void BKE_library_foreach_ID_link(ID *id, LibraryIDLinkCallback callback, void *u { MetaBall *metaball = (MetaBall *) id; for (i = 0; i < metaball->totcol; i++) { - CALLBACK_INVOKE(metaball->mat[i], IDWALK_NOP); + CALLBACK_INVOKE(metaball->mat[i], IDWALK_USER); } break; } @@ -319,7 +428,7 @@ void BKE_library_foreach_ID_link(ID *id, LibraryIDLinkCallback callback, void *u } } CALLBACK_INVOKE(material->nodetree, IDWALK_NOP); - CALLBACK_INVOKE(material->group, IDWALK_NOP); + CALLBACK_INVOKE(material->group, IDWALK_USER); break; } @@ -327,14 +436,24 @@ void BKE_library_foreach_ID_link(ID *id, LibraryIDLinkCallback callback, void *u { Tex *texture = (Tex *) id; CALLBACK_INVOKE(texture->nodetree, IDWALK_NOP); - CALLBACK_INVOKE(texture->ima, IDWALK_NOP); + CALLBACK_INVOKE(texture->ima, IDWALK_USER); + if (texture->env) { + CALLBACK_INVOKE(texture->env->object, IDWALK_NOP); + CALLBACK_INVOKE(texture->env->ima, IDWALK_USER); + } + if (texture->pd) + CALLBACK_INVOKE(texture->pd->object, IDWALK_NOP); + if (texture->vd) + CALLBACK_INVOKE(texture->vd->object, IDWALK_NOP); + if (texture->ot) + CALLBACK_INVOKE(texture->ot->object, IDWALK_NOP); break; } case ID_LT: { Lattice *lattice = (Lattice *) id; - CALLBACK_INVOKE(lattice->key, IDWALK_NOP); + CALLBACK_INVOKE(lattice->key, IDWALK_USER); break; } @@ -367,7 +486,7 @@ void BKE_library_foreach_ID_link(ID *id, LibraryIDLinkCallback callback, void *u case ID_SCR: { bScreen *screen = (bScreen *) id; - CALLBACK_INVOKE(screen->scene, IDWALK_NOP); + CALLBACK_INVOKE(screen->scene, IDWALK_USER_ONE); break; } @@ -386,19 +505,16 @@ void BKE_library_foreach_ID_link(ID *id, LibraryIDLinkCallback callback, void *u case ID_SPK: { Speaker *speaker = (Speaker *) id; - CALLBACK_INVOKE(speaker->sound, IDWALK_NOP); + CALLBACK_INVOKE(speaker->sound, IDWALK_USER); break; } case ID_GR: { Group *group = (Group *) id; - GroupObject *group_object; - for (group_object = group->gobject.first; - group_object; - group_object = group_object->next) - { - CALLBACK_INVOKE(group_object->ob, IDWALK_NOP); + GroupObject *gob; + for (gob = group->gobject.first; gob; gob = gob->next) { + CALLBACK_INVOKE(gob->ob, IDWALK_NOP); } break; } @@ -407,8 +523,9 @@ void BKE_library_foreach_ID_link(ID *id, LibraryIDLinkCallback callback, void *u { bNodeTree *ntree = (bNodeTree *) id; bNode *node; + CALLBACK_INVOKE(ntree->gpd, IDWALK_USER); for (node = ntree->nodes.first; node; node = node->next) { - CALLBACK_INVOKE_ID(node->id, IDWALK_NOP); + CALLBACK_INVOKE_ID(node->id, IDWALK_USER); } break; } @@ -417,6 +534,8 @@ void BKE_library_foreach_ID_link(ID *id, LibraryIDLinkCallback callback, void *u { Brush *brush = (Brush *) id; CALLBACK_INVOKE(brush->toggle_brush, IDWALK_NOP); + CALLBACK_INVOKE(brush->clone.image, IDWALK_NOP); + CALLBACK_INVOKE(brush->paint_curve, IDWALK_USER); library_foreach_mtex(&data, &brush->mtex); library_foreach_mtex(&data, &brush->mask_mtex); break; @@ -424,13 +543,39 @@ void BKE_library_foreach_ID_link(ID *id, LibraryIDLinkCallback callback, void *u case ID_PA: { - ParticleSettings *particle_settings = (ParticleSettings *) id; - CALLBACK_INVOKE(particle_settings->dup_group, IDWALK_NOP); - CALLBACK_INVOKE(particle_settings->dup_ob, IDWALK_NOP); - CALLBACK_INVOKE(particle_settings->bb_ob, IDWALK_NOP); - if (particle_settings->effector_weights) { - CALLBACK_INVOKE(particle_settings->effector_weights->group, IDWALK_NOP); + ParticleSettings *psett = (ParticleSettings *) id; + CALLBACK_INVOKE(psett->dup_group, IDWALK_NOP); + CALLBACK_INVOKE(psett->dup_ob, IDWALK_NOP); + CALLBACK_INVOKE(psett->bb_ob, IDWALK_NOP); + + for (i = 0; i < MAX_MTEX; i++) { + if (psett->mtex[i]) { + library_foreach_mtex(&data, psett->mtex[i]); + } + } + + if (psett->effector_weights) { + CALLBACK_INVOKE(psett->effector_weights->group, IDWALK_NOP); + } + + if (psett->boids) { + BoidState *state; + BoidRule *rule; + + for (state = psett->boids->states.first; state; state = state->next) { + for (rule = state->rules.first; rule; rule = rule->next) { + if (rule->type == eBoidRuleType_Avoid) { + BoidRuleGoalAvoid *gabr = (BoidRuleGoalAvoid *)rule; + CALLBACK_INVOKE(gabr->ob, IDWALK_NOP); + } + else if (rule->type == eBoidRuleType_FollowLeader) { + BoidRuleFollowLeader *flbr = (BoidRuleFollowLeader *)rule; + CALLBACK_INVOKE(flbr->ob, IDWALK_NOP); + } + } + } } + break; } @@ -439,18 +584,14 @@ void BKE_library_foreach_ID_link(ID *id, LibraryIDLinkCallback callback, void *u MovieClip *clip = (MovieClip *) id; MovieTracking *tracking = &clip->tracking; MovieTrackingObject *object; - CALLBACK_INVOKE(clip->gpd, IDWALK_NOP); - for (object = tracking->objects.first; - object; - object = object->next) - { + + CALLBACK_INVOKE(clip->gpd, IDWALK_USER); + for (object = tracking->objects.first; object; object = object->next) { ListBase *tracksbase = BKE_tracking_object_get_tracks(tracking, object); MovieTrackingTrack *track; - for (track = tracksbase->first; - track; - track = track->next) - { - CALLBACK_INVOKE(track->gpd, IDWALK_NOP); + + for (track = tracksbase->first; track; track = track->next) { + CALLBACK_INVOKE(track->gpd, IDWALK_USER); } } break; @@ -460,20 +601,13 @@ void BKE_library_foreach_ID_link(ID *id, LibraryIDLinkCallback callback, void *u { Mask *mask = (Mask *) id; MaskLayer *mask_layer; - for (mask_layer = mask->masklayers.first; - mask_layer; - mask_layer = mask_layer->next) - { + for (mask_layer = mask->masklayers.first; mask_layer; mask_layer = mask_layer->next) { MaskSpline *mask_spline; - for (mask_spline = mask_layer->splines.first; - mask_spline; - mask_spline = mask_spline->next) - { - int i; + for (mask_spline = mask_layer->splines.first; mask_spline; mask_spline = mask_spline->next) { for (i = 0; i < mask_spline->tot_point; i++) { MaskSplinePoint *point = &mask_spline->points[i]; - CALLBACK_INVOKE_ID(point->parent.id, IDWALK_NOP); + CALLBACK_INVOKE_ID(point->parent.id, IDWALK_USER); } } } @@ -483,7 +617,7 @@ void BKE_library_foreach_ID_link(ID *id, LibraryIDLinkCallback callback, void *u case ID_LS: { FreestyleLineStyle *linestyle = (FreestyleLineStyle *) id; - LineStyleModifier *m; + LineStyleModifier *lsm; for (i = 0; i < MAX_MTEX; i++) { if (linestyle->mtex[i]) { library_foreach_mtex(&data, linestyle->mtex[i]); @@ -491,25 +625,25 @@ void BKE_library_foreach_ID_link(ID *id, LibraryIDLinkCallback callback, void *u } CALLBACK_INVOKE(linestyle->nodetree, IDWALK_NOP); - for (m = (LineStyleModifier *)linestyle->color_modifiers.first; m; m = m->next) { - if (m->type == LS_MODIFIER_DISTANCE_FROM_OBJECT) { - LineStyleColorModifier_DistanceFromObject *p = (LineStyleColorModifier_DistanceFromObject *)m; + for (lsm = linestyle->color_modifiers.first; lsm; lsm = lsm->next) { + if (lsm->type == LS_MODIFIER_DISTANCE_FROM_OBJECT) { + LineStyleColorModifier_DistanceFromObject *p = (LineStyleColorModifier_DistanceFromObject *)lsm; if (p->target) { CALLBACK_INVOKE(p->target, IDWALK_NOP); } } } - for (m = (LineStyleModifier *)linestyle->alpha_modifiers.first; m; m = m->next) { - if (m->type == LS_MODIFIER_DISTANCE_FROM_OBJECT) { - LineStyleAlphaModifier_DistanceFromObject *p = (LineStyleAlphaModifier_DistanceFromObject *)m; + for (lsm = linestyle->alpha_modifiers.first; lsm; lsm = lsm->next) { + if (lsm->type == LS_MODIFIER_DISTANCE_FROM_OBJECT) { + LineStyleAlphaModifier_DistanceFromObject *p = (LineStyleAlphaModifier_DistanceFromObject *)lsm; if (p->target) { CALLBACK_INVOKE(p->target, IDWALK_NOP); } } } - for (m = (LineStyleModifier *)linestyle->thickness_modifiers.first; m; m = m->next) { - if (m->type == LS_MODIFIER_DISTANCE_FROM_OBJECT) { - LineStyleThicknessModifier_DistanceFromObject *p = (LineStyleThicknessModifier_DistanceFromObject *)m; + for (lsm = linestyle->thickness_modifiers.first; lsm; lsm = lsm->next) { + if (lsm->type == LS_MODIFIER_DISTANCE_FROM_OBJECT) { + LineStyleThicknessModifier_DistanceFromObject *p = (LineStyleThicknessModifier_DistanceFromObject *)lsm; if (p->target) { CALLBACK_INVOKE(p->target, IDWALK_NOP); } @@ -517,7 +651,6 @@ void BKE_library_foreach_ID_link(ID *id, LibraryIDLinkCallback callback, void *u } break; } - } #undef CALLBACK_INVOKE_ID @@ -526,3 +659,19 @@ void BKE_library_foreach_ID_link(ID *id, LibraryIDLinkCallback callback, void *u #undef FOREACH_CALLBACK_INVOKE_ID #undef FOREACH_CALLBACK_INVOKE + +/** + * re-usable function, use when replacing ID's + */ +void BKE_library_update_ID_link_user(ID *id_dst, ID *id_src, const int cd_flag) +{ + if (cd_flag & IDWALK_USER) { + id_us_min(id_src); + id_us_plus(id_dst); + } + else if (cd_flag & IDWALK_USER_ONE) { + if (id_dst->us == 0) { + id_us_plus(id_dst); + } + } +} diff --git a/source/blender/blenkernel/intern/linestyle.c b/source/blender/blenkernel/intern/linestyle.c index ac2c4e35dce..93d2b549fee 100644 --- a/source/blender/blenkernel/intern/linestyle.c +++ b/source/blender/blenkernel/intern/linestyle.c @@ -80,8 +80,10 @@ static const char *modifier_name[LS_MODIFIER_NUM] = { "3D Curvature", }; -static void default_linestyle_settings(FreestyleLineStyle *linestyle) +void BKE_linestyle_init(FreestyleLineStyle *linestyle) { + BLI_assert(MEMCMP_STRUCT_OFS_IS_ZERO(linestyle, id)); + linestyle->panel = LS_PANEL_STROKES; linestyle->r = linestyle->g = linestyle->b = 0.0f; linestyle->alpha = 1.0f; @@ -118,7 +120,7 @@ FreestyleLineStyle *BKE_linestyle_new(struct Main *bmain, const char *name) linestyle = (FreestyleLineStyle *)BKE_libblock_alloc(bmain, ID_LS, name); - default_linestyle_settings(linestyle); + BKE_linestyle_init(linestyle); return linestyle; } diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c index 3e7e98b4a1d..a69b5fd87b5 100644 --- a/source/blender/blenkernel/intern/material.c +++ b/source/blender/blenkernel/intern/material.c @@ -78,7 +78,7 @@ Material defmaterial; /* called on startup, creator.c */ void init_def_material(void) { - init_material(&defmaterial); + BKE_material_init(&defmaterial); } /* not material itself */ @@ -122,8 +122,10 @@ void BKE_material_free_ex(Material *ma, bool do_id_user) GPU_material_free(&ma->gpumaterial); } -void init_material(Material *ma) +void BKE_material_init(Material *ma) { + BLI_assert(MEMCMP_STRUCT_OFS_IS_ZERO(ma, id)); + ma->r = ma->g = ma->b = ma->ref = 0.8; ma->specr = ma->specg = ma->specb = 1.0; ma->mirr = ma->mirg = ma->mirb = 1.0; @@ -221,7 +223,7 @@ Material *BKE_material_add(Main *bmain, const char *name) ma = BKE_libblock_alloc(bmain, ID_MA, name); - init_material(ma); + BKE_material_init(ma); return ma; } diff --git a/source/blender/blenkernel/intern/mball.c b/source/blender/blenkernel/intern/mball.c index c09cd1aabdc..bd9fd331584 100644 --- a/source/blender/blenkernel/intern/mball.c +++ b/source/blender/blenkernel/intern/mball.c @@ -91,19 +91,26 @@ void BKE_mball_free(MetaBall *mb) if (mb->disp.first) BKE_displist_free(&mb->disp); } -MetaBall *BKE_mball_add(Main *bmain, const char *name) +void BKE_mball_init(MetaBall *mb) { - MetaBall *mb; - - mb = BKE_libblock_alloc(bmain, ID_MB, name); - + BLI_assert(MEMCMP_STRUCT_OFS_IS_ZERO(mb, id)); + mb->size[0] = mb->size[1] = mb->size[2] = 1.0; mb->texflag = MB_AUTOSPACE; mb->wiresize = 0.4f; mb->rendersize = 0.2f; mb->thresh = 0.6f; - +} + +MetaBall *BKE_mball_add(Main *bmain, const char *name) +{ + MetaBall *mb; + + mb = BKE_libblock_alloc(bmain, ID_MB, name); + + BKE_mball_init(mb); + return mb; } diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c index 8c89a724975..318040db2be 100644 --- a/source/blender/blenkernel/intern/mesh.c +++ b/source/blender/blenkernel/intern/mesh.c @@ -490,12 +490,10 @@ static void mesh_tessface_clear_intern(Mesh *mesh, int free_customdata) mesh->totface = 0; } -Mesh *BKE_mesh_add(Main *bmain, const char *name) +void BKE_mesh_init(Mesh *me) { - Mesh *me; - - me = BKE_libblock_alloc(bmain, ID_ME, name); - + BLI_assert(MEMCMP_STRUCT_OFS_IS_ZERO(me, id)); + me->size[0] = me->size[1] = me->size[2] = 1.0; me->smoothresh = 30; me->texflag = ME_AUTOSPACE; @@ -511,6 +509,15 @@ Mesh *BKE_mesh_add(Main *bmain, const char *name) CustomData_reset(&me->fdata); CustomData_reset(&me->pdata); CustomData_reset(&me->ldata); +} + +Mesh *BKE_mesh_add(Main *bmain, const char *name) +{ + Mesh *me; + + me = BKE_libblock_alloc(bmain, ID_ME, name); + + BKE_mesh_init(me); return me; } @@ -2199,8 +2206,9 @@ void BKE_mesh_calc_normals_split(Mesh *mesh) } else { polynors = MEM_mallocN(sizeof(float[3]) * mesh->totpoly, __func__); - BKE_mesh_calc_normals_poly(mesh->mvert, mesh->totvert, mesh->mloop, mesh->mpoly, mesh->totloop, mesh->totpoly, - polynors, false); + BKE_mesh_calc_normals_poly( + mesh->mvert, NULL, mesh->totvert, + mesh->mloop, mesh->mpoly, mesh->totloop, mesh->totpoly, polynors, false); free_polynors = true; } diff --git a/source/blender/blenkernel/intern/mesh_evaluate.c b/source/blender/blenkernel/intern/mesh_evaluate.c index 2fc535061ac..a65ac5151a8 100644 --- a/source/blender/blenkernel/intern/mesh_evaluate.c +++ b/source/blender/blenkernel/intern/mesh_evaluate.c @@ -133,7 +133,7 @@ void BKE_mesh_calc_normals_mapping_ex( if (only_face_normals == false) { /* vertex normals are optional, they require some extra calculations, * so make them optional */ - BKE_mesh_calc_normals_poly(mverts, numVerts, mloop, mpolys, numLoops, numPolys, pnors, false); + BKE_mesh_calc_normals_poly(mverts, NULL, numVerts, mloop, mpolys, numLoops, numPolys, pnors, false); } else { /* only calc poly normals */ @@ -222,18 +222,20 @@ static void mesh_calc_normals_poly_accum( } void BKE_mesh_calc_normals_poly( - MVert *mverts, int numVerts, + MVert *mverts, float (*r_vertnors)[3], int numVerts, const MLoop *mloop, const MPoly *mpolys, int UNUSED(numLoops), int numPolys, float (*r_polynors)[3], const bool only_face_normals) { float (*pnors)[3] = r_polynors; - float (*tnorms)[3]; + float (*vnors)[3] = r_vertnors; + bool free_vnors = false; int i; const MPoly *mp; if (only_face_normals) { BLI_assert((pnors != NULL) || (numPolys == 0)); + BLI_assert(r_vertnors == NULL); #pragma omp parallel for if (numPolys > BKE_MESH_OMP_LIMIT) for (i = 0; i < numPolys; i++) { @@ -243,25 +245,30 @@ void BKE_mesh_calc_normals_poly( } /* first go through and calculate normals for all the polys */ - tnorms = MEM_callocN(sizeof(*tnorms) * (size_t)numVerts, __func__); + if (vnors == NULL) { + vnors = MEM_callocN(sizeof(*vnors) * (size_t)numVerts, __func__); + free_vnors = true; + } + else { + memset(vnors, 0, sizeof(*vnors) * (size_t)numVerts); + } + mp = mpolys; if (pnors) { - mp = mpolys; for (i = 0; i < numPolys; i++, mp++) { - mesh_calc_normals_poly_accum(mp, mloop + mp->loopstart, mverts, pnors[i], tnorms); + mesh_calc_normals_poly_accum(mp, mloop + mp->loopstart, mverts, pnors[i], vnors); } } else { float tpnor[3]; /* temp poly normal */ - mp = mpolys; for (i = 0; i < numPolys; i++, mp++) { - mesh_calc_normals_poly_accum(mp, mloop + mp->loopstart, mverts, tpnor, tnorms); + mesh_calc_normals_poly_accum(mp, mloop + mp->loopstart, mverts, tpnor, vnors); } } for (i = 0; i < numVerts; i++) { MVert *mv = &mverts[i]; - float *no = tnorms[i]; + float *no = vnors[i]; if (UNLIKELY(normalize_v3(no) == 0.0f)) { /* following Mesh convention; we use vertex coordinate itself for normal in this case */ @@ -271,7 +278,9 @@ void BKE_mesh_calc_normals_poly( normal_float_to_short_v3(mv->no, no); } - MEM_freeN(tnorms); + if (free_vnors) { + MEM_freeN(vnors); + } } void BKE_mesh_calc_normals(Mesh *mesh) @@ -279,7 +288,7 @@ void BKE_mesh_calc_normals(Mesh *mesh) #ifdef DEBUG_TIME TIMEIT_START(BKE_mesh_calc_normals); #endif - BKE_mesh_calc_normals_poly(mesh->mvert, mesh->totvert, + BKE_mesh_calc_normals_poly(mesh->mvert, NULL, mesh->totvert, mesh->mloop, mesh->mpoly, mesh->totloop, mesh->totpoly, NULL, false); #ifdef DEBUG_TIME diff --git a/source/blender/blenkernel/intern/mesh_mapping.c b/source/blender/blenkernel/intern/mesh_mapping.c index cf4c49a9244..8dce3c372f6 100644 --- a/source/blender/blenkernel/intern/mesh_mapping.c +++ b/source/blender/blenkernel/intern/mesh_mapping.c @@ -97,7 +97,7 @@ UvVertMap *BKE_mesh_uv_vert_map_create( float (*tf_uv)[2] = NULL; if (use_winding) { - tf_uv = (float (*)[2])BLI_buffer_resize_data(&tf_uv_buf, vec2f, mp->totloop); + tf_uv = (float (*)[2])BLI_buffer_reinit_data(&tf_uv_buf, vec2f, (size_t)mp->totloop); } nverts = mp->totloop; diff --git a/source/blender/blenkernel/intern/mesh_remap.c b/source/blender/blenkernel/intern/mesh_remap.c index c3b88b84b8b..258131f46ed 100644 --- a/source/blender/blenkernel/intern/mesh_remap.c +++ b/source/blender/blenkernel/intern/mesh_remap.c @@ -455,14 +455,13 @@ void BKE_mesh_remap_calc_verts_from_dm( BVHTreeNearest nearest = {0}; BVHTreeRayHit rayhit = {0}; float hit_dist; + float tmp_co[3], tmp_no[3]; if (mode == MREMAP_MODE_VERT_NEAREST) { bvhtree_from_mesh_verts(&treedata, dm_src, 0.0f, 2, 6); nearest.index = -1; for (i = 0; i < numverts_dst; i++) { - float tmp_co[3]; - copy_v3_v3(tmp_co, verts_dst[i].co); /* Convert the vertex to tree coordinates, if needed. */ @@ -488,8 +487,6 @@ void BKE_mesh_remap_calc_verts_from_dm( nearest.index = -1; for (i = 0; i < numverts_dst; i++) { - float tmp_co[3]; - copy_v3_v3(tmp_co, verts_dst[i].co); /* Convert the vertex to tree coordinates, if needed. */ @@ -548,8 +545,6 @@ void BKE_mesh_remap_calc_verts_from_dm( if (mode == MREMAP_MODE_VERT_POLYINTERP_VNORPROJ) { for (i = 0; i < numverts_dst; i++) { - float tmp_co[3], tmp_no[3]; - copy_v3_v3(tmp_co, verts_dst[i].co); normal_short_to_float_v3(tmp_no, verts_dst[i].no); @@ -580,8 +575,6 @@ void BKE_mesh_remap_calc_verts_from_dm( nearest.index = -1; for (i = 0; i < numverts_dst; i++) { - float tmp_co[3]; - copy_v3_v3(tmp_co, verts_dst[i].co); /* Convert the vertex to tree coordinates, if needed. */ @@ -656,6 +649,7 @@ void BKE_mesh_remap_calc_edges_from_dm( BVHTreeNearest nearest = {0}; BVHTreeRayHit rayhit = {0}; float hit_dist; + float tmp_co[3], tmp_no[3]; if (mode == MREMAP_MODE_EDGE_VERT_NEAREST) { const int num_verts_src = dm_src->getNumVerts(dm_src); @@ -694,8 +688,6 @@ void BKE_mesh_remap_calc_edges_from_dm( /* Compute closest verts only once! */ if (v_dst_to_src_map[vidx_dst].hit_dist == -1.0f) { - float tmp_co[3]; - copy_v3_v3(tmp_co, verts_dst[vidx_dst].co); /* Convert the vertex to tree coordinates, if needed. */ @@ -786,8 +778,6 @@ void BKE_mesh_remap_calc_edges_from_dm( nearest.index = -1; for (i = 0; i < numedges_dst; i++) { - float tmp_co[3]; - interp_v3_v3v3(tmp_co, verts_dst[edges_dst[i].v1].co, verts_dst[edges_dst[i].v2].co, 0.5f); /* Convert the vertex to tree coordinates, if needed. */ @@ -814,8 +804,6 @@ void BKE_mesh_remap_calc_edges_from_dm( bvhtree_from_mesh_looptri(&treedata, dm_src, 0.0f, 2, 6); for (i = 0; i < numedges_dst; i++) { - float tmp_co[3]; - interp_v3_v3v3(tmp_co, verts_dst[edges_dst[i].v1].co, verts_dst[edges_dst[i].v2].co, 0.5f); /* Convert the vertex to tree coordinates, if needed. */ @@ -872,8 +860,8 @@ void BKE_mesh_remap_calc_edges_from_dm( /* For each dst edge, we sample some rays from it (interpolated from its vertices) * and use their hits to interpolate from source edges. */ const MEdge *me = &edges_dst[i]; - float tmp_co[3], v1_co[3], v2_co[3]; - float tmp_no[3], v1_no[3], v2_no[3]; + float v1_co[3], v2_co[3]; + float v1_no[3], v2_no[3]; int grid_size; float edge_dst_len; @@ -1150,6 +1138,7 @@ void BKE_mesh_remap_calc_loops_from_dm( BVHTreeRayHit rayhit = {0}; int num_trees = 0; float hit_dist; + float tmp_co[3], tmp_no[3]; const bool use_from_vert = (mode & MREMAP_USE_VERT); @@ -1234,7 +1223,7 @@ void BKE_mesh_remap_calc_loops_from_dm( CustomData_set_layer_flag(pdata_dst, CD_NORMAL, CD_FLAG_TEMPORARY); } if (dirty_nors_dst) { - BKE_mesh_calc_normals_poly(verts_dst, numverts_dst, loops_dst, polys_dst, + BKE_mesh_calc_normals_poly(verts_dst, NULL, numverts_dst, loops_dst, polys_dst, numloops_dst, numpolys_dst, poly_nors_dst, true); } } @@ -1440,13 +1429,18 @@ void BKE_mesh_remap_calc_loops_from_dm( } for (pidx_dst = 0, mp_dst = polys_dst; pidx_dst < numpolys_dst; pidx_dst++, mp_dst++) { - float (*pnor_dst)[3] = &poly_nors_dst[pidx_dst]; + float pnor_dst[3]; /* Only in use_from_vert case, we may need polys' centers as fallback in case we cannot decide which * corner to use from normals only. */ float pcent_dst[3]; bool pcent_dst_valid = false; + if (mode == MREMAP_MODE_LOOP_NEAREST_POLYNOR) { + copy_v3_v3(pnor_dst, poly_nors_dst[pidx_dst]); + BLI_space_transform_apply_normal(space_transform, pnor_dst); + } + if ((size_t)mp_dst->totloop > islands_res_buff_size) { islands_res_buff_size = (size_t)mp_dst->totloop + MREMAP_DEFAULT_BUFSIZE; for (tindex = 0; tindex < num_trees; tindex++) { @@ -1460,7 +1454,6 @@ void BKE_mesh_remap_calc_loops_from_dm( ml_dst = &loops_dst[mp_dst->loopstart]; for (plidx_dst = 0; plidx_dst < mp_dst->totloop; plidx_dst++, ml_dst++) { if (use_from_vert) { - float tmp_co[3]; MeshElemMap *vert_to_refelem_map_src = NULL; copy_v3_v3(tmp_co, verts_dst[ml_dst->v].co); @@ -1479,12 +1472,14 @@ void BKE_mesh_remap_calc_loops_from_dm( int best_index_src = -1; if (mode == MREMAP_MODE_LOOP_NEAREST_LOOPNOR) { - nor_dst = &loop_nors_dst[plidx_dst + mp_dst->loopstart]; + copy_v3_v3(tmp_no, loop_nors_dst[plidx_dst + mp_dst->loopstart]); + BLI_space_transform_apply_normal(space_transform, tmp_no); + nor_dst = &tmp_no; nors_src = loop_nors_src; vert_to_refelem_map_src = vert_to_loop_map_src; } else { /* if (mode == MREMAP_MODE_LOOP_NEAREST_POLYNOR) { */ - nor_dst = pnor_dst; + nor_dst = &pnor_dst; nors_src = poly_nors_src; vert_to_refelem_map_src = vert_to_poly_map_src; } @@ -1556,8 +1551,6 @@ void BKE_mesh_remap_calc_loops_from_dm( } } else if (mode & MREMAP_USE_NORPROJ) { - float tmp_co[3], tmp_no[3]; - int n = (ray_radius > 0.0f) ? MREMAP_RAYCAST_APPROXIMATE_NR : 1; float w = 1.0f; @@ -1615,8 +1608,6 @@ void BKE_mesh_remap_calc_loops_from_dm( } } else { /* Nearest poly either to use all its loops/verts or just closest one. */ - float tmp_co[3]; - copy_v3_v3(tmp_co, verts_dst[ml_dst->v].co); nearest.index = -1; @@ -1739,7 +1730,6 @@ void BKE_mesh_remap_calc_loops_from_dm( * Note we could be much more subtle here, again that's for later... */ int j; float best_dist_sq = FLT_MAX; - float tmp_co[3]; ml_dst = &loops_dst[lidx_dst]; copy_v3_v3(tmp_co, verts_dst[ml_dst->v].co); @@ -1824,7 +1814,6 @@ void BKE_mesh_remap_calc_loops_from_dm( /* Find a new valid loop in that new poly (nearest point on poly for now). * Note we could be much more subtle here, again that's for later... */ float best_dist_sq = FLT_MAX; - float tmp_co[3]; int j; ml_dst = &loops_dst[lidx_dst]; @@ -1987,6 +1976,7 @@ void BKE_mesh_remap_calc_polys_from_dm( const float full_weight = 1.0f; const float max_dist_sq = max_dist * max_dist; float (*poly_nors_dst)[3] = NULL; + float tmp_co[3], tmp_no[3]; int i; BLI_assert(mode & MREMAP_MODE_POLY); @@ -1999,7 +1989,7 @@ void BKE_mesh_remap_calc_polys_from_dm( CustomData_set_layer_flag(pdata_dst, CD_NORMAL, CD_FLAG_TEMPORARY); } if (dirty_nors_dst) { - BKE_mesh_calc_normals_poly(verts_dst, numverts_dst, loops_dst, polys_dst, numloops_dst, numpolys_dst, + BKE_mesh_calc_normals_poly(verts_dst, NULL, numverts_dst, loops_dst, polys_dst, numloops_dst, numpolys_dst, poly_nors_dst, true); } } @@ -2028,7 +2018,6 @@ void BKE_mesh_remap_calc_polys_from_dm( for (i = 0; i < numpolys_dst; i++) { MPoly *mp = &polys_dst[i]; - float tmp_co[3]; BKE_mesh_calc_poly_center(mp, &loops_dst[mp->loopstart], verts_dst, tmp_co); @@ -2055,7 +2044,6 @@ void BKE_mesh_remap_calc_polys_from_dm( for (i = 0; i < numpolys_dst; i++) { MPoly *mp = &polys_dst[i]; - float tmp_co[3], tmp_no[3]; BKE_mesh_calc_poly_center(mp, &loops_dst[mp->loopstart], verts_dst, tmp_co); copy_v3_v3(tmp_no, poly_nors_dst[i]); @@ -2104,7 +2092,6 @@ void BKE_mesh_remap_calc_polys_from_dm( * and use their hits to interpolate from source polys. */ /* Note: dst poly is early-converted into src space! */ MPoly *mp = &polys_dst[i]; - float tmp_co[3], tmp_no[3]; int tot_rays, done_rays = 0; float poly_area_2d_inv, done_area = 0.0f; diff --git a/source/blender/blenkernel/intern/mesh_validate.c b/source/blender/blenkernel/intern/mesh_validate.c index e21dde9c726..ab469ac3996 100644 --- a/source/blender/blenkernel/intern/mesh_validate.c +++ b/source/blender/blenkernel/intern/mesh_validate.c @@ -241,6 +241,7 @@ bool BKE_mesh_validate_arrays(Mesh *mesh, struct { int verts : 1; int verts_weight : 1; + int loops_edge : 1; }; int as_flag; } fix_flag; @@ -564,6 +565,7 @@ bool BKE_mesh_validate_arrays(Mesh *mesh, if (do_fixes) { int prev_e = ml->e; ml->e = GET_INT_FROM_POINTER(BLI_edgehash_lookup(edge_hash, v1, v2)); + fix_flag.loops_edge = true; PRINT_ERR("\tLoop %u has invalid edge reference (%d), fixed using edge %u\n", sp->loopstart + j, prev_e, ml->e); } @@ -580,6 +582,7 @@ bool BKE_mesh_validate_arrays(Mesh *mesh, if (do_fixes) { int prev_e = ml->e; ml->e = GET_INT_FROM_POINTER(BLI_edgehash_lookup(edge_hash, v1, v2)); + fix_flag.loops_edge = true; PRINT_ERR("\tPoly %u has invalid edge reference (%d), fixed using edge %u\n", sp->index, prev_e, ml->e); } diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c index b2c0c6d6d0a..716da14cae6 100644 --- a/source/blender/blenkernel/intern/modifier.c +++ b/source/blender/blenkernel/intern/modifier.c @@ -215,8 +215,7 @@ void modifiers_clearErrors(Object *ob) } } -void modifiers_foreachObjectLink(Object *ob, ObjectWalkFunc walk, - void *userData) +void modifiers_foreachObjectLink(Object *ob, ObjectWalkFunc walk, void *userData) { ModifierData *md = ob->modifiers.first; diff --git a/source/blender/blenkernel/intern/movieclip.c b/source/blender/blenkernel/intern/movieclip.c index 7a8c4ad4564..432ae32f02b 100644 --- a/source/blender/blenkernel/intern/movieclip.c +++ b/source/blender/blenkernel/intern/movieclip.c @@ -603,9 +603,8 @@ static void detect_clip_source(MovieClip *clip) MovieClip *BKE_movieclip_file_add(Main *bmain, const char *name) { MovieClip *clip; - int file, len; - const char *libname; - char str[FILE_MAX], strtest[FILE_MAX]; + int file; + char str[FILE_MAX]; BLI_strncpy(str, name, sizeof(str)); BLI_path_abs(str, bmain->name); @@ -616,29 +615,10 @@ MovieClip *BKE_movieclip_file_add(Main *bmain, const char *name) return NULL; close(file); - /* ** first search an identical clip ** */ - for (clip = bmain->movieclip.first; clip; clip = clip->id.next) { - BLI_strncpy(strtest, clip->name, sizeof(clip->name)); - BLI_path_abs(strtest, G.main->name); - - if (STREQ(strtest, str)) { - BLI_strncpy(clip->name, name, sizeof(clip->name)); /* for stringcode */ - clip->id.us++; /* officially should not, it doesn't link here! */ - - return clip; - } - } - /* ** add new movieclip ** */ /* create a short library name */ - len = strlen(name); - - while (len > 0 && name[len - 1] != '/' && name[len - 1] != '\\') - len--; - libname = name + len; - - clip = movieclip_alloc(bmain, libname); + clip = movieclip_alloc(bmain, BLI_path_basename(name)); BLI_strncpy(clip->name, name, sizeof(clip->name)); detect_clip_source(clip); @@ -655,6 +635,37 @@ MovieClip *BKE_movieclip_file_add(Main *bmain, const char *name) return clip; } +MovieClip *BKE_movieclip_file_add_exists_ex(Main *bmain, const char *filepath, bool *r_exists) +{ + MovieClip *clip; + char str[FILE_MAX], strtest[FILE_MAX]; + + BLI_strncpy(str, filepath, sizeof(str)); + BLI_path_abs(str, bmain->name); + + /* first search an identical filepath */ + for (clip = bmain->movieclip.first; clip; clip = clip->id.next) { + BLI_strncpy(strtest, clip->name, sizeof(clip->name)); + BLI_path_abs(strtest, ID_BLEND_PATH(bmain, &clip->id)); + + if (BLI_path_cmp(strtest, str) == 0) { + clip->id.us++; /* officially should not, it doesn't link here! */ + if (r_exists) + *r_exists = true; + return clip; + } + } + + if (r_exists) + *r_exists = false; + return BKE_movieclip_file_add(bmain, filepath); +} + +MovieClip *BKE_movieclip_file_add_exists(Main *bmain, const char *filepath) +{ + return BKE_movieclip_file_add_exists_ex(bmain, filepath, NULL); +} + static void real_ibuf_size(MovieClip *clip, MovieClipUser *user, ImBuf *ibuf, int *width, int *height) { *width = ibuf->x; @@ -847,7 +858,7 @@ static ImBuf *movieclip_get_postprocessed_ibuf(MovieClip *clip, MovieClipUser *u bool need_postprocess = false; /* cache isn't threadsafe itself and also loading of movies - * can't happen from concurent threads that's why we use lock here */ + * can't happen from concurrent threads that's why we use lock here */ BLI_lock_thread(LOCK_MOVIECLIP); /* try to obtain cached postprocessed frame first */ diff --git a/source/blender/blenkernel/intern/nla.c b/source/blender/blenkernel/intern/nla.c index a04eb9bd611..65245477c7f 100644 --- a/source/blender/blenkernel/intern/nla.c +++ b/source/blender/blenkernel/intern/nla.c @@ -1178,7 +1178,34 @@ static void nlastrip_fix_resize_overlaps(NlaStrip *strip) NlaStrip *nls = strip->next; float offset = 0.0f; - if (strip->end > nls->start) { + if (nls->type == NLASTRIP_TYPE_TRANSITION) { + /* transition strips should grow/shrink to accomodate the resized strip, + * but if the strip's bounds now exceed the transition, we're forced to + * offset everything to maintain the balance + */ + if (strip->end <= nls->start) { + /* grow the transition to fill the void */ + nls->start = strip->end; + } + else if (strip->end < nls->end) { + /* shrink the transition to give the strip room */ + nls->start = strip->end; + } + else { + /* shrink transition down to 1 frame long (so that it can still be found), + * then offset everything else by the remaining defict to give the strip room + */ + nls->start = nls->end - 1.0f; + offset = ceilf(strip->end - nls->start); /* XXX: review whether preventing fractionals is good here... */ + + /* apply necessary offset to ensure that the strip has enough space */ + for (; nls; nls = nls->next) { + nls->start += offset; + nls->end += offset; + } + } + } + else if (strip->end > nls->start) { /* NOTE: need to ensure we don't have a fractional frame offset, even if that leaves a gap, * otherwise it will be very hard to get rid of later */ @@ -1198,7 +1225,34 @@ static void nlastrip_fix_resize_overlaps(NlaStrip *strip) NlaStrip *nls = strip->prev; float offset = 0.0f; - if (strip->start < nls->end) { + if (nls->type == NLASTRIP_TYPE_TRANSITION) { + /* transition strips should grow/shrink to accomodate the resized strip, + * but if the strip's bounds now exceed the transition, we're forced to + * offset everything to maintain the balance + */ + if (strip->start >= nls->end) { + /* grow the transition to fill the void */ + nls->end = strip->start; + } + else if (strip->start > nls->start) { + /* shrink the transition to give the strip room */ + nls->end = strip->start; + } + else { + /* shrink transition down to 1 frame long (so that it can still be found), + * then offset everything else by the remaining defict to give the strip room + */ + nls->end = nls->start + 1.0f; + offset = ceilf(nls->end - strip->start); /* XXX: review whether preventing fractionals is good here... */ + + /* apply necessary offset to ensure that the strip has enough space */ + for (; nls; nls = nls->next) { + nls->start -= offset; + nls->end -= offset; + } + } + } + else if (strip->start < nls->end) { /* NOTE: need to ensure we don't have a fractional frame offset, even if that leaves a gap, * otherwise it will be very hard to get rid of later */ @@ -1778,7 +1832,7 @@ bool BKE_nla_tweakmode_enter(AnimData *adt) } return false; } - + /* go over all the tracks up to the active one, tagging each strip that uses the same * action as the active strip, but leaving everything else alone */ @@ -1791,6 +1845,13 @@ bool BKE_nla_tweakmode_enter(AnimData *adt) } } + /* tag all other strips in active track that uses the same action as the active strip */ + for (strip = activeTrack->strips.first; strip; strip = strip->next) { + if ((strip->act == activeStrip->act) && (strip != activeStrip)) + strip->flag |= NLASTRIP_FLAG_TWEAKUSER; + else + strip->flag &= ~NLASTRIP_FLAG_TWEAKUSER; + } /* go over all the tracks after AND INCLUDING the active one, tagging them as being disabled * - the active track needs to also be tagged, otherwise, it'll overlap with the tweaks going on @@ -1852,8 +1913,19 @@ void BKE_nla_tweakmode_exit(AnimData *adt) for (nlt = adt->nla_tracks.first; nlt; nlt = nlt->next) { nlt->flag &= ~NLATRACK_DISABLED; - for (strip = nlt->strips.first; strip; strip = strip->next) + for (strip = nlt->strips.first; strip; strip = strip->next) { + /* sync strip extents if this strip uses the same action */ + if ((adt->actstrip) && (adt->actstrip->act == strip->act) && (strip->flag & NLASTRIP_FLAG_SYNC_LENGTH)) { + /* recalculate the length of the action */ + calc_action_range(strip->act, &strip->actstart, &strip->actend, 0); + + /* adjust the strip extents in response to this */ + BKE_nlastrip_recalculate_bounds(strip); + } + + /* clear tweakuser flag */ strip->flag &= ~NLASTRIP_FLAG_TWEAKUSER; + } } /* handle AnimData level changes: diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c index c656931d18b..d3460dcb481 100644 --- a/source/blender/blenkernel/intern/node.c +++ b/source/blender/blenkernel/intern/node.c @@ -1151,6 +1151,11 @@ void nodeDetachNode(struct bNode *node) } } +void ntreeInitDefault(bNodeTree *ntree) +{ + ntree_set_typeinfo(ntree, NULL); +} + bNodeTree *ntreeAddTree(Main *bmain, const char *name, const char *idname) { bNodeTree *ntree; diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c index 476c2ed3539..e56887b0a1c 100644 --- a/source/blender/blenkernel/intern/object.c +++ b/source/blender/blenkernel/intern/object.c @@ -471,7 +471,7 @@ void BKE_object_free(Object *ob) BKE_object_free_ex(ob, true); } -static void unlink_object__unlinkModifierLinks(void *userData, Object *ob, Object **obpoin) +static void unlink_object__unlinkModifierLinks(void *userData, Object *ob, Object **obpoin, int UNUSED(cd_flag)) { Object *unlinkOb = userData; @@ -976,19 +976,10 @@ void *BKE_object_obdata_add_from_type(Main *bmain, int type, const char *name) } } -/* more general add: creates minimum required data, but without vertices etc. */ -Object *BKE_object_add_only_object(Main *bmain, int type, const char *name) +void BKE_object_init(Object *ob) { - Object *ob; - - if (!name) - name = get_obdata_defname(type); + /* BLI_assert(MEMCMP_STRUCT_OFS_IS_ZERO(ob, id)); */ /* ob->type is already initialized... */ - ob = BKE_libblock_alloc(bmain, ID_OB, name); - - /* default object vars */ - ob->type = type; - ob->col[0] = ob->col[1] = ob->col[2] = 1.0; ob->col[3] = 1.0; @@ -1016,7 +1007,7 @@ Object *BKE_object_add_only_object(Main *bmain, int type, const char *name) ob->empty_drawtype = OB_PLAINAXES; ob->empty_drawsize = 1.0; - if (ELEM(type, OB_LAMP, OB_CAMERA, OB_SPEAKER)) { + if (ELEM(ob->type, OB_LAMP, OB_CAMERA, OB_SPEAKER)) { ob->trackflag = OB_NEGZ; ob->upflag = OB_POSY; } @@ -1045,6 +1036,7 @@ Object *BKE_object_add_only_object(Main *bmain, int type, const char *name) ob->step_height = 0.15f; ob->jump_speed = 10.0f; ob->fall_speed = 55.0f; + ob->max_jumps = 1; ob->col_group = 0x01; ob->col_mask = 0xffff; ob->preview = NULL; @@ -1056,6 +1048,22 @@ Object *BKE_object_add_only_object(Main *bmain, int type, const char *name) /* Animation Visualization defaults */ animviz_settings_init(&ob->avs); +} + +/* more general add: creates minimum required data, but without vertices etc. */ +Object *BKE_object_add_only_object(Main *bmain, int type, const char *name) +{ + Object *ob; + + if (!name) + name = get_obdata_defname(type); + + ob = BKE_libblock_alloc(bmain, ID_OB, name); + + /* default object vars */ + ob->type = type; + + BKE_object_init(ob); return ob; } @@ -1579,8 +1587,7 @@ Object *BKE_object_copy(Object *ob) } static void extern_local_object__modifiersForeachIDLink( - void *UNUSED(userData), Object *UNUSED(ob), - ID **idpoin) + void *UNUSED(userData), Object *UNUSED(ob), ID **idpoin, int UNUSED(cd_flag)) { if (*idpoin) { /* intentionally omit ID_OB */ @@ -3727,38 +3734,6 @@ bool BKE_object_is_animated(Scene *scene, Object *ob) return false; } -static void copy_object__forwardModifierLinks(void *UNUSED(userData), Object *UNUSED(ob), ID **idpoin) -{ - /* this is copied from ID_NEW; it might be better to have a macro */ - if (*idpoin && (*idpoin)->newid) *idpoin = (*idpoin)->newid; -} - -void BKE_object_relink(Object *ob) -{ - if (ob->id.lib) - return; - - BKE_constraints_relink(&ob->constraints); - if (ob->pose) { - bPoseChannel *chan; - for (chan = ob->pose->chanbase.first; chan; chan = chan->next) { - BKE_constraints_relink(&chan->constraints); - } - } - modifiers_foreachIDLink(ob, copy_object__forwardModifierLinks, NULL); - - if (ob->adt) - BKE_animdata_relink(ob->adt); - - if (ob->rigidbody_constraint) - BKE_rigidbody_relink_constraint(ob->rigidbody_constraint); - - ID_NEW(ob->parent); - - ID_NEW(ob->proxy); - ID_NEW(ob->proxy_group); -} - MovieClip *BKE_object_movieclip_get(Scene *scene, Object *ob, bool use_default) { MovieClip *clip = use_default ? scene->clip : NULL; diff --git a/source/blender/blenkernel/intern/packedFile.c b/source/blender/blenkernel/intern/packedFile.c index 151889b10a1..a1669c745e6 100644 --- a/source/blender/blenkernel/intern/packedFile.c +++ b/source/blender/blenkernel/intern/packedFile.c @@ -582,7 +582,7 @@ int unpackImage(ReportList *reports, Image *ima, int how) { int ret_value = RET_ERROR; - if (ima != NULL && ima->name[0]) { + if (ima != NULL) { while (ima->packedfiles.last) { char localname[FILE_MAX], absname[FILE_MAX]; char *newname; @@ -605,7 +605,9 @@ int unpackImage(ReportList *reports, Image *ima, int how) } /* keep the new name in the image for non-pack specific reasons */ - BLI_strncpy(ima->name, newname, sizeof(imapf->filepath)); + if (how != PF_REMOVE) { + BLI_strncpy(ima->name, newname, sizeof(imapf->filepath)); + } MEM_freeN(newname); } else { diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c index 9c720126eca..a59a0b73b69 100644 --- a/source/blender/blenkernel/intern/particle_system.c +++ b/source/blender/blenkernel/intern/particle_system.c @@ -77,6 +77,7 @@ #include "BKE_cdderivedmesh.h" #include "BKE_collision.h" #include "BKE_effect.h" +#include "BKE_library_query.h" #include "BKE_particle.h" #include "BKE_global.h" @@ -4209,6 +4210,30 @@ void particle_system_update(Scene *scene, Object *ob, ParticleSystem *psys) invert_m4_m4(psys->imat, ob->obmat); } +/* ID looper */ + +void BKE_particlesystem_id_loop(ParticleSystem *psys, ParticleSystemIDFunc func, void *userdata) +{ + ParticleTarget *pt; + + func(psys, (ID **)&psys->part, userdata, IDWALK_NOP); + func(psys, (ID **)&psys->target_ob, userdata, IDWALK_NOP); + func(psys, (ID **)&psys->parent, userdata, IDWALK_NOP); + + for (pt = psys->targets.first; pt; pt = pt->next) { + func(psys, (ID **)&pt->ob, userdata, IDWALK_NOP); + } + + if (psys->part->phystype == PART_PHYS_BOIDS) { + ParticleData *pa; + int p; + + for (p = 0, pa = psys->particles; p < psys->totpart; p++, pa++) { + func(psys, (ID **)&pa->boid->ground, userdata, IDWALK_NOP); + } + } +} + /* **** Depsgraph evaluation **** */ void BKE_particle_system_eval(EvaluationContext *UNUSED(eval_ctx), diff --git a/source/blender/blenkernel/intern/pbvh_bmesh.c b/source/blender/blenkernel/intern/pbvh_bmesh.c index 3e236079a66..ff4cae09437 100644 --- a/source/blender/blenkernel/intern/pbvh_bmesh.c +++ b/source/blender/blenkernel/intern/pbvh_bmesh.c @@ -575,7 +575,7 @@ static void pbvh_bmesh_edge_loops(BLI_Buffer *buf, BMEdge *e) buf->count = 2; } else { - BLI_buffer_resize(buf, BM_edge_face_count(e)); + BLI_buffer_reinit(buf, BM_edge_face_count(e)); BM_iter_as_array(NULL, BM_LOOPS_OF_EDGE, e, buf->data, buf->count); } } diff --git a/source/blender/blenkernel/intern/property.c b/source/blender/blenkernel/intern/property.c index 100df5fd121..dc4063b42ed 100644 --- a/source/blender/blenkernel/intern/property.c +++ b/source/blender/blenkernel/intern/property.c @@ -142,8 +142,8 @@ void BKE_bproperty_object_set(Object *ob, bProperty *propc) bProperty *prop; prop = BKE_bproperty_object_get(ob, propc->name); if (prop) { - BKE_bproperty_free(prop); BLI_remlink(&ob->prop, prop); + BKE_bproperty_free(prop); } BLI_addtail(&ob->prop, BKE_bproperty_copy(propc)); } diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c index 476b9a22238..0f1f9b4bdf7 100644 --- a/source/blender/blenkernel/intern/rigidbody.c +++ b/source/blender/blenkernel/intern/rigidbody.c @@ -58,6 +58,7 @@ #include "BKE_effect.h" #include "BKE_global.h" #include "BKE_library.h" +#include "BKE_library_query.h" #include "BKE_mesh.h" #include "BKE_object.h" #include "BKE_pointcache.h" @@ -957,6 +958,20 @@ void BKE_rigidbody_world_groups_relink(RigidBodyWorld *rbw) rbw->effector_weights->group = (Group *)rbw->effector_weights->group->id.newid; } +void BKE_rigidbody_world_id_loop(RigidBodyWorld *rbw, RigidbodyWorldIDFunc func, void *userdata) +{ + func(rbw, (ID **)&rbw->group, userdata, IDWALK_NOP); + func(rbw, (ID **)&rbw->constraints, userdata, IDWALK_NOP); + func(rbw, (ID **)&rbw->effector_weights->group, userdata, IDWALK_NOP); + + if (rbw->objects) { + int i; + for (i = 0; i < rbw->numbodies; i++) { + func(rbw, (ID **)&rbw->objects[i], userdata, IDWALK_NOP); + } + } +} + /* Add rigid body settings to the specified object */ RigidBodyOb *BKE_rigidbody_create_object(Scene *scene, Object *ob, short type) { @@ -1597,6 +1612,7 @@ void BKE_rigidbody_calc_center_of_mass(Object *ob, float r_center[3]) { zero_v3( struct RigidBodyWorld *BKE_rigidbody_create_world(Scene *scene) { return NULL; } struct RigidBodyWorld *BKE_rigidbody_world_copy(RigidBodyWorld *rbw) { return NULL; } void BKE_rigidbody_world_groups_relink(struct RigidBodyWorld *rbw) {} +void BKE_rigidbody_world_id_loop(struct RigidBodyWorld *rbw, RigidbodyWorldIDFunc func, void *userdata) {} struct RigidBodyOb *BKE_rigidbody_create_object(Scene *scene, Object *ob, short type) { return NULL; } struct RigidBodyCon *BKE_rigidbody_create_constraint(Scene *scene, Object *ob, short type) { return NULL; } struct RigidBodyWorld *BKE_rigidbody_get_world(Scene *scene) { return NULL; } diff --git a/source/blender/blenkernel/intern/sca.c b/source/blender/blenkernel/intern/sca.c index c902659c039..88a28228639 100644 --- a/source/blender/blenkernel/intern/sca.c +++ b/source/blender/blenkernel/intern/sca.c @@ -48,6 +48,7 @@ #include "BKE_global.h" #include "BKE_main.h" #include "BKE_library.h" +#include "BKE_library_query.h" #include "BKE_sca.h" /* ******************* SENSORS ************************ */ @@ -903,6 +904,179 @@ void unlink_logicbricks(void **poin, void ***ppoin, short *tot) } } +void BKE_sca_sensors_id_loop(ListBase *senslist, SCASensorIDFunc func, void *userdata) +{ + bSensor *sensor; + + for (sensor = senslist->first; sensor; sensor = sensor->next) { + func(sensor, (ID **)&sensor->ob, userdata, IDWALK_NOP); + + switch (sensor->type) { + case SENS_TOUCH: /* DEPRECATED */ + { + bTouchSensor *ts = sensor->data; + func(sensor, (ID **)&ts->ma, userdata, IDWALK_NOP); + break; + } + case SENS_MESSAGE: + { + bMessageSensor *ms = sensor->data; + func(sensor, (ID **)&ms->fromObject, userdata, IDWALK_NOP); + break; + } + case SENS_ALWAYS: + case SENS_NEAR: + case SENS_KEYBOARD: + case SENS_PROPERTY: + case SENS_MOUSE: + case SENS_COLLISION: + case SENS_RADAR: + case SENS_RANDOM: + case SENS_RAY: + case SENS_JOYSTICK: + case SENS_ACTUATOR: + case SENS_DELAY: + case SENS_ARMATURE: + default: + break; + } + } +} + +void BKE_sca_controllers_id_loop(ListBase *contlist, SCAControllerIDFunc func, void *userdata) +{ + bController *controller; + + for (controller = contlist->first; controller; controller = controller->next) { + switch (controller->type) { + case CONT_PYTHON: + { + bPythonCont *pc = controller->data; + func(controller, (ID **)&pc->text, userdata, IDWALK_NOP); + break; + } + case CONT_LOGIC_AND: + case CONT_LOGIC_OR: + case CONT_EXPRESSION: + case CONT_LOGIC_NAND: + case CONT_LOGIC_NOR: + case CONT_LOGIC_XOR: + case CONT_LOGIC_XNOR: + default: + break; + } + } +} + +void BKE_sca_actuators_id_loop(ListBase *actlist, SCAActuatorIDFunc func, void *userdata) +{ + bActuator *actuator; + + for (actuator = actlist->first; actuator; actuator = actuator->next) { + func(actuator, (ID **)&actuator->ob, userdata, IDWALK_NOP); + + switch (actuator->type) { + case ACT_ADD_OBJECT: /* DEPRECATED */ + { + bAddObjectActuator *aoa = actuator->data; + func(actuator, (ID **)&aoa->ob, userdata, IDWALK_NOP); + break; + } + case ACT_ACTION: + { + bActionActuator *aa = actuator->data; + func(actuator, (ID **)&aa->act, userdata, IDWALK_NOP); + break; + } + case ACT_SOUND: + { + bSoundActuator *sa = actuator->data; + func(actuator, (ID **)&sa->sound, userdata, IDWALK_NOP); + break; + } + case ACT_EDIT_OBJECT: + { + bEditObjectActuator *eoa = actuator->data; + func(actuator, (ID **)&eoa->ob, userdata, IDWALK_NOP); + func(actuator, (ID **)&eoa->me, userdata, IDWALK_NOP); + break; + } + case ACT_SCENE: + { + bSceneActuator *sa = actuator->data; + func(actuator, (ID **)&sa->scene, userdata, IDWALK_NOP); + func(actuator, (ID **)&sa->camera, userdata, IDWALK_NOP); + break; + } + case ACT_PROPERTY: + { + bPropertyActuator *pa = actuator->data; + func(actuator, (ID **)&pa->ob, userdata, IDWALK_NOP); + break; + } + case ACT_OBJECT: + { + bObjectActuator *oa = actuator->data; + func(actuator, (ID **)&oa->reference, userdata, IDWALK_NOP); + break; + } + case ACT_CAMERA: + { + bCameraActuator *ca = actuator->data; + func(actuator, (ID **)&ca->ob, userdata, IDWALK_NOP); + break; + } + case ACT_MESSAGE: + { + bMessageActuator *ma = actuator->data; + func(actuator, (ID **)&ma->toObject, userdata, IDWALK_NOP); + break; + } + case ACT_2DFILTER: + { + bTwoDFilterActuator *tdfa = actuator->data; + func(actuator, (ID **)&tdfa->text, userdata, IDWALK_NOP); + break; + } + case ACT_PARENT: + { + bParentActuator *pa = actuator->data; + func(actuator, (ID **)&pa->ob, userdata, IDWALK_NOP); + break; + } + case ACT_ARMATURE: + { + bArmatureActuator *aa = actuator->data; + func(actuator, (ID **)&aa->target, userdata, IDWALK_NOP); + func(actuator, (ID **)&aa->subtarget, userdata, IDWALK_NOP); + break; + } + case ACT_STEERING: + { + bSteeringActuator *sa = actuator->data; + func(actuator, (ID **)&sa->target, userdata, IDWALK_NOP); + func(actuator, (ID **)&sa->navmesh, userdata, IDWALK_NOP); + break; + } + /* Note: some types seems to be non-implemented? ACT_LAMP, ACT_MATERIAL... */ + case ACT_IPO: /* DEPRECATED */ + case ACT_LAMP: + case ACT_MATERIAL: + case ACT_END_OBJECT: /* DEPRECATED */ + case ACT_CONSTRAINT: + case ACT_GROUP: + case ACT_RANDOM: + case ACT_GAME: + case ACT_VISIBILITY: + case ACT_SHAPEACTION: + case ACT_STATE: + case ACT_MOUSE: + default: + break; + } + } +} + const char *sca_state_name_get(Object *ob, short bit) { bController *cont; diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c index 1ccc213006a..cc656775c14 100644 --- a/source/blender/blenkernel/intern/scene.c +++ b/source/blender/blenkernel/intern/scene.c @@ -464,15 +464,15 @@ void BKE_scene_free(Scene *sce) BKE_previewimg_free(&sce->preview); } -Scene *BKE_scene_add(Main *bmain, const char *name) +void BKE_scene_init(Scene *sce) { - Scene *sce; ParticleEditSettings *pset; int a; const char *colorspace_name; SceneRenderView *srv; - sce = BKE_libblock_alloc(bmain, ID_SCE, name); + BLI_assert(MEMCMP_STRUCT_OFS_IS_ZERO(sce, id)); + sce->lay = sce->layact = 1; sce->r.mode = R_GAMMA | R_OSA | R_SHADOW | R_SSS | R_ENVMAP | R_RAYTRACE; @@ -743,6 +743,15 @@ Scene *BKE_scene_add(Main *bmain, const char *name) copy_v2_fl2(sce->safe_areas.action_center, 15.0f / 100.0f, 5.0f / 100.0f); sce->preview = NULL; +} + +Scene *BKE_scene_add(Main *bmain, const char *name) +{ + Scene *sce; + + sce = BKE_libblock_alloc(bmain, ID_SCE, name); + + BKE_scene_init(sce); return sce; } diff --git a/source/blender/blenkernel/intern/sequencer.c b/source/blender/blenkernel/intern/sequencer.c index f0e59eda321..c070ad73156 100644 --- a/source/blender/blenkernel/intern/sequencer.c +++ b/source/blender/blenkernel/intern/sequencer.c @@ -563,6 +563,8 @@ void BKE_sequencer_new_render_data( r_context->skip_cache = false; r_context->is_proxy_render = false; r_context->view_id = 0; + r_context->gpu_offscreen = NULL; + r_context->gpu_samples = (scene->r.mode & R_OSA) ? scene->r.osa : 0; } /* ************************* iterator ************************** */ @@ -1013,6 +1015,15 @@ void BKE_sequencer_sort(Scene *scene) *(ed->seqbasep) = seqbase; } +/** Comparision function suitable to be used with BLI_listbase_sort()... */ +int BKE_sequencer_cmp_time_startdisp(const void *a, const void *b) +{ + const Sequence *seq_a = a; + const Sequence *seq_b = b; + + return (seq_a->startdisp > seq_b->startdisp); +} + static int clear_scene_in_allseqs_cb(Sequence *seq, void *arg_pt) { if (seq->scene == (Scene *)arg_pt) @@ -3009,6 +3020,7 @@ static ImBuf *seq_render_mask(const SeqRenderData *context, Mask *mask, float nr return NULL; } else { + AnimData *adt; Mask *mask_temp; MaskRasterHandle *mr_handle; @@ -3016,6 +3028,10 @@ static ImBuf *seq_render_mask(const SeqRenderData *context, Mask *mask, float nr BKE_mask_evaluate(mask_temp, mask->sfra + nr, true); + /* anim-data */ + adt = BKE_animdata_from_id(&mask->id); + BKE_animsys_evaluate_animdata(context->scene, &mask_temp->id, adt, nr, ADT_RECALC_ANIM); + maskbuf = MEM_mallocN(sizeof(float) * context->rectx * context->recty, __func__); mr_handle = BKE_maskrasterize_handle_new(); @@ -3198,10 +3214,14 @@ static ImBuf *seq_render_scene_strip(const SeqRenderData *context, Sequence *seq /* opengl offscreen render */ BKE_scene_update_for_newframe(context->eval_ctx, context->bmain, scene, scene->lay); - ibuf = sequencer_view3d_cb(scene, camera, width, height, IB_rect, - context->scene->r.seq_prev_type, - (context->scene->r.seq_flag & R_SEQ_SOLID_TEX) != 0, - use_gpencil, true, scene->r.alphamode, viewname, err_out); + ibuf = sequencer_view3d_cb( + /* set for OpenGL render (NULL when scrubbing) */ + scene, camera, width, height, IB_rect, + context->scene->r.seq_prev_type, + (context->scene->r.seq_flag & R_SEQ_SOLID_TEX) != 0, + use_gpencil, true, scene->r.alphamode, + context->gpu_samples, viewname, + context->gpu_offscreen, err_out); if (ibuf == NULL) { fprintf(stderr, "seq_render_scene_strip failed to get opengl buffer: %s\n", err_out); } @@ -3408,7 +3428,7 @@ static ImBuf *do_render_strip_uncached(const SeqRenderData *context, Sequence *s case SEQ_TYPE_MASK: { - /* ibuf is alwats new */ + /* ibuf is always new */ ibuf = seq_render_mask_strip(context, seq, nr); copy_to_ibuf_still(context, seq, nr, ibuf); @@ -3430,7 +3450,7 @@ static ImBuf *seq_render_strip(const SeqRenderData *context, Sequence *seq, floa float nr = give_stripelem_index(seq, cfra); /* all effects are handled similarly with the exception of speed effect */ int type = (seq->type & SEQ_TYPE_EFFECT && seq->type != SEQ_TYPE_SPEED) ? SEQ_TYPE_EFFECT : seq->type; - bool is_preprocessed = !ELEM(type, SEQ_TYPE_IMAGE, SEQ_TYPE_MOVIE, SEQ_TYPE_SCENE); + bool is_preprocessed = !ELEM(type, SEQ_TYPE_IMAGE, SEQ_TYPE_MOVIE, SEQ_TYPE_SCENE, SEQ_TYPE_MOVIECLIP); ibuf = BKE_sequencer_cache_get(context, seq, cfra, SEQ_STRIPELEM_IBUF); diff --git a/source/blender/blenkernel/intern/shrinkwrap.c b/source/blender/blenkernel/intern/shrinkwrap.c index 7d492586b7d..40c58cea3d9 100644 --- a/source/blender/blenkernel/intern/shrinkwrap.c +++ b/source/blender/blenkernel/intern/shrinkwrap.c @@ -282,9 +282,11 @@ static void shrinkwrap_calc_normal_projection(ShrinkwrapCalcData *calc, bool for /* use editmesh to avoid array allocation */ if (calc->smd->target && calc->target->type == DM_TYPE_EDITBMESH) { treeData.em_evil = BKE_editmesh_from_object(calc->smd->target); + treeData.em_evil_all = true; } if (calc->smd->auxTarget && auxMesh->type == DM_TYPE_EDITBMESH) { auxData.em_evil = BKE_editmesh_from_object(calc->smd->auxTarget); + auxData.em_evil_all = true; } /* After sucessufuly build the trees, start projection vertexs */ diff --git a/source/blender/blenkernel/intern/sound.c b/source/blender/blenkernel/intern/sound.c index 0b89931aa75..7e7cc8745fd 100644 --- a/source/blender/blenkernel/intern/sound.c +++ b/source/blender/blenkernel/intern/sound.c @@ -71,27 +71,20 @@ static int sound_cfra; static char **audio_device_names = NULL; #endif -bSound *BKE_sound_new_file(struct Main *bmain, const char *filename) +bSound *BKE_sound_new_file(struct Main *bmain, const char *filepath) { bSound *sound; - - char str[FILE_MAX]; const char *path; + char str[FILE_MAX]; - size_t len; - - BLI_strncpy(str, filename, sizeof(str)); + BLI_strncpy(str, filepath, sizeof(str)); path = /*bmain ? bmain->name :*/ G.main->name; BLI_path_abs(str, path); - len = strlen(filename); - while (len > 0 && filename[len - 1] != '/' && filename[len - 1] != '\\') - len--; - - sound = BKE_libblock_alloc(bmain, ID_SO, filename + len); - BLI_strncpy(sound->name, filename, FILE_MAX); + sound = BKE_libblock_alloc(bmain, ID_SO, BLI_path_basename(filepath)); + BLI_strncpy(sound->name, filepath, FILE_MAX); /* sound->type = SOUND_TYPE_FILE; */ /* XXX unused currently */ BKE_sound_load(bmain, sound); @@ -99,6 +92,37 @@ bSound *BKE_sound_new_file(struct Main *bmain, const char *filename) return sound; } +bSound *BKE_sound_new_file_exists_ex(struct Main *bmain, const char *filepath, bool *r_exists) +{ + bSound *sound; + char str[FILE_MAX], strtest[FILE_MAX]; + + BLI_strncpy(str, filepath, sizeof(str)); + BLI_path_abs(str, bmain->name); + + /* first search an identical filepath */ + for (sound = bmain->sound.first; sound; sound = sound->id.next) { + BLI_strncpy(strtest, sound->name, sizeof(sound->name)); + BLI_path_abs(strtest, ID_BLEND_PATH(bmain, &sound->id)); + + if (BLI_path_cmp(strtest, str) == 0) { + sound->id.us++; /* officially should not, it doesn't link here! */ + if (r_exists) + *r_exists = true; + return sound; + } + } + + if (r_exists) + *r_exists = false; + return BKE_sound_new_file(bmain, filepath); +} + +bSound *BKE_sound_new_file_exists(struct Main *bmain, const char *filepath) +{ + return BKE_sound_new_file_exists_ex(bmain, filepath, NULL); +} + void BKE_sound_free(bSound *sound) { if (sound->packedfile) { diff --git a/source/blender/blenkernel/intern/speaker.c b/source/blender/blenkernel/intern/speaker.c index 7a800555144..30296c7813c 100644 --- a/source/blender/blenkernel/intern/speaker.c +++ b/source/blender/blenkernel/intern/speaker.c @@ -37,11 +37,9 @@ #include "BKE_main.h" #include "BKE_speaker.h" -void *BKE_speaker_add(Main *bmain, const char *name) +void BKE_speaker_init(Speaker *spk) { - Speaker *spk; - - spk = BKE_libblock_alloc(bmain, ID_SPK, name); + BLI_assert(MEMCMP_STRUCT_OFS_IS_ZERO(spk, id)); spk->attenuation = 1.0f; spk->cone_angle_inner = 360.0f; @@ -55,6 +53,15 @@ void *BKE_speaker_add(Main *bmain, const char *name) spk->volume = 1.0f; spk->volume_max = 1.0f; spk->volume_min = 0.0f; +} + +void *BKE_speaker_add(Main *bmain, const char *name) +{ + Speaker *spk; + + spk = BKE_libblock_alloc(bmain, ID_SPK, name); + + BKE_speaker_init(spk); return spk; } diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c index 05f658e0b2b..a2c625a7ec3 100644 --- a/source/blender/blenkernel/intern/subsurf_ccg.c +++ b/source/blender/blenkernel/intern/subsurf_ccg.c @@ -848,11 +848,6 @@ static void ccgDM_getMinMax(DerivedMesh *dm, float r_min[3], float r_max[3]) int i, edgeSize = ccgSubSurf_getEdgeSize(ss); int gridSize = ccgSubSurf_getGridSize(ss); - if (!ccgSubSurf_getNumVerts(ss)) { - r_min[0] = r_min[1] = r_min[2] = r_max[0] = r_max[1] = r_max[2] = 0.0f; - return; - } - #ifdef WITH_OPENSUBDIV if (ccgdm->useGpuBackend) { ccgSubSurf_getMinMax(ccgdm->ss, r_min, r_max); @@ -862,6 +857,9 @@ static void ccgDM_getMinMax(DerivedMesh *dm, float r_min[3], float r_max[3]) CCG_key_top_level(&key, ss); + if (!ccgSubSurf_getNumVerts(ss)) + r_min[0] = r_min[1] = r_min[2] = r_max[0] = r_max[1] = r_max[2] = 0.0; + for (ccgSubSurf_initVertIterator(ss, &vi); !ccgVertIterator_isStopped(&vi); ccgVertIterator_next(&vi)) { CCGVert *v = ccgVertIterator_getCurrent(&vi); float *co = ccgSubSurf_getVertData(ss, v); @@ -2169,7 +2167,7 @@ static void ccgDM_buffer_copy_color( CCGDerivedMesh *ccgdm = (CCGDerivedMesh *) dm; CCGSubSurf *ss = ccgdm->ss; CCGKey key; - const char *mloopcol = user_data; + const unsigned char *mloopcol = user_data; int gridSize = ccgSubSurf_getGridSize(ss); int gridFaces = gridSize - 1; int i, totface = ccgSubSurf_getNumFaces(ss); @@ -2186,10 +2184,10 @@ static void ccgDM_buffer_copy_color( for (S = 0; S < numVerts; S++) { for (y = 0; y < gridFaces; y++) { for (x = 0; x < gridFaces; x++) { - copy_v3_v3_char((char *)&varray[start + 0], &mloopcol[iface * 16 + 0]); - copy_v3_v3_char((char *)&varray[start + 3], &mloopcol[iface * 16 + 12]); - copy_v3_v3_char((char *)&varray[start + 6], &mloopcol[iface * 16 + 8]); - copy_v3_v3_char((char *)&varray[start + 9], &mloopcol[iface * 16 + 4]); + copy_v3_v3_uchar(&varray[start + 0], &mloopcol[iface * 16 + 0]); + copy_v3_v3_uchar(&varray[start + 3], &mloopcol[iface * 16 + 12]); + copy_v3_v3_uchar(&varray[start + 6], &mloopcol[iface * 16 + 8]); + copy_v3_v3_uchar(&varray[start + 9], &mloopcol[iface * 16 + 4]); start += 12; iface++; @@ -2707,6 +2705,13 @@ static void ccgDM_drawFacesSolid(DerivedMesh *dm, float (*partial_redraw_planes) GPU_buffers_unbind(); } +typedef struct { + DMVertexAttribs attribs; + int numdata; + + GPUAttrib datatypes[GPU_MAX_ATTRIB]; /* TODO, messing up when switching materials many times - [#21056]*/ +} GPUMaterialConv; + /* Only used by non-editmesh types */ static void ccgDM_drawMappedFacesGLSL(DerivedMesh *dm, DMSetMaterial setMaterial, @@ -2717,14 +2722,15 @@ static void ccgDM_drawMappedFacesGLSL(DerivedMesh *dm, CCGSubSurf *ss = ccgdm->ss; CCGKey key; GPUVertexAttribs gattribs; - DMVertexAttribs attribs = {{{NULL}}}; - /* MTFace *tf = dm->getTessFaceDataArray(dm, CD_MTFACE); */ /* UNUSED */ + int a, b, do_draw, new_matnr; + DMFlagMat *faceFlags = ccgdm->faceFlags; + unsigned char *varray; + size_t max_element_size = 0; + int tot_loops = 0; + int totpoly = ccgSubSurf_getNumFaces(ss); int gridSize = ccgSubSurf_getGridSize(ss); int gridFaces = gridSize - 1; int edgeSize = ccgSubSurf_getEdgeSize(ss); - DMFlagMat *faceFlags = ccgdm->faceFlags; - const float (*lnors)[3] = dm->getLoopDataArray(dm, CD_NORMAL); - int a, i, do_draw, numVerts, matnr, new_matnr, totface; #ifdef WITH_OPENSUBDIV if (ccgdm->useGpuBackend) { @@ -2793,154 +2799,358 @@ static void ccgDM_drawMappedFacesGLSL(DerivedMesh *dm, } #endif + glShadeModel(GL_SMOOTH); + CCG_key_top_level(&key, ss); ccgdm_pbvh_update(ccgdm); - do_draw = 0; - matnr = -1; + /* workaround for NVIDIA GPUs on Mac not supporting vertex arrays + interleaved formats, see T43342 */ + if ((GPU_type_matches(GPU_DEVICE_NVIDIA, GPU_OS_MAC, GPU_DRIVER_ANY) && (U.gameflags & USER_DISABLE_VBO)) || + setDrawOptions != NULL) + { + const float (*lnors)[3] = dm->getLoopDataArray(dm, CD_NORMAL); + DMVertexAttribs attribs = {{{NULL}}}; + int i; + int matnr = -1; + do_draw = 0; #define PASSATTRIB(dx, dy, vert) { \ if (attribs.totorco) \ index = getFaceIndex(ss, f, S, x + dx, y + dy, edgeSize, gridSize); \ else \ index = 0; \ - DM_draw_attrib_vertex(&attribs, a, index, vert, ((a) * 4) + vert); \ + DM_draw_attrib_vertex(&attribs, a, index, vert, ((a) * 4) + vert); \ } (void)0 - totface = ccgSubSurf_getNumFaces(ss); - for (a = 0, i = 0; i < totface; i++) { - CCGFace *f = ccgdm->faceMap[i].face; - const float (*ln)[3] = NULL; - int S, x, y, drawSmooth; - int index = GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(f)); - int origIndex = ccgDM_getFaceMapIndex(ss, f); - - numVerts = ccgSubSurf_getFaceNumVerts(f); - - if (faceFlags) { - drawSmooth = (lnors || (faceFlags[index].flag & ME_SMOOTH)); - new_matnr = faceFlags[index].mat_nr + 1; - } - else { - drawSmooth = 1; - new_matnr = 1; - } - - if (lnors) { - ln = lnors; - lnors += (gridFaces * gridFaces * numVerts) * 4; - } + totpoly = ccgSubSurf_getNumFaces(ss); + for (a = 0, i = 0; i < totpoly; i++) { + CCGFace *f = ccgdm->faceMap[i].face; + const float (*ln)[3] = NULL; + int S, x, y, drawSmooth; + int index = GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(f)); + int origIndex = ccgDM_getFaceMapIndex(ss, f); - if (new_matnr != matnr) { - do_draw = setMaterial(matnr = new_matnr, &gattribs); - if (do_draw) - DM_vertex_attributes_from_gpu(dm, &gattribs, &attribs); - } + int numVerts = ccgSubSurf_getFaceNumVerts(f); - if (!do_draw || (setDrawOptions && (origIndex != ORIGINDEX_NONE) && - (setDrawOptions(userData, origIndex) == DM_DRAW_OPTION_SKIP))) - { - a += gridFaces * gridFaces * numVerts; - continue; - } + if (faceFlags) { + drawSmooth = (lnors || (faceFlags[index].flag & ME_SMOOTH)); + new_matnr = faceFlags[index].mat_nr + 1; + } + else { + drawSmooth = 1; + new_matnr = 1; + } - glShadeModel(drawSmooth ? GL_SMOOTH : GL_FLAT); - for (S = 0; S < numVerts; S++) { - CCGElem *faceGridData = ccgSubSurf_getFaceGridDataArray(ss, f, S); - CCGElem *vda, *vdb; + if (lnors) { + ln = lnors; + lnors += (gridFaces * gridFaces * numVerts) * 4; + } - if (ln) { - glBegin(GL_QUADS); - for (y = 0; y < gridFaces; y++) { - for (x = 0; x < gridFaces; x++) { - float *aco = CCG_grid_elem_co(&key, faceGridData, x, y); - float *bco = CCG_grid_elem_co(&key, faceGridData, x + 1, y); - float *cco = CCG_grid_elem_co(&key, faceGridData, x + 1, y + 1); - float *dco = CCG_grid_elem_co(&key, faceGridData, x, y + 1); + if (new_matnr != matnr) { + do_draw = setMaterial(matnr = new_matnr, &gattribs); + if (do_draw) + DM_vertex_attributes_from_gpu(dm, &gattribs, &attribs); + } - PASSATTRIB(0, 1, 1); - glNormal3fv(ln[1]); - glVertex3fv(dco); - PASSATTRIB(1, 1, 2); - glNormal3fv(ln[2]); - glVertex3fv(cco); - PASSATTRIB(1, 0, 3); - glNormal3fv(ln[3]); - glVertex3fv(bco); - PASSATTRIB(0, 0, 0); - glNormal3fv(ln[0]); - glVertex3fv(aco); + if (!do_draw || (setDrawOptions && (origIndex != ORIGINDEX_NONE) && + (setDrawOptions(userData, origIndex) == DM_DRAW_OPTION_SKIP))) + { + a += gridFaces * gridFaces * numVerts; + continue; + } - ln += 4; - a++; + glShadeModel(drawSmooth ? GL_SMOOTH : GL_FLAT); + for (S = 0; S < numVerts; S++) { + CCGElem *faceGridData = ccgSubSurf_getFaceGridDataArray(ss, f, S); + CCGElem *vda, *vdb; + + if (ln) { + glBegin(GL_QUADS); + for (y = 0; y < gridFaces; y++) { + for (x = 0; x < gridFaces; x++) { + float *aco = CCG_grid_elem_co(&key, faceGridData, x, y); + float *bco = CCG_grid_elem_co(&key, faceGridData, x + 1, y); + float *cco = CCG_grid_elem_co(&key, faceGridData, x + 1, y + 1); + float *dco = CCG_grid_elem_co(&key, faceGridData, x, y + 1); + + PASSATTRIB(0, 1, 1); + glNormal3fv(ln[1]); + glVertex3fv(dco); + PASSATTRIB(1, 1, 2); + glNormal3fv(ln[2]); + glVertex3fv(cco); + PASSATTRIB(1, 0, 3); + glNormal3fv(ln[3]); + glVertex3fv(bco); + PASSATTRIB(0, 0, 0); + glNormal3fv(ln[0]); + glVertex3fv(aco); + + ln += 4; + a++; + } } + glEnd(); } - glEnd(); - } - else if (drawSmooth) { - for (y = 0; y < gridFaces; y++) { - glBegin(GL_QUAD_STRIP); - for (x = 0; x < gridFaces; x++) { + else if (drawSmooth) { + for (y = 0; y < gridFaces; y++) { + glBegin(GL_QUAD_STRIP); + for (x = 0; x < gridFaces; x++) { + vda = CCG_grid_elem(&key, faceGridData, x, y + 0); + vdb = CCG_grid_elem(&key, faceGridData, x, y + 1); + + PASSATTRIB(0, 0, 0); + glNormal3fv(CCG_elem_no(&key, vda)); + glVertex3fv(CCG_elem_co(&key, vda)); + + PASSATTRIB(0, 1, 1); + glNormal3fv(CCG_elem_no(&key, vdb)); + glVertex3fv(CCG_elem_co(&key, vdb)); + + if (x != gridFaces - 1) + a++; + } + vda = CCG_grid_elem(&key, faceGridData, x, y + 0); vdb = CCG_grid_elem(&key, faceGridData, x, y + 1); - - PASSATTRIB(0, 0, 0); + + PASSATTRIB(0, 0, 3); glNormal3fv(CCG_elem_no(&key, vda)); glVertex3fv(CCG_elem_co(&key, vda)); - PASSATTRIB(0, 1, 1); + PASSATTRIB(0, 1, 2); glNormal3fv(CCG_elem_no(&key, vdb)); glVertex3fv(CCG_elem_co(&key, vdb)); - if (x != gridFaces - 1) + glEnd(); + + a++; + } + } + else { + glBegin(GL_QUADS); + for (y = 0; y < gridFaces; y++) { + for (x = 0; x < gridFaces; x++) { + float *aco = CCG_grid_elem_co(&key, faceGridData, x, y); + float *bco = CCG_grid_elem_co(&key, faceGridData, x + 1, y); + float *cco = CCG_grid_elem_co(&key, faceGridData, x + 1, y + 1); + float *dco = CCG_grid_elem_co(&key, faceGridData, x, y + 1); + + ccgDM_glNormalFast(aco, bco, cco, dco); + + PASSATTRIB(0, 1, 1); + glVertex3fv(dco); + PASSATTRIB(1, 1, 2); + glVertex3fv(cco); + PASSATTRIB(1, 0, 3); + glVertex3fv(bco); + PASSATTRIB(0, 0, 0); + glVertex3fv(aco); + a++; + } } + glEnd(); + } + } + } - vda = CCG_grid_elem(&key, faceGridData, x, y + 0); - vdb = CCG_grid_elem(&key, faceGridData, x, y + 1); +#undef PASSATTRIB + } + else { + GPUMaterialConv *matconv; + size_t offset; + int *mat_orig_to_new; + int tot_active_mat; + GPUBuffer *buffer = NULL; - PASSATTRIB(0, 0, 3); - glNormal3fv(CCG_elem_no(&key, vda)); - glVertex3fv(CCG_elem_co(&key, vda)); + GPU_vertex_setup(dm); + GPU_normal_setup(dm); + GPU_triangle_setup(dm); - PASSATTRIB(0, 1, 2); - glNormal3fv(CCG_elem_no(&key, vdb)); - glVertex3fv(CCG_elem_co(&key, vdb)); + tot_active_mat = dm->drawObject->totmaterial; - glEnd(); + matconv = MEM_callocN(sizeof(*matconv) * tot_active_mat, + "cdDM_drawMappedFacesGLSL.matconv"); + mat_orig_to_new = MEM_mallocN(sizeof(*mat_orig_to_new) * dm->totmat, + "cdDM_drawMappedFacesGLSL.mat_orig_to_new"); - a++; + /* part one, check what attributes are needed per material */ + for (a = 0; a < tot_active_mat; a++) { + new_matnr = dm->drawObject->materials[a].mat_nr; + + /* map from original material index to new + * GPUBufferMaterial index */ + mat_orig_to_new[new_matnr] = a; + do_draw = setMaterial(new_matnr + 1, &gattribs); + + if (do_draw) { + int numdata = 0; + DM_vertex_attributes_from_gpu(dm, &gattribs, &matconv[a].attribs); + + if (matconv[a].attribs.totorco && matconv[a].attribs.orco.array) { + matconv[a].datatypes[numdata].index = matconv[a].attribs.orco.gl_index; + matconv[a].datatypes[numdata].size = 3; + matconv[a].datatypes[numdata].type = GL_FLOAT; + numdata++; + } + for (b = 0; b < matconv[a].attribs.tottface; b++) { + if (matconv[a].attribs.tface[b].array) { + matconv[a].datatypes[numdata].index = matconv[a].attribs.tface[b].gl_index; + matconv[a].datatypes[numdata].size = 2; + matconv[a].datatypes[numdata].type = GL_FLOAT; + numdata++; + } + } + for (b = 0; b < matconv[a].attribs.totmcol; b++) { + if (matconv[a].attribs.mcol[b].array) { + matconv[a].datatypes[numdata].index = matconv[a].attribs.mcol[b].gl_index; + matconv[a].datatypes[numdata].size = 4; + matconv[a].datatypes[numdata].type = GL_UNSIGNED_BYTE; + numdata++; + } + } + if (matconv[a].attribs.tottang && matconv[a].attribs.tang.array) { + matconv[a].datatypes[numdata].index = matconv[a].attribs.tang.gl_index; + matconv[a].datatypes[numdata].size = 4; + matconv[a].datatypes[numdata].type = GL_FLOAT; + numdata++; + } + if (numdata != 0) { + matconv[a].numdata = numdata; + max_element_size = max_ii(GPU_attrib_element_size(matconv[a].datatypes, numdata), max_element_size); } } - else { - glBegin(GL_QUADS); - for (y = 0; y < gridFaces; y++) { - for (x = 0; x < gridFaces; x++) { - float *aco = CCG_grid_elem_co(&key, faceGridData, x, y); - float *bco = CCG_grid_elem_co(&key, faceGridData, x + 1, y); - float *cco = CCG_grid_elem_co(&key, faceGridData, x + 1, y + 1); - float *dco = CCG_grid_elem_co(&key, faceGridData, x, y + 1); + } - ccgDM_glNormalFast(aco, bco, cco, dco); + /* part two, generate and fill the arrays with the data */ + if (max_element_size > 0) { + buffer = GPU_buffer_alloc(max_element_size * dm->drawObject->tot_loop_verts, false); - PASSATTRIB(0, 1, 1); - glVertex3fv(dco); - PASSATTRIB(1, 1, 2); - glVertex3fv(cco); - PASSATTRIB(1, 0, 3); - glVertex3fv(bco); - PASSATTRIB(0, 0, 0); - glVertex3fv(aco); - - a++; + if (buffer == NULL) { + buffer = GPU_buffer_alloc(max_element_size * dm->drawObject->tot_loop_verts, true); + } + varray = GPU_buffer_lock_stream(buffer, GPU_BINDING_ARRAY); + if (varray == NULL) { + GPU_buffers_unbind(); + GPU_buffer_free(buffer); + MEM_freeN(mat_orig_to_new); + MEM_freeN(matconv); + fprintf(stderr, "Out of memory, can't draw object\n"); + return; + } + + for (a = 0; a < totpoly; a++) { + CCGFace *f = ccgdm->faceMap[a].face; + int index = GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(f)); + int S, x, y, numVerts = ccgSubSurf_getFaceNumVerts(f); + int i; + + if (faceFlags) { + i = mat_orig_to_new[faceFlags[index].mat_nr]; + } + else { + i = mat_orig_to_new[0]; + } + + if (matconv[i].numdata != 0) { + for (S = 0; S < numVerts; S++) { + for (y = 0; y < gridFaces; y++) { + for (x = 0; x < gridFaces; x++) { + + offset = tot_loops * max_element_size; + + if (matconv[i].attribs.totorco && matconv[i].attribs.orco.array) { + int index; + + index = getFaceIndex(ss, f, S, x, y, edgeSize, gridSize); + copy_v3_v3((float *)&varray[offset], + (float *)matconv[i].attribs.orco.array[index]); + index = getFaceIndex(ss, f, S, x + 1, y, edgeSize, gridSize); + copy_v3_v3((float *)&varray[offset + max_element_size], + (float *)matconv[i].attribs.orco.array[index]); + index = getFaceIndex(ss, f, S, x + 1, y + 1, edgeSize, gridSize); + copy_v3_v3((float *)&varray[offset + 2 * max_element_size], + (float *)matconv[i].attribs.orco.array[index]); + index = getFaceIndex(ss, f, S, x, y + 1, edgeSize, gridSize); + copy_v3_v3((float *)&varray[offset + 3 * max_element_size], + (float *)matconv[i].attribs.orco.array[index]); + + offset += sizeof(float) * 3; + } + for (b = 0; b < matconv[i].attribs.tottface; b++) { + if (matconv[i].attribs.tface[b].array) { + const MLoopUV *mloopuv = matconv[i].attribs.tface[b].array + tot_loops; + + copy_v2_v2((float *)&varray[offset], mloopuv[0].uv); + copy_v2_v2((float *)&varray[offset + max_element_size], mloopuv[3].uv); + copy_v2_v2((float *)&varray[offset + 2 * max_element_size], mloopuv[2].uv); + copy_v2_v2((float *)&varray[offset + 3 * max_element_size], mloopuv[1].uv); + + offset += sizeof(float) * 2; + } + } + for (b = 0; b < matconv[i].attribs.totmcol; b++) { + if (matconv[i].attribs.mcol[b].array) { + const MLoopCol *mloopcol = matconv[i].attribs.mcol[b].array + tot_loops; + + copy_v4_v4_uchar(&varray[offset], &mloopcol[0].r); + copy_v4_v4_uchar(&varray[offset + max_element_size], &mloopcol[3].r); + copy_v4_v4_uchar(&varray[offset + 2 * max_element_size], &mloopcol[2].r); + copy_v4_v4_uchar(&varray[offset + 3 * max_element_size], &mloopcol[1].r); + + offset += sizeof(unsigned char) * 4; + } + } + if (matconv[i].attribs.tottang && matconv[i].attribs.tang.array) { + const float (*looptang)[4] = (const float (*)[4])matconv[i].attribs.tang.array + tot_loops; + + copy_v4_v4((float *)&varray[offset], looptang[0]); + copy_v4_v4((float *)&varray[offset + max_element_size], looptang[3]); + copy_v4_v4((float *)&varray[offset + 2 * max_element_size], looptang[2]); + copy_v4_v4((float *)&varray[offset + 3 * max_element_size], looptang[1]); + + offset += sizeof(float) * 4; + } + + tot_loops += 4; + } + } } } - glEnd(); + else { + tot_loops += 4 * numVerts * gridFaces * gridFaces; + } } + GPU_buffer_unlock(buffer, GPU_BINDING_ARRAY); } + + for (a = 0; a < tot_active_mat; a++) { + new_matnr = dm->drawObject->materials[a].mat_nr; + + do_draw = setMaterial(new_matnr + 1, &gattribs); + + if (do_draw) { + if (matconv[a].numdata) { + GPU_interleaved_attrib_setup(buffer, matconv[a].datatypes, matconv[a].numdata, max_element_size); + } + GPU_buffer_draw_elements(dm->drawObject->triangles, GL_TRIANGLES, + dm->drawObject->materials[a].start, dm->drawObject->materials[a].totelements); + if (matconv[a].numdata) { + GPU_interleaved_attrib_unbind(); + } + } + } + + GPU_buffers_unbind(); + if (buffer) + GPU_buffer_free(buffer); + + MEM_freeN(mat_orig_to_new); + MEM_freeN(matconv); } -#undef PASSATTRIB + glShadeModel(GL_FLAT); } static void ccgDM_drawFacesGLSL(DerivedMesh *dm, DMSetMaterial setMaterial) diff --git a/source/blender/blenkernel/intern/text.c b/source/blender/blenkernel/intern/text.c index 77d6043d6f3..6e41ed3f9a6 100644 --- a/source/blender/blenkernel/intern/text.c +++ b/source/blender/blenkernel/intern/text.c @@ -171,14 +171,12 @@ void BKE_text_free(Text *text) #endif } -Text *BKE_text_add(Main *bmain, const char *name) +void BKE_text_init(Text *ta) { - Text *ta; TextLine *tmp; - - ta = BKE_libblock_alloc(bmain, ID_TXT, name); - ta->id.us = 1; - + + BLI_assert(MEMCMP_STRUCT_OFS_IS_ZERO(ta, id)); + ta->name = NULL; init_undo_text(ta); @@ -206,6 +204,15 @@ Text *BKE_text_add(Main *bmain, const char *name) ta->curc = 0; ta->sell = ta->lines.first; ta->selc = 0; +} + +Text *BKE_text_add(Main *bmain, const char *name) +{ + Text *ta; + + ta = BKE_libblock_alloc(bmain, ID_TXT, name); + + BKE_text_init(ta); return ta; } diff --git a/source/blender/blenkernel/intern/texture.c b/source/blender/blenkernel/intern/texture.c index 88a412d5e95..463ca250ad5 100644 --- a/source/blender/blenkernel/intern/texture.c +++ b/source/blender/blenkernel/intern/texture.c @@ -580,6 +580,8 @@ void BKE_texture_free(Tex *tex) void BKE_texture_default(Tex *tex) { + /* BLI_assert(MEMCMP_STRUCT_OFS_IS_ZERO(tex, id)); */ /* Not here, can be called with some pointers set. :/ */ + tex->type = TEX_IMAGE; tex->ima = NULL; tex->stype = 0; diff --git a/source/blender/blenkernel/intern/unit.c b/source/blender/blenkernel/intern/unit.c index 64d561491e2..ab8fbabd329 100644 --- a/source/blender/blenkernel/intern/unit.c +++ b/source/blender/blenkernel/intern/unit.c @@ -730,11 +730,10 @@ void bUnit_ToUnitAltName(char *str, int len_max, const char *orig_str, int syste bUnitCollection *usys = unit_get_system(system, type); bUnitDef *unit; - bUnitDef *unit_def = unit_default(usys); /* find and substitute all units */ for (unit = usys->units; unit->name; unit++) { - if (len_max > 0 && (unit->name_alt || unit == unit_def)) { + if (len_max > 0 && unit->name_alt) { const char *found = unit_find_str(orig_str, unit->name_short); if (found) { int offset = (int)(found - orig_str); diff --git a/source/blender/blenkernel/intern/world.c b/source/blender/blenkernel/intern/world.c index e4736b1f54c..88c98b6d9d8 100644 --- a/source/blender/blenkernel/intern/world.c +++ b/source/blender/blenkernel/intern/world.c @@ -31,6 +31,7 @@ #include <string.h> +#include <stdlib.h> #include <math.h> #include "MEM_guardedalloc.h" @@ -83,12 +84,10 @@ void BKE_world_free(World *wrld) BKE_world_free_ex(wrld, true); } -World *add_world(Main *bmain, const char *name) +void BKE_world_init(World *wrld) { - World *wrld; + BLI_assert(MEMCMP_STRUCT_OFS_IS_ZERO(wrld, id)); - wrld = BKE_libblock_alloc(bmain, ID_WO, name); - wrld->horr = 0.05f; wrld->horg = 0.05f; wrld->horb = 0.05f; @@ -113,6 +112,15 @@ World *add_world(Main *bmain, const char *name) wrld->preview = NULL; wrld->miststa = 5.0f; wrld->mistdist = 25.0f; +} + +World *add_world(Main *bmain, const char *name) +{ + World *wrld; + + wrld = BKE_libblock_alloc(bmain, ID_WO, name); + + BKE_world_init(wrld); return wrld; } diff --git a/source/blender/blenkernel/intern/writeffmpeg.c b/source/blender/blenkernel/intern/writeffmpeg.c index bc734a9a551..1a63bacf17a 100644 --- a/source/blender/blenkernel/intern/writeffmpeg.c +++ b/source/blender/blenkernel/intern/writeffmpeg.c @@ -1198,8 +1198,6 @@ int BKE_ffmpeg_append(void *context_v, RenderData *rd, int start_frame, int fram static void end_ffmpeg_impl(FFMpegContext *context, int is_autosplit) { - unsigned int i; - PRINT("Closing ffmpeg...\n"); #if 0 |