From 9f436d9728c85b32c85c99c1e3065c3f4e16a967 Mon Sep 17 00:00:00 2001 From: Kiana Sheibani Date: Tue, 29 Nov 2022 13:45:04 -0500 Subject: [PATCH 01/10] Update .gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 26223c6..b34cafa 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,5 @@ build/ *.*~ + +**/.ds-store From 7e4888af48fa9dbab7c883b3161a3a4db2d61f2e Mon Sep 17 00:00:00 2001 From: Kiana Sheibani Date: Tue, 29 Nov 2022 13:46:09 -0500 Subject: [PATCH 02/10] Update .gitignore --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index b34cafa..3341ed1 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,4 @@ build/ *.*~ -**/.ds-store +**/.DS_Store From 454deed731bab95fc879f0f71cf798ecb26456d7 Mon Sep 17 00:00:00 2001 From: Kiana Sheibani Date: Wed, 30 Nov 2022 08:39:43 -0500 Subject: [PATCH 03/10] Fill out core architecture --- src/Render/Camera.idr | 22 ++++++++++++++++++++++ src/Render/Color.idr | 10 ++++++++++ src/Render/Object.idr | 17 +++++++++++++++++ src/Render/Object/Point.idr | 23 +++++++++++++++++++++++ src/Render/Scene.idr | 25 +++++++++++++++++++++++++ 5 files changed, 97 insertions(+) create mode 100644 src/Render/Camera.idr create mode 100644 src/Render/Color.idr create mode 100644 src/Render/Object.idr create mode 100644 src/Render/Object/Point.idr create mode 100644 src/Render/Scene.idr diff --git a/src/Render/Camera.idr b/src/Render/Camera.idr new file mode 100644 index 0000000..d2e0ff7 --- /dev/null +++ b/src/Render/Camera.idr @@ -0,0 +1,22 @@ +module Render.Camera + +import Data.Nat +import Render.Color + +%default total + +public export +record Camera where + constructor MkCamera + center : (Double, Double) + scenew, sceneh : Double + pixw, pixh : Nat + + +export +pointToPix : Camera -> (Double, Double) -> (Integer, Integer) +pointToPix (MkCamera (cx,cy) sw sh pw ph) (x,y) = + let pw' = cast pw + ph' = cast ph + in (cast ((x - cx) / sw * pw' + pw' / 2), + cast ((y - cy) / sh * ph' + ph' / 2)) diff --git a/src/Render/Color.idr b/src/Render/Color.idr new file mode 100644 index 0000000..04d7d40 --- /dev/null +++ b/src/Render/Color.idr @@ -0,0 +1,10 @@ +module Render.Color + +import Data.Vect + +%default total + + +public export +Color : Type +Color = Vect 4 Bits8 diff --git a/src/Render/Object.idr b/src/Render/Object.idr new file mode 100644 index 0000000..0eeab5a --- /dev/null +++ b/src/Render/Object.idr @@ -0,0 +1,17 @@ +module Render.Object + +import Data.Vect +import Render.Camera +import Render.Color + +%default total + + +public export +interface Object' obj where + draw : obj -> Camera -> List (Integer, Integer, Color) + + +export +data Object : Type where + MkObject : Object' obj => obj -> Object diff --git a/src/Render/Object/Point.idr b/src/Render/Object/Point.idr new file mode 100644 index 0000000..c6f3e24 --- /dev/null +++ b/src/Render/Object/Point.idr @@ -0,0 +1,23 @@ +module Render.Object.Point + +import Data.Vect +import Render.Color +import Render.Camera +import Render.Picture +import Render.Object + +%default total + + + +public export +record Point where + constructor MkPoint + pos : (Double, Double) + color : Color + + +Object' Point where + draw (MkPoint pos col) cam = + let (px,py) = pointToPix cam pos + in [(px,py,col)] diff --git a/src/Render/Scene.idr b/src/Render/Scene.idr new file mode 100644 index 0000000..df1e4d3 --- /dev/null +++ b/src/Render/Scene.idr @@ -0,0 +1,25 @@ +module Render.Scene + +import Data.Vect +import Render.Color +import Render.Camera +import Render.Object + +%default total + + +public export +record Scene where + constructor MkScene + + camera : Camera + objects : List Object + bgcolor : Vect 3 Bits8 + + +public export +PictureType : Scene -> Type +PictureType sc = Vect sc.camera.pixh (Vect sc.camera.pixw (Vect 3 Bits8)) + + + From f3bda5d40c1e6126fa4443b814a7a7f875f2959e Mon Sep 17 00:00:00 2001 From: Kiana Sheibani Date: Wed, 30 Nov 2022 09:50:41 -0500 Subject: [PATCH 04/10] Add separate color type for alpha --- src/Render/Color.idr | 15 ++++++++++++++- src/Render/Object.idr | 4 ++-- src/Render/Object/Point.idr | 3 ++- src/Render/Scene.idr | 4 +--- 4 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/Render/Color.idr b/src/Render/Color.idr index 04d7d40..2ad4f5b 100644 --- a/src/Render/Color.idr +++ b/src/Render/Color.idr @@ -7,4 +7,17 @@ import Data.Vect public export Color : Type -Color = Vect 4 Bits8 +Color = Vect 3 Double + +public export +ColorAlpha : Type +ColorAlpha = Vect 4 Double + +export +withAlpha : Double -> Color -> ColorAlpha +withAlpha a [r,g,b] = [r,g,b,a] + +export +toAlpha : Color -> ColorAlpha +toAlpha = withAlpha 1 + diff --git a/src/Render/Object.idr b/src/Render/Object.idr index 0eeab5a..59d4652 100644 --- a/src/Render/Object.idr +++ b/src/Render/Object.idr @@ -9,9 +9,9 @@ import Render.Color public export interface Object' obj where - draw : obj -> Camera -> List (Integer, Integer, Color) + draw : obj -> Camera -> List (Integer, Integer, ColorAlpha) -export +public export data Object : Type where MkObject : Object' obj => obj -> Object diff --git a/src/Render/Object/Point.idr b/src/Render/Object/Point.idr index c6f3e24..b4355ca 100644 --- a/src/Render/Object/Point.idr +++ b/src/Render/Object/Point.idr @@ -14,9 +14,10 @@ public export record Point where constructor MkPoint pos : (Double, Double) - color : Color + color : ColorAlpha +export Object' Point where draw (MkPoint pos col) cam = let (px,py) = pointToPix cam pos diff --git a/src/Render/Scene.idr b/src/Render/Scene.idr index df1e4d3..87a9451 100644 --- a/src/Render/Scene.idr +++ b/src/Render/Scene.idr @@ -11,10 +11,8 @@ import Render.Object public export record Scene where constructor MkScene - - camera : Camera objects : List Object - bgcolor : Vect 3 Bits8 + bgcolor : Color public export From 8660bde83f3f78487fc9a7c6fb0f2c1e9a30bbd1 Mon Sep 17 00:00:00 2001 From: Kiana Sheibani Date: Wed, 30 Nov 2022 09:51:24 -0500 Subject: [PATCH 05/10] Implement core renderer --- src/Render/Camera.idr | 8 +++++++- src/Render/Color.idr | 7 +++++++ src/Render/Scene.idr | 18 ++++++++++++++---- 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/src/Render/Camera.idr b/src/Render/Camera.idr index d2e0ff7..e6f8f65 100644 --- a/src/Render/Camera.idr +++ b/src/Render/Camera.idr @@ -1,6 +1,6 @@ module Render.Camera -import Data.Nat +import Data.Vect import Render.Color %default total @@ -13,6 +13,12 @@ record Camera where pixw, pixh : Nat + +public export +PictureType : Camera -> Type +PictureType cam = Vect cam.pixh (Vect cam.pixw Color) + + export pointToPix : Camera -> (Double, Double) -> (Integer, Integer) pointToPix (MkCamera (cx,cy) sw sh pw ph) (x,y) = diff --git a/src/Render/Color.idr b/src/Render/Color.idr index 2ad4f5b..030a3d3 100644 --- a/src/Render/Color.idr +++ b/src/Render/Color.idr @@ -21,3 +21,10 @@ export toAlpha : Color -> ColorAlpha toAlpha = withAlpha 1 + +export +over : ColorAlpha -> Color -> Color +over [r,g,b,a] [r',g',b'] = + [r * a + r' * (1 - a), + g * a + g' * (1 - a), + b * a + b' * (1 - a)] diff --git a/src/Render/Scene.idr b/src/Render/Scene.idr index 87a9451..63a520f 100644 --- a/src/Render/Scene.idr +++ b/src/Render/Scene.idr @@ -16,8 +16,18 @@ record Scene where public export -PictureType : Scene -> Type -PictureType sc = Vect sc.camera.pixh (Vect sc.camera.pixw (Vect 3 Bits8)) - - +render : (cam : Camera) -> Scene -> PictureType cam +render cam sc = + let blank : PictureType cam = replicate _ (replicate _ sc.bgcolor) + in foldl drawObject blank sc.objects + where + drawPixel : (Integer, Integer, ColorAlpha) -> PictureType cam -> PictureType cam + drawPixel (x, y, col) pic = fromMaybe pic $ do + x' <- integerToFin x cam.pixw + y' <- integerToFin y cam.pixh + pure $ updateAt y' (updateAt x' (over col)) pic + drawObject : PictureType cam -> Object -> PictureType cam + drawObject pic (MkObject obj) = + let pixs = draw obj cam + in foldr drawPixel pic pixs From ef52a8f702952a8398d17ca7e0c895bcdacbb7b1 Mon Sep 17 00:00:00 2001 From: Kiana Sheibani Date: Wed, 30 Nov 2022 12:56:52 -0500 Subject: [PATCH 06/10] Add PPM image exporting --- .gitignore | 6 ++++++ src/Render/Object.idr | 10 +++------- src/Render/Object/Interface.idr | 11 +++++++++++ src/Render/Object/Point.idr | 5 ++--- src/Render/Scene.idr | 28 +++++++++++++++++++++++++++- 5 files changed, 49 insertions(+), 11 deletions(-) create mode 100644 src/Render/Object/Interface.idr diff --git a/.gitignore b/.gitignore index 3341ed1..2243e3f 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,9 @@ build/ *.*~ **/.DS_Store + +# Ignore output images +*.ppm +*.png +*.jpg +*.gif diff --git a/src/Render/Object.idr b/src/Render/Object.idr index 59d4652..be6ccc5 100644 --- a/src/Render/Object.idr +++ b/src/Render/Object.idr @@ -3,15 +3,11 @@ module Render.Object import Data.Vect import Render.Camera import Render.Color +import public Render.Object.Interface +import public Render.Object.Point %default total - -public export -interface Object' obj where - draw : obj -> Camera -> List (Integer, Integer, ColorAlpha) - - public export data Object : Type where - MkObject : Object' obj => obj -> Object + MkObject : IsObject obj => obj -> Object diff --git a/src/Render/Object/Interface.idr b/src/Render/Object/Interface.idr new file mode 100644 index 0000000..ee8d7d7 --- /dev/null +++ b/src/Render/Object/Interface.idr @@ -0,0 +1,11 @@ +module Render.Object.Interface + +import Data.Vect +import Render.Color +import Render.Camera + +%default total + +public export +interface IsObject obj where + draw : obj -> Camera -> List (Integer, Integer, ColorAlpha) diff --git a/src/Render/Object/Point.idr b/src/Render/Object/Point.idr index b4355ca..70bab8b 100644 --- a/src/Render/Object/Point.idr +++ b/src/Render/Object/Point.idr @@ -4,12 +4,11 @@ import Data.Vect import Render.Color import Render.Camera import Render.Picture -import Render.Object +import Render.Object.Interface %default total - public export record Point where constructor MkPoint @@ -18,7 +17,7 @@ record Point where export -Object' Point where +IsObject Point where draw (MkPoint pos col) cam = let (px,py) = pointToPix cam pos in [(px,py,col)] diff --git a/src/Render/Scene.idr b/src/Render/Scene.idr index 63a520f..eaaaa5b 100644 --- a/src/Render/Scene.idr +++ b/src/Render/Scene.idr @@ -1,6 +1,9 @@ module Render.Scene +import Data.DPair import Data.Vect +import Data.Buffer +import System.File import Render.Color import Render.Camera import Render.Object @@ -15,7 +18,7 @@ record Scene where bgcolor : Color -public export +export render : (cam : Camera) -> Scene -> PictureType cam render cam sc = let blank : PictureType cam = replicate _ (replicate _ sc.bgcolor) @@ -31,3 +34,26 @@ render cam sc = drawObject pic (MkObject obj) = let pixs = draw obj cam in foldr drawPixel pic pixs + + +export +renderToPPM : HasIO io => (dest : String) -> Camera -> Scene -> io (Either FileError ()) +renderToPPM dest cam sc = do + let bufsize = cast cam.pixw * cast cam.pixh * 3 + Just buf <- newBuffer bufsize + | Nothing => pure $ Right () + + let pic = render cam sc + for_ (zip (tabulate fst) (concat pic)) $ \(i,[r,g,b]) => do + setByte buf (cast i * 3) (cast $ r * 255) + setByte buf (cast i * 3 + 1) (cast $ g * 255) + setByte buf (cast i * 3 + 2) (cast $ b * 255) + + _ <- if !(exists dest) then removeFile {io} dest else pure $ Right () + Right h <- openFile dest Append + | Left err => pure $ Left err + Right () <- fPutStrLn h "P6\n\{show cam.pixw} \{show cam.pixh}\n255" + | Left err => pure $ Left err + Right () <- writeBufferData h buf 0 bufsize + | Left (err,_) => pure $ Left err + pure $ Right () From fb18cce4ec89cb9701111f1d801d435bf6aab265 Mon Sep 17 00:00:00 2001 From: Kiana Sheibani Date: Wed, 30 Nov 2022 14:52:35 -0500 Subject: [PATCH 07/10] Refactor code that was causing massive slowdown I don't know why I thought it was a good idea to use `concat`, but I'm not making that mistake again. --- src/Render/Scene.idr | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/Render/Scene.idr b/src/Render/Scene.idr index eaaaa5b..4794412 100644 --- a/src/Render/Scene.idr +++ b/src/Render/Scene.idr @@ -2,6 +2,7 @@ module Render.Scene import Data.DPair import Data.Vect +import Data.IORef import Data.Buffer import System.File import Render.Color @@ -44,10 +45,14 @@ renderToPPM dest cam sc = do | Nothing => pure $ Right () let pic = render cam sc - for_ (zip (tabulate fst) (concat pic)) $ \(i,[r,g,b]) => do - setByte buf (cast i * 3) (cast $ r * 255) - setByte buf (cast i * 3 + 1) (cast $ g * 255) - setByte buf (cast i * 3 + 2) (cast $ b * 255) + ind <- newIORef 0 + for_ pic $ traverse_ $ \[r,g,b] => do + i <- readIORef ind + setByte buf (i) (cast $ r * 255) + setByte buf (i + 1) (cast $ g * 255) + setByte buf (i + 2) (cast $ b * 255) + modifyIORef ind (+3) + _ <- if !(exists dest) then removeFile {io} dest else pure $ Right () Right h <- openFile dest Append From f5edad4b66a69eda9a72c57e84ed7106a5ee7731 Mon Sep 17 00:00:00 2001 From: Kiana Sheibani Date: Wed, 30 Nov 2022 15:52:47 -0500 Subject: [PATCH 08/10] Add Rectangle object --- src/Render/Color.idr | 1 + src/Render/Object.idr | 1 + src/Render/Object/Point.idr | 1 - src/Render/Object/Rectangle.idr | 25 +++++++++++++++++++++++++ 4 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 src/Render/Object/Rectangle.idr diff --git a/src/Render/Color.idr b/src/Render/Color.idr index 030a3d3..ad62b74 100644 --- a/src/Render/Color.idr +++ b/src/Render/Color.idr @@ -13,6 +13,7 @@ public export ColorAlpha : Type ColorAlpha = Vect 4 Double + export withAlpha : Double -> Color -> ColorAlpha withAlpha a [r,g,b] = [r,g,b,a] diff --git a/src/Render/Object.idr b/src/Render/Object.idr index be6ccc5..bef533e 100644 --- a/src/Render/Object.idr +++ b/src/Render/Object.idr @@ -5,6 +5,7 @@ import Render.Camera import Render.Color import public Render.Object.Interface import public Render.Object.Point +import public Render.Object.Rectangle %default total diff --git a/src/Render/Object/Point.idr b/src/Render/Object/Point.idr index 70bab8b..fa3a548 100644 --- a/src/Render/Object/Point.idr +++ b/src/Render/Object/Point.idr @@ -3,7 +3,6 @@ module Render.Object.Point import Data.Vect import Render.Color import Render.Camera -import Render.Picture import Render.Object.Interface %default total diff --git a/src/Render/Object/Rectangle.idr b/src/Render/Object/Rectangle.idr new file mode 100644 index 0000000..a7093f1 --- /dev/null +++ b/src/Render/Object/Rectangle.idr @@ -0,0 +1,25 @@ +module Render.Object.Rectangle + +import Data.Vect +import Render.Color +import Render.Camera +import Render.Object.Interface + +%default total + + +public export +record Rectangle where + constructor MkRect + pos : (Double, Double) + width, height : Double + color : ColorAlpha + + +export +IsObject Rectangle where + draw (MkRect pos w h col) cam = + let (px,py) = pointToPix cam pos + pw = cast (w / cam.scenew * cast cam.pixw) + ph = cast (h / cam.sceneh * cast cam.pixh) + in (,,col) <$> [px..px+pw-1] <*> [py..py+ph-1] From 68a401fa1da18c6b3024297882b326fb62f86d74 Mon Sep 17 00:00:00 2001 From: Kiana Sheibani Date: Wed, 30 Nov 2022 22:45:39 -0500 Subject: [PATCH 09/10] Add NumIdr as a dependency --- render.ipkg | 9 +++++++++ src/Render/Camera.idr | 16 ++++++++-------- src/Render/Color.idr | 17 +++++------------ src/Render/Object.idr | 2 +- src/Render/Object/Point.idr | 7 ++++--- src/Render/Object/Rectangle.idr | 25 ------------------------- src/Render/Scene.idr | 25 +++++++++++-------------- 7 files changed, 38 insertions(+), 63 deletions(-) delete mode 100644 src/Render/Object/Rectangle.idr diff --git a/render.ipkg b/render.ipkg index afce705..4be97bd 100644 --- a/render.ipkg +++ b/render.ipkg @@ -8,3 +8,12 @@ langversion >= 0.5.1 sourcedir = "src" readme = "README.md" + +depends = numidr >= 0.2.1 + +modules = Render.Color, + Render.Camera, + Render.Object, + Render.Scene, + Render.Object.Interface, + Render.Object.Point diff --git a/src/Render/Camera.idr b/src/Render/Camera.idr index e6f8f65..197138f 100644 --- a/src/Render/Camera.idr +++ b/src/Render/Camera.idr @@ -1,6 +1,7 @@ module Render.Camera import Data.Vect +import Data.NumIdr import Render.Color %default total @@ -8,7 +9,8 @@ import Render.Color public export record Camera where constructor MkCamera - center : (Double, Double) + matrix : Rigid 2 Double + scenew, sceneh : Double pixw, pixh : Nat @@ -16,13 +18,11 @@ record Camera where public export PictureType : Camera -> Type -PictureType cam = Vect cam.pixh (Vect cam.pixw Color) +PictureType cam = Array [cam.pixh, cam.pixw, 3] Double export -pointToPix : Camera -> (Double, Double) -> (Integer, Integer) -pointToPix (MkCamera (cx,cy) sw sh pw ph) (x,y) = - let pw' = cast pw - ph' = cast ph - in (cast ((x - cx) / sw * pw' + pw' / 2), - cast ((y - cy) / sh * ph' + ph' / 2)) +pointToPix : Camera -> Point 2 Double -> Point 2 Integer +pointToPix (MkCamera mat sw sh pw ph) p = + let p' = applyInv mat p + in point [cast (p'.x / sw * cast pw), cast (p'.y / sh * cast ph)] diff --git a/src/Render/Color.idr b/src/Render/Color.idr index ad62b74..0e02273 100644 --- a/src/Render/Color.idr +++ b/src/Render/Color.idr @@ -1,31 +1,24 @@ module Render.Color import Data.Vect +import Data.NumIdr %default total public export Color : Type -Color = Vect 3 Double +Color = Vector 3 Double public export ColorAlpha : Type -ColorAlpha = Vect 4 Double - - -export -withAlpha : Double -> Color -> ColorAlpha -withAlpha a [r,g,b] = [r,g,b,a] +ColorAlpha = (Vector 3 Double, Double) export toAlpha : Color -> ColorAlpha -toAlpha = withAlpha 1 +toAlpha = (,1) export over : ColorAlpha -> Color -> Color -over [r,g,b,a] [r',g',b'] = - [r * a + r' * (1 - a), - g * a + g' * (1 - a), - b * a + b' * (1 - a)] +over (ca,a) cb = lerp a cb ca diff --git a/src/Render/Object.idr b/src/Render/Object.idr index bef533e..9ca55c3 100644 --- a/src/Render/Object.idr +++ b/src/Render/Object.idr @@ -5,10 +5,10 @@ import Render.Camera import Render.Color import public Render.Object.Interface import public Render.Object.Point -import public Render.Object.Rectangle %default total + public export data Object : Type where MkObject : IsObject obj => obj -> Object diff --git a/src/Render/Object/Point.idr b/src/Render/Object/Point.idr index fa3a548..2ab7e7f 100644 --- a/src/Render/Object/Point.idr +++ b/src/Render/Object/Point.idr @@ -1,6 +1,7 @@ module Render.Object.Point import Data.Vect +import Data.NumIdr import Render.Color import Render.Camera import Render.Object.Interface @@ -11,12 +12,12 @@ import Render.Object.Interface public export record Point where constructor MkPoint - pos : (Double, Double) + pos : Point 2 Double color : ColorAlpha export IsObject Point where draw (MkPoint pos col) cam = - let (px,py) = pointToPix cam pos - in [(px,py,col)] + let p = pointToPix cam pos + in [(p.x,p.y,col)] diff --git a/src/Render/Object/Rectangle.idr b/src/Render/Object/Rectangle.idr deleted file mode 100644 index a7093f1..0000000 --- a/src/Render/Object/Rectangle.idr +++ /dev/null @@ -1,25 +0,0 @@ -module Render.Object.Rectangle - -import Data.Vect -import Render.Color -import Render.Camera -import Render.Object.Interface - -%default total - - -public export -record Rectangle where - constructor MkRect - pos : (Double, Double) - width, height : Double - color : ColorAlpha - - -export -IsObject Rectangle where - draw (MkRect pos w h col) cam = - let (px,py) = pointToPix cam pos - pw = cast (w / cam.scenew * cast cam.pixw) - ph = cast (h / cam.sceneh * cast cam.pixh) - in (,,col) <$> [px..px+pw-1] <*> [py..py+ph-1] diff --git a/src/Render/Scene.idr b/src/Render/Scene.idr index 4794412..b9e3b81 100644 --- a/src/Render/Scene.idr +++ b/src/Render/Scene.idr @@ -5,6 +5,7 @@ import Data.Vect import Data.IORef import Data.Buffer import System.File +import Data.NumIdr import Render.Color import Render.Camera import Render.Object @@ -21,17 +22,15 @@ record Scene where export render : (cam : Camera) -> Scene -> PictureType cam -render cam sc = - let blank : PictureType cam = replicate _ (replicate _ sc.bgcolor) - in foldl drawObject blank sc.objects +render cam sc = joinAxes $ foldl drawObject (repeat _ sc.bgcolor) sc.objects where - drawPixel : (Integer, Integer, ColorAlpha) -> PictureType cam -> PictureType cam - drawPixel (x, y, col) pic = fromMaybe pic $ do - x' <- integerToFin x cam.pixw - y' <- integerToFin y cam.pixh - pure $ updateAt y' (updateAt x' (over col)) pic + drawPixel : (Integer, Integer, ColorAlpha) -> Array [cam.pixh, cam.pixw] Color -> Array [cam.pixh, cam.pixw] Color + drawPixel (x, y, col) arr = fromMaybe arr $ do + x' <- integerToFin x _ + y' <- integerToFin y _ + pure $ indexUpdate [x',y'] (over col) arr - drawObject : PictureType cam -> Object -> PictureType cam + drawObject : Array [cam.pixh, cam.pixw] Color -> Object -> Array [cam.pixh, cam.pixw] Color drawObject pic (MkObject obj) = let pixs = draw obj cam in foldr drawPixel pic pixs @@ -46,12 +45,10 @@ renderToPPM dest cam sc = do let pic = render cam sc ind <- newIORef 0 - for_ pic $ traverse_ $ \[r,g,b] => do + for_ pic $ \x => do i <- readIORef ind - setByte buf (i) (cast $ r * 255) - setByte buf (i + 1) (cast $ g * 255) - setByte buf (i + 2) (cast $ b * 255) - modifyIORef ind (+3) + setByte buf i (cast $ x * 255) + modifyIORef ind (+1) _ <- if !(exists dest) then removeFile {io} dest else pure $ Right () From 2628b42a54ae36ac4706114ed7a0abb6d52eefd5 Mon Sep 17 00:00:00 2001 From: Kiana Sheibani Date: Thu, 1 Dec 2022 08:43:57 -0500 Subject: [PATCH 10/10] Fix rendering bugs --- src/Render/Camera.idr | 6 ++++-- src/Render/Scene.idr | 3 +-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/Render/Camera.idr b/src/Render/Camera.idr index 197138f..c1627d7 100644 --- a/src/Render/Camera.idr +++ b/src/Render/Camera.idr @@ -24,5 +24,7 @@ PictureType cam = Array [cam.pixh, cam.pixw, 3] Double export pointToPix : Camera -> Point 2 Double -> Point 2 Integer pointToPix (MkCamera mat sw sh pw ph) p = - let p' = applyInv mat p - in point [cast (p'.x / sw * cast pw), cast (p'.y / sh * cast ph)] + let pw' = cast pw + ph' = cast ph + p' = applyInv mat p + in point [cast (p'.x / sw * pw' + pw' / 2), cast (p'.y / sh * ph' + ph' / 2)] diff --git a/src/Render/Scene.idr b/src/Render/Scene.idr index b9e3b81..cd9a9d1 100644 --- a/src/Render/Scene.idr +++ b/src/Render/Scene.idr @@ -28,7 +28,7 @@ render cam sc = joinAxes $ foldl drawObject (repeat _ sc.bgcolor) sc.objects drawPixel (x, y, col) arr = fromMaybe arr $ do x' <- integerToFin x _ y' <- integerToFin y _ - pure $ indexUpdate [x',y'] (over col) arr + pure $ indexUpdate [y',x'] (over col) arr drawObject : Array [cam.pixh, cam.pixw] Color -> Object -> Array [cam.pixh, cam.pixw] Color drawObject pic (MkObject obj) = @@ -50,7 +50,6 @@ renderToPPM dest cam sc = do setByte buf i (cast $ x * 255) modifyIORef ind (+1) - _ <- if !(exists dest) then removeFile {io} dest else pure $ Right () Right h <- openFile dest Append | Left err => pure $ Left err