summaryrefslogtreecommitdiff
path: root/src/modules
AgeCommit message (Collapse)Author
2019-10-14modules/flui2d: add 2D fluid dynamics simulationVito Caputo
This implements near verbatim the code found in the paper titled: Real-Time Fluid Dynamics for Games By Jos Stam It sometimes has the filename GDC03.PDF, or Stam_fluids_GDC03.pdf The density field is rendered using simple linear interpolation of the samples, in a grayscale palette. No gamma correction is being performed. There are three configurable defines of interest: VISCOSITY, DIFFUSION, and ROOT. This module is only threaded in the drawing stage, so basically the linear interpolation uses multiple cores. The simulation itself is not threaded, the implementation from the paper made no such considerations. It would be nice to reimplement this in a threaded fashion with a good generalized API, then move it into libs. Something where a unit square can be sampled for interpolated densities would be nice. Then extend it into 3 dimensions for volumetric effects...
2019-01-01modules/submit-softly: bilerp peripheral cellsVito Caputo
Remove the silly kludge avoiding peripheral cells
2018-12-31modules/submit-softly: shorten descriptionVito Caputo
2018-12-31modules/submit: add bilinearly-interpolated variantVito Caputo
This substantially reworks the cell sampling in submit. As a result, it's now threaded in the rendering phase which now resembles a texture mapper sans transformations. This produces a full-screen rendering rather than a potentially smaller one when the resolution wasn't cleanly divisable by the grid size. A new module, named submit-softly has also been added to expose the bilinearly interpolated variant. The transition between cells is also employing a smoothstep so it's not actually linear. The original non-interpolated version is retained as well, at the same submit module name. Some minor cleanups happened as well, nothing worth mentioning, except perhaps that the cells are now a uint8_t which is fine unless someone tries to redefine NUM_PLAYERS > 255.
2018-12-31libs/grid: fix grid_ops_t.taken player typeVito Caputo
Just making things consistent, also dropping unnecessary player assert from submit module. Future libs/grid may explore using the "unassigned" zero player in taken calls for unassigning cells like in simultaneously taken collision scenarios.
2018-12-30modules/stars: capitalize descriptionVito Caputo
2018-12-30modules/submit: add cellular automata game moduleVito Caputo
This module displays realtime battle for domination simulated as 2D cellular automata. This is just a test of the backend piece for a work-in-progress multiplayer game idea. The visuals were kind of interesting to watch so I figured may as well merge it as a module to share. Enjoy! PS: the results can vary a lot by tweaking the defines in submit.c
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-03-19ray: libize raytracer core, introduces src/libsVito Caputo
This is the first step of breaking out all the core rendering stuffs into reusable libraries and making modules purely compositional, consumers of various included rendering/effects libraries. Expect multiple modules leveraging libray for a variety of scenes and such. Also expect compositions mixing the various libraries for more interesting visuals.
2018-02-28ray: implement distance-based light brightnessVito Caputo
2018-02-27autotools: remove vestigial ROTOTILLER_* varsVito Caputo
Fixes silly cosmetic error in configure output for checking libdrm...
2017-12-23ray: constify input scene and camera parametersVito Caputo
also const the ray_euler_t basis
2017-12-23ray: constify all ray_3f_t method parametersVito Caputo
2017-12-23ray: split object render from object descriptionVito Caputo
This moves the per-object _prepared state into ray_render_object_$type structs with all the rendering-related object methods switched to operate on the new render structs. Since the current rendering code just makes all these assumptions about light objects being point lights, I've just dropped all the stuff associated with rendering light objects for now. I think it will be refactored a bit later on when the rendering code stops hard-coding the point light stuff. These changes open up the possibility of constifying the scene and constituent objects, now that rendering doesn't shove the prepared state into the embedded _prepared object substructs.
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-29ray: remove unused ray_scene_t.n_{lights,objects}Vito Caputo
Commit 445e94 switched to using sentinel objects, but missed removal of these obsoleted object counts.
2017-09-17ray: stop recurring below a relevance thresholdVito Caputo
There's no point computing more reflections if they're not going to contribute substantially to the resulting sample. Previously the max depth threshold solely controlled how many times a given ray could reflect, this commit introduces a minimum relevance as well. Value may require tuning, may actually make sense to move into the scene description as a parameter. Brings a minor frame rate improvement.
2017-09-15modules/*: cease dividing stride by 4Vito Caputo
Just cast buf to (void *) for the pointer arithmetic, stride is in units of bytes and no assumptions should be made about its value such as divisability by 4.
2017-09-14fb: s/fb_fragment_divide_single/fb_fragment_slice_single/Vito Caputo
Mechanical cosmetic change
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-09-12ray: don't assume x_alpha is 0 at begin or y_stepVito Caputo
Currently fragments always start at the left edge of the frame, but when switching to a tiling fragmenter this is no longer true and causes visible errors.
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-03ray: convert from recursive to iterative tracingVito Caputo
Small speedup, I personally find the code cleaner this way too. Everything in the hot path should now be inlined, no function calls.
2017-06-02ray: skip intersection tests on reflector objectsVito Caputo
We can just assume the object which reflected the ray being tracing isn't going to be intersected. Maybe later this assumption no longer holds true, but it is true for now.
2017-06-02ray: precompute primary ray for ray_object_sphere_tVito Caputo
This gets rid of some computation on the primary ray:plane intersection tests The branches on depth suck though... I'm leaning towards specialized primary ray intersection test functions.
2017-06-02ray: precompute primary ray for ray_object_plane_tVito Caputo
This gets rid of some computation on the primary ray:plane intersection tests
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-06-02ray: simplify trace_ray inner loop slightlyVito Caputo
Remove unnecessary nearest_object check, the distance comparison alone is sufficient when initialized to INFINITY.
2017-06-01ray: move shadow check to a functionVito Caputo
Just tidying up shade_ray() before more optimizations.
2017-06-01ray: perform ambient light color scale in prepareVito Caputo
Trivially removes a ray_3f_mult_scalar() from the hot path.
2017-06-01ray: move max depth check out of trace_ray()Vito Caputo
We can avoid some unnecessary work at the max depth by checking it in shade_ray() instead.
2017-05-27ray: inline ray_object_* switch functionsVito Caputo
2017-05-27ray: simplify ray_3f_normalize()Vito Caputo
This is functionally identical.
2017-05-27ray: redo ray_3f_distance()Vito Caputo
This function isn't currently used, but its implementation was awful.
2017-05-27ray: normalize direction missed in 28d8022Vito Caputo
Need to normalize the direction when we step the y axis and @ start.
2017-05-27ray: use approximate power in specular reflectionVito Caputo
powf() is slow but precise, this isn't the fastest method but it's at least portable and a bit faster.
2017-05-26ray: s/nlerp/lerp/ where normalize is unnecessaryVito Caputo
It's only necessary to normalize the direction stored vector in x_step(), the rest can simply be linearly interpolated which saves some divides.
2017-05-12ray: mult normalize in ray_object_sphere_normalVito Caputo
Simple optimization taking advantage of the prepare, mults generally are cheaper than divs.
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-27*: remove vestigial module/${module}/${module}.hVito Caputo
Prior to rototiller_module_t these headers were included and the module-specific render functions called directly. That's no longer the case, these files are irrelevant today.
2017-04-27sparkler: enable rudimentary threaded renderingVito Caputo
This moves most of the particle system maintenance into the serially executed sparkler_prepare_frame(), divides the frame into ncpus fragments, and leaves the draw to occur concurrently. The drawing must still currently process all particles and simply skips drawing those falling outside the fragment. Moving more of the computation out of prepare_frame() and into render_fragment() is left for future improvements, as it's a bit complex to do gainfully.
2017-04-27sparkler: respect fragment->frame_{width,height}Vito Caputo
should_draw_expire_if_oob() assumed the fragment represented the entire frame. Instead, return 0 if the coordinates are outside the fragment, but only reset longevity if outside of the frame. If sparkler goes threaded in the drawing, this would result in threads simply skipping particles outside the fragment. The longevity reset occurring in all threads appears suspicious but should be benign since they all write the same thing - 0.
2017-04-26sparkler: utilize context struct for module stateVito Caputo
© All Rights Reserved