#!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)