[Bf-blender-cvs] [921510f34f0] xr-actions-D9124: Add xr overlay and controller object.

Peter Kim noreply at git.blender.org
Tue Oct 13 14:45:01 CEST 2020


Commit: 921510f34f0a4359e321980f477b74aaf47e93c8
Author: Peter Kim
Date:   Sat Oct 10 19:36:49 2020 +0900
Branches: xr-actions-D9124
https://developer.blender.org/rB921510f34f0a4359e321980f477b74aaf47e93c8

Add xr overlay and controller object.

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

M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/engines/overlay/overlay_engine.c
M	source/blender/draw/engines/overlay/overlay_private.h
A	source/blender/draw/engines/overlay/overlay_xr.c
M	source/blender/draw/intern/draw_manager.c
M	source/blender/makesdna/DNA_object_types.h
M	source/blender/windowmanager/xr/intern/wm_xr_actions.c
M	source/blender/windowmanager/xr/intern/wm_xr_intern.h
M	source/blender/windowmanager/xr/intern/wm_xr_session.c

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

diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 4e72e89ae99..f45788a2c6c 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -148,6 +148,7 @@ set(SRC
   engines/overlay/overlay_shader.c
   engines/overlay/overlay_volume.c
   engines/overlay/overlay_wireframe.c
+  engines/overlay/overlay_xr.c
 
   DRW_engine.h
   DRW_engine_types.h
diff --git a/source/blender/draw/engines/overlay/overlay_engine.c b/source/blender/draw/engines/overlay/overlay_engine.c
index 30b39e5d5e1..c2b39f1b2b0 100644
--- a/source/blender/draw/engines/overlay/overlay_engine.c
+++ b/source/blender/draw/engines/overlay/overlay_engine.c
@@ -209,6 +209,7 @@ static void OVERLAY_cache_init(void *vedata)
   OVERLAY_particle_cache_init(vedata);
   OVERLAY_wireframe_cache_init(vedata);
   OVERLAY_volume_cache_init(vedata);
+  OVERLAY_xr_cache_init(vedata);
 }
 
 BLI_INLINE OVERLAY_DupliData *OVERLAY_duplidata_get(Object *ob, void *vedata, bool *do_init)
@@ -421,6 +422,10 @@ static void OVERLAY_cache_populate(void *vedata, Object *ob)
     OVERLAY_motion_path_cache_populate(vedata, ob);
   }
 
+  if (ob->runtime.is_xr) {
+    OVERLAY_xr_cache_populate(vedata, ob);
+  }
+
   if (!pd->hide_overlays) {
     switch (ob->type) {
       case OB_ARMATURE:
@@ -641,6 +646,8 @@ static void OVERLAY_draw_scene(void *vedata)
       break;
   }
 
+  OVERLAY_xr_draw(vedata);
+
   OVERLAY_antialiasing_end(vedata);
 }
 
diff --git a/source/blender/draw/engines/overlay/overlay_private.h b/source/blender/draw/engines/overlay/overlay_private.h
index ef7a2db476c..d10b5328dc7 100644
--- a/source/blender/draw/engines/overlay/overlay_private.h
+++ b/source/blender/draw/engines/overlay/overlay_private.h
@@ -122,6 +122,7 @@ typedef struct OVERLAY_PassList {
   DRWPass *volume_ps;
   DRWPass *wireframe_ps;
   DRWPass *wireframe_xray_ps;
+  DRWPass *xr_controllers_ps;
   DRWPass *xray_fade_ps;
 } OVERLAY_PassList;
 
