private void GenerateAtlasData()
    {
        for (int i = 0; i < orderedMaterialDefinition.Length; i++)
        {
            atlasMaterialDefinitionList = new List <DKUMAData.AtlasMaterialDefinition>();
            DKUMAData.AtlasElement            atlasElement = new DKUMAData.AtlasElement();
            DKUMAData.AtlasMaterialDefinition tempAtlasMaterialDefinition = new DKUMAData.AtlasMaterialDefinition();

            //This guarantee not including on atlas duplicated textures
            if (orderedMaterialDefinition[i] != null)
            {
                tempAtlasMaterialDefinition.source = orderedMaterialDefinition[i];
                atlasMaterialDefinitionList.Add(tempAtlasMaterialDefinition);

                for (int i2 = i; i2 < orderedMaterialDefinition.Length; i2++)
                {
                    //Look for same shader

                    if (orderedMaterialDefinition[i2] != null)
                    {
                        if (i2 != i)
                        {
                            tempAtlasMaterialDefinition = new DKUMAData.AtlasMaterialDefinition();
                            try {
                                if (orderedMaterialDefinition[i].materialSample.shader == orderedMaterialDefinition[i2].materialSample.shader)
                                {
                                    tempAtlasMaterialDefinition.source = orderedMaterialDefinition[i2];
                                    atlasMaterialDefinitionList.Add(tempAtlasMaterialDefinition);
                                    orderedMaterialDefinition[i2] = null;
                                }
                            }
                            catch (MissingReferenceException e) { Debug.LogError(umaGenerator.umaData.name + " : " + e); }
                        }
                    }

                    if (i2 == orderedMaterialDefinition.Length - 1 && atlasMaterialDefinitionList.Count > 0)
                    {
                        //All slots sharing same shader are on same atlasElement
                        atlasElement.atlasMaterialDefinitions = atlasMaterialDefinitionList;
                        atlasElement.shader         = atlasMaterialDefinitionList[0].source.materialSample.shader;
                        atlasElement.materialSample = atlasMaterialDefinitionList[0].source.materialSample;

                        umaGenerator.umaData.atlasList.atlas.Add(atlasElement);
                    }
                }

                orderedMaterialDefinition[i] = null;
            }
        }
    }
    protected override IEnumerator workerMethod()
    {
        for (int atlasIndex = 0; atlasIndex < umaData.atlasList.atlas.Count; atlasIndex++)
        {
            resultingTextures    = new Texture2D[umaGenerator.textureNameList.Length];
            destinationColorList = new Color32[Mathf.FloorToInt(umaData.atlasList.atlas[atlasIndex].cropResolution.x * umaData.atlasList.atlas[atlasIndex].cropResolution.y)];
            Rect nullRect = new Rect(0, 0, 0, 0);

            for (int textureType = 0; textureType < umaGenerator.textureNameList.Length; textureType++)
            {
                if (umaData.atlasList.atlas[atlasIndex].atlasMaterialDefinitions[0].source.materialSample.HasProperty(umaGenerator.textureNameList[textureType]))
                {
                    for (int i = 0; i < umaData.atlasList.atlas[atlasIndex].atlasMaterialDefinitions.Count; i++)
                    {
                        DKUMAData.AtlasMaterialDefinition atlasElement = umaData.atlasList.atlas[atlasIndex].atlasMaterialDefinitions[i];
                        resolutionScale = umaData.atlasList.atlas[atlasIndex].resolutionScale * umaData.atlasList.atlas[atlasIndex].atlasMaterialDefinitions[i].source.slotData.overlayScale;

                        if (umaData.atlasList.atlas[atlasIndex].atlasMaterialDefinitions[i].source.slotData.overlayScale != 1.0f)
                        {
                            mipmapScale = Mathf.FloorToInt(Mathf.Log(1 / (resolutionScale), 2));
                        }
                        else
                        {
                            mipmapScale = umaData.atlasList.atlas[atlasIndex].mipmap;
                        }

                        if (!atlasElement.isRectShared)
                        {
                            Color32[] baseColorList = atlasElement.source.baseTexture[textureType].GetPixels32(mipmapScale);
                            Color32   baseColor     = atlasElement.source.GetMultiplier(0, textureType);
                            Color32   additiveColor = atlasElement.source.GetAdditive(0, textureType);

                            if (baseColor.Equals(new Color32(255, 255, 255, 255)))
                            {
                                if (additiveColor.Equals(new Color32(0, 0, 0, 0)))
                                {
                                    copyTextureRectCoroutine.Prepare(destinationColorList, baseColorList, atlasElement.atlasRegion, umaData.atlasList.atlas[atlasIndex].cropResolution,
                                                                     new Vector2(atlasElement.source.baseTexture[textureType].width * resolutionScale, atlasElement.source.baseTexture[textureType].height * resolutionScale), _DKumaGenerator.maxPixels);

                                    yield return(copyTextureRectCoroutine);
                                }
                                else
                                {
                                    copyAdditiveTextureRectCoroutine.Prepare(destinationColorList, baseColorList, additiveColor, atlasElement.atlasRegion, umaData.atlasList.atlas[atlasIndex].cropResolution,
                                                                             new Vector2(atlasElement.source.baseTexture[textureType].width * resolutionScale, atlasElement.source.baseTexture[textureType].height * resolutionScale), _DKumaGenerator.maxPixels);

                                    yield return(copyTextureRectCoroutine);
                                }
                            }
                            else
                            {
                                if (additiveColor.Equals(new Color32(0, 0, 0, 0)))
                                {
                                    copyColorizedTextureRectCoroutine.Prepare(destinationColorList, baseColorList, baseColorList, baseColor, atlasElement.atlasRegion, umaData.atlasList.atlas[atlasIndex].cropResolution,
                                                                              new Vector2(atlasElement.source.baseTexture[0].width * resolutionScale, atlasElement.source.baseTexture[0].height * resolutionScale), _DKumaGenerator.maxPixels);

                                    yield return(copyColorizedTextureRectCoroutine);
                                }
                                else
                                {
                                    copyColorizedAdditiveTextureRectCoroutine.Prepare(destinationColorList, baseColorList, baseColorList, baseColor, additiveColor, atlasElement.atlasRegion, umaData.atlasList.atlas[atlasIndex].cropResolution,
                                                                                      new Vector2(atlasElement.source.baseTexture[0].width * resolutionScale, atlasElement.source.baseTexture[0].height * resolutionScale), _DKumaGenerator.maxPixels);

                                    yield return(copyColorizedAdditiveTextureRectCoroutine);
                                }
                            }



                            for (int i2 = 0; i2 < atlasElement.source.overlays.Length; i2++)
                            {
                                //Change baseColorList based on overlays


                                baseColor     = atlasElement.source.GetMultiplier(i2 + 1, textureType);
                                additiveColor = atlasElement.source.GetAdditive(i2 + 1, textureType);

                                Color32[] overlayColorList = atlasElement.source.overlays[i2].textureList[textureType].GetPixels32(mipmapScale);
                                Color32[] maskColorList    = atlasElement.source.overlays[i2].textureList[0].GetPixels32(mipmapScale);

                                Rect insertRect;
                                if (atlasElement.source.rects[i2] != nullRect)
                                {
                                    insertRect = new Rect(Mathf.FloorToInt(atlasElement.atlasRegion.x + atlasElement.source.rects[i2].x * resolutionScale), Mathf.FloorToInt(atlasElement.atlasRegion.y + atlasElement.source.rects[i2].y * resolutionScale), Mathf.FloorToInt(atlasElement.source.rects[i2].width * resolutionScale), Mathf.FloorToInt(atlasElement.source.rects[i2].height * resolutionScale));
                                }
                                else
                                {
                                    insertRect = atlasElement.atlasRegion;
                                }

                                if (baseColor.Equals(new Color32(255, 255, 255, 255)))
                                {
                                    if (additiveColor.Equals(new Color32(0, 0, 0, 0)))
                                    {
                                        blendTextureRectCoroutine.Prepare(destinationColorList, overlayColorList, maskColorList, insertRect, umaData.atlasList.atlas[atlasIndex].cropResolution,
                                                                          new Vector2(atlasElement.source.overlays[i2].textureList[textureType].width * resolutionScale, atlasElement.source.overlays[i2].textureList[textureType].height * resolutionScale), _DKumaGenerator.maxPixels);

                                        yield return(null);                                        //Because we are using an GetPixels32 above

                                        yield return(blendTextureRectCoroutine);
                                    }
                                    else
                                    {
                                        blendAdditiveTextureRectCoroutine.Prepare(destinationColorList, overlayColorList, maskColorList, additiveColor, insertRect, umaData.atlasList.atlas[atlasIndex].cropResolution,
                                                                                  new Vector2(atlasElement.source.overlays[i2].textureList[textureType].width * resolutionScale, atlasElement.source.overlays[i2].textureList[textureType].height * resolutionScale), _DKumaGenerator.maxPixels);

                                        yield return(null);                                        //Because we are using an GetPixels32 above

                                        yield return(blendAdditiveTextureRectCoroutine);
                                    }
                                }
                                else
                                {
                                    if (additiveColor.Equals(new Color32(0, 0, 0, 0)))
                                    {
                                        colorizeTextureRectCoroutine.Prepare(destinationColorList, overlayColorList, maskColorList, baseColor, insertRect, umaData.atlasList.atlas[atlasIndex].cropResolution,
                                                                             new Vector2(atlasElement.source.overlays[i2].textureList[textureType].width * resolutionScale, atlasElement.source.overlays[i2].textureList[textureType].height * resolutionScale), _DKumaGenerator.maxPixels);

                                        yield return(null);                                        //Because we are using an GetPixels32 above

                                        yield return(colorizeTextureRectCoroutine);
                                    }
                                    else
                                    {
                                        colorizeAdditiveTextureRectCoroutine.Prepare(destinationColorList, overlayColorList, maskColorList, baseColor, additiveColor, insertRect, umaData.atlasList.atlas[atlasIndex].cropResolution,
                                                                                     new Vector2(atlasElement.source.overlays[i2].textureList[textureType].width * resolutionScale, atlasElement.source.overlays[i2].textureList[textureType].height * resolutionScale), _DKumaGenerator.maxPixels);


                                        yield return(null);                                        //Because we are using an GetPixels32 above

                                        yield return(colorizeAdditiveTextureRectCoroutine);
                                    }
                                }
                            }
                        }
                    }
                    resultingTextures[textureType] = new Texture2D(Mathf.FloorToInt(umaData.atlasList.atlas[atlasIndex].cropResolution.x), Mathf.FloorToInt(umaData.atlasList.atlas[atlasIndex].cropResolution.y), TextureFormat.ARGB32, true);
                    yield return(null);

                    resultingTextures[textureType].SetPixels32(destinationColorList);
                    yield return(null);

                    resultingTextures[textureType].Apply();
                    yield return(null);
                }
            }


            umaData.atlasList.atlas[atlasIndex].resultingAtlasList  = resultingTextures;
            umaData.atlasList.atlas[atlasIndex].materialSample      = UnityEngine.Object.Instantiate(umaData.atlasList.atlas[atlasIndex].atlasMaterialDefinitions[0].source.materialSample) as Material;
            umaData.atlasList.atlas[atlasIndex].materialSample.name = umaData.atlasList.atlas[atlasIndex].atlasMaterialDefinitions[0].source.materialSample.name;
            for (int finalTextureType = 0; finalTextureType < umaGenerator.textureNameList.Length; finalTextureType++)
            {
                if (umaData.atlasList.atlas[atlasIndex].materialSample.HasProperty(umaGenerator.textureNameList[finalTextureType]))
                {
                    umaData.atlasList.atlas[atlasIndex].materialSample.SetTexture(umaGenerator.textureNameList[finalTextureType], resultingTextures[finalTextureType]);
                }
            }
        }
    }
    private void CalculateRects()
    {
        Rect nullRect = new Rect(0, 0, 0, 0);

        DKUMAData.AtlasList umaAtlasList = umaGenerator.umaData.atlasList;


        for (int atlasIndex = 0; atlasIndex < umaAtlasList.atlas.Count; atlasIndex++)
        {
            umaAtlasList.atlas[atlasIndex].cropResolution  = new Vector2(_DKumaGenerator.atlasResolution, _DKumaGenerator.atlasResolution);
            umaAtlasList.atlas[atlasIndex].resolutionScale = atlasResolutionScale;
            umaAtlasList.atlas[atlasIndex].mipmap          = mipMapAdjust;
            packTexture.Init(_DKumaGenerator.atlasResolution, _DKumaGenerator.atlasResolution, false);
            bool textureFit = true;

            for (int atlasElementIndex = 0; atlasElementIndex < umaAtlasList.atlas[atlasIndex].atlasMaterialDefinitions.Count; atlasElementIndex++)
            {
                DKUMAData.AtlasMaterialDefinition tempMaterialDef = umaAtlasList.atlas[atlasIndex].atlasMaterialDefinitions[atlasElementIndex];

                if (tempMaterialDef.atlasRegion == nullRect)
                {
                    tempMaterialDef.atlasRegion           = packTexture.Insert(Mathf.FloorToInt(tempMaterialDef.source.baseTexture[0].width * umaAtlasList.atlas[atlasIndex].resolutionScale * tempMaterialDef.source.slotData.overlayScale), Mathf.FloorToInt(tempMaterialDef.source.baseTexture[0].height * umaAtlasList.atlas[atlasIndex].resolutionScale * tempMaterialDef.source.slotData.overlayScale), MaxRectsBinPack.FreeRectChoiceHeuristic.RectBestLongSideFit);
                    tempMaterialDef.isRectShared          = false;
                    umaAtlasList.atlas[atlasIndex].shader = tempMaterialDef.source.materialSample.shader;

                    if (tempMaterialDef.atlasRegion == nullRect)
                    {
                        textureFit = false;

                        if (_DKumaGenerator.fitAtlas)
                        {
                            Debug.LogWarning("Atlas resolution is too small, Textures will be reduced.");
                        }
                        else
                        {
                            Debug.LogError("Atlas resolution is too small, not all textures will fit.");
                        }
                    }

                    for (int atlasElementIndex2 = atlasElementIndex; atlasElementIndex2 < umaAtlasList.atlas[atlasIndex].atlasMaterialDefinitions.Count; atlasElementIndex2++)
                    {
                        if (atlasElementIndex != atlasElementIndex2)
                        {
                            if (tempMaterialDef.source.baseTexture[0] == umaAtlasList.atlas[atlasIndex].atlasMaterialDefinitions[atlasElementIndex2].source.baseTexture[0])
                            {
                                umaAtlasList.atlas[atlasIndex].atlasMaterialDefinitions[atlasElementIndex2].atlasRegion  = tempMaterialDef.atlasRegion;
                                umaAtlasList.atlas[atlasIndex].atlasMaterialDefinitions[atlasElementIndex2].isRectShared = true;
                            }
                        }
                    }
                }

                if (!textureFit && _DKumaGenerator.fitAtlas)
                {
                    //Reset calculation and reduce texture sizes
                    textureFit        = true;
                    atlasElementIndex = -1;
                    umaAtlasList.atlas[atlasIndex].resolutionScale = umaAtlasList.atlas[atlasIndex].resolutionScale * 0.5f;
                    umaAtlasList.atlas[atlasIndex].mipmap++;

                    packTexture.Init(_DKumaGenerator.atlasResolution, _DKumaGenerator.atlasResolution, false);
                    for (int atlasElementIndex2 = 0; atlasElementIndex2 < umaAtlasList.atlas[atlasIndex].atlasMaterialDefinitions.Count; atlasElementIndex2++)
                    {
                        umaAtlasList.atlas[atlasIndex].atlasMaterialDefinitions[atlasElementIndex2].atlasRegion = nullRect;
                    }
                }
            }
        }
    }
