[Bf-blender-cvs] [5e8d3f6d281] xr-actions-D9124: Operators: Add invoke_3d() and implement for VIEW3D_OT_select
Peter Kim
noreply at git.blender.org
Tue Oct 13 14:45:02 CEST 2020
Commit: 5e8d3f6d281267a7866060dee0a78b10bb65429b
Author: Peter Kim
Date: Tue Oct 13 18:11:22 2020 +0900
Branches: xr-actions-D9124
https://developer.blender.org/rB5e8d3f6d281267a7866060dee0a78b10bb65429b
Operators: Add invoke_3d() and implement for VIEW3D_OT_select
===================================================================
M source/blender/editors/space_view3d/view3d_select.c
M source/blender/makesrna/intern/rna_wm.c
M source/blender/windowmanager/WM_api.h
M source/blender/windowmanager/WM_types.h
M source/blender/windowmanager/intern/wm_event_query.c
M source/blender/windowmanager/intern/wm_event_system.c
M source/blender/windowmanager/wm_event_system.h
M source/blender/windowmanager/xr/intern/wm_xr_draw.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/editors/space_view3d/view3d_select.c b/source/blender/editors/space_view3d/view3d_select.c
index 3f758c0fda3..e03609dab52 100644
--- a/source/blender/editors/space_view3d/view3d_select.c
+++ b/source/blender/editors/space_view3d/view3d_select.c
@@ -2507,6 +2507,60 @@ static int view3d_select_invoke(bContext *C, wmOperator *op, const wmEvent *even
return view3d_select_exec(C, op);
}
+static void controller_loc_to_mval(const float loc[3],
+ const float viewmat[4][4],
+ const float winmat[4][4],
+ short winx,
+ short winy,
+ int r_mval[2])
+{
+ float persmat[4][4];
+ float tmp[3];
+
+ mul_m4_m4m4(persmat, winmat, viewmat);
+ copy_v3_v3(tmp, loc);
+ mul_project_m4_v3(persmat, tmp);
+ r_mval[0] = (int)(((float)winx / 2.0f) * (1.0f + tmp[0]));
+ r_mval[1] = (int)(((float)winy / 2.0f) * (1.0f + tmp[1]));
+}
+
+static int view3d_select_invoke_3d(bContext *C, wmOperator *op, const wmEvent *event)
+{
+ BLI_assert(event->type == EVT_XR_ACTION);
+ BLI_assert(event->custom == EVT_DATA_XR);
+ BLI_assert(event->customdata);
+
+ ARegion *ar = CTX_wm_region(C);
+ RegionView3D *rv3d = ar->regiondata;
+ wmXrActionData *customdata = event->customdata;
+ float viewmat_prev[4][4];
+ float winmat_prev[4][4];
+ int mval[2];
+
+ /* Since this function is called in a window context, we need to replace the
+ * window viewmat and winmat with the XR surface counterparts to get a correct
+ * result for GPU select. */
+ copy_m4_m4(viewmat_prev, rv3d->viewmat);
+ copy_m4_m4(winmat_prev, rv3d->winmat);
+ copy_m4_m4(rv3d->viewmat, customdata->viewmat);
+ copy_m4_m4(rv3d->winmat, customdata->winmat);
+
+ controller_loc_to_mval(customdata->controller_loc,
+ customdata->viewmat,
+ customdata->winmat,
+ ar->winx,
+ ar->winy,
+ mval);
+
+ RNA_int_set_array(op->ptr, "location", mval);
+
+ int retval = view3d_select_exec(C, op);
+ copy_m4_m4(rv3d->viewmat, viewmat_prev);
+ copy_m4_m4(rv3d->winmat, winmat_prev);
+
+ return retval;
+}
+
void VIEW3D_OT_select(wmOperatorType *ot)
{
PropertyRNA *prop;
@@ -2518,6 +2572,7 @@ void VIEW3D_OT_select(wmOperatorType *ot)
/* api callbacks */
ot->invoke = view3d_select_invoke;
+ ot->invoke_3d = view3d_select_invoke_3d;
ot->exec = view3d_select_exec;
ot->poll = ED_operator_view3d_active;
diff --git a/source/blender/makesrna/intern/rna_wm.c b/source/blender/makesrna/intern/rna_wm.c
index 9b23cfcec67..949f25fac2d 100644
--- a/source/blender/makesrna/intern/rna_wm.c
+++ b/source/blender/makesrna/intern/rna_wm.c
@@ -686,7 +686,7 @@ static void rna_Event_xr_action_get(PointerRNA *ptr, char *value)
{
const wmEvent *event = ptr->data;
if (WM_event_is_xr(event)) {
- WM_event_xr_data(event, &value, NULL, NULL, NULL, NULL);
+ WM_event_xr_data(event, &value, NULL, NULL, NULL, NULL, NULL, NULL);
}
else {
value[0] = '\0';
@@ -710,7 +710,7 @@ static int rna_Event_xr_type_get(PointerRNA *ptr)
const wmEvent *event = ptr->data;
if (WM_event_is_xr(event)) {
GHOST_XrActionType type;
- WM_event_xr_data(event, NULL, (char *)&type, NULL, NULL, NULL);
+ WM_event_xr_data(event, NULL, (char *)&type, NULL, NULL, NULL, NULL, NULL);
return type;
}
else {
@@ -722,7 +722,7 @@ static void rna_Event_xr_state_get(PointerRNA *ptr, float *value)
{
const wmEvent *event = ptr->data;
if (WM_event_is_xr(event)) {
- WM_event_xr_data(event, NULL, NULL, value, NULL, NULL);
+ WM_event_xr_data(event, NULL, NULL, value, NULL, NULL, NULL, NULL);
}
else {
memset(value, 0, sizeof(float[2]));
@@ -733,7 +733,7 @@ static void rna_Event_xr_controller_location_get(PointerRNA *ptr, float *value)
{
const wmEvent *event = ptr->data;
if (WM_event_is_xr(event)) {
- WM_event_xr_data(event, NULL, NULL, NULL, value, NULL);
+ WM_event_xr_data(event, NULL, NULL, NULL, value, NULL, NULL, NULL);
}
else {
memset(value, 0, sizeof(float[3]));
@@ -744,7 +744,7 @@ static void rna_Event_xr_controller_rotation_get(PointerRNA *ptr, float *value)
{
const wmEvent *event = ptr->data;
if (WM_event_is_xr(event)) {
- WM_event_xr_data(event, NULL, NULL, NULL, NULL, value);
+ WM_event_xr_data(event, NULL, NULL, NULL, NULL, value, NULL, NULL);
}
else {
value[0] = 1.0f;
@@ -752,6 +752,28 @@ static void rna_Event_xr_controller_rotation_get(PointerRNA *ptr, float *value)
}
}
+static void rna_Event_xr_view_matrix_get(PointerRNA *ptr, float values[16])
+{
+ const wmEvent *event = ptr->data;
+ if (WM_event_is_xr(event)) {
+ WM_event_xr_data(event, NULL, NULL, NULL, NULL, NULL, (float(*)[4])values, NULL);
+ }
+ else {
+ memset(values, 0, sizeof(float[16]));
+ }
+}
+
+static void rna_Event_xr_projection_matrix_get(PointerRNA *ptr, float values[16])
+{
+ const wmEvent *event = ptr->data;
+ if (WM_event_is_xr(event)) {
+ WM_event_xr_data(event, NULL, NULL, NULL, NULL, NULL, NULL, (float(*)[4])values);
+ }
+ else {
+ memset(values, 0, sizeof(float[16]));
+ }
+}
+
static PointerRNA rna_PopupMenu_layout_get(PointerRNA *ptr)
{
struct uiPopupMenu *pup = ptr->data;
@@ -2324,8 +2346,8 @@ static void rna_def_event(BlenderRNA *brna)
prop = RNA_def_property(srna, "xr_controller_location", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_array(prop, 3);
- RNA_def_property_float_funcs(prop, "rna_Event_xr_controller_location_get", NULL, NULL);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_float_funcs(prop, "rna_Event_xr_controller_location_get", NULL, NULL);
RNA_def_property_ui_text(
prop,
"XR Controller Location",
@@ -2333,13 +2355,26 @@ static void rna_def_event(BlenderRNA *brna)
prop = RNA_def_property(srna, "xr_controller_rotation", PROP_FLOAT, PROP_QUATERNION);
RNA_def_property_array(prop, 4);
- RNA_def_property_float_funcs(prop, "rna_Event_xr_controller_rotation_get", NULL, NULL);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_float_funcs(prop, "rna_Event_xr_controller_rotation_get", NULL, NULL);
RNA_def_property_ui_text(
prop,
"XR Controller Rotation",
"Rotation of the action's corresponding controller pose in world space");
+ prop = RNA_def_property(srna, "xr_view_matrix", PROP_FLOAT, PROP_MATRIX);
+ RNA_def_property_array(prop, 16);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_float_funcs(prop, "rna_Event_xr_view_matrix_get", NULL, NULL);
+ RNA_def_property_ui_text(prop, "XR View Matrix", "View matrix of the XR viewer centroid");
+
+ prop = RNA_def_property(srna, "xr_projection_matrix", PROP_FLOAT, PROP_MATRIX);
+ RNA_def_property_array(prop, 16);
+ RNA_def_property_float_funcs(prop, "rna_Event_xr_projection_matrix_get", NULL, NULL);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(
+ prop, "XR Projection Matrix", "Projection matrix of the XR viewer centroid");
+
RNA_define_verify_sdna(1); /* not in sdna */
}
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index 8956c9b2382..273e91571b2 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -865,7 +865,9 @@ void WM_event_xr_data(const struct wmEvent *event,
char *type,
float state[2],
float controller_loc[3],
- float controller_rot[4]);
+ float controller_rot[4],
+ float viewmat[4][4],
+ float winmat[4][4]);
bool WM_event_is_xr(const struct wmEvent *event);
#ifdef WITH_INPUT_IME
diff --git a/source/blender/windowmanager/WM_types.h b/source/blender/windowmanager/WM_types.h
index 82e85e2277c..649628156d0 100644
--- a/source/blender/windowmanager/WM_types.h
+++ b/source/blender/windowmanager/WM_types.h
@@ -643,6 +643,9 @@ typedef struct wmXrActionData {
/** Controller pose corresponding to the action's subaction path. */
float controller_loc[3];
float controller_rot[4];
+ /** Viewmat and winmat of the XR viewer centroid. */
+ float viewmat[4][4];
+ float winmat[4][4];
/** Operator. */
struct wmOperatorType *ot;
} wmXrActionData;
@@ -720,6 +723,14 @@ typedef struct wmOperatorType {
struct wmOperator *,
const struct wmEvent *) ATTR_WARN_UNUSED_RESULT;
+ /**
+ * Same as invoke() but intended to be called from an XR session.
+ * The event type should be EVT_XR_ACTION and custom data type EVT_DATA_XR.
+ */
+ int (*invoke_3d)(struct bContext *,
+ struct wmOperator *,
+ const struct wmEvent *) ATTR_WARN_UNUSED_RESULT;
+
/**
* Called when a modal operator is canceled (not used often).
* Internal cleanup can be done here if needed.
@@ -736,6 +747,14 @@ typedef struct wmOperatorType {
struct wmOperator *,
const struct wmEvent *) ATTR_WARN_UNUSED_RESULT;
+ /**
+ * Same as modal() but intended to be called from an XR session.
+ * The event type should be EVT_XR_ACTION and custom data type EVT_DATA_XR.
+ */
+ int (*modal_3d)(struct bContext *,
+ struct wmOperator *,
+ const struct wmEvent *) ATTR_WARN_UNUSED_RESULT;
+
/**
* Verify if the operator can be executed in the current context, note
* that the operator might still fail to execute even if this return true.
diff --git a/source/blender/windowmanager/intern/wm_event_query.c b/source/blender/windowmanager/intern/wm_event_query.c
index 2813a8c7ca0..63354106b27 100644
--- a/source/blender/windowmanager/intern/wm_event_query.c
+++ b/source/blender/windowmanager/intern/wm_event_query.c
@@ -431,28 +431,32 @@ void WM_event_xr_data(const wmEvent *event,
char *type,
float state[2],
float controller_loc[3],
- float controller_rot[4])
+
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list