@@ -291,6 +292,7 @@ typedef struct OVERLAY_PrivateData {
   DRWShadingGroup *wires_all_grp[2][2];  /* With and without coloring. */
   DRWShadingGroup *wires_hair_grp[2][2]; /* With and without coloring. */
   DRWShadingGroup *wires_sculpt_grp[2];
+  DRWShadingGroup *xr_controllers_grp;
 
   DRWView *view_default;
   DRWView *view_wires;
@@ -636,6 +638,10 @@ void OVERLAY_wireframe_cache_populate(OVERLAY_Data *vedata,
 void OVERLAY_wireframe_draw(OVERLAY_Data *vedata);
 void OVERLAY_wireframe_in_front_draw(OVERLAY_Data *vedata);
 
+void OVERLAY_xr_cache_init(OVERLAY_Data *vedata);
+void OVERLAY_xr_cache_populate(OVERLAY_Data *vedata, Object *ob);
+void OVERLAY_xr_draw(OVERLAY_Data *vedata);
+
 void OVERLAY_shader_library_ensure(void);
 GPUShader *OVERLAY_shader_antialiasing(void);
 GPUShader *OVERLAY_shader_armature_degrees_of_freedom_wire(void);
diff --git a/source/blender/draw/engines/overlay/overlay_xr.c b/source/blender/draw/engines/overlay/overlay_xr.c
new file mode 100644
index 00000000000..01c9fe4c0b5
--- /dev/null
+++ b/source/blender/draw/engines/overlay/overlay_xr.c
@@ -0,0 +1,77 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Copyright 2019, Blender Foundation.
+ */
+
+/** \file
+ * \ingroup draw_engine
+ */
+
+#include "DRW_render.h"
+
+#include "GPU_batch.h"
+
+#include "overlay_private.h"
+
+void OVERLAY_xr_cache_init(OVERLAY_Data *vedata)
+{
+  OVERLAY_PassList *psl = vedata->psl;
+  OVERLAY_PrivateData *pd = vedata->stl->pd;
+  DRWShadingGroup *grp;
+  const float color[4] = { 0.211f, 0.219f, 0.223f, 0.4f };
+
+  DRWState state = DRW_STATE_WRITE_DEPTH | DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_LESS_EQUAL | DRW_STATE_BLEND_ALPHA;
+  DRW_PASS_CREATE(psl->xr_controllers_ps, state | pd->clipping_state);
+
+  GPUShader *sh = OVERLAY_shader_uniform_color();
+  pd->xr_controllers_grp = grp = DRW_shgroup_create(sh, psl->xr_controllers_ps);
+  DRW_shgroup_uniform_vec4_copy(grp, "color", color);
+}
+
+void OVERLAY_xr_cache_populate(OVERLAY_Data *vedata, Object *ob)
+{
+  OVERLAY_PrivateData *pd = vedata->stl->pd;
+  GPUBatch *xr_controllers = DRW_cache_mesh_all_verts_get(ob);
+
+  if (xr_controllers && xr_controllers->verts[0] && (GPU_vertbuf_get_vertex_len(xr_controllers->verts[0]) > 0)) {
+    DRW_shgroup_call_obmat(pd->xr_controllers_grp, xr_controllers, ob->obmat);
+  }
+  else {
+    /* Fallback to primitive sphere. */
+    const float scale[3] = { 0.05f, 0.05f, 0.05f };
+    float obmat[4][4];
+    copy_m4_m4(obmat, ob->obmat);
+    rescale_m4(obmat, scale);
+    DRW_shgroup_call_obmat(pd->xr_controllers_grp, DRW_cache_sphere_get(), obmat);
+  }
+}
+
+void OVERLAY_xr_draw(OVERLAY_Data *vedata)
+{
+  const DRWContextState *draw_ctx = DRW_context_state_get();
+  if ((draw_ctx->v3d->flag2 & V3D_XR_SHOW_CONTROLLERS) == 0) {
+    return;
+  }
+
+  OVERLAY_PassList *psl = vedata->psl;
+  DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
+
+  if (DRW_state_is_fbo()) {
+    GPU_framebuffer_bind(dfbl->overlay_fb);
+  }
+
+  DRW_draw_pass(psl->xr_controllers_ps);
+}
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index 2b92f080f55..3ade3611a6a 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -1458,15 +1458,16 @@ void DRW_draw_callbacks_post_scene(void)
 
     /* Annotations. */
     if (do_annotations) {
-      GPU_depth_test(false);
+      GPU_depth_test(GPU_DEPTH_NONE);
       ED_annotation_draw_view3d(DEG_get_input_scene(depsgraph), depsgraph, v3d, region, true);
-      GPU_depth_test(true);
+      GPU_depth_test(GPU_DEPTH_LESS_EQUAL);
     }
 
     /* Controllers. */
+    GPU_depth_test(GPU_DEPTH_ALWAYS);
     WM_xr_draw_controllers();
 
-    DRW_state_reset();
+    GPU_depth_test(GPU_DEPTH_LESS_EQUAL);
   }
 }
 
