Revision: 41813
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=41813
Author:   campbellbarton
Date:     2011-11-14 03:54:23 +0000 (Mon, 14 Nov 2011)
Log Message:
-----------
VIEW3D_OT_camera_to_view_selected operator to move the camera to frame
all selected, renderable objects.

Modified Paths:
--------------
    trunk/blender/release/scripts/startup/bl_ui/space_view3d.py
    trunk/blender/source/blender/blenkernel/BKE_camera.h
    trunk/blender/source/blender/blenkernel/BKE_object.h
    trunk/blender/source/blender/blenkernel/intern/camera.c
    trunk/blender/source/blender/blenkernel/intern/object.c
    trunk/blender/source/blender/editors/space_view3d/view3d_intern.h
    trunk/blender/source/blender/editors/space_view3d/view3d_ops.c
    trunk/blender/source/blender/editors/space_view3d/view3d_view.c

Modified: trunk/blender/release/scripts/startup/bl_ui/space_view3d.py
===================================================================
--- trunk/blender/release/scripts/startup/bl_ui/space_view3d.py 2011-11-14 
00:43:37 UTC (rev 41812)
+++ trunk/blender/release/scripts/startup/bl_ui/space_view3d.py 2011-11-14 
03:54:23 UTC (rev 41813)
@@ -366,6 +366,7 @@
 
         layout.operator("view3d.view_all", text="Center Cursor and View 
All").center = True
         layout.operator("view3d.camera_to_view", text="Align Active Camera to 
View")
+        layout.operator("view3d.camera_to_view_selected", text="Align Active 
Camera to Selected")
         layout.operator("view3d.view_selected")
         layout.operator("view3d.view_center_cursor")
 

Modified: trunk/blender/source/blender/blenkernel/BKE_camera.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_camera.h        2011-11-14 
00:43:37 UTC (rev 41812)
+++ trunk/blender/source/blender/blenkernel/BKE_camera.h        2011-11-14 
03:54:23 UTC (rev 41813)
@@ -41,6 +41,7 @@
 struct RenderData;
 struct Scene;
 struct rctf;
+struct View3D;
 
 void *add_camera(const char *name);
 struct Camera *copy_camera(struct Camera *cam);
@@ -63,6 +64,10 @@
 
 void camera_view_frame(struct Scene *scene, struct Camera *camera, float 
r_vec[4][3]);
 
+int camera_view_frame_fit_to_scene(
+        struct Scene *scene, struct View3D *v3d, struct Object *camera_ob,
+        float r_co[3]);
+
 #ifdef __cplusplus
 }
 #endif

Modified: trunk/blender/source/blender/blenkernel/BKE_object.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_object.h        2011-11-14 
00:43:37 UTC (rev 41812)
+++ trunk/blender/source/blender/blenkernel/BKE_object.h        2011-11-14 
03:54:23 UTC (rev 41813)
@@ -110,6 +110,17 @@
 void object_boundbox_flag(struct Object *ob, int flag, int set);
 void minmax_object(struct Object *ob, float min[3], float max[3]);
 int minmax_object_duplis(struct Scene *scene, struct Object *ob, float *min, 
float *max);
+
+/* sometimes min-max isnt enough, we need to loop over each point */
+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,
+        void (*func_cb)(const float[3], void *), void *user_data);
+
 void solve_tracking (struct Object *ob, float targetmat[][4]);
 int ray_hit_boundbox(struct BoundBox *bb, float ray_start[3], float 
ray_normal[3]);
 

Modified: trunk/blender/source/blender/blenkernel/intern/camera.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/camera.c     2011-11-14 
00:43:37 UTC (rev 41812)
+++ trunk/blender/source/blender/blenkernel/intern/camera.c     2011-11-14 
03:54:23 UTC (rev 41813)
@@ -41,6 +41,7 @@
 
 #include "BKE_animsys.h"
 #include "BKE_camera.h"
+#include "BKE_object.h"
 #include "BKE_global.h"
 #include "BKE_library.h"
 #include "BKE_main.h"
@@ -394,3 +395,109 @@
                             dummy_asp, dummy_shift, &dummy_drawsize, r_vec);
 }
 
