2023-05-08 15:56:10 +03:00

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;
}
}
}