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++;
            }
        }
示例#2
0
        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;
                }
            }
        }
示例#3
0
        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;
                }
            }
        }