private void InitializeComponents() { for (int i = 0; i < allRenderers.Length; i++) { if ((allRenderers[i] is MeshRenderer || allRenderers[i] is SkinnedMeshRenderer) && (allRenderers[i].sharedMaterials.Length == 1) && (allRenderers[i].gameObject.isStatic)) { if (allRenderers[i].gameObject.GetComponent <MeshFilter>() != null) { if (allRenderers[i].gameObject.GetComponent <MeshFilter>().sharedMesh != null) { if (allRenderers[i].gameObject.GetComponent <MeshFilter>().sharedMesh.subMeshCount == 1) { try { ShadersGroup sg = new ShadersGroup(); sg.shader = allRenderers[i].sharedMaterial.shader; sg.gameObjects.Add(allRenderers[i].gameObject); shaderGroups.Add(sg); } catch { continue; } } } } } } }
private void InitializeComponents() { for(int i = 0;i < allRenderers.Length;i++) { if((allRenderers[i] is MeshRenderer || allRenderers[i] is SkinnedMeshRenderer) && (allRenderers[i].sharedMaterials.Length == 1) && (allRenderers[i].gameObject.isStatic)) if(allRenderers[i].gameObject.GetComponent<MeshFilter>() !=null) if(allRenderers[i].gameObject.GetComponent<MeshFilter>().sharedMesh !=null) if(allRenderers[i].gameObject.GetComponent<MeshFilter>().sharedMesh.subMeshCount == 1) { try { ShadersGroup sg = new ShadersGroup(); sg.shader = allRenderers[i].sharedMaterial.shader; sg.gameObjects.Add(allRenderers[i].gameObject); shaderGroups.Add(sg); } catch { continue; } } } }
private void CreateAtlases(ShadersGroup sg) { List<Renderer> renderers = new List<Renderer>(); for (int i = 0; i < sg.gameObjects.Count; i++) { if (sg.gameObjects[i].GetComponent<Renderer>() != null) renderers.Add(sg.gameObjects[i].GetComponent<Renderer>()); else sg.gameObjects.Remove(sg.gameObjects[i]); } AssetsReimporter tr = new AssetsReimporter(); tr.Reimport(GetTextures(renderers.ToArray()) as Texture[]); Texture2D[] textures = GetTextures(renderers.ToArray()); if (textures == null || textures.Length == 0 || textures.Length == 1) return; Texture2D atlas = new Texture2D(32,32,TextureFormat.DXT1,true); Material newMaterial = new Material(sg.gameObjects[0].GetComponent<Renderer>().sharedMaterial); Rect[] rects = atlas.PackTextures(textures,0,4096,false); atlas.Compress(true); atlas.Apply(); newMaterial.mainTexture = atlas as Texture; for(int i = 0;i < sg.gameObjects.Count;i++) { if(rects[i].x == 0 && rects[i].y == 0 && rects[i].width == 1 && rects[i].height == 1) continue; Vector2[] uv,uvs; uv = sg.gameObjects[i].GetComponent<MeshFilter>().sharedMesh.uv; uvs = uv; float offsetX = 0; float offsetY = 0; int scaleFactor = 1; #region Offset for (int c = 0; c < uv.Length; c++) { if (uv[c].x < offsetX) offsetX = uv[c].x; if (uv[c].y < offsetY) offsetY = uv[c].y; } #endregion if (!superOptimization && (offsetX < 0 || offsetY < 0)) continue; #region SetOffset for (int c = 0; c < uv.Length; c++) uvs[c] = new Vector2(uv[c].x + (-(offsetX)), uv[c].y + (-(offsetY))); #endregion #region Scale for (int c = 0; c < uvs.Length; c++) { int rounded = 0; float value = 0; if (uvs[c].x < 0) value = -uvs[c].x; else value = uvs[c].x; rounded = Mathf.CeilToInt(value); if (rounded > scaleFactor) scaleFactor = rounded; rounded = 0; value = 0; if (uv[c].y < 0) value = -uvs[c].y; else value = uvs[c].y; rounded = Mathf.CeilToInt(value); if (rounded > scaleFactor) scaleFactor = rounded; } #endregion if (!superOptimization && scaleFactor > 1) continue; #region SetScale for (int c = 0; c < uvs.Length; c++) uvs[c] = new Vector2(uvs[c].x / scaleFactor, uvs[c].y / scaleFactor); #endregion for (int c = 0; c < uvs.Length; c++) { uvs[c] = new Vector2((float)(((float)uvs[c].x * (float)rects[i].width) + (float)rects[i].x), (float)(((float)uvs[c].y * (float)rects[i].height) + (float)rects[i].y)); } sg.gameObjects[i].GetComponent<MeshFilter>().sharedMesh.uv = uvs; sg.gameObjects[i].GetComponent<Renderer>().sharedMaterial = newMaterial; sg.gameObjects[i].GetComponent<Renderer>().sharedMaterial.mainTextureOffset = new Vector2(0, 0); sg.gameObjects[i].GetComponent<Renderer>().sharedMaterial.mainTextureScale = new Vector2(1, 1); } }
private void CreateAtlases(ShadersGroup sg) { List <Renderer> renderers = new List <Renderer>(); for (int i = 0; i < sg.gameObjects.Count; i++) { if (sg.gameObjects[i].GetComponent <Renderer>() != null) { renderers.Add(sg.gameObjects[i].GetComponent <Renderer>()); } else { sg.gameObjects.Remove(sg.gameObjects[i]); } } AssetsReimporter tr = new AssetsReimporter(); tr.Reimport(GetTextures(renderers.ToArray()) as Texture[]); Texture2D[] textures = GetTextures(renderers.ToArray()); if (textures == null || textures.Length == 0 || textures.Length == 1) { return; } Texture2D atlas = new Texture2D(32, 32, TextureFormat.DXT1, true); Material newMaterial = new Material(sg.gameObjects[0].GetComponent <Renderer>().sharedMaterial); Rect[] rects = atlas.PackTextures(textures, 0, 4096, false); atlas.Compress(true); atlas.Apply(); newMaterial.mainTexture = atlas as Texture; for (int i = 0; i < sg.gameObjects.Count; i++) { if (rects[i].x == 0 && rects[i].y == 0 && rects[i].width == 1 && rects[i].height == 1) { continue; } Vector2[] uv, uvs; uv = sg.gameObjects[i].GetComponent <MeshFilter>().sharedMesh.uv; uvs = uv; float offsetX = 0; float offsetY = 0; int scaleFactor = 1; #region Offset for (int c = 0; c < uv.Length; c++) { if (uv[c].x < offsetX) { offsetX = uv[c].x; } if (uv[c].y < offsetY) { offsetY = uv[c].y; } } #endregion if (!superOptimization && (offsetX < 0 || offsetY < 0)) { continue; } #region SetOffset for (int c = 0; c < uv.Length; c++) { uvs[c] = new Vector2(uv[c].x + (-(offsetX)), uv[c].y + (-(offsetY))); } #endregion #region Scale for (int c = 0; c < uvs.Length; c++) { int rounded = 0; float value = 0; if (uvs[c].x < 0) { value = -uvs[c].x; } else { value = uvs[c].x; } rounded = Mathf.CeilToInt(value); if (rounded > scaleFactor) { scaleFactor = rounded; } rounded = 0; value = 0; if (uv[c].y < 0) { value = -uvs[c].y; } else { value = uvs[c].y; } rounded = Mathf.CeilToInt(value); if (rounded > scaleFactor) { scaleFactor = rounded; } } #endregion if (!superOptimization && scaleFactor > 1) { continue; } #region SetScale for (int c = 0; c < uvs.Length; c++) { uvs[c] = new Vector2(uvs[c].x / scaleFactor, uvs[c].y / scaleFactor); } #endregion for (int c = 0; c < uvs.Length; c++) { uvs[c] = new Vector2((float)(((float)uvs[c].x * (float)rects[i].width) + (float)rects[i].x), (float)(((float)uvs[c].y * (float)rects[i].height) + (float)rects[i].y)); } sg.gameObjects[i].GetComponent <MeshFilter>().sharedMesh.uv = uvs; sg.gameObjects[i].GetComponent <Renderer>().sharedMaterial = newMaterial; sg.gameObjects[i].GetComponent <Renderer>().sharedMaterial.mainTextureOffset = new Vector2(0, 0); sg.gameObjects[i].GetComponent <Renderer>().sharedMaterial.mainTextureScale = new Vector2(1, 1); } }