Setting up Dash Panels

The Dash Panel is a surface in Mario Kart: Double Dash!! that has a distinct visual effect and, when driven over, gives the player a temporary speed boost. This tutorial will cover how to create the visuals associated with the Dash Panel.

Applying the proper settings in Blender
The Dash Panel material relies on the following textures

Note that this screenshot does not show the direction the arrows are going. If your arrows are moving towards the player (downward relative to the screenshot) when you want them to move away from the player (upward relative to the screenshot) then you must mirror the UVs on the x-axis. The vertical scaling of the UV determines the amount of arrows horizontally, so if you want to have the arrow loop 3 times horizontally, you will scale the UV on the y axis by 3. This part will require a bit of trial and error before you get it right.

Creating a SuperBMD .bat file
The Dash Panel material requires special settings regarding the textures and material itself, so a custom SuperBMD bat file will need to be created for your model to convert with the proper Dash Panel material settings

Create a .bat file for converting to .bmd using SuperBMD that has enables a material.json and texheaders.json file. At its most basic, this looks like  %1 -m materials.json --texheader tex_headers.json

Creating and editing the material .json
Obtain the materials.json and tex_headers.json files containing all the data necessary for your track. One way to do this is to convert a track to .bmd, then running the newly created .bmd back through SuperBMD to obtain the jsons. It will be named _materials.json and tex_headers.json respectively. Rename _materials.json to materials.json. In order to avoid overriding existing assets you have set up for your track, it is advised to do this a new folder. The other outputs from the .bmd -> .dae conversion are not relevant for properly setting up the Dash Panel material, and can be removed.

Once you have obtained your materials.json and tex_headers.json file, open both in a text editor. Inside the materials.json file, you will find a list of all your blender materials with -material appended to the end of the name. Find the material that you would like to be the Dash Panel, and replace its contents with this.

