89 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			89 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using UnityEngine;
 | |
| 
 | |
| namespace _PROJECT.Components.Drawing
 | |
| {
 | |
|     public class TextureDrawing : MonoBehaviour
 | |
|     {
 | |
|         public Texture2D initialDrawingTexture;
 | |
|         private MeshRenderer _meshRenderer;
 | |
|         private Texture2D _tempTexture;
 | |
|         public float maxBrushSize = 100f;
 | |
| 
 | |
|         public NetworkDrawingManager networkDrawingManager;
 | |
| 
 | |
|         void Start()
 | |
|         {
 | |
|             _meshRenderer = GetComponent<MeshRenderer>();
 | |
|             networkDrawingManager = GetComponent<NetworkDrawingManager>();
 | |
| 
 | |
|             Vector3 scale = transform.lossyScale;
 | |
| 
 | |
|             _tempTexture = ResizeTexture(initialDrawingTexture, Mathf.RoundToInt(scale.x * initialDrawingTexture.width), Mathf.RoundToInt(scale.y * initialDrawingTexture.height));
 | |
| 
 | |
|             _meshRenderer.material.mainTexture = _tempTexture;
 | |
|         }
 | |
| 
 | |
|         public void SetTempTexture(Texture2D texture)
 | |
|         {
 | |
|             _tempTexture = texture;
 | |
|             _meshRenderer.material.mainTexture = _tempTexture;
 | |
|         }
 | |
| 
 | |
|         public void Draw(Vector2 textureCoord, Color color, int size, Vector3 angle) {
 | |
|             networkDrawingManager.RequestDrawOnTextureRPC(textureCoord, color, size, angle);
 | |
|         }
 | |
| 
 | |
|         public void DrawOnTexture(Vector2 textureCoord, Color color, int size, Vector3 angle)
 | |
|         {
 | |
|             int x = Mathf.FloorToInt(textureCoord.x * _tempTexture.width);
 | |
|             int y = Mathf.FloorToInt(textureCoord.y * _tempTexture.height);
 | |
| 
 | |
|             float sprayAngle = Mathf.Atan2(angle.y, angle.x) * Mathf.Rad2Deg;
 | |
|             Quaternion rotation = Quaternion.AngleAxis(sprayAngle, Vector3.forward);
 | |
|     
 | |
|             float density = Mathf.Lerp(1.0f, 0.1f, size / maxBrushSize);
 | |
| 
 | |
|             float radius = size * density;
 | |
|             int numPixels = Mathf.RoundToInt(Mathf.PI * radius * radius);
 | |
|     
 | |
|             for (int i = 0; i < numPixels; i++)
 | |
|             {
 | |
|                 Vector2 offset = new Vector2(Random.Range(-size, size), Random.Range(-size, size));
 | |
|                 if (offset.magnitude > size) continue;
 | |
|                 offset = rotation * offset;
 | |
| 
 | |
|                 float alpha = Random.Range(0f, 1f);
 | |
|                 Color sprayColor = new Color(color.r, color.g, color.b, alpha * color.a);
 | |
| 
 | |
|                 _tempTexture.SetPixel(x + Mathf.RoundToInt(offset.x), y + Mathf.RoundToInt(offset.y), sprayColor);
 | |
|             }
 | |
| 
 | |
|             _tempTexture.Apply();
 | |
|         }
 | |
|         
 | |
|         private Texture2D ResizeTexture(Texture2D inputTexture, int newWidth, int newHeight)
 | |
|         {
 | |
|             Texture2D outputTexture = new Texture2D(newWidth, newHeight);
 | |
|             Color[] pixels = new Color[newWidth * newHeight];
 | |
| 
 | |
|             // Resample the input texture to the new size
 | |
|             for (int y = 0; y < newHeight; y++)
 | |
|             {
 | |
|                 for (int x = 0; x < newWidth; x++)
 | |
|                 {
 | |
|                     float u = x / (float)newWidth;
 | |
|                     float v = y / (float)newHeight;
 | |
| 
 | |
|                     pixels[y * newWidth + x] = inputTexture.GetPixelBilinear(u, v);
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             // Set the pixels of the output texture
 | |
|             outputTexture.SetPixels(pixels);
 | |
|             outputTexture.Apply();
 | |
| 
 | |
|             return outputTexture;
 | |
|         }
 | |
| 
 | |
|     }
 | |
| } |