Fix fit camera view frame to selected objects
This commit is contained in:
@@ -44,6 +44,7 @@ struct Object;
|
||||
struct RegionView3D;
|
||||
struct RenderData;
|
||||
struct Scene;
|
||||
struct SceneLayer;
|
||||
struct rctf;
|
||||
struct View3D;
|
||||
struct GPUFXSettings;
|
||||
@@ -127,7 +128,7 @@ void BKE_camera_view_frame(
|
||||
float r_vec[4][3]);
|
||||
|
||||
bool BKE_camera_view_frame_fit_to_scene(
|
||||
struct Scene *scene, struct View3D *v3d, struct Object *camera_ob,
|
||||
struct Scene *scene, struct SceneLayer *sl, struct Object *camera_ob,
|
||||
float r_co[3], float *r_scale);
|
||||
bool BKE_camera_view_frame_fit_to_coords(
|
||||
const struct Scene *scene,
|
||||
|
||||
@@ -153,8 +153,7 @@ bool BKE_object_minmax_dupli(struct Scene *scene, struct Object *ob, float r_min
|
||||
void BKE_object_foreach_display_point(struct Object *ob, float obmat[4][4],
|
||||
void (*func_cb)(const float[3], void *), void *user_data);
|
||||
void BKE_scene_foreach_display_point(struct Scene *scene,
|
||||
struct View3D *v3d,
|
||||
const short flag,
|
||||
struct SceneLayer *sl,
|
||||
void (*func_cb)(const float[3], void *), void *user_data);
|
||||
|
||||
bool BKE_object_parent_loop_check(const struct Object *parent, const struct Object *ob);
|
||||
|
||||
@@ -633,7 +633,7 @@ static bool camera_frame_fit_calc_from_data(
|
||||
/* don't move the camera, just yield the fit location */
|
||||
/* r_scale only valid/useful for ortho cameras */
|
||||
bool BKE_camera_view_frame_fit_to_scene(
|
||||
Scene *scene, struct View3D *v3d, Object *camera_ob, float r_co[3], float *r_scale)
|
||||
Scene *scene, SceneLayer *sl, Object *camera_ob, float r_co[3], float *r_scale)
|
||||
{
|
||||
CameraParams params;
|
||||
CameraViewFrameData data_cb;
|
||||
@@ -644,7 +644,7 @@ bool BKE_camera_view_frame_fit_to_scene(
|
||||
camera_frame_fit_data_init(scene, camera_ob, ¶ms, &data_cb);
|
||||
|
||||
/* run callback on all visible points */
|
||||
BKE_scene_foreach_display_point(scene, v3d, BA_SELECT, camera_to_frame_view_cb, &data_cb);
|
||||
BKE_scene_foreach_display_point(scene, sl, camera_to_frame_view_cb, &data_cb);
|
||||
|
||||
return camera_frame_fit_calc_from_data(¶ms, &data_cb, r_co, r_scale);
|
||||
}
|
||||
|
||||
@@ -2493,14 +2493,14 @@ void BKE_object_foreach_display_point(
|
||||
}
|
||||
|
||||
void BKE_scene_foreach_display_point(
|
||||
Scene *scene, View3D *v3d, const short flag,
|
||||
Scene *scene, SceneLayer *sl,
|
||||
void (*func_cb)(const float[3], void *), void *user_data)
|
||||
{
|
||||
BaseLegacy *base;
|
||||
Base *base;
|
||||
Object *ob;
|
||||
|
||||
for (base = FIRSTBASE; base; base = base->next) {
|
||||
if (BASE_VISIBLE_BGMODE(v3d, scene, base) && (base->flag_legacy & flag) == flag) {
|
||||
for (base = FIRSTBASE_NEW; base; base = base->next) {
|
||||
if (((base->flag & BASE_VISIBLED) != 0) && ((base->flag & BASE_SELECTED) != 0)) {
|
||||
ob = base->object;
|
||||
|
||||
if ((ob->transflag & OB_DUPLI) == 0) {
|
||||
|
||||
@@ -537,6 +537,7 @@ void VIEW3D_OT_camera_to_view(wmOperatorType *ot)
|
||||
static int view3d_camera_to_view_selected_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
SceneLayer *sl = CTX_data_scene_layer(C);
|
||||
View3D *v3d = CTX_wm_view3d(C); /* can be NULL */
|
||||
Object *camera_ob = v3d ? v3d->camera : scene->camera;
|
||||
|
||||
@@ -549,7 +550,7 @@ static int view3d_camera_to_view_selected_exec(bContext *C, wmOperator *op)
|
||||
}
|
||||
|
||||
/* this function does all the important stuff */
|
||||
if (BKE_camera_view_frame_fit_to_scene(scene, v3d, camera_ob, r_co, &r_scale)) {
|
||||
if (BKE_camera_view_frame_fit_to_scene(scene, sl, camera_ob, r_co, &r_scale)) {
|
||||
ObjectTfmProtectedChannels obtfm;
|
||||
float obmat_new[4][4];
|
||||
|
||||
|
||||
Reference in New Issue
Block a user