Esempio n. 1
0
 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;
                         }
                     }
                 }
             }
         }
     }
 }
Esempio n. 2
0
	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);
        }
    }
Esempio n. 4
0
    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);
        }
    }