#!/usr/bin/python # ***** BEGIN GPL LICENSE BLOCK ***** # # Script copyright (C) Domino Designs Limited # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software Foundation, # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # ***** END GPL LICENCE BLOCK ***** # -------------------------------------------------------------------------- # Second Life is a registered trademark of Linden Research, Inc. from gimpfu import * height = 256 width = 256 layernames = [ "Height", "Factor", "Water", "Parcels", "For Sale", "Edit Object", "Edit Land", "Safe", "Flying", "Landmark", "Scripts", "Original Height", "Original Factor" ] layers = len( layernames ) def python_fu_save_raw_terrain( image, drawable, filename, raw_filename): gimp.progress_init("Saving %s"%(filename)) raw = "" r = "" if len( image.layers ) != layers: raise Error, "Image does not have %s layers"%( layers ) drawables = [ ] for l in range( layers ): drawables.append( None ) for l in image.layers: try: layer = layernames.index( l.name ) except ValueError: raise ValueError, "\"%s\" is not a supported layer name"%(l.name) drawables[ layer ] = l.get_pixel_rgn( 0, 0, width, height ) for h in range(height): for w in range(width): for l in range( layers ): raw += drawables[ l ][ w, h ] gimp.progress_update( float(h) / height ) f = open( filename, "wb" ) f.write( raw ) f.close() def register_save(): gimp.register_save_handler("file-slraw-save", "raw", "") def python_fu_load_raw_terrain( filename, raw_filename ): pixels = [] f = open( filename, "rb" ) raw = f.read() f.close() img = gimp.Image(height, width, GRAY ) img.disable_undo() pdelta = 1.0 / layers gimp.progress_init("Loading %s"%(filename)) for l in range( layers ): layer = gimp.Layer( img, layernames[ l ], height, width, GRAY_IMAGE, 100, NORMAL_MODE ) pr = layer.get_pixel_rgn( 0, 0, width, height ) r = raw[l::layers] for w in range( width ): pr[ w, 0:height ] = r[ w::width ] gimp.progress_update( pdelta * l + pdelta * ( w / width ) ) img.add_layer( layer, l ) img.active_layer = img.layers[0] img.filename = filename img.enable_undo() return img def register_load(): gimp.register_load_handler("file-slraw-load", "raw", "") register( "file-slraw-load", "Load Second Life raw terrain file into layers", "Select a raw terrain file to load", "Domino Marama", "Domino Designs Limited", "2008", "Second Life Terrain", "", [ (PF_STRING, "filename", "File Name",""), (PF_STRING, "raw-filename", "raw file name", "") ], [ (PF_IMAGE, "image", "raw terrain", "") ], python_fu_load_raw_terrain, "", on_query = register_load ) register( "file-slraw-save", "Save layers to Second Life raw terrain file", "Select a raw terrain file to save as", "Domino Marama", "Domino Designs Limited", "2008", "Second Life Terrain", "GREY", [ (PF_IMAGE, "image", "Input image", "" ), (PF_DRAWABLE, "drawable", "Drawable to save", ""), (PF_STRING, "filename", "The name of the file to save the image in", ""), (PF_STRING, "raw-filename", "The name entered", "") ], [], python_fu_save_raw_terrain, "", on_query = register_save ) main()