1
1
using System . Numerics ;
2
- using System . Runtime . InteropServices ;
3
2
using Valve . VR ;
4
3
5
4
namespace OpenVR . NET ;
@@ -24,21 +23,16 @@ public interface IVRDrawContext {
24
23
void SubmitFrame ( EVREye eye , Texture_t texture , EVRSubmitFlags flags = EVRSubmitFlags . Submit_Default ) ;
25
24
26
25
/// <summary>
27
- /// Gets a mesh which will cover the area of the render texture that is not visible.
26
+ /// Gets a mesh which will cover the area of the render texture that is not visible ( or visible if <paramref name="inverse"/> is <see langword="true"/> ) .
28
27
/// The mesh is in UV coordinates.
29
28
/// </summary>
30
- void GetHiddenAreaMesh ( EVREye eye , Action < Vector2 , Vector2 , Vector2 > addTriangle ) ;
29
+ ReadOnlySpan < ( Vector2 , Vector2 , Vector2 ) > GetHiddenAreaMesh ( EVREye eye , bool inverse = false ) ;
31
30
32
31
/// <summary>
33
- /// Gets a mesh which will cover the area of the render texture that is visible.
32
+ /// Gets a vertex loop around the area of the render texture which is visible.
34
33
/// The mesh is in UV coordinates.
35
34
/// </summary>
36
- void GetInverseHiddenAreaMesh ( EVREye eye , Action < Vector2 , Vector2 , Vector2 > addTriangle ) ;
37
-
38
- /// <summary>
39
- /// idk
40
- /// </summary>
41
- void GetLoopHiddenAreaMesh ( EVREye eye , Action < Vector2 > addVertex ) ;
35
+ ReadOnlySpan < Vector2 > GetLoopHiddenAreaMesh ( EVREye eye ) ;
42
36
43
37
/// <summary>
44
38
/// Whether OpenVR is rendering controllers on its own - you should consider not drawing user hands/controllers if this is <see langword="true"/>
@@ -71,37 +65,19 @@ public void SubmitFrame ( EVREye eye, Texture_t texture, EVRSubmitFlags flags =
71
65
72
66
public Vector2 Resolution { get ; }
73
67
74
- public void GetHiddenAreaMesh ( EVREye eye , Action < Vector2 , Vector2 , Vector2 > addTriangle ) {
75
- var mesh = VR . CVR . GetHiddenAreaMesh ( eye , EHiddenAreaMeshType . k_eHiddenAreaMesh_Standard ) ;
76
- var size = Marshal . SizeOf < HmdVector2_t > ( ) ;
77
- for ( int i = 0 ; i < mesh . unTriangleCount ; i ++ ) {
78
- var ptr = mesh . pVertexData + size * i * 3 ;
79
- var a = Marshal . PtrToStructure < HmdVector2_t > ( ptr ) ;
80
- var b = Marshal . PtrToStructure < HmdVector2_t > ( ptr + size ) ;
81
- var c = Marshal . PtrToStructure < HmdVector2_t > ( ptr + size + size ) ;
82
- addTriangle ( new ( a . v0 , a . v1 ) , new ( b . v0 , b . v1 ) , new ( c . v0 , c . v1 ) ) ;
68
+ public ReadOnlySpan < ( Vector2 , Vector2 , Vector2 ) > GetHiddenAreaMesh ( EVREye eye , bool inverse = false ) {
69
+ var mesh = VR . CVR . GetHiddenAreaMesh ( eye , inverse ? EHiddenAreaMeshType . k_eHiddenAreaMesh_Inverse : EHiddenAreaMeshType . k_eHiddenAreaMesh_Standard ) ;
70
+
71
+ unsafe {
72
+ return new ReadOnlySpan < ( Vector2 , Vector2 , Vector2 ) > ( mesh . pVertexData . ToPointer ( ) , ( int ) mesh . unTriangleCount ) ;
83
73
}
84
74
}
85
75
86
- public void GetInverseHiddenAreaMesh ( EVREye eye , Action < Vector2 , Vector2 , Vector2 > addTriangle ) {
87
- var mesh = VR . CVR . GetHiddenAreaMesh ( eye , EHiddenAreaMeshType . k_eHiddenAreaMesh_Inverse ) ;
88
- var size = Marshal . SizeOf < HmdVector2_t > ( ) ;
89
- for ( int i = 0 ; i < mesh . unTriangleCount ; i ++ ) {
90
- var ptr = mesh . pVertexData + size * i * 3 ;
91
- var a = Marshal . PtrToStructure < HmdVector2_t > ( ptr ) ;
92
- var b = Marshal . PtrToStructure < HmdVector2_t > ( ptr + size ) ;
93
- var c = Marshal . PtrToStructure < HmdVector2_t > ( ptr + size + size ) ;
94
- addTriangle ( new ( a . v0 , a . v1 ) , new ( b . v0 , b . v1 ) , new ( c . v0 , c . v1 ) ) ;
95
- }
96
- }
97
-
98
- public void GetLoopHiddenAreaMesh ( EVREye eye , Action < Vector2 > addVertex ) {
76
+ public ReadOnlySpan < Vector2 > GetLoopHiddenAreaMesh ( EVREye eye ) {
99
77
var mesh = VR . CVR . GetHiddenAreaMesh ( eye , EHiddenAreaMeshType . k_eHiddenAreaMesh_LineLoop ) ;
100
- var size = Marshal . SizeOf < HmdVector2_t > ( ) ;
101
- for ( int i = 0 ; i < mesh . unTriangleCount ; i ++ ) {
102
- var ptr = mesh . pVertexData + size * i ;
103
- var a = Marshal . PtrToStructure < HmdVector2_t > ( ptr ) ;
104
- addVertex ( new ( a . v0 , a . v1 ) ) ;
78
+
79
+ unsafe {
80
+ return new ReadOnlySpan < Vector2 > ( mesh . pVertexData . ToPointer ( ) , ( int ) mesh . unTriangleCount ) ;
105
81
}
106
82
}
107
83
0 commit comments