Minecraft to Minetest texture converter

Post Reply
anatole
New member
Posts: 2
Joined: Fri Sep 30, 2011 22:55

Minecraft to Minetest texture converter

by anatole » Post

Hi! I wrote a Ruby script that converts textures from Minecraft to Minetest. Here it is:

Code: Select all

#!/usr/bin/env ruby

require 'RMagick'
require 'zip/zipfilesystem'

def image_from_archive archive, image_name
    blob = archive.file.read(image_name)
    terrain = Magick::ImageList.new
    terrain.from_blob(blob)
end


def cut image, size, table
    table.each do |current|
        x = size * current[0]
        y = size * current[1]
        tile = image.crop(x, y, size, size, true)
        tile.write current[2]
    end
end

def fix_greens
    files = ["grass.png", "grass_side.png"]
    files.each do |current|
        img = Magick::ImageList.new(current)
        img = img.colorize(0.6, 0.6, 0.6, "#003F00")
        img.write(current)
    end
    img = Magick::ImageList.new("leaves.png")
    img = img.colorize(0.8, 0.8, 0.8, "#003F00")
    img.write("leaves.png")
end

def generate_rails size
    straight = Magick::ImageList.new("rail.png")
    curved = Magick::ImageList.new("rail_curved.png")

    tile = straight.composite(curved, 0, 0, Magick::OverCompositeOp)
    tile.write("rail_t_junction.png")

    horizontal = straight.rotate(90)
    tile = straight.composite(horizontal, 0, 0, Magick::OverCompositeOp)
    tile.write("rail_crossing.png")
end

def extract_crack terrain
    size = terrain.rows / 16
    nstages = 5
    crack = Magick::Image.new(size, size * nstages) {
        self.background_color = "#00000000"
    }
    selected_stages = [2, 3, 5, 6, 9]
    nstages.times do |stage_number|
        x = selected_stages[stage_number] * size
        y = 15 * size
        tile = terrain.crop(x, y, size, size, true)

        x = 0
        y = stage_number * size
        crack.composite!(tile, x, y, Magick::CopyCompositeOp)
    end
    crack.write("crack.png")
end

terrain_table = [
    [3, 2, "bookshelf.png"],
    [7, 0, "brick.png"],
    [6, 4, "cactus_side.png"],
    [5, 4, "cactus_top.png"],
    [11, 1, "chest_front.png"],
    [10, 1, "chest_side.png"],
    [9, 1, "chest_top.png"],
    [8, 4, "clay.png"],
    [6, 1, "cloud.png"],
    [0, 1, "cobble.png"],
    [12, 2, "furnace_front.png"],
    [14, 3, "furnace_side.png"],
    [1, 3, "glass.png"],
    [0, 0, "grass.png"],
    [6, 2, "grass_side.png"],
    [3, 1, "gravel.png"],
    [3, 5, "ladder.png"],
    [15, 15, "lava.png"],
    [4, 3, "leaves.png"],
    [2, 2, "mineral_coal.png"],
    [1, 2, "mineral_iron.png"],
    [2, 0, "mud.png"],
    [4, 2, "mossycobble.png"],
    [0, 7, "rail_curved.png"],
    [0, 8, "rail.png"],
    [2, 1, "sand.png"],
    [0, 13, "sandstone.png"],
    [6, 1, "steel_block.png"],
    [1, 0, "stone.png"],
    [4, 1, "tree.png"],
    [5, 1, "tree_top.png"],
    [4, 0, "wood.png"],
    [15, 13, "water.png"],
]

items_table = [
    [10, 0, "apple.png"],
    [11, 3, "book.png"],
    [6, 1, "clay_brick.png"],
    [9, 3, "lump_of_clay.png"],
    [7, 0, "lump_of_coal.png"],
    [10, 3, "paper.png"],
    [7, 1, "steel_ingot.png"],
    [5, 3, "stick.png"],
    [4, 6, "tool_mesepick.png"],
    [2, 7, "tool_steelaxe.png"],
    [2, 6, "tool_steelpick.png"],
    [2, 5, "tool_steelshovel.png"],
    [2, 4, "tool_steelsword.png"],
    [1, 7, "tool_stoneaxe.png"],
    [1, 6, "tool_stonepick.png"],
    [1, 5, "tool_stoneshovel.png"],
    [1, 4, "tool_stonesword.png"],
    [0, 7, "tool_woodaxe.png"],
    [0, 6, "tool_woodpick.png"],
    [0, 5, "tool_woodshovel.png"],
    [0, 4, "tool_woodsword.png"],
]

