mirror of
https://github.com/Smaug123/ray-tracing-fsharp
synced 2025-10-05 03:48:40 +00:00
Remove most asyncs (#14)
This commit is contained in:
@@ -43,12 +43,14 @@ module SampleImages =
|
||||
}
|
||||
|
||||
let image =
|
||||
Array.init
|
||||
Seq.init
|
||||
256
|
||||
(fun height ->
|
||||
let output = Array.init 256 (fun i -> async { return pixelAt height i })
|
||||
progressIncrement 1.0<progress>
|
||||
output
|
||||
async {
|
||||
let output = Array.init 256 (pixelAt height)
|
||||
progressIncrement 1.0<progress>
|
||||
return output
|
||||
}
|
||||
)
|
||||
|> Image.make 256 256
|
||||
|
||||
|
@@ -16,24 +16,18 @@ module TestRayTracing =
|
||||
|
||||
let image =
|
||||
[|
|
||||
[| Colour.Red ; Colour.Green ; Colour.Blue |]
|
||||
[|
|
||||
async { return Colour.Red }
|
||||
async { return Colour.Green }
|
||||
async { return Colour.Blue }
|
||||
|]
|
||||
[|
|
||||
async {
|
||||
return
|
||||
{
|
||||
Red = 255uy
|
||||
Blue = 0uy
|
||||
Green = 255uy
|
||||
}
|
||||
{
|
||||
Red = 255uy
|
||||
Blue = 0uy
|
||||
Green = 255uy
|
||||
}
|
||||
async { return Colour.White }
|
||||
async { return Colour.Black }
|
||||
Colour.White
|
||||
Colour.Black
|
||||
|]
|
||||
|]
|
||||
|> Array.map async.Return
|
||||
|> Image.make 2 3
|
||||
|
||||
let outputFile = fs.Path.GetTempFileName () |> fs.FileInfo.FromFileName
|
||||
|
@@ -1,5 +1,6 @@
|
||||
namespace RayTracing
|
||||
|
||||
open System.Threading.Tasks
|
||||
open RayTracing
|
||||
|
||||
[<Measure>]
|
||||
@@ -8,7 +9,7 @@ type progress
|
||||
type Image =
|
||||
private
|
||||
{
|
||||
Rows : Pixel Async[] seq
|
||||
Rows : Async<Pixel[]> seq
|
||||
RowCount : int
|
||||
ColCount : int
|
||||
}
|
||||
@@ -19,34 +20,10 @@ module Image =
|
||||
|
||||
let colCount i = i.ColCount
|
||||
|
||||
let render (i : Image) : (Pixel * Async<unit>)[] seq =
|
||||
i.Rows
|
||||
|> Seq.map (fun imageRow ->
|
||||
if imageRow.Length <> i.ColCount then
|
||||
failwithf
|
||||
"Thought the image had %i columns, got a pixel array with %i columns"
|
||||
i.ColCount
|
||||
imageRow.Length
|
||||
let render (i : Image) : Pixel[][] Task =
|
||||
i.Rows |> Async.Parallel |> Async.StartAsTask
|
||||
|
||||
let outputRow = Array.zeroCreate<Pixel * Async<unit>> i.ColCount
|
||||
|
||||
let doIt =
|
||||
imageRow
|
||||
|> Array.mapi (fun i p ->
|
||||
async {
|
||||
let! pixel = p
|
||||
let _, a = outputRow.[i]
|
||||
outputRow.[i] <- pixel, a
|
||||
}
|
||||
)
|
||||
|
||||
for k in 0 .. i.ColCount - 1 do
|
||||
outputRow.[k] <- Unchecked.defaultof<_>, doIt.[k]
|
||||
|
||||
outputRow
|
||||
)
|
||||
|
||||
let make (rowCount : int) (colCount : int) (pixels : Async<Pixel>[] seq) : Image =
|
||||
let make (rowCount : int) (colCount : int) (pixels : Async<Pixel[]> seq) : Image =
|
||||
{
|
||||
RowCount = rowCount
|
||||
ColCount = colCount
|
||||
|
@@ -148,46 +148,28 @@ module ImageOutput =
|
||||
=
|
||||
let tempFile = fs.Path.GetTempFileName () |> fs.FileInfo.FromFileName
|
||||
|
||||
tempFile,
|
||||
task {
|
||||
use outputStream = tempFile.OpenWrite ()
|
||||
use enumerator = image.Rows.GetEnumerator ()
|
||||
let mutable rowNum = 0
|
||||
let task =
|
||||
async {
|
||||
use outputStream = tempFile.OpenWrite ()
|
||||
let! pixels = image.Rows |> Async.Parallel
|
||||
|
||||
while enumerator.MoveNext () do
|
||||
|
||||
let row = enumerator.Current
|
||||
|
||||
let! _ =
|
||||
pixels
|
||||
|> Array.iteri (fun rowNum row ->
|
||||
row
|
||||
|> Array.mapi (fun colNum pixel ->
|
||||
backgroundTask {
|
||||
let! pixel =
|
||||
match soFar.TryGetValue ((rowNum, colNum)) with
|
||||
| false, _ -> pixel
|
||||
| true, v -> async { return v }
|
||||
|
||||
lock
|
||||
outputStream
|
||||
(fun () ->
|
||||
writeAsciiInt outputStream rowNum
|
||||
outputStream.WriteByte 44uy // ','
|
||||
writeAsciiInt outputStream colNum
|
||||
outputStream.WriteByte 10uy // '\n'
|
||||
outputStream.WriteByte pixel.Red
|
||||
outputStream.WriteByte pixel.Green
|
||||
outputStream.WriteByte pixel.Blue
|
||||
)
|
||||
|
||||
incrementProgress 1.0<progress>
|
||||
return ()
|
||||
}
|
||||
|> Array.iteri (fun colNum pixel ->
|
||||
writeAsciiInt outputStream rowNum
|
||||
outputStream.WriteByte 44uy // ','
|
||||
writeAsciiInt outputStream colNum
|
||||
outputStream.WriteByte 10uy // '\n'
|
||||
outputStream.WriteByte pixel.Red
|
||||
outputStream.WriteByte pixel.Green
|
||||
outputStream.WriteByte pixel.Blue
|
||||
incrementProgress 1.0<progress>
|
||||
)
|
||||
|> Task.WhenAll
|
||||
|
||||
rowNum <- rowNum + 1
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
tempFile, Async.StartAsTask task
|
||||
|
||||
let writePpm
|
||||
(gammaCorrect : bool)
|
||||
|
@@ -213,21 +213,22 @@ module Scene =
|
||||
RowCount = rowsIter
|
||||
ColCount = colsIter
|
||||
Rows =
|
||||
Array.init
|
||||
Seq.init
|
||||
rowsIter
|
||||
(fun row ->
|
||||
let row = maxHeightCoord - row - 1
|
||||
|
||||
Array.init
|
||||
colsIter
|
||||
(fun col ->
|
||||
let col = col - maxWidthCoord
|
||||
async {
|
||||
return
|
||||
Array.init
|
||||
colsIter
|
||||
(fun col ->
|
||||
let col = col - maxWidthCoord
|
||||
|
||||
async {
|
||||
let ret = renderPixel print s rand camera maxWidthCoord maxHeightCoord row col
|
||||
progressIncrement 1.0<progress>
|
||||
return ret
|
||||
}
|
||||
)
|
||||
let ret = renderPixel print s rand camera maxWidthCoord maxHeightCoord row col
|
||||
progressIncrement 1.0<progress>
|
||||
ret
|
||||
)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
Reference in New Issue
Block a user