Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/blenkernel/intern/object.c')
-rw-r--r--source/blender/blenkernel/intern/object.c340
1 files changed, 212 insertions, 128 deletions
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index eddcceb560f..9910392e2d0 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -57,12 +57,11 @@
#include "BLI_editVert.h"
#include "BLI_math.h"
#include "BLI_pbvh.h"
-
-#include "BKE_utildefines.h"
+#include "BLI_utildefines.h"
#include "BKE_main.h"
#include "BKE_global.h"
-
+#include "BKE_idprop.h"
#include "BKE_armature.h"
#include "BKE_action.h"
#include "BKE_bullet.h"
@@ -97,7 +96,7 @@
#include "LBM_fluidsim.h"
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
#include "BPY_extern.h"
#endif
@@ -246,6 +245,13 @@ void free_sculptsession(Object *ob)
if(ss->layer_co)
MEM_freeN(ss->layer_co);
+ if(ss->orig_cos)
+ MEM_freeN(ss->orig_cos);
+ if(ss->deform_cos)
+ MEM_freeN(ss->deform_cos);
+ if(ss->deform_imats)
+ MEM_freeN(ss->deform_imats);
+
MEM_freeN(ss);
ob->sculpt = NULL;
@@ -268,7 +274,7 @@ void free_object(Object *ob)
else if(ob->type==OB_CURVE) unlink_curve(ob->data);
else if(ob->type==OB_MBALL) unlink_mball(ob->data);
}
- ob->data= 0;
+ ob->data= NULL;
}
for(a=0; a<ob->totcol; a++) {
@@ -276,12 +282,12 @@ void free_object(Object *ob)
}
if(ob->mat) MEM_freeN(ob->mat);
if(ob->matbits) MEM_freeN(ob->matbits);
- ob->mat= 0;
- ob->matbits= 0;
+ ob->mat= NULL;
+ ob->matbits= NULL;
if(ob->bb) MEM_freeN(ob->bb);
- ob->bb= 0;
+ ob->bb= NULL;
if(ob->path) free_path(ob->path);
- ob->path= 0;
+ ob->path= NULL;
if(ob->adt) BKE_free_animdata((ID *)ob);
if(ob->poselib) ob->poselib->id.us--;
if(ob->gpd) ((ID *)ob->gpd)->us--;
@@ -317,11 +323,11 @@ static void unlink_object__unlinkModifierLinks(void *userData, Object *ob, Objec
if (*obpoin==unlinkOb) {
*obpoin = NULL;
- ob->recalc |= OB_RECALC_ALL; // XXX: should this just be OB_RECALC_DATA?
+ ob->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME; // XXX: should this just be OB_RECALC_DATA?
}
}
-void unlink_object(Scene *scene, Object *ob)
+void unlink_object(Object *ob)
{
Main *bmain= G.main;
Object *obt;
@@ -358,7 +364,7 @@ void unlink_object(Scene *scene, Object *ob)
if(obt->parent==ob) {
obt->parent= NULL;
- obt->recalc |= OB_RECALC_ALL;
+ obt->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME;
}
modifiers_foreachObjectLink(obt, unlink_object__unlinkModifierLinks, ob);
@@ -368,15 +374,15 @@ void unlink_object(Scene *scene, Object *ob)
if(cu->bevobj==ob) {
cu->bevobj= NULL;
- obt->recalc |= OB_RECALC_ALL;
+ obt->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME;
}
if(cu->taperobj==ob) {
cu->taperobj= NULL;
- obt->recalc |= OB_RECALC_ALL;
+ obt->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME;
}
if(cu->textoncurve==ob) {
cu->textoncurve= NULL;
- obt->recalc |= OB_RECALC_ALL;
+ obt->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME;
}
}
else if(obt->type==OB_ARMATURE && obt->pose) {
@@ -533,12 +539,10 @@ void unlink_object(Scene *scene, Object *ob)
}
/* textures */
- tex= bmain->tex.first;
- while(tex) {
- if(tex->env) {
- if(tex->env->object == ob) tex->env->object= NULL;
- }
- tex= tex->id.next;
+ for(tex= bmain->tex.first; tex; tex= tex->id.next) {
+ if(tex->env && (ob==tex->env->object)) tex->env->object= NULL;
+ if(tex->pd && (ob==tex->pd->object)) tex->pd->object= NULL;
+ if(tex->vd && (ob==tex->vd->object)) tex->vd->object= NULL;
}
/* worlds */
@@ -696,7 +700,7 @@ int exist_object(Object *obtest)
return 0;
}
-void *add_camera(char *name)
+void *add_camera(const char *name)
{
Camera *cam;
@@ -718,7 +722,6 @@ Camera *copy_camera(Camera *cam)
Camera *camn;
camn= copy_libblock(cam);
- camn->adt= BKE_copy_animdata(cam->adt);
return camn;
}
@@ -737,11 +740,11 @@ void make_local_camera(Camera *cam)
* - mixed: make copy
*/
- if(cam->id.lib==0) return;
+ if(cam->id.lib==NULL) return;
if(cam->id.us==1) {
- cam->id.lib= 0;
+ cam->id.lib= NULL;
cam->id.flag= LIB_LOCAL;
- new_id(0, (ID *)cam, 0);
+ new_id(NULL, (ID *)cam, NULL);
return;
}
@@ -755,9 +758,9 @@ void make_local_camera(Camera *cam)
}
if(local && lib==0) {
- cam->id.lib= 0;
+ cam->id.lib= NULL;
cam->id.flag= LIB_LOCAL;
- new_id(0, (ID *)cam, 0);
+ new_id(NULL, (ID *)cam, NULL);
}
else if(local && lib) {
camn= copy_camera(cam);
@@ -767,7 +770,7 @@ void make_local_camera(Camera *cam)
while(ob) {
if(ob->data==cam) {
- if(ob->id.lib==0) {
+ if(ob->id.lib==NULL) {
ob->data= camn;
camn->id.us++;
cam->id.us--;
@@ -798,7 +801,7 @@ float dof_camera(Object *ob)
return cam->YF_dofdist;
}
-void *add_lamp(char *name)
+void *add_lamp(const char *name)
{
Lamp *la;
@@ -886,11 +889,11 @@ void make_local_lamp(Lamp *la)
* - mixed: make copy
*/
- if(la->id.lib==0) return;
+ if(la->id.lib==NULL) return;
if(la->id.us==1) {
- la->id.lib= 0;
+ la->id.lib= NULL;
la->id.flag= LIB_LOCAL;
- new_id(0, (ID *)la, 0);
+ new_id(NULL, (ID *)la, NULL);
return;
}
@@ -904,9 +907,9 @@ void make_local_lamp(Lamp *la)
}
if(local && lib==0) {
- la->id.lib= 0;
+ la->id.lib= NULL;
la->id.flag= LIB_LOCAL;
- new_id(0, (ID *)la, 0);
+ new_id(NULL, (ID *)la, NULL);
}
else if(local && lib) {
lan= copy_lamp(la);
@@ -916,7 +919,7 @@ void make_local_lamp(Lamp *la)
while(ob) {
if(ob->data==la) {
- if(ob->id.lib==0) {
+ if(ob->id.lib==NULL) {
ob->data= lan;
lan->id.us++;
la->id.us--;
@@ -973,7 +976,7 @@ static void *add_obdata_from_type(int type)
}
}
-static char *get_obdata_defname(int type)
+static const char *get_obdata_defname(int type)
{
switch (type) {
case OB_MESH: return "Mesh";
@@ -993,7 +996,7 @@ static char *get_obdata_defname(int type)
}
/* more general add: creates minimum required data, but without vertices etc. */
-Object *add_only_object(int type, char *name)
+Object *add_only_object(int type, const char *name)
{
Object *ob;
@@ -1011,10 +1014,13 @@ Object *add_only_object(int type, char *name)
* but rotations default to quaternions
*/
ob->rotmode= ROT_MODE_EUL;
- /* axis-angle must not have a 0,0,0 axis, so set y-axis as default... */
- ob->rotAxis[1]= ob->drotAxis[1]= 1.0f;
- /* quaternions should be 1,0,0,0 by default.... */
- ob->quat[0]= ob->dquat[0]= 1.0f;
+
+ unit_axis_angle(ob->rotAxis, &ob->rotAngle);
+ unit_axis_angle(ob->drotAxis, &ob->drotAngle);
+
+ unit_qt(ob->quat);
+ unit_qt(ob->dquat);
+
/* rotation locks should be 4D for 4 component rotations by default... */
ob->protectflag = OB_LOCK_ROT4D;
@@ -1022,7 +1028,7 @@ Object *add_only_object(int type, char *name)
unit_m4(ob->parentinv);
unit_m4(ob->obmat);
ob->dt= OB_TEXTURE;
- ob->empty_drawtype= OB_ARROWS;
+ ob->empty_drawtype= OB_PLAINAXES;
ob->empty_drawsize= 1.0;
if(type==OB_CAMERA || type==OB_LAMP) {
@@ -1073,7 +1079,7 @@ Object *add_object(struct Scene *scene, int type)
Base *base;
char name[32];
- strcpy(name, get_obdata_defname(type));
+ BLI_strncpy(name, get_obdata_defname(type), sizeof(name));
ob = add_only_object(type, name);
ob->data= add_obdata_from_type(type);
@@ -1082,7 +1088,7 @@ Object *add_object(struct Scene *scene, int type)
base= scene_add_base(scene, ob);
scene_select_base(scene, base);
- ob->recalc |= OB_RECALC_ALL;
+ ob->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME;
return ob;
}
@@ -1122,7 +1128,7 @@ BulletSoftBody *copy_bulletsoftbody(BulletSoftBody *bsb)
return bsbn;
}
-ParticleSystem *copy_particlesystem(ParticleSystem *psys)
+static ParticleSystem *copy_particlesystem(ParticleSystem *psys)
{
ParticleSystem *psysn;
ParticleData *pa;
@@ -1267,6 +1273,17 @@ static void copy_object_pose(Object *obn, Object *ob)
}
}
+static void copy_object_transform(Object *ob_tar, Object *ob_src)
+{
+ copy_v3_v3(ob_tar->loc, ob_src->loc);
+ copy_v3_v3(ob_tar->rot, ob_src->rot);
+ copy_v3_v3(ob_tar->quat, ob_src->quat);
+ copy_v3_v3(ob_tar->rotAxis, ob_src->rotAxis);
+ ob_tar->rotAngle= ob_src->rotAngle;
+ ob_tar->rotmode= ob_src->rotmode;
+ copy_v3_v3(ob_tar->size, ob_src->size);
+}
+
Object *copy_object(Object *ob)
{
Object *obn;
@@ -1315,8 +1332,8 @@ Object *copy_object(Object *ob)
/* increase user numbers */
id_us_plus((ID *)obn->data);
+ id_us_plus((ID *)obn->gpd);
id_lib_extern((ID *)obn->dup_group);
-
for(a=0; a<obn->totcol; a++) id_us_plus((ID *)obn->mat[a]);
@@ -1339,6 +1356,8 @@ Object *copy_object(Object *ob)
obn->gpulamp.first = obn->gpulamp.last = NULL;
obn->pc_ids.first = obn->pc_ids.last = NULL;
+
+ obn->mpath= NULL;
return obn;
}
@@ -1466,7 +1485,7 @@ static void armature_set_id_extern(Object *ob)
{
bArmature *arm= ob->data;
bPoseChannel *pchan;
- int lay= arm->layer_protected;
+ unsigned int lay= arm->layer_protected;
for (pchan = ob->pose->chanbase.first; pchan; pchan=pchan->next) {
if(!(pchan->bone->layer & lay))
@@ -1529,25 +1548,25 @@ void object_make_proxy(Object *ob, Object *target, Object *gob)
ob->proxy_group= gob;
id_lib_extern(&target->id);
- ob->recalc= target->recalc= OB_RECALC_ALL;
+ ob->recalc= target->recalc= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME;
- /* copy transform */
+ /* copy transform
+ * - gob means this proxy comes from a group, just apply the matrix
+ * so the object wont move from its dupli-transform.
+ *
+ * - no gob means this is being made from a linked object,
+ * this is closer to making a copy of the object - in-place. */
if(gob) {
- VECCOPY(ob->loc, gob->loc);
- VECCOPY(ob->rot, gob->rot);
- VECCOPY(ob->size, gob->size);
-
- group_tag_recalc(gob->dup_group);
+ ob->rotmode= target->rotmode;
+ mul_m4_m4m4(ob->obmat, target->obmat, gob->obmat);
+ object_apply_mat4(ob, ob->obmat, FALSE, TRUE);
}
else {
- VECCOPY(ob->loc, target->loc);
- VECCOPY(ob->rot, target->rot);
- VECCOPY(ob->size, target->size);
+ copy_object_transform(ob, target);
+ ob->parent= target->parent; /* libdata */
+ copy_m4_m4(ob->parentinv, target->parentinv);
}
- ob->parent= target->parent; /* libdata */
- copy_m4_m4(ob->parentinv, target->parentinv);
-
/* copy animdata stuff - drivers only for now... */
object_copy_proxy_drivers(ob, target);
@@ -1588,7 +1607,17 @@ void object_make_proxy(Object *ob, Object *target, Object *gob)
armature_set_id_extern(ob);
}
-
+
+ /* copy IDProperties */
+ if(ob->id.properties) {
+ IDP_FreeProperty(ob->id.properties);
+ MEM_freeN(ob->id.properties);
+ ob->id.properties= NULL;
+ }
+ if(target->id.properties) {
+ ob->id.properties= IDP_CopyProperty(target->id.properties);
+ }
+
/* copy drawtype info */
ob->dt= target->dt;
}
@@ -1598,7 +1627,7 @@ void object_make_proxy(Object *ob, Object *target, Object *gob)
/* there is also a timing calculation in drawobject() */
-int no_speed_curve= 0;
+static int no_speed_curve= 0;
void disable_speed_curve(int val)
{
@@ -1607,7 +1636,7 @@ void disable_speed_curve(int val)
// XXX THIS CRUFT NEEDS SERIOUS RECODING ASAP!
/* ob can be NULL */
-float bsystem_time(struct Scene *scene, Object *ob, float cfra, float ofs)
+float bsystem_time(struct Scene *scene, Object *UNUSED(ob), float cfra, float ofs)
{
/* returns float ( see BKE_curframe in scene.c) */
cfra += scene->r.subframe;
@@ -1636,7 +1665,7 @@ void object_scale_to_mat3(Object *ob, float mat[][3])
size_to_mat3( mat,vec);
}
-// TODO: this should take rotation orders into account later...
+
void object_rot_to_mat3(Object *ob, float mat[][3])
{
float rmat[3][3], dmat[3][3];
@@ -1659,41 +1688,67 @@ void object_rot_to_mat3(Object *ob, float mat[][3])
}
else {
/* quats are normalised before use to eliminate scaling issues */
- normalize_qt(ob->quat);
- quat_to_mat3( rmat,ob->quat);
- quat_to_mat3( dmat,ob->dquat);
+ float tquat[4];
+
+ normalize_qt_qt(tquat, ob->quat);
+ quat_to_mat3(rmat, tquat);
+
+ normalize_qt_qt(tquat, ob->dquat);
+ quat_to_mat3(dmat, tquat);
}
/* combine these rotations */
- // XXX is this correct? if errors, change the order of multiplication...
mul_m3_m3m3(mat, dmat, rmat);
}
-void object_mat3_to_rot(Object *ob, float mat[][3], int use_compat)
+void object_mat3_to_rot(Object *ob, float mat[][3], short use_compat)
{
- if (ob->rotmode == ROT_MODE_QUAT)
- mat3_to_quat(ob->quat, mat);
- else if (ob->rotmode == ROT_MODE_AXISANGLE)
- mat3_to_axis_angle(ob->rotAxis, &ob->rotAngle, mat);
- else {
- if(use_compat) {
- float eul[3];
- VECCOPY(eul, ob->rot);
- mat3_to_compatible_eulO(ob->rot, eul, ob->rotmode, mat);
+ switch(ob->rotmode) {
+ case ROT_MODE_QUAT:
+ {
+ float dquat[4];
+ mat3_to_quat(ob->quat, mat);
+ normalize_qt_qt(dquat, ob->dquat);
+ invert_qt(dquat);
+ mul_qt_qtqt(ob->quat, dquat, ob->quat);
}
- else
- mat3_to_eulO(ob->rot, ob->rotmode, mat);
+ break;
+ case ROT_MODE_AXISANGLE:
+ mat3_to_axis_angle(ob->rotAxis, &ob->rotAngle, mat);
+ sub_v3_v3(ob->rotAxis, ob->drotAxis);
+ ob->rotAngle -= ob->drotAngle;
+ break;
+ default: /* euler */
+ if(use_compat) mat3_to_compatible_eulO(ob->rot, ob->rot, ob->rotmode, mat);
+ else mat3_to_eulO(ob->rot, ob->rotmode, mat);
+ sub_v3_v3(ob->rot, ob->drot);
}
}
/* see pchan_apply_mat4() for the equivalent 'pchan' function */
-void object_apply_mat4(Object *ob, float mat[][4])
+void object_apply_mat4(Object *ob, float mat[][4], const short use_compat, const short use_parent)
{
- float mat3[3][3];
- copy_v3_v3(ob->loc, mat[3]);
- mat4_to_size(ob->size, mat);
- copy_m3_m4(mat3, mat);
- object_mat3_to_rot(ob, mat3, 0);
+ float rot[3][3];
+
+ if(use_parent && ob->parent) {
+ float rmat[4][4], diff_mat[4][4], imat[4][4];
+ mul_m4_m4m4(diff_mat, ob->parentinv, ob->parent->obmat);
+ invert_m4_m4(imat, diff_mat);
+ mul_m4_m4m4(rmat, mat, imat); /* get the parent relative matrix */
+ object_apply_mat4(ob, rmat, use_compat, FALSE);
+
+ /* same as below, use rmat rather then mat */
+ mat4_to_loc_rot_size(ob->loc, rot, ob->size, rmat);
+ object_mat3_to_rot(ob, rot, use_compat);
+ }
+ else {
+ mat4_to_loc_rot_size(ob->loc, rot, ob->size, mat);
+ object_mat3_to_rot(ob, rot, use_compat);
+ }
+
+ sub_v3_v3(ob->loc, ob->dloc);
+ sub_v3_v3(ob->size, ob->dsize);
+ /* object_mat3_to_rot handles delta rotations */
}
void object_to_mat3(Object *ob, float mat[][3]) /* no parent */
@@ -1721,12 +1776,13 @@ void object_to_mat4(Object *ob, float mat[][4])
add_v3_v3v3(mat[3], ob->loc, ob->dloc);
}
+/* extern */
int enable_cu_speed= 1;
static void ob_parcurve(Scene *scene, Object *ob, Object *par, float mat[][4])
{
Curve *cu;
- float q[4], vec[4], dir[3], quat[4], radius, x1, ctime;
+ float vec[4], dir[3], quat[4], radius, ctime;
float timeoffs = 0.0, sf_orig = 0.0;
unit_m4(mat);
@@ -1754,12 +1810,17 @@ static void ob_parcurve(Scene *scene, Object *ob, Object *par, float mat[][4])
* we divide the curvetime calculated in the previous step by the length of the path, to get a time
* factor, which then gets clamped to lie within 0.0 - 1.0 range
*/
- ctime= cu->ctime / cu->pathlen;
+ if (IS_EQ(cu->pathlen, 0.0f) == 0)
+ ctime= cu->ctime / cu->pathlen;
+ else
+ ctime= cu->ctime;
+
CLAMP(ctime, 0.0, 1.0);
}
else {
ctime= scene->r.cfra - give_timeoffset(ob);
- ctime /= cu->pathlen;
+ if (IS_EQ(cu->pathlen, 0.0f) == 0)
+ ctime /= cu->pathlen;
CLAMP(ctime, 0.0, 1.0);
}
@@ -1774,9 +1835,11 @@ static void ob_parcurve(Scene *scene, Object *ob, Object *par, float mat[][4])
/* vec: 4 items! */
- if( where_on_path(par, ctime, vec, dir, NULL, &radius, NULL) ) {
+ if( where_on_path(par, ctime, vec, dir, cu->flag & CU_FOLLOW ? quat:NULL, &radius, NULL) ) {
if(cu->flag & CU_FOLLOW) {
+#if 0
+ float x1, q[4];
vec_to_quat( quat,dir, ob->trackflag, ob->upflag);
/* the tilt */
@@ -1787,8 +1850,11 @@ static void ob_parcurve(Scene *scene, Object *ob, Object *par, float mat[][4])
q[2]= -x1*dir[1];
q[3]= -x1*dir[2];
mul_qt_qtqt(quat, q, quat);
-
- quat_to_mat4( mat,quat);
+#else
+ quat_apply_track(quat, ob->trackflag, ob->upflag);
+#endif
+ normalize_qt(quat);
+ quat_to_mat4(mat, quat);
}
if(cu->flag & CU_PATH_RADIUS) {
@@ -2044,7 +2110,7 @@ void where_is_object_time(Scene *scene, Object *ob, float ctime)
}
/* solve constraints */
- if (ob->constraints.first && !(ob->flag & OB_NO_CONSTRAINTS)) {
+ if (ob->constraints.first && !(ob->transflag & OB_NO_CONSTRAINTS)) {
bConstraintOb *cob;
cob= constraints_make_evalob(scene, ob, NULL, CONSTRAINT_OBTYPE_OBJECT);
@@ -2129,7 +2195,7 @@ static void solve_parenting (Scene *scene, Object *ob, Object *par, float obmat[
copy_m3_m4(originmat, tmat);
// origin, voor help line
- if( (ob->partype & 15)==PARSKEL ) {
+ if( (ob->partype & PARTYPE)==PARSKEL ) {
VECCOPY(ob->orig, par->obmat[3]);
}
else {
@@ -2215,7 +2281,7 @@ void what_does_parent(Scene *scene, Object *ob, Object *workob)
where_is_object(scene, workob);
}
-BoundBox *unit_boundbox()
+BoundBox *unit_boundbox(void)
{
BoundBox *bb;
float min[3] = {-1.0f,-1.0f,-1.0f}, max[3] = {-1.0f,-1.0f,-1.0f};
@@ -2516,46 +2582,64 @@ void object_handle_update(Scene *scene, Object *ob)
if (G.f & G_DEBUG)
printf("recalcdata %s\n", ob->id.name+2);
- /* includes all keys and modifiers */
- if(ob->type==OB_MESH) {
- BMEditMesh *em = (ob == scene->obedit)? ((Mesh*)ob->data)->edit_btmesh : NULL;
-
+
+ if(adt) {
/* evaluate drivers */
- // XXX: should we push this to derivedmesh instead?
+ // XXX: for mesh types, should we push this to derivedmesh instead?
BKE_animsys_evaluate_animdata(data_id, adt, ctime, ADT_RECALC_DRIVERS);
+
- // here was vieweditdatamask? XXX
- if(em) {
- makeDerivedMesh(scene, ob, em, CD_MASK_BAREMESH);
- } else
- makeDerivedMesh(scene, ob, NULL, CD_MASK_BAREMESH);
}
- else if(ob->type==OB_MBALL) {
- makeDispListMBall(scene, ob);
- }
- else if(ELEM3(ob->type, OB_CURVE, OB_SURF, OB_FONT)) {
- makeDispListCurveTypes(scene, ob, 0);
- }
- else if(ELEM(ob->type, OB_CAMERA, OB_LAMP)) {
- /* evaluate drivers */
- BKE_animsys_evaluate_animdata(data_id, adt, ctime, ADT_RECALC_DRIVERS);
- }
- else if(ob->type==OB_LATTICE) {
- lattice_calc_modifiers(scene, ob);
- }
- else if(ob->type==OB_ARMATURE) {
- /* evaluate drivers */
- BKE_animsys_evaluate_animdata(data_id, adt, ctime, ADT_RECALC_DRIVERS);
-
+
+ /* includes all keys and modifiers */
+ switch(ob->type) {
+ case OB_MESH:
+ {
+#if 0 // XXX, comment for 2.56a release, background wont set 'scene->customdata_mask'
+ BMEditMesh *em = (ob == scene->obedit)? ((Mesh*)ob->data)->edit_btmesh : NULL;
+ BLI_assert((scene->customdata_mask & CD_MASK_BAREMESH) == CD_MASK_BAREMESH);
+ if(em) {
+ makeDerivedMesh(scene, ob, em, scene->customdata_mask); /* was CD_MASK_BAREMESH */
+ } else
+ makeDerivedMesh(scene, ob, NULL, scene->customdata_mask);
+
+#else /* ensure CD_MASK_BAREMESH for now */
+ BMEditMesh *em = (ob == scene->obedit)? ((Mesh*)ob->data)->edit_btmesh : NULL;
+ if(em) {
+ makeDerivedMesh(scene, ob, em, scene->customdata_mask | CD_MASK_BAREMESH); /* was CD_MASK_BAREMESH */
+ } else
+ makeDerivedMesh(scene, ob, NULL, scene->customdata_mask | CD_MASK_BAREMESH);
+#endif
+
+ }
+ break;
+
+ case OB_ARMATURE:
if(ob->id.lib && ob->proxy_from) {
- copy_pose_result(ob->pose, ob->proxy_from->pose);
// printf("pose proxy copy, lib ob %s proxy %s\n", ob->id.name, ob->proxy_from->id.name);
+ copy_pose_result(ob->pose, ob->proxy_from->pose);
}
else {
where_is_pose(scene, ob);
}
+ break;
+
+ case OB_MBALL:
+ makeDispListMBall(scene, ob);
+ break;
+
+ case OB_CURVE:
+ case OB_SURF:
+ case OB_FONT:
+ makeDispListCurveTypes(scene, ob, 0);
+ break;
+
+ case OB_LATTICE:
+ lattice_calc_modifiers(scene, ob);
+ break;
}
+
if(ob->particlesystem.first) {
ParticleSystem *tpsys, *psys;
DerivedMesh *dm;
@@ -2879,7 +2963,7 @@ void object_delete_ptcache(Object *ob, int index)
/* shape key utility function */
/************************* Mesh ************************/
-static KeyBlock *insert_meshkey(Scene *scene, Object *ob, char *name, int from_mix)
+static KeyBlock *insert_meshkey(Scene *scene, Object *ob, const char *name, int from_mix)
{
Mesh *me= ob->data;
Key *key= me->key;
@@ -2910,7 +2994,7 @@ static KeyBlock *insert_meshkey(Scene *scene, Object *ob, char *name, int from_m
return kb;
}
/************************* Lattice ************************/
-static KeyBlock *insert_lattkey(Scene *scene, Object *ob, char *name, int from_mix)
+static KeyBlock *insert_lattkey(Scene *scene, Object *ob, const char *name, int from_mix)
{
Lattice *lt= ob->data;
Key *key= lt->key;
@@ -2942,7 +3026,7 @@ static KeyBlock *insert_lattkey(Scene *scene, Object *ob, char *name, int from_m
return kb;
}
/************************* Curve ************************/
-static KeyBlock *insert_curvekey(Scene *scene, Object *ob, char *name, int from_mix)
+static KeyBlock *insert_curvekey(Scene *scene, Object *ob, const char *name, int from_mix)
{
Curve *cu= ob->data;
Key *key= cu->key;
@@ -2978,7 +3062,7 @@ static KeyBlock *insert_curvekey(Scene *scene, Object *ob, char *name, int from_
return kb;
}
-KeyBlock *object_insert_shape_key(Scene *scene, Object *ob, char *name, int from_mix)
+KeyBlock *object_insert_shape_key(Scene *scene, Object *ob, const char *name, int from_mix)
{
if(ob->type==OB_MESH) return insert_meshkey(scene, ob, name, from_mix);
else if ELEM(ob->type, OB_CURVE, OB_SURF)return insert_curvekey(scene, ob, name, from_mix);