summaryrefslogtreecommitdiff
path: root/src/modules/ray/ray.c
AgeCommit message (Collapse)Author
2019-11-23rototiller: pass num_cpus to .create_context()Vito Caputo
Back in the day, there was no {create,destroy}_context(), so passing num_cpus to just prepare_frame made sense. Modules then would implicitly initialize themselves on the first prepare_frame() call using a static initialized variable. Since then things have been decomposed a bit for more sophisticated (and cleaner) modules. It can be necessary to allocate per-cpu data structures and the natural place to do that is @ create_context(). So this commit wires that up. A later commit will probably have to plumb a "current cpu" identifier into the render_fragment() function. Because a per-cpu data structure isn't particularly useful if you can't easily address it from within your execution context.
2019-11-13ray: add rudimentary gamma correctionVito Caputo
color banding has been quite visible, and somewhat expected with a direct conversion from the linear float color space to the 8-bit integral rgb color components. A simple lookup table is used here to non-linearly map the values, table generation is taken from Greg Ward's REAL PIXELS gem in Graphics Gems II.
2018-03-19modules/ray: #include libray headers w/subdirsVito Caputo
Rather than require adding -Isrc/libs/$lib to every Makefile.am for every lib used, just add -Ilibs to those makefiles and prefix the lib dir in the #include <> header paths. Later I'll probably just move the -Isrc/libs someplace common so the per-module Makefile.am doesn't need to bother with this stuff.
2018-02-28ray: implement distance-based light brightnessVito Caputo
2017-12-10ray: split scene data from render stateVito Caputo
This introduces ray_render_t, and ray_render.[ch]. The _prepared member of ray_scene_t has been moved to ray_render_t, and the other _prepared members (e.g. objects) will follow. Up until now I've just been sticking the precomputed state under _prepared members of their associated structures, and simply using convention to enforce anything resembling an api boundary. It's been convenient without being inefficient, but I'd like to move the ray code into more of a reusable library and this wart needs to be addressed. The render state is also where any spatial indexes will be built and maintained, another thing I've been experimenting with. Note most of the churn here is just renaming ray_scene.c to ray_render.c. A nearly global s/ray_scene/ray_render/ has occurred, now that ray_scene_t really only serves as glue to bind objects, lights, and scene-global properties into a cohesive unit.
2017-12-10ray: add module context ray_context_tVito Caputo
Before I can clean up the ray_scene_t._prepared kludge I need a place to keep state from frame prepare to render, enter context. Future commits will migrate the _prepared stuff into a separate ray_render_t which is constructed on prepare then acted on in fragment render. Then spatial acceleration structures may be added, constructed at prepare phase and shared across the concurrent rendering.
2017-12-10ray: trivial formatting changesVito Caputo
Remove some extraneous indentation
2017-09-14ray: switch to the tiling fragmenterVito Caputo
2017-09-14*: use fragment generatorVito Caputo
Rather than laying out all fragments in a frame up-front in ray_module_t.prepare_frame(), return a fragment generator (rototiller_fragmenter_t) which produces the numbered fragment as needed. This removes complexity from the serially-executed prepare_frame() and allows the individual fragments to be computed in parallel by the different threads. It also eliminates the need for a fragments array in the rototiller_frame_t, indeed rototiller_frame_t is eliminated altogether.
2017-09-14ray: simplify object iterators using sentinel typeVito Caputo
Trivial optimization eliminates some instructions from the hot path, no need to maintain a separate index from the current object pointer.
2017-09-13ray: cleanup ray_camera_frame_t fragmentsVito Caputo
Previously every fb_fragment_t (and thus thread) was constructing its own ray_camera_frame_t view into the scene, duplicating some work. Instead introduce ray_camera_fragment_t to encapsulate the truly per-fragment state and make ray_scene_render_fragment() operate on just this stuff with a reference to a shared ray_camera_frame_t prepared once per-frame. Some minor ray_camera.c cleanups sneak in as well (prefer multiply instead of divide, whitespace cleanups...)
2017-08-15ray: misc computational fixupsVito Caputo
ray:object intersection coordinates were incorrectly being computed relative to the ray origin using a subtraction instead of addition, a silly mistake with surprisingly acceptable results. Those results were a result of other minor complementary mistakes compensating to produce reasonable looking results. In the course of experimenting with an acceleration data structure it became very apparent that 3d space traversal vectors were not behaving as intended, leading to review and correction of this code.
2017-08-07ray: more fragments for better thread utilizationVito Caputo
For now, a simple cpu multiplier of 64 is used. fb_fragment_t needs a tiling fragment divider added...
2017-06-02ray: plumb depth and camera to objectsVito Caputo
To enable prepare to precompute aspects of primary rays which all have a common origin at the camera, bring the camera to ray_object*_prepare() and bring the depth to ray_object*_intersects_ray() for primary ray detection. This is only scaffolding, functionally unchanged.
2017-06-02ray: separate lights from objectsVito Caputo
This may need to be undone in the future when more sophisticated lights, like area lights, are implemented. For now I can avoid polluting the objects list with the lights by strictly separating them.
2017-05-12ray: add ray_scene_prepare() object precomputingVito Caputo
Just embed a _prepared struct in the object where precomputed stuff can be cached. Gets called once before rendering, which ends up calling the object-specific ray_object_$type_prepare() methods per object.
2017-04-22*: add module context machineryVito Caputo
introduces create_context() and destroy_context() methods, and adds a 'void *context' first parameter to the module methods. If a module doesn't supply create_context() then NULL is simply passed around as the context, so trivial modules can continue to only implement render_fragment(). A subsequent commit will update the modules to encapsulate their global state in module-specific contexts.
2017-04-22ray: remove vestigial ray_threads codeVito Caputo
Now that rototiller is generally threaded when a prepare_frame() method is supplied, and modules/ray has been updated accordingly, discard the now redundant ray-specific threading code and related stuff.
2017-04-22ray: convert to generalized threaded renderingVito Caputo
The ray tracer was already threaded, so this required little change other than making some state global like the previous commits, and calling the underlying non-threaded single-fragment scene renderer function. A future commit will discard the now vestigial ray_threads related code.
2017-04-22*: /render/render_fragment/ in rototiller_module_tVito Caputo
Adding more context to the name in anticipation of adding a prepare_frame() method to the module struct.
2017-04-21*: s/renderer/module/gVito Caputo
Make consistent with the source directory structure naming.
2017-02-14ray: increase highlight exponent on shiny sphereVito Caputo
The highlight on the little green sphere was white-washing the entire thing due to its high specular reflection value. This produces more reasonable results...
2017-02-14ray: add highlight exponent to ray_surface_tVito Caputo
Was a constant at 20, this allows it to be specified per-object.
2017-02-12ray: tweak surface propertiesVito Caputo
Make spheres a little more diverse in terms of specular/diffusion, and minor tweak to the plane color.
2017-02-12ray: update copyright yearsVito Caputo
2017-02-12ray: improve camera movementVito Caputo
Make the camera orbit around the origin at a varying radius, with kept aimed facing the origin, with some vertical sweep+tilt thrown in.
2017-02-12ray: fixup ray_object_plane_intersects_ray() bugVito Caputo
We should only consider dot products > 0 as intersected, or >= something very close to 0 (epsilon). As-is resulted in planes moving with camera movement along the plane normal axis. Also fixes plane distance to be non-negative in the current scene.
2017-02-10ray: implement all orders in ray_euler_basis()Vito Caputo
Originally I only implemented pitch->yaw->roll, and being new to all this didn't fully appreciate the limitation that resulted in. This adds all six permutations of pitch/yaw/roll, the scene must specify the desired order when setting up the camera with the euler angles, see the enum in ray_euler.h.
2017-01-18*: move source into src/ subdirVito Caputo
Restoring some organizational sanity since adopting autotools.
© All Rights Reserved