|
|
||
|---|---|---|
| flake.nix | ||
| picrew.nix | ||
| README.md | ||
libPicrew
a NixOS library for declaritively building Picrews.
a picrew is a paper-doll-esque website for building avatars, but i really wanted to be able to declaritively define mine as part of my operating system configuration.
Installation
this flake can be added as an input, and its library functions accessed:
{
description = "Some Flake";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs";
libpicrew.url = "git+https://git.avery.garden/thorn/libPicrew?ref=mistress";
};
outputs = { nixpkgs, ... }@inputs: {
# avaliable under inputs.libpicrew.lib
};
}
Usage
this flake exposes a single meta-library function, mkLibPicrew, which takes an attribute set with the following items, and returns the actual library:
pkgsimagesordering
pkgs is the package set it will pull its dependencies from, images is a path to an image set to use (described below), and ordering is a list of strings to use for Z-layering (later items are layered on top of earlier ones).
let libPicrew = inputs.libpicrew.lib.mkLibPicrew {
inherit pkgs;
images = ./picrew_images;
ordering = [
"bg"
"skin"
"hair"
"eyes"
"mouth"
];
}
the images folder can be gotten through unethical and dark arts, which will produce a .ora file that can be unzipped to produce a data subdirectory containing the images needed.
each subdirectory and file will need to be renamed, such that the outermost directories match each item in ordering, with the nested items allowing any format.
mkLibPicrew creates an attribute set with two items, renderPicrew and renderPicrews
to use each we need to define some defaults and some parts:
a default is an attribute set containing variables used in the parts, and is intended for items such as skin colour, hair colour, and eye colour that multiple layers or items may share a naming scheme for:
thornDefaults = {
hair = "black";
skin = "pale";
eyes = "hazel";
};
a part is a subset of a full picrew image, that contains a grouping of items, for example an outfit, a hairstyle, or an expression.
they are functions that take a set of defaults and produce an attribute set where the attribute names correspond to directories in the images folder, and the values correspond to files (when appended with .png):
base = defs: {
bg = "darkpink";
skin = defs.skin;
nose = "large";
};
maid_outfit = defs: {
right_sleeve.maid = "colour1";
left_sleeve.maid = "colour1";
right_hand.closed = defs.skin;
left_hand.closed = defs.skin;
outer_shirt = "black_maid";
ears.maid_band = "colour1";
};
hair_mid = defs: {
hair_back.mid = defs.hair;
fringe.mildly_jagged = defs.hair;
};
outfit = defs: {
earrings = "red_rose";
shirt.highneck_sweater = "colour2";
};
expression_bored = defs: {
mouth = "small_sad";
eyebrows.large_bushy = defs.hair;
eyes.to_the_left = defs.eyes;
eye_glint = "mid";
};
renderPicrew
renderPicrew takes a set of defaults, a list of parts, and a filename, and produces an image. the argument is an attribute set of the following items:
name, the filename to use (will have.pngappended)parts, a list of parts to applydefaults, the defaults to use, defaults to{}src, the image source to use, defaults to that passed tomkLibPicrewordering, the layer order to use, defaults to that passed tomkLibPicrew
it produces a derivation that builds the image:
packages.maid-picrew = renderPicrew {
name = "maid";
defaults = thornDefaults;
parts = [
base
hair_mid
maid_outfit
expression_bored
];
}
renderPicrews
this works similar to the above, except it applies the same defaults to multiple sets of parts to create multiple images, it takes three arguments (seperate arguments, not a set):
name, the package sets namedefs, the defaults to applyspecs, a list of attribute sets defining each image
each item in specs has a name (the filename), and parts (a list of parts to use):
packages.thornsPicrews = renderPicrews
"thornsPicrews"
thornDefaults
[
{
name = "regular";
parts = [
base
hair_mid
outfit
expression_bored
];
}
{
name = "maid";
parts = [
base
hair_mid
maid_outfit
expression_bored
];
}
];