A Blender add-on written in Python 3 for exporting Blockland bricks (.BLB files) directly from Blender 2.67 and newer without the need for intermediary formats or external programs. It works on the principle of "what you see is what you get", the brick will look exactly the same in-game as it does in the 3D viewport*.
The add-on does not support importing .BLB files yet.
- Features
- Installation
- Terminology
- Brick Scale
- Definition Tokens
- Definition Objects
- Brick Textures
- UV Mapping
- Rounded Values
- Export Properties
- Troubleshooting
- Warning & Error Log Messages
- Contributors
The exporter supports all BLB features.
- Brick size
- Automatic calculation or manually defined
- Brick grid
- Automatic calculation (full brick only) or manually defined
- Coverage
- Manually define hiding own and adjacent brick quads
- Automatic area calculation for arbitrary brick grid shapes
- Automatic and/or manual quad sorting
- Collision boxes
- Automatic calculation (full brick only) or manually defined
- Textures
- Automatic (side texture only) or manual brick texture definition
- Quads
- Triangles are automatically converted to quads
- N-gons are ignored
- UV coordinates
- Manually define UV coordinates
- Automatic UV calculation for all brick textures
- Colors
- Multiple ways to define colors: materials, object names, vertex paint
- Per-vertex coloring
- Transparency
- Additive and subtractive colors
- Flat and smooth shading
- Save and load export settings
- Export multiple bricks from the same file
- Vertices are all relative to the defined or calculated brick bounds
- Object centers (orange dot) are irrelevant: calculations are performed using vertex world coordinates
- Object locations relative to the origin of the world are irrelevant: the calculated center of the brick bounds acts as the new world origin
- Object locations relative to the Blender grid are irrelevant: the brick bounds define the brick grid origin (however it is highly recommended to align the brick bounds object with the Blender grid for ease of use)
- This allows you to easily create multiple bricks in the same file in any location in the 3D space and the bricks still export correctly as expected
- Arbitrary brick grid rotation, however, is not supported
- Selective object export: selection, visible layers, entire scene
- Change brick rotation during export: does not affect objects in the .BLEND file
- Change brick scale during export: does not affect objects in the .BLEND file
- Apply modifiers (e.g. edge split) during export: does not affect objects in the .BLEND file
- Terse file writing: exclude optional lines from the BLB file
- Pretty .BLB files: extraneous zeros are not written at the end of floating point values and if possible, they are written as integers
- Logging with descriptive error and warning messages to help you correct problems with the brick
- Customizable floating point accuracy
- Exporting DTS collision is not yet supported.
These features may or may not be implemented at some unspecified time in the future. Listed below approximately in the order they are planned to be implemented in.
- Exporting DTS collision using Nick Smith's io_scene_dts Blender add-on.
- Importing .BLB files.
- Automatic rendering of the brick preview icon.
- Export-time brick rotation on the Z-axis.
- Download the add-on using one of them methods below:
- The cutting edge: download the latest version of the develop branch or go to the develop branch page and press
Clone or download > Download ZIP
.- The develop branch contains the newest features still under active development. Some functionality may be broken or only half-implemented.
- The latest version: download the latest version of the master branch or go to the front page of the repository and press
Clone or download > Download ZIP
. - A specific version: go to the releases page and follow the instructions on the specific release.
- The cutting edge: download the latest version of the develop branch or go to the develop branch page and press
- Open Blender and go to
File > User Preferences > Add-ons
. - Press the
Install from File...
button at the bottom of the dialog and find the downloaded .ZIP file. - Press
Install from File...
again. - Enable the add-on in the add-ons list and press
Save User Settings
to keep the add-on enabled the next time you start Blender. - The export option is under
File > Export > Blockland Brick (.blb)
.
- Open Blender and go to
File > User Preferences > Add-ons
. - Quickly find the add-on by typing
blb
into the search field. - Expand the add-on by clicking the white triangle on the left, press the
Remove
button, and confirm the removal. - Follow the installation instructions above.
A list of more or less technical terms used in this document. The definitions are in the context of Blockland, Blender, and this exporter and may vary from their mathematical definitions.
- Axis-Aligned Plane
- A plane whose vertices have the same coordinate on exactly one coordinate axis. When this two-dimensional plane is viewed from either of the other two coordinate axes it disappears from view.
- Axis-Aligned Bounding Box / Axis-Aligned Minimum Bounding Box
- A cuboid that completely encompasses all vertices of one or more mesh objects. The faces of this cuboid are parallel with the coordinate axes.
- Axis-Aligned Cuboid
- A cuboid whose faces are parallel with the coordinate axes.
- Brick Grid
- The three-dimensional space of the game divided into 1x1x1 brick plates
- The blocks of
u
,x
,-
, and other characters near the top of the .BLB file that define the brick's placement rules. See Defining Brick Grid.
- Brick
- Coverage (System)
- The Blockland coverage system describes how to hide faces on a brick and any adjacent bricks.
- The six pairs of integers near the top of a BLB file.
- Cuboid
- More specifically a right cuboid in the context of Blockland bricks. A convex polyhedron with 6 faces that are all at right angles to each other. I.e. a regular cube or a cube that is elongated on one axis.
- Definition Object
- An object that has a specific definition token in its name. These objects cannot be seen in-game. They exist to tell the exporter how to create the brick. There are three different definition objects:
- Definition Token
- A special token in an object's name that tells the exporter additional information about that object or the entire brick.
- Face
- A visible surface that is rendered in game and in the Blender viewport.
The surface must be bound by or created by at least three vertices (making it a tri) or in deed any number of vertices (also called an n-gon).
❗ Blockland bricks only support faces made from exactly four vertices: quads.
- Mesh
- The vertices, edges, and faces that make up a 3D model.
- Mesh Object
- A Blender object that contains vertices, edges, and faces. Commonly just referred to as an object.
- Model
- One or more objects that make up a brick.
- N-gon
- Technically any polygon but in this document used to refer to a single face formed from more than four vertices.
N-gons are not necessarily planes.
❗ These are not supported by the exporter or Blockland: the faces will be ignored.
- Object
- Usually a mesh object. Technically refers to all the meshes, cameras, lights, empties, and everything else you see in the 3D viewport. Blender objects contain data about vertices, materials, groups, object names, and more.
- Plane
- A flat two-dimensional surface in 3D space. A particular type of face.
- Quad
- A face with four vertices. Quads are not necessarily planes.
- String
- A sequence of letters. Usually a word.
- Token
- A string surrounded with a whitespace character on one or both sides.
- Tri
- A face with three vertices.
Triangles are always planes.
❗ These are not supported by Blockland bricks and they are converted to quads automatically.
- Visible Object
- Any mesh object that is not a definition object. Visible objects are rendered and are seen in-game as a brick.
- Volume
- A section of 3D space, usually cuboidal in shape in the context of this exporter.
- Whitespace (Character)
- In Blender, commonly a space or a tab character.
This add-on defines a 1x1x1
Blockland brick to be exactly 1.0 1.0 1.2
Blender units on the X, Y, and Z axes.
Likewise a 1x1f
Blockland plate is defined to be exactly 1.0 1.0 0.4
Blender units.
However, the final scale of the exported brick can be changed with the Scale property.
For example setting the Scale property to 150%
means that during the exporting process, the objects are scaled by 1.5
.
This is particularly useful when exporting 3D models created for another BLB exporter/converter that has defined the size of a 1x1f
plate to be different from this exporter.
Definition tokens are special strings added to the names of objects, materials, vertex color layers, and other Blender data objects that have a name. A name field may contain other text in addition to definition tokens as long as the tokens themselves are separated from other tokens and text by one whitespace character such as a space. The definition tokens may be changed from the defaults by selecting Custom Definition Tokens in the export dialog.
💡 Blender adds a running index (e.g. .003
) to the end of duplicate object, material, etc. names.
This is handled correctly, you need not worry about it.
The logic for removing the index simply checks if .
is the fourth last character in the name and simply removes it an everything after it.
❗ Each definition token may only appear once in a name field.
Below is a full list of all default definition tokens with a brief description. For more information on what each of them do, see the specific section of the readme that relates to that token. Note that not all definition tokens change the object into a definition object.
Default Token | Category | Usable In | Is a Definition Object | Meaning |
---|---|---|---|---|
bounds |
Definition objects | Object name | Yes | This is a bounds definition object. |
collision |
Definition objects | Object name | Yes | This is a collision definition object. |
gridb |
Definition objects | Object name | Yes | Write brick grid b symbol in this volume. |
gridd |
Definition objects | Object name | Yes | Write brick grid d symbol in this volume. |
gridu |
Definition objects | Object name | Yes | Write brick grid u symbol in this volume. |
grid- |
Definition objects | Object name | Yes | Write brick grid - symbol in this volume. |
gridx |
Definition objects | Object name | Yes | Write brick grid x symbol in this volume. |
qt |
Quad sorting | Object name | No | Sort these faces in the top section. |
qb |
Quad sorting | Object name | No | Sort these faces in the bottom section. |
qn |
Quad sorting | Object name | No | Sort these faces in the north section. |
qe |
Quad sorting | Object name | No | Sort these faces in the east section. |
qs |
Quad sorting | Object name | No | Sort these faces in the south section. |
qw |
Quad sorting | Object name | No | Sort these faces in the west section. |
qo |
Quad sorting | Object name | No | Sort these faces in the omni section. |
c |
Colors | Object name | No | The next four numbers define the color for these faces. |
blank |
Colors | Material name | No | Do not write a color for faces using this material: use the in-game spray can color as is. |
cadd |
Colors | Material name, vertex color layer name | No | Add the material/vertex color of these faces to the in-game spray can color. |
csub |
Colors | Material name, vertex color layer name | No | Subtract the material/vertex color of these faces from the in-game spray can color. |
Mesh definition tokens are a sub-category of definition tokens that can only be used in the names of objects but do not change the object into an invisible definition object. Objects that have one or more of these definition tokens are treated as visible objects and they govern some aspect of the faces of the mesh in that object.
❗ Each definition token may only appear once in a name field but a name may contain both definition tokens.
Definition | Default Token | Requirements | Maximum Count/Brick | Description |
---|---|---|---|---|
Color | c |
See Defining Colors | Unlimited | Defines the color of the faces. |
Coverage | See Defining Quad Sorting & Coverage | Must contain a face | Unlimited | Assigns the object's quads into a specific section in the brick. |
BLB files allow mesh faces to be sorted into seven sections: top, bottom, north, east, south, west, and omni. Quads in these sections may then be automatically hidden in-game using the coverage system, if it is defined in a meaningful way in the BLB file.
The coverage system allows the game to skip rendering quads that are completely covered by adjacent bricks improving the frame rate when a large number of bricks are on the screen at once. Quads are sorted into these sections by using one of the tokens below in the name of the object containing the faces to be sorted into that section. If a visible object has no quad sorting token specified, the omni section is used.
Default Token | Section |
---|---|
qt |
Top |
qb |
Bottom |
qn |
North |
qe |
East |
qs |
South |
qw |
West |
qo |
Omni ("any" or "none", default) |
❗ Sorting quads in this manner is pointless unless the Coverage property in the export dialog is enabled and at least one option is enabled.
❗ Due to how Blockland handles .blb files, ensure that north is assigned to faces facing the +Y direction, east is assigned to faces facing the +X direction, with south and west corresponding to -Y and -X respectively.
In the export dialog Coverage properties there are two options for each section/side of the brick:
Option | Description |
---|---|
Hide Self | For example when enabled for the top section, the game will not render the quads in the top section of this brick when the top area of this brick is completely covered. |
Hide Adjacent | For example when enabled for the top section, the game will not render the quads in the bottom section of adjacent bricks on top of this brick if the coverage rules for those adjacent bricks are fulfilled. |
The exporter supports three methods for defining brick colors. To allow faces to be colored using the spray can tool in game do not assign a color those faces. See RGBA Color Format for a detailed explanation of how to write an RGBA color value.
Method | Overrides | Extent of Coloring | RGB Values | Alpha Value | Notes |
---|---|---|---|---|---|
Object Colors | In-game paint color | Entire object (color & alpha) | In object name after the Color token | In object name after the red, green, and blue values | Implemented only to support legacy brick models, not recommended for use. |
Material Colors | Object Colors | Assigned faces (color & alpha) | In Material tab as Diffuse Color |
In Material tab under Transparency in Alpha slider |
The recommended method for defining color. Multiple materials may be used in a single object. |
Vertex Colors | Material Colors | Entire object (per-vertex color), entire object (alpha) | In Data tab under Vertex Color as a vertex color layer, modified using the Vertex Paint mode |
In Data tab under Vertex Color as the name of the vertex color layer |
Creating a vertex color layers will color the entire object white, but the color of individual vertices may be changed. |
There are three definition tokens that are specific to dealing with colors.
Token | Usable In | Description |
---|---|---|
blank |
Material name | Ignore the material's color and do not write any color for the faces with this material assigned so they can be colored by the spray can in-game. This feature exists because an object that has a material, cannot have faces that do not have a material assigned to them. |
cadd |
Material name, vertex color layer name | Use this color as an additive color: add the values of this color to the spray can color in-game. For example to make the spray can color a little lighter use a dark gray color. |
csub |
Material name, vertex color layer name | Use this color as a subtractive color: subtract the values of this color from the spray can color in-game. For example to make the spray can color a lot darker use a light gray color. |
The exporter understands two ways of defining an RGBA color using text.
❗ Please note that you must use a comma character (,
) as the decimal separator for floating point numbers.
- The commonly used method of writing 4 integers that are in the range 0–255, where 0 is black, separated with a whitespace character such as a space.
For example
127 255 10 191
for a yellow-green color that is 25% transparent. A full object name could be for exampleglass c 240 255 255 128.001
.- In the above example the running index
.001
that Blender added at the end would be removed by the exporter.
- In the above example the running index
- Writing 4 decimals in the range 0.0–1.0, where 0.0 is black, separated with a whitespace character such as a space.
An object could have a name such as
c 0,125 0,0 0,5 1,0 flower
, for example.- The leading zero may be omitted.
- Up to 16 decimals are supported.
When a specific definition token is read in an object's name it is treated as a definition object. Definition objects contain non-visual data about the brick and as such are not exported as visual objects
Definition Object | Default Token | Requirements | Maximum Count/Brick | Must Be Within Bounds | Axis-Aligned | Brick Grid Aligned | Can Overlap | Description |
---|---|---|---|---|---|---|---|---|
Bounds | bounds |
At least two vertices, must have volume | 1 | N/A | Yes (1) | Yes | N/A | Defines the dimensions or the size of the brick. |
Collision | collision |
At least two vertices, must have volume | 10 | Yes (2) | Yes | No | Yes | Defines a collision cuboid. See Defining Collision for more info. |
Brick Grid | See Defining Brick Grid | At least two vertices, must have volume | Unlimited | Yes | Yes (1) | Yes | Yes (3) | Defines a volume in the brick grid to fill with a specific brick grid symbol. |
(1) It is highly recommended to use axis-aligned cuboids to define bounds and the brick grid. However, if you insist on defining the size of your brick in monkey heads, you can. Only the axis-aligned bounding box of the bounds and brick grid objects are used.
(2) Collision boxes outside brick bounds are technically not invalid and the brick will function in-game. This behavior is not allowed by the exporter because collision outside brick bounds is horribly broken as it was never intended work in that manner.
(3) See Defining Brick Grid for the specific rules about overlapping brick grid definitions.
Blockland bricks only supports AABB collision. In other words brick collision may only be defined using cuboids of varying sizes that align with the coordinate axes. You can rotate said cuboids however you want but that will not lead to rotated collision cuboids in-game. Only the the axis-aligned bounding box of the collision definition objects are used.
💡 Using any other shape than an axis-aligned cuboid to define collision is not recommended as it makes the Blender file more difficult to understand and also breaks the "what you see is what you get" principle.
Brick grid definitions represent a 3D volume in the 3D space the brick grid encompasses. You can imagine it as if the entire cuboidal shape of the brick would be filled with 1x1f plates and these volumes define the properties of all the 1x1f plates within that volume. Each brick grid definition has their own priority. When two or more brick grid definition objects overlap in 3D space, the one with the higher priority takes precedence and will overwrite the symbols in the brick grid that any definitions with lower priorities would have written.
❗ Be aware that if your brick does not contain a brickd
definition on the bottom of the brick, the brick cannot be planted on other bricks or the ground.
Default Token | Brick Grid Symbol | Description |
---|---|---|
gridb |
b |
Bricks may be placed above and below this volume. This brick can be planted on the ground. |
gridd |
d |
Bricks may be placed below this volume. This brick can be planted on the ground. |
gridu |
u |
Bricks may be placed above this volume. |
grid- |
- |
Bricks may be placed inside this volume. (I.e. empty space.) This is the default symbol, any volume that does not have a brick grid definition uses this symbol. |
gridx |
x |
Bricks may not be placed inside this volume. |
Defining brick textures is done using Blender materials. To assign a brick texture to a face, assign a material to it containing a valid brick texture name (case insensitive):
bottomedge
bottomloop
print
ramp
side
top
If no brick texture is defined, side
is used.
Material name may contain other words as long as the brick texture name is separated from them with one whitespace character such as a space.
A common combination is to define a brick texture name and the definition token blank
(e.g. blank ramp
or side blank
) to allow the player to color the face in-game using the spray can.
Manually defined UV coordinates must be stored in one or more UV layers that do not share a name with one of the automatically generated UV layers:
TEX:BOTTOMEDGE
TEX:BOTTOMLOOP
TEX:PRINT
TEX:RAMP
TEX:TOP
Any data in UV layers with one the names above will the overwritten during automatic UV calculation.
❗ Note that BLB files only support storing quads. As such, any tris with UV coordinates will have their last UV coordinate duplicated to transform it into a quad. This may or may not cause visual distortion in the UV mapping.
If the Calculate UVs property is enabled, UV coordinates will be automatically calculated based on the dimensions of the quad and the name of the material assigned to it. (See Brick Textures to learn how to define brick textures with materials.) The generated coordinates are only guaranteed to be correct for strictly rectangular quads, for any other shapes the results may not be satisfactory. If using brick textures on non-rectangular quads it is recommended to manually define the UV coordinates for best results.
Floating point numbers (numbers with a decimal point) contain inherent inaccuracies.
For example when exporting a 1x1x1 brick model at the maximum accuracy the vertex coordinate of one of the corners is 0.5 0.5 1.5000000596046448
.
This causes the 1x1x1 brick to be 3.00000011920928955078125
plates tall instead of exactly 3.0
like it should.
The only way to get fix this error is to round the vertex coordinates.
Practically speaking it is impossible to visually discern the difference between a brick that is 3 plates tall versus one that is 3.00000011920928955078125
plates tall in the game.
The only real benefit that comes from the rounding is nicer looking .BLB files.
The default value of 0.000001
was chosen through manual testing.
Rest assured that the rounding will cause no visual oddities whatsoever because the value is so small.
This was manually confirmed with a sphere brick made from 524288 quads.
Moving the camera as close to the surface of the brick as the game was capable of rendering, the surface of the sphere appeared mathematically perfect because the distance between the vertices was less than the size of a single pixel.
❗ The exporter will only ever write up to 16 decimal places regardless of the precision of the value.
Floating Point Value | Rounded |
---|---|
Visible object vertex coordinates | Yes |
Bounds object vertex coordinates | Yes |
Collision object vertex coordinates | Yes |
Brick grid object vertex coordinates | Yes |
Normal vectors | Optional |
RGBA color values | No |
UV coordinates | No |
The following user properties are present in the current version of the exporter.
How many bricks to export in one go from the file.
Value | Description |
---|---|
Single | Export only one brick. (Default) |
Multiple | Export one or more bricks. Shows additional settings when selected. |
Where the .BLB file name is defined.
Value | Description |
---|---|
Bounds | Brick name is defined in the Bounds object after the bounds definition token, separated with a whitespace character. Export file dialog is only used set to directory. (Default) |
File | Brick name is the same as the file name. Can be manually set in the export file dialog. |
Which objects to process and export to the .BLB file.
Value | Description |
---|---|
Selection | Objects that are selected and have an orange outline. (Default) |
Layers | All objects in the layers that are currently visible, regardless of selection. |
Scene | All objects in the current scene. I.e. all objects in all layers regardless of the layer visibility. |
Where the names of the .BLB files are defined.
Value | Description |
---|---|
Bounds | Brick names are defined in the Bounds object after the bounds definition token, separated with a whitespace character. Export file dialog is only used set to directory. (Default) |
Groups | Brick names are the same as the names of the groups name. Export file dialog is only used set to directory. |
How is a single brick defined.
Value | Description |
---|---|
Groups | Each brick is in its own group. Objects in multiple groups belong to multiple bricks. (Default) |
Layers | Each brick is in its own layer. Objects in multiple layers belong to multiple bricks. When selected brick names must be defined in the Bounds object. |
Which bricks to process and export to .BLB files.
Value | Description |
---|---|
Layers | Export all bricks in the layers that are currently visible. (Default) |
Scene | Export all bricks in the current scene. I.e. all bricks in all layers regardless of the layer visibility. |
The Blender coordinate axis that will point forwards in-game when the player plants the brick directly in front of them without rotating it. Does not change the rotation of the objects in the Blender scene.
Value | Description |
---|---|
+X | Positive X-axis |
+Y | Positive Y-axis (Default) |
-X | Negative X-axis |
-Y | Negative Y-axis |
The scale of the brick in-game.
Values outside the the range of 0.001–400.0 may be typed in manually.
Does not change the scale of the objects in the Blender scene.
See Brick Scale for additional information.
(Default: 100%
)
Applies any modifiers on the object before exporting.
Does not change the modifiers of the objects in the Blender scene.
(Default: True
)
Allows you to specify the definition tokens the exporter uses.
See Definition Tokens for more information.
(Default: False
)
💡 Enabling this property shows additional properties.
Export custom collision definitions if there are any.
See Defining Collision.
(Default: True
)
The type of collision to calculate for the brick if no custom collision definitions are found. Enabling this property shows additional properties.
Value | Description |
---|---|
Bounds | Use the defined or calculated bounds of the brick as the collision cuboid. (Default) |
AABB | Calculate the axis-aligned bounding box of all visible objects and use that as the collision cuboid. |
Enable coverage calculations.
This is pointless unless Automatic Quad Sorting is enabled or at least one object has a quad sorting definition.
See Defining Quad Sorting & Coverage for more information.
(Default: False
)
💡 Enabling this property shows additional properties.
Automatically calculate the correct section for quads that in the same plane as the bounding planes of the bounds object.
This is pointless unless Coverage is enabled.
(Default: True
)
Assign face colors from object materials.
(Default: False
)
Assign face colors from vertex color layers.
(Default: False
)
Assign face colors from object names.
(Default: False
)
Automatically calculate correct UV coordinates based on the brick texture name specified in the material name.
See UV Mapping for more information.
(Default: True
)
Instead of attempting to calculate the appropriate UV coordinates for a face with the SIDE texture, use a square that takes up the full UV space instead.
The UVs will be identical to that of the PRINT texture.
Sometimes when the automatic side UV calculation fails miserably this option may produce a better result.
(Default: False
)
Write calculated UVs into Blender objects.
Data in existing generated UV layers will be overwritten.
See UV Mapping for a list of generated UV layer names.
(Default: True
)
Round vertex normals to the user-defined floating point value precision.
If disabled normals will be written as accurately as possible but extraneous zeros will still be removed.
(Default: False
)
Allows you to specify a custom precision for floating point numbers.
See Rounded Values for more details.
(Default: 0.000001
)
When enabled does not write extraneous zeros to the end of floating point numbers.
Additionally if a numerical value is exactly equal to an integer, no decimal places are written.
If disabled will write all floating point numbers using as many decimal places as used in the Precision property.
(Default: True
)
Write a log file to the same folder as the exported brick detailing the export process.
Shows additional settings when selected.
(Default: True
)
Write a log file only if warnings or errors occurred during the export process.
(Default: True
)
When enabled does not write optional lines to the .BLB file such as the lines marking the different quad sections.
Using this option is not recommended as it makes the .BLB file harder to read and understand.
Although the file is shorter, the difference in file size is negligible.
(Default: False
)
Solutions to common issues with the BLB Exporter. If you have another issue with the exporter be sure to enable the Write Log property and export again. The log file may contain warnings or errors describing issues with the objects and how to fix them. Additional instructions on how to fix specific issues are detailed in the Warning & Error Log Messages section.
The automatic UV calculation is only designed to work with rectangular quads. Manually define UV coordinates for non-rectangular quads.
The quad with incorrectly rotated UV coordinates (e.g. the lightest side of the SIDE texture pointing sideways instead of up) is not a perfect rectangle.
Even one vertex being off by some minuscule, visually indistinguishable amount from a perfectly rectangular shape can cause the automatic UV calculation to incorrectly determine the rotation of the quad.
Double check all 4 coordinates of the quad and manually correct any floating point errors.
If working on axis-aligned quads or if the vertices should be on grid points snapping the coordinates of the problem quad to grid coordinates by selecting Mesh > Snap > Snap Selection to Grid
in the 3D viewport toolbar usually fixes floating point errors.
Blockland automatically performs rotations on the UV coordinates of the TOP brick texture during runtime so that the lightest side of the texture is always facing towards the sun. Because of this there is no correct way of representing the TOP brick texture in Blender. As a compromise the exporter will rotate the lightest side of the TOP brick texture to face towards the axis select in the Forward Axis property. This means the UV coordinates of the TOP brick texture in Blender may not match those in the written BLB file.
Detailed explanations of the warning and error messages logged by the program and directions on how to solve the associated issues.
In the messages listed in this section the #
character is used to represent a variable numerical value.
Text in code tags
describes a variable alphanumeric value, commonly the name of a Blender object.
Warning log messages can be ignored as the issues are automatically corrected, but the resulting brick may not behave or look as excepted. It is recommended to manually adjust the brick until no warning messages are present in the output log.
Code | IOBLBW000 |
---|---|
Message | Calculated bounds have a non-integer size # # # , rounding up. |
Cause | No bounds object was defined and the axis-aligned bounding box calculated from the has non-integer dimensions when converted to brick space. |
Effect | Brick dimensions of the calculated bounding box will be rounded up to ensure that collision cuboids (if any) still fit within the bounds. |
Solutions |
|
Code | IOBLBW001 |
---|---|
Message | Defined bounds have a non-integer size # # # , rounding to a precision of # . |
Cause | The axis-aligned bounding box calculated from the defined bounds object has non-integer dimensions as a brick. |
Effect | The brick dimensions will be rounded to the specified precision. |
Solution | Ensure that the defined bounds object aligns with the brick grid. |
Code | IOBLBW002 |
---|---|
Message | Brick name was supposed to be in the bounds definition object but no such object exists, file name used instead. |
Cause | The "Brick Name(s) from" export property (either in single or multiple brick export mode) value was set to Bounds but no manually defined bounds object was found. |
Effect | The file name specified in the export dialog is used as the name of the BLB file instead. |
Solution | Create a bounds object and in the name of the object separate the name of the BLB file from the bounds definition token with a whitespace character. |
Code | IOBLBW003 |
---|---|
Message | Brick name was supposed to be in the bounds definition object but no name (separated with a space) was found after the definition token, file name used instead. |
Cause | The "Brick Name(s) from" export property (either in single or multiple brick export mode) value was set to Bounds but no string was found after the bounds definition token in the name of the bounds object. |
Effect | The file name specified in the export dialog is used as the name of the BLB file instead. |
Solution | Separate the name of the BLB file from the bounds definition token with a whitespace character, such as a space. |
Code | IOBLBW004 |
---|---|
Message | No brick grid definitions found. Full cuboid brick grid may be undesirable. |
Cause | There are no brick grid definition objects. |
Effect | A full block brick grid will be generated. Brick will act as if it were a basic cuboid brick of that size. |
Solution | Create brick grid definitions for the model. |
Code | IOBLBW005 |
---|---|
Message | # brick grid definition(s) found but was/were not processed. Full cuboid brick grid may be undesirable. |
Cause | An error occurred for all brick grid definition objects when converting into a brick placement rule. |
Effect | A full block brick grid will be generated. Brick will act as if it were a basic cuboid brick of that size. |
Solution | Create valid brick grid definitions for the model. |
Code | IOBLBW006 |
---|---|
Message | # collision definition(s) found but was/were not processed. |
Cause | An error occurred for all collision definition objects when calculating their dimensions. |
Effect | The fallback collision will be used. |
Solutions |
|
Code | IOBLBW007 |
---|---|
Message | No brick bounds definition found. Calculated brick size may be undesirable. |
Cause | Brick did not have a bounds definition object. |
Effect | The axis-aligned bounding box of all visible objects will rounded to the nearest brick dimensions and used as the brick bounds. |
Solution | Create a bounds definition object. |
Code | IOBLBW008 |
---|---|
Message | Object 'object name ' has # vertex color layers, only using the first. |
Cause | The object had more than one vertex color layer. |
Effect | Only the first vertex color layer is used. |
Solution | Delete the additional vertex color layers. |
Code | IOBLBW009 |
---|---|
Message | Face has UV coordinates but no brick texture was set in the material name, using SIDE by default. |
Cause | The material assigned to a face had no brick texture defined but the face had UV coordinates. |
Effect | The side brick texture is used for the face. |
Solution | Manually define brick textures in the names of the materials that are assigned to UV mapped faces. |
Code | IOBLBW010 |
---|---|
Message | No alpha value set in vertex color layer name, using 1.0. |
Cause | The color defined in the vertex color layer did not contain an alpha value. |
Effect | Alpha of 1.0 is used resulting in an opaque color. |
Solution | Define the alpha value in the vertex color layer name. |
Code | IOBLBW011 |
---|---|
Message | # triangles converted to quads. |
Cause | A mesh contained a triangle. |
Effect | The triangle is forcefully converted into a quad by copying the first vertex and using that as the last vertex of a quad.
This conversion has three different outcomes:
|
Solution | Do not use triangles in any meshes. |
Code | IOBLBW012 |
---|---|
Message | # n-gons skipped. |
Cause | A mesh contained a face made from more than 4 vertices. |
Effect | Faces made from more than 4 vertices are not exported. |
Solution | Manually rebuild faces made from more than 4 vertices using quads. |
Code | IOBLBW013 |
---|---|
Message | Precision has too many decimal digits, using 16 instead. |
Cause | The precision value set in the Precision property had more than 16 decimal digits. |
Effect | If Pretty Print is disabled the number of decimal digits written to the BLB file is clamped to 16. |
Solution | Only write up to 16 decimal places in the Precision value. |
Errors are separated into two categories: fatal and non-fatal errors.
- Fatal errors cause the program execution to stop as there is insufficient or incorrect input data to process into a Blockland brick.
- Non-fatal errors occur when the exporter attempts to do something (due to invalid input data) that would have caused an error when loading or using the exported brick in game. Alternatively the user has attempted to do something that is explicitly not allowed by the exporter or would lead to a mathematical error.
It is recommended to manually adjust the brick until no error messages are present in the output log.
Fatal errors always lead to the program execution stopping.
Code | IOBLBF000 | ||||||||
---|---|---|---|---|---|---|---|---|---|
Message | When exporting multiple bricks in separate layers, a bounds definition object must exist in every layer. It is also used to provide a name for the brick. | ||||||||
Cause | The following export properties are set:
|
||||||||
Reason | In the interest of promoting good workflow practices this is considered a fatal error instead of automatically naming the brick by the index of the layer it is contained in. | ||||||||
Solution | Ensure that there is exactly one valid bounds definition object in every visible layer. |
Code | IOBLBF001 | ||||||||
---|---|---|---|---|---|---|---|---|---|
Message | When exporting multiple bricks in separate layers, the brick name must be after the bounds definition token (separated with a space) in the bounds definition object name. | ||||||||
Cause | The following export properties are set:
|
||||||||
Reason | In the interest of promoting good workflow practices this is considered a fatal error instead of automatically naming the brick by the index of the layer it is contained in. | ||||||||
Solution | Ensure that each bounds definition object contains the name of that brick. |
Code | IOBLBF002 |
---|---|
Message | Unable to store UV coordinates in object 'object name ' while it is in edit mode. |
Cause | The Store UVs property is enabled and the exporter attempted to write UV coordinates to a Blender object that is currently in edit mode. |
Reason | The authors have not bothered to find a way to automatically disable and re-enable the edit mode. |
Solution | Confirm that you are not in the edit object interaction mode by changing to the Object Mode in the 3D viewport. |
Code | IOBLBF003 |
---|---|
Message | Brick has no volume, brick could not be rendered in-game. |
Cause | The bounds definition object or the automatically calculated axis-aligned bounding box of the brick was smaller than 1 brick on one or more axis. |
Reason | A brick size cannot be zero on any axis. |
Solution |
|
Code | IOBLBF004 |
---|---|
Message | Brick size (# x# x# ) exceeds the maximum brick size of 64 wide 64 deep and 256 plates tall. |
Cause | The bounds definition object or the automatically calculated axis-aligned bounding box of the brick is larger than maximum brick size supported by Blockland. |
Reason | The maximum size of a single Blockland brick is 64 plates wide 64 plates deep and 256 plates tall. |
Solution | Make your brick bounds smaller, while keeping in mind the rules regarding other definition objects. |
Code | IOBLBF005 |
---|---|
Message | No faces to export. |
Cause | None of the had any faces. |
Reason | Creating a brick with no visible faces is pointless. |
Solution | Ensure that there is at least one face to export. |
Code | IOBLBF006 | |||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Message | No objects to export. | |||||||||||||||||||||||||
Causes | Depends on the values of various export properties.
|
|||||||||||||||||||||||||
Reason | No data to export, nothing to do. | |||||||||||||||||||||||||
Solutions | Depends on the values of various export properties.
|
Code | IOBLBF007 |
---|---|
Message | Two or more brick grid definitions had the same priority. |
Cause | Two or more user defined brick grid definition tokens had the same priority number. |
Reason | The user-intended priority order of the tokens cannot be automatically determined. |
Solution | Ensure that all custom brick grid definition tokens have a unique priority number. |
Code | IOBLBF008 | ||||||
---|---|---|---|---|---|---|---|
Message | No groups to export in the current scene. | ||||||
Cause | The following export properties are set:
|
||||||
Reason | No data to export, nothing to do. | ||||||
Solution | When exporting multiple bricks in groups, ensure that there are groups to export. |
Code | IOBLBF009 | ||||||
---|---|---|---|---|---|---|---|
Message | Nothing to export in the visible layers of the current scene. | ||||||
Cause | The following export properties are set:
|
||||||
Reason | No data to export, nothing to do. | ||||||
Solution | When exporting multiple bricks in groups, ensure that there are groups to export. |
Code | IOBLBF010 |
---|---|
Message | Invalid floating point value given for floating point precision property. |
Cause | The string specified in the Precision property was not a numerical value. |
Reason | The numerical values that are rounded to combat floating point inaccuracies cannot be rounded unless the floating point precision is set. |
Solution | Write a numerical value as the Precision property. |
Code | IOBLBE000 |
---|---|
Message | Brick grid definition object 'object name ' has vertices outside the calculated brick bounds. Definition ignored. |
Cause | A brick grid definition object had vertices outside the automatically calculated brick bounds. |
Reason | Blockland does not allow brick grid definitions outside the bounds of a brick. |
Effect | The brick grid definition object is discarded. |
Solutions |
|
Code | IOBLBE001 |
---|---|
Message | Brick grid definition object 'object name ' has vertices outside the bounds definition object 'object name '. Definition ignored. |
Cause | A brick grid definition object had vertices outside the bounds object. |
Reason | Blockland does not allow brick grid definitions outside the bounds of a brick. |
Effect | The brick grid definition object is discarded. |
Solutions |
|
Code | IOBLBE002 |
---|---|
Message | Brick grid definition object 'object name ' has no volume. Definition ignored. |
Cause | The axis-aligned bounding box of a brick grid definition object was either a plane or a point. |
Reason | A brick grid definition with no volume does not produce any brick placement rules when calculating the brick grid. |
Effect | The brick grid definition object is discarded. |
Solution | Ensure that the specified brick grid definition object is not a point or a plane and has some volume. |
Code | IOBLBE003 |
---|---|
Message | # collision cuboids defined but 10 is the maximum, only using the first 10. |
Cause | More than 10 collision definition objects were found. |
Reason | A BLB file may have a maximum of 10 collision boxes. |
Effect | Only the 10 oldest objects marked as collision definitions will be used. |
Solution | Delete the additional collision definition objects. |
Code | IOBLBE004 |
---|---|
Message | Collision definition object 'object name ' has less than 2 vertices. Definition ignored. |
Cause | A collision definition object had 1 or 0 vertices. |
Reason | At least two points are required to specify a volume in three-dimensional space. |
Effect | The specified collision definition object is discarded. |
Solution | Ensure that the specified collision definition object has at least 2 vertices. |
Code | IOBLBE005 |
---|---|
Message | Collision definition object 'object name ' has no volume. Definition ignored. |
Cause | The axis-aligned bounding box of a collision definition object was either a plane or a point. |
Reason | A two-dimensional collision box does nothing in game. |
Effect | The collision definition object is discarded. |
Solution | Ensure that the specified collision definition object is not a point or a plane and has some volume. |
Code | IOBLBE006 |
---|---|
Message | Collision definition object 'object name ' has vertices outside the calculated brick bounds. Definition ignored. |
Cause | A collision definition object had vertices outside the automatically calculated brick bounds. |
Reason | Collision boxes outside the bounds of a brick cause strange behavior in game. |
Effect | The collision definition object is discarded. |
Solutions |
|
Code | IOBLBE007 |
---|---|
Message | Collision definition object 'object name ' has vertices outside the bounds definition object 'object name '. Definition ignored. |
Cause | A collision definition object had vertices outside the bounds object. |
Reason | Collision boxes outside the bounds of a brick cause strange behavior in game. |
Effect | The collision definition object is discarded. |
Solutions |
|
Code | IOBLBE008 |
---|---|
Message | Object 'object name ' cannot be used to define bounds, must be a mesh. |
Cause | A non-definition token in its name. |
Reason | Non-axis-aligned bounding box. |
Effect | The specified object is ignored. |
Solution | Remove the bounds definition token from the name of the object. |
Code | IOBLBE009 |
---|---|
Message | Object 'object name ' cannot be used to define brick grid, must be a mesh. |
Cause | A non-definition token in its name. |
Reason | Non-axis-aligned bounding box. |
Effect | The specified object is ignored. |
Solution | Remove the brick grid definition token from the name of the object. |
Code | IOBLBE010 |
---|---|
Message | Object 'object name ' cannot be used to define collision, must be a mesh. |
Cause | A non-definition token in its name. |
Reason | Non-axis-aligned bounding box. |
Effect | The specified object is ignored. |
Solution | Remove the collision definition token from the name of the object. |
Code | IOBLBE011 |
---|---|
Message | Bounds already defined by 'object name ', bounds definition 'object name ' ignored. |
Cause | One brick contained more than one bounds definition object. |
Reason | Although it is technically possible to calculate the axis-aligned bounding box of multiple bounds definitions and use that as the final bounds of the brick a feature like this would be confusing for beginner users and breaks the "what you see is what you get" principle of the exporter. |
Effect | The oldest bounds definition object is used and the rest are discarded. |
Solution | Delete the additional bounds definition objects. |
Code | IOBLBE012 |
---|---|
Message | Multiple brick grid definitions in object 'object name ', only the first one is used. |
Cause | A single definition object contained more than one brick grid definition token. |
Reason | One brick grid definition object may only be used to define one brick placement rule. |
Effect | Only the first brick grid definition token is used. |
Solution | Delete the additional brick grid definition tokens. |
Code | IOBLBE013 |
---|---|
Message | More than 4 color values defined for object 'object name ', only the first 4 values (RGBA) are used. |
Cause | Object name contained more than 4 color values. |
Reason | An RGBA color is be defined by exactly 4 numerical values: red, green, blue, and alpha. |
Effect | Only the first 4 numbers are used as color values. |
Solution | Remove the additional numbers. |
Code | IOBLBE014 |
---|---|
Message | Object 'object name ' has # section definitions, only using the first one: section name |
Cause | The object had more than one quad section definition token. |
Reason | A single face cannot be in multiple quad sorting sections at the same time. |
Effect | Only the first section definition token is used. |
Solution | Delete the additional section definition tokens. |
Code | IOBLBE015 |
---|---|
Message | More than one brick texture name found in material 'material name ', only using the first one. |
Cause | The material name contained more than one brick texture name. |
Reason | A single face cannot have multiple brick textures at the same time. |
Effect | Only the first brick texture name is used. |
Solution | Delete the additional brick texture names. |
- Nick Smith - The original source code for reading, processing, and writing Blender data into the .BLB format. A majority of his code has been rewritten since.
- Demian Wright - Significant extensions and rewrites to Nick's original code and all additional features.
* There's always a footnote, see the issue with the TOP brick texture.