using System; using Oculus.Avatar; using UnityEngine; using UnityEngine.Rendering; public class OvrAvatarRenderComponent : MonoBehaviour { private bool firstSkinnedUpdate = true; public SkinnedMeshRenderer mesh; public Transform[] bones; protected void UpdateActive(OvrAvatar avatar, ovrAvatarVisibilityFlags mask) { if (base.name.Contains("body") && avatar.EnableExpressive && avatar.ShowFirstPerson && !avatar.ShowThirdPerson) { bool flag = (mask & ovrAvatarVisibilityFlags.FirstPerson) != 0; bool flag2 = (mask & ovrAvatarVisibilityFlags.ThirdPerson) != 0; base.gameObject.SetActive(flag2 || flag2); if (!flag) { mesh.enabled = false; } } else { bool flag3 = avatar.ShowFirstPerson && (mask & ovrAvatarVisibilityFlags.FirstPerson) != 0; flag3 |= avatar.ShowThirdPerson && (mask & ovrAvatarVisibilityFlags.ThirdPerson) != 0; base.gameObject.SetActive(flag3); mesh.enabled = flag3; } } protected SkinnedMeshRenderer CreateSkinnedMesh(ulong assetID, ovrAvatarVisibilityFlags visibilityMask, int thirdPersonLayer, int firstPersonLayer, int sortingOrder) { OvrAvatarAssetMesh ovrAvatarAssetMesh = (OvrAvatarAssetMesh)OvrAvatarSDKManager.Instance.GetAsset(assetID); if (ovrAvatarAssetMesh == null) { throw new Exception("Couldn't find mesh for asset " + assetID); } if ((visibilityMask & ovrAvatarVisibilityFlags.ThirdPerson) != 0) { base.gameObject.layer = thirdPersonLayer; } else { base.gameObject.layer = firstPersonLayer; } SkinnedMeshRenderer skinnedMeshRenderer = ovrAvatarAssetMesh.CreateSkinnedMeshRendererOnObject(base.gameObject); skinnedMeshRenderer.quality = SkinQuality.Bone4; skinnedMeshRenderer.sortingOrder = sortingOrder; skinnedMeshRenderer.updateWhenOffscreen = true; if ((visibilityMask & ovrAvatarVisibilityFlags.SelfOccluding) == 0) { skinnedMeshRenderer.shadowCastingMode = ShadowCastingMode.Off; } return skinnedMeshRenderer; } protected void UpdateSkinnedMesh(OvrAvatar avatar, Transform[] bones, ovrAvatarTransform localTransform, ovrAvatarVisibilityFlags visibilityMask, IntPtr renderPart) { UpdateActive(avatar, visibilityMask); OvrAvatar.ConvertTransform(localTransform, base.transform); ovrAvatarRenderPartType ovrAvatarRenderPartType2 = CAPI.ovrAvatarRenderPart_GetType(renderPart); ulong num; switch (ovrAvatarRenderPartType2) { case ovrAvatarRenderPartType.SkinnedMeshRender: num = CAPI.ovrAvatarSkinnedMeshRender_GetDirtyJoints(renderPart); break; case ovrAvatarRenderPartType.SkinnedMeshRenderPBS: num = CAPI.ovrAvatarSkinnedMeshRenderPBS_GetDirtyJoints(renderPart); break; case ovrAvatarRenderPartType.SkinnedMeshRenderPBS_V2: num = CAPI.ovrAvatarSkinnedMeshRenderPBSV2_GetDirtyJoints(renderPart); break; default: throw new Exception("Unhandled render part type: " + ovrAvatarRenderPartType2); } for (uint num2 = 0u; num2 < 64; num2++) { ulong num3 = (ulong)(1L << (int)num2); if ((firstSkinnedUpdate && num2 < bones.Length) || (num3 & num) != 0) { Transform target = bones[num2]; ovrAvatarTransform ovrAvatarTransform2; switch (ovrAvatarRenderPartType2) { case ovrAvatarRenderPartType.SkinnedMeshRender: ovrAvatarTransform2 = CAPI.ovrAvatarSkinnedMeshRender_GetJointTransform(renderPart, num2); break; case ovrAvatarRenderPartType.SkinnedMeshRenderPBS: ovrAvatarTransform2 = CAPI.ovrAvatarSkinnedMeshRenderPBS_GetJointTransform(renderPart, num2); break; case ovrAvatarRenderPartType.SkinnedMeshRenderPBS_V2: ovrAvatarTransform2 = CAPI.ovrAvatarSkinnedMeshRenderPBSV2_GetJointTransform(renderPart, num2); break; default: throw new Exception("Unhandled render part type: " + ovrAvatarRenderPartType2); } OvrAvatar.ConvertTransform(ovrAvatarTransform2, target); } } ovrAvatarBlendShapeParams ovrAvatarBlendShapeParams2 = CAPI.ovrAvatarSkinnedMeshRender_GetBlendShapeParams(renderPart); for (uint num4 = 0u; num4 < ovrAvatarBlendShapeParams2.blendShapeParamCount; num4++) { float num5 = ovrAvatarBlendShapeParams2.blendShapeParams[num4]; mesh.SetBlendShapeWeight((int)num4, num5 * 100f); } firstSkinnedUpdate = false; } protected Material CreateAvatarMaterial(string name, Shader shader) { if (shader == null) { throw new Exception("No shader provided for avatar material."); } Material material = new Material(shader); material.name = name; return material; } }