0% found this document useful (0 votes)
337 views

STL To TaleSpire

Detailed instructions on how to take a .stl 3d model and import into the TTRPG tool - TaleSpire
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
337 views

STL To TaleSpire

Detailed instructions on how to take a .stl 3d model and import into the TTRPG tool - TaleSpire
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 62

STL to TaleSpire

A text guide by simsete.


Thanks to HolloFox for reviewing and editing and CD Cyber Dragon for the Blender map baking
video link.

Programs
Blender
Substance Painter (Optional)
Unity 2019.4.25f1
1. STL to high and low poly models
1.1 Open a new General scene in Blender.
1.2 Select and delete unnecessary scene objects
1.3 Import .stl
1.4 Delete base
1.5 (Optional) Mesh cleanup
1.6 Making a lower polygon count mesh
1.7 Exporting files
2. UV Unwrap
2.1 Substance Painter Auto-unwrap
2.2 (Optional) Blender unwrapping
3. Baking and Painting
3.1.a Baking maps in Substance Painter
3.1.b Baking maps in Blender
3.2 Painting Template setup
3.3 Painting Masks
3.4 Materials
3.5 Texture export template
3.6 Export
3.7 (Bonus) Saving groups as smart materials
4. Making an assetbundle
4.1 Creating a unity project
4.2 Folder structure
4.3 Asset import
4.4 Portrait and Info.txt
4.5 Creating the assetbundle script
4.6 Making and testing an assetbundle
5. Common problems and how to fix them
5.1 Assets not scaled correctly
5.2 Mini appears offset from base
5.3 Painting appears deformed or is very low resolution in places
5.4 Empty base when placing the mini in TaleSpire
6. Making and uploading a mini pack to thunderstore.io
Copyright and licensing
Requirements
Create an icon.png file
Create a README.md file
Create a manifest.json
Assetbundle files
Zipping
Uploading to Thunderstore.io
Updating a mini pack
7. Blender tools and concepts
Object Mode
Edit Mode
Viewpoint controls
Preset viewpoints
Select Box
Box select
Circle select
Expand and shrink selection
Select Linked
Selection Mode
X-ray mode
Scale
Apply Transforms
8. Appendix
8.1 Reference models
8.2 Reference textures

Programs

Blender
Free
This guide is using Blender 3.1.2. Feel free to use newer versions. Later versions might miss
some of the features used.
Open .stl, or any other model type files and convert to .fbx or .obj.
(Optional, advanced) Unwrap model uvs.
(Optional) Paint models and generate texture files.
Substance Painter (Optional)
Subscription/One month trial or one time purchase
Auto unwrap model uvs.
Bake normal, height and ambient occlusion maps.
Paint models and generate texture files.

Unity 2019.4.25f1
Free.
Other Unity 2019 to 2020 versions work for regular custom mini models, but might have trouble
exporting effects
Import models and textures and export them to TaleSpire

1. STL to high and low poly models


1.1 Open a new General scene in Blender.

1.2 Select and delete unnecessary scene objects


A key to select all objects in Object Mode, Delete key to delete.
1.3 Import .stl

Go to File->Import->Stl (.stl)

You should have something similar to this. Should your model not be visible, press the Numpad
Dot key to focus on it.
Set your model to Shade Smooth. (In Object mode, Right click and select Shader Smooth)
1.4 Delete base

Switch to Edit Mode.


Select the base’s vertices and delete them. If necessary, clean up holes left by base deletion.

Mastiff base removal Timelapse

1.5 (Optional) Mesh cleanup


As stl files are intended for 3D printing, they sometimes have artifacts that don’t matter for 3D
printing but may be noticeable in TaleSpire.

Mastiff Cleanup Timelapse

1.6 Making a lower polygon count mesh


Game meshes can’t usually afford to have too many polygons, so we’ll need to lower the mesh’s
polygon count. TaleSpire models tend to aim for 5~15K (K = thousand) polygons. I like to keep
mine at least under 30K. Should this be a model of which there are many instances of, try and
keep the 5~15K polygon count. For characters of which only one instance should appear, you
can afford to have a higher count. Up to you.

