/// <summary> /// Updates the UMA mesh and skeleton to match current slots. /// </summary> /// <param name="updatedAtlas">If set to <c>true</c> atlas has changed.</param> /// <param name="umaData">UMA data.</param> /// <param name="atlasResolution">Atlas resolution.</param> public override void UpdateUMAMesh(bool updatedAtlas, UMAData umaData, int atlasResolution) { this.umaData = umaData; this.atlasResolution = atlasResolution; combinedMeshList = new List<SkinnedMeshCombiner.CombineInstance>(); combinedMaterialList = new List<Material>(); BuildCombineInstances(); EnsureUMADataSetup(umaData); umaData.skeleton.BeginSkeletonUpdate(); UMAMeshData umaMesh = new UMAMeshData(); umaMesh.ClaimSharedBuffers(); SkinnedMeshCombiner.CombineMeshes(umaMesh, combinedMeshList.ToArray()); if (updatedAtlas) { RecalculateUV(umaMesh); } umaMesh.ApplyDataToUnityMesh(umaData.myRenderer, umaData.skeleton); umaMesh.ReleaseSharedBuffers(); umaData.umaRecipe.ClearDNAConverters(); for (int i = 0; i < umaData.umaRecipe.slotDataList.Length; i++) { SlotData slotData = umaData.umaRecipe.slotDataList[i]; if (slotData != null) { // umaData.EnsureBoneData(slotData.umaBoneData, slotData.animatedBones, boneMap); umaData.umaRecipe.AddDNAUpdater(slotData.asset.slotDNA); } } umaData.myRenderer.quality = SkinQuality.Bone4; //umaData.myRenderer.useLightProbes = true; var materials = combinedMaterialList.ToArray(); umaData.myRenderer.sharedMaterials = materials; //umaData.myRenderer.sharedMesh.RecalculateBounds(); umaData.myRenderer.sharedMesh.name = "UMAMesh"; umaData.firstBake = false; //FireSlotAtlasNotification(umaData, materials); }
public void UpdateMeshData(SkinnedMeshRenderer meshRenderer) { meshData = new UMAMeshData(); meshData.RetrieveDataFromUnityMesh(meshRenderer); UnityEditor.EditorUtility.SetDirty(this); }
protected void RecalculateUV(UMAMeshData umaMesh) { int idx = 0; //Handle Atlassed Verts for (int materialIndex = 0; materialIndex < umaData.generatedMaterials.materials.Count; materialIndex++) { var generatedMaterial = umaData.generatedMaterials.materials[materialIndex]; if (generatedMaterial.umaMaterial.materialType != UMAMaterial.MaterialType.Atlas) continue; for (int materialDefinitionIndex = 0; materialDefinitionIndex < generatedMaterial.materialFragments.Count; materialDefinitionIndex++) { var fragment = generatedMaterial.materialFragments[materialDefinitionIndex]; var tempAtlasRect = fragment.atlasRegion; int vertexCount = fragment.slotData.asset.meshData.vertices.Length; float atlasXMin = tempAtlasRect.xMin / atlasResolution; float atlasXMax = tempAtlasRect.xMax / atlasResolution; float atlasXRange = atlasXMax - atlasXMin; float atlasYMin = tempAtlasRect.yMin / atlasResolution; float atlasYMax = tempAtlasRect.yMax / atlasResolution; float atlasYRange = atlasYMax - atlasYMin; while (vertexCount-- > 0) { umaMesh.uv[idx].x = atlasXMin + atlasXRange * umaMesh.uv[idx].x; umaMesh.uv[idx].y = atlasYMin + atlasYRange * umaMesh.uv[idx].y; idx++; } } } }