protected void BuildCombineInstances() { SkinnedMeshCombiner.CombineInstance combineInstance; //Since BuildCombineInstances is called within a renderer loop, use a variable to keep track of the materialIndex per renderer int rendererMaterialIndex = 0; for (int materialIndex = 0; materialIndex < umaData.generatedMaterials.materials.Count; materialIndex++) { UMARendererAsset rendererAsset = umaData.GetRendererAsset(currentRendererIndex); var generatedMaterial = umaData.generatedMaterials.materials[materialIndex]; if (generatedMaterial.rendererAsset != rendererAsset) { continue; } combinedMaterialList.Add(generatedMaterial); generatedMaterial.materialIndex = materialIndex; for (int materialDefinitionIndex = 0; materialDefinitionIndex < generatedMaterial.materialFragments.Count; materialDefinitionIndex++) { var materialDefinition = generatedMaterial.materialFragments[materialDefinitionIndex]; var slotData = materialDefinition.slotData; combineInstance = new SkinnedMeshCombiner.CombineInstance(); combineInstance.meshData = slotData.asset.meshData; //New MeshHiding if (slotData.meshHideMask != null) { combineInstance.triangleMask = slotData.meshHideMask; } combineInstance.targetSubmeshIndices = new int[combineInstance.meshData.subMeshCount]; for (int i = 0; i < combineInstance.meshData.subMeshCount; i++) { combineInstance.targetSubmeshIndices[i] = -1; } combineInstance.targetSubmeshIndices[slotData.asset.subMeshIndex] = rendererMaterialIndex; combinedMeshList.Add(combineInstance); if (slotData.asset.SlotAtlassed != null) { slotData.asset.SlotAtlassed.Invoke(umaData, slotData, generatedMaterial.material, materialDefinition.atlasRegion); } if (rendererAsset != null && rendererAsset.ClothProperties != null) { clothProperties = rendererAsset.ClothProperties; } } rendererMaterialIndex++; } }
protected override IEnumerator workerMethod() { umaData.generatedMaterials.rendererAssets = uniqueRenderers; umaData.generatedMaterials.materials = generatedMaterials; GenerateAtlasData(); OptimizeAtlas(); textureProcessCoroutine.Prepare(umaData, umaGenerator); yield return(textureProcessCoroutine); CleanBackUpTextures(); UpdateUV(); // HACK - is this the right place? SlotData[] slots = umaData.umaRecipe.slotDataList; for (int i = 0; i < slots.Length; i++) { var slot = slots[i]; if (slot == null) { continue; } #if (UNITY_STANDALONE || UNITY_IOS || UNITY_ANDROID || UNITY_PS4 || UNITY_XBOXONE) && !UNITY_2017_3_OR_NEWER //supported platforms for procedural materials for (int j = 1; j < slot.OverlayCount; j++) { OverlayData overlay = slot.GetOverlay(j); if ((overlay != null) && (overlay.isProcedural)) { overlay.ReleaseProceduralTextures(); } } #endif } if (updateMaterialList) { for (int j = 0; j < umaData.rendererCount; j++) { var renderer = umaData.GetRenderer(j); var mats = renderer.sharedMaterials; var newMats = new Material[mats.Length]; var atlasses = umaData.generatedMaterials.materials; int materialIndex = 0; for (int i = 0; i < atlasses.Count; i++) { if (atlasses[i].rendererAsset == umaData.GetRendererAsset(j)) { UMAUtils.DestroySceneObject(mats[materialIndex]); newMats[materialIndex] = atlasses[i].material; materialIndex++; } } renderer.sharedMaterials = newMats; } } }
public void ProcessTexture(UMAGeneratorBase _umaGenerator, UMAData _umaData, bool updateMaterialList, int InitialScaleFactor) { umaGenerator = _umaGenerator; umaData = _umaData; this.updateMaterialList = updateMaterialList; scaleFactor = InitialScaleFactor; textureProcesser = new TextureProcessPRO(); Start(); umaData.generatedMaterials.rendererAssets = uniqueRenderers; umaData.generatedMaterials.materials = generatedMaterials; GenerateAtlasData(); OptimizeAtlas(); textureProcesser.ProcessTexture(_umaData, _umaGenerator); CleanBackUpTextures(); UpdateUV(); // Procedural textures were done here if (updateMaterialList) { for (int j = 0; j < umaData.rendererCount; j++) { var renderer = umaData.GetRenderer(j); var mats = renderer.sharedMaterials; var newMats = new Material[mats.Length]; var atlasses = umaData.generatedMaterials.materials; int materialIndex = 0; for (int i = 0; i < atlasses.Count; i++) { if (atlasses[i].rendererAsset == umaData.GetRendererAsset(j)) { UMAUtils.DestroySceneObject(mats[materialIndex]); newMats[materialIndex] = atlasses[i].material; atlasses[i].skinnedMeshRenderer = renderer; atlasses[i].materialIndex = materialIndex; materialIndex++; } } renderer.sharedMaterials = newMats; } } }
protected override IEnumerator workerMethod() { umaData.generatedMaterials.rendererAssets = uniqueRenderers; umaData.generatedMaterials.materials = generatedMaterials; GenerateAtlasData(); OptimizeAtlas(); textureProcessCoroutine.Prepare(umaData, umaGenerator); yield return(textureProcessCoroutine); CleanBackUpTextures(); UpdateUV(); // Procedural textures were done here if (updateMaterialList) { for (int j = 0; j < umaData.rendererCount; j++) { var renderer = umaData.GetRenderer(j); var mats = renderer.sharedMaterials; var newMats = new Material[mats.Length]; var atlasses = umaData.generatedMaterials.materials; int materialIndex = 0; for (int i = 0; i < atlasses.Count; i++) { if (atlasses[i].rendererAsset == umaData.GetRendererAsset(j)) { UMAUtils.DestroySceneObject(mats[materialIndex]); newMats[materialIndex] = atlasses[i].material; atlasses[i].skinnedMeshRenderer = renderer; atlasses[i].materialIndex = materialIndex; materialIndex++; } } renderer.sharedMaterials = newMats; } } }