Clean up raytracer a bit
parent
20cc730501
commit
7ba28ac8d5
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
USING: arrays accessors float-arrays io io.files
|
USING: arrays accessors float-arrays io io.files
|
||||||
io.encodings.binary kernel math math.functions math.vectors
|
io.encodings.binary kernel math math.functions math.vectors
|
||||||
math.parser make sequences sequences.private words ;
|
math.parser make sequences sequences.private words hints ;
|
||||||
IN: benchmark.raytracer
|
IN: benchmark.raytracer
|
||||||
|
|
||||||
! parameters
|
! parameters
|
||||||
|
@ -38,34 +38,40 @@ TUPLE: sphere { center float-array read-only } { radius float read-only } ;
|
||||||
C: <sphere> sphere
|
C: <sphere> sphere
|
||||||
|
|
||||||
: sphere-v ( sphere ray -- v )
|
: sphere-v ( sphere ray -- v )
|
||||||
swap center>> swap orig>> v- ; inline
|
[ center>> ] [ orig>> ] bi* v- ; inline
|
||||||
|
|
||||||
: sphere-b ( ray v -- b ) swap dir>> v. ; inline
|
: sphere-b ( v ray -- b )
|
||||||
|
dir>> v. ; inline
|
||||||
|
|
||||||
: sphere-disc ( sphere v b -- d )
|
: sphere-d ( sphere b v -- d )
|
||||||
sq swap norm-sq - swap radius>> sq + ; inline
|
[ radius>> sq ] [ sq ] [ norm-sq ] tri* - + ; inline
|
||||||
|
|
||||||
: -+ ( x y -- x-y x+y ) [ - ] 2keep + ; inline
|
: -+ ( x y -- x-y x+y )
|
||||||
|
[ - ] [ + ] 2bi ; inline
|
||||||
|
|
||||||
: sphere-b/d ( b d -- t )
|
: sphere-t ( b d -- t )
|
||||||
-+ dup 0.0 <
|
-+ dup 0.0 <
|
||||||
[ 2drop 1.0/0.0 ] [ [ [ 0.0 > ] keep ] dip ? ] if ; inline
|
[ 2drop 1.0/0.0 ] [ [ [ 0.0 > ] keep ] dip ? ] if ; inline
|
||||||
|
|
||||||
: ray-sphere ( sphere ray -- t )
|
: sphere-b&v ( sphere ray -- b v )
|
||||||
2dup sphere-v tuck sphere-b [ sphere-disc ] keep
|
[ sphere-v ] [ nip ] 2bi
|
||||||
over 0.0 < [ 2drop 1.0/0.0 ] [ swap sqrt sphere-b/d ] if ;
|
[ sphere-b ] [ drop ] 2bi ; inline
|
||||||
inline
|
|
||||||
|
|
||||||
: sphere-n ( ray sphere l -- n )
|
: ray-sphere ( sphere ray -- t )
|
||||||
pick dir>> n*v swap center>> v- swap orig>> v+ ;
|
[ drop ] [ sphere-b&v ] 2bi
|
||||||
inline
|
[ drop ] [ sphere-d ] 3bi
|
||||||
|
dup 0.0 < [ 3drop 1/0. ] [ sqrt sphere-t nip ] if ; inline
|
||||||
|
|
||||||
: if-ray-sphere ( hit ray sphere quot -- hit )
|
: if-ray-sphere ( hit ray sphere quot -- hit )
|
||||||
#! quot: hit ray sphere l -- hit
|
#! quot: hit ray sphere l -- hit
|
||||||
[
|
[
|
||||||
pick lambda>> [ 2dup swap ray-sphere dup ] dip >=
|
[ ] [ swap ray-sphere nip ] [ 2drop lambda>> ] 3tri
|
||||||
[ 3drop ]
|
[ drop ] [ < ] 2bi
|
||||||
] dip if ; inline
|
] dip [ 3drop ] if ; inline
|
||||||
|
|
||||||
|
: sphere-n ( ray sphere l -- n )
|
||||||
|
[ [ orig>> ] [ dir>> ] bi ] [ center>> ] [ ] tri*
|
||||||
|
swap [ v*n ] dip v- v+ ; inline
|
||||||
|
|
||||||
M: sphere intersect-scene ( hit ray sphere -- hit )
|
M: sphere intersect-scene ( hit ray sphere -- hit )
|
||||||
[ [ sphere-n normalize ] keep <hit> nip ] if-ray-sphere ;
|
[ [ sphere-n normalize ] keep <hit> nip ] if-ray-sphere ;
|
||||||
|
@ -79,21 +85,17 @@ TUPLE: group < sphere { objs array read-only } ;
|
||||||
swap [ { } make ] dip <group> ; inline
|
swap [ { } make ] dip <group> ; inline
|
||||||
|
|
||||||
M: group intersect-scene ( hit ray group -- hit )
|
M: group intersect-scene ( hit ray group -- hit )
|
||||||
[
|
[ drop objs>> [ intersect-scene ] with each ] if-ray-sphere ;
|
||||||
drop
|
|
||||||
objs>> [ [ tuck ] dip intersect-scene swap ] each
|
|
||||||
drop
|
|
||||||
] if-ray-sphere ;
|
|
||||||
|
|
||||||
: initial-hit T{ hit f F{ 0.0 0.0 0.0 } 1.0/0.0 } ; inline
|
: initial-hit T{ hit f F{ 0.0 0.0 0.0 } 1/0. } ; inline
|
||||||
|
|
||||||
: initial-intersect ( ray scene -- hit )
|
: initial-intersect ( ray scene -- hit )
|
||||||
initial-hit -rot intersect-scene ; inline
|
[ initial-hit ] 2dip intersect-scene ; inline
|
||||||
|
|
||||||
: ray-o ( ray hit -- o )
|
: ray-o ( ray hit -- o )
|
||||||
over dir>> over lambda>> v*n
|
[ [ orig>> ] [ normal>> delta v*n ] bi* ]
|
||||||
swap normal>> delta v*n v+
|
[ [ dir>> ] [ lambda>> ] bi* v*n ]
|
||||||
swap orig>> v+ ; inline
|
2bi v+ v+ ; inline
|
||||||
|
|
||||||
: sray-intersect ( ray scene hit -- ray )
|
: sray-intersect ( ray scene hit -- ray )
|
||||||
swap [ ray-o light vneg <ray> ] dip initial-intersect ; inline
|
swap [ ray-o light vneg <ray> ] dip initial-intersect ; inline
|
||||||
|
@ -101,10 +103,10 @@ M: group intersect-scene ( hit ray group -- hit )
|
||||||
: ray-g ( hit -- g ) normal>> light v. ; inline
|
: ray-g ( hit -- g ) normal>> light v. ; inline
|
||||||
|
|
||||||
: cast-ray ( ray scene -- g )
|
: cast-ray ( ray scene -- g )
|
||||||
2dup initial-intersect dup lambda>> 1.0/0.0 = [
|
2dup initial-intersect dup lambda>> 1/0. = [
|
||||||
3drop 0.0
|
3drop 0.0
|
||||||
] [
|
] [
|
||||||
[ sray-intersect lambda>> 1.0/0.0 = ] keep swap
|
[ sray-intersect lambda>> 1/0. = ] keep swap
|
||||||
[ ray-g neg ] [ drop 0.0 ] if
|
[ ray-g neg ] [ drop 0.0 ] if
|
||||||
] if ; inline
|
] if ; inline
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue