Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using TMPro;
- using UnityEngine;
- using UnityEngine.Events;
- using UnityEngine.UI;
- public class Cleanable : MonoBehaviour
- {
- [SerializeField]
- Renderer rend;
- [SerializeField]
- MeshFilter meshFilter;
- [SerializeField]
- int mipmapLevel = 3;
- [SerializeField]
- RawImage img;
- [SerializeField]
- TextMeshProUGUI text;
- public UnityEvent onCleaned = new();
- public UnityEvent onReset = new();
- int resolution = 512;
- Texture2D cachedReadTex;
- Color32[] mapPixels;
- Material renderMat;
- float cacheStartRedPixels;
- RenderTexture m_CurrentDrawMap;
- public RenderTexture currentPaintMap
- {
- get { return m_CurrentDrawMap; }
- }
- public void SetTex(RenderTexture tex)
- {
- if (m_CurrentDrawMap == null)
- {
- m_CurrentDrawMap = tex;
- rend.material.SetTexture("_DrawMap", m_CurrentDrawMap);
- }
- ReadFromRT(m_CurrentDrawMap);
- GetClearedPercentageFromTexture(cachedReadTex, false);
- img.texture = cachedReadTex;
- }
- void ReadFromRT(RenderTexture rt)
- {
- if (cachedReadTex == null)
- cachedReadTex = new Texture2D(resolution, resolution, TextureFormat.RGBA32, true);
- cachedReadTex.filterMode = FilterMode.Bilinear;
- RenderTexture prev = RenderTexture.active;
- RenderTexture.active = rt;
- cachedReadTex.ReadPixels(new Rect(0, 0, resolution, resolution), 0, 0);
- cachedReadTex.Apply();
- RenderTexture.active = prev;
- }
- public void ResetTex(RenderTexture clearTex)
- {
- onReset.Invoke();
- m_CurrentDrawMap = clearTex;
- rend.material.SetTexture("_DrawMap", m_CurrentDrawMap);
- SetTex(m_CurrentDrawMap);
- }
- public Texture2D GetUVCheckedTex()
- {
- cachedReadTex = RenderUVsToTexture(meshFilter.mesh, resolution);
- return cachedReadTex;
- }
- public Texture2D GetReadTex()
- {
- return cachedReadTex;
- }
- void Start()
- {
- // find the shader to draw to the texture
- renderMat = new Material(Shader.Find("Custom/UVRender"));
- // render the lightmap uvs to the texture
- cachedReadTex = RenderUVsToTexture(meshFilter.mesh, resolution);
- // get the amount of pixels from the unpainted texture
- GetClearedPercentageFromTexture(cachedReadTex, true);
- img.texture = cachedReadTex;
- }
- public Texture2D RenderUVsToTexture(Mesh mesh, int resolution)
- {
- // create a snapshot of the uvs to base the cleaning/painting on
- RenderTexture rt = new RenderTexture(
- resolution,
- resolution,
- 0,
- RenderTextureFormat.ARGB32
- );
- rt.Create();
- RenderTexture prev = RenderTexture.active;
- RenderTexture.active = rt;
- GL.Clear(true, true, Color.black);
- renderMat.SetPass(0);
- Graphics.DrawMeshNow(mesh, Matrix4x4.identity);
- // create a new texture from the rendertexture
- Texture2D tex = new Texture2D(resolution, resolution, TextureFormat.RGBA32, true);
- tex.filterMode = FilterMode.Bilinear;
- tex.ReadPixels(new Rect(0, 0, resolution, resolution), 0, 0);
- tex.Apply();
- RenderTexture.active = prev;
- // release and destroy the rendertexture to stop memory leaks
- rt.Release();
- Destroy(rt);
- return tex;
- }
- public float GetClearedPercentageFromTexture(Texture2D tex, bool fromStart)
- {
- mapPixels = tex.GetPixels32(mipmapLevel);
- int redPixels = 0;
- int total = mapPixels.Length;
- for (int i = 0; i < total; i++)
- {
- if (mapPixels[i].r > 1) //get all the red "dirty" pixels
- redPixels++;
- }
- if (fromStart)
- {
- // cache them on start to compare later
- cacheStartRedPixels = redPixels;
- }
- float percentage = (redPixels - cacheStartRedPixels) / cacheStartRedPixels * -100f;
- percentage = Mathf.Round(percentage * 10f) / 10f;
- text.text = percentage + "%";
- // ful lclear after 98.5 so its not super annoying to 100%
- if (percentage >= 98.5 && percentage < 100)
- {
- percentage = 100;
- text.text = "100% Cleared! ";
- onCleaned.Invoke();
- }
- return percentage;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment