[Bf-blender-cvs] [8e49022d939] tmp-overlay-engine: Overlay Engine: Camera Reconstruction & Tracking

Clément Foucault noreply at git.blender.org
Fri Nov 15 01:35:09 CET 2019


Commit: 8e49022d939a34d9b427f097b8cc84ee5a8fcb9c
Author: Clément Foucault
Date:   Fri Nov 8 17:18:43 2019 +0100
Branches: tmp-overlay-engine
https://developer.blender.org/rB8e49022d939a34d9b427f097b8cc84ee5a8fcb9c

Overlay Engine: Camera Reconstruction & Tracking

===================================================================

M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/engines/overlay/overlay_extra.c
M	source/blender/draw/engines/overlay/overlay_private.h
M	source/blender/draw/engines/overlay/overlay_shader.c
M	source/blender/draw/engines/overlay/shaders/extra_vert.glsl
A	source/blender/draw/engines/overlay/shaders/extra_wire_frag.glsl
A	source/blender/draw/engines/overlay/shaders/extra_wire_vert.glsl
M	source/blender/draw/intern/draw_cache.c
M	source/blender/draw/intern/draw_common.c
M	source/blender/draw/intern/draw_common.h
M	source/blender/draw/modes/shaders/common_globals_lib.glsl

===================================================================

diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index c07e76b3f98..3ef8ccdd575 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -397,6 +397,8 @@ data_to_c_simple(engines/overlay/shaders/edit_mesh_skin_root_vert.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/edit_mesh_vert.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/extra_vert.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/extra_groundline_vert.glsl SRC)
+data_to_c_simple(engines/overlay/shaders/extra_wire_frag.glsl SRC)
+data_to_c_simple(engines/overlay/shaders/extra_wire_vert.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/facing_frag.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/facing_vert.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/grid_frag.glsl SRC)
diff --git a/source/blender/draw/engines/overlay/overlay_extra.c b/source/blender/draw/engines/overlay/overlay_extra.c
index e864e1e66a8..f175e4bf11e 100644
--- a/source/blender/draw/engines/overlay/overlay_extra.c
+++ b/source/blender/draw/engines/overlay/overlay_extra.c
@@ -25,14 +25,20 @@
 #include "UI_resources.h"
 
 #include "BKE_camera.h"
+#include "BKE_movieclip.h"
+#include "BKE_object.h"
+#include "BKE_tracking.h"
 
 #include "DNA_camera_types.h"
 
 #include "DEG_depsgraph_query.h"
 
+#include "ED_view3d.h"
+
 #include "overlay_private.h"
 
 #include "draw_common.h"
