There are no user-facing breaking changes in piecepackr’s API but the internal grid structure of the grobs drawn/returned by grid.piece(), pieceGrob(), and pmap_piece() have been changed to make it easier to query or edit the grid graphics post initial drawing with functions like grid::grid.get(), grid::grid.edit(), grid::grid.reorder() etc. (#205).
grid.piece() and pieceGrob() now has a “piece” class and “named slots” which match the arguments of grid.piece().grid::grid.force() to view/edit its internal grob “children”.grid::gPath.grobPoints() methods have been written for the “grob” returned by grid.piece() / pieceGrob() and the “grob” returned by pmap_piece().name in .l then pmap_piece() will now generate/replace a unique name by concatenating piece. with a unique id if it exists or if it does not then by row number in order to better label the “children” of the returned gTree grob object (#223).The following utility functions have been deprecated in favor of methods provided by the new pp_shape() object:
checkersGrob(c, s, t, n), use pp_shape(s, t)$checkers(n, gp=gpar(fill=c)) instead.concaveGrobFn(n, t, r), use pp_shape(paste0("concave", n), t, r)$shape instead.convexGrobFn(n, t), use pp_shape(paste0("convex", n), t)$shape instead.get_shape_grob_fn(s, t, r, b), use pp_shape(s, t, r, b)$shape instead.gridlinesGrob(c, s, t, l, n), use pp_shape(s, t)$gridlines(n, gp=gpar(col=c, lex=l)) instead.halmaGrob(...), use pp_shape("halma")$shape(...) instead.hexlinesGrob(c, s, n), use pp_shape(s)$hexlines(n, gp=gpar(col=c)) instead.kiteGrob(...), use pp_shape("kite")$shape(...) instead.matGrob(c, s, t, mw, n), use pp_shape(s, t)$mat(mw, n, gp=gpar(fill=c)) instead.pyramidGrob(...), use pp_shape("pyramid")$shape(...) instead.New function pp_shape() returns an R6 object that provides the following methods to create various grobs for all the “shape”’s supported by pp_cfg():
shape() returns a grob of the shape.mat() returns a grob of a matting “mat” within the shape.mat_width controls how “wide” the matting should be.gridlines() returns a grob of “gridlines” within the shape.checkers() returns a grob of “checkers” within the shape.hexlines() returns a grob of “hexlines” within the shape.polyclip() returns a grob that is an “intersection”, “minus”, “union”, or “xor” of another grob. Note unlike gridGeometry::polyclipGrob it can directly work with a pieceGrob “clip grob” argument.Default functions used by save_piece_obj(), piece3d(), piece() now support a “top”, “base”, “left”, and “right” side for the two-sided token components: “bit”, “board”, “card”, “matchstick”, “pawn”, “saucer”, and “tile” (#135).
Function game_systems now returns a “meeple” configuration with “standard” meeple “bit” pieces (#232).
pp_cfg() now supports a “roundrect” (rounded rectangle) shape (#214, #229).shape_r style.pp_cfg() now supports a “meeple” shape (#104). Meeple coordinates were extracted from Meeple icon by Delapouite / CC BY 3.0.pp_cfg() now supports setting multiple styles by using a greater-than-length-one vectors (as well as continuing to support previously-supported comma-separated strings).R_to_AA() now always returns an axis-angle parameterization with positive axis_z value (#219).R_to_AA() for some 3D rotations with an “exactly” 180 degree angle (in the axis-angle representation).AA_to_R() now accepts an optional axis_z argument and automatically normalizes the axis vector. In particular R_to_AA(AA_to_R(...)) can now be used to normalize alternative axis-angle parameterizations with non-unit axis vectors and/or negative axis_z values.is_color_invisible() will now correctly classify as “invisible” colors with an alpha channel value set to 0.pp_cfg()$get_piece_opt() now also contains a back value indicating whether this is a back of a piece (and hence for some shapes may need to be flipped across a vertical line) and a bleed_color value indicating a good color for a “bleed” effect (e.g. for print-and-play layouts) (#211).op_transform() for pieces whose “shape” is a non-symmetric (across vertical axis) polygon.grid.piece() and pmap_piece() now returns the grob invisibly if draw=TRUE as documented (while continuing to draw the grob to the active graphics device).piece3d() will now try to infer a reasonable textype value by manually checking the png texture’s alpha channel.save_piece_obj(), piece3d() and piece() now have support for 3D rotations of pieces (#188) using an axis-angle representation parameterized by arguments angle, axis_x, and axis_y.AA_to_R() and R_to_AA() convert back and forth between the axis-angle representation used by piecepackr and 3D rotation matrices (post-multiplied).R_x(), R_y(), and R_z() create simple 3D rotation matrices (post-multiplied) for rotations around the x, y, and z axes.to_degrees() and to_radians() convert back and forth between degrees and radians.pp_cfg() now supports new obj_fn, rayrender_fn, and rgl_fn styles allowing further piece customization within the 3D graphics functions save_piece_obj(), piece(), and piece3d() respectively (#200).piece3d() now supports user manually setting the piece’s rgl “material” textype argument. When textures with alpha transparency are not needed then setting textype to "rgb" avoids a rglWebGL rendering bug (#187).get_shape_grob_fn() now has a back argument to indicate we are drawing the back of the shape and should reflect it across a vertical axis (#218).board_face, board_back for representing boards (#153).card_face, card_back for representing cards (#124).bit_face, bit_back for representing miscellaneous game pieces (#155).game_systems now returns more game systems:
dice: Normal six-sided pipped dice in six color schemes (#166).checkers1, checkers2: Checkered boards and checkers. checkers1 has 1" cells and checkers2 has 2" cells (#168).dominoes, dominoes_black, dominoes_blue, dominoes_green, dominoes_red, dominoes_white, dominoes_yellow: Traditional Double-12 pipped dominoes in various color schemes (#159).playing_cards, playing_cards_colored, playing_cards_tarot (#170):
playing cards is a traditional (French-suited) deck of (Poker) playing cards.playing_cards_colored has five suits: red hearts, black spades, green clubs, blue diamonds, and yellow stars.playing_cards_tarot is a (French Bourgeois) tarot deck with four suits (hearts, spades, clubs, diamonds) with 14 ranks (including knights) plus 22 trump cards (1-21 plus an “excuse”).save_piece_obj() for writing Waveform OBJ files (and associated MTL files and png textures) (#189, #190). Note support for dice and pawns are currently rather crude.piece3d() for making graphics with the rgl package (#76).piece() for making rayrender objects.op_transform() when sorting tile faces rotated in various directions (#163).op_transform() now accepts new argument pt_thicknessfor improved handling of stacked pyramid (tops).edge_color for dice, pawns, and pyramids now defaults to the background color of piece_side.edge_color for matchsticks now defaults to the background color of the matchstick_back.game_systems made more “standard”.pmap_piece now supports an .f function to specify the function to apply to the rows of the data frame. By default it uses the (backwards-compatible) pieceGrob.pp_cfg()$get_depth() now has better depth calculation for pyramid faces (representing laid down pyramids).pp_cfg now supports a new op_grob_fn style indicating which function to draw pieces with when drawing with a 3D oblique projection in grid. The older shadow_fn style alternative is now deprecated.grid.piece() (and pieceGrob()) now support a scale and alpha argument (#201).The following pp_cfg R6 class public method is now deprecated:
* ``get_pictureGrob()``. Use ``get_grob(piece_type, suit, rank, type="picture")`` instead.
The following pp_cfg “style” is now deprecated:
* ``shadow_fn``. Use the new ``op_grob_fn`` instead.
game_systems() no longer returns an icehouse_pieces configuration. Configurations for Looney Pyramids can be found at https://github.com/piecepackr/piecenikrNew function picturePieceGrobFn() which returns a “grob” function that imports graphics from files found in its directory argument (#152).
New function game_systems() which returns a list of configuration objects for multiple game systems (#157):
dual_piecepacks_expansion: A companion piecepack with a special suit scheme. See https://trevorldavis.com/piecepackr/dual-piecepacks-pnp.html.
hexpack: A hexagonal extrapolation of the piecepack designed by Nathan Morse and Daniel Wilcox. See https://boardgamegeek.com/boardgameexpansion/35424/hexpack.
piecepack: A public domain game system invented by James “Kyle” Droscha. See http://www.ludism.org/ppwiki. Configuration also contains the following piecepack accessories:
piecepack matchsticks: A public domain accessory developed by Dan Burkey. See http://www.ludism.org/ppwiki/PiecepackMatchsticks.piecepack pyramids: A public domain accessory developed by Tim Schutz. See http://www.ludism.org/ppwiki/PiecepackPyramids.piecepack saucers: A public domain accessory developed by Karol M. Boyle at Mesomorph Games. See https://web.archive.org/web/20190719155827/http://www.piecepack.org/Accessories.htmlplaying_cards_expansion: A piecepack with the standard “French” playing card suits. See http://www.ludism.org/ppwiki/PlayingCardsExpansion.
subpack: A “mini” piecepack. Designed to be used with the piecepack to make piecepack “stackpack” diagrams. See http://www.ludism.org/ppwiki/StackPack.
Helper functions to_subpack() and to_hexpack() which given a piecepack configuration attempts to generate an appropriate matching (piecepack stackpack) subpack and hexpack (#161).
New function file2grob() that imports a given image file as a grob.
op_transform() for whether two pieces overlap are now more accurate (#150).op_transform() when computing bounding box for shapes when width and height are not equal.op_transform() for inferring width/height of matchsticks and shape/depth of pyramids.pp_cfg objects when a custom grob function had been set.suit_color.s2="white"pp_cfg objects’ get_suit_color function is now vectorized (and by default now returns the suit colors for each suit).op_transform() and new pmap_piece() argument trans to facilitate making graphics with an oblique projection (#138).save_print_and_play() function now supports adding piecepack pyramids (#37), matchsticks (#69), and subpacks (aka “travel” piecepacks) (#129) to the print-and-play layout.pp_cfg() function (and R6 class) which on-the-fly builds a cache to speed up component drawing (#112, #122). Can also signal to rule diagram functions whether the piecepack lacks certain components (#130).help("pp_utils"), help("grob_fn_helpers"), and help("grid.piece") for more info.component_opt color names are now _color instead of _col to better match “configuration lists”.draw_component has been renamed grid.piece (and many of its arguments vectorized) and draw_components has been renamed pmap_piece(#123).make_images has been renamed save_piece_images and make_pnp has been renamed save_print_and_play.component_side, i_r, and i_s have been renamed piece_side, rank, and suit.make_collection and make_preview functions removed.load_configurations and read_configuration functions removed.make_pnp print-and-play layouts have been radically re-configured and renamed to save_print_and_play (#54).chip component no longer supported by piecepackr (#114)make_pnp now gets deck title from the configuration element title (#118)ribbons are now mat (as in picture frame ‘matting’) (#117)draw_preview function has been removed. Can now do grid.piece("preview_layout", cfg=cfg).get_embedded_font() function fixed.save_print_and_play() function now supports the A5 page size and is more A4 page size friendly (#54).fontface (#121) as well as width, height, and depth (#106) in configuration lists.pmap_piece now supports angle=NA and grid.piece no longer draws different output for components like tile_back if you specify a suit or rank (#120).credit, copyright, and description fieldscoin_arrangement (#136).ghostscript installed will automatically embed metadata in the print-and-play pdf (#93).border_lex and gridline_lex to allow customizing the width of the border and grid lines.save_piece_images()’s format argument is now vectorized.save_print_and_play() can now save a print-and-play “svg” and “ps” file (besides “pdf”).grid.piece() no longer throws a warning when use_pictureGrob==TRUE and angle!=0 (#148).pyramid_face, pyramid_left, pyramid_left, pyramid_right, pyramid_top, and pyramid_layout components (progress on #37).matchstick_face and matchstick_back components (progress on #69)pawn_layout, die_layoutLF, die_layoutRF, suitdie_layoutLF, suitdie_layoutRF`',suitrankdie_layoutLF, andsuitrankdie_layoutRF`` components (#101)Generalized star shape to concave# and # shape to convex# shape (#100). Added “pyramid” triangle shape (progress on #37).
New draw_components() function allows one to draw several piecepack components specified in a data frame (#96).
New load_configurations() function allows one to load in several JSON configuration files and/or internal piecepackr configurations in a layered (cascading) manner (#81).
Made several non-reverse-compatible API changes to configuration and piecepack image making functions and scripts.
Increased the width of a pawn belt from 1.5" to 2" (so can fit around a 5/8" diameter pawn).
Changed the “light”-french-suited symbols in the “dual” demo from “black” symbols to “white” symbols. Thanks Ron-Hale Evans for the suggestion.
Changed default color scheme
Added get_embedded_font() function and executable (#80).
Dropped pdfjoin from list of system dependencies (#77).
Added ability to configure by individual suits and/or ranks (#44).
Added Yellow Crowns demo (#53)
Added make_piecepack_images executable (#48). Renamed other executables and functions in API.
Shrunk the pawn down to ½" by ⅞" and made them directional by default (#50).
Exported component drawing function draw_component (#3, #58).
Allow styles by general component (#57) and open up primary symbol theta and r (#51).
Document exported functions in Rd pages.
Option to configure piecepack dice arrangement (#13)
Expanded Rainbow Deck demo (#64).
Fixed bugs in “orthodox” pawns (#62).
Added --border_color configuration option and fix bug in PnP border colors (#42).
Added --header_font, --dm_r, --dm_r.*, and --suit_colors.* options.
Added (or improved) --checker_colors, --gridline_colors, and --hexline_colors options.
Renamed --background_color option to --background_colors which can now vary by suit (#52)
Added --shape, --shape_theta, --shape.*, and --shape_theta.* options.
Add new and rename existing pdf metadata options in exec/collect_piecepacks.
Improved “preview” layout.
Added additional suit die to accessories pages.
Fix bug in the “suit-rank” die for 5-suited piecepacks (#41).
Added Crown and Anchor suited piecepacks demo (#46).
Added Rainbow Deck suited piecepack demo (#47).
Added Reversi-friendly piecepack demo (#21).
Added Chess-ranked piecepack demo (#24).
Added Hex-friendly piecepack demo.
Fix bugs in “orthodox” demo (#43).
Tweaked configuration in “dual” demo so first two decks are more compatible with other decks.
Tweaked fonts in all demos.
Added Simplified Hanzi decks to Chinese zodiac demo.
Tweaked “chip” shape in orthodox and Chineze zodiac demos.
Tweaked background colors in 3rd hex demo.
Tweaked background colors in 3rd crown-and-anchor demo.