in System.Numerics/SIMD/RayTracer/Camera.cs [89:140]
public async Task<Bitmap> RenderSceneToBitmapThreaded(Scene scene, int width = -1, int height = -1)
{
if (width == -1 || height == -1)
{
width = renderSize.Width;
height = renderSize.Height;
}
else
{
renderSize = new Size(width, height);
}
var before = DateTime.UtcNow;
Bitmap bitmap = new Bitmap(width, height);
List<Task> tasks = new List<Task>();
Color[,] colors = new Color[width, height];
for (int xCounter = 0; xCounter < width; xCounter++)
{
var x = xCounter;
var task = Task.Run(() =>
{
for (int yCounter = 0; yCounter < height; yCounter++)
{
var y = yCounter;
var viewPortX = ((2 * x) / (float)width) - 1;
var viewPortY = ((2 * y) / (float)height) - 1;
var color = TraceRayAgainstScene(GetRay(viewPortX, viewPortY), scene);
colors[x, y] = color;
}
});
tasks.Add(task);
}
await Task.WhenAll(tasks);
// Copy all pixel data into bitmap.
for (int x = 0; x < width; x++)
{
for (int y = 0; y < height; y++)
{
bitmap.SetPixel(x, height - y - 1, colors[x, y]);
}
}
var after = DateTime.UtcNow;
System.Diagnostics.Debug.WriteLine("Total render time: " + (after - before).TotalMilliseconds + " ms");
return bitmap;
}