Make a copy of the original mesh. We will need it later to get the details back.
Turn on statistics in Blender to know your mesh’s polygon count.
Turning on statistics, we can see that after base removal and clean-up, the Mastiff has 419,892
polygons (faces).

There are several methods you can use to lower the polygon count. In Blender, what has
worked best for me so far is a combination of Voxel Remesh and Decimate Geometry.

Mastiff Mount Quick Retopology Timelapse

1.7 Exporting files


Select the high-poly mesh and export in .fbx, with “selected objects” and “apply transform”
active.
Do the same for the low-poly mesh.

2. UV Unwrap
2.1 Substance Painter Auto-unwrap
Open a new Substance Painter project.

Select mesh to paint.


Select resolution. (I recommend using 1024 for Normal sized characters without much detail)
Keep Auto-unwrap checked.
Click OK and wait for the import and auto-unwrap.
.You should have something like this.

To check the uv map, add a uv checker generator to the default [Layer 1].

Right click the layer and select [Add generator].


Under Properties, click Generator->UV Checker.

You should have something like this.


If the checker pattern appears normal, everything is fine. Should it appear too stretched or
deformed, you’ll want to do manual unwrapping as shown in the next section. Otherwise, delete
or hide this layer.
2.2 (Optional) Blender unwrapping
Open the model in Blender.

Switch to the UV Editing tab. If there is none, press the + button next to the viewport tabs to add
it.

Press the Open button in the uv map view and add a uv checker image to help with uv mapping.
This is the one I usually use. There are many other publicly available ones a simple web search
away.
Set the viewport shading to Material Preview ( ) and add a material to the mesh
object.

Set the Base Color to use an Image Texture.


Set the Image Texture to the UV checker image.

In Edit Mode, select all vertices (A key), press the U key and select Unwrap.
(Still in Edit Mode) Click the Options dropdown and activate Live Unwrap so you don’t need to
unwrap every time Seams are added.

Add seams until you are satisfied with the uv unwrap. Seams tend to stand out, so pick edges
that can hide them, like natural creases in the model.
Select edges you to mark seams in, press the Edge button (or the E key) and select Mark Seam
to mark Edges, or Clear Seam to clear selected seams.

Mastiff Mount UV unwrap timelapse

3. Baking and Painting


3.1.a Baking maps in Substance Painter
In Substance Painter, go to Edit->Bake Mesh Maps.
Set Output Size to at least the project texture size. For longer but higher quality bakes, select
the highest size possible. I recommend using 8192 even for lower project texture sizes such as
512.
Click the file icon next to High Definition Meshes and select the high polygon mesh, should you
have one. I highly recommend having one.
Click Bake selected textures.
After a minute or so, you should have something like this. Click OK.
You should have recovered a lot of the details from the high poly mesh.

3.1.b Baking maps in Blender


Baking and Exporting Custom Assets in Blender
(Thanks to CD Cyber Dragon for the link)
3.2 Painting Template setup

Add a group in the Layers window and name it Template.


Add a fill layer to the group and name it BaseColor.

In the Properties window deselect height and nrm (short for normal).
Click the gray bar or the color picker icon to select a base color.
Adjust roughness and Metallic to reflect the material/paint type you have in mind.
High roughness will get you a matte type of material. High metalness will give you a highly
reflective material. Try playing with both sliders until you find a combination you like.

Roughness/Metallic reference chart.

Duplicate the BaseColor and name the copy Highlights.


Deselect rough and metal.
Right click it in the Layers windows and click [Add black mask].
Right click the mask and select [Add generator].

In the Properties windows, click Generator and select Mask Editor.


Change the color to a lighter tone by adjusting Value (V) and Saturation (S) in the color selection
tool, so you can see the changes.
Select the mask and then the Mask Editor to be able to change the properties.

