diff options
-rw-r--r-- | release/datafiles/widget_export.py | 89 | ||||
-rw-r--r-- | release/scripts/modules/bpy_extras/keyconfig_utils.py | 35 | ||||
-rw-r--r-- | release/scripts/modules/rna_keymap_ui.py | 16 |
3 files changed, 133 insertions, 7 deletions
diff --git a/release/datafiles/widget_export.py b/release/datafiles/widget_export.py new file mode 100644 index 00000000000..fd5dd7b89ff --- /dev/null +++ b/release/datafiles/widget_export.py @@ -0,0 +1,89 @@ +# Apache License, Version 2.0 +import bpy +from bpy.types import Operator +from bpy.props import StringProperty +from bpy_extras.io_utils import ExportHelper + +def mesh_triangulate(me): + import bmesh + bm = bmesh.new() + bm.from_mesh(me) + bmesh.ops.triangulate(bm, faces=bm.faces) + bm.to_mesh(me) + bm.free() + + +class ExportWidget(Operator, ExportHelper): + """Export a widget mesh as a C file""" + bl_idname = "export_scene.widget" + bl_label = "Export Widget" + bl_options = {'PRESET', 'UNDO'} + + filename_ext = ".c" + filter_glob = StringProperty( + default="*.c;", + options={'HIDDEN'}, + ) + @classmethod + def poll(cls, context): + obj = context.active_object + return (obj and obj.type == 'MESH') + + def execute(self, context): + ob = context.active_object + scene = context.scene + + try: + me = ob.to_mesh(scene, True, 'PREVIEW', calc_tessface=False) + except RuntimeError: + me = None + + if me is None: + return {'CANCELLED'} + + mesh_triangulate(me) + + f = open(self.filepath, 'w') + + f.write("static const float verts[][3] = {\n") + for v in me.vertices: + f.write("\t{%.6f, %.6f, %.6f},\n" % v.co[:]) + f.write("};\n\n") + f.write("static const float normals[][3] = {\n") + for v in me.vertices: + f.write("\t{%.6f, %.6f, %.6f},\n" % v.normal[:]) + f.write("};\n\n") + f.write("static const unsigned short indices[] = {\n") + for p in me.polygons: + f.write("\t%d, %d, %d,\n" % p.vertices[:]) + f.write("};\n") + + f.write("\n") + + f.write("ManipulatorGeomInfo wm_manipulator_geom_data_%s = {\n" % ob.name) + f.write("\t.nverts = %d,\n" % len(me.vertices)) + f.write("\t.ntris = %d,\n" % len(me.polygons)) + f.write("\t.verts = verts,\n") + f.write("\t.normals = normals,\n") + f.write("\t.indices = indices,\n") + f.write("};\n") + + f.close() + + return {'FINISHED'} + +def menu_func_export(self, context): + self.layout.operator(ExportWidget.bl_idname, text="Widget (.c)") + + +def register(): + bpy.utils.register_module(__name__) + bpy.types.INFO_MT_file_export.append(menu_func_export) + + +def unregister(): + bpy.utils.unregister_module(__name__) + bpy.types.INFO_MT_file_export.remove(menu_func_export) + +if __name__ == "__main__": + register() diff --git a/release/scripts/modules/bpy_extras/keyconfig_utils.py b/release/scripts/modules/bpy_extras/keyconfig_utils.py index 3203bc41b76..a67d22076e0 100644 --- a/release/scripts/modules/bpy_extras/keyconfig_utils.py +++ b/release/scripts/modules/bpy_extras/keyconfig_utils.py @@ -19,10 +19,40 @@ # <pep8 compliant> # bpy.type.KeyMap: (km.name, km.space_type, km.region_type, [...]) +# Add (0, 0, 0, 0) as first element to skip adding "Foo (Global)" entry # ('Script', 'EMPTY', 'WINDOW', []), +# would be good to have a more generic way of doing this... +KM_WIDGETS_HIERARCHY = [ + # VIEW_3D + ('Widgets', 'EMPTY', 'WINDOW', [ + (0, 0, 0, 0), # avoid adding 'Widgets (Global)" entry + ('Face Map Widgets', 'VIEW_3D', 'WINDOW', []), + ('Lamp Widgets', 'VIEW_3D', 'WINDOW', []), + ('Force Field Widgets', 'VIEW_3D', 'WINDOW', []), + ('Camera Widgets', 'VIEW_3D', 'WINDOW', []), + ('Manipulator Widgets', 'VIEW_3D', 'WINDOW', []), + ]), + # GRAPH_EDITOR + ('Widgets', 'EMPTY', 'WINDOW', [ + (0, 0, 0, 0), + ('Backdrop Transform Widgets', 'GRAPH_EDITOR', 'WINDOW', []), + ]), + # NODE_EDITOR + ('Widgets', 'EMPTY', 'WINDOW', [ + (0, 0, 0, 0), + ('Backdrop Transform Widgets', 'NODE_EDITOR', 'WINDOW', []), + ]), + # SEQUENCE_EDITOR + ('Widgets', 'EMPTY', 'WINDOW', [ + (0, 0, 0, 0), + ('Backdrop Transform Widgets', 'SEQUENCE_EDITOR', 'WINDOW', []), + # ('Image Transform Widgets', 'SEQUENCE_EDITOR', 'WINDOW', []), + ]), +] + KM_HIERARCHY = [ ('Window', 'EMPTY', 'WINDOW', []), # file save, window change, exit ('Screen', 'EMPTY', 'WINDOW', [ # full screen, undo, screenshot @@ -55,6 +85,8 @@ KM_HIERARCHY = [ ('Particle', 'EMPTY', 'WINDOW', []), + KM_WIDGETS_HIERARCHY[0], + ('Knife Tool Modal Map', 'EMPTY', 'WINDOW', []), ('Paint Stroke Modal', 'EMPTY', 'WINDOW', []), ('Paint Curve', 'EMPTY', 'WINDOW', []), @@ -73,6 +105,7 @@ KM_HIERARCHY = [ ('Graph Editor', 'GRAPH_EDITOR', 'WINDOW', [ ('Graph Editor Generic', 'GRAPH_EDITOR', 'WINDOW', []), + KM_WIDGETS_HIERARCHY[1] ]), ('Dopesheet', 'DOPESHEET_EDITOR', 'WINDOW', [ ('Dopesheet Generic', 'DOPESHEET_EDITOR', 'WINDOW', []), @@ -94,10 +127,12 @@ KM_HIERARCHY = [ ('Node Editor', 'NODE_EDITOR', 'WINDOW', [ ('Node Generic', 'NODE_EDITOR', 'WINDOW', []), + KM_WIDGETS_HIERARCHY[2], ]), ('Sequencer', 'SEQUENCE_EDITOR', 'WINDOW', [ ('SequencerCommon', 'SEQUENCE_EDITOR', 'WINDOW', []), ('SequencerPreview', 'SEQUENCE_EDITOR', 'WINDOW', []), + KM_WIDGETS_HIERARCHY[3], ]), ('Logic Editor', 'LOGIC_EDITOR', 'WINDOW', []), diff --git a/release/scripts/modules/rna_keymap_ui.py b/release/scripts/modules/rna_keymap_ui.py index aa1aa4925a3..46a93b6a43e 100644 --- a/release/scripts/modules/rna_keymap_ui.py +++ b/release/scripts/modules/rna_keymap_ui.py @@ -64,6 +64,7 @@ def draw_entry(display_keymaps, entry, col, level=0): def draw_km(display_keymaps, kc, km, children, layout, level): + draw_global = children and children[0][0]; # first entry (0, 0, 0, 0) means we don't add "Global" entry km = km.active() layout.context_pointer_set("keymap", km) @@ -85,7 +86,7 @@ def draw_km(display_keymaps, kc, km, children, layout, level): del subrow if km.show_expanded_children: - if children: + if draw_global: # Put the Parent key map's entries in a 'global' sub-category # equal in hierarchy to the other children categories subcol = _indented_layout(col, level + 1) @@ -101,13 +102,14 @@ def draw_km(display_keymaps, kc, km, children, layout, level): for kmi in km.keymap_items: draw_kmi(display_keymaps, kc, km, kmi, col, kmi_level) - # "Add New" at end of keymap item list - subcol = _indented_layout(col, kmi_level) - subcol = subcol.split(percentage=0.2).column() - subcol.operator("wm.keyitem_add", text="Add New", text_ctxt=i18n_contexts.id_windowmanager, - icon='ZOOMIN') + if draw_global: + # "Add New" at end of keymap item list + subcol = _indented_layout(col, kmi_level) + subcol = subcol.split(percentage=0.2).column() + subcol.operator("wm.keyitem_add", text="Add New", text_ctxt=i18n_contexts.id_windowmanager, + icon='ZOOMIN') - col.separator() + col.separator() # Child key maps if children: |