protected void UpdateSkinnedMesh(OvrAvatar avatar, SkinnedMeshRenderer mesh, Transform[] bones, ovrAvatarTransform localTransform, ovrAvatarVisibilityFlags visibilityMask, IntPtr renderPart) { UpdateActive(avatar, visibilityMask); OvrAvatar.ConvertTransform(localTransform, this.transform); UInt64 dirtyJoints = CAPI.ovrAvatarSkinnedMeshRender_GetDirtyJoints(renderPart); ovrAvatarRenderPartType type = CAPI.ovrAvatarRenderPart_GetType(renderPart); // We need to make sure that we fully update the initial position of // Skinned mesh renderers, then, thereafter, we can only update dirty joints bool forceUpdate = (firstSkinnedUpdate && type == ovrAvatarRenderPartType.SkinnedMeshRender); for (UInt32 i = 0; i < 64; i++) { UInt64 dirtyMask = (ulong)1 << (int)i; if ((forceUpdate && i < bones.Length) || (dirtyMask & dirtyJoints) != 0) { //This joint is dirty and needs to be updated Transform targetBone = bones[i]; ovrAvatarTransform transform = CAPI.ovrAvatarSkinnedMeshRender_GetJointTransform(renderPart, i); OvrAvatar.ConvertTransform(transform, targetBone); } } firstSkinnedUpdate = false; }
private void AddAvatarComponent(GameObject componentObject, ovrAvatarComponent component) { OvrAvatarComponent ovrComponent = componentObject.AddComponent <OvrAvatarComponent>(); trackedComponents.Add(component.name, ovrComponent); for (UInt32 renderPartIndex = 0; renderPartIndex < component.renderPartCount; renderPartIndex++) { GameObject renderPartObject = new GameObject(); renderPartObject.name = GetRenderPartName(component, renderPartIndex); renderPartObject.transform.SetParent(componentObject.transform); IntPtr renderPart = GetRenderPart(component, renderPartIndex); ovrAvatarRenderPartType type = Oculus.Avatar.CAPI.ovrAvatarRenderPart_GetType(renderPart); OvrAvatarRenderComponent ovrRenderPart; switch (type) { case ovrAvatarRenderPartType.SkinnedMeshRender: ovrRenderPart = AddSkinnedMeshRenderComponent(renderPartObject, Oculus.Avatar.CAPI.ovrAvatarRenderPart_GetSkinnedMeshRender(renderPart)); break; case ovrAvatarRenderPartType.SkinnedMeshRenderPBS: ovrRenderPart = AddSkinnedMeshRenderPBSComponent(renderPartObject, Oculus.Avatar.CAPI.ovrAvatarRenderPart_GetSkinnedMeshRenderPBS(renderPart)); break; case ovrAvatarRenderPartType.ProjectorRender: ovrRenderPart = AddProjectorRenderComponent(renderPartObject, Oculus.Avatar.CAPI.ovrAvatarRenderPart_GetProjectorRender(renderPart)); break; default: throw new NotImplementedException( string.Format("Unsupported render part type: {0}", type.ToString())); } ovrComponent.RenderParts.Add(ovrRenderPart); } }
public void UpdateAvatar(IntPtr nativeComponent) { CAPI.ovrAvatarComponent_Get(nativeComponent, false, ref nativeAvatarComponent); OvrAvatar.ConvertTransform(nativeAvatarComponent.transform, transform); for (UInt32 renderPartIndex = 0; renderPartIndex < 1; renderPartIndex++) //nativeAvatarComponent.renderPartCount { if (RenderParts.Count <= renderPartIndex) { break; } OvrAvatarRenderComponent renderComponent = RenderParts[(int)renderPartIndex]; IntPtr renderPart = OvrAvatar.GetRenderPart(nativeAvatarComponent, renderPartIndex); ovrAvatarRenderPartType type = CAPI.ovrAvatarRenderPart_GetType(renderPart); switch (type) { case ovrAvatarRenderPartType.SkinnedMeshRender: ((OvrAvatarSkinnedMeshRenderComponent)renderComponent).UpdateSkinnedMeshRender(this, owner, renderPart); break; case ovrAvatarRenderPartType.SkinnedMeshRenderPBS: ((OvrAvatarSkinnedMeshRenderPBSComponent)renderComponent).UpdateSkinnedMeshRenderPBS(owner, renderPart, renderComponent.mesh.sharedMaterial); break; case ovrAvatarRenderPartType.SkinnedMeshRenderPBS_V2: ((OvrAvatarSkinnedMeshPBSV2RenderComponent)renderComponent).UpdateSkinnedMeshRender(this, owner, renderPart); break; default: break; } } }
private void UpdateAvatarComponent(ovrAvatarComponent component) { for (UInt32 renderPartIndex = 0; renderPartIndex < component.renderPartCount; renderPartIndex++) { if (RenderParts.Count <= renderPartIndex) { break; } OvrAvatarRenderComponent renderComponent = RenderParts[(int)renderPartIndex]; IntPtr renderPart = OvrAvatar.GetRenderPart(component, renderPartIndex); ovrAvatarRenderPartType type = CAPI.ovrAvatarRenderPart_GetType(renderPart); switch (type) { case ovrAvatarRenderPartType.SkinnedMeshRenderPBS: var mat = renderComponent.mesh.sharedMaterial; var bones = renderComponent.bones; ovrAvatarVisibilityFlags visibilityMask = CAPI.ovrAvatarSkinnedMeshRenderPBS_GetVisibilityMask(renderPart); ovrAvatarTransform localTransform = CAPI.ovrAvatarSkinnedMeshRenderPBS_GetTransform(renderPart); UpdateSkinnedMesh(localTransform, renderPart, bones); UInt64 albedoTextureID = CAPI.ovrAvatarSkinnedMeshRenderPBS_GetAlbedoTextureAssetID(renderPart); UInt64 surfaceTextureID = CAPI.ovrAvatarSkinnedMeshRenderPBS_GetSurfaceTextureAssetID(renderPart); mat.SetTexture("_Albedo", OvrAvatarComponent.GetLoadedTexture(albedoTextureID)); mat.SetTexture("_Surface", OvrAvatarComponent.GetLoadedTexture(surfaceTextureID)); break; default: break; } } }
protected void UpdateSkinnedMesh(OvrAvatar avatar, Transform[] bones, ovrAvatarTransform localTransform, ovrAvatarVisibilityFlags visibilityMask, IntPtr renderPart) { // Debug.Log("UpdateSkinnedMesh"); UpdateActive(avatar, visibilityMask); OvrAvatar.ConvertTransform(localTransform, this.transform); ovrAvatarRenderPartType type = CAPI.ovrAvatarRenderPart_GetType(renderPart); UInt64 dirtyJoints; switch (type) { case ovrAvatarRenderPartType.SkinnedMeshRender: dirtyJoints = CAPI.ovrAvatarSkinnedMeshRender_GetDirtyJoints(renderPart); break; case ovrAvatarRenderPartType.SkinnedMeshRenderPBS: dirtyJoints = CAPI.ovrAvatarSkinnedMeshRenderPBS_GetDirtyJoints(renderPart); break; case ovrAvatarRenderPartType.SkinnedMeshRenderPBS_V2: dirtyJoints = CAPI.ovrAvatarSkinnedMeshRenderPBSV2_GetDirtyJoints(renderPart); break; default: throw new Exception("Unhandled render part type: " + type); } for (UInt32 i = 0; i < 64; i++) { UInt64 dirtyMask = (ulong)1 << (int)i; // We need to make sure that we fully update the initial position of // Skinned mesh renderers, then, thereafter, we can only update dirty joints if ((firstSkinnedUpdate && i < bones.Length) || (dirtyMask & dirtyJoints) != 0) { //This joint is dirty and needs to be updated Transform targetBone = bones[i]; ovrAvatarTransform transform; switch (type) { case ovrAvatarRenderPartType.SkinnedMeshRender: transform = CAPI.ovrAvatarSkinnedMeshRender_GetJointTransform(renderPart, i); break; case ovrAvatarRenderPartType.SkinnedMeshRenderPBS: transform = CAPI.ovrAvatarSkinnedMeshRenderPBS_GetJointTransform(renderPart, i); break; case ovrAvatarRenderPartType.SkinnedMeshRenderPBS_V2: transform = CAPI.ovrAvatarSkinnedMeshRenderPBSV2_GetJointTransform(renderPart, i); break; default: throw new Exception("Unhandled render part type: " + type); } OvrAvatar.ConvertTransform(transform, targetBone); } } firstSkinnedUpdate = false; }
private void AddRenderParts( OvrAvatarComponent ovrComponent, ovrAvatarComponent component, Transform parent) { for (UInt32 renderPartIndex = 0; renderPartIndex < component.renderPartCount; renderPartIndex++) { GameObject renderPartObject = new GameObject(); renderPartObject.name = GetRenderPartName(component, renderPartIndex); renderPartObject.transform.SetParent(parent); IntPtr renderPart = GetRenderPart(component, renderPartIndex); ovrAvatarRenderPartType type = CAPI.ovrAvatarRenderPart_GetType(renderPart); OvrAvatarRenderComponent ovrRenderPart; switch (type) { case ovrAvatarRenderPartType.SkinnedMeshRender: ovrRenderPart = AddSkinnedMeshRenderComponent(renderPartObject, CAPI.ovrAvatarRenderPart_GetSkinnedMeshRender(renderPart)); break; case ovrAvatarRenderPartType.SkinnedMeshRenderPBS: ovrRenderPart = AddSkinnedMeshRenderPBSComponent(renderPartObject, CAPI.ovrAvatarRenderPart_GetSkinnedMeshRenderPBS(renderPart)); break; case ovrAvatarRenderPartType.ProjectorRender: ovrRenderPart = AddProjectorRenderComponent(renderPartObject, CAPI.ovrAvatarRenderPart_GetProjectorRender(renderPart)); break; case ovrAvatarRenderPartType.SkinnedMeshRenderPBS_V2: { OvrAvatarMaterialManager materialManager = null; if (ovrComponent.name == "body") { materialManager = DefaultBodyMaterialManager; } else if (ovrComponent.name.Contains("hand")) { materialManager = DefaultHandMaterialManager; } ovrRenderPart = AddSkinnedMeshRenderPBSV2Component( renderPart, renderPartObject, CAPI.ovrAvatarRenderPart_GetSkinnedMeshRenderPBSV2(renderPart), materialManager); } break; default: throw new NotImplementedException(string.Format("Unsupported render part type: {0}", type.ToString())); } ovrComponent.RenderParts.Add(ovrRenderPart); } }
private void AddRenderParts( OvrAvatarComponent ovrComponent, ovrAvatarComponent component, Transform parent) { bool isBody = ovrComponent.name == "body"; bool isLeftController = ovrComponent.name == "controller_left"; bool isReftController = ovrComponent.name == "controller_right"; for (UInt32 renderPartIndex = 0; renderPartIndex < component.renderPartCount; renderPartIndex++) { GameObject renderPartObject = new GameObject(); renderPartObject.name = GetRenderPartName(component, renderPartIndex); renderPartObject.transform.SetParent(parent); renderPartObject.tag = transform.tag; IntPtr renderPart = GetRenderPart(component, renderPartIndex); ovrAvatarRenderPartType type = CAPI.ovrAvatarRenderPart_GetType(renderPart); OvrAvatarRenderComponent ovrRenderPart = null; switch (type) { case ovrAvatarRenderPartType.SkinnedMeshRender: ovrRenderPart = AddSkinnedMeshRenderComponent(renderPartObject, CAPI.ovrAvatarRenderPart_GetSkinnedMeshRender(renderPart)); break; case ovrAvatarRenderPartType.SkinnedMeshRenderPBS: ovrRenderPart = AddSkinnedMeshRenderPBSComponent(renderPartObject, CAPI.ovrAvatarRenderPart_GetSkinnedMeshRenderPBS(renderPart)); break; case ovrAvatarRenderPartType.SkinnedMeshRenderPBS_V2: { ovrRenderPart = AddSkinnedMeshRenderPBSV2Component( renderPart, renderPartObject, CAPI.ovrAvatarRenderPart_GetSkinnedMeshRenderPBSV2(renderPart), isBody && renderPartIndex == 0, isLeftController || isReftController); } break; default: break; } if (ovrRenderPart != null) { if (isBody) { ovrRenderPart.GetComponent <BodyCollider>().owner = this; } ovrComponent.RenderParts.Add(ovrRenderPart); ovrRenderParts.Add(ovrRenderPart); } } }
private void AddRenderParts( OvrAvatarComponent ovrComponent, ovrAvatarComponent component, Transform parent) { bool isBody = ovrComponent.name == "body"; bool isLeftController = ovrComponent.name == "controller_left"; bool isReftController = ovrComponent.name == "controller_right"; for (UInt32 renderPartIndex = 0; renderPartIndex < component.renderPartCount; renderPartIndex++) { GameObject renderPartObject = new GameObject(); renderPartObject.name = GetRenderPartName(component, renderPartIndex); renderPartObject.transform.SetParent(parent); IntPtr renderPart = GetRenderPart(component, renderPartIndex); ovrAvatarRenderPartType type = CAPI.ovrAvatarRenderPart_GetType(renderPart); OvrAvatarRenderComponent ovrRenderPart; switch (type) { case ovrAvatarRenderPartType.SkinnedMeshRender: ovrRenderPart = AddSkinnedMeshRenderComponent(renderPartObject, CAPI.ovrAvatarRenderPart_GetSkinnedMeshRender(renderPart)); break; case ovrAvatarRenderPartType.SkinnedMeshRenderPBS: ovrRenderPart = AddSkinnedMeshRenderPBSComponent(renderPartObject, CAPI.ovrAvatarRenderPart_GetSkinnedMeshRenderPBS(renderPart)); break; case ovrAvatarRenderPartType.ProjectorRender: ovrRenderPart = AddProjectorRenderComponent(renderPartObject, CAPI.ovrAvatarRenderPart_GetProjectorRender(renderPart)); break; case ovrAvatarRenderPartType.SkinnedMeshRenderPBS_V2: { ovrRenderPart = AddSkinnedMeshRenderPBSV2Component( renderPart, renderPartObject, CAPI.ovrAvatarRenderPart_GetSkinnedMeshRenderPBSV2(renderPart), isBody ? DefaultBodyMaterialManager : DefaultHandMaterialManager, isBody && renderPartIndex == 0, isLeftController || isReftController); } break; default: throw new NotImplementedException(string.Format("Unsupported render part type: {0}", type.ToString())); } ovrComponent.RenderParts.Add(ovrRenderPart); } }
private bool AddRenderParts(OvrAvatarComponent ovrComponent, ovrAvatarComponent component, Transform parent) { bool combineMeshes = true; for (UInt32 renderPartIndex = 0; renderPartIndex < component.renderPartCount; renderPartIndex++) { GameObject renderPartObject = new GameObject(); renderPartObject.name = GetRenderPartName(component, renderPartIndex); renderPartObject.transform.SetParent(parent); IntPtr renderPart = GetRenderPart(component, renderPartIndex); ovrAvatarRenderPartType type = CAPI.ovrAvatarRenderPart_GetType(renderPart); OvrAvatarRenderComponent ovrRenderPart; switch (type) { case ovrAvatarRenderPartType.SkinnedMeshRender: ovrRenderPart = AddSkinnedMeshRenderComponent(renderPartObject, CAPI.ovrAvatarRenderPart_GetSkinnedMeshRender(renderPart)); break; case ovrAvatarRenderPartType.SkinnedMeshRenderPBS: ovrRenderPart = AddSkinnedMeshRenderPBSComponent(renderPartObject, CAPI.ovrAvatarRenderPart_GetSkinnedMeshRenderPBS(renderPart)); break; case ovrAvatarRenderPartType.ProjectorRender: combineMeshes = false; ovrRenderPart = AddProjectorRenderComponent(renderPartObject, CAPI.ovrAvatarRenderPart_GetProjectorRender(renderPart)); break; case ovrAvatarRenderPartType.SkinnedMeshRenderPBS_V2: combineMeshes = false; ovrRenderPart = AddSkinnedMeshRenderPBSV2Component(renderPartObject, CAPI.ovrAvatarRenderPart_GetSkinnedMeshRenderPBSV2(renderPart)); break; default: throw new NotImplementedException(string.Format("Unsupported render part type: {0}", type.ToString())); } ovrComponent.RenderParts.Add(ovrRenderPart); } return(combineMeshes); }
private void UpdateAvatarComponent(ovrAvatarComponent component) { OvrAvatarComponent ovrComponent; if (!trackedComponents.TryGetValue(component.name, out ovrComponent)) { throw new Exception( string.Format("trackedComponents didn't have {0}", component.name)); } ConvertTransform(component.transform, ovrComponent.transform); for (UInt32 renderPartIndex = 0; renderPartIndex < component.renderPartCount; renderPartIndex++) { if (ovrComponent.RenderParts.Count <= renderPartIndex) { continue; } OvrAvatarRenderComponent renderComponent = ovrComponent.RenderParts[(int)renderPartIndex]; IntPtr renderPart = GetRenderPart(component, renderPartIndex); ovrAvatarRenderPartType type = Oculus.Avatar.CAPI.ovrAvatarRenderPart_GetType(renderPart); switch (type) { case ovrAvatarRenderPartType.SkinnedMeshRender: ((OvrAvatarSkinnedMeshRenderComponent)renderComponent).UpdateSkinnedMeshRender(this, Oculus.Avatar.CAPI.ovrAvatarRenderPart_GetSkinnedMeshRender(renderPart)); break; case ovrAvatarRenderPartType.SkinnedMeshRenderPBS: ((OvrAvatarSkinnedMeshRenderPBSComponent)renderComponent).UpdateSkinnedMeshRenderPBS(this, Oculus.Avatar.CAPI.ovrAvatarRenderPart_GetSkinnedMeshRenderPBS(renderPart)); break; case ovrAvatarRenderPartType.ProjectorRender: ((OvrAvatarProjectorRenderComponent)renderComponent).UpdateProjectorRender(Oculus.Avatar.CAPI.ovrAvatarRenderPart_GetProjectorRender(renderPart)); break; default: throw new NotImplementedException( string.Format("Unsupported render part type: {0}", type.ToString())); } } }
private void AddRenderParts( OvrAvatarComponent ovrComponent, ovrAvatarComponent component, Transform parent) { for (UInt32 renderPartIndex = 0; renderPartIndex < component.renderPartCount; renderPartIndex++) { GameObject renderPartObject = new GameObject(); renderPartObject.name = GetRenderPartName(component, renderPartIndex); renderPartObject.transform.SetParent(parent); renderPartObject.transform.localPosition = Vector2.zero; renderPartObject.transform.localRotation = Quaternion.identity; IntPtr renderPart = GetRenderPart(component, renderPartIndex); ovrAvatarRenderPartType type = CAPI.ovrAvatarRenderPart_GetType(renderPart); OvrAvatarRenderComponent ovrRenderPart = null; switch (type) { case ovrAvatarRenderPartType.SkinnedMeshRenderPBS: ovrRenderPart = AddSkinnedMeshRenderPBSComponent(renderPartObject, CAPI.ovrAvatarRenderPart_GetSkinnedMeshRenderPBS(renderPart)); break; case ovrAvatarRenderPartType.SkinnedMeshRenderPBS_V2: ovrRenderPart = AddSkinnedMeshRenderPBSV2Component(renderPartObject, CAPI.ovrAvatarRenderPart_GetSkinnedMeshRenderPBSV2(renderPart)); break; default: break; // throw new NotImplementedException(string.Format("Unsupported render part type: {0}", type.ToString())); } if (ovrRenderPart != null) { ovrComponent.RenderParts.Add(ovrRenderPart); RenderParts.Add(ovrRenderPart); } } }
public void UpdateAvatar(ovrAvatarComponent component, OvrAvatar avatar) { OvrAvatar.ConvertTransform(component.transform, transform); for (UInt32 renderPartIndex = 0; renderPartIndex < component.renderPartCount; renderPartIndex++) { if (RenderParts.Count <= renderPartIndex) { break; } OvrAvatarRenderComponent renderComponent = RenderParts[(int)renderPartIndex]; IntPtr renderPart = OvrAvatar.GetRenderPart(component, renderPartIndex); ovrAvatarRenderPartType type = CAPI.ovrAvatarRenderPart_GetType(renderPart); switch (type) { case ovrAvatarRenderPartType.SkinnedMeshRender: ((OvrAvatarSkinnedMeshRenderComponent)renderComponent).UpdateSkinnedMeshRender(this, avatar, renderPart); break; case ovrAvatarRenderPartType.SkinnedMeshRenderPBS: ((OvrAvatarSkinnedMeshRenderPBSComponent)renderComponent).UpdateSkinnedMeshRenderPBS(avatar, renderPart, renderComponent.mesh.sharedMaterial); break; case ovrAvatarRenderPartType.ProjectorRender: ((OvrAvatarProjectorRenderComponent)renderComponent).UpdateProjectorRender(this, CAPI.ovrAvatarRenderPart_GetProjectorRender(renderPart)); break; case ovrAvatarRenderPartType.SkinnedMeshRenderPBS_V2: ((OvrAvatarSkinnedMeshPBSV2RenderComponent)renderComponent).UpdateSkinnedMeshRender(this, avatar, renderPart); break; default: break; } } }
public void UpdateAvatar(ovrAvatarComponent component, OvrAvatar avatar) { if (IsCombiningMeshes) { if (!IsVertexDataUpdating) { CombineMeshes(component); IsCombiningMeshes = false; ThreadData = null; } return; } OvrAvatar.ConvertTransform(component.transform, transform); for (UInt32 renderPartIndex = 0; renderPartIndex < component.renderPartCount; renderPartIndex++) { if (RenderParts.Count <= renderPartIndex) { break; } OvrAvatarRenderComponent renderComponent = RenderParts[(int)renderPartIndex]; IntPtr renderPart = OvrAvatar.GetRenderPart(component, renderPartIndex); ovrAvatarRenderPartType type = CAPI.ovrAvatarRenderPart_GetType(renderPart); switch (type) { case ovrAvatarRenderPartType.SkinnedMeshRender: ((OvrAvatarSkinnedMeshRenderComponent)renderComponent).UpdateSkinnedMeshRender(this, avatar, renderPart); break; case ovrAvatarRenderPartType.SkinnedMeshRenderPBS: var material = RootMeshComponent != null ? RootMeshComponent.sharedMaterial : renderComponent.mesh.sharedMaterial; ((OvrAvatarSkinnedMeshRenderPBSComponent)renderComponent).UpdateSkinnedMeshRenderPBS(avatar, renderPart, material); break; case ovrAvatarRenderPartType.ProjectorRender: ((OvrAvatarProjectorRenderComponent)renderComponent).UpdateProjectorRender(this, CAPI.ovrAvatarRenderPart_GetProjectorRender(renderPart)); break; case ovrAvatarRenderPartType.SkinnedMeshRenderPBS_V2: ((OvrAvatarSkinnedMeshPBSV2RenderComponent)renderComponent).UpdateSkinnedMeshRender(this, avatar, renderPart); break; default: break; } } // The mesh has been combined and therefore update the combined mesh "components" if (RootMeshComponent != null) { var part_zero = OvrAvatar.GetRenderPart(component, 0); ovrAvatarRenderPartType typeZero = CAPI.ovrAvatarRenderPart_GetType(part_zero); switch (typeZero) { case ovrAvatarRenderPartType.SkinnedMeshRender: UpdateActive(avatar, CAPI.ovrAvatarSkinnedMeshRender_GetVisibilityMask(part_zero)); bool changedMaterial = (FirstMaterialUpdate && gameObject.activeSelf) || CAPI.ovrAvatarSkinnedMeshRender_MaterialStateChanged(part_zero); if (changedMaterial) { FirstMaterialUpdate = false; ovrAvatarMaterialState materialState = CAPI.ovrAvatarSkinnedMeshRender_GetMaterialState(part_zero); UpdateAvatarMaterial(RootMeshComponent.sharedMaterial, materialState); } break; case ovrAvatarRenderPartType.SkinnedMeshRenderPBS: UpdateActive(avatar, CAPI.ovrAvatarSkinnedMeshRenderPBS_GetVisibilityMask(part_zero)); break; case ovrAvatarRenderPartType.ProjectorRender: default: break; } } DebugDrawTransforms(); }
private void UpdateAvatarComponent(IntPtr nativeComponent) { ovrAvatarComponent nativeAvatarComponent = new ovrAvatarComponent(); CAPI.ovrAvatarComponent_Get(nativeComponent, false, ref nativeAvatarComponent); ConvertTransform(nativeAvatarComponent.transform, transform); for (UInt32 renderPartIndex = 0; renderPartIndex < nativeAvatarComponent.renderPartCount; renderPartIndex++) { if (RenderParts.Count <= renderPartIndex) { break; } OvrAvatarRenderComponent renderComponent = RenderParts[(int)renderPartIndex]; IntPtr renderPart = OvrAvatar.GetRenderPart(nativeAvatarComponent, renderPartIndex); ovrAvatarRenderPartType type = CAPI.ovrAvatarRenderPart_GetType(renderPart); ovrAvatarTransform localTransform; ovrAvatarVisibilityFlags visibilityMask; var mesh = renderComponent.mesh; var bones = renderComponent.bones; switch (type) { case ovrAvatarRenderPartType.SkinnedMeshRenderPBS: visibilityMask = CAPI.ovrAvatarSkinnedMeshRenderPBS_GetVisibilityMask(renderPart); localTransform = CAPI.ovrAvatarSkinnedMeshRenderPBS_GetTransform(renderPart); if ((visibilityMask & ovrAvatarVisibilityFlags.FirstPerson) != 0) { renderComponent.gameObject.SetActive(true); mesh.enabled = true; } UpdateSkinnedMesh(localTransform, renderPart, bones); UInt64 albedoTextureID = CAPI.ovrAvatarSkinnedMeshRenderPBS_GetAlbedoTextureAssetID(renderPart); UInt64 surfaceTextureID = CAPI.ovrAvatarSkinnedMeshRenderPBS_GetSurfaceTextureAssetID(renderPart); mesh.sharedMaterial.SetTexture("_Albedo", OvrAvatarComponent.GetLoadedTexture(albedoTextureID)); mesh.sharedMaterial.SetTexture("_Surface", OvrAvatarComponent.GetLoadedTexture(surfaceTextureID)); break; case ovrAvatarRenderPartType.SkinnedMeshRenderPBS_V2: visibilityMask = CAPI.ovrAvatarSkinnedMeshRenderPBSV2_GetVisibilityMask(renderPart); localTransform = CAPI.ovrAvatarSkinnedMeshRenderPBSV2_GetTransform(renderPart); if ((visibilityMask & ovrAvatarVisibilityFlags.FirstPerson) != 0) { renderComponent.gameObject.SetActive(true); mesh.enabled = true; } UpdateSkinnedMesh(localTransform, renderPart, bones); ovrAvatarPBSMaterialState materialState = CAPI.ovrAvatarSkinnedMeshRenderPBSV2_GetPBSMaterialState(renderPart); Texture2D diffuseTexture = OvrAvatarComponent.GetLoadedTexture(materialState.albedoTextureID); Texture2D normalTexture = OvrAvatarComponent.GetLoadedTexture(materialState.normalTextureID); Texture2D metallicTexture = OvrAvatarComponent.GetLoadedTexture(materialState.metallicnessTextureID); mesh.materials[0].SetTexture("_MainTex", diffuseTexture); mesh.materials[0].SetTexture("_NormalMap", normalTexture); mesh.materials[0].SetTexture("_RoughnessMap", metallicTexture); break; default: break; } } }