mirror of
https://github.com/Anuken/Mindustry.git
synced 2025-01-07 05:50:54 +07:00
243 lines
7.8 KiB
Groovy
243 lines
7.8 KiB
Groovy
apply plugin: "java"
|
|
|
|
sourceCompatibility = 1.8
|
|
sourceSets.main.java.srcDirs = [ "src/" ]
|
|
|
|
import com.badlogic.gdx.graphics.Color
|
|
import com.badlogic.gdx.tools.texturepacker.TexturePacker
|
|
|
|
import javax.imageio.ImageIO
|
|
import java.awt.image.BufferedImage
|
|
|
|
def outFolder = "../core/assets-raw/sprites_out/"
|
|
def genFolder = "../core/assets-raw/sprites_out/generated/"
|
|
def doAntialias = true
|
|
|
|
def antialias = {File file ->
|
|
if(!doAntialias || file.lastModified() <= 1000) return
|
|
|
|
def image = ImageIO.read(file)
|
|
def out = ImageIO.read(file)
|
|
def getRGB = { int ix, int iy ->
|
|
//if(ix <= 0 || iy <= 0 || ix >= image.width || iy >= image.height) return 0
|
|
return image.getRGB(Math.max(Math.min(ix, image.width - 1), 0), Math.max(Math.min(iy, image.height - 1), 0))
|
|
}
|
|
|
|
def color = new Color()
|
|
def sum = new Color()
|
|
|
|
for (int x = 0; x < image.getWidth(); x++){
|
|
for(int y = 0; y < image.getHeight(); y++){
|
|
int A =
|
|
getRGB(x - 1, y + 1),
|
|
B = getRGB(x, y + 1),
|
|
C = getRGB(x + 1, y + 1),
|
|
D = getRGB(x - 1, y),
|
|
E = getRGB(x, y),
|
|
F = getRGB(x + 1, y),
|
|
G = getRGB(x - 1, y - 1),
|
|
H = getRGB(x, y - 1),
|
|
I = getRGB(x + 1, y - 1)
|
|
|
|
int p1=E, p2=E, p3=E, p4=E, p5=E, p6=E, p7=E, p8=E, p9=E
|
|
if (D==B && D!=H && B!=F) p1=D
|
|
if ((D==B && D!=H && B!=F && E!=C) || (B==F && B!=D && F!=H && E!=A)) p2=B
|
|
if (B==F && B!=D && F!=H) p3=F
|
|
if ((H==D && H!=F && D!=B && E!=A) || (D==B && D!=H && B!=F && E!=G)) p4=D
|
|
p5=E
|
|
if ((B==F && B!=D && F!=H && E!=I) || (F==H && F!=B && H!=D && E!=C)) p6=F
|
|
if (H==D && H!=F && D!=B) p7=D
|
|
if ((F==H && F!=B && H!=D && E!=G) || (H==D && H!=F && D!=B && E!=I)) p8=H
|
|
if (F==H && F!=B && H!=D) p9=F
|
|
|
|
int total = 0
|
|
|
|
[p1, p2, p3, p4, p5, p6, p7, p8, p9].each{ val ->
|
|
Color.argb8888ToColor(color, val)
|
|
|
|
if(color.a > 0.05){
|
|
sum.r += color.r
|
|
sum.g += color.g
|
|
sum.b += color.b
|
|
sum.a += color.a
|
|
total++
|
|
}
|
|
}
|
|
|
|
sum.mul((float)(1f / total))
|
|
int result = Color.argb8888(sum)
|
|
out.setRGB(x, y, result)
|
|
sum.set(0)
|
|
}
|
|
}
|
|
|
|
ImageIO.write(out, "png", file)
|
|
}
|
|
|
|
task swapColors(){
|
|
doLast{
|
|
if (project.hasProperty("colors")) {
|
|
def carr = new File(getProperty("colors")).text.split("\n")
|
|
def map = [:]
|
|
def swaps = 0
|
|
carr.each{str -> map[Color.argb8888(Color.valueOf(str.split("=")[0]))] = Color.argb8888(Color.valueOf(str.split("=")[1]))}
|
|
def tmpc = new Color()
|
|
|
|
fileTree(dir: '../core/assets-raw/sprites', include: "**/*.png").visit { file ->
|
|
if(file.isDirectory()) return
|
|
swaps ++
|
|
|
|
def img = ImageIO.read(file.file)
|
|
for (x in (0..img.getWidth()-1)) {
|
|
for (y in (0..img.getHeight()-1)) {
|
|
def c = img.getRGB(x, y)
|
|
Color.argb8888ToColor(tmpc, c)
|
|
if(tmpc.a < 0.1f) continue
|
|
if(map.containsKey(c)){
|
|
img.setRGB(x, y, (int)map.get(c))
|
|
}
|
|
}
|
|
}
|
|
ImageIO.write(img, "png", file.file)
|
|
}
|
|
println "Swapped $swaps images."
|
|
}else{
|
|
throw new InvalidUserDataException("No replacement colors specified. Use -Pcolors=\"<path to color file>\"")
|
|
}
|
|
}
|
|
}
|
|
|
|
task scaleSprites4x(){
|
|
doLast{
|
|
fileTree(dir: '../core/assets-raw/sprites_out/', include: "**/*.png").visit { file ->
|
|
if(file.isDirectory() || file.toString().contains("/ui/")) return
|
|
|
|
for(int iteration in 0..1) {
|
|
def image = ImageIO.read(file.file)
|
|
def scaled = new BufferedImage(image.getWidth() * 2, image.getHeight() * 2, BufferedImage.TYPE_INT_ARGB)
|
|
|
|
def getRGB = { int ix, int iy ->
|
|
//if(ix <= 0 || iy <= 0 || ix >= image.width || iy >= image.height) return 0
|
|
return image.getRGB(Math.max(Math.min(ix, image.width - 1), 0), Math.max(Math.min(iy, image.height - 1), 0))
|
|
}
|
|
|
|
for (int x = 0; x < image.getWidth(); x++) {
|
|
for (int y = 0; y < image.getHeight(); y++) {
|
|
int p = image.getRGB(x, y)
|
|
int p1 = p, p2 = p, p3 = p, p4 = p
|
|
|
|
int A = getRGB(x - 1, y + 1),
|
|
B = getRGB(x, y + 1),
|
|
C = getRGB(x + 1, y + 1),
|
|
D = getRGB(x - 1, y),
|
|
E = getRGB(x, y),
|
|
F = getRGB(x + 1, y),
|
|
G = getRGB(x - 1, y - 1),
|
|
H = getRGB(x, y - 1),
|
|
I = getRGB(x + 1, y - 1),
|
|
J = getRGB(x, y + 2),
|
|
K = getRGB(x - 2, y),
|
|
L = getRGB(x + 2, y),
|
|
M = getRGB(x, y - 2);
|
|
|
|
if (B==D && B!=F && D!=H && (E!=A || E==C || E==G || A==J || A==K)) p1 = B
|
|
if (B==F & B!=D & F!=H && (E!=C || E==A || E==I || C==J || C==L)) p2 = F
|
|
if (D==H & B!=D & F!=H && (E!=G || E==A || E==I || G==K || G==M)) p3 = D
|
|
if (F==H & B!=F & D!=H && (E!=I || E==C || E==G || I==L || I==M)) p4 = H
|
|
|
|
scaled.setRGB(x * 2, y * 2 + 1, p1)
|
|
scaled.setRGB(x * 2 + 1, y * 2 + 1, p2)
|
|
scaled.setRGB(x * 2, y * 2, p3)
|
|
scaled.setRGB(x * 2 + 1, y * 2, p4)
|
|
}
|
|
}
|
|
|
|
ImageIO.write(scaled, "png", file.file)
|
|
}
|
|
|
|
antialias(file.file)
|
|
}
|
|
}
|
|
}
|
|
|
|
task scaleSprites(){
|
|
finalizedBy 'genSprites'
|
|
|
|
doLast{
|
|
copy{
|
|
from "../core/assets-raw/sprites_replacement/"
|
|
into "../core/assets-raw/sprites_out/"
|
|
}
|
|
}
|
|
|
|
dependsOn 'scaleSprites4x'
|
|
}
|
|
|
|
task pack(){
|
|
dependsOn 'cleanSprites', 'scaleSprites'
|
|
//finalizedBy 'cleanup'
|
|
|
|
doLast{
|
|
|
|
fileTree(dir: '../core/assets-raw/sprites_out/', include: "**/*.png").visit{ file ->
|
|
if(file.isDirectory() || file.toString().contains("/ui/")) return
|
|
|
|
antialias(file.file)
|
|
}
|
|
|
|
TexturePacker.process("core/assets-raw/sprites_out/", "core/assets/sprites/", "sprites.atlas")
|
|
}
|
|
|
|
}
|
|
|
|
task cleanup(){
|
|
doLast {
|
|
delete {
|
|
delete genFolder
|
|
delete outFolder
|
|
}
|
|
}
|
|
}
|
|
|
|
task cleanSprites(){
|
|
|
|
doLast{
|
|
delete{
|
|
delete "../core/assets-raw/sprites_out/"
|
|
}
|
|
|
|
copy{
|
|
from "../core/assets-raw/sprites/"
|
|
into "../core/assets-raw/sprites_out/"
|
|
}
|
|
|
|
file(genFolder).mkdirs()
|
|
}
|
|
}
|
|
|
|
task antialiasGen(){
|
|
doLast{
|
|
fileTree(dir: '../core/assets-raw/sprites_out/generated/', include: "**/*.png").visit{ file ->
|
|
antialias(file.file)
|
|
}
|
|
}
|
|
}
|
|
|
|
task genSprites(dependsOn: classes, type: JavaExec) {
|
|
finalizedBy 'antialiasGen'
|
|
|
|
main = "io.anuke.mindustry.ImagePacker"
|
|
classpath = sourceSets.main.runtimeClasspath
|
|
standardInput = System.in
|
|
workingDir = genFolder
|
|
}
|
|
|
|
task updateBundles(dependsOn: classes, type: JavaExec) {
|
|
file(genFolder).mkdirs()
|
|
|
|
main = "io.anuke.mindustry.BundleLauncher"
|
|
classpath = sourceSets.main.runtimeClasspath
|
|
standardInput = System.in
|
|
workingDir = "../core/assets/bundles/"
|
|
}
|