Expand Curvature in the Properties window and change the curvature sliders until you get a
result you like.
Duplicate BaseColor again (Ctrl+C, Ctrl+V) and name the copy WearAndTear. Move it above
Highlights.
Again, add a black mask and a generator. This time, select Metal Edge Wear as the generator.
Change the color to the same as the Highlights or an even lighter tone. Select the mask and
then the generator to change the properties.
Again, play with the sliders until you find a combination you like. I highlighted the parameters I
usually adjust.
Given that this simulates wear and tear on the mini, I like to set a high value of Roughness and
a low Metallic value for the material settings for a rough plastic feel. Turning on and setting
height to a small negative value can also help further give it a worn off paint layer feel.

3.3 Painting Masks


Copy+paste the Template folder and give it a black mask. Name it something relevant, as you
will probably be doing this a lot. For the Mastiff, I made 9 copies. Named: Fur_dark. Fur_light,
Fur_darker, Lips, Mouth, Teeth, Tongue, Nose and Nails.
Make as many copies as the number of different paints/materials you will be using. Feel free to
add or delete groups as necessary.
Adjust the color, roughness and metal parameters for these groups.
To apply them onto specific parts of the model, select the mask in the Layers window.
To paint the mask, and thus the group material, use the tools on the left of the model view.
There should be familiar if you’ve ever used image editing software like Gimp. The ones we’ll be

using the most are the Paint tool ( ), the Eraser tool ( ) and the Polygon fill tool (

). Switch tools by left+clicking on their icons or by using the keyboard number keys 1, 2 or
4.

The Paint tool lets you paint the mask directly onto the model.
This cursor should show up instead of your regular mouse cursor, letting you know where you
will paint and how large the paint brush is. Press Ctrl and scroll the mouse wheel to adjust the
brush size. Left+click on the mesh to paint.
The Eraser tool lets you erase the mask, much the same as the Paint tool lets you paint it.
The Polygon fill tool lets you paint specific polygons. The model will show up with a red
wireframe showing the polygons. If you drag the left mouse button, it will fill all polygons in a
box, including the back facing ones. Very useful for painting limbs and animal nails.

3.4 Materials
Substance Painter has a built-in materials and smart materials library that help to easily and
quickly paint models and add detail. The Assets window contains these materials, and also
mask generators, filters, brushes, textures and more. Use any material and smart material that
fits your model. I’m partial to the fabric, wood and metal materials. To apply them to only a
specific part of the mode, drag and drop the material or smart material to the Layers window
and add a black mask to it. Paint the mask onto the parts of the mesh you wish to use it on.
Materials and Smart materials usually have parameters you may wish to change. All have
different parameters, so you’ll have to test them out yourself. Some common parameters to look
out for:
Fill Projection.
UV projection is usually the default. This type of projection means the material is applied onto
the 2D uv map. With automatically generated uv maps, this option is usually not the best when
applied on a seam.
I usually use Tri-planar projection for anything that I apply to the whole model, as I used with the
Mastiff.
Setting Projection to Tri-planar and adjusting Rotation and Tiling resulted in the above picture.
After disabling color parameters. Gives the paint a plasticky fur type of pattern.
Same approach with the Concrete Dusty material, using only height. Adds imperfections to the
mesh, making it seem more detailed. You can, again, apply masks to these materials and only
apply them where you see fit.

3.5 Texture export template


Go to File->Export Textures->Output Templates and press the + button to add a new template.
Name it TaleSpire.
● Create a RGB+A map and name it $mesh_Albedo. Drag and drop Base Color from Input
Maps into the RGB box and select RGB Channels. Drag and drop Opacity into the A box
and select From Gray Channel.
● Create another RGB+A map and name it $mesh_Metallic. Drag and drop Metallic from
Input Maps into the RGB box and select Gray Channel. Drag and drop Glossiness from
Converted Maps into the A box and select From Gray Channel.
● Create a RGB map and name it $mesh_Normal. Drag and drop Normal OpenGL from
Converted Maps to the RGB box and select RGB Channels.
● Create a Gray map and name it $mesh_Height. Drag Height from Input Maps to the Gr
box and select Gray Channel.
● Create another Gray channel and name it $mesh_Occlusion. Drag and drop Ambient
Occlusion from Input Maps to the Gr box and select Gray Channel.
You should have something like this.

