BGE: merge Recast & Detour branch (sock-2010-nicks).
Add navigation mesh capability to the BGE, both by logic bricks and python. Add tools to creation navigation mesh in the creator: - manualy - automatically from existing mesh with "object.create_navmesh" operator - automatically from existing mesh with "Navigation mesh" modifier Editing navigation mesh is possible via special modifier edit mode. Creation and modification of Navigation mesh is also possible at runtime in the BGE. Documentation at http://wiki.blender.org/index.php/User:Nicks/Gsoc2010/Docs Warning: No upgrade is provided for blend files created under the branch. If you load a blend with navigation data created with a branch build, it will likely crash blender or behave incorrectly.
This commit is contained in:
@@ -379,6 +379,14 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
|
||||
col.label(text="Mirror Object:")
|
||||
col.prop(md, "mirror_object", text="")
|
||||
|
||||
def NAVMESH(self, layout, ob, md):
|
||||
split = layout.split()
|
||||
if ob.mode == 'EDIT':
|
||||
col = split.column()
|
||||
col.operator("object.assign_navpolygon", text="Assign poly idx")
|
||||
col = split.column()
|
||||
col.operator("object.assign_new_navpolygon", text="Assign new poly idx")
|
||||
|
||||
def MULTIRES(self, layout, ob, md):
|
||||
layout.row().prop(md, "subdivision_type", expand=True)
|
||||
|
||||
|
@@ -195,6 +195,31 @@ class PHYSICS_PT_game_collision_bounds(PhysicsButtonsPanel, Panel):
|
||||
row.prop(game, "collision_margin", text="Margin", slider=True)
|
||||
row.prop(game, "use_collision_compound", text="Compound")
|
||||
|
||||
class PHYSICS_PT_game_obstacles(PhysicsButtonsPanel, bpy.types.Panel):
|
||||
bl_label = "Create obstacle"
|
||||
COMPAT_ENGINES = {'BLENDER_GAME'}
|
||||
|
||||
@classmethod
|
||||
def poll(self, context):
|
||||
game = context.object.game
|
||||
rd = context.scene.render
|
||||
return (game.physics_type in ('DYNAMIC', 'RIGID_BODY', 'SENSOR', 'SOFT_BODY', 'STATIC')) and (rd.engine in cls.COMPAT_ENGINES)
|
||||
|
||||
def draw_header(self, context):
|
||||
game = context.active_object.game
|
||||
|
||||
self.layout.prop(game, "create_obstacle", text="")
|
||||
|
||||
def draw(self, context):
|
||||
layout = self.layout
|
||||
|
||||
game = context.active_object.game
|
||||
|
||||
layout.active = game.create_obstacle
|
||||
|
||||
split = layout.split()
|
||||
col = split.column()
|
||||
col.prop(game, "obstacle_radius", text="Radius")
|
||||
|
||||
class RenderButtonsPanel():
|
||||
bl_space_type = 'PROPERTIES'
|
||||
@@ -487,5 +512,19 @@ class WORLD_PT_game_physics(WorldButtonsPanel, Panel):
|
||||
col.label(text="Logic Steps:")
|
||||
col.prop(gs, "logic_step_max", text="Max")
|
||||
|
||||
class WORLD_PT_game_physics_obstacles(WorldButtonsPanel, bpy.types.Panel):
|
||||
bl_label = "Obstacle simulation"
|
||||
COMPAT_ENGINES = {'BLENDER_GAME'}
|
||||
|
||||
def draw(self, context):
|
||||
layout = self.layout
|
||||
|
||||
gs = context.scene.game_settings
|
||||
|
||||
layout.prop(gs, "obstacle_simulation", text = "Type")
|
||||
if gs.obstacle_simulation != 'None':
|
||||
layout.prop(gs, "level_height")
|
||||
layout.prop(gs, "show_obstacle_simulation")
|
||||
|
||||
if __name__ == "__main__": # only for live edit.
|
||||
bpy.utils.register_module(__name__)
|
||||
|
@@ -331,5 +331,76 @@ class ANIM_OT_keying_set_export(Operator):
|
||||
wm.fileselect_add(self)
|
||||
return {'RUNNING_MODAL'}
|
||||
|
||||
class SCENE_PT_navmesh(SceneButtonsPanel, bpy.types.Panel):
|
||||
bl_label = "Navmesh"
|
||||
bl_default_closed = True
|
||||
COMPAT_ENGINES = {'BLENDER_GAME'}
|
||||
|
||||
def draw(self, context):
|
||||
layout = self.layout
|
||||
|
||||
rd = context.scene.game_settings.recast_data
|
||||
|
||||
layout.operator("object.create_navmesh", text='Build navigation mesh')
|
||||
|
||||
layout.label(text="Rasterization:")
|
||||
split = layout.split()
|
||||
|
||||
col = split.column()
|
||||
col.prop(rd, "cell_size")
|
||||
col = split.column()
|
||||
col.prop(rd, "cell_height")
|
||||
|
||||
layout.separator()
|
||||
|
||||
layout.label(text="Agent:")
|
||||
split = layout.split()
|
||||
|
||||
col = split.column()
|
||||
row = col.row()
|
||||
row.prop(rd, "agent_height")
|
||||
row = col.row()
|
||||
row.prop(rd, "agent_radius")
|
||||
|
||||
col = split.column()
|
||||
row = col.row()
|
||||
row.prop(rd, "max_slope")
|
||||
row = col.row()
|
||||
row.prop(rd, "max_climb")
|
||||
|
||||
layout.separator()
|
||||
|
||||
layout.label(text="Region:")
|
||||
split = layout.split()
|
||||
col = split.column()
|
||||
col.prop(rd, "region_min_size")
|
||||
|
||||
col = split.column()
|
||||
col.prop(rd, "region_merge_size")
|
||||
|
||||
layout.separator()
|
||||
|
||||
layout.label(text="Polygonization:")
|
||||
split = layout.split()
|
||||
col = split.column()
|
||||
row = col.row()
|
||||
row.prop(rd, "edge_max_len")
|
||||
row = col.row()
|
||||
row.prop(rd, "edge_max_error")
|
||||
|
||||
col = split.column()
|
||||
row = col.row()
|
||||
row.prop(rd, "verts_per_poly")
|
||||
|
||||
layout.separator()
|
||||
|
||||
layout.label(text="Detail Mesh:")
|
||||
split = layout.split()
|
||||
col = split.column()
|
||||
col.prop(rd, "sample_dist")
|
||||
|
||||
col = split.column()
|
||||
col.prop(rd, "sample_max_error")
|
||||
|
||||
if __name__ == "__main__": # only for live edit.
|
||||
bpy.utils.register_module(__name__)
|
||||
|
Reference in New Issue
Block a user