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; } } }
/// <summary> /// Searchs for the right handeness hand in the Avatar if available. /// </summary> private void FindHand() { if (_avatarHandComponent == null) { OvrAvatarHand avatarHand = handeness == Handeness.Right ? avatar.HandRight : avatar.HandLeft; _avatarHandComponent = avatarHand?.RenderParts[0]; } }
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 OvrAvatarProjectorRenderComponent AddProjectorRenderComponent(GameObject gameObject, ovrAvatarRenderPart_ProjectorRender projectorRender) { ovrAvatarComponent component = CAPI.ovrAvatarComponent_Get(sdkAvatar, projectorRender.componentIndex); OvrAvatarComponent ovrComponent; if (trackedComponents.TryGetValue(component.name, out ovrComponent)) { if (projectorRender.renderPartIndex < ovrComponent.RenderParts.Count) { OvrAvatarRenderComponent targetRenderPart = ovrComponent.RenderParts[(int)projectorRender.renderPartIndex]; OvrAvatarProjectorRenderComponent projectorComponent = gameObject.AddComponent <OvrAvatarProjectorRenderComponent>(); projectorComponent.InitializeProjectorRender(projectorRender, SurfaceShader, targetRenderPart); return(projectorComponent); } } return(null); }
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; } } }
internal void InitializeProjectorRender(ovrAvatarRenderPart_ProjectorRender render, Shader shader, OvrAvatarRenderComponent target) { if (shader == null) { shader = Shader.Find("OvrAvatar/AvatarSurfaceShader"); } material = CreateAvatarMaterial(gameObject.name + "_projector", shader); material.EnableKeyword("PROJECTOR_ON"); Renderer renderer = target.GetComponent <Renderer>(); if (renderer != null) { List <Material> materials = new List <Material>(renderer.sharedMaterials); materials.Add(material); renderer.sharedMaterials = materials.ToArray(); } }
internal void InitializeProjectorRender(ovrAvatarRenderPart_ProjectorRender render, OvrAvatarRenderComponent target) { material = CreateAvatarMaterial(gameObject.name + "_projector", physicallyBasedShader: false, selfOccluding: false); material.EnableKeyword("PROJECTOR_ON"); Renderer renderer = target.GetComponent <Renderer>(); if (renderer != null) { List <Material> materials = new List <Material>(renderer.sharedMaterials); materials.Add(material); renderer.sharedMaterials = materials.ToArray(); } }