{   "Name": " -material", "Flag": 4, "CullMode": "Back", "ZCompLoc": true, "Dither": false, "TextureNames": [ "mk_spectrum1", "dash_yajirushi99", "",     "",      "",      "",      "",      ""    ],    "IndTexEntry": { "HasLookup": false, "IndTexStageNum": 0, "TevOrders": [ {         "TexCoord": "Null", "TexMap": "Null" },       {          "TexCoord": "Null", "TexMap": "Null" },       {          "TexCoord": "Null", "TexMap": "Null" },       {          "TexCoord": "Null", "TexMap": "Null" }     ],      "Matrices": [ {         "Matrix": [ [             0.5,              0.0,              0.0            ],            [              0.0,              0.5,              0.0            ]          ],          "Exponent": 1 },       {          "Matrix": [ [             0.5,              0.0,              0.0            ],            [              0.0,              0.5,              0.0            ]          ],          "Exponent": 1 },       {          "Matrix": [ [             0.5,              0.0,              0.0            ],            [              0.0,              0.5,              0.0            ]          ],          "Exponent": 1 }     ],      "Scales": [ {         "ScaleS": "ITS_1", "ScaleT": "ITS_1" },       {          "ScaleS": "ITS_1", "ScaleT": "ITS_1" },       {          "ScaleS": "ITS_1", "ScaleT": "ITS_1" },       {          "ScaleS": "ITS_1", "ScaleT": "ITS_1" }     ],      "TevStages": [ {         "TevStage": "TevStage0", "IndTexFormat": "ITF_8", "IndTexBiasSel": "ITB_S", "IndTexMtxId": "ITM_OFF", "IndTexWrapS": "ITW_OFF", "IndTexWrapT": "ITW_OFF", "AddPrev": false, "UtcLod": false, "AlphaSel": "ITBA_OFF" },       {          "TevStage": "TevStage0", "IndTexFormat": "ITF_8", "IndTexBiasSel": "ITB_S", "IndTexMtxId": "ITM_OFF", "IndTexWrapS": "ITW_OFF", "IndTexWrapT": "ITW_OFF", "AddPrev": false, "UtcLod": false, "AlphaSel": "ITBA_OFF" },       {          "TevStage": "TevStage0", "IndTexFormat": "ITF_8", "IndTexBiasSel": "ITB_S", "IndTexMtxId": "ITM_OFF", "IndTexWrapS": "ITW_OFF", "IndTexWrapT": "ITW_OFF", "AddPrev": false, "UtcLod": false, "AlphaSel": "ITBA_OFF" },       {          "TevStage": "TevStage0", "IndTexFormat": "ITF_8", "IndTexBiasSel": "ITB_S", "IndTexMtxId": "ITM_OFF", "IndTexWrapS": "ITW_OFF", "IndTexWrapT": "ITW_OFF", "AddPrev": false, "UtcLod": false, "AlphaSel": "ITBA_OFF" },       {          "TevStage": "TevStage0", "IndTexFormat": "ITF_8", "IndTexBiasSel": "ITB_S", "IndTexMtxId": "ITM_OFF", "IndTexWrapS": "ITW_OFF", "IndTexWrapT": "ITW_OFF", "AddPrev": false, "UtcLod": false, "AlphaSel": "ITBA_OFF" },       {          "TevStage": "TevStage0", "IndTexFormat": "ITF_8", "IndTexBiasSel": "ITB_S", "IndTexMtxId": "ITM_OFF", "IndTexWrapS": "ITW_OFF", "IndTexWrapT": "ITW_OFF", "AddPrev": false, "UtcLod": false, "AlphaSel": "ITBA_OFF" },       {          "TevStage": "TevStage0", "IndTexFormat": "ITF_8", "IndTexBiasSel": "ITB_S", "IndTexMtxId": "ITM_OFF", "IndTexWrapS": "ITW_OFF", "IndTexWrapT": "ITW_OFF", "AddPrev": false, "UtcLod": false, "AlphaSel": "ITBA_OFF" },       {          "TevStage": "TevStage0", "IndTexFormat": "ITF_8", "IndTexBiasSel": "ITB_S", "IndTexMtxId": "ITM_OFF", "IndTexWrapS": "ITW_OFF", "IndTexWrapT": "ITW_OFF", "AddPrev": false, "UtcLod": false, "AlphaSel": "ITBA_OFF" },       {          "TevStage": "TevStage0", "IndTexFormat": "ITF_8", "IndTexBiasSel": "ITB_S", "IndTexMtxId": "ITM_OFF", "IndTexWrapS": "ITW_OFF", "IndTexWrapT": "ITW_OFF", "AddPrev": false, "UtcLod": false, "AlphaSel": "ITBA_OFF" },       {          "TevStage": "TevStage0", "IndTexFormat": "ITF_8", "IndTexBiasSel": "ITB_S", "IndTexMtxId": "ITM_OFF", "IndTexWrapS": "ITW_OFF", "IndTexWrapT": "ITW_OFF", "AddPrev": false, "UtcLod": false, "AlphaSel": "ITBA_OFF" },       {          "TevStage": "TevStage0", "IndTexFormat": "ITF_8", "IndTexBiasSel": "ITB_S", "IndTexMtxId": "ITM_OFF", "IndTexWrapS": "ITW_OFF", "IndTexWrapT": "ITW_OFF", "AddPrev": false, "UtcLod": false, "AlphaSel": "ITBA_OFF" },       {          "TevStage": "TevStage0", "IndTexFormat": "ITF_8", "IndTexBiasSel": "ITB_S", "IndTexMtxId": "ITM_OFF", "IndTexWrapS": "ITW_OFF", "IndTexWrapT": "ITW_OFF", "AddPrev": false, "UtcLod": false, "AlphaSel": "ITBA_OFF" },       {          "TevStage": "TevStage0", "IndTexFormat": "ITF_8", "IndTexBiasSel": "ITB_S", "IndTexMtxId": "ITM_OFF", "IndTexWrapS": "ITW_OFF", "IndTexWrapT": "ITW_OFF", "AddPrev": false, "UtcLod": false, "AlphaSel": "ITBA_OFF" },       {          "TevStage": "TevStage0", "IndTexFormat": "ITF_8", "IndTexBiasSel": "ITB_S", "IndTexMtxId": "ITM_OFF", "IndTexWrapS": "ITW_OFF", "IndTexWrapT": "ITW_OFF", "AddPrev": false, "UtcLod": false, "AlphaSel": "ITBA_OFF" },       {          "TevStage": "TevStage0", "IndTexFormat": "ITF_8", "IndTexBiasSel": "ITB_S", "IndTexMtxId": "ITM_OFF", "IndTexWrapS": "ITW_OFF", "IndTexWrapT": "ITW_OFF", "AddPrev": false, "UtcLod": false, "AlphaSel": "ITBA_OFF" },       {          "TevStage": "TevStage0", "IndTexFormat": "ITF_8", "IndTexBiasSel": "ITB_S", "IndTexMtxId": "ITM_OFF", "IndTexWrapS": "ITW_OFF", "IndTexWrapT": "ITW_OFF", "AddPrev": false, "UtcLod": false, "AlphaSel": "ITBA_OFF" }     ]    },    "MaterialColors": [ {       "R": 1.0, "G": 1.0, "B": 1.0, "A": 1.0 },     {        "R": 1.0, "G": 1.0, "B": 1.0, "A": 1.0 }   ],    "ChannelControls": [ {       "Enable": false, "MaterialSrcColor": "Register", "LitMask": "None", "DiffuseFunction": "Clamp", "AttenuationFunction": "Spec", "AmbientSrcColor": "Register" },     {        "Enable": false, "MaterialSrcColor": "Register", "LitMask": "None", "DiffuseFunction": "Clamp", "AttenuationFunction": "Spec", "AmbientSrcColor": "Register" },     {        "Enable": true, "MaterialSrcColor": "Register", "LitMask": "None", "DiffuseFunction": "Signed", "AttenuationFunction": "None_0", "AmbientSrcColor": "Register" },     {        "Enable": false, "MaterialSrcColor": "Register", "LitMask": "None", "DiffuseFunction": "None", "AttenuationFunction": "None_2", "AmbientSrcColor": "Register" }   ],    "AmbientColors": [ {       "R": 0.196078435, "G": 0.196078435, "B": 0.196078435, "A": 0.196078435 },     {        "R": 0.0, "G": 0.0, "B": 0.0, "A": 0.0 }   ],    "LightingColors": [ null, null, null, null, null, null, null, null ],   "TexCoord1Gens": [ {       "Type": "Matrix2x4", "Source": "Normal", "TexMatrixSource": "TexMtx0" },     {        "Type": "Matrix2x4", "Source": "Tex0", "TexMatrixSource": "TexMtx1" },     null, null, null, null, null, null ],   "PostTexCoordGens": [ null, null, null, null, null, null, null, null ],   "TexMatrix1": [ {       "Projection": "Matrix2x4", "Type": 6, "EffectTranslation": [ 0.5,         0.5,          0.5        ],        "Scale": [ 1.0,         1.0        ],        "Rotation": 0.0, "Translation": [ 0.0,         3.4        ],        "ProjectionMatrix": [ [           1.0,            0.0,            0.0,            0.0          ],          [            0.0,            1.0,            0.0,            0.0          ],          [            0.0,            0.0,            1.0,            0.0          ],          [            0.0,            0.0,            0.0,            1.0          ]        ]      },      {        "Projection": "Matrix2x4", "Type": 0, "EffectTranslation": [ 0.5,         0.5,          0.5        ],        "Scale": [ 1.0,         2.0        ],        "Rotation": 89.99451, "Translation": [ 0.0,         4.0        ],        "ProjectionMatrix": [ [           1.0,            0.0,            0.0,            0.0          ],          [            0.0,            1.0,            0.0,            0.0          ],          [            0.0,            0.0,            1.0,            0.0          ],          [            0.0,            0.0,            0.0,            1.0          ]        ]      },      null, null, null, null, null, null, null, null ],   "PostTexMatrix": [ null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null ],   "TevOrders": [ {       "TexCoord": "TexCoord1", "TexMap": "TexMap1", "ChannelId": "Color0A0" },     {        "TexCoord": "TexCoord0", "TexMap": "TexMap0", "ChannelId": "Color0A0" },     null, null, null, null, null, null, null, null, null, null, null, null, null, null ],   "ColorSels": [ "KCSel_K0", "KCSel_K0_A", "KCSel_K0", "KCSel_K0", "KCSel_K0", "KCSel_K0", "KCSel_K0", "KCSel_K0", "KCSel_K0", "KCSel_K0", "KCSel_K0", "KCSel_K0", "KCSel_K0", "KCSel_K0", "KCSel_K0", "KCSel_K0" ],   "AlphaSels": [ "KASel_1", "KASel_1", "KASel_K0_A", "KASel_K0_A", "KASel_K0_A", "KASel_K0_A", "KASel_K0_A", "KASel_K0_A", "KASel_K0_A", "KASel_K0_A", "KASel_K0_A", "KASel_K0_A", "KASel_K0_A", "KASel_K0_A", "KASel_K0_A", "KASel_K0_A" ],   "TevColors": [ {       "R": 0.196078435, "G": 0.196078435, "B": 0.5882353, "A": 1.0 },     {        "R": 0.274509817, "G": 0.274509817, "B": 0.274509817, "A": 1.0 },     {        "R": 1.0, "G": 1.0, "B": 1.0, "A": 1.0 },     {        "R": 0.0, "G": 0.0, "B": 0.0, "A": 0.0 },     null, null, null, null, null, null, null, null, null, null, null, null ],   "KonstColors": [ {       "R": 1.0, "G": 1.0, "B": 1.0, "A": 0.294117659 },     {        "R": 0.0, "G": 0.294117659, "B": 1.0, "A": 1.0 },     {        "R": 1.0, "G": 1.0, "B": 1.0, "A": 1.0 },     {        "R": 1.0, "G": 1.0, "B": 1.0, "A": 1.0 }   ],    "TevStages": [ {       "ColorInA": "Zero", "ColorInB": "Half", "ColorInC": "TexColor", "ColorInD": "Zero", "ColorOp": "Add", "ColorBias": "Zero", "ColorScale": "Scale_2", "ColorClamp": true, "ColorRegId": "TevPrev", "AlphaInA": "Zero", "AlphaInB": "Zero", "AlphaInC": "Zero", "AlphaInD": "Konst", "AlphaOp": "Add", "AlphaBias": "Zero", "AlphaScale": "Scale_1", "AlphaClamp": true, "AlphaRegId": "TevPrev" },     {        "ColorInA": "Zero", "ColorInB": "Konst", "ColorInC": "ColorPrev", "ColorInD": "TexColor", "ColorOp": "Add", "ColorBias": "Zero", "ColorScale": "Scale_1", "ColorClamp": true, "ColorRegId": "TevPrev", "AlphaInA": "Zero", "AlphaInB": "Zero", "AlphaInC": "Zero", "AlphaInD": "Konst", "AlphaOp": "Add", "AlphaBias": "Zero", "AlphaScale": "Scale_1", "AlphaClamp": true, "AlphaRegId": "TevPrev" },     null, null, null, null, null, null, null, null, null, null, null, null, null, null ],   "SwapModes": [ {       "RasSel": 0, "TexSel": 0 },     {        "RasSel": 0, "TexSel": 0 },     null, null, null, null, null, null, null, null, null, null, null, null, null, null ],   "SwapTables": [ {       "R": 0, "G": 1, "B": 2, "A": 3 },     {        "R": 0, "G": 1, "B": 2, "A": 3 },     {        "R": 0, "G": 1, "B": 2, "A": 3 },     {        "R": 0, "G": 1, "B": 2, "A": 3 },     null, null, null, null, null, null, null, null, null, null, null, null ],   "FogInfo": { "Type": 2, "Enable": false, "Center": 320, "StartZ": 17529.2969, "EndZ": 200000.0, "NearZ": 5.0, "FarZ": 200000.0, "Color": { "R": 1.0, "G": 1.0, "B": 1.0, "A": 1.0 },     "RangeAdjustmentTable": [ 0.0,       0.0,        0.0,        0.0,        0.0,        0.0,        0.0,        0.0,        0.0,        0.0      ]    },    "AlphCompare": { "Comp0": "Always", "Reference0": 0, "Operation": "Or", "Comp1": "Always", "Reference1": 0 },   "BMode": { "Type": "Blend", "SourceFact": "SrcAlpha", "DestinationFact": "InverseSrcAlpha", "Operation": "Copy" },   "ZMode": { "Enable": true, "Function": "LEqual", "UpdateEnable": false },   "NBTScale": { "Unknown1": 0, "Scale": [ 1.0,       1.0,        1.0      ]    }  } Note that you must change to the name of your material, and the textures dash_yajirushi99 and mk_spectrum1 to the names that you gave them, if you chose to change them. Once you do this, save your materials.json and move on to your tex_headers.json file. Inside it, you will find arrays containing data regarding all of your textures. Note that dash_yajirushi99 will be missing, and that is because you haven't added it yet. First, find mk_spectrum1 (or whatever you may have named the texture), and replace its respective array with this

