/// <summary> /// Generates the mesh. /// This should only be done when fov changes. /// </summary> /// <param name="lc">Lc.</param> /// <param name="rightEye">If set to <c>true</c> right eye.</param> /// <param name="flipY">If set to <c>true</c> flip y.</param> public void GenerateMesh(ref OVRLensCorrection lc, bool rightEye, bool flipY) { int numVerts = 0; int numIndicies = 0; // Generate OVR mesh for given eye OVR_GenerateDistortionMesh(ref numVerts, ref numIndicies, rightEye); // create space to copy mesh into DistMeshVert[] meshVerts = new DistMeshVert[numVerts]; triIndices = new int[numIndicies]; DistScaleOffsetUV scaleOffset = new DistScaleOffsetUV(); // Copy mesh into above data OVR_CopyDistortionMesh(meshVerts, triIndices, ref scaleOffset, rightEye, flipY); // Set material scale and offset values lc._DMScale.x = scaleOffset.Scale_x; lc._DMScale.y = scaleOffset.Scale_y; lc._DMOffset.x = scaleOffset.Offset_x; lc._DMOffset.y = scaleOffset.Offset_y; // Copy local mesh into proper Unity mesh structure mesh = new Mesh(); positions = new Vector3[numVerts]; uvR = new Vector2[numVerts]; uvG = new Vector2[numVerts]; uvB = new Vector3[numVerts]; for (int i = 0; i < numVerts; i++) { positions[i].x = meshVerts[i].ScreenPosNDC_x; positions[i].y = meshVerts[i].ScreenPosNDC_y; positions[i].z = meshVerts[i].Shade; // overload for shading on edges uvR[i].x = meshVerts[i].TanEyeAnglesR_u; uvR[i].y = meshVerts[i].TanEyeAnglesR_v; uvG[i].x = meshVerts[i].TanEyeAnglesG_u; uvG[i].y = meshVerts[i].TanEyeAnglesG_v; uvB[i].x = meshVerts[i].TanEyeAnglesB_u; uvB[i].y = meshVerts[i].TanEyeAnglesB_v; } mesh.vertices = positions; mesh.uv = uvR; mesh.uv1 = uvG; mesh.normals = uvB; mesh.triangles = triIndices; // Destory internal distorion meshes OVR_DestroyDistortionMesh(); }
/// <summary> /// Generates the mesh. /// This should only be done when fov changes. /// </summary> /// <param name="lc">Lc.</param> /// <param name="rightEye">If set to <c>true</c> right eye.</param> /// <param name="flipY">If set to <c>true</c> flip y.</param> public void GenerateMesh(ref OVRLensCorrection lc, bool rightEye, bool flipY) { int numVerts = 0; int numIndicies = 0; // Generate OVR mesh for given eye OVR_GenerateDistortionMesh(ref numVerts, ref numIndicies, rightEye); // create space to copy mesh into DistMeshVert[] meshVerts = new DistMeshVert[numVerts]; triIndices = new int[numIndicies]; DistScaleOffsetUV scaleOffset = new DistScaleOffsetUV(); // Copy mesh into above data OVR_CopyDistortionMesh(meshVerts, triIndices, ref scaleOffset, rightEye, flipY); // Set material scale and offset values lc._DMScale.x = scaleOffset.Scale_x; lc._DMScale.y = scaleOffset.Scale_y; lc._DMOffset.x = scaleOffset.Offset_x; lc._DMOffset.y = scaleOffset.Offset_y; // Copy local mesh into proper Unity mesh structure mesh = new Mesh(); positions = new Vector3[numVerts]; uvR = new Vector2[numVerts]; uvG = new Vector2[numVerts]; uvB = new Vector3[numVerts]; for(int i = 0; i < numVerts; i++) { positions[i].x = meshVerts[i].ScreenPosNDC_x; positions[i].y = meshVerts[i].ScreenPosNDC_y; positions[i].z = meshVerts[i].Shade; // overload for shading on edges uvR[i].x = meshVerts[i].TanEyeAnglesR_u; uvR[i].y = meshVerts[i].TanEyeAnglesR_v; uvG[i].x = meshVerts[i].TanEyeAnglesG_u; uvG[i].y = meshVerts[i].TanEyeAnglesG_v; uvB[i].x = meshVerts[i].TanEyeAnglesB_u; uvB[i].y = meshVerts[i].TanEyeAnglesB_v; } mesh.vertices = positions; mesh.uv = uvR; mesh.uv2 = uvG; mesh.normals = uvB; mesh.triangles = triIndices; // Destory internal distorion meshes OVR_DestroyDistortionMesh(); }
private static extern void OVR_CopyDistortionMesh(DistMeshVert[] leftEye, int[] leftEyeIndicies, ref DistScaleOffsetUV scaleOffset, bool rightEye, bool flipY);
/// <summary> /// Generates the mesh. /// This should only be done when fov changes. /// </summary> /// <param name="lc">Lc.</param> /// <param name="rightEye">If set to <c>true</c> right eye.</param> /// <param name="flipY">If set to <c>true</c> flip y.</param> public void GenerateMesh(ref OVRLensCorrection lc, bool rightEye, bool flipY, bool useCameraTexture) { // We only need to create the mesh once and re-use components when camera // is dirty bool create = true; if (!mesh) { mesh = new Mesh(); mesh.MarkDynamic(); } else { create = false; } int numVerts = 0; int numIndicies = 0; // Generate OVR mesh for given eye OVR_GenerateDistortionMesh(ref numVerts, ref numIndicies, rightEye); // create space to copy mesh into if (create) { meshVerts = new DistMeshVert[numVerts]; triIndices = new int[numIndicies]; scaleOffset = new DistScaleOffsetUV(); } // Copy mesh into above data OVR_CopyDistortionMesh(meshVerts, triIndices, ref scaleOffset, rightEye, flipY); // Set material scale and offset values lc._DMScale.x = (useCameraTexture) ? scaleOffset.Scale_x : 0.5f * scaleOffset.Scale_x; lc._DMScale.y = scaleOffset.Scale_y; lc._DMOffset.x = (useCameraTexture) ? scaleOffset.Offset_x : scaleOffset.Offset_x + ((rightEye) ? 0.25f : -0.25f); lc._DMOffset.y = scaleOffset.Offset_y; // Copy local mesh into proper Unity mesh structure if (create) { positions = new Vector3[numVerts]; uvR = new Vector2[numVerts]; uvG = new Vector2[numVerts]; uvB = new Vector3[numVerts]; } for (int i = 0; i < numVerts; i++) { positions[i].x = meshVerts[i].ScreenPosNDC_x; positions[i].y = meshVerts[i].ScreenPosNDC_y; positions[i].z = meshVerts[i].Shade; // overload for shading on edges uvR[i].x = meshVerts[i].TanEyeAnglesR_u; uvR[i].y = meshVerts[i].TanEyeAnglesR_v; uvG[i].x = meshVerts[i].TanEyeAnglesG_u; uvG[i].y = meshVerts[i].TanEyeAnglesG_v; uvB[i].x = meshVerts[i].TanEyeAnglesB_u; uvB[i].y = meshVerts[i].TanEyeAnglesB_v; uvB[i].z = meshVerts[i].TimewarpLerp; // overload for timewarp lerp } mesh.vertices = positions; mesh.uv = uvR; mesh.uv1 = uvG; mesh.normals = uvB; mesh.triangles = triIndices; // Destory internal distorion meshes OVR_DestroyDistortionMesh(); }
/// <summary> /// Generates the mesh. /// This should only be done when fov changes. /// </summary> /// <param name="lc">Lc.</param> /// <param name="rightEye">If set to <c>true</c> right eye.</param> /// <param name="flipY">If set to <c>true</c> flip y.</param> public void GenerateMesh(ref OVRLensCorrection lc, bool rightEye, bool flipY) { // We only need to create the mesh once and re-use components when camera // is dirty bool create = true; if (!mesh) { mesh = new Mesh (); mesh.MarkDynamic(); } else create = false; int numVerts = 0; int numIndicies = 0; // Generate OVR mesh for given eye OVR_GenerateDistortionMesh(ref numVerts, ref numIndicies, rightEye); // create space to copy mesh into if (create) { meshVerts = new DistMeshVert[numVerts]; triIndices = new int[numIndicies]; scaleOffset = new DistScaleOffsetUV (); } // Copy mesh into above data bool needsFlip = (SystemInfo.graphicsDeviceVersion.Contains ("GL")) ? flipY : !flipY; OVR_CopyDistortionMesh(meshVerts, triIndices, ref scaleOffset, rightEye, needsFlip); // Set material scale and offset values lc._DMScale.x = 0.5f * scaleOffset.Scale_x; lc._DMScale.y = scaleOffset.Scale_y; lc._DMOffset.x = scaleOffset.Offset_x + ((rightEye) ? 0.25f : -0.25f); lc._DMOffset.y = scaleOffset.Offset_y; // Copy local mesh into proper Unity mesh structure if (create) { positions = new Vector3[numVerts]; uvR = new Vector2[numVerts]; uvG = new Vector2[numVerts]; uvB = new Vector3[numVerts]; } for(int i = 0; i < numVerts; i++) { positions[i].x = meshVerts[i].ScreenPosNDC_x; positions[i].y = meshVerts[i].ScreenPosNDC_y; positions[i].z = meshVerts[i].Shade; // overload for shading on edges uvR[i].x = meshVerts[i].TanEyeAnglesR_u; uvR[i].y = meshVerts[i].TanEyeAnglesR_v; uvG[i].x = meshVerts[i].TanEyeAnglesG_u; uvG[i].y = meshVerts[i].TanEyeAnglesG_v; uvB[i].x = meshVerts[i].TanEyeAnglesB_u; uvB[i].y = meshVerts[i].TanEyeAnglesB_v; } mesh.vertices = positions; mesh.uv = uvR; mesh.uv1 = uvG; mesh.normals = uvB; mesh.triangles = triIndices; // Destory internal distorion meshes OVR_DestroyDistortionMesh(); }