diff --git a/source/blender/makesdna/DNA_object_types.h b/source/blender/makesdna/DNA_object_types.h
index 112c8210460..87abbdbbb6c 100644
--- a/source/blender/makesdna/DNA_object_types.h
+++ b/source/blender/makesdna/DNA_object_types.h
@@ -128,7 +128,7 @@ typedef struct Object_Runtime {
 
   /** Selection id of this object; only available in the original object */
   int select_id;
-  char _pad1[3];
+  char _pad1[2];
 
   /**
    * Denotes whether the evaluated data is owned by this object or is referenced and owned by
@@ -136,6 +136,9 @@ typedef struct Object_Runtime {
    */
   char is_data_eval_owned;
 
+  /** Identifies whether the object is an XR object (used for rendering). */
+  char is_xr;
+
   /** Axis aligned boundbox (in localspace). */
   struct BoundBox *bb;
 
diff --git a/source/blender/windowmanager/xr/intern/wm_xr_actions.c b/source/blender/windowmanager/xr/intern/wm_xr_actions.c
index ecb3e61efb3..0e05bdb8d08 100644
--- a/source/blender/windowmanager/xr/intern/wm_xr_actions.c
+++ b/source/blender/windowmanager/xr/intern/wm_xr_actions.c
@@ -263,10 +263,6 @@ void WM_xr_actions_destroy(wmXrData *xr,
 
   if (!action_find(action_set, controller_pose_name)) {
     action_set->controller_pose_action = NULL;
-
-    /* Update controller data. */
-    wmXrSessionState *session_state = &xr->runtime->session_state;
-    memset(session_state->controllers, 0, sizeof(session_state->controllers));
   }
 }
 
@@ -334,14 +330,6 @@ bool WM_xr_controller_pose_action_set(wmXrData *xr,
 
   action_set->controller_pose_action = action;
 
-  /* Update controller data. */
-  wmXrSessionState *session_state = &xr->runtime->session_state;
-  memset(session_state->controllers, 0, sizeof(session_state->controllers));
-  const unsigned int count = min((unsigned int)ARRAY_SIZE(session_state->controllers), action->count_subaction_paths);
-  for (unsigned int i = 0; i < count; ++i) {
-    strcpy(session_state->controllers[i].subaction_path, action->subaction_paths[i]);
-  }
-
   return true;
 }
 
diff --git a/source/blender/windowmanager/xr/intern/wm_xr_intern.h b/source/blender/windowmanager/xr/intern/wm_xr_intern.h
index 3a29aecc518..61ef1890c78 100644
--- a/source/blender/windowmanager/xr/intern/wm_xr_intern.h
+++ b/source/blender/windowmanager/xr/intern/wm_xr_intern.h
@@ -28,12 +28,14 @@ struct wmXrActionSet;
 struct GHash;
 
 typedef struct wmXrControllerData {
-  /* OpenXR path identifier. */
+  /** OpenXR path identifier. */
   char subaction_path[64];
   /** Last known controller pose (in world space) stored for queries. */
   GHOST_XrPose pose;
   /** The last known controller matrix, calculated from above's controller pose. */
   float mat[4][4];
+  /** Mesh object, used to render the controller. */
+  Object *ob;
 } wmXrControllerData;
 
 typedef struct wmXrSessionState {
@@ -153,6 +155,8 @@ void wm_xr_session_gpu_binding_context_destroy(GHOST_ContextHandle context);
 void wm_xr_session_actions_init(wmXrData *xr);
 void wm_xr_session_actions_update(wmXrData *xr);
 void wm_xr_session_actions_uninit(wmXrData *xr);
+void wm_xr_session_controller_data_create(wmXrData *xr);
+void wm_xr_session_controller_data_free(wmXrData *xr);
 
 void wm_xr_pose_to_viewmat(const GHOST_XrPose *pose, float r_viewmat[4][4]);
 void wm_xr_controller_pose_to_mat(const GHOST_XrPose *pose, float r_mat[4][4]);
diff --git a/source/blender/windowmanager/xr/intern/wm_xr_session.c b/source/blender/windowmanager/xr/intern/wm_xr_session.c
index bbef1e47790..16e103d0b79 100644
--- a/source/blender/windowmanager/xr/intern/wm_xr_session.c
+++ b/source/blender/windowmanager/xr/intern/wm_xr_session.c
@@ -30,9 +30,12 @@
 #include "DEG_depsgraph.h"
 
 #include "DNA_camera_types.h"
+#include "DNA_object_types.h"
 
 #include "DRW_engine.h"
 
+#in

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list