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; } } } } }
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); }