]> git.tdb.fi Git - libs/gl.git/blobdiff - scripts/maketex.py
Better naming algorithm for objects in scene export
[libs/gl.git] / scripts / maketex.py
index 92a284215796b1021ce8ca55f8098a668cc658e6..520be8424b02f39740b663bd03fc83c736e05f54 100755 (executable)
@@ -1,46 +1,72 @@
 #!/usr/bin/python
 
 def escape(str):
-       result=""
+       result = ""
        for c in str:
                if c=='"':
-                       result+='\\"'
+                       result += '\\"'
                elif c=='\\':
-                       result+='\\\\'
+                       result += '\\\\'
                elif ord(c)<0x20:
-                       result+="\\%03o"%ord(c)
+                       result += "\\%03o"%ord(c)
                else:
-                       result+=c
-       return result;
+                       result += c
+       return result
 
-def make_tex(fn):
-       import Image
+def make_tex(fn, filter="LINEAR", anisotropy=0, wrap=None, srgb=False):
+       from PIL import Image
 
-       img=Image.open(fn)
+       img = Image.open(fn)
 
-       fmt="".join(img.getbands())
+       fmt = "".join(img.getbands())
        if fmt=="LA":
-               fmt="LUMINANCE_ALPHA"
+               fmt = "LUMINANCE_ALPHA"
        elif fmt=="L":
-               fmt="LUMINANCE"
+               fmt = "LUMINANCE"
+
+       if srgb:
+               fmt = "S"+fmt
 
-       result="storage %s %d %d;\n"%(fmt, img.size[0], img.size[1])
-       result+="min_filter LINEAR;\n"
-       result+="raw_data \""
-       data=list(img.getdata())
+       result = "storage %s %d %d;\n"%(fmt, img.size[0], img.size[1])
+       result += "filter %s;\n"%filter
+       if "MIPMAP" in filter:
+               result += "generate_mipmap true;\n"
+       if anisotropy:
+               result += "max_anisotropy %d;\n"%anisotropy
+       if wrap:
+               result += "wrap %s;\n"%wrap
+       result += "raw_data \""
+       data = list(img.getdata())
        for y in range(img.size[1]):
-               i=(img.size[1]-1-y)*img.size[0]
-               result+=escape("".join(["".join([chr(v) for v in p]) for p in data[i:i+img.size[0]]]))
-       result+="\";\n"
+               i = (img.size[1]-1-y)*img.size[0]
+               if fmt=="LUMINANCE" or fmt=="SLUMINANCE":
+                       result += escape("".join([chr(v) for v in data[i:i+img.size[0]]]))
+               else:
+                       result += escape("".join(["".join([chr(v) for v in p]) for p in data[i:i+img.size[0]]]))
+       result += "\";\n"
 
        return result
 
 if __name__=="__main__":
-       import sys
        import os
+       import argparse
+
+       parser = argparse.ArgumentParser()
+       parser.add_argument("-o", "--output", metavar="FILE", help="Output filename")
+       parser.add_argument("-f", "--filter", choices=["NEAREST", "LINEAR", "MIPMAP"], default="LINEAR", help="Filtering mode")
+       parser.add_argument("-a", "--anisotropy", metavar="NUMBER", help="Maximum anisotropy, 0 = disable")
+       parser.add_argument("-w", "--wrap", choices=["REPEAT", "CLAMP_TO_EDGE", "MIRRORED_REPEAT"], help="Wrapping mode")
+       parser.add_argument("--srgb", action="store_const", const=True, help="Use sRGB color space")
+       parser.add_argument("image")
+
+       args = parser.parse_args()
+
+       filter = args.filter
+       if filter=="MIPMAP":
+               filter = "LINEAR_MIPMAP_LINEAR"
 
-       if len(sys.argv)<2:
-               print "Usage: %s <image>"%sys.argv[0]
-       else:
-               out=file(os.path.splitext(sys.argv[1])[0]+".tex", "w")
-               out.write(make_tex(sys.argv[1]))
+       out_fn = args.output
+       if not out_fn:
+               out_fn = os.path.splitext(args.image)[0]+".tex2d"
+       out = file(out_fn, "w")
+       out.write(make_tex(args.image, filter, args.anisotropy, args.wrap, args.srgb))