diff options
author | Campbell Barton <ideasman42@gmail.com> | 2014-09-01 14:09:31 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2014-09-01 15:01:11 +0400 |
commit | e8f3fa99de8196a36736381b03015689492137bd (patch) | |
tree | f02e6a039cf55792053999a41220fbcbc8eaec59 /source/blender/blenkernel | |
parent | d91916725d0d20f95c6d4c069428bd1076680087 (diff) |
Support more object types scene-scale (on creation)
- lamp
- camera
- font
- empty & effector
Also fix inconsistency with apply transform
(modified shape-keys for meshes but not curve/lattice)
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r-- | source/blender/blenkernel/BKE_curve.h | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/BKE_lattice.h | 1 | ||||
-rw-r--r-- | source/blender/blenkernel/BKE_mball.h | 1 | ||||
-rw-r--r-- | source/blender/blenkernel/BKE_mesh.h | 1 | ||||
-rw-r--r-- | source/blender/blenkernel/BKE_object.h | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/curve.c | 45 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/lattice.c | 22 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/mball.c | 24 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/mesh.c | 21 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/object.c | 50 |
10 files changed, 168 insertions, 1 deletions
diff --git a/source/blender/blenkernel/BKE_curve.h b/source/blender/blenkernel/BKE_curve.h index 01770538390..5de7d9936e6 100644 --- a/source/blender/blenkernel/BKE_curve.h +++ b/source/blender/blenkernel/BKE_curve.h @@ -84,6 +84,8 @@ void BKE_curve_texspace_get(struct Curve *cu, float r_loc[3], float r_rot[3], fl bool BKE_curve_minmax(struct Curve *cu, bool use_radius, float min[3], float max[3]); bool BKE_curve_center_median(struct Curve *cu, float cent[3]); bool BKE_curve_center_bounds(struct Curve *cu, float cent[3]); +void BKE_curve_transform_ex(struct Curve *cu, float mat[4][4], bool do_keys, const float unit_scale); +void BKE_curve_transform(struct Curve *cu, float mat[4][4], bool do_keys); void BKE_curve_translate(struct Curve *cu, float offset[3], const bool do_keys); void BKE_curve_material_index_remove(struct Curve *cu, int index); void BKE_curve_material_index_clear(struct Curve *cu); diff --git a/source/blender/blenkernel/BKE_lattice.h b/source/blender/blenkernel/BKE_lattice.h index 8d8d3702634..5fb1053b53f 100644 --- a/source/blender/blenkernel/BKE_lattice.h +++ b/source/blender/blenkernel/BKE_lattice.h @@ -84,6 +84,7 @@ void BKE_lattice_minmax(struct Lattice *lt, float min[3], float max[3]); void BKE_lattice_center_median(struct Lattice *lt, float cent[3]); void BKE_lattice_center_bounds(struct Lattice *lt, float cent[3]); void BKE_lattice_translate(struct Lattice *lt, float offset[3], bool do_keys); +void BKE_lattice_transform(struct Lattice *lt, float mat[4][4], bool do_keys); int BKE_lattice_index_from_uvw(struct Lattice *lt, const int u, const int v, const int w); void BKE_lattice_index_to_uvw(struct Lattice *lt, const int index, int *r_u, int *r_v, int *r_w); diff --git a/source/blender/blenkernel/BKE_mball.h b/source/blender/blenkernel/BKE_mball.h index 56ea44fa6e9..c021960e730 100644 --- a/source/blender/blenkernel/BKE_mball.h +++ b/source/blender/blenkernel/BKE_mball.h @@ -63,6 +63,7 @@ bool BKE_mball_minmax_ex(struct MetaBall *mb, float min[3], float max[3], float obmat[4][4], const short flag); bool BKE_mball_center_median(struct MetaBall *mb, float r_cent[3]); bool BKE_mball_center_bounds(struct MetaBall *mb, float r_cent[3]); +void BKE_mball_transform(struct MetaBall *mb, float mat[4][4]); void BKE_mball_translate(struct MetaBall *mb, const float offset[3]); struct MetaElem *BKE_mball_element_add(struct MetaBall *mb, const int type); diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h index d0c268df93c..b2b9e37f500 100644 --- a/source/blender/blenkernel/BKE_mesh.h +++ b/source/blender/blenkernel/BKE_mesh.h @@ -133,6 +133,7 @@ struct Mesh *BKE_mesh_new_from_object(struct Main *bmain, struct Scene *sce, str /* vertex level transformations & checks (no derived mesh) */ bool BKE_mesh_minmax(struct Mesh *me, float r_min[3], float r_max[3]); +void BKE_mesh_transform(struct Mesh *me, float mat[4][4], bool do_keys); void BKE_mesh_translate(struct Mesh *me, const float offset[3], const bool do_keys); void BKE_mesh_ensure_navmesh(struct Mesh *me); diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h index 1468d60ef9d..1bfd26d4f8c 100644 --- a/source/blender/blenkernel/BKE_object.h +++ b/source/blender/blenkernel/BKE_object.h @@ -103,6 +103,8 @@ void BKE_object_make_local(struct Object *ob); bool BKE_object_is_libdata(struct Object *ob); bool BKE_object_obdata_is_libdata(struct Object *ob); +void BKE_object_obdata_size_init(struct Object *ob, const float scale); + void BKE_object_scale_to_mat3(struct Object *ob, float mat[3][3]); void BKE_object_rot_to_mat3(struct Object *ob, float mat[3][3], bool use_drot); void BKE_object_mat3_to_rot(struct Object *ob, float mat[3][3], bool use_compat); diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c index 671a18efc5b..730bffd2509 100644 --- a/source/blender/blenkernel/intern/curve.c +++ b/source/blender/blenkernel/intern/curve.c @@ -4282,7 +4282,50 @@ bool BKE_curve_center_bounds(Curve *cu, float cent[3]) return false; } -void BKE_curve_translate(Curve *cu, float offset[3], const bool do_keys) + +void BKE_curve_transform_ex(Curve *cu, float mat[4][4], bool do_keys, float unit_scale) +{ + Nurb *nu; + BPoint *bp; + BezTriple *bezt; + int i; + + for (nu = cu->nurb.first; nu; nu = nu->next) { + if (nu->type == CU_BEZIER) { + i = nu->pntsu; + for (bezt = nu->bezt; i--; bezt++) { + mul_m4_v3(mat, bezt->vec[0]); + mul_m4_v3(mat, bezt->vec[1]); + mul_m4_v3(mat, bezt->vec[2]); + bezt->radius *= unit_scale; + } + BKE_nurb_handles_calc(nu); + } + else { + i = nu->pntsu * nu->pntsv; + for (bp = nu->bp; i--; bp++) + mul_m4_v3(mat, bp->vec); + } + } + + if (do_keys && cu->key) { + KeyBlock *kb; + for (kb = cu->key->block.first; kb; kb = kb->next) { + float *fp = kb->data; + for (i = kb->totelem; i--; fp += 3) { + mul_m4_v3(mat, fp); + } + } + } +} + +void BKE_curve_transform(Curve *cu, float mat[4][4], bool do_keys) +{ + float unit_scale = mat4_to_scale(mat); + BKE_curve_transform_ex(cu, mat, do_keys, unit_scale); +} + +void BKE_curve_translate(Curve *cu, float offset[3], bool do_keys) { ListBase *nurb_lb = BKE_curve_nurbs_get(cu); Nurb *nu; diff --git a/source/blender/blenkernel/intern/lattice.c b/source/blender/blenkernel/intern/lattice.c index ea55f32ea05..1f609852af2 100644 --- a/source/blender/blenkernel/intern/lattice.c +++ b/source/blender/blenkernel/intern/lattice.c @@ -1166,6 +1166,28 @@ void BKE_lattice_center_bounds(Lattice *lt, float cent[3]) mid_v3_v3v3(cent, min, max); } +void BKE_lattice_transform(Lattice *lt, float mat[4][4], bool do_keys) +{ + BPoint *bp = lt->def; + int i = lt->pntsu * lt->pntsv * lt->pntsw; + + while (i--) { + mul_m4_v3(mat, bp->vec); + bp++; + } + + if (do_keys && lt->key) { + KeyBlock *kb; + + for (kb = lt->key->block.first; kb; kb = kb->next) { + float *fp = kb->data; + for (i = kb->totelem; i--; fp += 3) { + mul_m4_v3(mat, fp); + } + } + } +} + void BKE_lattice_translate(Lattice *lt, float offset[3], bool do_keys) { int i, numVerts; diff --git a/source/blender/blenkernel/intern/mball.c b/source/blender/blenkernel/intern/mball.c index 5a045606d15..453c6df6e3b 100644 --- a/source/blender/blenkernel/intern/mball.c +++ b/source/blender/blenkernel/intern/mball.c @@ -2442,6 +2442,30 @@ bool BKE_mball_center_bounds(MetaBall *mb, float r_cent[3]) return 0; } +void BKE_mball_transform(MetaBall *mb, float mat[4][4]) +{ + MetaElem *me; + float quat[4]; + const float scale = mat4_to_scale(mat); + const float scale_sqrt = sqrtf(scale); + + mat4_to_quat(quat, mat); + + for (me = mb->elems.first; me; me = me->next) { + mul_m4_v3(mat, &me->x); + mul_qt_qtqt(me->quat, quat, me->quat); + me->rad *= scale; + /* hrmf, probably elems shouldn't be + * treating scale differently - campbell */ + if (!MB_TYPE_SIZE_SQUARED(me->type)) { + mul_v3_fl(&me->expx, scale); + } + else { + mul_v3_fl(&me->expx, scale_sqrt); + } + } +} + void BKE_mball_translate(MetaBall *mb, const float offset[3]) { MetaElem *ml; diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c index 66c383ef0d3..2e80379522c 100644 --- a/source/blender/blenkernel/intern/mesh.c +++ b/source/blender/blenkernel/intern/mesh.c @@ -1869,6 +1869,27 @@ bool BKE_mesh_minmax(Mesh *me, float r_min[3], float r_max[3]) return (me->totvert != 0); } +void BKE_mesh_transform(Mesh *me, float mat[4][4], bool do_keys) +{ + int i; + MVert *mvert = me->mvert; + + for (i = 0; i < me->totvert; i++, mvert++) + mul_m4_v3(mat, mvert->co); + + if (do_keys && me->key) { + KeyBlock *kb; + for (kb = me->key->block.first; kb; kb = kb->next) { + float *fp = kb->data; + for (i = kb->totelem; i--; fp += 3) { + mul_m4_v3(mat, fp); + } + } + } + + /* don't update normals, caller can do this explicitly */ +} + void BKE_mesh_translate(Mesh *me, const float offset[3], const bool do_keys) { int i = me->totvert; diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c index 3a28796d7c9..b09016506e3 100644 --- a/source/blender/blenkernel/intern/object.c +++ b/source/blender/blenkernel/intern/object.c @@ -42,6 +42,7 @@ #include "DNA_constraint_types.h" #include "DNA_group_types.h" #include "DNA_key_types.h" +#include "DNA_lamp_types.h" #include "DNA_lattice_types.h" #include "DNA_material_types.h" #include "DNA_meta_types.h" @@ -1792,6 +1793,55 @@ void BKE_object_make_proxy(Object *ob, Object *target, Object *gob) ob->dt = target->dt; } +/** + * Use with newly created objects to set their size + * (used to apply scene-scale). + */ +void BKE_object_obdata_size_init(struct Object *ob, const float size) +{ + /* apply radius as a scale to types that support it */ + switch (ob->type) { + case OB_EMPTY: + { + ob->empty_drawsize *= size; + break; + } + case OB_FONT: + { + Curve *cu = ob->data; + cu->fsize *= size; + break; + } + case OB_CAMERA: + { + Camera *cam = ob->data; + cam->drawsize *= size; + break; + } + case OB_LAMP: + { + Lamp *lamp = ob->data; + lamp->dist *= size; + lamp->area_size *= size; + lamp->area_sizey *= size; + lamp->area_sizez *= size; + break; + } + /* Only lattice (not mesh, curve, mball...), + * because its got data when newly added */ + case OB_LATTICE: + { + struct Lattice *lt = ob->data; + float mat[4][4]; + + unit_m4(mat); + scale_m4_fl(mat, size); + + BKE_lattice_transform(lt, (float (*)[4])mat, false); + break; + } + } +} /* *************** CALC ****************** */ |