Esempio n. 4
0
    protected override IEnumerator workerMethod()
    {
        for (int atlasIndex = 0; atlasIndex < umaData.atlasList.atlas.Count; atlasIndex++)
        {
            //Rendering Atlas
            int moduleCount = 0;

            //Process all necessary TextureModules
            for (int i = 0; i < umaData.atlasList.atlas[atlasIndex].atlasMaterialDefinitions.Count; i++)
            {
                if (!umaData.atlasList.atlas[atlasIndex].atlasMaterialDefinitions[i].isRectShared)
                {
                    moduleCount++;
                    moduleCount = moduleCount + umaData.atlasList.atlas[atlasIndex].atlasMaterialDefinitions[i].source.overlays.Length;
                }
            }

            while (umaGenerator.textureMerge.textureModuleList.Count < moduleCount)
            {
                Transform tempModule = UnityEngine.Object.Instantiate(umaGenerator.textureMerge.textureModule, new Vector3(0, 0, 3), Quaternion.identity) as Transform;
                tempModule.gameObject.GetComponent <Renderer>().material = UnityEngine.Object.Instantiate(umaGenerator.textureMerge.material) as Material;
                umaGenerator.textureMerge.textureModuleList.Add(tempModule);
            }

            textureModuleList = umaGenerator.textureMerge.textureModuleList.ToArray();
            for (int i = 0; i < moduleCount; i++)
            {
                textureModuleList[i].localEulerAngles = new Vector3(textureModuleList[i].localEulerAngles.x, 180.0f, textureModuleList[i].localEulerAngles.z);
                textureModuleList[i].parent           = umaGenerator.textureMerge.myTransform;
                textureModuleList[i].name             = "tempModule";
                textureModuleList[i].gameObject.SetActive(true);
            }

            moduleCount = 0;

            resultingTextures = new Texture[umaGenerator.textureNameList.Length];
            Rect nullRect = new Rect(0, 0, 0, 0);

            for (int textureType = 0; textureType < umaGenerator.textureNameList.Length; textureType++)
            {
                if (umaData.atlasList.atlas[atlasIndex].atlasMaterialDefinitions[0].source.materialSample.HasProperty(umaGenerator.textureNameList[textureType]))
                {
                    for (int i = 0; i < umaData.atlasList.atlas[atlasIndex].atlasMaterialDefinitions.Count; i++)
                    {
                        DKUMAData.AtlasMaterialDefinition atlasElement = umaData.atlasList.atlas[atlasIndex].atlasMaterialDefinitions[i];
                        resolutionScale = umaData.atlasList.atlas[atlasIndex].resolutionScale * umaData.atlasList.atlas[atlasIndex].atlasMaterialDefinitions[i].source.slotData.overlayScale;

                        Vector2 offsetAdjust = new Vector2(umaGenerator.atlasResolution / 1024, umaGenerator.atlasResolution / 1024);

                        if (!atlasElement.isRectShared)
                        {
                            if (textureType == 0)
                            {
                                textureModuleList[moduleCount].localScale = new Vector3(atlasElement.atlasRegion.width / umaGenerator.atlasResolution, atlasElement.atlasRegion.height / umaGenerator.atlasResolution, 1);

                                textureModuleList[moduleCount].localPosition = new Vector3(Mathf.Lerp(-1, 1, (offsetAdjust.x + atlasElement.atlasRegion.x + atlasElement.atlasRegion.width * 0.5f) / umaGenerator.atlasResolution),
                                                                                           Mathf.Lerp(-1, 1, (offsetAdjust.y + atlasElement.atlasRegion.y + atlasElement.atlasRegion.height * 0.5f) / umaGenerator.atlasResolution), 3.0f);
                            }

//							Material tempMaterial = UnityEngine.Object.Instantiate(umaGenerator.textureMerge.material) as Material;
//							textureModuleList[moduleCount].renderer.material = tempMaterial;

                            if (atlasElement.source.baseTexture[textureType])
                            {
                                atlasElement.source.baseTexture[textureType].filterMode = FilterMode.Point;
                                atlasElement.source.baseTexture[0].filterMode           = FilterMode.Point;
                            }
                                                        #if UNITY_EDITOR
                            textureModuleList[moduleCount].GetComponent <Renderer>().sharedMaterial.SetTexture("_MainTex", atlasElement.source.baseTexture[textureType]);
                            textureModuleList[moduleCount].GetComponent <Renderer>().sharedMaterial.SetTexture("_ExtraTex", atlasElement.source.baseTexture[0]);
                            textureModuleList[moduleCount].GetComponent <Renderer>().sharedMaterial.SetColor("_Color", atlasElement.source.GetMultiplier(0, textureType));
                            textureModuleList[moduleCount].GetComponent <Renderer>().sharedMaterial.SetColor("_AdditiveColor", atlasElement.source.GetAdditive(0, textureType));
                            textureModuleList[moduleCount].name = atlasElement.source.baseTexture[textureType].name;
                                                        #else
                            textureModuleList[moduleCount].renderer.material.SetTexture("_MainTex", atlasElement.source.baseTexture[textureType]);
                            textureModuleList[moduleCount].renderer.material.SetTexture("_ExtraTex", atlasElement.source.baseTexture[0]);
                            textureModuleList[moduleCount].renderer.material.SetColor("_Color", atlasElement.source.GetMultiplier(0, textureType));
                            textureModuleList[moduleCount].renderer.material.SetColor("_AdditiveColor", atlasElement.source.GetAdditive(0, textureType));
                            textureModuleList[moduleCount].name = atlasElement.source.baseTexture[textureType].name;
                                                        #endif
                            Transform tempModule = textureModuleList[moduleCount];
                            moduleCount++;

                            for (int i2 = 0; i2 < atlasElement.source.overlays.Length; i2++)
                            {
                                if (atlasElement.source.rects[i2] != nullRect)
                                {
                                    textureModuleList[moduleCount].localScale    = new Vector3((atlasElement.source.rects[i2].width / umaGenerator.atlasResolution) * resolutionScale, (atlasElement.source.rects[i2].height / umaGenerator.atlasResolution) * resolutionScale, 1);
                                    textureModuleList[moduleCount].localPosition = new Vector3(Mathf.Lerp(-1, 1, (offsetAdjust.x + atlasElement.atlasRegion.x + atlasElement.source.rects[i2].x * resolutionScale + atlasElement.source.rects[i2].width * 0.5f * resolutionScale) / umaGenerator.atlasResolution),
                                                                                               Mathf.Lerp(-1, 1, (offsetAdjust.y + atlasElement.atlasRegion.y + atlasElement.source.rects[i2].y * resolutionScale + atlasElement.source.rects[i2].height * 0.5f * resolutionScale) / umaGenerator.atlasResolution), tempModule.localPosition.z - 0.1f - 0.1f * i2);
                                }
                                else
                                {
                                    textureModuleList[moduleCount].localScale    = tempModule.localScale;
                                    textureModuleList[moduleCount].localPosition = new Vector3(tempModule.localPosition.x, tempModule.localPosition.y, tempModule.localPosition.z - 0.1f - 0.1f * i2);
                                }

//								Material tempGenMaterial = umaGenerator.textureMerge.GenerateMaterial(umaGenerator.textureMerge.material);
//								textureModuleList[moduleCount].renderer.material = tempGenMaterial;

                                atlasElement.source.overlays[i2].textureList[textureType].filterMode = FilterMode.Point;
                                atlasElement.source.overlays[i2].textureList[0].filterMode           = FilterMode.Point;
                                                                #if UNITY_EDITOR
                                textureModuleList[moduleCount].GetComponent <Renderer>().sharedMaterial.SetTexture("_MainTex", atlasElement.source.overlays[i2].textureList[textureType]);
                                textureModuleList[moduleCount].GetComponent <Renderer>().sharedMaterial.SetTexture("_ExtraTex", atlasElement.source.overlays[i2].textureList[0]);
                                textureModuleList[moduleCount].GetComponent <Renderer>().sharedMaterial.SetColor("_Color", atlasElement.source.GetMultiplier(i2 + 1, textureType));
                                textureModuleList[moduleCount].GetComponent <Renderer>().sharedMaterial.SetColor("_AdditiveColor", atlasElement.source.GetAdditive(i2 + 1, textureType));
                                                                #endif
                                                                #if !UNITY_EDITOR
                                textureModuleList[moduleCount].renderer.material.SetTexture("_MainTex", atlasElement.source.overlays[i2].textureList[textureType]);
                                textureModuleList[moduleCount].renderer.material.SetTexture("_ExtraTex", atlasElement.source.overlays[i2].textureList[0]);
                                textureModuleList[moduleCount].renderer.material.SetColor("_Color", atlasElement.source.GetMultiplier(i2 + 1, textureType));
                                textureModuleList[moduleCount].renderer.material.SetColor("_AdditiveColor", atlasElement.source.GetAdditive(i2 + 1, textureType));
                                                                #endif
                                textureModuleList[moduleCount].name = atlasElement.source.overlays[i2].textureList[textureType].name;

                                moduleCount++;
                            }
//							yield return null;
                        }
                    }

                    //last element for this textureType
                    moduleCount = 0;

                    umaGenerator.textureMerge.gameObject.SetActive(true);

                    destinationTexture            = new RenderTexture(Mathf.FloorToInt(umaData.atlasList.atlas[atlasIndex].cropResolution.x), Mathf.FloorToInt(umaData.atlasList.atlas[atlasIndex].cropResolution.y), 0, RenderTextureFormat.ARGB32, RenderTextureReadWrite.Default);
                    destinationTexture.filterMode = FilterMode.Point;
                    renderCamera = umaGenerator.textureMerge.myCamera;
                    Vector3 tempPosition = renderCamera.transform.position;

                    renderCamera.orthographicSize   = umaData.atlasList.atlas[atlasIndex].cropResolution.y / umaGenerator.atlasResolution;
                    renderCamera.transform.position = tempPosition + (-Vector3.right * (1 - umaData.atlasList.atlas[atlasIndex].cropResolution.x / umaGenerator.atlasResolution)) + (-Vector3.up * (1 - renderCamera.orthographicSize));

                    renderCamera.targetTexture = destinationTexture;
                    RenderTexture.active       = destinationTexture;
                    renderCamera.Render();

                    renderCamera.transform.position = tempPosition;

                    Texture2D tempTexture;
                    if (umaGenerator.convertRenderTexture)
                    {
                        tempTexture = new Texture2D(destinationTexture.width, destinationTexture.height, TextureFormat.ARGB32, true);
                        tempTexture.ReadPixels(new Rect(0, 0, destinationTexture.width, destinationTexture.height), 0, 0, false);

                        resultingTextures[textureType] = tempTexture as Texture;

                        RenderTexture.active = null;

                        destinationTexture.Release();
                        if (Application.isPlaying)
                        {
                            UnityEngine.GameObject.Destroy(destinationTexture);
                        }
                                                # if Editor
                        GameObject.DestroyImmediate(destinationTexture);
                                                #endif
                        yield return(null);

                        tempTexture = resultingTextures[textureType] as Texture2D;
                        tempTexture.Apply();

                        resultingTextures[textureType] = tempTexture;
                        yield return(null);
                    }
                    else
                    {
                        destinationTexture.filterMode  = FilterMode.Bilinear;
                        resultingTextures[textureType] = destinationTexture;
                    }
                    umaGenerator.textureMerge.gameObject.SetActive(false);
                }