def usage
    puts "Usaage: #{__FILE__} <zipfile> [directory]"
end

if (ARGV.count == 0 || ARGV.count > 2)
    usage
    exit
end


Zip::ZipFile.open(ARGV[0]) do |pack|
    Dir.chdir ARGV[1] if ARGV[1]
    terrain = image_from_archive(pack, "terrain.png")
    size = terrain.rows / 16
    cut(terrain, size, terrain_table)
    extract_crack(terrain)
    fix_greens
    generate_rails(size)

    items = image_from_archive(pack, "gui/items.png")
    cut(items, items.rows / 16, items_table)

    icons = image_from_archive(pack, "gui/icons.png")
    scale = icons.rows / 256
    tile = icons.crop(scale * (16 + 4*9), 0, scale * 9, scale * 9, true)
    tile.write("heart.png")
end

You should install RMagick and rubyzip to use it.

It must work with any texturepack, howerer there are some problems with transparency.

Here is a list of what does not work:
  • I don't know how to properly colorize the grass and leaves
  • With the default texturepack (minecraft.jar) cracking texture (crack.png) makes the block completely transparent but with other texturepacks it works right
  • To make crossing rails texture i combined two others and it looks ugly
  • Fences and signes don't convert

User avatar
sdzen
Member
Posts: 1170
Joined: Fri Aug 05, 2011 22:33
Location: Paradise (your not allowed)

by sdzen » Post

sounds like the texture transformer thats used in manic digger and i don't believe that you need to contact the owner if your not distributing the texture pack but i could be wrong otherwise great job :)

Zen S.D.

The next generation of tranquility!
malheureusement mon français n'est pas bon :<
Owner of the Zelo's
In game name: MuadTralk, spdtainted, sdzen, sd zen, sdzeno

anatole
New member
Posts: 2
Joined: Fri Sep 30, 2011 22:55

by anatole » Post

Yes, this script just cuts a large source texturepack into many small files used by Minetest and all copyrights belong to authors of this texturepack.

User avatar
Calinou
Moderator
Posts: 3169
Joined: Mon Aug 01, 2011 14:26
GitHub: Calinou
IRC: Calinou
In-game: Calinou
Location: Troyes, France
Contact:

by Calinou » Post