3.6 Export
Go to File->Export Mesh to export the mesh. (Export to the mini’s meshes folder in the Unity
project, should you have them already prepared.) Click Export and select a folder to export it to.
Go to File->Export Textures, select the Output Directory (preferably in the textures folder in the
mini’s Unity folder, if already prepared) and set the Output template to one created in 3.4 named
TaleSpire. Click Export.

Mastiff Mount Painting Timelapse

Skyden Wrenick Substance Painter reference

3.7 (Bonus) Saving groups as smart materials


Right click on any group in the Layers window and select
4. Making an assetbundle
4.1 Creating a unity project
Open Unity Hub and click the New button.

Select the 3D template, name your project, select an appropriate folder and click Create.
4.2 Folder structure
Make a folder under Assets to organize the custom minis in. I use
Assets/boardassets/characters to store character minis in.
Create a sub-folder there for your custom mini. Inside, create sub-folders for:
Materials
Meshes
Textures

You should have something like this.

4.3 Asset import


Place the exported mesh from Substance Painter or Blender in the meshes folder. You can also
export it directly.
Place the exported textures from Substance Painter or Blender in the textures folder.
Select the mesh in the Project window to edit its properties in the Inspector.
Set Read/Write enabled to true in the Model tab.
In the Materials tab, click the “Extract Materials” button and extract the materials to the materials
folder.
Click the Apply button.
Drag the mesh from the Project window to the Hierarchy.
Press the F key to focus on your mesh in the Scene view.
Select the extracted material in the materials folder and set up the textures from the textures
folder in the inspector.

Click the “Fix Now” button to set the normal properly.


Drag the mesh gameobject from the Hierarchy to the mini’s folder to create an original Prefab.
Rename it to your desired assetbundle name. Should you wish to distribute it in the
thunderstore, please follow the Asset Naming Conventions.

4.4 Portrait and Info.txt


Make a portrait of your mini to add to your content folder. A screenshot in Substance Painter or
Unity (Game view) should do. Make the background transparent if possible.

You can use this script to get transparent screenshots in Unity.


Set the camera background to “Solid”, the FramesToCapture parameter to 1 and hit play.
Captures will be in the “Screenshot” folder, up your Unity project folder.
Set the image resolution to be 128x128 and file type to png. In the inspector, set Read/Write
Enabled to true and Compression to None. Click the Apply button.

Create a text file named info.txt and copy-paste the following into it:
{
"name": "",
"kind": "Creature",
"category": "Creature",
"groupName": "",
"description": "",
"tags": "",
"author": "",
"version": "1.0",
"comment": "",
"size": 1.0,
"assetBase": "DEFAULT"
}

Fill in [name] with your mini’s name. This is what shows up as the Asset tooltip and is the mini’s
default name when placed on the board.

Fill in [groupName] with your mini’s group name you want it to show in. You can use an existing
TaleSpire group name or create a new one.

FIll in [tags] with relevant tags or your mini. These are used when searching for minis in
TaleSpire.

If making a non-standard sized mini, set [size] to the relevant size. Size examples: 0.5, 1.0, 2.0,
3.0, 4.0.

Place the portrait and info file in the mini’s root folder.

4.5 Creating the assetbundle script


Create a folder named Editor to place the script in.
Place this script file in it or create one and replace it’s contents with:
using UnityEditor;
using UnityEngine;
using System.IO;
using System.Diagnostics;
using System.Threading;

public class MakeAssetBundle : MonoBehaviour


{
[MenuItem("Assets/Build AssetBundles")]
static void BuildAllAssetBundles()
{
if(!EditorWindow.HasOpenInstances<AssetBundleScriptSetupWindow>())
{
AssetBundleScriptSetupWindow window =
ScriptableObject.CreateInstance(typeof(AssetBundleScriptSetupWindow)) as
AssetBundleScriptSetupWindow;
window.minSize = new Vector2(800f, 150f);
window.ShowUtility();
}
}
}

