Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'release/scripts/flt_lodedit.py')
-rw-r--r--release/scripts/flt_lodedit.py502
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