| Age | Commit message (Collapse) | Author | 
|---|
|  | Also wire this up to the til_module_context_new() helper and
all its callers.
This is in preparation for modules doing more correct delta-T
derived animation. | 
|  | - modules now allocate their contexts using
  til_module_context_new() instead of [cm]alloc().
- modules simply embed til_module_context_t at the start of their
  respective private context structs, if they do anything with
  contexts
- modules that do nothing with contexts (lack a create_context()
  method), will now *always* get a til_module_context_t supplied
  to their other methods regardless of their create_context()
  presence.  So even if you don't have a create_context(), your
  prepare_frame() and/or render_fragment() methods can still
  access seed and n_cpus from within the til_module_context_t
  passed in as context, *always*.
- modules that *do* have a create_context() method, implying they
  have their own private context type, will have to cast the
  til_module_context_t supplied to the other methods to their
  private context type.  By embedding the til_module_context_t at
  the *start* of their private context struct, a simple cast is
  all that's needed.  If it's placed somewhere else, more
  annoying container_of() style macros are needed - this is
  strongly discouraged, just put it at the start of struct.
- til_module_create_context() now takes n_cpus, which may be set
  to 0 for automatically assigning the number of threads in its
  place.  Any non-zero value is treated as an explicit n_cpus,
  primarily intended for setting it to 1 for single-threaded
  contexts necessary when embedded within an already-threaded
  composite module.
- modules like montage which open-coded a single-threaded render
  are now using the same til_module_render_fragment() as
  everything else, since til_module_create_context() is accepting
  n_cpus.
- til_module_create_context() now produces a real type, not void
  *, that is til_module_context_t *.  All the other module
  context functions now operate on this type, and since
  til_module_context_t.module tracks the module this context
  relates to, those functions no longer require both the module
  and context be passed in.  This is especially helpful for
  compositing modules which do a lot of module context creation
  and destruction; the module handle is now only needed to create
  the contexts.  Everything else operating on that context only
  needs the single context pointer, not module+context pairs,
  which was unnecessarily annoying.
- if your module's context can be destroyed with a simple free(),
  without any deeper knowledge or freeing of nested pointers, you
  can now simply omit destroy_context() altogether.  When
  destroy_context() is missing, til_module_context_free() will
  automatically use libc's free() on the pointer returned from
  your create_context() (or on the pointer that was automatically
  created if you omitted create_context() too, for the
  bare til_module_context_t that got created on your behalf
  anyways).
For the most part, these changes don't affect module creation.
In some ways this eases module creation by making it more
convenient access seed and n_cpus if you had no further
requirement for a context struct.
In other ways it's slightly annoying to have to do type-casts
when you're working with your own context type, since before it
was all void* and didn't require casts when assigning to your
typed context variables.
The elimination for requiring a destroy_context() method in
simple free() of private context scenarios removes some
boilerplate in simple cases.
I think it's a wash for module writers, or maybe a slight win for
the simple cases. | 
|  | This is a mostly mechanical change of using rand_r() in place of
rand(), using the provided seed as the seed state.
There's some outstanding rand()s outside of create_context()
which should probably get switched over, with the seed being
stowed in the context struct.  I didn't bother going deeper on
this at the moment in the interests of getting to sleep soon. | 
|  | n_cells is a size_t, use %zu
clang complained, gcc doesn't, huh | 
|  | In the recent surge of ADD-style rtv+compose focused development,
a bunch of modules were changed to randomize initial states at
context_create() so they wouldn't be so repetitive.
But the way this was done in a way that made it impossible to
suppress the randomized initial state, which sometimes may be
desirable in compositions.  Imagine for instance something like
the checkers module, rendering one module in the odd cells, and
another module into the even cells.  Imagine if these modules are
actually the same, but if checkers used one seed for all the odd
cells and another seed for all the even cells.  If the modules
used actually utilized the seed provided, checkers would be able
to differentiate the odd from even by seeding them differently
even when the modules are the same.
This commit is a step in that direction, but rototiller and all
the composite modules (rtv,compose,montage) are simply passing
rand() as the seeds.  Also none of the modules have yet been
modified to actually make use of these seeds.
Subsequent commits will update modules to seed their
pseudo-randomized initial state from the seed value rather than
always calling things like rand() themselves. | 
|  | We don't actually want to produce indices 0-width and 0-height | 
|  | Just one case, modules/submit, was using 32x32 tiles and is now
using 64x64.  I don't expect it to make any difference.
While here I fixed up the num_cpus/n_cpus naming inconsistencies,
normalizing on n_cpus. | 
|  | Fragmenting is often dimensioned according to the number of cpus,
and by not supplying this to the fragmenter it was made rather
common for module contexts to plumb this themselves - in some
cases incorporating a context type/create/destroy rigamarole
for the n_cpus circuit alone.
So just plumb it in libtil, and the prepare_frame functions can
choose to ignore it if they have something more desirable onhand.
Future commits will remove a bunch of n_cpus from module contexts
in favor of this. | 
|  | This adds a voronoi diagram module, which when used as an overlay
produces a mosaic effect.
Some settings:
 cells=N             number of voronoi cells
 randomize={on,off}  randomizes the cell locations every frame
 dirty={on,off}      uses a faster sloppy/dithery-looking method
Some TODO items:
- use a more space efficient representation of the distance
  buffer, maybe use uint16_t relative offsets into the cells
  rather than pointers - capping their quantity to 64KiB
- anti-alias edges between cells |