file_slraw.py source view

in

file_slraw.py file

#!/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()
Note:Ignore line 140, that's being added by the website. It'll go when I figure out why.