+#include "draw_manager_text.h"
 
 void OVERLAY_extra_cache_init(OVERLAY_Data *vedata)
 {
@@ -167,6 +173,7 @@ void OVERLAY_extra_cache_init(OVERLAY_Data *vedata)
 
 #define BUF_INSTANCE DRW_shgroup_call_buffer_instance
 #define BUF_POINT(grp, format) DRW_shgroup_call_buffer(grp, format, GPU_PRIM_POINTS)
+#define BUF_LINE(grp, format) DRW_shgroup_call_buffer(grp, format, GPU_PRIM_LINES)
 
     /* Sorted by shader to avoid state changes during render. */
     {
@@ -233,6 +240,17 @@ void OVERLAY_extra_cache_init(OVERLAY_Data *vedata)
 
       cb->groundline = BUF_INSTANCE(grp, format, DRW_cache_groundline_get());
     }
+    {
+      sh = OVERLAY_shader_extra_wire();
+
+      grp = DRW_shgroup_create(sh, extra_ps);
+      DRW_shgroup_uniform_block_persistent(grp, "globalsBlock", G_draw.block_ubo);
+
+      /* This one is suboptimal (gl_lines instead of gl_line_strip)
+       * but we keep this for simplicity */
+      cb->camera_path = DRW_shgroup_call_buffer(grp, formats->wire_extra, GPU_PRIM_LINES);
+    }
+    // sh = OVERLAY_shader_extra_points();
 
 #if 0
     /* -------- STIPPLES ------- */
@@ -265,46 +283,6 @@ void OVERLAY_extra_cache_init(OVERLAY_Data *vedata)
     /* TODO port to shader stipple */
     geom = DRW_cache_field_cone_limit_get();
     cb->field_cone_limit = buffer_instance_scaled(cb->non_meshes, geom, draw_ctx->sh_cfg);
-
-    /* Transparent Shapes */
-    state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_LESS_EQUAL | DRW_STATE_BLEND_ALPHA |
-            DRW_STATE_CULL_FRONT;
-    cb->transp_shapes = psl->transp_shapes[i] = DRW_pass_create("Transparent Shapes", state);
-
-    sh = GPU_shader_get_builtin_shader_with_config(
-        GPU_SHADER_INSTANCE_VARIYING_COLOR_VARIYING_SIZE, draw_ctx->sh_cfg);
-
-    DRWShadingGroup *grp_transp = DRW_shgroup_create(sh, cb->transp_shapes);
-    if (draw_ctx->sh_cfg == GPU_SHADER_CFG_CLIPPED) {
-      DRW_shgroup_state_enable(grp_transp, DRW_STATE_CLIP_PLANES);
-    }
-
-    DRWShadingGroup *grp_cull_back = DRW_shgroup_create_sub(grp_transp);
-    DRW_shgroup_state_disable(grp_cull_back, DRW_STATE_CULL_FRONT);
-    DRW_shgroup_state_enable(grp_cull_back, DRW_STATE_CULL_BACK);
-
-    DRWShadingGroup *grp_cull_none = DRW_shgroup_create_sub(grp_transp);
-    DRW_shgroup_state_disable(grp_cull_none, DRW_STATE_CULL_FRONT);
-
-    /* Spot cones */
-    geom = DRW_cache_light_spot_volume_get();
-    cb->light_spot_volume = buffer_instance_alpha(grp_transp, geom);
-
-    geom = DRW_cache_light_spot_square_volume_get();
-    cb->light_spot_volume_rect = buffer_instance_alpha(grp_transp, geom);
-
-    geom = DRW_cache_light_spot_volume_get();
-    cb->light_spot_volume_outside = buffer_instance_alpha(grp_cull_back, geom);
-
-    geom = DRW_cache_light_spot_square_volume_get();
-    cb->light_spot_volume_rect_outside = buffer_instance_alpha(grp_cull_back, geom);
-
-    /* Camera stereo volumes */
-    geom = DRW_cache_cube_get();
-    cb->camera_stereo_volume = buffer_instance_alpha(grp_transp, geom);
-
-    geom = DRW_cache_quad_get();
-    cb->camera_stereo_plane = buffer_instance_alpha(grp_cull_none, geom);
 #endif
   }
 }
