crypto-art-render
Magic render of crypto art.
Install
npm install crypto-art-render -S
or
yarn install crypto-art-render
Update
- Allow artwork with only 1 master layer.
anchor
always be type of string
, not controlled by tokens any more.
Master Config
Master config defines the rule of rendering for the artwork.
A typical config data structure is shown below:
- name - Artwork name.
- description - Artwork description.
- image - URI of artwork master.
- attributes - List of basic meta info.
- trait_type - Attribute key name Like
Artist
or Layer Count
. - value - Attribute value string.
- layout - Layout of layers.
IntProperty
This type tells the property can be controlled by layer token or just a pure integer.
In typescript, we define:
type IntProperty = {
"token-id": number,
"lever-id": number
} or number;
- token-id - Control layer token id on chain.
- lever-id - Lever index of values from a layer token.
LayerOption
A layer option defines an option of a layer that token holder can choose.
-
uri - Layer resource URI, usually IPFS Cid of image.
-
label - Layer label.
-
anchor - optional. Anchor point id.
-
fixed-position - optional. Fix position of layer at the artwork.
- x (IntProperty)
- y (IntProperty)
-
relative-position - optional. Relative position of layer with the coordinate of the anchor layer.
- x (IntProperty)
- y (IntProperty)
-
fixed-rotation (IntProperty) - optional. Fix rotation degree.
-
orbit-rotation (IntPropery) - optional. Orbit rotation degree around the anchor provided by the layer.
-
mirror (IntPropery) - optional. Mirror transition. Value result will only be 0
or 1
.
-
visible (IntPropery) - optional. Is layer visible. Value result will only be 0
or 1
.
-
finalCenterX (number) - Not pre-defined. Final center coordinate x of layer. This property will be filled during rendering process.
-
finalCenterY (number) - Not pre-defined. Final center coordinate y of layer. This property will be filled during rendering process.
-
active (boolean) - Not pre-defined. Tell the layer can be used as anchor point or not.
-
color - Color scheme of layer
- red (IntProperty)
- green (IntProperty)
- blue (IntProperty)
- alpha (IntProperty)
- hue (IntProperty)
- multiply (IntProperty)
- lighten (IntProperty)
- overlay (IntProperty)
- opacity (IntProperty)
Layer
Inherit from LayerOption, with more fields like:
- id - Required. Layer id
- states - Optional. Multiple state options of layer.
- options
Array<LayerOption>
- list of layer option - token-id - Token that control the value of option index.
- lever-id - Lever index of values
Please see a typical master config example.
Usage
Generator
Module generator
is used to generate artwokr config, define and fill necessary fields more easily.
Check out the API.
Initialize empty config
import { Generator } from "crypto-art-render";
const generator = new Generator();
generator.intialize(
"name",
"desc",
"QmX71QqNunRjE3Sdj78vDGrDyeT3dEMp9xrrQPSx5JCBTQ"
);
generator.setAttributes([
{
[KEY_TRAIT_TYPE]: "Artist",
value: "LowesYang",
},
{
[KEY_TRAIT_TYPE]: "Artist",
value: "YYH",
},
{
[KEY_TRAIT_TYPE]: "Layer Count",
value: "4",
},
]);
generator.setLayout("layer id", 1);
generator.addStatesLayer("layer id", states);
generator.addPureLayer("layer id", layerbody);
console.log(generator.masterConfig);
const eosApi = new EosAPI();
const configCid = "QmQRYre2kUKd3VW13CeY6zowwyK8RwXqbJxkjzpVS6cyrc";
generator.mintwork(eosApi, "contract", "artist", "issuer");
generator.setuptoken(eosApi, "contract", "eosio", 1, 1, [0], [256], [144]);
generator.updatetoken(eosApi, "contract", "eosio", 1, 1, [0], [145]);
Render
Module Render
is used to render image from master config.
Check out the API.
import { Render, IpfsLoader } from "crypto-art-render";
const render = new Render(
new IpfsLoader({ endpoint: "http://127.0.0.1:8080" })
);
console.log(await render.loadMasterConfig("contract", masterTokenId));
const masterTokenId = 0;
const masterImage = await render.renderMaster("contract", masterTokenId);
const compositeImage = await render.renderComposite("contract", masterTokenId);
await masterImage.writeAsync("master.png");
await compositeImage.writeAsync("composite.png");
render.currentState(masterTokenId);
Test
- Start a local IPFS node with http endpoint listening on
8080
. - Add all files in
test/config_example
to local IPFS network. - Start a local EOSIO network with http endpoint listening on
8888
; - Run
npm run test