From 36bfadef100653bf6c12bd4720cb956d87189978 Mon Sep 17 00:00:00 2001 From: dimaguy Date: Sat, 30 Mar 2024 18:08:40 +0000 Subject: [PATCH 1/7] Create CCSMB-12.md --- Standards/CCSMB-12.md | 66 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 Standards/CCSMB-12.md diff --git a/Standards/CCSMB-12.md b/Standards/CCSMB-12.md new file mode 100644 index 0000000..c95278c --- /dev/null +++ b/Standards/CCSMB-12.md @@ -0,0 +1,66 @@ +# *CCSMB 12:* 3D JSON Array Format + +*Author: Dimaguy* + +*Version: 1.0.0* + +*Last revised: 2024-03-30* + +This RFC introduces the 3D JSON Array Format, used for printing 3D Blocks in ComputerCraft using the mod [sc-peripherals](https://github.com/SwitchCraftCC/sc-peripherals) + +## Quick information + +| Information | | +| ----------- | ------------------------- | +| Version | 1.0.0 | +| Type | Model Array file format | +| MIME | `model/3dja` | +| Extensions | `.3dja` | + +## Technical details + +The file MUST be composed of a single JSON object with this basic ruleset: +- The writer SHOULD specify global settings for the printed 3D blocks in the global namespace of the object, if a global setting isn't set each block model MUST have it set individually. +- The writer MAY define a dictionary of presets (which are tint/texture combinations), if this isn't done every block MUST use their own texture and tint. +- The writer MUST define an array of block models, following the specifications of the [3dj](https://docs.sc3.io/features/sc-peripherals.html#_3dj-format) format with the addition of a coordinates array (if the user foregoes presets each block model object should be compatible with a 3dj file if the global settings are inserted, the coordinates field WILL be disregarded). +- Each block model MAY override a global setting. +The following represents the file format in a more visual aspect +``` +{ + "label": "...", // (RECOMMENDED) The name of the build, if specified end result of a block in the build SHALL be "BuildName: blocks[i].label", if not end result SHALL be blocks[i].label + "tooltip": "...", // (OPTIONAL) The description of the build, shared between all blocks unless overridden + "width": 1, // (RECOMMENDED) Width required for the build, not needed for printing but is an indicator for an automated builder + "length": 2, // (RECOMMENDED) Length required for the build, not needed for printing but is an indicator for an automated builder + "height": 3, // (RECOMMENDED) Height required for the build, not needed for printing but is an indicator for an automated builder + "isButton": false, // Global setting for all blocks, if not assigned every block must have it's own setting + "collideWhenOn": true, // Global setting for all blocks, if not assigned every block must have it's own setting + "collideWhenOff": true, // Global setting for all blocks, if not assigned every block must have it's own setting + "lightLevel": 0, // Global setting for all blocks, if not assigned every block must have it's own setting + "redstoneLevel": 0, // Global setting for all blocks, if not assigned every block must have it's own setting + "presets": { // (OPTIONAL) Dictionary of presets, used to define the texture and tint of a shape for compresion + "presetname": { + "texture": "", // (REQUIRED) Texture of the preset + "tint": "FFFFFF" // (REQUIRED) Tint of the preset + }, + }, + "blocks": [ + { + "label": "...", // (OPTIONAL) The name of the block, if empty SHALL use "(blocks[i].x,blocks[i].y,blocks[i].z)" as blocks[i].label + "tooltip": "...", // (OPTIONAL) The description of the block, overrides the tooltip of the build + "coordinates": [[0, 0, 0]], // 0,0,0 represents the origin of the build, used for automated builders and desambiguation, each set of coordinates SHOULD be globally unique (if not, automated building programs SHALL fail), the block MUST be printed for the amount of coordinates in this array + "lightLevel": 2, // (OPTIONAL if assigned globally) The light level of the block, overrides the global setting + "redstoneLevel": 14, // (OPTIONAL if assigned globally) The redstone level of the block, overrides the global setting + //Any global setting can be overridden here + "shapesOff": [ + { "bounds": [0, 0, 0, 16, 16, 16], "preset": "presetname"}, //A shape can use a preset, which MUST be in presets dictionary + { "bounds": [0, 0, 0, 16, 16, 16], "texture": "", "tint": "FFFFFF" }, //Or define its own texture and tint + ], + "shapesOn": [ + { /* ... */ } + ] + } + ] +} +``` +The preset dictionary and array of coordinates per block's goal is to achieve some sort of compression within the file. +This format provides enough data for an automated building system. From b3f26a3d53634cc73121b6961f6f112a0e54540f Mon Sep 17 00:00:00 2001 From: dimaguy Date: Sat, 30 Mar 2024 18:31:02 +0000 Subject: [PATCH 2/7] Use jsonc syntax highlighting --- Standards/CCSMB-12.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Standards/CCSMB-12.md b/Standards/CCSMB-12.md index c95278c..cc20eac 100644 --- a/Standards/CCSMB-12.md +++ b/Standards/CCSMB-12.md @@ -25,7 +25,7 @@ The file MUST be composed of a single JSON object with this basic ruleset: - The writer MUST define an array of block models, following the specifications of the [3dj](https://docs.sc3.io/features/sc-peripherals.html#_3dj-format) format with the addition of a coordinates array (if the user foregoes presets each block model object should be compatible with a 3dj file if the global settings are inserted, the coordinates field WILL be disregarded). - Each block model MAY override a global setting. The following represents the file format in a more visual aspect -``` +```jsonc { "label": "...", // (RECOMMENDED) The name of the build, if specified end result of a block in the build SHALL be "BuildName: blocks[i].label", if not end result SHALL be blocks[i].label "tooltip": "...", // (OPTIONAL) The description of the build, shared between all blocks unless overridden From a5104ef5f109d2f95a581d1743231dd09fa5f626 Mon Sep 17 00:00:00 2001 From: dimaguy Date: Sat, 30 Mar 2024 19:43:53 +0000 Subject: [PATCH 3/7] Make length/width/height into an array of numbers --- Standards/CCSMB-12.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Standards/CCSMB-12.md b/Standards/CCSMB-12.md index cc20eac..cc446e8 100644 --- a/Standards/CCSMB-12.md +++ b/Standards/CCSMB-12.md @@ -29,9 +29,7 @@ The following represents the file format in a more visual aspect { "label": "...", // (RECOMMENDED) The name of the build, if specified end result of a block in the build SHALL be "BuildName: blocks[i].label", if not end result SHALL be blocks[i].label "tooltip": "...", // (OPTIONAL) The description of the build, shared between all blocks unless overridden - "width": 1, // (RECOMMENDED) Width required for the build, not needed for printing but is an indicator for an automated builder - "length": 2, // (RECOMMENDED) Length required for the build, not needed for printing but is an indicator for an automated builder - "height": 3, // (RECOMMENDED) Height required for the build, not needed for printing but is an indicator for an automated builder + "size": [1,1,1], // (RECOMMENDED) Size in number of blocks required for the build, not needed for printing but is an indicator for an automated builder "isButton": false, // Global setting for all blocks, if not assigned every block must have it's own setting "collideWhenOn": true, // Global setting for all blocks, if not assigned every block must have it's own setting "collideWhenOff": true, // Global setting for all blocks, if not assigned every block must have it's own setting From 0253e9585fd4b82723a6835fd3b2b548d9c69b9c Mon Sep 17 00:00:00 2001 From: dimaguy Date: Sat, 30 Mar 2024 19:46:14 +0000 Subject: [PATCH 4/7] Clarify order of x, y, z --- Standards/CCSMB-12.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Standards/CCSMB-12.md b/Standards/CCSMB-12.md index cc446e8..e7944d8 100644 --- a/Standards/CCSMB-12.md +++ b/Standards/CCSMB-12.md @@ -29,7 +29,7 @@ The following represents the file format in a more visual aspect { "label": "...", // (RECOMMENDED) The name of the build, if specified end result of a block in the build SHALL be "BuildName: blocks[i].label", if not end result SHALL be blocks[i].label "tooltip": "...", // (OPTIONAL) The description of the build, shared between all blocks unless overridden - "size": [1,1,1], // (RECOMMENDED) Size in number of blocks required for the build, not needed for printing but is an indicator for an automated builder + "size": [1,1,1], // (RECOMMENDED) Size (x,y,z) in number of blocks required for the build, not needed for printing but is an indicator for an automated builder "isButton": false, // Global setting for all blocks, if not assigned every block must have it's own setting "collideWhenOn": true, // Global setting for all blocks, if not assigned every block must have it's own setting "collideWhenOff": true, // Global setting for all blocks, if not assigned every block must have it's own setting @@ -45,7 +45,7 @@ The following represents the file format in a more visual aspect { "label": "...", // (OPTIONAL) The name of the block, if empty SHALL use "(blocks[i].x,blocks[i].y,blocks[i].z)" as blocks[i].label "tooltip": "...", // (OPTIONAL) The description of the block, overrides the tooltip of the build - "coordinates": [[0, 0, 0]], // 0,0,0 represents the origin of the build, used for automated builders and desambiguation, each set of coordinates SHOULD be globally unique (if not, automated building programs SHALL fail), the block MUST be printed for the amount of coordinates in this array + "coordinates": [[0, 0, 0]], // Order: x,y,z. 0,0,0 represents the origin of the build, used for automated builders and desambiguation, each set of coordinates SHOULD be globally unique (if not, automated building programs SHALL fail), the block MUST be printed for the amount of coordinates in this array "lightLevel": 2, // (OPTIONAL if assigned globally) The light level of the block, overrides the global setting "redstoneLevel": 14, // (OPTIONAL if assigned globally) The redstone level of the block, overrides the global setting //Any global setting can be overridden here From a0af792e2b6bced5a72335e2763f781482c2ad0a Mon Sep 17 00:00:00 2001 From: dimaguy Date: Tue, 2 Apr 2024 22:39:58 +0000 Subject: [PATCH 5/7] Detail 3dja further and correct some possible misconceptions. --- Standards/CCSMB-12.md | 65 ++++++++++++++++++++++++++++--------------- 1 file changed, 43 insertions(+), 22 deletions(-) diff --git a/Standards/CCSMB-12.md b/Standards/CCSMB-12.md index e7944d8..016a98c 100644 --- a/Standards/CCSMB-12.md +++ b/Standards/CCSMB-12.md @@ -4,8 +4,9 @@ *Version: 1.0.0* -*Last revised: 2024-03-30* +*Last revised: 2024-04-02* +The words MUST, MUST NOT, SHOULD, SHOULD NOT, and MAY are defined in [RFC 2119](https://www.rfc-editor.org/rfc/rfc2119). This RFC introduces the 3D JSON Array Format, used for printing 3D Blocks in ComputerCraft using the mod [sc-peripherals](https://github.com/SwitchCraftCC/sc-peripherals) ## Quick information @@ -19,35 +20,46 @@ This RFC introduces the 3D JSON Array Format, used for printing 3D Blocks in Com ## Technical details -The file MUST be composed of a single JSON object with this basic ruleset: -- The writer SHOULD specify global settings for the printed 3D blocks in the global namespace of the object, if a global setting isn't set each block model MUST have it set individually. -- The writer MAY define a dictionary of presets (which are tint/texture combinations), if this isn't done every block MUST use their own texture and tint. -- The writer MUST define an array of block models, following the specifications of the [3dj](https://docs.sc3.io/features/sc-peripherals.html#_3dj-format) format with the addition of a coordinates array (if the user foregoes presets each block model object should be compatible with a 3dj file if the global settings are inserted, the coordinates field WILL be disregarded). -- Each block model MAY override a global setting. -The following represents the file format in a more visual aspect +The file MUST be composed of a single JSON object([RFC 8259](https://datatracker.ietf.org/doc/html/rfc8259), "The JavaScript Object Notation (JSON) Data Interchange Format") with the following ruleset: +- The writer SHOULD specify global non-default (according to 3dj) common settings for the printed 3D blocks in the global namespace of the JSON object. +- The writer MAY define a dictionary of presets (which are tint/texture combinations), if this isn't done every block MUST use their own texture and tint for each shape. +- The writer MUST define an array of block models, following the specifications of the [3dj](https://docs.sc3.io/features/sc-peripherals.html#_3dj-format) format with the addition of a coordinates array (if the user foregoes presets each block model object should be compatible with a 3dj file, the coordinates field SHOULD be disregarded by 3dj-only readers). +- Each block model MAY override a global setting by redefining it on it's context. +- Size is 1-based indexed, ordered by X, Y and Z each being unsigned integers. It represents number of blocks in each axis +- Coordinates are 0-based indexed, ordered by x, y and z each being signed integers. It represents position of blocks in each axis +- The reader MAY provide builtin presets, which MUST be overriden if the namespace coincides with one in the file. +- The reader MAY provide means of swapping in external presets profiles for recoloring or retexturing, which MUST override part or the entirety of the namespace in file. +- The reader SHOULD facilitate the printing of a single block of the entire set by providing facilities to print a coordinate, a label of a block or it's index in the file. +- The reader SHOULD reject or warn about files whose coordinates don't match boundaries in set in size, if one is set. +- The reader SHOULD reject blocks that try to refer to unknown presets. +The following represents the file format in a more visual aspect: ```jsonc { - "label": "...", // (RECOMMENDED) The name of the build, if specified end result of a block in the build SHALL be "BuildName: blocks[i].label", if not end result SHALL be blocks[i].label + "label": "BuildName: $BLABEL", // (RECOMMENDED) The name scheme of the build, the string SHOULD be processed to make use of the Label Variables that are set below, if blank the result SHALL be "blocks[i].label" "tooltip": "...", // (OPTIONAL) The description of the build, shared between all blocks unless overridden - "size": [1,1,1], // (RECOMMENDED) Size (x,y,z) in number of blocks required for the build, not needed for printing but is an indicator for an automated builder - "isButton": false, // Global setting for all blocks, if not assigned every block must have it's own setting - "collideWhenOn": true, // Global setting for all blocks, if not assigned every block must have it's own setting - "collideWhenOff": true, // Global setting for all blocks, if not assigned every block must have it's own setting - "lightLevel": 0, // Global setting for all blocks, if not assigned every block must have it's own setting - "redstoneLevel": 0, // Global setting for all blocks, if not assigned every block must have it's own setting - "presets": { // (OPTIONAL) Dictionary of presets, used to define the texture and tint of a shape for compresion + "size": [1,1,1], // (RECOMMENDED) Size in number of blocks required for the build, not needed for printing but is an indicator for an automated builder + "isButton": false, // (OPTIONAL) Global setting for all blocks (see 3dj format) + "collideWhenOn": true, // (OPTIONAL) Global setting for all blocks (see 3dj format) + "collideWhenOff": true, // (OPTIONAL) Global setting for all blocks (see 3dj format) + "lightLevel": 0, // (OPTIONAL) Global setting for all blocks (see 3dj format) + "redstoneLevel": 0, // (OPTIONAL) Global setting for all blocks (see 3dj format) + "lightWhenOn": false, // (OPTIONAL) Global setting for all blocks (see 3dj format) + "lightWhenOff": false, // (OPTIONAL) Global setting for all blocks (see 3dj format) + "seatPos": undefined, // (OPTIONAL) Global setting for all blocks (see 3dj format) + "presets": { // (RECOMMENDED) Dictionary of presets, used to define the texture and tint of a shape for compresion and ease of recoloring "presetname": { - "texture": "", // (REQUIRED) Texture of the preset - "tint": "FFFFFF" // (REQUIRED) Tint of the preset + "texture": "", // (OPTIONAL) Texture of the preset (see 3dj format) + "tint": "FFFFFF" // (OPTIONAL) Tint of the preset (see 3dj format) }, }, "blocks": [ { - "label": "...", // (OPTIONAL) The name of the block, if empty SHALL use "(blocks[i].x,blocks[i].y,blocks[i].z)" as blocks[i].label - "tooltip": "...", // (OPTIONAL) The description of the block, overrides the tooltip of the build - "coordinates": [[0, 0, 0]], // Order: x,y,z. 0,0,0 represents the origin of the build, used for automated builders and desambiguation, each set of coordinates SHOULD be globally unique (if not, automated building programs SHALL fail), the block MUST be printed for the amount of coordinates in this array - "lightLevel": 2, // (OPTIONAL if assigned globally) The light level of the block, overrides the global setting - "redstoneLevel": 14, // (OPTIONAL if assigned globally) The redstone level of the block, overrides the global setting + "label": "...", // (OPTIONAL) The name scheme of a block, if empty the "blocks[i].label" SHALL be "Untitled", the string MUST be processed to make use of the Label Variables below + "overrideGlobalLabel": false, // (OPTIONAL) If true, label of this block SHALL override the global label entirely + "tooltip": "...", // (OPTIONAL) The description of the block, overrides the tooltip of the build + "coordinates": [[0, 0, 0]], // Coordinates of the block (if not, automated building programs SHALL fail), the block MUST be printed for the amount of coordinates in this array + "lightLevel": 2, // (OPTIONAL) The light level of the block, overrides the global setting + "redstoneLevel": 14, // (OPTIONAL) The redstone level of the block, overrides the global setting //Any global setting can be overridden here "shapesOff": [ { "bounds": [0, 0, 0, 16, 16, 16], "preset": "presetname"}, //A shape can use a preset, which MUST be in presets dictionary @@ -62,3 +74,12 @@ The following represents the file format in a more visual aspect ``` The preset dictionary and array of coordinates per block's goal is to achieve some sort of compression within the file. This format provides enough data for an automated building system. + +### Label Variables +This list shows substitutions that should be made by Readers during printing. +Readers SHOULD refuse to process a label containing itself as a variable, but MAY let it pass as a raw +- $BLABEL - Block Label +- $BX - Block X Coordinate +- $BY - Block Y Coordinate +- $BZ - Block Z Coordinate +This list MAY be extended by implementations. From 2f3e1f46c8044bdd1fa81486815680c4182fa907 Mon Sep 17 00:00:00 2001 From: dimaguy Date: Tue, 2 Apr 2024 22:57:56 +0000 Subject: [PATCH 6/7] Introduction of per-block property 'amount' for mass production --- Standards/CCSMB-12.md | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/Standards/CCSMB-12.md b/Standards/CCSMB-12.md index 016a98c..de22171 100644 --- a/Standards/CCSMB-12.md +++ b/Standards/CCSMB-12.md @@ -20,7 +20,7 @@ This RFC introduces the 3D JSON Array Format, used for printing 3D Blocks in Com ## Technical details -The file MUST be composed of a single JSON object([RFC 8259](https://datatracker.ietf.org/doc/html/rfc8259), "The JavaScript Object Notation (JSON) Data Interchange Format") with the following ruleset: +The file MUST be composed of a single JSON object ([RFC 8259](https://datatracker.ietf.org/doc/html/rfc8259), "The JavaScript Object Notation (JSON) Data Interchange Format") with the following ruleset: - The writer SHOULD specify global non-default (according to 3dj) common settings for the printed 3D blocks in the global namespace of the JSON object. - The writer MAY define a dictionary of presets (which are tint/texture combinations), if this isn't done every block MUST use their own texture and tint for each shape. - The writer MUST define an array of block models, following the specifications of the [3dj](https://docs.sc3.io/features/sc-peripherals.html#_3dj-format) format with the addition of a coordinates array (if the user foregoes presets each block model object should be compatible with a 3dj file, the coordinates field SHOULD be disregarded by 3dj-only readers). @@ -32,6 +32,9 @@ The file MUST be composed of a single JSON object([RFC 8259](https://datatracker - The reader SHOULD facilitate the printing of a single block of the entire set by providing facilities to print a coordinate, a label of a block or it's index in the file. - The reader SHOULD reject or warn about files whose coordinates don't match boundaries in set in size, if one is set. - The reader SHOULD reject blocks that try to refer to unknown presets. +- A printer SHOULD produce the block in the amount of the sets of coordinates of the block. +- A fallback "amount" parameter MAY be accepted per block for mass production purposes, such parameter SHOULD match the amount of coordinates if those are set, but if it doesn't a printer MAY use it to override the amount of sets of coordinates. +- Writers SHOULD avoid using "amount" parameter if there's coordinates facilities available. The following represents the file format in a more visual aspect: ```jsonc { @@ -57,12 +60,13 @@ The following represents the file format in a more visual aspect: "label": "...", // (OPTIONAL) The name scheme of a block, if empty the "blocks[i].label" SHALL be "Untitled", the string MUST be processed to make use of the Label Variables below "overrideGlobalLabel": false, // (OPTIONAL) If true, label of this block SHALL override the global label entirely "tooltip": "...", // (OPTIONAL) The description of the block, overrides the tooltip of the build - "coordinates": [[0, 0, 0]], // Coordinates of the block (if not, automated building programs SHALL fail), the block MUST be printed for the amount of coordinates in this array + "coordinates": [[0, 0, 0]], // Coordinates of the block (if not, automated building programs SHALL fail and a printer SHOULD only print the block once) + "amount": 64, // SHOULD NOT be used if coordinates is set, but if it is, SHOULD match their amount of sets. Can be used for mass production. "lightLevel": 2, // (OPTIONAL) The light level of the block, overrides the global setting "redstoneLevel": 14, // (OPTIONAL) The redstone level of the block, overrides the global setting //Any global setting can be overridden here "shapesOff": [ - { "bounds": [0, 0, 0, 16, 16, 16], "preset": "presetname"}, //A shape can use a preset, which MUST be in presets dictionary + { "bounds": [0, 0, 0, 16, 16, 16], "preset": "presetname"}, //A shape can use a preset, which MUST be defined in presets dictionary { "bounds": [0, 0, 0, 16, 16, 16], "texture": "", "tint": "FFFFFF" }, //Or define its own texture and tint ], "shapesOn": [ @@ -82,4 +86,5 @@ Readers SHOULD refuse to process a label containing itself as a variable, but MA - $BX - Block X Coordinate - $BY - Block Y Coordinate - $BZ - Block Z Coordinate +- $BS - Block Serial Number (reset in every printing session) This list MAY be extended by implementations. From f3f5b7749e0f9f97ccb9ae445e92518206819d84 Mon Sep 17 00:00:00 2001 From: dimaguy Date: Sun, 14 Apr 2024 13:02:29 +0000 Subject: [PATCH 7/7] Create a glossary --- Standards/CCSMB-12.md | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/Standards/CCSMB-12.md b/Standards/CCSMB-12.md index de22171..61c351d 100644 --- a/Standards/CCSMB-12.md +++ b/Standards/CCSMB-12.md @@ -18,9 +18,16 @@ This RFC introduces the 3D JSON Array Format, used for printing 3D Blocks in Com | MIME | `model/3dja` | | Extensions | `.3dja` | -## Technical details -The file MUST be composed of a single JSON object ([RFC 8259](https://datatracker.ietf.org/doc/html/rfc8259), "The JavaScript Object Notation (JSON) Data Interchange Format") with the following ruleset: +## Glossary +This document introduces a few words to help distinguish roles in file handling: +- Writer - Software or Library that writes 3dja files by method of merging single block files or out of other representations of block data. +- Reader - Software or Library that reads 3dja files and either previews the data to the user or passes it to a printer and/or builder. +- Printer - Machine/Software combo that turns 3dja files or reader instructions into printing instructions and executes them. +- Builder - Machine/Software combo that turns 3dja files or reader instructions into building instructions and executes them. + +## Technical details +The file MUST be composed of a single JSON object [^1] with the following ruleset: - The writer SHOULD specify global non-default (according to 3dj) common settings for the printed 3D blocks in the global namespace of the JSON object. - The writer MAY define a dictionary of presets (which are tint/texture combinations), if this isn't done every block MUST use their own texture and tint for each shape. - The writer MUST define an array of block models, following the specifications of the [3dj](https://docs.sc3.io/features/sc-peripherals.html#_3dj-format) format with the addition of a coordinates array (if the user foregoes presets each block model object should be compatible with a 3dj file, the coordinates field SHOULD be disregarded by 3dj-only readers). @@ -29,8 +36,8 @@ The file MUST be composed of a single JSON object ([RFC 8259](https://datatracke - Coordinates are 0-based indexed, ordered by x, y and z each being signed integers. It represents position of blocks in each axis - The reader MAY provide builtin presets, which MUST be overriden if the namespace coincides with one in the file. - The reader MAY provide means of swapping in external presets profiles for recoloring or retexturing, which MUST override part or the entirety of the namespace in file. -- The reader SHOULD facilitate the printing of a single block of the entire set by providing facilities to print a coordinate, a label of a block or it's index in the file. -- The reader SHOULD reject or warn about files whose coordinates don't match boundaries in set in size, if one is set. +- The reader SHOULD facilitate the printing of a single block of the entire set by providing facilities to print a selected coordinate, a selected label of a block or it's index in the file. +- The reader SHOULD warn about files whose coordinates don't match boundaries in set in size, if one is set. A builder MUST fail and refuse the file in such circumstances. - The reader SHOULD reject blocks that try to refer to unknown presets. - A printer SHOULD produce the block in the amount of the sets of coordinates of the block. - A fallback "amount" parameter MAY be accepted per block for mass production purposes, such parameter SHOULD match the amount of coordinates if those are set, but if it doesn't a printer MAY use it to override the amount of sets of coordinates. @@ -80,7 +87,7 @@ The preset dictionary and array of coordinates per block's goal is to achieve so This format provides enough data for an automated building system. ### Label Variables -This list shows substitutions that should be made by Readers during printing. +This list shows placeholder variables for text substitutions that SHOULD be made by Readers using string manipulation at runtime. Readers SHOULD refuse to process a label containing itself as a variable, but MAY let it pass as a raw - $BLABEL - Block Label - $BX - Block X Coordinate @@ -88,3 +95,5 @@ Readers SHOULD refuse to process a label containing itself as a variable, but MA - $BZ - Block Z Coordinate - $BS - Block Serial Number (reset in every printing session) This list MAY be extended by implementations. + +[^1]: [RFC 8259](https://datatracker.ietf.org/doc/html/rfc8259), "The JavaScript Object Notation (JSON) Data Interchange Format")