internal void Initialize( IntPtr renderPart, ovrAvatarRenderPart_SkinnedMeshRenderPBS_V2 skinnedMeshRender, OvrAvatarMaterialManager materialManager, int thirdPersonLayer, int firstPersonLayer, bool combinedMesh, ovrAvatarAssetLevelOfDetail lod, bool assignExpressiveParams, OvrAvatar avatar, bool isControllerModel) { avatarMaterialManager = materialManager; isCombinedMaterial = combinedMesh; mesh = CreateSkinnedMesh( skinnedMeshRender.meshAssetID, skinnedMeshRender.visibilityMask, thirdPersonLayer, firstPersonLayer); EnableExpressive = assignExpressiveParams; #if UNITY_ANDROID var singleComponentShader = EnableExpressive ? avatar.Skinshaded_Expressive_VertFrag_SingleComponent : avatar.Skinshaded_VertFrag_SingleComponent; #else var singleComponentShader = EnableExpressive ? avatar.Skinshaded_Expressive_SurfaceShader_SingleComponent : avatar.Skinshaded_SurfaceShader_SingleComponent; #endif var combinedComponentShader = EnableExpressive ? avatar.Skinshaded_Expressive_VertFrag_CombinedMesh : avatar.Skinshaded_VertFrag_CombinedMesh; var mainShader = isCombinedMaterial ? combinedComponentShader : singleComponentShader; if (isControllerModel) { mainShader = avatar.ControllerShader; } AvatarLogger.Log("OvrAvatarSkinnedMeshPBSV2RenderComponent Shader is: " + mainShader != null ? mainShader.name : "null"); if (EnableExpressive) { ExpressiveParameters = CAPI.ovrAvatar_GetExpressiveParameters(avatar.sdkAvatar); var eyeShader = avatar.EyeLens; Material[] matArray = new Material[2]; matArray[0] = CreateAvatarMaterial(gameObject.name + MAIN_MATERIAL_NAME, mainShader); matArray[1] = CreateAvatarMaterial(gameObject.name + EYE_MATERIAL_NAME, eyeShader); if (avatar.UseTransparentRenderQueue) { SetMaterialTransparent(matArray[0]); } else { SetMaterialOpaque(matArray[0]); } // Eye lens shader queue is transparent and set from shader matArray[1].renderQueue = -1; mesh.materials = matArray; } else { mesh.sharedMaterial = CreateAvatarMaterial(gameObject.name + DEFAULT_MATERIAL_NAME, mainShader); if (avatar.UseTransparentRenderQueue && !isControllerModel) { SetMaterialTransparent(mesh.sharedMaterial); } else { SetMaterialOpaque(mesh.sharedMaterial); } } bones = mesh.bones; if (isCombinedMaterial) { avatarMaterialManager.SetRenderer(mesh); InitializeCombinedMaterial(renderPart, (int)lod); avatarMaterialManager.OnCombinedMeshReady(); } blendShapeParams = new ovrAvatarBlendShapeParams(); blendShapeParams.blendShapeParamCount = 0; blendShapeParams.blendShapeParams = new float[64]; blendShapeCount = mesh.sharedMesh.blendShapeCount; }
protected void UpdateSkinnedMesh(OvrAvatar avatar, Transform[] bones, ovrAvatarTransform localTransform, ovrAvatarVisibilityFlags visibilityMask, IntPtr renderPart) { 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); } } ovrAvatarBlendShapeParams blendParams = CAPI.ovrAvatarSkinnedMeshRender_GetBlendShapeParams(renderPart); for (uint i = 0; i < blendParams.blendShapeParamCount; i++) { float value = blendParams.blendShapeParams[i]; mesh.SetBlendShapeWeight((int)i, value * 100.0f); } firstSkinnedUpdate = false; }