diff options
Diffstat (limited to 'source/blender/blenkernel')
23 files changed, 208 insertions, 96 deletions
diff --git a/source/blender/blenkernel/BKE_deform.h b/source/blender/blenkernel/BKE_deform.h index ab27421b383..0fa7356b64e 100644 --- a/source/blender/blenkernel/BKE_deform.h +++ b/source/blender/blenkernel/BKE_deform.h @@ -56,6 +56,7 @@ void defvert_remove_group(struct MDeformVert *dvert, struct void defvert_clear(struct MDeformVert *dvert); int defvert_find_shared(const struct MDeformVert *dvert_a, const struct MDeformVert *dvert_b); +void BKE_defvert_array_free_elems(struct MDeformVert *dvert, int totvert); void BKE_defvert_array_free(struct MDeformVert *dvert, int totvert); void BKE_defvert_array_copy(struct MDeformVert *dst, const struct MDeformVert *src, int totvert); diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h index 54189e26c92..19c04676548 100644 --- a/source/blender/blenkernel/BKE_object.h +++ b/source/blender/blenkernel/BKE_object.h @@ -50,6 +50,7 @@ struct RenderData; struct rctf; struct MovieClip; struct Main; +struct RigidBodyWorld; void BKE_object_workob_clear(struct Object *workob); void BKE_object_workob_calc_parent(struct Scene *scene, struct Object *ob, struct Object *workob); @@ -100,7 +101,9 @@ int BKE_object_pose_context_check(struct Object *ob); struct Object *BKE_object_pose_armature_get(struct Object *ob); void BKE_object_where_is_calc(struct Scene *scene, struct Object *ob); +void BKE_object_where_is_calc_ex(struct Scene *scene, struct RigidBodyWorld *rbw, struct Object *ob); void BKE_object_where_is_calc_time(struct Scene *scene, struct Object *ob, float ctime); +void BKE_object_where_is_calc_time_ex(struct Scene *scene, struct RigidBodyWorld *rbw, struct Object *ob, float ctime); void BKE_object_where_is_calc_simul(struct Scene *scene, struct Object *ob); void BKE_object_where_is_calc_mat4(struct Scene *scene, struct Object *ob, float obmat[4][4]); @@ -146,6 +149,7 @@ void BKE_object_tfm_protected_restore(struct Object *ob, const short protectflag); void BKE_object_handle_update(struct Scene *scene, struct Object *ob); +void BKE_object_handle_update_ex(struct Scene *scene, struct RigidBodyWorld *rbw, struct Object *ob); void BKE_object_sculpt_modifiers_changed(struct Object *ob); int BKE_object_obdata_texspace_get(struct Object *ob, short **r_texflag, float **r_loc, float **r_size, float **r_rot); diff --git a/source/blender/blenkernel/BKE_rigidbody.h b/source/blender/blenkernel/BKE_rigidbody.h index 2b19f60b5e4..12779a697b6 100644 --- a/source/blender/blenkernel/BKE_rigidbody.h +++ b/source/blender/blenkernel/BKE_rigidbody.h @@ -89,7 +89,7 @@ void BKE_rigidbody_remove_constraint(struct Scene *scene, struct Object *ob); /* Simulation */ void BKE_rigidbody_aftertrans_update(struct Object *ob, float loc[3], float rot[3], float quat[4], float rotAxis[3], float rotAngle); -void BKE_rigidbody_sync_transforms(struct Scene *scene, struct Object *ob, float ctime); +void BKE_rigidbody_sync_transforms(struct RigidBodyWorld *rbw, struct Object *ob, float ctime); void BKE_rigidbody_cache_reset(struct RigidBodyWorld *rbw); void BKE_rigidbody_do_simulation(struct Scene *scene, float ctime); diff --git a/source/blender/blenkernel/BKE_text.h b/source/blender/blenkernel/BKE_text.h index dc84bc67647..3e882a048eb 100644 --- a/source/blender/blenkernel/BKE_text.h +++ b/source/blender/blenkernel/BKE_text.h @@ -66,8 +66,8 @@ void txt_move_up (struct Text *text, short sel); void txt_move_down (struct Text *text, short sel); void txt_move_left (struct Text *text, short sel); void txt_move_right (struct Text *text, short sel); -void txt_jump_left (struct Text *text, short sel); -void txt_jump_right (struct Text *text, short sel); +void txt_jump_left (struct Text *text, bool sel, bool use_init_step); +void txt_jump_right (struct Text *text, bool sel, bool use_init_step); void txt_move_bof (struct Text *text, short sel); void txt_move_eof (struct Text *text, short sel); void txt_move_bol (struct Text *text, short sel); diff --git a/source/blender/blenkernel/intern/anim.c b/source/blender/blenkernel/intern/anim.c index bc9c8a7ad50..a6b3008e00a 100644 --- a/source/blender/blenkernel/intern/anim.c +++ b/source/blender/blenkernel/intern/anim.c @@ -967,7 +967,7 @@ static void vertex_duplilist(ListBase *lb, ID *id, Scene *scene, Object *par, fl dm = editbmesh_get_derived_cage(scene, par, em, CD_MASK_BAREMESH); } else - dm = mesh_get_derived_deform(scene, par, CD_MASK_BAREMESH); + dm = mesh_get_derived_final(scene, par, CD_MASK_BAREMESH); if (flag & DUPLILIST_FOR_RENDER) { vdd.orco = (float(*)[3])BKE_mesh_orco_verts_get(par); @@ -1094,7 +1094,7 @@ static void face_duplilist(ListBase *lb, ID *id, Scene *scene, Object *par, floa dm = editbmesh_get_derived_cage(scene, par, em, CD_MASK_BAREMESH); } else { - dm = mesh_get_derived_deform(scene, par, CD_MASK_BAREMESH); + dm = mesh_get_derived_final(scene, par, CD_MASK_BAREMESH); } totface = dm->getNumPolys(dm); diff --git a/source/blender/blenkernel/intern/brush.c b/source/blender/blenkernel/intern/brush.c index 2ce5053bdcc..ba69fa4336e 100644 --- a/source/blender/blenkernel/intern/brush.c +++ b/source/blender/blenkernel/intern/brush.c @@ -588,11 +588,16 @@ void BKE_brush_imbuf_new(const Scene *scene, Brush *brush, short flt, short texf else if (texfall == 1) { BKE_brush_sample_tex_2D(scene, brush, xy, dstf, 0); } - else { + else if (texfall == 2) { BKE_brush_sample_tex_2D(scene, brush, xy, rgba, 0); mul_v3_v3v3(dstf, rgba, brush_rgb); dstf[3] = rgba[3] * alpha * BKE_brush_curve_strength_clamp(brush, len_v2(xy), radius); } + else { + BKE_brush_sample_tex_2D(scene, brush, xy, rgba, 0); + copy_v3_v3(dstf, brush_rgb); + dstf[3] = rgba[3] * alpha * BKE_brush_curve_strength_clamp(brush, len_v2(xy), radius); + } } } } diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c index 66b457ec502..7f2d9437c3d 100644 --- a/source/blender/blenkernel/intern/cdderivedmesh.c +++ b/source/blender/blenkernel/intern/cdderivedmesh.c @@ -1431,7 +1431,7 @@ static void cdDM_drawMappedFacesMat(DerivedMesh *dm, */ if (cddm->pbvh && cddm->pbvh_draw && BKE_pbvh_type(cddm->pbvh) == PBVH_BMESH) { if (dm->numTessFaceData) { - setMaterial(userData, 1, NULL); + setMaterial(userData, 1, &gattribs); BKE_pbvh_draw(cddm->pbvh, NULL, NULL, NULL, FALSE); } diff --git a/source/blender/blenkernel/intern/deform.c b/source/blender/blenkernel/intern/deform.c index cea92d53916..de15100de0b 100644 --- a/source/blender/blenkernel/intern/deform.c +++ b/source/blender/blenkernel/intern/deform.c @@ -809,7 +809,7 @@ void BKE_defvert_array_copy(MDeformVert *dst, const MDeformVert *src, int copyco } -void BKE_defvert_array_free(MDeformVert *dvert, int totvert) +void BKE_defvert_array_free_elems(MDeformVert *dvert, int totvert) { /* Instead of freeing the verts directly, * call this function to delete any special @@ -823,6 +823,18 @@ void BKE_defvert_array_free(MDeformVert *dvert, int totvert) for (i = 0; i < totvert; i++) { if (dvert[i].dw) MEM_freeN(dvert[i].dw); } - MEM_freeN(dvert); } +void BKE_defvert_array_free(MDeformVert *dvert, int totvert) +{ + /* Instead of freeing the verts directly, + * call this function to delete any special + * vert data */ + if (!dvert) + return; + + /* Free any special data from the verts */ + BKE_defvert_array_free_elems(dvert, totvert); + + MEM_freeN(dvert); +} diff --git a/source/blender/blenkernel/intern/depsgraph.c b/source/blender/blenkernel/intern/depsgraph.c index dab4235559a..99d0c5ed964 100644 --- a/source/blender/blenkernel/intern/depsgraph.c +++ b/source/blender/blenkernel/intern/depsgraph.c @@ -2353,6 +2353,7 @@ static void dag_object_time_update_flags(Scene *scene, Object *ob) if (object_modifiers_use_time(ob)) ob->recalc |= OB_RECALC_DATA; if ((ob->pose) && (ob->pose->flag & POSE_CONSTRAINTS_TIMEDEPEND)) ob->recalc |= OB_RECALC_DATA; + // XXX: scene here may not be the scene that contains the rigidbody world affecting this! if (ob->rigidbody_object && BKE_scene_check_rigidbody_active(scene)) ob->recalc |= OB_RECALC_OB; @@ -2440,7 +2441,11 @@ void DAG_scene_update_flags(Main *bmain, Scene *scene, unsigned int lay, const s if (do_time) { /* now if DagNode were part of base, the node->lay could be checked... */ /* we do all now, since the scene_flush checks layers and clears recalc flags even */ - dag_object_time_update_flags(scene, ob); + + /* NOTE: "sce_iter" not "scene" so that rigidbodies in background scenes work + * (i.e. muting + rbw availability can be checked and tagged properly) [#33970] + */ + dag_object_time_update_flags(sce_iter, ob); } /* handled in next loop */ diff --git a/source/blender/blenkernel/intern/dynamicpaint.c b/source/blender/blenkernel/intern/dynamicpaint.c index c92c52a7651..685d66195c7 100644 --- a/source/blender/blenkernel/intern/dynamicpaint.c +++ b/source/blender/blenkernel/intern/dynamicpaint.c @@ -2379,7 +2379,8 @@ int dynamicPaint_createUVSurface(DynamicPaintSurface *surface) dot11 = d2[0] * d2[0] + d2[1] * d2[1]; dot12 = d2[0] * d3[0] + d2[1] * d3[1]; - invDenom = 1 / (dot00 * dot11 - dot01 * dot01); + invDenom = (dot00 * dot11 - dot01 * dot01); + invDenom = invDenom ? 1.0f / invDenom : 1.0f; u = (dot11 * dot02 - dot01 * dot12) * invDenom; v = (dot00 * dot12 - dot01 * dot02) * invDenom; @@ -2399,7 +2400,8 @@ int dynamicPaint_createUVSurface(DynamicPaintSurface *surface) dot11 = d2[0] * d2[0] + d2[1] * d2[1]; dot12 = d2[0] * d3[0] + d2[1] * d3[1]; - invDenom = 1 / (dot00 * dot11 - dot01 * dot01); + invDenom = (dot00 * dot11 - dot01 * dot01); + invDenom = invDenom ? 1.0f / invDenom : 1.0f; u = (dot11 * dot02 - dot01 * dot12) * invDenom; v = (dot00 * dot12 - dot01 * dot02) * invDenom; diff --git a/source/blender/blenkernel/intern/effect.c b/source/blender/blenkernel/intern/effect.c index 1880cb42f4d..9e8693e957e 100644 --- a/source/blender/blenkernel/intern/effect.c +++ b/source/blender/blenkernel/intern/effect.c @@ -562,7 +562,7 @@ int closest_point_on_surface(SurfaceModifierData *surmd, const float co[3], floa if (mface->v4) add_v3_v3(surface_vel, surmd->v[mface->v4].co); - mul_v3_fl(surface_vel, mface->v4 ? 0.25f : 0.333f); + mul_v3_fl(surface_vel, mface->v4 ? 0.25f : (1.0f / 3.0f)); } return 1; } diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c index 018cd25187a..de85cb54cfd 100644 --- a/source/blender/blenkernel/intern/image.c +++ b/source/blender/blenkernel/intern/image.c @@ -2737,6 +2737,14 @@ static ImBuf *image_get_render_result(Image *ima, ImageUser *iuser, void **lock_ if (rres.have_combined && layer == 0) { /* pass */ } + else if (rect && layer == 0) { + /* rect32 is set when there's a Sequence pass, this pass seems + * to have layer=0 (this is from image_buttons.c) + * in this case we ignore float buffer, because it could have + * hung from previous pass which was float + */ + rectf = NULL; + } else if (rres.layers.first) { RenderLayer *rl = BLI_findlink(&rres.layers, layer - (rres.have_combined ? 1 : 0)); if (rl) { diff --git a/source/blender/blenkernel/intern/lattice.c b/source/blender/blenkernel/intern/lattice.c index fd57a88e279..c3e7a963c04 100644 --- a/source/blender/blenkernel/intern/lattice.c +++ b/source/blender/blenkernel/intern/lattice.c @@ -912,7 +912,7 @@ void outside_lattice(Lattice *lt) bp->vec[1] += (1.0f - fac1) * bp1->vec[1] + fac1 * bp2->vec[1]; bp->vec[2] += (1.0f - fac1) * bp1->vec[2] + fac1 * bp2->vec[2]; - mul_v3_fl(bp->vec, 0.3333333f); + mul_v3_fl(bp->vec, 1.0f / 3.0f); } } diff --git a/source/blender/blenkernel/intern/mball.c b/source/blender/blenkernel/intern/mball.c index d939b9cc3c0..5cc3145213c 100644 --- a/source/blender/blenkernel/intern/mball.c +++ b/source/blender/blenkernel/intern/mball.c @@ -1654,6 +1654,14 @@ static void polygonize(PROCESS *mbproc, MetaBall *mb) } } +/* could move to math api */ +BLI_INLINE void copy_v3_fl3(float v[3], float x, float y, float z) +{ + v[0] = x; + v[1] = y; + v[2] = z; +} + static float init_meta(Scene *scene, Object *ob) /* return totsize */ { Scene *sce_iter = scene; @@ -1730,6 +1738,7 @@ static float init_meta(Scene *scene, Object *ob) /* return totsize */ float temp1[4][4], temp2[4][4], temp3[4][4]; float (*mat)[4] = NULL, (*imat)[4] = NULL; float max_x, max_y, max_z, min_x, min_y, min_z; + float expx, expy, expz; max_x = max_y = max_z = -3.4e38; min_x = min_y = min_z = 3.4e38; @@ -1770,39 +1779,27 @@ static float init_meta(Scene *scene, Object *ob) /* return totsize */ G_mb.mainb[a]->mat = (float *) mat; G_mb.mainb[a]->imat = (float *) imat; + if (!MB_TYPE_SIZE_SQUARED(ml->type)) { + expx = ml->expx; + expy = ml->expy; + expz = ml->expz; + } + else { + expx = ml->expx * ml->expx; + expy = ml->expy * ml->expy; + expz = ml->expz * ml->expz; + } + /* untransformed Bounding Box of MetaElem */ - /* 0 */ - G_mb.mainb[a]->bb->vec[0][0] = -ml->expx; - G_mb.mainb[a]->bb->vec[0][1] = -ml->expy; - G_mb.mainb[a]->bb->vec[0][2] = -ml->expz; - /* 1 */ - G_mb.mainb[a]->bb->vec[1][0] = ml->expx; - G_mb.mainb[a]->bb->vec[1][1] = -ml->expy; - G_mb.mainb[a]->bb->vec[1][2] = -ml->expz; - /* 2 */ - G_mb.mainb[a]->bb->vec[2][0] = ml->expx; - G_mb.mainb[a]->bb->vec[2][1] = ml->expy; - G_mb.mainb[a]->bb->vec[2][2] = -ml->expz; - /* 3 */ - G_mb.mainb[a]->bb->vec[3][0] = -ml->expx; - G_mb.mainb[a]->bb->vec[3][1] = ml->expy; - G_mb.mainb[a]->bb->vec[3][2] = -ml->expz; - /* 4 */ - G_mb.mainb[a]->bb->vec[4][0] = -ml->expx; - G_mb.mainb[a]->bb->vec[4][1] = -ml->expy; - G_mb.mainb[a]->bb->vec[4][2] = ml->expz; - /* 5 */ - G_mb.mainb[a]->bb->vec[5][0] = ml->expx; - G_mb.mainb[a]->bb->vec[5][1] = -ml->expy; - G_mb.mainb[a]->bb->vec[5][2] = ml->expz; - /* 6 */ - G_mb.mainb[a]->bb->vec[6][0] = ml->expx; - G_mb.mainb[a]->bb->vec[6][1] = ml->expy; - G_mb.mainb[a]->bb->vec[6][2] = ml->expz; - /* 7 */ - G_mb.mainb[a]->bb->vec[7][0] = -ml->expx; - G_mb.mainb[a]->bb->vec[7][1] = ml->expy; - G_mb.mainb[a]->bb->vec[7][2] = ml->expz; + /* TODO, its possible the elem type has been changed and the exp* values can use a fallback */ + copy_v3_fl3(G_mb.mainb[a]->bb->vec[0], -expx, -expy, -expz); /* 0 */ + copy_v3_fl3(G_mb.mainb[a]->bb->vec[1], +expx, -expy, -expz); /* 1 */ + copy_v3_fl3(G_mb.mainb[a]->bb->vec[2], +expx, +expy, -expz); /* 2 */ + copy_v3_fl3(G_mb.mainb[a]->bb->vec[3], -expx, +expy, -expz); /* 3 */ + copy_v3_fl3(G_mb.mainb[a]->bb->vec[4], -expx, -expy, +expz); /* 4 */ + copy_v3_fl3(G_mb.mainb[a]->bb->vec[5], +expx, -expy, +expz); /* 5 */ + copy_v3_fl3(G_mb.mainb[a]->bb->vec[6], +expx, +expy, +expz); /* 6 */ + copy_v3_fl3(G_mb.mainb[a]->bb->vec[7], -expx, +expy, +expz); /* 7 */ /* transformation of Metalem bb */ for (i = 0; i < 8; i++) diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c index 21641e77b0b..c9c86e6739f 100644 --- a/source/blender/blenkernel/intern/mesh.c +++ b/source/blender/blenkernel/intern/mesh.c @@ -2999,6 +2999,36 @@ float BKE_mesh_calc_poly_area(MPoly *mpoly, MLoop *loopstart, } } +/* note, results won't be correct if polygon is non-planar */ +static float mesh_calc_poly_planar_area_centroid(MPoly *mpoly, MLoop *loopstart, MVert *mvarray, float cent[3]) +{ + int i; + float tri_area; + float total_area = 0.0f; + float v1[3], v2[3], v3[3], normal[3], tri_cent[3]; + + BKE_mesh_calc_poly_normal(mpoly, loopstart, mvarray, normal); + copy_v3_v3(v1, mvarray[loopstart[0].v].co); + copy_v3_v3(v2, mvarray[loopstart[1].v].co); + zero_v3(cent); + + for (i = 2; i < mpoly->totloop; i++) { + copy_v3_v3(v3, mvarray[loopstart[i].v].co); + + tri_area = area_tri_signed_v3(v1, v2, v3, normal); + total_area += tri_area; + + cent_tri_v3(tri_cent, v1, v2, v3); + madd_v3_v3fl(cent, tri_cent, tri_area); + + copy_v3_v3(v2, v3); + } + + mul_v3_fl(cent, 1.0f / total_area); + + return total_area; +} + /** * This function takes the difference between 2 vertex-coord-arrays * (\a vert_cos_src, \a vert_cos_dst), @@ -3292,9 +3322,8 @@ int BKE_mesh_center_centroid(Mesh *me, float cent[3]) /* calculate a weighted average of polygon centroids */ for (mpoly = me->mpoly; i--; mpoly++) { - BKE_mesh_calc_poly_center(mpoly, me->mloop + mpoly->loopstart, me->mvert, poly_cent); - poly_area = BKE_mesh_calc_poly_area(mpoly, me->mloop + mpoly->loopstart, me->mvert, NULL); - + poly_area = mesh_calc_poly_planar_area_centroid(mpoly, me->mloop + mpoly->loopstart, me->mvert, poly_cent); + madd_v3_v3fl(cent, poly_cent, poly_area); total_area += poly_area; } diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c index 498b3b226f6..119dc8c7d11 100644 --- a/source/blender/blenkernel/intern/object.c +++ b/source/blender/blenkernel/intern/object.c @@ -58,6 +58,7 @@ #include "DNA_world_types.h" #include "DNA_object_types.h" #include "DNA_property_types.h" +#include "DNA_rigidbody_types.h" #include "BLI_blenlib.h" #include "BLI_math.h" @@ -2027,7 +2028,7 @@ static void ob_parvert3(Object *ob, Object *par, float mat[4][4]) else { add_v3_v3v3(mat[3], v1, v2); add_v3_v3(mat[3], v3); - mul_v3_fl(mat[3], 0.3333333f); + mul_v3_fl(mat[3], 1.0f / 3.0f); } } } @@ -2130,7 +2131,8 @@ static int where_is_object_parslow(Object *ob, float obmat[4][4], float slowmat[ return 1; } -void BKE_object_where_is_calc_time(Scene *scene, Object *ob, float ctime) +/* note, scene is the active scene while actual_scene is the scene the object resides in */ +void BKE_object_where_is_calc_time_ex(Scene *scene, RigidBodyWorld *rbw, Object *ob, float ctime) { if (ob == NULL) return; @@ -2155,8 +2157,9 @@ void BKE_object_where_is_calc_time(Scene *scene, Object *ob, float ctime) else { BKE_object_to_mat4(ob, ob->obmat); } - - BKE_rigidbody_sync_transforms(scene, ob, ctime); + + /* read values pushed into RBO from sim/cache... */ + BKE_rigidbody_sync_transforms(rbw, ob, ctime); /* solve constraints */ if (ob->constraints.first && !(ob->transflag & OB_NO_CONSTRAINTS)) { @@ -2172,6 +2175,11 @@ void BKE_object_where_is_calc_time(Scene *scene, Object *ob, float ctime) else ob->transflag &= ~OB_NEG_SCALE; } +void BKE_object_where_is_calc_time(Scene *scene, Object *ob, float ctime) +{ + BKE_object_where_is_calc_time_ex(scene, NULL, ob, ctime); +} + /* get object transformation matrix without recalculating dependencies and * constraints -- assume dependencies are already solved by depsgraph. * no changes to object and it's parent would be done. @@ -2193,9 +2201,13 @@ void BKE_object_where_is_calc_mat4(Scene *scene, Object *ob, float obmat[4][4]) } } -void BKE_object_where_is_calc(struct Scene *scene, Object *ob) +void BKE_object_where_is_calc_ex(Scene *scene, RigidBodyWorld *rbw, Object *ob) { - BKE_object_where_is_calc_time(scene, ob, BKE_scene_frame_get(scene)); + BKE_object_where_is_calc_time_ex(scene, rbw, ob, BKE_scene_frame_get(scene)); +} +void BKE_object_where_is_calc(Scene *scene, Object *ob) +{ + BKE_object_where_is_calc_time_ex(scene, NULL, ob, BKE_scene_frame_get(scene)); } void BKE_object_where_is_calc_simul(Scene *scene, Object *ob) @@ -2631,7 +2643,8 @@ int BKE_object_parent_loop_check(const Object *par, const Object *ob) /* the main object update call, for object matrix, constraints, keys and displist (modifiers) */ /* requires flags to be set! */ -void BKE_object_handle_update(Scene *scene, Object *ob) +/* Ideally we shouldn't have to pass the rigid body world, but need bigger restructuring to avoid id */ +void BKE_object_handle_update_ex(Scene *scene, RigidBodyWorld *rbw, Object *ob) { if (ob->recalc & OB_RECALC_ALL) { /* speed optimization for animation lookups */ @@ -2672,7 +2685,7 @@ void BKE_object_handle_update(Scene *scene, Object *ob) copy_m4_m4(ob->obmat, ob->proxy_from->obmat); } else - BKE_object_where_is_calc(scene, ob); + BKE_object_where_is_calc_ex(scene, rbw, ob); } if (ob->recalc & OB_RECALC_DATA) { @@ -2826,6 +2839,15 @@ void BKE_object_handle_update(Scene *scene, Object *ob) // printf("set proxy pointer for later group stuff %s\n", ob->id.name); } } +/* WARNING: "scene" here may not be the scene object actually resides in. + * When dealing with background-sets, "scene" is actually the active scene. + * e.g. "scene" <-- set 1 <-- set 2 ("ob" lives here) <-- set 3 <-- ... <-- set n + * rigid bodies depend on their world so use BKE_object_handle_update_ex() to also pass along the corrent rigid body world + */ +void BKE_object_handle_update(Scene *scene, Object *ob) +{ + BKE_object_handle_update_ex(scene, NULL, ob); +} void BKE_object_sculpt_modifiers_changed(Object *ob) { diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c index fda5f6f2ecb..6e4937d11ec 100644 --- a/source/blender/blenkernel/intern/particle_system.c +++ b/source/blender/blenkernel/intern/particle_system.c @@ -802,7 +802,7 @@ static void distribute_threads_exec(ParticleThread *thread, ParticleData *pa, Ch if (mface->v4) psys_uv_to_w(0.5f, 0.5f, mface->v4, pa->fuv); else - psys_uv_to_w(0.33333f, 0.33333f, mface->v4, pa->fuv); + psys_uv_to_w(1.0f / 3.0f, 1.0f / 3.0f, mface->v4, pa->fuv); } else { ctx->jitoff[i] = fmod(ctx->jitoff[i],(float)ctx->jitlevel); diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c index 24355149926..26f0c25617f 100644 --- a/source/blender/blenkernel/intern/rigidbody.c +++ b/source/blender/blenkernel/intern/rigidbody.c @@ -1130,11 +1130,9 @@ static void rigidbody_update_simulation_post_step(RigidBodyWorld *rbw) } } } - /* Sync rigid body and object transformations */ -void BKE_rigidbody_sync_transforms(Scene *scene, Object *ob, float ctime) +void BKE_rigidbody_sync_transforms(RigidBodyWorld *rbw, Object *ob, float ctime) { - RigidBodyWorld *rbw = scene->rigidbody_world; RigidBodyOb *rbo = ob->rigidbody_object; /* keep original transform for kinematic and passive objects */ @@ -1165,6 +1163,7 @@ void BKE_rigidbody_sync_transforms(Scene *scene, Object *ob, float ctime) } } +/* Used when cancelling transforms - return rigidbody and object to initial states */ void BKE_rigidbody_aftertrans_update(Object *ob, float loc[3], float rot[3], float quat[4], float rotAxis[3], float rotAngle) { RigidBodyOb *rbo = ob->rigidbody_object; @@ -1216,6 +1215,8 @@ void BKE_rigidbody_do_simulation(Scene *scene, float ctime) BKE_ptcache_id_time(&pid, scene, ctime, &startframe, &endframe, NULL); cache = rbw->pointcache; + rbw->flag &= ~RBW_FLAG_FRAME_UPDATE; + /* flag cache as outdated if we don't have a world or number of objects in the simulation has changed */ if (rbw->physics_world == NULL || rbw->numbodies != BLI_countlist(&rbw->group->gobject)) { cache->flag |= PTCACHE_OUTDATED; diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c index 81084661368..9934d9b6e9a 100644 --- a/source/blender/blenkernel/intern/scene.c +++ b/source/blender/blenkernel/intern/scene.c @@ -1115,11 +1115,19 @@ static void scene_depsgraph_hack(Scene *scene, Scene *scene_parent) } +static void scene_flag_rbw_recursive(Scene *scene) +{ + if (scene->set) + scene_flag_rbw_recursive(scene->set); + + if (BKE_scene_check_rigidbody_active(scene)) + scene->rigidbody_world->flag |= RBW_FLAG_FRAME_UPDATE; +} + static void scene_update_tagged_recursive(Main *bmain, Scene *scene, Scene *scene_parent) { Base *base; - scene->customdata_mask = scene_parent->customdata_mask; /* sets first, we allow per definition current scene to have @@ -1127,11 +1135,27 @@ static void scene_update_tagged_recursive(Main *bmain, Scene *scene, Scene *scen if (scene->set) scene_update_tagged_recursive(bmain, scene->set, scene_parent); + /* run rigidbody sim + * - calculate/read values from cache into RBO's, to get flushed + * later when objects are evaluated (if they're tagged for eval) + */ + // XXX: this position may still change, objects not being updated correctly before simulation is run + // NOTE: current position is so that rigidbody sim affects other objects + if (BKE_scene_check_rigidbody_active(scene) && scene->rigidbody_world->flag & RBW_FLAG_FRAME_UPDATE) { + /* we use frame time of parent (this is "scene" itself for top-level of sets recursion), + * as that is the active scene controlling all timing in file at the moment + */ + float ctime = BKE_scene_frame_get(scene_parent); + + /* however, "scene" contains the rigidbody world needed for eval... */ + BKE_rigidbody_do_simulation(scene, ctime); + } + /* scene objects */ for (base = scene->base.first; base; base = base->next) { Object *ob = base->object; - BKE_object_handle_update(scene_parent, ob); + BKE_object_handle_update_ex(scene_parent, scene->rigidbody_world, ob); if (ob->dup_group && (ob->transflag & OB_DUPLIGROUP)) group_handle_recalc_and_update(scene_parent, ob, ob->dup_group); @@ -1232,13 +1256,7 @@ void BKE_scene_update_for_newframe(Main *bmain, Scene *sce, unsigned int lay) * such as Scene->World->MTex/Texture) can still get correctly overridden. */ BKE_animsys_evaluate_all_animation(bmain, sce, ctime); - /*...done with recusrive funcs */ - - /* run rigidbody sim */ - // XXX: this position may still change, objects not being updated correctly before simulation is run - // NOTE: current position is so that rigidbody sim affects other objects - if (BKE_scene_check_rigidbody_active(sce)) - BKE_rigidbody_do_simulation(sce, ctime); + /*...done with recursive funcs */ /* clear "LIB_DOIT" flag from all materials, to prevent infinite recursion problems later * when trying to find materials with drivers that need evaluating [#32017] @@ -1246,6 +1264,9 @@ void BKE_scene_update_for_newframe(Main *bmain, Scene *sce, unsigned int lay) tag_main_idcode(bmain, ID_MA, FALSE); tag_main_idcode(bmain, ID_LA, FALSE); + /* flag rigid body worlds for update */ + scene_flag_rbw_recursive(sce); + /* BKE_object_handle_update() on all objects, groups and sets */ scene_update_tagged_recursive(bmain, sce, sce); diff --git a/source/blender/blenkernel/intern/sequencer.c b/source/blender/blenkernel/intern/sequencer.c index f1724bdfc6b..45393726add 100644 --- a/source/blender/blenkernel/intern/sequencer.c +++ b/source/blender/blenkernel/intern/sequencer.c @@ -1820,8 +1820,6 @@ static ImBuf *input_preprocess(SeqRenderData context, Sequence *seq, float cfra, StripCrop c = {0}; StripTransform t = {0}; int sx, sy, dx, dy; - double xscale = 1.0; - double yscale = 1.0; if (is_proxy_image) { double f = seq_rendersize_to_scale_factor(context.preview_render_size); @@ -1838,21 +1836,23 @@ static ImBuf *input_preprocess(SeqRenderData context, Sequence *seq, float cfra, t = *seq->strip->transform; } - xscale = context.scene->r.xsch ? ((double)context.rectx / (double)context.scene->r.xsch) : 1.0; - yscale = context.scene->r.ysch ? ((double)context.recty / (double)context.scene->r.ysch) : 1.0; - - xscale /= (double)context.rectx / (double)ibuf->x; - yscale /= (double)context.recty / (double)ibuf->y; - - c.left *= xscale; c.right *= xscale; - c.top *= yscale; c.bottom *= yscale; - - t.xofs *= xscale; t.yofs *= yscale; + if (is_preprocessed) { + double xscale = context.scene->r.xsch ? ((double)context.rectx / (double)context.scene->r.xsch) : 1.0; + double yscale = context.scene->r.ysch ? ((double)context.recty / (double)context.scene->r.ysch) : 1.0; + if (seq->flag & SEQ_USE_TRANSFORM) { + t.xofs *= xscale; + t.yofs *= yscale; + } + if (seq->flag & SEQ_USE_CROP) { + c.left *= xscale; + c.right *= xscale; + c.top *= yscale; + c.bottom *= yscale; + } + } sx = ibuf->x - c.left - c.right; sy = ibuf->y - c.top - c.bottom; - dx = sx; - dy = sy; if (seq->flag & SEQ_USE_TRANSFORM) { if (is_preprocessed) { @@ -1864,6 +1864,10 @@ static ImBuf *input_preprocess(SeqRenderData context, Sequence *seq, float cfra, dy = context.scene->r.ysch; } } + else { + dx = sx; + dy = sy; + } if (c.top + c.bottom >= ibuf->y || c.left + c.right >= ibuf->x || diff --git a/source/blender/blenkernel/intern/smoke.c b/source/blender/blenkernel/intern/smoke.c index f56d03bfb57..248cd689258 100644 --- a/source/blender/blenkernel/intern/smoke.c +++ b/source/blender/blenkernel/intern/smoke.c @@ -1583,7 +1583,7 @@ BLI_INLINE void apply_inflow_fields(SmokeFlowSettings *sfs, float emission_value } /* set fire reaction coordinate */ - if (fuel && fuel[index]) { + if (fuel && fuel[index] > FLT_EPSILON) { /* instead of using 1.0 for all new fuel add slight falloff * to reduce flow blockiness */ float value = 1.0f - powf(1.0f - emission_value, 2.0f); @@ -1591,6 +1591,7 @@ BLI_INLINE void apply_inflow_fields(SmokeFlowSettings *sfs, float emission_value if (value > react[index]) { float f = fuel_flow / fuel[index]; react[index] = value * f + (1.0f - f) * react[index]; + CLAMP(react[index], 0.0f, value); } } } diff --git a/source/blender/blenkernel/intern/text.c b/source/blender/blenkernel/intern/text.c index 3be9097ce82..86e7a152a4a 100644 --- a/source/blender/blenkernel/intern/text.c +++ b/source/blender/blenkernel/intern/text.c @@ -38,12 +38,12 @@ #include "MEM_guardedalloc.h" +#include "BLI_utildefines.h" #include "BLI_path_util.h" #include "BLI_string.h" #include "BLI_string_cursor_utf8.h" #include "BLI_string_utf8.h" #include "BLI_listbase.h" -#include "BLI_utildefines.h" #include "BLI_fileops.h" #include "DNA_constraint_types.h" @@ -936,7 +936,7 @@ void txt_move_right(Text *text, short sel) if (!sel) txt_pop_sel(text); } -void txt_jump_left(Text *text, short sel) +void txt_jump_left(Text *text, bool sel, bool use_init_step) { TextLine **linep; int *charp; @@ -948,12 +948,12 @@ void txt_jump_left(Text *text, short sel) BLI_str_cursor_step_utf8((*linep)->line, (*linep)->len, charp, STRCUR_DIR_PREV, - STRCUR_JUMP_DELIM); + STRCUR_JUMP_DELIM, use_init_step); if (!sel) txt_pop_sel(text); } -void txt_jump_right(Text *text, short sel) +void txt_jump_right(Text *text, bool sel, bool use_init_step) { TextLine **linep; int *charp; @@ -965,7 +965,7 @@ void txt_jump_right(Text *text, short sel) BLI_str_cursor_step_utf8((*linep)->line, (*linep)->len, charp, STRCUR_DIR_NEXT, - STRCUR_JUMP_DELIM); + STRCUR_JUMP_DELIM, use_init_step); if (!sel) txt_pop_sel(text); } @@ -2402,7 +2402,7 @@ void txt_delete_char(Text *text) void txt_delete_word(Text *text) { - txt_jump_right(text, 1); + txt_jump_right(text, true, true); txt_delete_sel(text); } @@ -2451,7 +2451,7 @@ void txt_backspace_char(Text *text) void txt_backspace_word(Text *text) { - txt_jump_left(text, 1); + txt_jump_left(text, true, true); txt_delete_sel(text); } diff --git a/source/blender/blenkernel/intern/unit.c b/source/blender/blenkernel/intern/unit.c index 84e1f29f6c0..dd6ed42bd92 100644 --- a/source/blender/blenkernel/intern/unit.c +++ b/source/blender/blenkernel/intern/unit.c @@ -142,7 +142,7 @@ static struct bUnitCollection buImperialLenCollecton = {buImperialLenDef, 4, 0, /* Areas */ static struct bUnitDef buMetricAreaDef[] = { {"square kilometer", "square kilometers", "km²", "km2", "Square Kilometers", UN_SC_KM * UN_SC_KM, 0.0, B_UNIT_DEF_NONE}, - {"square hectometer", "square hectometers", "hm²", "hm2", "Square Hectometers", UN_SC_HM * UN_SC_HM, 0.0, B_UNIT_DEF_NONE}, /* hectare */ + {"square hectometer", "square hectometers", "hm²", "hm2", "Square Hectometers", UN_SC_HM * UN_SC_HM, 0.0, B_UNIT_DEF_SUPPRESS}, /* hectare */ {"square dekameter", "square dekameters", "dam²", "dam2", "Square Dekameters", UN_SC_DAM * UN_SC_DAM, 0.0, B_UNIT_DEF_SUPPRESS}, /* are */ {"square meter", "square meters", "m²", "m2", "Square Meters", UN_SC_M * UN_SC_M, 0.0, B_UNIT_DEF_NONE}, /* base unit */ {"square decimeter", "square decimetees", "dm²", "dm2", "Square Decimeters", UN_SC_DM * UN_SC_DM, 0.0, B_UNIT_DEF_SUPPRESS}, @@ -168,7 +168,7 @@ static struct bUnitCollection buImperialAreaCollecton = {buImperialAreaDef, 4, 0 /* Volumes */ static struct bUnitDef buMetricVolDef[] = { {"cubic kilometer", "cubic kilometers", "km³", "km3", "Cubic Kilometers", UN_SC_KM * UN_SC_KM * UN_SC_KM, 0.0, B_UNIT_DEF_NONE}, - {"cubic hectometer", "cubic hectometers", "hm³", "hm3", "Cubic Hectometers", UN_SC_HM * UN_SC_HM * UN_SC_HM, 0.0, B_UNIT_DEF_NONE}, + {"cubic hectometer", "cubic hectometers", "hm³", "hm3", "Cubic Hectometers", UN_SC_HM * UN_SC_HM * UN_SC_HM, 0.0, B_UNIT_DEF_SUPPRESS}, {"cubic dekameter", "cubic dekameters", "dam³", "dam3", "Cubic Dekameters", UN_SC_DAM * UN_SC_DAM * UN_SC_DAM, 0.0, B_UNIT_DEF_SUPPRESS}, {"cubic meter", "cubic meters", "m³", "m3", "Cubic Meters", UN_SC_M * UN_SC_M * UN_SC_M, 0.0, B_UNIT_DEF_NONE}, /* base unit */ {"cubic decimeter", "cubic decimeters", "dm³", "dm3", "Cubic Decimeters", UN_SC_DM * UN_SC_DM * UN_SC_DM, 0.0, B_UNIT_DEF_SUPPRESS}, @@ -194,9 +194,9 @@ static struct bUnitCollection buImperialVolCollecton = {buImperialVolDef, 4, 0, /* Mass */ static struct bUnitDef buMetricMassDef[] = { {"ton", "tonnes", "ton", "t", "1000 Kilograms", UN_SC_MTON, 0.0, B_UNIT_DEF_NONE}, - {"quintal", "quintals", "ql", "q", "100 Kilograms", UN_SC_QL, 0.0, B_UNIT_DEF_NONE}, + {"quintal", "quintals", "ql", "q", "100 Kilograms", UN_SC_QL, 0.0, B_UNIT_DEF_SUPPRESS}, {"kilogram", "kilograms", "kg", NULL, "Kilograms", UN_SC_KG, 0.0, B_UNIT_DEF_NONE}, /* base unit */ - {"hectogram", "hectograms", "hg", NULL, "Hectograms", UN_SC_HG, 0.0, B_UNIT_DEF_NONE}, + {"hectogram", "hectograms", "hg", NULL, "Hectograms", UN_SC_HG, 0.0, B_UNIT_DEF_SUPPRESS}, {"dekagram", "dekagrams", "dag", NULL, "10 Grams", UN_SC_DAG, 0.0, B_UNIT_DEF_SUPPRESS}, {"gram", "grams", "g", NULL, "Grams", UN_SC_G, 0.0, B_UNIT_DEF_NONE}, {NULL, NULL, NULL, NULL, NULL, 0.0, 0.0} |