Commit graph

23 commits

Author SHA1 Message Date
Bruno BELANYI 8e09f45f69 library: render: move helpers to utils module
Those helper functions are used by `Scene` to render the scene, but
they have no use being in the same file. Instead make it a crate-public
module of `render`.
2020-03-23 16:51:06 +01:00
Bruno BELANYI 70c0e0cdf3 library: render: scene: handle refraction cleanly
The refraction information was incorrect in the previous implementation.
We never updated the medium information when going out of a transparent
material. It is now handled using a small structure holding both the old
index, and new_index.

We can now handle any number of successive medium changes, with the
associated change of indices correctly.

This implementation assumes that any ray going into an object is going
to come out in the same medium that it was originally travelling in
before entering said object. This is an acceptable approximation to me.
2020-03-23 16:49:55 +01:00
Bruno BELANYI 6af36d814f library: render: scene: cleanup refracted calculation 2020-03-23 16:49:55 +01:00
Bruno BELANYI 16066a3c7d library: render: scene: normalize vectors 2020-03-23 16:49:55 +01:00
Bruno BELANYI fccf3caef1 library: render: scene: clean-up ReflTrans handling 2020-03-23 16:49:55 +01:00
Bruno BELANYI b29e6d1613 library: render: scene: fix reflection handling
The reflection will be calculated even if it ends up not contributing to
the final color of an object. This allows for a more systematic use of
coefficients without applying them twice, like it was done for the
refraction transparency handling...
2020-03-23 16:49:55 +01:00
Antoine Martin 64125dbc43 library: document render module 2020-03-23 12:44:17 +01:00
Antoine Martin db3ba1b312 library: render: scene: use iterators for cast_ray 2020-03-20 00:47:25 +01:00
Bruno BELANYI 40c2ae1bc9 library: render: scene: more like-like refractions
The refractions are now implemented using the Fresnel equations to take
into account the amount of light that is reflected off of transparent
surfaces.

For example, this leads to a small amount of discoloring at the edges of
the ball in the example scene. Indeed, this ball has a refractive index
higher than diamond (!), so its edges reflect light much more than when
looking at it dead-center.
2020-03-19 19:12:40 +01:00
Bruno BELANYI 552c0cb966 library: implement refraction
This necessitated to rework how light properties for a material were
given. A material can have either reflectivity or transparency. This
changes the parsing of materials, using a `LightProperty` structure at
its core.

This is does not implement the true Fresnel equations to take into
account the amount of reflection that an incident goes through when
encountering a transparent object.
2020-03-19 18:23:20 +01:00
Bruno BELANYI e00950c7e5 library: render: scene: fix spatial lighting
The spatial lighting did not take into account the object's color when
calculating the amount of diffuse and specular light that was emitted.
2020-03-19 18:22:31 +01:00
Bruno BELANYI 9857879a75 library: render: scene: optional deserialization 2020-03-19 13:03:39 +01:00
Bruno BELANYI e3ebd1c977 library: render: scene: add progress bar 2020-03-19 00:16:24 +01:00
Bruno BELANYI e11598fc9c library: render: scene: clamp colors before sum
This was a recurring bug in a previous implementation, clamping the
colors before taking the sum of a series of calculations avoid adding a
negative value to a positive one and getting a result which does not
make sense.
2020-03-18 23:20:09 +01:00
Bruno BELANYI 563a793273 library: refactorize light properties handling
Instead of having a method per property, compute them all at once and
use them throughout the rendering pipeline.
2020-03-18 22:46:33 +01:00
Bruno BELANYI 3257598913 library: render: scene: use rayon scope parallelism
The implementation was very easy to write, but is not yet optimal. It
would be better to use `join` to divide into tasks directly on the
stack. And it would be better to iterate over entire blocks of rows
instead of giving a row per-thread: this would lead to better cache-line
behaviour with the fully linear memory accesses.
2020-03-18 19:17:26 +01:00
Bruno BELANYI ca21cf06c2 library: render: scene: use BVH 2020-03-18 18:20:46 +01:00
Bruno BELANYI eca5ec5c26 library: render: scene: deserialize w/ indirection 2020-03-18 18:20:20 +01:00
Bruno BELANYI a8d23782a4 library: render: scene: add deserialization 2020-03-18 15:53:33 +01:00
Bruno BELANYI c8ca438091 library: core: scene: derive Debug and PartialEq 2020-03-18 15:53:25 +01:00
Bruno BELANYI 05fb6601b2 library: use enum_dispatch on Object related trait
This allows for easier testing (notable allowing for comparisons),
better performance (thanks to inlining instead of vtable indirection),
and should ease the deserialization of `Material`, `Shape`, and
`Texture` traits. This should allow `Object` to be deserialized easily.
2020-03-18 15:24:09 +01:00
Bruno BELANYI 3386617c69 library: render: scene: add reflection
This required changing the place were the normal, the texel projection,
and the reflection were calculated to avoid possibly expensive lookups.

I also changed the style a bit to make it more readable.
2020-03-18 00:17:03 +01:00
Bruno BELANYI 6a829a96fd library: render: add Scene implementation 2020-03-18 00:08:23 +01:00