public class AssetBundleScriptSetupWindow : EditorWindow


{
static string useAutoUnregisterKey = "Move assetbundle files to the
CustomData folder and unregister existing files";
static string PluginsFolderPathKey = "PluginsFolderPath";
static string CustomPluginFolderKey = "CustomPluginFolder";

string GetCustomPluginFolder()
{
return PlayerPrefs.GetString(CustomPluginFolderKey, "localminis");
}

string GetCustomDataFolder()
{
return PlayerPrefs.GetString(PluginsFolderPathKey, "") + @"/" +
GetCustomPluginFolder();
}

void OnGUI()
{
string pluginsPath = PlayerPrefs.GetString(PluginsFolderPathKey, "");
bool isCustomDataPathValid = pluginsPath != "";

EditorGUILayout.LabelField("Setup your r2modman profile plugins folder to use


the auto move assetbundle files functionality.");
EditorGUILayout.LabelField(@"Plugins folder example:
C:/Users/WindowsUser/AppData/Roaming/r2modmanPlus-local/TaleSpire/profiles/Defa
ult/BepInEx/plugins");
EditorGUILayout.LabelField("Plugins folder: " + pluginsPath);

string customPluginFolder = GetCustomPluginFolder();


string newCustomPluginFolder = EditorGUILayout.TextField("Custom plugin
folder name: ", customPluginFolder);
if(newCustomPluginFolder != customPluginFolder)
{
customPluginFolder = newCustomPluginFolder;
PlayerPrefs.SetString(CustomPluginFolderKey, customPluginFolder);
}

if (GUILayout.Button("Select plugins folder"))


{
string newPluginsPath = EditorUtility.OpenFolderPanel("plugins", pluginsPath,
"");
if(newPluginsPath != ""
&& newPluginsPath != pluginsPath)
{
pluginsPath = newPluginsPath;
PlayerPrefs.SetString(PluginsFolderPathKey, pluginsPath);
}
}

bool useAutoUnregister = PlayerPrefs.GetInt(useAutoUnregisterKey, 1) != 0;


if(GUILayout.Toggle(useAutoUnregister, useAutoUnregisterKey) !=
useAutoUnregister)
{
PlayerPrefs.SetInt(useAutoUnregisterKey, useAutoUnregister ? 0 : 1);
}

GUILayout.BeginHorizontal();
GUILayout.FlexibleSpace();
GUILayout.BeginHorizontal(GUILayout.Width(200));
if (GUILayout.Button("Build", EditorStyles.miniButtonLeft,
GUILayout.Width(85)))
{
Build();
}

GUILayout.FlexibleSpace();

if (GUILayout.Button("Close", EditorStyles.miniButtonRight,
GUILayout.Width(85)))
{
Close();
}
GUILayout.EndHorizontal();
GUILayout.EndHorizontal();
}

void OnInspectorUpdate()
{
Repaint();
}

void Build()
{
EditorUtility.DisplayProgressBar("BuildAssetBundles", "Building asset
bundles...", 0.0f);

try
{
string assetBundleDirectory = "Assets/StreamingAssets";
if(!Directory.Exists(assetBundleDirectory))
{
Directory.CreateDirectory(assetBundleDirectory);
}
BuildPipeline.BuildAssetBundles(assetBundleDirectory,
BuildAssetBundleOptions.None, EditorUserBuildSettings.activeBuildTarget);

EditorUtility.DisplayProgressBar("BuildAssetBundles", "Moving files to


CustomData", 0.0f);

if(PlayerPrefs.GetInt(useAutoUnregisterKey, 1) != 0)
{
string pluginfolderpath = GetCustomDataFolder() + @"/";

// check if Unregister.bat is present. If it is, run it first.


{
string unregisterBatPath = pluginfolderpath + @"Unregister.bat";
var unregisterBatFile = new FileInfo(unregisterBatPath);
if(unregisterBatFile.Exists)
{
var process = Process.Start(unregisterBatPath);
float timeElapsed = 0f;
while(timeElapsed < 20 && !process.HasExited)
{
Thread.Sleep(1000);
timeElapsed += 1;
}
if(!process.HasExited)
{
UnityEngine.Debug.Log("Unregister.bat timed out");
}
}
}
// move minis to CustomData
string customdatapath = pluginfolderpath + @"CustomData\Minis";
foreach(string assetBundle in
Directory.EnumerateFiles(assetBundleDirectory, "*."))
{
if (assetBundle != (assetBundleDirectory + "/AssetBundles")
&& Path.GetFileNameWithoutExtension(assetBundle) !=
"StreamingAssets")
{
try
{
if(!Directory.Exists(customdatapath + "/" +
Path.GetFileNameWithoutExtension(assetBundle)))
{
Directory.CreateDirectory(customdatapath + "/" +
Path.GetFileNameWithoutExtension(assetBundle));
}

string newCustomDataFileFullPath = customdatapath + "/" +


Path.GetFileNameWithoutExtension(assetBundle) + "/" +
Path.GetFileNameWithoutExtension(assetBundle);
var unityAssetBundleFile = new FileInfo(assetBundle);
var customDataFile = new FileInfo(newCustomDataFileFullPath);
if(customDataFile.Exists)
{
if(customDataFile.LastWriteTimeUtc <
unityAssetBundleFile.LastWriteTimeUtc)
{
File.Delete(newCustomDataFileFullPath);
}
else
{
continue;
}
}
File.Move(assetBundle, newCustomDataFileFullPath);
// Don't delete manifest files so unity only builds assetbundles that
have been changed.
//File.Delete(assetBundle + ".manifest");
//File.Delete(assetBundle + ".manifest.meta");
}
catch (System.Exception e)
{
string errorMessage = "Error processing " +
Path.GetFileNameWithoutExtension(assetBundle) + ": " + e.Message;
EditorUtility.DisplayProgressBar("BuildAssetBundles",
errorMessage, 0.0f);
Thread.Sleep(5000);
UnityEngine.Debug.Log(errorMessage);
}
}
}
}
}
catch(System.Exception e)
{
EditorUtility.DisplayProgressBar("BuildAssetBundles", e.Message, 0.0f);
Thread.Sleep(5000);
UnityEngine.Debug.Log(e.Message);
}

EditorUtility.ClearProgressBar();
}
}

When right clicking in the Project window in Unity, a new option called “Build AssetBundles”
should now appear.

4.6 Making and testing an assetbundle


Select the mini’s root folder in the Project window so it shows up in the Inspector.

In the bottom of the Inspector window, there’s an AssetBundle dropdown. Click it, select [New..]
and then type in your prefab name.
Then right click anywhere on the Project window and select Build Asset Bundles.

Press “Select Plugins folder” and navigate to your plugins folder. The script defaults to moving
the assetbundle files to a “localminis” folder but you can change it in this window. Press Build
when setup is finished.
When the Build operation is finished, you should have a new assetbundle file in the custom
plugin folder path defined in the window above. You can boot TaleSpire and test if your mini now
appears. When booting up TaleSpire with CALP, it will move the folder the assetbundle was
created with into a new Assets folder, and you cannot at the moment make new minis or update
them without reverting these changes. When updating minis or adding new ones, open the your
localminis folder
(C:\Users\<username>\AppData\Roaming\r2modmanPlus-local\TaleSpire\profiles\<profilename>
\BepInEx\plugins\localminis) and check that it does not have an Assets folder. If it does, run the
Unregister.bat batch file to revert CALP’s changes before booting TaleSpire.
In-game mini.

5. Common problems and how to fix them


5.1 Assets not scaled correctly
Open the model in Blender and scale it there. Minis need to be designed as if they’re going to
be spawned on a 1x1 token then scaled to default size. See Scale.

5.2 Mini appears offset from base


Mesh is most likely offset. Apply Transforms before exporting in Blender.
5.3 Painting appears deformed or is very low resolution in places

Most likely a bad UV map. Try unwrapping in Blender.

5.4 Empty base when placing the mini in TaleSpire


There are a lot of ways this could happen.
1. Improper scaling. The model is either extremely small or extremely large and becomes
practically invisible. Use a reference model and correct scaling.
2. Mesh is very offset from the center. See 5.2.
3. CALP failed to move the CustomData folder into Assets folder. Check the
customdatapath folder setup in 4.5 to see that the CustomData folder is not present after
opening TaleSpire. If it is present, CALP has indeed failed to move it. Delete the Portraits
folder, index.json and index (no extension). Do not have the CustomData folder, any of
its subfolders or files open prior to booting TaleSpire.
4. Wrong Unity version. There are reports that Unity versions above 2019.4.25f sometimes
generate assetbundle files that are not compatible with TaleSpire. Make sure to use
version 2019.4.25f.

6. Making and uploading a mini pack to thunderstore.io


When uploading asset bundles to the thunderstore it’s best to follow the asset naming
conventions established by LordAshes to ensure compatibility with other creator’s assets.
https://github.com/LordAshes/TaleSpire-CommonCodeSnippets/blob/main/DeveloperConventio
ns.md
Copyright and licensing
Make sure you have distribution rights to the models you want to upload. Search for Creative
Commons licenses or ask the model makers for permission.
More on Creative Commons licensing information.

Requirements
Thunderstore documentation
A valid package is a zip file that contains the following files:

icon.png PNG icon for the mod pack, must be 256x256 resolution.

README.md Readme in markdown syntax to be rendered on the package's


page.

CHANGELOG.md (optional) Changelog in markdown syntax to be rendered on the


package's page.

manifest.json JSON file with the package's metadata.

Create an icon.png file


The only requirements are that it must be 256x256 resolution. This image will be used in the
thunderstore mod browsing page and in the mod client. Use an image editing software such as
Paint or Gimp.

Create a README.md file


A Markdown file (.md) is a text file that will serve as your page in the Thunderstore. You should
include in this page attribution to the model creators for the models included in the pack,
information on the contents of the pack, how to install the pack and licensing.
Markdown syntax.
Template README.md file:

# This Package
This package uses free models by ____ painted by ____.

(Optional model maker donation link)

### Contents:

- 1x xx mini (Category)

### Screenshots
![Preview](https://i.imgur.com/screenshot.png)

## Installing via R2ModMan


1. Open up r2modman, select talespire and the profile you want to install this on.
2. Navigate to Online, find this pack and click Download (Latest).
3. Make sure
[CALP](https://talespire.thunderstore.io/package/PluginMasters/Custom_Assets_Library_Plugin/) is
also installed.

## License:
The models are licensed under https://creativecommons.org/licenses/by-sa/4.0/legalcode
Due to this, the package itself will inherit the same license.

## Changelog
- 1.0.0: First release.

Disclaimer this package has and will always comply to CC 4.0 license and is not for sale.
The ![Preview](https://i.imgur.com/screenshot.png) format allows you to show screenshots
in the pack page. It also supports gifs.

Create a manifest.json
The manifest.json file tells thunderstore what your pack name is, its versions and any
dependencies your pack has. The description field shows up in the browse page and its
contents are what is searched with the thunderstore search functionality. This field has a 250
character limit.
Use the thunderstore validator to make sure the manifest.json file is valid.
Template:

{
"name": "XX_Mini_Pack",
"version_number": "1.0.0",
"website_url": "",
"description": "Mini pack containing __. Re-distributed under Creative Commons 4.0
license.",
"dependencies": [
]
}

Assetbundle files
Assetbundle files need to be placed in the following folder structure: plugins\CustomData\Minis
I find it best to limit packs to around 10 minis. It’s easier to download several small packs than
one large one. Less error-prone when downloading.
Zipping
Your mini pack folder should now look something like this.

Compress all the files into one zip file and rename it using the following convention:
uploader-packname-version.zip
Example: simsete-simsetes_Monster_Manual_Minis_Pack_Part3-1.0.0.zip

Uploading to Thunderstore.io
Make an account and login with Discord, Github or Overwolf. The Upload option only appears
when logged in.

https://talespire.thunderstore.io/package/create/
Create and select a team to upload. If you are creating packs solo, consider using your discord
username as your team name so modding discord users might contact you.
Select the Minis category.
Press the Choose button or Drag and drop the zip file you’ve created into the web page.
Click Submit.
Wait until the progress bar finishes and check for any errors. You might need to fix them and
re-upload.

Updating a mini pack


Increase the version number in the manifest.json file, update the README.md file and the
assetbundle files. Then zip the updated files, rename the zip file using the updated version
number and re-upload.

7. Blender tools and concepts

Object Mode
In object mode, you can perform operations on the mesh as a whole. Duplicate the mesh, add
new mesh objects etc. This is the default mode Blender starts in.

Edit Mode
In Edit Mode you can edit mesh data such as vertices, edges and faces.
To switch to Edit Mode, use the dropdown menu on Blender’s top-left or use the Tab key to
toggle between Object Mode and Edit Mode.

Viewpoint controls
Rotate the viewpoint by using Middle Mouse + Drag Mouse.
Move the viewpoint by using the Shift Key + Middle Mouse + Drag Mouse to Move the
viewpoint. Zoom in and out with the mouse wheel.
Preset viewpoints

Clicking on any of the axis on the top right shifts perspective to that viewpoint.

Select Box
Click to select vertices in Blender by default. Should it not select when clicking, the Select Box
tool may be turned off.

Click the Select Box widget to turn it on.


While the Select Box tool is active, Mouse Left Click selects a vertex. Selected vertices appear
in orange, while non selected vertices appear in black.
Shift+Mouse Left Click adds or de-selects a vertex to the selection.
Control+Left Mouse Click adds all the vertices in the shortest path from the active vertex (in
white) to the target vertex to the selection.
Alt+Left Mouse Click selects all the vertices in a loop or edge loop.
Shit+Alt+Left Mouse Click adds all vertices in a loop or edge loop to the selection.

Box select

Press the B key to activate box select. While in box select mode, press and drag the Left Mouse
Button to form a rectangle and select vertices in that rectangle. Dragging the Middle Mouse
Button de-selects any vertex in the rectangle.
Circle select

Press the C key to go into circle select mode. A circle should appear around your cursor. Use
the mouse wheel to enlarge or shrink as needed. Left Mouse Button selects vertices in the
circle. Middle Mouse Button deselects vertices in the circle. Right Mouse Button or the Enter key
close circle mode.

Expand and shrink selection


Press the Ctrl+‘+’ key combo to expand vertex selection by one link. Press the Ctrl+’-’ key
combo to shrink vertex selection by one link.

Select Linked
Hold the mouse cursor over a vertex, face or edge and press the L key on the keyboard. It will
select all linked vertices. Selected vertices appear in orange.
You can adjust the delimit type on the bottom left. (You might have to expand that bottom-left
menu)

Selection Mode

Click the select mode widgets to switch between vertex, edge and face select modes.
Alternatively, use the non-numpad number keys 1, 2 and 3 to switch between vertex, edge and
face select modes respectively.
X-ray mode

This will make the mesh transparent and allow you to select occluded vertices, edges and
faces.

Scale
Press the S key to scale either in Object mode or in Edit mode. Move the mouse cursor to scale
objects or vertices. Press the Enter key or Left Mouse Button to apply and Right Mouse Button
to cancel. When scaling in Object mode, remember to Apply Transforms before exporting.
Apply Transforms

In Object mode, select the object you want to apply transformations to and navigate to
Object->Apply->All Transforms

8. Appendix
8.1 Reference models
Human sized box
Vampire
8.2 Reference textures

UV Checker Grid

You might also like