diff options
Diffstat (limited to 'release/scripts/flt_lodedit.py')
-rw-r--r-- | release/scripts/flt_lodedit.py | 502 |
1 files changed, 502 insertions, 0 deletions
diff --git a/release/scripts/flt_lodedit.py b/release/scripts/flt_lodedit.py new file mode 100644 index 00000000000..58319b9e525 --- /dev/null +++ b/release/scripts/flt_lodedit.py @@ -0,0 +1,502 @@ +#!BPY + +""" +Name: 'FLT LOD Editor' +Blender: 240 +Group: 'Misc' +Tooltip: 'Level of Detail Edtior for FLT nodes' +""" + +__author__ = "Geoffrey Bantle" +__version__ = "1.0 11/21/07" +__email__ = ('scripts', 'Author, ') +__url__ = ('blender', 'blenderartists.org') + +__bpydoc__ ="""\ +This script provides tools for working with OpenFlight databases in Blender. OpenFlight is a +registered trademark of MultiGen-Paradigm, Inc. + +Feature overview and more availible at: +http://wiki.blender.org/index.php/Scripts/Manual/FLTools +""" + +# -------------------------------------------------------------------------- +# flt_palettemanager.py version 0.1 2005/04/08 +# -------------------------------------------------------------------------- +# ***** BEGIN GPL LICENSE BLOCK ***** +# +# Copyright (C) 2007: Blender Foundation +# +# 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 ***** +# -------------------------------------------------------------------------- + +import Blender.Draw as Draw +from Blender.BGL import * +import Blender +import flt_properties +reload(flt_properties) +from flt_properties import * + +#event codes +evcode = { + "LOD_MAKE" : 100, + "LOD_DELETE" : 101, + "LOD_CALC_CENTER" : 102, + "LOD_GRAB_CENTER" : 103, + "LOD_X" : 104, + "LOD_Y" : 105, + "LOD_Z" : 106, + "LOD_FREEZE" : 107, + "LOD_SIG" : 108, + "LOD_IN" : 109, + "LOD_OUT" : 110, + "LOD_TRANS" : 111, + "LOD_PREVIOUS" : 112 +} + + +#system +LOD_MAKE = None #PushButton +LOD_DELETE = None #PushButton +LOD_CALC_CENTER = None #PushButton +LOD_GRAB_CENTER = None #Pushbutton +LOD_FREEZE = None #Toggle +LOD_PREVIOUS = None #Toggle + +LOD_X = None #Input +LOD_Y = None #Input +LOD_Z = None #Input + +LOD_SIG = None #Input +LOD_IN = None #Input +LOD_OUT = None #Input +LOD_TRANS = None #Input + +#labels +LOD_EDITLABEL = None +LOD_SWITCHLABEL = None +LOD_CENTERLABEL = None + +LOD_XLABEL = None +LOD_YLABEL = None +LOD_ZLABEL = None +LOD_SIGLABEL = None +LOD_INLABEL = None +LOD_OUTLABEL = None +LOD_TRANSLABEL = None + + +#ID Props +switch_in = '5d!switch in' +switch_out = '6d!switch out' +xco = '10d!X co' +yco = '11d!Y co' +zco = '12d!Z co' +trans = '13d!Transition' +sig_size = '14d!Sig Size' + +#Flags +lodflag = '9I!flags' +previous_mask = (1 << 31) +freeze_mask = (1 << 29) + +def update_state(): + state = dict() + state["activeScene"] = Blender.Scene.GetCurrent() + state["activeObject"] = state["activeScene"].objects.active + if state["activeObject"] and not state["activeObject"].sel: + state["activeObject"] = None + state["activeMesh"] = None + if state["activeObject"] and state["activeObject"].type == 'Mesh': + state["activeMesh"] = state["activeObject"].getData(mesh=True) + + state["activeFace"] = None + if state["activeMesh"]: + if state["activeMesh"].faceUV and state["activeMesh"].activeFace != None: + state["activeFace"] = state["activeMesh"].faces[state["activeMesh"].activeFace] + + + #update editmode + state["editmode"] = Blender.Window.EditMode() + + return state + +def idprops_append(object, typecode, props): + object.properties["FLT"] = dict() + object.properties["FLT"]['type'] = typecode + for prop in props: + object.properties["FLT"][prop] = props[prop] + object.properties["FLT"]['3t8!id'] = object.name + +def idprops_kill(): + state = update_state() + if state["activeObject"] and state["activeObject"].properties.has_key('FLT'): + state["activeObject"].properties.pop('FLT') + +def idprops_copy(source): + state = update_state() + if source.properties.has_key('FLT'): + for object in state["activeScene"].objects: + if object.sel and object != source and (state["activeScene"].Layers & object.Layers): + idprops_kill(object) + object.properties['FLT'] = dict() + for key in source.properties['FLT']: + object.properties['FLT'][key] = source.properties['FLT'][key] + +def select_by_typecode(typecode): + state = update_state() + + for object in state["activeScene"].objects: + if object.properties.has_key('FLT') and object.properties['FLT']['type'] == typecode and state["activeScene"].Layers & object.Layers: + object.select(1) + +def idprops_type(object, typecode): + if object.properties.has_key('FLT') and object.properties['FLT'].has_key('type') and object.properties['FLT']['type'] == typecode: + return True + return False + +#ui type code +def get_prop(typecode, prop): + + state = update_state() + if state["activeObject"] and idprops_type(state["activeObject"], typecode): + props = state["activeObject"].properties['FLT'] + else: + props = flt_properties.FLTLOD + + return props[prop] + +def set_prop(typecode, prop, value): + state = update_state() + if state["activeObject"] and idprops_type(state["activeObject"],typecode): + state["activeObject"].properties['FLT'][prop] = value + + + +def get_lockmask(mask): + global lodflag + state = update_state() + if state["activeObject"]: + flag = get_prop(73,lodflag) + if flag & mask: + return True + return False + +def set_lockmask(mask): + state = update_state() + if state["activeObject"] and idprops_type(state["activeObject"], 73): + oldvalue = state["activeObject"].properties['FLT'][lodflag] + oldvalue = struct.unpack('>I', struct.pack('>i', oldvalue))[0] + oldvalue |= mask + state["activeObject"].properties['FLT'][lodflag] = struct.unpack('>i', struct.pack(">I", oldvalue))[0] + +def clear_lockmask(mask): + state = update_state() + if state["activeObject"] and idprops_type(state["activeObject"], 73): + oldvalue = state["activeObject"].properties['FLT'][lodflag] + oldvalue = struct.unpack('>I', struct.pack('>i', oldvalue))[0] + oldvalue &= ~mask + state["activeObject"].properties['FLT'][lodflag] = struct.unpack('>i',struct.pack('>I',oldvalue))[0] + +def findchildren(object): + state = update_state() + children = list() + for candidate in state["activeScene"].objects: + if candidate.parent == object: + children.append(candidate) + retlist = list(children) + for child in children: + retlist = retlist + findchildren(child) + return retlist + +def get_object_center(object): + bbox = object.getBoundBox(1) + average = Blender.Mathutils.Vector(0.0, 0.0, 0.0) + + for point in bbox: + average[0] += point[0] + average[1] += point[1] + average[2] += point[2] + + average[0] = average[0] / 8.0 + average[1] = average[1] / 8.0 + average[2] = average[2] / 8.0 + + return average + + +def calc_center(): + + global xco + global yco + global zco + + state = update_state() + if state["activeObject"] and idprops_type(state["activeObject"], 73): + average = Blender.Mathutils.Vector(0.0, 0.0, 0.0) + children = findchildren(state["activeObject"]) #get children objects + if children: + for child in children: + center = get_object_center(child) + average[0] += center[0] + average[1] += center[1] + average[2] += center[2] + + average[0] = average[0] / len(children) + average[1] = average[1] / len(children) + average[2] = average[2] / len(children) + + set_prop(73, xco, average[0]) + set_prop(73, yco, average[1]) + set_prop(73, zco, average[2]) + + +def grab_center(): + + global xco + global yco + global zco + + state = update_state() + if state["activeObject"] and idprops_type(state["activeObject"], 73): + center = Blender.Window.GetCursorPos() + + set_prop(73, xco, center[0]) + set_prop(73, yco, center[1]) + set_prop(73, zco, center[2]) + + +def create_lod(): + state = update_state() + actobj = state["activeObject"] + if actobj and not idprops_type(actobj, 73): + idprops_kill() + idprops_append(actobj,73, flt_properties.FLTLOD) + calc_center() + + + +def event(evt,val): + if evt == Draw.ESCKEY: + Draw.Exit() + +def but_event(evt): + + global LOD_MAKE + global LOD_DELETE + global LOD_CALC_CENTER + global LOD_GRAB_CENTER + global LOD_FREEZE + global LOD_PREVIOUS + global LOD_X + global LOD_Y + global LOD_Z + global LOD_SIG + global LOD_IN + global LOD_OUT + global LOD_TRANS + + global switch_in + global switch_out + global xco + global yco + global zco + global trans + global sig_size + + global lodflag + global previous_mask + global freeze_mask + + global evcode + + #do "system" events + if evt == evcode["LOD_MAKE"]: + create_lod() + + if evt == evcode["LOD_CALC_CENTER"]: + calc_center() + + if evt == evcode["LOD_DELETE"]: + idprops_kill() + + if evt == evcode["LOD_GRAB_CENTER"]: + grab_center() + + #do mask events + if evt == evcode["LOD_FREEZE"]: + if LOD_FREEZE.val == True: + set_lockmask(freeze_mask) + else: + clear_lockmask(freeze_mask) + + if evt == evcode["LOD_PREVIOUS"]: + if LOD_PREVIOUS.val == True: + set_lockmask(previous_mask) + else: + clear_lockmask(previous_mask) + + #do input events + if evt == evcode["LOD_X"]: + set_prop(73, xco, LOD_X.val) + if evt == evcode["LOD_Y"]: + set_prop(73, yco, LOD_Y.val) + if evt == evcode["LOD_Z"]: + set_prop(73, zco, LOD_Z.val) + if evt == evcode["LOD_SIG"]: + set_prop(73, sig_size, LOD_SIG.val) + if evt == evcode["LOD_IN"]: + set_prop(73, switch_in, LOD_IN.val) + if evt == evcode["LOD_OUT"]: + set_prop(73, switch_out, LOD_OUT.val) + if evt == evcode["LOD_TRANS"]: + set_prop(73, trans, LOD_TRANS.val) + + + Draw.Redraw(1) + Blender.Window.RedrawAll() + +def draw_propsheet(x,y): + + global LOD_MAKE + global LOD_DELETE + global LOD_CALC_CENTER + global LOD_GRAB_CENTER + global LOD_FREEZE + global LOD_PREVIOUS + global LOD_X + global LOD_Y + global LOD_Z + global LOD_SIG + global LOD_IN + global LOD_OUT + global LOD_TRANS + + #labels + global LOD_EDITLABEL + global LOD_SWITCHLABEL + global LOD_CENTERLABEL + global LOD_XLABEL + global LOD_YLABEL + global LOD_ZLABEL + global LOD_SIGLABEL + global LOD_INLABEL + global LOD_OUTLABEL + global LOD_TRANSLABEL + + + global switch_in + global switch_out + global xco + global yco + global zco + global trans + global sig_size + + global lodflag + global previous_mask + global freeze_mask + + global evcode + + + global evcode + + state = update_state() + + label_width = 100 + row_height = 20 + toggle_width = 50 + input_width = 100 + pad = 10 + origx = x + origy = (row_height * 16) + (pad * 16) + + + #editor label + x = origx + y = origy + LOD_EDITLABEL = Blender.Draw.Label("FLT Level of Detail Editor", x, y, 250, row_height) + + + #Center inputs + x = origx + y = y- (row_height + pad) + LOD_CENTERLABEL = Blender.Draw.Label("LOD center", x, y, label_width, row_height) + y = y- (row_height + pad) + LOD_XLABEL = Blender.Draw.Label("X Coordinate", x, y, label_width, row_height) + x = origx + (label_width + pad) + LOD_X = Blender.Draw.Number("", evcode["LOD_X"], x, y, input_width, row_height,get_prop(73,xco), -1000000.0, 1000000.0, "") + x = origx + y = y- (row_height + pad) + LOD_YLABEL = Blender.Draw.Label("Y Coordinate", x, y, label_width, row_height) + x = origx + (label_width + pad) + LOD_Y = Blender.Draw.Number("", evcode["LOD_Y"], x, y, input_width, row_height,get_prop(73,yco), -1000000.0, 1000000.0, "") + x = origx + y = y- (row_height + pad) + LOD_ZLABEL = Blender.Draw.Label("Z Coordinate", x, y, label_width, row_height) + x = origx + (label_width + pad) + LOD_Z = Blender.Draw.Number("", evcode["LOD_Z"], x, y, input_width, row_height,get_prop(73,zco), -1000000.0, 1000000.0, "") + + + #Switch inputs + x = origx + y = y- (row_height + pad) + LOD_SWITCHLABEL = Blender.Draw.Label("Switch Settings", x, y, input_width, row_height) + y = y- (row_height + pad) + LOD_SIGLABEL = Blender.Draw.Label("Significant Size", x, y, label_width, row_height) + x = origx + (label_width + pad) + LOD_SIG = Blender.Draw.Number("", evcode["LOD_SIG"], x, y, input_width, row_height, get_prop(73,sig_size), -1000000.0, 1000000.0, "") + x = origx + y = y- (row_height + pad) + LOD_INLABEL = Blender.Draw.Label("Switch In", x, y, label_width, row_height) + x = origx + (label_width + pad) + LOD_IN = Blender.Draw.Number("", evcode["LOD_IN"], x, y, input_width, row_height, get_prop(73,switch_in), -1000000.0, 1000000.0, "") + x = origx + y = y- (row_height + pad) + LOD_OUTLABEL = Blender.Draw.Label("Switch Out", x, y, label_width, row_height) + x = origx + (label_width + pad) + LOD_OUT = Blender.Draw.Number("", evcode["LOD_OUT"], x, y, input_width, row_height, get_prop(73,switch_out), -1000000.0, 1000000.0, "") + x = origx + y = y- (row_height + pad) + LOD_TRANSLABEL = Blender.Draw.Label("Transition", x, y, label_width, row_height) + x = origx + (label_width + pad) + LOD_TRANS = Blender.Draw.Number("", evcode["LOD_TRANS"], x, y, input_width, row_height, get_prop(73,trans), -1000000.0, 1000000.0, "") + + + x = origx + y = y - (row_height + pad) + LOD_MAKE = Blender.Draw.PushButton("Make LOD", evcode["LOD_MAKE"], x, y, input_width + label_width + pad, row_height, "Make a LOD Node out of Active Object") + y = y - (row_height + pad) + LOD_DELETE = Blender.Draw.PushButton("Delete LOD", evcode["LOD_DELETE"], x, y, input_width + label_width + pad, row_height, "Delete the LOD Node properties") + y = y - (row_height + pad) + LOD_CALC_CENTER = Blender.Draw.PushButton("Calculate Center", evcode["LOD_CALC_CENTER"], x, y, input_width + label_width + pad, row_height, "Calculate the center of this LOD") + y = y - (row_height + pad) + LOD_GRAB_CENTER = Blender.Draw.PushButton("Grab Center", evcode["LOD_GRAB_CENTER"], x, y, input_width + label_width + pad, row_height, "Grab center from 3d cursor") + y = y - (row_height + pad) + LOD_FREEZE = Blender.Draw.Toggle("Freeze Center", evcode["LOD_FREEZE"], x, y, input_width + label_width + pad, row_height, get_lockmask(freeze_mask), "") + y = y - (row_height + pad) + LOD_PREVIOUS = Blender.Draw.Toggle("Previous Range", evcode["LOD_PREVIOUS"], x, y, input_width + label_width + pad, row_height, get_lockmask(previous_mask), "") + +def gui(): + #draw the propsheet/toolbox. + psheety = 800 + #psheetx = psheety + 10 + draw_propsheet(20,psheety) + +Draw.Register(gui,event,but_event) +
\ No newline at end of file |