@@ -353,6 +331,11 @@ static void DRW_shgroup_empty_ex(OVERLAY_ExtraCallBuffers *cb,
 
 static void DRW_shgroup_empty(OVERLAY_ExtraCallBuffers *cb, Object *ob, ViewLayer *view_layer)
 {
+  if (((ob->base_flag & BASE_FROM_DUPLI) != 0) && ((ob->transflag & OB_DUPLICOLLECTION) != 0) &&
+      ob->instance_collection) {
+    return;
+  }
+
   float *color;
   DRW_object_wire_theme_get(ob, view_layer, &color);
 
@@ -497,6 +480,146 @@ typedef union OVERLAY_CameraInstanceData {
   };
 } OVERLAY_CameraInstanceData;
 
+static void camera_view3d_reconstruction(OVERLAY_ExtraCallBuffers *cb,
+                                         Scene *scene,
+                                         View3D *v3d,
+                                         Object *camera_object,
+                                         Object *ob,
+                                         const float color[4])
+{
+  const DRWContextState *draw_ctx = DRW_context_state_get();
+  const bool is_select = DRW_state_is_select();
+  const Object *orig_camera_object = DEG_get_original_object(camera_object);
+
+  MovieClip *clip = BKE_object_movieclip_get(scene, ob, false);
+  if (clip == NULL) {
+    return;
+  }
+
+  const bool is_solid_bundle = (v3d->bundle_drawtype == OB_EMPTY_SPHERE) &&
+                               ((v3d->shading.type != OB_SOLID) || !XRAY_FLAG_ENABLED(v3d));
+
+  MovieTracking *tracking = &clip->tracking;
+  /* Index must start in 1, to mimic BKE_tracking_track_get_indexed. */
+  int track_index = 1;
+
+  uchar text_color_selected[4], text_color_unselected[4];
+  float bundle_color_unselected[4], bundle_color_solid[4];
+
+  UI_GetThemeColor4ubv(TH_SELECT, text_color_selected);
+  UI_GetThemeColor4ubv(TH_TEXT, text_color_unselected);
+  UI_GetThemeColor4fv(TH_WIRE, bundle_color_unselected);
+  UI_GetThemeColor4fv(TH_BUNDLE_SOLID, bundle_color_solid);
+
+  float camera_mat[4][4], normal_mat[4][4];
+  BKE_tracking_get_camera_object_matrix(scene, ob, camera_mat);
+
+  normalize_m4_m4(normal_mat, ob->obmat);
+
+  LISTBASE_FOREACH (MovieTrackingObject *, tracking_object, &tracking->objects) {
+    float tracking_object_mat[4][4];
+
+    if (tracking_object->flag & TRACKING_OBJECT_CAMERA) {
+      copy_m4_m4(tracking_object_mat, camera_mat);
+    }
+    else {
+      const int framenr = BKE_movieclip_remap_scene_to_clip_frame(
+          clip, DEG_get_ctime(draw_ctx->depsgraph));
+      float object_mat[4][4];
+      BKE_tracking_camera_get_reconstructed_interpolate(
+          tracking, tracking_object, framenr, object_mat);
+
+      invert_m4(object_mat);
+      mul_m4_m4m4(tracking_object_mat, normal_mat, object_mat);
+    }
+
+    ListBase *tracksbase = BKE_tracking_object_get_tracks(tracking, tracking_object);
+    for (MovieTrackingTrack *track = tracksbase->first; track; track = track->next) {
+      if ((track->flag & TRACK_HAS_BUNDLE) == 0) {
+        continue;
+      }
+      bool is_selected = TRACK_SELECTED(track);
+
+      float bundle_mat[4][4];
+      copy_m4_m4(bundle_mat, tracking_object_mat);
+      translate_m4(bundle_mat, track->bundle_pos[0], track->bundle_pos[1], track->bundle_pos[2]);
+
+      const float *bundle_color;
+      if (track->flag & TRACK_CUSTOMCOLOR) {
+        bundle_color = track->color;
+      }
+      else if (is_solid_bundle) {
+        bundle_color = bundle_color_solid;
+      }
+      else if (is_selected) {
+        bundle_color = color;
+      }
+      else {
+        bundle_color = bundle_color_unselected;
+      }
+
+      if (is_select) {
+        DRW_select_load_id(orig_camera_object->runtime.select_id | (track_index << 16));
+        track_index++;
+      }
+
+      if (is_solid_bundle) {
+        if (is_selected) {
+          DRW_shgroup_empty_ex(cb, bundle_mat, &v3d->bundle_size, v3d->bundle_drawtype, color);
+        }
+
+        const float bundle_color_v4[4] = {
+            bundle_color[0],
+            bundle_color[1],
+            bundle_color[2],
+            1.0f,
+        };
+
+        bundle_mat[3][3] = v3d->bundle_size; /* See shader. */
+        DRW_buffer_add_entry(cb->empty_sphere_solid, bundle_color_v4, bundle_mat);
+      }
+      else {
+        DRW_shgroup_empty_ex(
+            cb, bundle_mat, &v3d->bundle_size, v3d->bundle_drawtype, bundle_color);
+      }
+
+      if ((v3d->flag2 & V3D_SHOW_BUNDLENAME) && !is_select) {
+        struct DRWTextStore *dt = DRW_text_cache_ensure();
+
+        DRW_text_cache_add(dt,
+                           bundle_mat[3],
+                           track->name,
+                           strlen(track->name),
+                           10,
+                           0,
+                           DRW_TEXT_CACHE_GLOBALSPACE | DRW_TEXT_CACHE_STRING_PTR,
+                           is_selected ? text_color_selected : text_color_unselected);
+      }
+    }
+
+    if ((v3d->flag2 & V3D_SHOW_CAMERAPATH) && (tracking_object->flag & TRACKING_OBJECT_CAMERA) &&
+        !is_select) {
+      MovieTrackingReconstruction *reconstruction;
+      reconstruction = BKE_tracking_object_get_reconstruction(tracking, tracking_object);
+
+      if (reconstruction->camnr) {
+        MovieReconstructedCamera *camera = reconstruction->cameras;
+        float v0[3], v1[3];
+        int color_id = TH_CAMERA_PATH;
+        for (int a = 0; a < reconstruction->camnr; a++, camera++) {
+          copy_v3_v3(v0, v1);
+          copy_v3_v3(v1, camera->mat[3]);
+          mul_m4_v3(camera_mat, v1);
+          if (a > 0) {
+            DRW_buffer_add_entry(cb->camera_path, v0, &color_id);
+            DRW_buffer_add_entry(cb->camera_path, v1, &color_id);
+          }
+        }
+      }
+    }
+  }
+}
+
 static float camera_offaxis_shiftx_get(Scene *scene,


@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list