+
+typedef struct CameraViewFrameData {
+       float frame_tx[4][3];
+       float normal_tx[4][3];
+       float dist_vals[4];
+       unsigned int tot;
+} CameraViewFrameData;
+
+static void camera_to_frame_view_cb(const float co[3], void *user_data)
+{
+       CameraViewFrameData *data= (CameraViewFrameData *)user_data;
+       unsigned int i;
+
+       for (i= 0; i < 4; i++) {
+               float nd= -dist_to_plane_v3(co, data->frame_tx[i], 
data->normal_tx[i]);
+               if (nd < data->dist_vals[i]) {
+                       data->dist_vals[i]= nd;
+               }
+       }
+
+       data->tot++;
+}
+
+/* dont move the camera, just yield the fit location */
+int camera_view_frame_fit_to_scene(Scene *scene, struct View3D *v3d, Object 
*camera_ob, float r_co[3])
+{
+       float plane_tx[4][3];
+       float rot_obmat[3][3];
+       const float zero[3]= {0,0,0};
+       CameraViewFrameData data_cb;
+
+       unsigned int i;
+
+       camera_view_frame(scene, camera_ob->data, data_cb.frame_tx);
+
+       copy_m3_m4(rot_obmat, camera_ob->obmat);
+       normalize_m3(rot_obmat);
+
+       for (i= 0; i < 4; i++) {
+               mul_m3_v3(rot_obmat, data_cb.frame_tx[i]);
+       }
+
+       for (i= 0; i < 4; i++) {
+               normal_tri_v3(data_cb.normal_tx[i],
+                             zero, data_cb.frame_tx[i], data_cb.frame_tx[(i + 
1) % 4]);
+       }
+
+       /* initialize callback data */
+       data_cb.dist_vals[0]=
+       data_cb.dist_vals[1]=
+       data_cb.dist_vals[2]=
+       data_cb.dist_vals[3]= FLT_MAX;
+       data_cb.tot= 0;
+       /* run callback on all visible points */
+       BKE_scene_foreach_display_point(scene, v3d, BA_SELECT,
+                                       camera_to_frame_view_cb, &data_cb);
+
+       if (data_cb.tot <= 1) {
+               return FALSE;
+       }
+       else {
+               float plane_isect_1[3], plane_isect_1_other[3];
+               float plane_isect_2[3], plane_isect_2_other[3];
+
+               float plane_isect_pt_1[3], plane_isect_pt_2[3];
+
+               /* apply the dist-from-plane's to the transformed plane points 
*/
+               for (i= 0; i < 4; i++) {
+                       mul_v3_v3fl(plane_tx[i], data_cb.normal_tx[i], 
data_cb.dist_vals[i]);
+               }
+
+               if ( (isect_plane_plane_v3(plane_isect_1, plane_isect_1_other,
+                                          plane_tx[0], data_cb.normal_tx[0],
+                                          plane_tx[2], data_cb.normal_tx[2]) 
== 0) ||
+                    (isect_plane_plane_v3(plane_isect_2, plane_isect_2_other,
+                                          plane_tx[1], data_cb.normal_tx[1],
+                                          plane_tx[3], data_cb.normal_tx[3]) 
== 0))
+               {
+                       /* this is very unlikely */
+                       return FALSE;
+               }
+               else {
+
+                       add_v3_v3(plane_isect_1_other, plane_isect_1);
+                       add_v3_v3(plane_isect_2_other, plane_isect_2);
+
+                       if (isect_line_line_v3(plane_isect_1, 
plane_isect_1_other,
+                                              plane_isect_2, 
plane_isect_2_other,
+                                              plane_isect_pt_1, 
plane_isect_pt_2) == 0)
+                       {
+                               return FALSE;
+                       }
+                       else {
+                               float cam_plane_no[3]= {0.0f, 0.0f, -1.0f};
+                               float tvec[3];
+                               mul_m3_v3(rot_obmat, cam_plane_no);
+
+                               sub_v3_v3v3(tvec, plane_isect_pt_2, 
plane_isect_pt_1);
+                               copy_v3_v3(r_co, dot_v3v3(tvec, cam_plane_no) > 
0.0f ?
+                                              plane_isect_pt_1 : 
plane_isect_pt_2);
+
+                               return TRUE;
+                       }
+               }
+       }
+}

Modified: trunk/blender/source/blender/blenkernel/intern/object.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/object.c     2011-11-14 
00:43:37 UTC (rev 41812)
+++ trunk/blender/source/blender/blenkernel/intern/object.c     2011-11-14 
03:54:23 UTC (rev 41813)
@@ -2333,6 +2333,69 @@
        return ok;
 }
 
