/************************************************************************************
|
|
Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved.
|
|
|
|
Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use
|
|
the Utilities SDK except in compliance with the License, which is provided at the time of installation
|
|
or download, or which otherwise accompanies this software in either electronic or hard copy form.
|
|
|
|
You may obtain a copy of the License at
|
|
https://developer.oculus.com/licenses/utilities-1.31
|
|
|
|
Unless required by applicable law or agreed to in writing, the Utilities SDK distributed
|
|
under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
|
|
ANY KIND, either express or implied. See the License for the specific language governing
|
|
permissions and limitations under the License.
|
|
************************************************************************************/
|
|
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
[DefaultExecutionOrder(-80)]
|
|
public class OVRMesh : MonoBehaviour
|
|
{
|
|
public interface IOVRMeshDataProvider
|
|
{
|
|
MeshType GetMeshType();
|
|
}
|
|
|
|
public enum MeshType
|
|
{
|
|
None = OVRPlugin.MeshType.None,
|
|
HandLeft = OVRPlugin.MeshType.HandLeft,
|
|
HandRight = OVRPlugin.MeshType.HandRight,
|
|
}
|
|
|
|
[SerializeField]
|
|
private IOVRMeshDataProvider _dataProvider;
|
|
[SerializeField]
|
|
private MeshType _meshType = MeshType.None;
|
|
private Mesh _mesh;
|
|
|
|
public bool IsInitialized { get; private set; }
|
|
|
|
public Mesh Mesh
|
|
{
|
|
get { return _mesh; }
|
|
}
|
|
|
|
private void Awake()
|
|
{
|
|
if (_dataProvider == null)
|
|
{
|
|
_dataProvider = GetComponent<IOVRMeshDataProvider>();
|
|
}
|
|
|
|
if (_dataProvider != null)
|
|
{
|
|
_meshType = _dataProvider.GetMeshType();
|
|
}
|
|
|
|
if (_meshType != MeshType.None)
|
|
{
|
|
Initialize(_meshType);
|
|
}
|
|
}
|
|
|
|
private void Initialize(MeshType meshType)
|
|
{
|
|
_mesh = new Mesh();
|
|
|
|
var ovrpMesh = new OVRPlugin.Mesh();
|
|
if (OVRPlugin.GetMesh((OVRPlugin.MeshType)_meshType, out ovrpMesh))
|
|
{
|
|
var vertices = new Vector3[ovrpMesh.NumVertices];
|
|
for (int i = 0; i < ovrpMesh.NumVertices; ++i)
|
|
{
|
|
vertices[i] = ovrpMesh.VertexPositions[i].FromFlippedXVector3f();
|
|
}
|
|
_mesh.vertices = vertices;
|
|
|
|
var uv = new Vector2[ovrpMesh.NumVertices];
|
|
for (int i = 0; i < ovrpMesh.NumVertices; ++i)
|
|
{
|
|
uv[i] = new Vector2(ovrpMesh.VertexUV0[i].x, -ovrpMesh.VertexUV0[i].y);
|
|
}
|
|
_mesh.uv = uv;
|
|
|
|
var triangles = new int[ovrpMesh.NumIndices];
|
|
for (int i = 0; i < ovrpMesh.NumIndices; ++i)
|
|
{
|
|
triangles[i] = ovrpMesh.Indices[ovrpMesh.NumIndices - i - 1];
|
|
}
|
|
_mesh.triangles = triangles;
|
|
|
|
var normals = new Vector3[ovrpMesh.NumVertices];
|
|
for (int i = 0; i < ovrpMesh.NumVertices; ++i)
|
|
{
|
|
normals[i] = ovrpMesh.VertexNormals[i].FromFlippedXVector3f();
|
|
}
|
|
_mesh.normals = normals;
|
|
|
|
var boneWeights = new BoneWeight[ovrpMesh.NumVertices];
|
|
for (int i = 0; i < ovrpMesh.NumVertices; ++i)
|
|
{
|
|
var currentBlendWeight = ovrpMesh.BlendWeights[i];
|
|
var currentBlendIndices = ovrpMesh.BlendIndices[i];
|
|
|
|
boneWeights[i].boneIndex0 = (int)currentBlendIndices.x;
|
|
boneWeights[i].weight0 = currentBlendWeight.x;
|
|
boneWeights[i].boneIndex1 = (int)currentBlendIndices.y;
|
|
boneWeights[i].weight1 = currentBlendWeight.y;
|
|
boneWeights[i].boneIndex2 = (int)currentBlendIndices.z;
|
|
boneWeights[i].weight2 = currentBlendWeight.z;
|
|
boneWeights[i].boneIndex3 = (int)currentBlendIndices.w;
|
|
boneWeights[i].weight3 = currentBlendWeight.w;
|
|
}
|
|
_mesh.boneWeights = boneWeights;
|
|
|
|
IsInitialized = true;
|
|
}
|
|
}
|
|
}
|