# Issue

This Content is from Stack Overflow. Question asked by Newboy11

I have a gameobject that occupies the whole screen just for testing purposes. I’m drawing a line btw. What I’m trying to achieve is if the mouse position hits a gameobject it will store the vector2 coordinates in a list. But raycast is not storing all the coordinates. Below is my code

private void Update()
{
if (Input.GetMouseButton(0))
{
Vector2 mousePos = Input.mousePosition;

Vector2 Pos = _camera.ScreenToWorldPoint(mousePos);

if(!mousePositions.Contains(Pos))

if (Physics.Raycast(Camera.main.ScreenPointToRay(mousePos), out RaycastHit hit))
{
Vector2 textureCoord = hit.textureCoord;

int pixelX = (int)(textureCoord.x * _templateDirtMask.width);
int pixelY = (int)(textureCoord.y * _templateDirtMask.height);

Vector2Int paintPixelPosition = new Vector2Int(pixelX, pixelY);

if (!linePositions.Contains(paintPixelPosition))

foreach (Vector2Int pos in linePositions)
{
int pixelXOffset = pos.x - (_brush.width / 2);
int pixelYOffset = pos.y - (_brush.height / 2);

for (int x = 0; x < _brush.width; x++)
{
for (int y = 0; y < _brush.height; y++)
{
pixelXOffset + x,
pixelYOffset + y,
Color.black
);
}
}
}

}
}
}

Everytime I checked the element count mousePositions are always greater than linePositions

# Solution

the element count mousePositions are always greater than linePosition

well it is quite simple: In

int pixelX = (int)(textureCoord.x * _templateDirtMask.width);
int pixelY = (int)(textureCoord.y * _templateDirtMask.height);

you are casting to int and cut off any decimals after the comma (basically like doing Mathf.FloorToInt).

So you can totally have multiple mouse positions which result in float pixel positions like e.g.

1.2, 1.2
1.4, 1.7
1.02, 1.93
...

all these will map to

Vector2Int paintPixelPosition = new Vector2Int(1, 1);

Besides, you might want to look at some better line drawing algorithms like e.g. this simple one

And then note that calling SetPixel repeatedly is quite expensive. You want to do a single SetPixels call like e.g.

foreach (Vector2Int pos in linePositions)
{
int pixelXOffset = pos.x - (_brush.width / 2);
int pixelYOffset = pos.y - (_brush.height / 2);

for (int x = 0; x < _brush.width; x++)
{
for (int y = 0; y < _brush.height; y++)
{
pixels[(pixelXOffset + x) + (pixelYOffset + y) * _templateDirtMask.width] = Color.black;
}
}
}