{   "Name": "mk_spectrum1", "Format": "RGB565", "AlphaSetting": 0, "WrapS": "Repeat", "WrapT": "Repeat", "PaletteFormat": "IA8", "MipMap": 0, "EdgeLOD": false, "BiasClamp": false, "MaxAniso": 0, "MinFilter": "Linear", "MagFilter": "Linear", "MinLOD": 0.0, "MaxLOD": 0.0, "LodBias": 0.0 }, Of course, you must replace the mk_spectrum1 name with the name you gave it. Once done, you will add a new array for the dash_yajirushi99 texture {   "Name": "dash_yajirushi99", "Format": "I4", "AlphaSetting": 2, "WrapS": "Repeat", "WrapT": "Repeat", "PaletteFormat": "IA8", "MipMap": 0, "EdgeLOD": false, "BiasClamp": false, "MaxAniso": 0, "MinFilter": "Linear", "MagFilter": "Linear", "MinLOD": 0.0, "MaxLOD": 0.0, "LodBias": 0.0 }, Replace the dash_yajirushi99 name with the name your texture is using. Once you have finished this, place both materials.json and tex_headers.json in the same folder as your model and convert your model using the new BMD script you have created. You may place the converted bmd in your course folder.

Creating the BTK
The .btk contains information regarding texture animation. This tutorial will assume you have no texture animations set up already, if you do you should be competent enough to properly add the Dash Panel texture animation to the btk on your own. From here, create a new .json. The contents of the json should be as follows:

{   "loop_mode": 2, "angle_scale": 1, "duration": 1200, "unknown": "0x0", "animations": [ {           "material_name": " -material", "material_texture_index": 0, "center": [0.5, 0.5, 0.5], "scale_u": [ [0.0, 1.0, 0.0, 0.0]           ],            "scale_v": [ [0.0, 1.0, 0.0, 0.0]           ],            "scale_w": [ [0.0, 1.0, 0.0, 0.0]           ],            "rotation_u": [ [0.0, 0.0, 0.0, 0.0]           ],            "rotation_v": [ [0.0, 0.0, 0.0, 0.0]           ],            "rotation_w": [ [0.0, 0.0, 0.0, 0.0]           ],            "translation_u": [ [0.0, 0.0, 0.0, 0.0],               [1200.0, 0.0, 0.0, 0.0]            ],            "translation_v": [ [0.0, 0.0, 0.0, 0.003333],               [1200.0, 4.0, 0.003333, 0.0]            ],            "translation_w": [ [0.0, 0.0, 0.0, 0.0],               [1200.0, 0.0, 0.0, 0.0]            ]        },        {            "material_name": " -material", "material_texture_index": 1, "center": [0.5, 0.5, 0.5], "scale_u": [ [0.0, 1.0, 0.0, 0.0],               [600.0, 1.0, 0.0, 0.0],                [1200.0, 1.0, 0.0, 0.0]            ],            "scale_v": [ [0.0, 2.0, 0.0, 0.0],               [600.0, 2.0, 0.0, 0.0],                [1200.0, 2.0, 0.0, 0.0]            ],            "scale_w": [ [0.0, 1.0, 0.0, 0.0],               [600.0, 1.0, 0.0, 0.0],                [1200.0, 1.0, 0.0, 0.0]            ],            "rotation_u": [ [0, 0.0, 0.0, 0.0],               [600, 0.0, 0.0, 0.0],                [1200, 0.0, 0.0, 0.0]            ],            "rotation_v": [ [0, 0.0, 0.0, 0.0],               [600, 0.0, 0.0, 0.0],                [1200, 0.0, 0.0, 0.0]            ],            "rotation_w": [ [0, 89.989014, 0.0, 0.0],               [600, 89.989014, 0.0, 0.0],                [1200, 89.989014, 0.0, 0.0]            ],            "translation_u": [ [0.0, 0.0, 0.0, 0.0],               [299.0, 0.0, 0.0, 0.0],                [300.0, 0.0, 0.0, 0.0],                [599.0, 0.0, 0.0, 0.0],                [600.0, 0.0, 0.0, 0.0],                [899.0, 0.0, 0.0, 0.0],                [900.0, 0.0, 0.0, 0.0],                [1200.0, 0.0, 0.0, 0.0]            ],            "translation_v": [ [0.0, 0.0, 0.0, 0.033445],               [299.0, 10.0, 0.033445, -10.0],                [300.0, 0.0, -10.0, 0.033445],                [599.0, 10.0, 0.033445, -10.0],                [600.0, 0.0, -10.0, 0.033445],                [899.0, 10.0, 0.033445, -10.0],                [900.0, 0.0, -10.0, 0.033333],                [1200.0, 10.0, 0.033333, 0.0]            ],            "translation_w": [ [0.0, 0.0, 0.0, 0.0],               [299.0, 0.0, 0.0, 0.0],                [300.0, 0.0, 0.0, 0.0],                [599.0, 0.0, 0.0, 0.0],                [600.0, 0.0, 0.0, 0.0],                [899.0, 0.0, 0.0, 0.0],                [900.0, 0.0, 0.0, 0.0],                [1200.0, 0.0, 0.0, 0.0]            ]        }    ] }

Whereas you must replace with your proper material name. Note that there are 2 instances of in this json, so ensure that you have replaced both with the proper name. Once you do that, save your json and convert it to a .btk using btk-convert. Once done, place the btk in your course folder. If you have done everything correctly, your course should load and your Dash Panel should look something like this:

If your game looks like the screenshot (except moving of course), congratulations! You've properly set up the Dash Panel material!