+void BKE_object_foreach_display_point(
+        Object *ob, float obmat[4][4],
+        void (*func_cb)(const float[3], void *), void *user_data)
+{
+       float co[3];
+
+       if (ob->derivedFinal) {
+               DerivedMesh *dm= ob->derivedFinal;
+               MVert *mv= dm->getVertArray(dm);
+               int totvert= dm->getNumVerts(dm);
+               int i;
+
+               for (i= 0; i < totvert; i++, mv++) {
+                       mul_v3_m4v3(co, obmat, mv->co);
+                       func_cb(co, user_data);
+               }
+       }
+       else if (ob->disp.first) {
+               DispList *dl;
+
+               for (dl=ob->disp.first; dl; dl=dl->next) {
+                       float *v3= dl->verts;
+                       int totvert= dl->nr;
+                       int i;
+
+                       for (i= 0; i < totvert; i++, v3+=3) {
+                               mul_v3_m4v3(co, obmat, v3);
+                               func_cb(co, user_data);
+                       }
+               }
+       }
+}
+
+void BKE_scene_foreach_display_point(
+        Scene *scene, View3D *v3d, const short flag,
+        void (*func_cb)(const float[3], void *), void *user_data)
+{
+       Base *base;
+       Object *ob;
+
+       for(base= FIRSTBASE; base; base = base->next) {
+               if(BASE_VISIBLE(v3d, base) && (base->flag & flag) == flag) {
+                       ob= base->object;
+
+                       if ((ob->transflag & OB_DUPLI)==0) {
+                               BKE_object_foreach_display_point(ob, ob->obmat, 
func_cb, user_data);
+                       }
+                       else {
+                               ListBase *lb;
+                               DupliObject *dob;
+
+                               lb= object_duplilist(scene, ob);
+                               for(dob= lb->first; dob; dob= dob->next) {
+                                       if(dob->no_draw == 0) {
+                                               
BKE_object_foreach_display_point(dob->ob, dob->mat, func_cb, user_data);
+                                       }
+                               }
+                               free_object_duplilist(lb);      /* does restore 
*/
+                       }
+               }
+       }
+}
+
 /* copied from DNA_object_types.h */
 typedef struct ObTfmBack {
        float loc[3], dloc[3], orig[3];

Modified: trunk/blender/source/blender/editors/space_view3d/view3d_intern.h
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/view3d_intern.h   
2011-11-14 00:43:37 UTC (rev 41812)
+++ trunk/blender/source/blender/editors/space_view3d/view3d_intern.h   
2011-11-14 03:54:23 UTC (rev 41813)
@@ -155,7 +155,8 @@
 void VIEW3D_OT_select_lasso(struct wmOperatorType *ot);
 
 void VIEW3D_OT_smoothview(struct wmOperatorType *ot);
-void VIEW3D_OT_setcameratoview(struct wmOperatorType *ot);
+void VIEW3D_OT_camera_to_view(struct wmOperatorType *ot);
+void VIEW3D_OT_camera_to_view_selected(struct wmOperatorType *ot);
 void VIEW3D_OT_object_as_camera(struct wmOperatorType *ot);
 void VIEW3D_OT_localview(struct wmOperatorType *ot);
 void VIEW3D_OT_game_start(struct wmOperatorType *ot);

Modified: trunk/blender/source/blender/editors/space_view3d/view3d_ops.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/view3d_ops.c      
2011-11-14 00:43:37 UTC (rev 41812)
+++ trunk/blender/source/blender/editors/space_view3d/view3d_ops.c      
2011-11-14 03:54:23 UTC (rev 41813)
@@ -85,7 +85,8 @@
        WM_operatortype_append(VIEW3D_OT_enable_manipulator);
        WM_operatortype_append(VIEW3D_OT_cursor3d);
        WM_operatortype_append(VIEW3D_OT_select_lasso);
-       WM_operatortype_append(VIEW3D_OT_setcameratoview);
+       WM_operatortype_append(VIEW3D_OT_camera_to_view);
+       WM_operatortype_append(VIEW3D_OT_camera_to_view_selected);
        WM_operatortype_append(VIEW3D_OT_object_as_camera);
        WM_operatortype_append(VIEW3D_OT_localview);
        WM_operatortype_append(VIEW3D_OT_game_start);

Modified: trunk/blender/source/blender/editors/space_view3d/view3d_view.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/view3d_view.c     
2011-11-14 00:43:37 UTC (rev 41812)
+++ trunk/blender/source/blender/editors/space_view3d/view3d_view.c     
2011-11-14 03:54:23 UTC (rev 41813)
@@ -43,6 +43,7 @@
 
 #include "BKE_anim.h"
 #include "BKE_action.h"
+#include "BKE_camera.h"
 #include "BKE_context.h"
 #include "BKE_depsgraph.h"
 #include "BKE_object.h"
@@ -406,9 +407,8 @@
        return 0;
 }
 

@@ Diff output truncated at 10240 characters. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to