Jelajahi Sumber

Make matrix getters generic

Jakob Bornecrantz 12 tahun lalu
induk
melakukan
8cdde8f2d8
3 mengubah file dengan 35 tambahan dan 30 penghapusan
  1. 2 30
      src/drv_oculus_rift/rift.c
  2. 29 0
      src/openhmd.c
  3. 4 0
      src/openhmdi.h

+ 2 - 30
src/drv_oculus_rift/rift.c

@@ -39,8 +39,6 @@ typedef struct {
 	struct {
 		float proj_offset; // lens offset on screen
 		mat4x4f proj_base; // base projection matrix
-		mat4x4f proj_left; // adjusted projection matrix for left screen
-		mat4x4f proj_right; // adjusted projection matrix for right screen
 
 		float full_ratio; // screen ratio for the entire device
 	} calc_values;
@@ -206,12 +204,12 @@ static void calc_derived_values(rift_priv *priv)
 	omat4x4f_init_translate(&translate, proj_offset, 0, 0);
 	omat4x4f_mult(&translate,
 	              &priv->calc_values.proj_base,
-	              &priv->calc_values.proj_left);
+	              &priv->base.properties.proj_left);
 
 	omat4x4f_init_translate(&translate, -proj_offset, 0, 0);
 	omat4x4f_mult(&translate,
 	              &priv->calc_values.proj_base,
-	              &priv->calc_values.proj_right);
+	              &priv->base.properties.proj_right);
 }
 	
 static int getf(ohmd_device* device, ohmd_float_value type, float* out)
@@ -229,32 +227,6 @@ static int getf(ohmd_device* device, ohmd_float_value type, float* out)
 			*(quatf*)out = priv->sensor_fusion.orient;
 			break;
 		}
-	case OHMD_LEFT_EYE_GL_MODELVIEW_MATRIX: {
-			vec3f point = {{0, 0, 0}};
-			mat4x4f orient, world_shift, result;
-			omat4x4f_init_look_at(&orient, &priv->sensor_fusion.orient, &point);
-			omat4x4f_init_translate(&world_shift, +(priv->base.properties.idp / 2.0f), 0, 0);
-			omat4x4f_mult(&world_shift, &orient, &result);
-			omat4x4f_transpose(&result, (mat4x4f*)out);
-			break;
-		}
-	case OHMD_RIGHT_EYE_GL_MODELVIEW_MATRIX: {
-			vec3f point = {{0, 0, 0}};
-			mat4x4f orient, world_shift, result;
-			omat4x4f_init_look_at(&orient, &priv->sensor_fusion.orient, &point);
-			omat4x4f_init_translate(&world_shift, -(priv->base.properties.idp / 2.0f), 0, 0);
-			omat4x4f_mult(&world_shift, &orient, &result);
-			omat4x4f_transpose(&result, (mat4x4f*)out);
-			break;
-		}
-	case OHMD_LEFT_EYE_GL_PROJECTION_MATRIX: {
-			omat4x4f_transpose(&priv->calc_values.proj_left, (mat4x4f*)out);
-			break;
-		}
-	case OHMD_RIGHT_EYE_GL_PROJECTION_MATRIX: {
-			omat4x4f_transpose(&priv->calc_values.proj_right, (mat4x4f*)out);
-			break;
-		}
 	default:
 		ohmd_set_error(priv->base.ctx, "invalid type given to getf (%d)", type);
 		return -1;

+ 29 - 0
src/openhmd.c

@@ -97,6 +97,35 @@ OHMD_APIENTRY ohmd_device* ohmd_list_open_device(ohmd_context* ctx, int index)
 OHMD_APIENTRY int ohmd_device_getf(ohmd_device* device, ohmd_float_value type, float* out)
 {
 	switch(type){
+	case OHMD_LEFT_EYE_GL_MODELVIEW_MATRIX: {
+			vec3f point = {{0, 0, 0}};
+			quatf rot;
+			device->getf(device, OHMD_ROTATION_QUAT, (float*)&rot);
+			mat4x4f orient, world_shift, result;
+			omat4x4f_init_look_at(&orient, &rot, &point);
+			omat4x4f_init_translate(&world_shift, +(device->properties.idp / 2.0f), 0, 0);
+			omat4x4f_mult(&world_shift, &orient, &result);
+			omat4x4f_transpose(&result, (mat4x4f*)out);
+			return 0;
+		}
+	case OHMD_RIGHT_EYE_GL_MODELVIEW_MATRIX: {
+			vec3f point = {{0, 0, 0}};
+			quatf rot;
+			device->getf(device, OHMD_ROTATION_QUAT, (float*)&rot);
+			mat4x4f orient, world_shift, result;
+			omat4x4f_init_look_at(&orient, &rot, &point);
+			omat4x4f_init_translate(&world_shift, -(device->properties.idp / 2.0f), 0, 0);
+			omat4x4f_mult(&world_shift, &orient, &result);
+			omat4x4f_transpose(&result, (mat4x4f*)out);
+			return 0;
+		}
+	case OHMD_LEFT_EYE_GL_PROJECTION_MATRIX:
+		omat4x4f_transpose(&device->properties.proj_left, (mat4x4f*)out);
+		return 0;
+	case OHMD_RIGHT_EYE_GL_PROJECTION_MATRIX:
+		omat4x4f_transpose(&device->properties.proj_right, (mat4x4f*)out);
+		return 0;
+
 	case OHMD_SCREEN_HORIZONTAL_SIZE:
 		*out = device->properties.hsize;
 		return 0;

+ 4 - 0
src/openhmdi.h

@@ -11,6 +11,7 @@
 #define OPENHMDI_H
 
 #include "openhmd.h"
+#include "omath.h"
 
 #include <stdbool.h>
 #include <stdint.h>
@@ -63,6 +64,9 @@ struct ohmd_device {
 		float idp;
 		float zfar;
 		float znear;
+
+		mat4x4f proj_left; // adjusted projection matrix for left screen
+		mat4x4f proj_right; // adjusted projection matrix for right screen
 	} properties;
 
 	int (*getf)(ohmd_device* device, ohmd_float_value type, float* out);