Skip to content
Snippets Groups Projects
Select Git revision
  • e190317fbbbebbd3d52580481f5e37758ea32bb4
  • master default protected
  • main
  • test-refactor-server-json
  • blender-v4.1-release
  • blender-v4.0-release
  • blender-v3.6-release
  • blender-v3.3-release
  • blender-v2.93-release
  • blender-v3.5-release
  • blender-v3.1-release
  • blender-v3.0-release
  • blender-v3.4-release
  • blender-v3.2-release
  • studio-sprite-fright
  • blender-v2.92-release
  • blender-v2.91-release
  • greasepencil-addon
  • blender-v2.90-release
  • blender-v2.83-release
  • blender-v2.82-release
  • v3.6.9
  • v3.3.16
  • v4.1.0
  • v4.1.1
  • v3.6.8
  • v3.3.15
  • v3.6.7
  • v3.3.14
  • v4.0.2
  • v4.0.1
  • v4.0.0
  • v3.6.5
  • v3.3.12
  • v3.6.4
  • v3.6.3
  • v3.3.11
  • v3.6.2
  • v3.3.10
  • v3.6.1
  • v3.3.9
41 results

space_view3d_game_props_visualiser.py

Blame
  • space_view3d_game_props_visualiser.py 6.27 KiB
    # ##### BEGIN GPL LICENSE BLOCK #####
    #
    #  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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
    #
    # ##### END GPL LICENSE BLOCK #####
    
    # <pep8 compliant>
    
    
    bl_addon_info = {
        'name': '3D View: Game Property Visualiser',
        'author': 'Bartius Crouch/Vilem Novak',
        'version': '2.4 2010/06/07',
        'blender': (2, 5, 3),
        'category': '3D View',
        'location': 'View3D > properties panel > display tab',
        'description': 'Display the game properties next to selected objects '\
            'in the 3d-view',
        'wiki_url': 'http://wiki.blender.org/index.php/Extensions:2.5/Py/'\
            'Scripts/Index_Visualiser',
        'tracker_url': 'http://projects.blender.org/tracker/index.php?'\
            'func=detail&aid=21557&group_id=153&atid=468',
        'doc': """\
    Displays game properties next to selected objects(under name)
    
    -how to use:
        just toggle the button 'Visualise game props' in the right side panel
    """}
    
    
    import bgl
    import blf
    import bpy
    import mathutils
    
    
    # calculate locations and store them as ID property in the mesh
    def calc_callback(self, context):
        # polling
        if context.mode == 'EDIT_MESH':
            return
        
        # get screen information
        mid_x = context.region.width/2.0
        mid_y = context.region.height/2.0
        width = context.region.width
        height = context.region.height
        
        # get matrices
        view_mat = context.space_data.region_3d.perspective_matrix
    
        ob_mat = context.active_object.matrix
        total_mat = view_mat*ob_mat
        
        # calculate location info
        texts = []
        
        # uncomment 2 lines below, to enable live updating of the selection
        #ob=context.active_object
        for ob in context.selected_objects:
            locs = []
            ob_mat = ob.matrix
            total_mat = view_mat*ob_mat
     
            for p in ob.game.properties:
              d=0.0#{'data':p.name+':'+str(p.value)}
             #print (d)
              locs.append([ mathutils.Vector([0,0,0]).resize4D()])
        
        
            for loc in locs:
        
                vec = total_mat*loc[0] # order is important
                # dehomogenise
                vec = mathutils.Vector((vec[0]/vec[3],vec[1]/vec[3],vec[2]/vec[3]))
                x = int(mid_x + vec[0]*width/2.0)
                y = int(mid_y + vec[1]*height/2.0)
                texts+=[x, y]
            
    
        # store as ID property in mesh
        #print (texts)
        context.scene['GamePropsVisualiser'] = texts
    
    
    # draw in 3d-view
    def draw_callback(self, context):
        # polling
        if context.mode == 'EDIT_MESH':
            return
        # retrieving ID property data
        try:
            #print(context.scene['GamePropsVisualiser'])
            texts = context.scene['GamePropsVisualiser']
            
        except:
            return
        if not texts:
            return
        
        # draw
        i=0
    
        blf.size(0, 12, 72)
       
            
        bgl.glColor3f(1.0,1.0,1.0)
        for ob in bpy.context.selected_objects:
            for pi,p in enumerate(ob.game.properties):
                blf.position(0, texts[i], texts[i+1]-(pi+1)*14, 0)
                if p.type=='FLOAT':
                    t=p.name+':  '+ str('%g'% p.value)
                else:    
                    t=p.name+':  '+ str(p.value)
                blf.draw(0, t)
                i+=2
    
    
    # operator
    class GamePropertyVisualiser(bpy.types.Operator):
        bl_idname = "view3d.game_props_visualiser"
        bl_label = "Game Properties Visualiser"
        bl_description = "Toggle the visualisation of game properties"
        
       
        def poll(self, context):
            return context.mode!='EDIT_MESH'
        
        def modal(self, context, event):
            context.area.tag_redraw()
    
            # removal of callbacks when operator is called again
            #print(context.scene.display_game_properties)
            if context.scene.display_game_properties == -1:
               # print('deinit2')
    
                context.scene.display_game_properties = 0
                context.region.callback_remove(self.handle1)
                context.region.callback_remove(self.handle2)
                context.scene.display_game_properties = 0
                
                return {'FINISHED'}
            
            return {'PASS_THROUGH'}
        
        def invoke(self, context, event):
            if context.area.type == 'VIEW_3D':
                print(context.scene.display_game_properties)
                if context.scene.display_game_properties == 0 or context.scene.display_game_properties == -1:
                    print('init')
                    # operator is called for the first time, start everything
                    context.scene.display_game_properties = 1
                    context.manager.add_modal_handler(self)
                    self.handle1 = context.region.callback_add(calc_callback,
                        (self, context), 'POST_VIEW')
                    self.handle2 = context.region.callback_add(draw_callback,
                        (self, context), 'POST_PIXEL')
                    return {'RUNNING_MODAL'}
                else:
                    # operator is called again, stop displaying
                    context.scene.display_game_properties = -1
                    #print(dir(self))
                    #
                    return {'RUNNING_MODAL'}
            else:
                self.report({'WARNING'}, "View3D not found, can't run operator")
                return {'CANCELLED'}
    
    
    # defining the panel
    def menu_func(self, context):
        
        sce=context.scene
        sce.IntProperty(name = 'visualise game properties' ,attr="display_game_properties", default=0)
    
        col = self.layout.column(align=True)
        col.operator(GamePropertyVisualiser.bl_idname, text="Visualise game props")
        self.layout.separator()
    
    
    def register():
        bpy.types.register(GamePropertyVisualiser)
        bpy.types.VIEW3D_PT_view3d_display.prepend(menu_func)
    
    
    def unregister():
        bpy.types.unregister(GamePropertyVisualiser)
        bpy.types.VIEW3D_PT_view3d_display.remove(menu_func)
    
    
    if __name__ == "__main__":
        register()