diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/TextureProcessPROCoroutine.cs b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/TextureProcessPROCoroutine.cs
index 52037ab29..db6c3c304 100644
--- a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/TextureProcessPROCoroutine.cs
+++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/TextureProcessPROCoroutine.cs
@@ -4,341 +4,284 @@
namespace UMA
{
- ///
- /// Texture processing coroutine using rendertextures for atlas building.
- ///
- [Serializable]
- public class TextureProcessPROCoroutine : TextureProcessBaseCoroutine
- {
- UMAData umaData;
- RenderTexture destinationTexture;
- Texture[] resultingTextures;
- UMAGeneratorBase umaGenerator;
- bool fastPath = false;
-
- ///
- /// Setup data for atlas building.
- ///
- /// UMA data.
- /// UMA generator.
- public override void Prepare(UMAData _umaData, UMAGeneratorBase _umaGenerator)
- {
- umaData = _umaData;
- umaGenerator = _umaGenerator;
- if (umaGenerator is UMAGenerator)
- {
- fastPath = (umaGenerator as UMAGenerator).fastGeneration;
- }
- if (umaData.atlasResolutionScale <= 0) umaData.atlasResolutionScale = 1f;
- }
-
- protected override void Start()
- {
-
- }
-
- public static RenderTexture ResizeRenderTexture(RenderTexture source, int newWidth, int newHeight, FilterMode filter)
- {
- source.filterMode = filter;
- RenderTexture rt = new RenderTexture(newWidth, newHeight, 0, source.format, RenderTextureReadWrite.Linear);
-
- rt.filterMode = FilterMode.Point;
-
- RenderTexture.active = rt;
- Graphics.Blit(source, rt);
- return rt;
- }
-
- protected override IEnumerator workerMethod()
- {
- var textureMerge = umaGenerator.textureMerge;
- if (textureMerge == null)
- {
- if (Debug.isDebugBuild)
- Debug.LogError("TextureMerge is null!");
- yield return null;
- }
-
- for (int atlasIndex = umaData.generatedMaterials.materials.Count - 1; atlasIndex >= 0; atlasIndex--)
- {
- var atlas = umaData.generatedMaterials.materials[atlasIndex];
-
- //Rendering Atlas
- int moduleCount = 0;
-
- //Process all necessary TextureModules
- for (int i = 0; i < atlas.materialFragments.Count; i++)
- {
- if (!atlas.materialFragments[i].isRectShared)
- {
- moduleCount++;
- moduleCount = moduleCount + atlas.materialFragments[i].overlays.Length;
- }
- }
- textureMerge.EnsureCapacity(moduleCount);
-
- var slotData = atlas.materialFragments[0].slotData;
- resultingTextures = new Texture[slotData.asset.material.channels.Length];
- for (int textureType = slotData.asset.material.channels.Length - 1; textureType >= 0; textureType--)
- {
- switch (slotData.asset.material.channels[textureType].channelType)
- {
- case UMAMaterial.ChannelType.Texture:
- case UMAMaterial.ChannelType.DiffuseTexture:
- case UMAMaterial.ChannelType.NormalMap:
- {
- textureMerge.Reset();
- for (int i = 0; i < atlas.materialFragments.Count; i++)
- {
- textureMerge.SetupModule(atlas, i, textureType);
- }
-
- //last element for this textureType
- moduleCount = 0;
-
- int width = Mathf.FloorToInt(atlas.cropResolution.x);
- int height = Mathf.FloorToInt(atlas.cropResolution.y);
-
- if (width == 0 || height == 0)
- {
- continue;
- }
-
- destinationTexture = new RenderTexture(Mathf.FloorToInt(atlas.cropResolution.x * umaData.atlasResolutionScale), Mathf.FloorToInt(atlas.cropResolution.y * umaData.atlasResolutionScale), 0, slotData.asset.material.channels[textureType].textureFormat, RenderTextureReadWrite.Linear);
- destinationTexture.filterMode = FilterMode.Point;
- destinationTexture.useMipMap = umaGenerator.convertMipMaps && !umaGenerator.convertRenderTexture;
- //Draw all the Rects here
-
- Color backgroundColor;
- UMAMaterial.ChannelType channelType = slotData.asset.material.channels[textureType].channelType;
-
- if (slotData.asset.material.MaskWithCurrentColor && (channelType == UMAMaterial.ChannelType.DiffuseTexture || channelType == UMAMaterial.ChannelType.Texture || channelType == UMAMaterial.ChannelType.TintedTexture))
- {
- backgroundColor = slotData.asset.material.maskMultiplier * textureMerge.camBackgroundColor;
- }
- else
- {
- backgroundColor = UMAMaterial.GetBackgroundColor(slotData.asset.material.channels[textureType].channelType);
- }
-
-
- textureMerge.DrawAllRects(destinationTexture, width, height, backgroundColor);
-
- //PostProcess
- textureMerge.PostProcess(destinationTexture, slotData.asset.material.channels[textureType].channelType);
-
- int DownSample = slotData.asset.material.channels[textureType].DownSample;
- if (DownSample != 0)
- {
- int newW = width >> DownSample;
- int newH = height >> DownSample;
-
- RenderTexture rt = ResizeRenderTexture(destinationTexture, newW, newH, FilterMode.Bilinear);
- destinationTexture.Release();
- destinationTexture = rt;
- }
-
- if (umaGenerator.convertRenderTexture || slotData.asset.material.channels[textureType].ConvertRenderTexture)
- {
- #region Convert Render Textures
- if (!fastPath) yield return 25;
- Texture2D tempTexture;
-
- tempTexture = new Texture2D(destinationTexture.width, destinationTexture.height, TextureFormat.ARGB32, umaGenerator.convertMipMaps, true);
-
- int xblocks = destinationTexture.width / 512;
- int yblocks = destinationTexture.height / 512;
- if (xblocks == 0 || yblocks == 0 || fastPath)
- {
- RenderTexture.active = destinationTexture;
- tempTexture.ReadPixels(new Rect(0, 0, destinationTexture.width, destinationTexture.height), 0, 0, umaGenerator.convertMipMaps);
- RenderTexture.active = null;
- }
- else
- {
- // figures that ReadPixels works differently on OpenGL and DirectX, someday this code will break because Unity fixes this bug!
- if (IsOpenGL())
- {
- for (int x = 0; x < xblocks; x++)
- {
- for (int y = 0; y < yblocks; y++)
- {
- RenderTexture.active = destinationTexture;
- tempTexture.ReadPixels(new Rect(x * 512, y * 512, 512, 512), x * 512, y * 512, umaGenerator.convertMipMaps);
- RenderTexture.active = null;
- yield return 8;
- }
- }
- }
- else
- {
- for (int x = 0; x < xblocks; x++)
- {
- for (int y = 0; y < yblocks; y++)
- {
- RenderTexture.active = destinationTexture;
- tempTexture.ReadPixels(new Rect(x * 512, destinationTexture.height - 512 - y * 512, 512, 512), x * 512, y * 512, umaGenerator.convertMipMaps);
- RenderTexture.active = null;
- yield return 8;
- }
- }
- }
- }
-
-
- resultingTextures[textureType] = tempTexture as Texture;
-
- RenderTexture.active = null;
-
- destinationTexture.Release();
- UnityEngine.GameObject.DestroyImmediate(destinationTexture);
- if (!fastPath) yield return 6;
- tempTexture = resultingTextures[textureType] as Texture2D;
- tempTexture.Apply();
- tempTexture.wrapMode = TextureWrapMode.Repeat;
- tempTexture.anisoLevel = slotData.asset.material.AnisoLevel;
- tempTexture.mipMapBias = slotData.asset.material.MipMapBias;
- tempTexture.filterMode = slotData.asset.material.MatFilterMode;
- if (slotData.asset.material.channels[textureType].Compression != UMAMaterial.CompressionSettings.None)
- {
- tempTexture.Compress(slotData.asset.material.channels[textureType].Compression == UMAMaterial.CompressionSettings.HighQuality);
- }
- resultingTextures[textureType] = tempTexture;
- if (!slotData.asset.material.channels[textureType].NonShaderTexture)
- {
- atlas.material.SetTexture(slotData.asset.material.channels[textureType].materialPropertyName, tempTexture);
- }
- #endregion
- }
- else
- {
- destinationTexture.anisoLevel = slotData.asset.material.AnisoLevel;
- destinationTexture.mipMapBias = slotData.asset.material.MipMapBias;
- destinationTexture.filterMode = slotData.asset.material.MatFilterMode;
- destinationTexture.wrapMode = TextureWrapMode.Repeat;
- resultingTextures[textureType] = destinationTexture;
- if (!slotData.asset.material.channels[textureType].NonShaderTexture)
- {
- atlas.material.SetTexture(slotData.asset.material.channels[textureType].materialPropertyName, destinationTexture);
- }
- }
-
- break;
- }
-
- resultingTextures[textureType] = tempTexture;
- if (!slotData.asset.material.channels[textureType].NonShaderTexture)
- {
-<<<<<<< Updated upstream
- atlas.material.SetTexture(slotData.asset.material.channels[textureType].materialPropertyName, tempTexture);
- }
- #endregion
- }
- else
- {
- destinationTexture.anisoLevel = slotData.asset.material.AnisoLevel;
- destinationTexture.mipMapBias = slotData.asset.material.MipMapBias;
- destinationTexture.filterMode = slotData.asset.material.MatFilterMode;
- destinationTexture.wrapMode = TextureWrapMode.Repeat;
- resultingTextures[textureType] = destinationTexture;
- if (!slotData.asset.material.channels[textureType].NonShaderTexture)
- {
- atlas.material.SetTexture(slotData.asset.material.channels[textureType].materialPropertyName, destinationTexture);
- }
- }
-
- break;
- }
- case UMAMaterial.ChannelType.MaterialColor:
- {
- if (slotData.asset.material.channels[textureType].NonShaderTexture) break;
- atlas.material.SetColor(slotData.asset.material.channels[textureType].materialPropertyName, atlas.materialFragments[0].baseColor);
- break;
- }
- case UMAMaterial.ChannelType.TintedTexture:
- {
- for (int i = 0; i < atlas.materialFragments.Count; i++)
- {
- var fragment = atlas.materialFragments[i];
- if (fragment.isRectShared) continue;
- for (int j = 0; j < fragment.baseOverlay.textureList.Length; j++)
- {
- if (fragment.baseOverlay.textureList[j] != null)
- {
- if (!slotData.asset.material.channels[textureType].NonShaderTexture)
- {
- atlas.material.SetTexture(slotData.asset.material.channels[j].materialPropertyName, fragment.baseOverlay.textureList[j]);
- }
- if (j == 0)
- {
- atlas.material.color = fragment.baseColor;
- }
- }
-=======
- if (slotData.asset.material.channels[textureType].NonShaderTexture) break;
- atlas.material.SetColor(slotData.asset.material.channels[textureType].materialPropertyName, atlas.materialFragments[0].baseColor);
- break;
->>>>>>> Stashed changes
- }
- case UMAMaterial.ChannelType.TintedTexture:
- {
- for (int i = 0; i < atlas.materialFragments.Count; i++)
- {
- var fragment = atlas.materialFragments[i];
- if (fragment.isRectShared) continue;
- for (int j = 0; j < fragment.baseOverlay.textureList.Length; j++)
- {
- if (fragment.baseOverlay.textureList[j] != null)
- {
- if (!slotData.asset.material.channels[textureType].NonShaderTexture)
- {
- atlas.material.SetTexture(slotData.asset.material.channels[j].materialPropertyName, fragment.baseOverlay.textureList[j]);
- }
- if (j == 0)
- {
- atlas.material.color = fragment.baseColor;
- }
- }
- }
- foreach (var overlay in fragment.overlays)
- {
- for (int j = 0; j < overlay.textureList.Length; j++)
- {
- if (overlay.textureList[j] != null)
-<<<<<<< Updated upstream
- {
- if (!slotData.asset.material.channels[textureType].NonShaderTexture)
- {
- atlas.material.SetTexture(slotData.asset.material.channels[j].materialPropertyName, overlay.textureList[j]);
- }
-=======
- {
- if (!slotData.asset.material.channels[textureType].NonShaderTexture)
- {
- atlas.material.SetTexture(slotData.asset.material.channels[j].materialPropertyName, overlay.textureList[j]);
- }
->>>>>>> Stashed changes
- }
- }
- }
- }
- break;
- }
- }
- }
- atlas.resultingAtlasList = resultingTextures;
- }
- }
-
- private bool IsOpenGL()
- {
- var graphicsDeviceVersion = SystemInfo.graphicsDeviceVersion;
- return graphicsDeviceVersion.StartsWith("OpenGL");
- }
-
- protected override void Stop()
- {
-
- }
- }
+ ///
+ /// Texture processing coroutine using rendertextures for atlas building.
+ ///
+ [Serializable]
+ public class TextureProcessPROCoroutine : TextureProcessBaseCoroutine
+ {
+ UMAData umaData;
+ RenderTexture destinationTexture;
+ Texture[] resultingTextures;
+ UMAGeneratorBase umaGenerator;
+ bool fastPath = false;
+
+ ///
+ /// Setup data for atlas building.
+ ///
+ /// UMA data.
+ /// UMA generator.
+ public override void Prepare(UMAData _umaData, UMAGeneratorBase _umaGenerator)
+ {
+ umaData = _umaData;
+ umaGenerator = _umaGenerator;
+ if (umaGenerator is UMAGenerator)
+ {
+ fastPath = (umaGenerator as UMAGenerator).fastGeneration;
+ }
+ if (umaData.atlasResolutionScale <= 0) umaData.atlasResolutionScale = 1f;
+ }
+
+ protected override void Start()
+ {
+
+ }
+
+ public static RenderTexture ResizeRenderTexture(RenderTexture source, int newWidth, int newHeight, FilterMode filter)
+ {
+ source.filterMode = filter;
+ RenderTexture rt = new RenderTexture(newWidth, newHeight, 0, source.format, RenderTextureReadWrite.Linear);
+
+ rt.filterMode = FilterMode.Point;
+
+ RenderTexture.active = rt;
+ Graphics.Blit(source, rt);
+ return rt;
+ }
+
+ protected override IEnumerator workerMethod()
+ {
+ var textureMerge = umaGenerator.textureMerge;
+ if (textureMerge == null)
+ {
+ if (Debug.isDebugBuild)
+ Debug.LogError("TextureMerge is null!");
+ yield return null;
+ }
+
+ for (int atlasIndex = umaData.generatedMaterials.materials.Count - 1; atlasIndex >= 0; atlasIndex--)
+ {
+ var atlas = umaData.generatedMaterials.materials[atlasIndex];
+
+ //Rendering Atlas
+ int moduleCount = 0;
+
+ //Process all necessary TextureModules
+ for (int i = 0; i < atlas.materialFragments.Count; i++)
+ {
+ if (!atlas.materialFragments[i].isRectShared)
+ {
+ moduleCount++;
+ moduleCount = moduleCount + atlas.materialFragments[i].overlays.Length;
+ }
+ }
+ textureMerge.EnsureCapacity(moduleCount);
+
+ var slotData = atlas.materialFragments[0].slotData;
+ resultingTextures = new Texture[slotData.asset.material.channels.Length];
+ for (int textureType = slotData.asset.material.channels.Length - 1; textureType >= 0; textureType--)
+ {
+ switch (slotData.asset.material.channels[textureType].channelType)
+ {
+ case UMAMaterial.ChannelType.Texture:
+ case UMAMaterial.ChannelType.DiffuseTexture:
+ case UMAMaterial.ChannelType.NormalMap:
+ {
+ textureMerge.Reset();
+ for (int i = 0; i < atlas.materialFragments.Count; i++)
+ {
+ textureMerge.SetupModule(atlas, i, textureType);
+ }
+
+ //last element for this textureType
+ moduleCount = 0;
+
+ int width = Mathf.FloorToInt(atlas.cropResolution.x);
+ int height = Mathf.FloorToInt(atlas.cropResolution.y);
+
+ if (width == 0 || height == 0)
+ {
+ continue;
+ }
+
+ destinationTexture = new RenderTexture(Mathf.FloorToInt(atlas.cropResolution.x * umaData.atlasResolutionScale), Mathf.FloorToInt(atlas.cropResolution.y * umaData.atlasResolutionScale), 0, slotData.asset.material.channels[textureType].textureFormat, RenderTextureReadWrite.Linear);
+ destinationTexture.filterMode = FilterMode.Point;
+ destinationTexture.useMipMap = umaGenerator.convertMipMaps && !umaGenerator.convertRenderTexture;
+ //Draw all the Rects here
+
+ Color backgroundColor;
+ UMAMaterial.ChannelType channelType = slotData.asset.material.channels[textureType].channelType;
+
+ if (slotData.asset.material.MaskWithCurrentColor && (channelType == UMAMaterial.ChannelType.DiffuseTexture || channelType == UMAMaterial.ChannelType.Texture || channelType == UMAMaterial.ChannelType.TintedTexture))
+ {
+ backgroundColor = slotData.asset.material.maskMultiplier * textureMerge.camBackgroundColor;
+ }
+ else
+ {
+ backgroundColor = UMAMaterial.GetBackgroundColor(slotData.asset.material.channels[textureType].channelType);
+ }
+
+
+ textureMerge.DrawAllRects(destinationTexture, width, height, backgroundColor);
+
+ //PostProcess
+ textureMerge.PostProcess(destinationTexture, slotData.asset.material.channels[textureType].channelType);
+
+ int DownSample = slotData.asset.material.channels[textureType].DownSample;
+ if (DownSample != 0)
+ {
+ int newW = width >> DownSample;
+ int newH = height >> DownSample;
+
+ RenderTexture rt = ResizeRenderTexture(destinationTexture, newW, newH, FilterMode.Bilinear);
+ destinationTexture.Release();
+ destinationTexture = rt;
+ }
+
+ if (umaGenerator.convertRenderTexture || slotData.asset.material.channels[textureType].ConvertRenderTexture)
+ {
+ #region Convert Render Textures
+ if (!fastPath) yield return 25;
+ Texture2D tempTexture;
+
+ tempTexture = new Texture2D(destinationTexture.width, destinationTexture.height, TextureFormat.ARGB32, umaGenerator.convertMipMaps, true);
+
+ int xblocks = destinationTexture.width / 512;
+ int yblocks = destinationTexture.height / 512;
+ if (xblocks == 0 || yblocks == 0 || fastPath)
+ {
+ RenderTexture.active = destinationTexture;
+ tempTexture.ReadPixels(new Rect(0, 0, destinationTexture.width, destinationTexture.height), 0, 0, umaGenerator.convertMipMaps);
+ RenderTexture.active = null;
+ }
+ else
+ {
+ // figures that ReadPixels works differently on OpenGL and DirectX, someday this code will break because Unity fixes this bug!
+ if (IsOpenGL())
+ {
+ for (int x = 0; x < xblocks; x++)
+ {
+ for (int y = 0; y < yblocks; y++)
+ {
+ RenderTexture.active = destinationTexture;
+ tempTexture.ReadPixels(new Rect(x * 512, y * 512, 512, 512), x * 512, y * 512, umaGenerator.convertMipMaps);
+ RenderTexture.active = null;
+ yield return 8;
+ }
+ }
+ }
+ else
+ {
+ for (int x = 0; x < xblocks; x++)
+ {
+ for (int y = 0; y < yblocks; y++)
+ {
+ RenderTexture.active = destinationTexture;
+ tempTexture.ReadPixels(new Rect(x * 512, destinationTexture.height - 512 - y * 512, 512, 512), x * 512, y * 512, umaGenerator.convertMipMaps);
+ RenderTexture.active = null;
+ yield return 8;
+ }
+ }
+ }
+ }
+
+
+ resultingTextures[textureType] = tempTexture as Texture;
+
+ RenderTexture.active = null;
+
+ destinationTexture.Release();
+ UnityEngine.GameObject.DestroyImmediate(destinationTexture);
+ if (!fastPath) yield return 6;
+ tempTexture = resultingTextures[textureType] as Texture2D;
+ tempTexture.Apply();
+ tempTexture.wrapMode = TextureWrapMode.Repeat;
+ tempTexture.anisoLevel = slotData.asset.material.AnisoLevel;
+ tempTexture.mipMapBias = slotData.asset.material.MipMapBias;
+ tempTexture.filterMode = slotData.asset.material.MatFilterMode;
+ if (slotData.asset.material.channels[textureType].Compression != UMAMaterial.CompressionSettings.None)
+ {
+ tempTexture.Compress(slotData.asset.material.channels[textureType].Compression == UMAMaterial.CompressionSettings.HighQuality);
+ }
+ resultingTextures[textureType] = tempTexture;
+ if (!slotData.asset.material.channels[textureType].NonShaderTexture)
+ {
+ atlas.material.SetTexture(slotData.asset.material.channels[textureType].materialPropertyName, tempTexture);
+ }
+ #endregion
+ }
+ else
+ {
+ destinationTexture.anisoLevel = slotData.asset.material.AnisoLevel;
+ destinationTexture.mipMapBias = slotData.asset.material.MipMapBias;
+ destinationTexture.filterMode = slotData.asset.material.MatFilterMode;
+ destinationTexture.wrapMode = TextureWrapMode.Repeat;
+ resultingTextures[textureType] = destinationTexture;
+ if (!slotData.asset.material.channels[textureType].NonShaderTexture)
+ {
+ atlas.material.SetTexture(slotData.asset.material.channels[textureType].materialPropertyName, destinationTexture);
+ }
+ }
+
+ break;
+ }
+ case UMAMaterial.ChannelType.MaterialColor:
+ {
+ if (slotData.asset.material.channels[textureType].NonShaderTexture) break;
+ atlas.material.SetColor(slotData.asset.material.channels[textureType].materialPropertyName, atlas.materialFragments[0].baseColor);
+ break;
+ }
+ case UMAMaterial.ChannelType.TintedTexture:
+ {
+ for (int i = 0; i < atlas.materialFragments.Count; i++)
+ {
+ var fragment = atlas.materialFragments[i];
+ if (fragment.isRectShared) continue;
+ for (int j = 0; j < fragment.baseOverlay.textureList.Length; j++)
+ {
+ if (fragment.baseOverlay.textureList[j] != null)
+ {
+ if (!slotData.asset.material.channels[textureType].NonShaderTexture)
+ {
+ atlas.material.SetTexture(slotData.asset.material.channels[j].materialPropertyName, fragment.baseOverlay.textureList[j]);
+ }
+ if (j == 0)
+ {
+ atlas.material.color = fragment.baseColor;
+ }
+ }
+ }
+ foreach (var overlay in fragment.overlays)
+ {
+ for (int j = 0; j < overlay.textureList.Length; j++)
+ {
+ if (overlay.textureList[j] != null)
+ {
+ if (!slotData.asset.material.channels[textureType].NonShaderTexture)
+ {
+ atlas.material.SetTexture(slotData.asset.material.channels[j].materialPropertyName, overlay.textureList[j]);
+ }
+ }
+ }
+ }
+ }
+ break;
+ }
+ }
+ }
+ atlas.resultingAtlasList = resultingTextures;
+ }
+ }
+
+ private bool IsOpenGL()
+ {
+ var graphicsDeviceVersion = SystemInfo.graphicsDeviceVersion;
+ return graphicsDeviceVersion.StartsWith("OpenGL");
+ }
+
+ protected override void Stop()
+ {
+
+ }
+ }
}