I just converted a pack by hand a few weeks ago... :(
Still nice.

User avatar
IPushButton2653
Member
Posts: 666
Joined: Wed Nov 16, 2011 22:47
Location: Mississippi
Contact:

by IPushButton2653 » Post

I know this is out-of-date, but maybe it can help ease the tension in transferring a whole pack.

User avatar
sdzen
Member
Posts: 1170
Joined: Fri Aug 05, 2011 22:33
Location: Paradise (your not allowed)

by sdzen » Post

Code: Select all

#!/usr/bin/env ruby

require 'RMagick'
require 'zip/zipfilesystem'

def image_from_archive archive, image_name
    blob = archive.file.read(image_name)
    terrain = Magick::ImageList.new
    terrain.from_blob(blob)
end


def cut image, size, table
    table.each do |current|
        x = size * current[0]
        y = size * current[1]
        tile = image.crop(x, y, size, size, true)
        tile.write current[2]
    end
end

def fix_greens
    files = ["default_grass.png", "default_grass_side.png"]
    files.each do |current|
        img = Magick::ImageList.new(current)
        img = img.colorize(0.6, 0.6, 0.6, "#003F00")
        img.write(current)
    end
    img = Magick::ImageList.new("default_leaves.png")
    img = img.colorize(0.8, 0.8, 0.8, "#003F00")
    img.write("leaves.png")
end

def generate_rails size
    straight = Magick::ImageList.new("default_rail.png")
    curved = Magick::ImageList.new("default_rail_curved.png")

    tile = straight.composite(curved, 0, 0, Magick::OverCompositeOp)
    tile.write("default_rail_t_junction.png")

    horizontal = straight.rotate(90)
    tile = straight.composite(horizontal, 0, 0, Magick::OverCompositeOp)
    tile.write("default_rail_crossing.png")
end

def extract_crack terrain
    size = terrain.rows / 16
    nstages = 5
    crack = Magick::Image.new(size, size * nstages) {
        self.background_color = "#00000000"
    }
    selected_stages = [2, 3, 5, 6, 9]
    nstages.times do |stage_number|
        x = selected_stages[stage_number] * size
        y = 15 * size
        tile = terrain.crop(x, y, size, size, true)

        x = 0
        y = stage_number * size
        crack.composite!(tile, x, y, Magick::CopyCompositeOp)
    end
    crack.write("default_crack.png")
end

terrain_table = [
    [3, 2, "default_bookshelf.png"],
    [7, 0, "default_brick.png"],
    [6, 4, "default_cactus_side.png"],
    [5, 4, "default_cactus_top.png"],
    [11, 1, "default_chest_front.png"],
    [10, 1, "default_chest_side.png"],
    [9, 1, "default_chest_top.png"],
    [8, 4, "default_clay.png"],
    [6, 1, "default_cloud.png"],
    [0, 1, "default_cobble.png"],
    [12, 2, "default_furnace_front.png"],
    [14, 3, "default_furnace_side.png"],
    [1, 3, "default_glass.png"],
    [0, 0, "default_grass.png"],
    [6, 2, "default_grass_side.png"],
    [3, 1, "default_gravel.png"],
    [3, 5, "default_ladder.png"],
    [15, 15, "default_lava.png"],
    [4, 3, "default_leaves.png"],
    [2, 2, "mineral_coal.png"],
    [1, 2, "mineral_iron.png"],
    [2, 0, "default_mud.png"],
    [4, 2, "default_mossycobble.png"],
    [0, 7, "default_rail_curved.png"],
    [0, 8, "default_rail.png"],
    [2, 1, "default_sand.png"],
    [0, 13, "default_sandstone.png"],
    [6, 1, "default_steel_block.png"],
    [1, 0, "default_stone.png"],
    [4, 1, "default_tree.png"],
    [5, 1, "default_tree_top.png"],
    [4, 0, "default_wood.png"],
    [15, 13, "default_water.png"],
]

items_table = [
    [10, 0, "default_apple.png"],
    [11, 3, "default_book.png"],
    [6, 1, "default_clay_brick.png"],
    [9, 3, "default_clay_lump.png"],
    [7, 0, "default_coal_lump.png"],
    [10, 3, "default_paper.png"],
    [7, 1, "default_steel_ingot.png"],
    [5, 3, "default_stick.png"],
    [4, 6, "default_tool_mesepick.png"],
    [2, 7, "default_tool_steelaxe.png"],
    [2, 6, "default_tool_steelpick.png"],
    [2, 5, "default_tool_steelshovel.png"],
    [2, 4, "default_tool_steelsword.png"],
    [1, 7, "default_tool_stoneaxe.png"],
    [1, 6, "default_tool_stonepick.png"],
    [1, 5, "default_tool_stoneshovel.png"],
    [1, 4, "default_tool_stonesword.png"],
    [0, 7, "default_tool_woodaxe.png"],
    [0, 6, "default_tool_woodpick.png"],
    [0, 5, "default_tool_woodshovel.png"],
    [0, 4, "default_tool_woodsword.png"],
]

def usage
    puts "Usaage: #{__FILE__} <zipfile> [directory]"
end

if (ARGV.count == 0 || ARGV.count > 2)
    usage
    exit
end


Zip::ZipFile.open(ARGV[0]) do |pack|
    Dir.chdir ARGV[1] if ARGV[1]
    terrain = image_from_archive(pack, "terrain.png")
    size = terrain.rows / 16
    cut(terrain, size, terrain_table)
    extract_crack(terrain)
    fix_greens
    generate_rails(size)

    items = image_from_archive(pack, "gui/items.png")
    cut(items, items.rows / 16, items_table)

    icons = image_from_archive(pack, "gui/icons.png")
    scale = icons.rows / 256
    tile = icons.crop(scale * (16 + 4*9), 0, scale * 9, scale * 9, true)
    tile.write("heart.png")
end
I changed the texture names

Zen S.D.

The next generation of tranquility!
malheureusement mon français n'est pas bon :<
Owner of the Zelo's
In game name: MuadTralk, spdtainted, sdzen, sd zen, sdzeno

User avatar
RAPHAEL
Member
Posts: 627
Joined: Tue Nov 01, 2011 09:09
Location: Earth

by RAPHAEL » Post

sdzen wrote:

Code: Select all

#!/usr/bin/env ruby

require 'RMagick'
require 'zip/zipfilesystem'

def image_from_archive archive, image_name
    blob = archive.file.read(image_name)
    terrain = Magick::ImageList.new
    terrain.from_blob(blob)
end


def cut image, size, table
    table.each do |current|
        x = size * current[0]
        y = size * current[1]
        tile = image.crop(x, y, size, size, true)
        tile.write current[2]
    end
end

def fix_greens
    files = ["default_grass.png", "default_grass_side.png"]
    files.each do |current|
        img = Magick::ImageList.new(current)
        img = img.colorize(0.6, 0.6, 0.6, "#003F00")
        img.write(current)
    end
    img = Magick::ImageList.new("default_leaves.png")
    img = img.colorize(0.8, 0.8, 0.8, "#003F00")
    img.write("leaves.png")
end

def generate_rails size
    straight = Magick::ImageList.new("default_rail.png")
    curved = Magick::ImageList.new("default_rail_curved.png")

    tile = straight.composite(curved, 0, 0, Magick::OverCompositeOp)
    tile.write("default_rail_t_junction.png")

    horizontal = straight.rotate(90)
    tile = straight.composite(horizontal, 0, 0, Magick::OverCompositeOp)
    tile.write("default_rail_crossing.png")
end

def extract_crack terrain
    size = terrain.rows / 16
    nstages = 5
    crack = Magick::Image.new(size, size * nstages) {
        self.background_color = "#00000000"
    }
    selected_stages = [2, 3, 5, 6, 9]
    nstages.times do |stage_number|
        x = selected_stages[stage_number] * size
        y = 15 * size
        tile = terrain.crop(x, y, size, size, true)

        x = 0
        y = stage_number * size
        crack.composite!(tile, x, y, Magick::CopyCompositeOp)
    end
    crack.write("default_crack.png")
end

terrain_table = [
    [3, 2, "default_bookshelf.png"],
    [7, 0, "default_brick.png"],
    [6, 4, "default_cactus_side.png"],
    [5, 4, "default_cactus_top.png"],
    [11, 1, "default_chest_front.png"],
    [10, 1, "default_chest_side.png"],
    [9, 1, "default_chest_top.png"],
    [8, 4, "default_clay.png"],
    [6, 1, "default_cloud.png"],
    [0, 1, "default_cobble.png"],
    [12, 2, "default_furnace_front.png"],
    [14, 3, "default_furnace_side.png"],
    [1, 3, "default_glass.png"],
    [0, 0, "default_grass.png"],
    [6, 2, "default_grass_side.png"],
    [3, 1, "default_gravel.png"],
    [3, 5, "default_ladder.png"],
    [15, 15, "default_lava.png"],
    [4, 3, "default_leaves.png"],
    [2, 2, "mineral_coal.png"],
    [1, 2, "mineral_iron.png"],
    [2, 0, "default_mud.png"],
    [4, 2, "default_mossycobble.png"],
    [0, 7, "default_rail_curved.png"],
    [0, 8, "default_rail.png"],
    [2, 1, "default_sand.png"],
    [0, 13, "default_sandstone.png"],
    [6, 1, "default_steel_block.png"],
    [1, 0, "default_stone.png"],
    [4, 1, "default_tree.png"],
    [5, 1, "default_tree_top.png"],
    [4, 0, "default_wood.png"],
    [15, 13, "default_water.png"],
]

items_table = [
    [10, 0, "default_apple.png"],
    [11, 3, "default_book.png"],
    [6, 1, "default_clay_brick.png"],
    [9, 3, "default_clay_lump.png"],
    [7, 0, "default_coal_lump.png"],
    [10, 3, "default_paper.png"],
    [7, 1, "default_steel_ingot.png"],
    [5, 3, "default_stick.png"],
    [4, 6, "default_tool_mesepick.png"],
    [2, 7, "default_tool_steelaxe.png"],
    [2, 6, "default_tool_steelpick.png"],
    [2, 5, "default_tool_steelshovel.png"],
    [2, 4, "default_tool_steelsword.png"],
    [1, 7, "default_tool_stoneaxe.png"],
    [1, 6, "default_tool_stonepick.png"],
    [1, 5, "default_tool_stoneshovel.png"],
    [1, 4, "default_tool_stonesword.png"],
    [0, 7, "default_tool_woodaxe.png"],
    [0, 6, "default_tool_woodpick.png"],
    [0, 5, "default_tool_woodshovel.png"],
    [0, 4, "default_tool_woodsword.png"],
]

def usage
    puts "Usaage: #{__FILE__} <zipfile> [directory]"
end

if (ARGV.count == 0 || ARGV.count > 2)
    usage
    exit
end


Zip::ZipFile.open(ARGV[0]) do |pack|
    Dir.chdir ARGV[1] if ARGV[1]
    terrain = image_from_archive(pack, "terrain.png")
    size = terrain.rows / 16
    cut(terrain, size, terrain_table)
    extract_crack(terrain)
    fix_greens
    generate_rails(size)

    items = image_from_archive(pack, "gui/items.png")
    cut(items, items.rows / 16, items_table)

    icons = image_from_archive(pack, "gui/icons.png")
    scale = icons.rows / 256
    tile = icons.crop(scale * (16 + 4*9), 0, scale * 9, scale * 9, true)
    tile.write("heart.png")
end
I changed the texture names
So.. how to use this? I've been attempting to use this for a couple hours now and get nowhere.

When trying to run it I get:
"./convert.rb:4:in `require': no such file to load -- zip/zipfilesystem (LoadError)
from ./convert.rb:4"
I can't seem to find any way to "fix" this (not used to Ruby). Running on an Ubuntu based distro.
"Before you speak, ask yourself: Is it kind, is it true, is it necessary, does it improve upon the silence?"
My mods: http://goo.gl/n4kpn
(Currently Various, Industrial, Fakeblocks, Jail, MoarCraft, Christmas, Replicator, minetest dev installer for linux, bash mod installer, windows mod installer)

User avatar
sdzen
Member
Posts: 1170
Joined: Fri Aug 05, 2011 22:33
Location: Paradise (your not allowed)

by sdzen » Post

neither am I i just changed the texture names for most recent version it appears that it divides the file into sections and names them accordingly

Zen S.D.

The next generation of tranquility!
malheureusement mon français n'est pas bon :<
Owner of the Zelo's
In game name: MuadTralk, spdtainted, sdzen, sd zen, sdzeno

MikoMiko
Member
Posts: 16
Joined: Sun Apr 08, 2012 17:41

by MikoMiko » Post

I've made a couple of small additions to this script, namely it will know always output the colorized leaves as "default_leaves.png" instead of just "leaves.png" and it will create a "default_dirt.png" which it wasn't before. It would be really great if someone who is better at Ruby then I am could modify this script to extract wool, bucket, and stonebrick textures from a Minecraft texture pack so it would be easy to use generated textures with mods too.

Code: Select all

#!/bin/env ruby
require 'rubygems'
require 'RMagick'
require 'zip/zipfilesystem'

def image_from_archive archive, image_name
    blob = archive.file.read(image_name)
    terrain = Magick::ImageList.new
    terrain.from_blob(blob)
end


def cut image, size, table
    table.each do |current|
        x = size * current[0]
        y = size * current[1]
        tile = image.crop(x, y, size, size, true)
        tile.write current[2]
    end
end

def fix_greens
    files = ["default_grass.png", "default_grass_side.png"]
    files.each do |current|
        img = Magick::ImageList.new(current)
        img = img.colorize(0.6, 0.6, 0.6, "#003F00")
        img.write(current)
    end
    img = Magick::ImageList.new("default_leaves.png")
    img = img.colorize(0.8, 0.8, 0.8, "#003F00")
    img.write("default_leaves.png")
end

def generate_rails size
    straight = Magick::ImageList.new("default_rail.png")
    curved = Magick::ImageList.new("default_rail_curved.png")

    tile = straight.composite(curved, 0, 0, Magick::OverCompositeOp)
    tile.write("default_rail_t_junction.png")

    horizontal = straight.rotate(90)
    tile = straight.composite(horizontal, 0, 0, Magick::OverCompositeOp)
    tile.write("default_rail_crossing.png")
end

def extract_crack terrain
    size = terrain.rows / 16
    nstages = 5
    crack = Magick::Image.new(size, size * nstages) {
        self.background_color = "#00000000"
    }
    selected_stages = [2, 3, 5, 6, 9]
    nstages.times do |stage_number|
        x = selected_stages[stage_number] * size
        y = 15 * size
        tile = terrain.crop(x, y, size, size, true)

        x = 0
        y = stage_number * size
        crack.composite!(tile, x, y, Magick::CopyCompositeOp)
    end
    crack.write("default_crack.png")
end

terrain_table = [
    [3, 2, "default_bookshelf.png"],
    [7, 0, "default_brick.png"],
    [6, 4, "default_cactus_side.png"],
    [5, 4, "default_cactus_top.png"],
    [11, 1, "default_chest_front.png"],
    [10, 1, "default_chest_side.png"],
    [9, 1, "default_chest_top.png"],
    [8, 4, "default_clay.png"],
    [6, 1, "default_cloud.png"],
    [0, 1, "default_cobble.png"],
    [12, 2, "default_furnace_front.png"],
    [14, 3, "default_furnace_side.png"],
    [1, 3, "default_glass.png"],
    [0, 0, "default_grass.png"],
    [6, 2, "default_grass_side.png"],
    [3, 1, "default_gravel.png"],
    [3, 5, "default_ladder.png"],
    [15, 15, "default_lava.png"],
    [4, 3, "default_leaves.png"],
    [2, 2, "mineral_coal.png"],
    [1, 2, "mineral_iron.png"],
    [2, 0, "default_mud.png"],
    [2, 0, "default_dirt.png"],
    [4, 2, "default_mossycobble.png"],
    [0, 7, "default_rail_curved.png"],
    [0, 8, "default_rail.png"],
    [2, 1, "default_sand.png"],
    [0, 13, "default_sandstone.png"],
    [6, 1, "default_steel_block.png"],
    [1, 0, "default_stone.png"],
    [4, 1, "default_tree.png"],
    [5, 1, "default_tree_top.png"],
    [4, 0, "default_wood.png"],
    [15, 13, "default_water.png"],
]

items_table = [
    [10, 0, "default_apple.png"],
    [11, 3, "default_book.png"],
    [6, 1, "default_clay_brick.png"],
    [9, 3, "default_clay_lump.png"],
    [7, 0, "default_coal_lump.png"],
    [10, 3, "default_paper.png"],
    [7, 1, "default_steel_ingot.png"],
    [5, 3, "default_stick.png"],
    [4, 6, "default_tool_mesepick.png"],
    [2, 7, "default_tool_steelaxe.png"],
    [2, 6, "default_tool_steelpick.png"],
    [2, 5, "default_tool_steelshovel.png"],
    [2, 4, "default_tool_steelsword.png"],
    [1, 7, "default_tool_stoneaxe.png"],
    [1, 6, "default_tool_stonepick.png"],
    [1, 5, "default_tool_stoneshovel.png"],
    [1, 4, "default_tool_stonesword.png"],
    [0, 7, "default_tool_woodaxe.png"],
    [0, 6, "default_tool_woodpick.png"],
    [0, 5, "default_tool_woodshovel.png"],
    [0, 4, "default_tool_woodsword.png"],
]

def usage
    puts "Usaage: #{__FILE__} <zipfile> [directory]"
end

if (ARGV.count == 0 || ARGV.count > 2)
    usage
    exit
end


Zip::ZipFile.open(ARGV[0]) do |pack|
    Dir.chdir ARGV[1] if ARGV[1]
    terrain = image_from_archive(pack, "terrain.png")
    size = terrain.rows / 16
    cut(terrain, size, terrain_table)
    extract_crack(terrain)
    fix_greens
    generate_rails(size)

    items = image_from_archive(pack, "gui/items.png")
    cut(items, items.rows / 16, items_table)

    icons = image_from_archive(pack, "gui/icons.png")
    scale = icons.rows / 256
    tile = icons.crop(scale * (16 + 4*9), 0, scale * 9, scale * 9, true)
    tile.write("heart.png")
end

MikoMiko
Member
Posts: 16
Joined: Sun Apr 08, 2012 17:41

by MikoMiko » Post

Okay, adding support for bucket and wool textures was a lot easier than I thought it would be once I realized this script split up terrain.png and items.png into grids. I've taken the liberty of throwing the script up on GitHub to make it easier to share and for other people to add to it.
https://github.com/TacticalGenius/TexturePackConverter

If you have any ideas for additions or find any bugs please post here or on GitHub.
Last edited by MikoMiko on Mon May 21, 2012 21:10, edited 1 time in total.

MikoMiko
Member
Posts: 16
Joined: Sun Apr 08, 2012 17:41

by MikoMiko » Post

Just thought I would pop in to bump this since I've been working on the script again and updating it to make textures for some of the stuff that's been added to minetest since I lost interest in it a while ago. As usual, if you have any suggestions or are having a problem post here or open an issue on GitHub.

Post Reply

Who is online

Users browsing this forum: No registered users and 14 guests