diff options
author | Campbell Barton <ideasman42@gmail.com> | 2009-07-20 20:21:55 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2009-07-20 20:21:55 +0400 |
commit | 33bfd7397b8b0031bd2cf46d2037a8da4ef40888 (patch) | |
tree | b956392c96cc696052ef1fc46279f02d84e6adf8 | |
parent | cc69f1301387ea920a225b6eb49283e3c03e1b06 (diff) |
BGE Button types panel, can edit existing buttons but not add new ones yet.
World Physics panel too though Im not sure if we'll eventually move this into another struct.
-rw-r--r-- | release/ui/buttons_world.py | 21 | ||||
-rw-r--r-- | release/ui/space_logic.py | 25 | ||||
-rw-r--r-- | source/blender/blenkernel/BKE_property.h | 1 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/property.c | 64 | ||||
-rw-r--r-- | source/blender/editors/space_logic/logic_buttons.c | 6 | ||||
-rw-r--r-- | source/blender/editors/space_logic/logic_window.c | 4 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_property_types.h | 7 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_object.c | 2 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_property.c | 24 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_world.c | 32 |
10 files changed, 165 insertions, 21 deletions
diff --git a/release/ui/buttons_world.py b/release/ui/buttons_world.py index 6e233f86765..0f16c847c5d 100644 --- a/release/ui/buttons_world.py +++ b/release/ui/buttons_world.py @@ -175,6 +175,26 @@ class WORLD_PT_ambient_occlusion(WorldButtonsPanel): col.row().itemR(ao, "blend_mode", expand=True) col.row().itemR(ao, "color", expand=True) col.itemR(ao, "energy") + +class WORLD_PT_game(WorldButtonsPanel): + __label__ = "Game Settings" + + def draw(self, context): + layout = self.layout + world = context.world + + flow = layout.column_flow() + flow.itemR(world, "physics_engine") + flow.itemR(world, "physics_gravity") + + flow.itemR(world, "game_fps") + flow.itemR(world, "game_logic_step_max") + flow.itemR(world, "game_physics_substep") + flow.itemR(world, "game_physics_step_max") + + flow.itemR(world, "game_use_occlusion_culling", text="Enable Occlusion Culling") + flow.itemR(world, "game_occlusion_culling_resolution") + bpy.types.register(WORLD_PT_context_world) bpy.types.register(WORLD_PT_preview) @@ -183,3 +203,4 @@ bpy.types.register(WORLD_PT_ambient_occlusion) bpy.types.register(WORLD_PT_mist) bpy.types.register(WORLD_PT_stars) bpy.types.register(WORLD_PT_color_correction) +bpy.types.register(WORLD_PT_game) diff --git a/release/ui/space_logic.py b/release/ui/space_logic.py index f862f6e2667..bb7f22c7c5e 100644 --- a/release/ui/space_logic.py +++ b/release/ui/space_logic.py @@ -75,7 +75,7 @@ class LOGIC_PT_collision_bounds(bpy.types.Panel): def draw(self, context): layout = self.layout - ob = context.scene.objects[0] + ob = context.active_object game = ob.game flow = layout.column_flow() @@ -84,5 +84,28 @@ class LOGIC_PT_collision_bounds(bpy.types.Panel): flow.itemR(game, "collision_compound") flow.itemR(game, "collision_margin") +class LOGIC_PT_properties(bpy.types.Panel): + __space_type__ = "LOGIC_EDITOR" + __region_type__ = "UI" + __label__ = "Properties" + + def poll(self, context): + ob = context.active_object + return ob and ob.game + + def draw(self, context): + layout = self.layout + + ob = context.active_object + game = ob.game + + for prop in game.properties: + flow = layout.row() + flow.itemR(prop, "name", text="") + flow.itemR(prop, "type", text="") + flow.itemR(prop, "value", text="") # we dont care about the type. rna will display correctly + flow.itemR(prop, "debug") + bpy.types.register(LOGIC_PT_physics) bpy.types.register(LOGIC_PT_collision_bounds) +bpy.types.register(LOGIC_PT_properties) diff --git a/source/blender/blenkernel/BKE_property.h b/source/blender/blenkernel/BKE_property.h index 6af1deda727..78a9ecddaac 100644 --- a/source/blender/blenkernel/BKE_property.h +++ b/source/blender/blenkernel/BKE_property.h @@ -41,6 +41,7 @@ struct bProperty *copy_property(struct bProperty *prop); void copy_properties(struct ListBase *lbn, struct ListBase *lbo); void init_property(struct bProperty *prop); struct bProperty *new_property(int type); +void unique_property(struct bProperty *first, struct bProperty *prop, int force); struct bProperty *get_ob_property(struct Object *ob, char *name); void set_ob_property(struct Object *ob, struct bProperty *propc); int compare_property(struct bProperty *prop, char *str); diff --git a/source/blender/blenkernel/intern/property.c b/source/blender/blenkernel/intern/property.c index 261b58454bd..5cae527957b 100644 --- a/source/blender/blenkernel/intern/property.c +++ b/source/blender/blenkernel/intern/property.c @@ -33,6 +33,7 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <ctype.h> #ifdef HAVE_CONFIG_H #include <config.h> @@ -99,25 +100,18 @@ void init_property(bProperty *prop) if(prop->poin && prop->poin != &prop->data) MEM_freeN(prop->poin); prop->poin= 0; - prop->otype= prop->type; prop->data= 0; switch(prop->type) { case GPROP_BOOL: - prop->poin= &prop->data; - break; case GPROP_INT: - prop->poin= &prop->data; - break; case GPROP_FLOAT: + case GPROP_TIME: prop->poin= &prop->data; break; case GPROP_STRING: prop->poin= MEM_callocN(MAX_PROPSTRING, "property string"); break; - case GPROP_TIME: - prop->poin= &prop->data; - break; } } @@ -136,6 +130,60 @@ bProperty *new_property(int type) return prop; } +/* used by unique_property() only */ +static bProperty *get_property__internal(bProperty *first, bProperty *self, const char *name) +{ + bProperty *p; + for(p= first; p; p= p->next) { + if (p!=self && (strcmp(p->name, name)==0)) + return p; + } + return NULL; +} +void unique_property(bProperty *first, bProperty *prop, int force) +{ + bProperty *p; + + /* set the first if its not set */ + if(first==NULL) { + first= prop; + while(first->prev) { + first= first->prev; + } + } + + if(force) { + /* change other names to make them unique */ + while((p = get_property__internal(first, prop, prop->name))) { + unique_property(first, p, 0); + } + }else { + /* change our own name until its unique */ + if(get_property__internal(first, prop, prop->name)) { + /* there is a collision */ + char new_name[sizeof(prop->name)]; + char base_name[sizeof(prop->name)]; + char num[sizeof(prop->name)]; + int i= 0; + + /* strip numbers */ + strcpy(base_name, prop->name); + for(i= strlen(base_name)-1; (i>=0 && isdigit(base_name[i])); i--) { + base_name[i]= '\0'; + } + i= 0; + + do { /* ensure we have enough chars for the new number in the name */ + sprintf(num, "%d", i++); + BLI_strncpy(new_name, base_name, sizeof(prop->name) - strlen(num)); + strcat(new_name, num); + } while(get_property__internal(first, prop, new_name)); + + strcpy(prop->name, new_name); + } + } +} + bProperty *get_ob_property(Object *ob, char *name) { bProperty *prop; diff --git a/source/blender/editors/space_logic/logic_buttons.c b/source/blender/editors/space_logic/logic_buttons.c index b082d5d6ae2..db6922f304c 100644 --- a/source/blender/editors/space_logic/logic_buttons.c +++ b/source/blender/editors/space_logic/logic_buttons.c @@ -66,6 +66,7 @@ #include "logic_intern.h" +#if 0 static void do_logic_panel_events(bContext *C, void *arg, int event) { @@ -96,12 +97,12 @@ static void logic_panel_view_properties(const bContext *C, Panel *pa) uiBlockSetHandleFunc(block, do_logic_panel_events, NULL); } - +#endif void logic_buttons_register(ARegionType *art) { PanelType *pt; - +#if 0 pt= MEM_callocN(sizeof(PanelType), "spacetype logic panel properties"); strcpy(pt->idname, "LOGIC_PT_properties"); strcpy(pt->label, "Logic Properties"); @@ -113,6 +114,7 @@ void logic_buttons_register(ARegionType *art) strcpy(pt->label, "View Properties"); pt->draw= logic_panel_view_properties; BLI_addtail(&art->paneltypes, pt); +#endif } diff --git a/source/blender/editors/space_logic/logic_window.c b/source/blender/editors/space_logic/logic_window.c index 55e21561c34..ab4574d5940 100644 --- a/source/blender/editors/space_logic/logic_window.c +++ b/source/blender/editors/space_logic/logic_window.c @@ -393,7 +393,7 @@ void do_logic_buts(bContext *C, void *arg, int event) BLI_addtail(&ob->prop, prop); ED_undo_push(C, "Add property"); break; - +#if 0 // XXX Now done in python case B_CHANGE_PROP: prop= ob->prop.first; while(prop) { @@ -403,7 +403,7 @@ void do_logic_buts(bContext *C, void *arg, int event) prop= prop->next; } break; - +#endif case B_ADD_SENS: for(ob=G.main->object.first; ob; ob=ob->id.next) { if(ob->scaflag & OB_ADDSENS) { diff --git a/source/blender/makesdna/DNA_property_types.h b/source/blender/makesdna/DNA_property_types.h index 7cc365a9ebc..af79b2e0a22 100644 --- a/source/blender/makesdna/DNA_property_types.h +++ b/source/blender/makesdna/DNA_property_types.h @@ -39,12 +39,9 @@ typedef struct bProperty { struct bProperty *next, *prev; char name[32]; - short type, otype; /* otype is for buttons, when a property type changes */ + short type, flag; int data; /* data should be 4 bytes to store int,float stuff */ - int old; /* old is for simul */ - short flag, pad; - void *poin; - void *oldpoin; /* oldpoin is for simul */ + void *poin; /* references data unless its a string which is malloc'd */ } bProperty; diff --git a/source/blender/makesrna/intern/rna_object.c b/source/blender/makesrna/intern/rna_object.c index 05a60f3c0f9..32a97d2c86a 100644 --- a/source/blender/makesrna/intern/rna_object.c +++ b/source/blender/makesrna/intern/rna_object.c @@ -705,7 +705,7 @@ static void rna_def_object_game_settings(BlenderRNA *brna) prop= RNA_def_property(srna, "properties", PROP_COLLECTION, PROP_NONE); RNA_def_property_collection_sdna(prop, NULL, "prop", NULL); - RNA_def_property_struct_type(prop, "GameProperty"); + RNA_def_property_struct_type(prop, "GameProperty"); /* rna_property.c */ RNA_def_property_ui_text(prop, "Properties", "Game engine properties."); prop= RNA_def_property(srna, "show_sensors", PROP_BOOLEAN, PROP_NONE); diff --git a/source/blender/makesrna/intern/rna_property.c b/source/blender/makesrna/intern/rna_property.c index a840552b86f..a1fcbac274e 100644 --- a/source/blender/makesrna/intern/rna_property.c +++ b/source/blender/makesrna/intern/rna_property.c @@ -33,6 +33,8 @@ #ifdef RNA_RUNTIME +#include "BKE_property.h" + static StructRNA* rna_GameProperty_refine(struct PointerRNA *ptr) { bProperty *property= (bProperty*)ptr->data; @@ -67,6 +69,24 @@ static void rna_GameFloatProperty_value_set(PointerRNA *ptr, float value) *(float*)(&prop->data)= value; } +static void rna_GameProperty_type_set(PointerRNA *ptr, int value) +{ + bProperty *prop= (bProperty*)(ptr->data); + + if(prop->type != value) { + prop->type= value; + init_property(prop); + } +} + +static void rna_GameProperty_name_set(PointerRNA *ptr, const char *value) +{ + bProperty *prop= (bProperty*)(ptr->data); + BLI_strncpy(prop->name, value, sizeof(prop->name)); + unique_property(NULL, prop, 1); +} + + #else void RNA_def_gameproperty(BlenderRNA *brna) @@ -89,14 +109,14 @@ void RNA_def_gameproperty(BlenderRNA *brna) RNA_def_struct_refine_func(srna, "rna_GameProperty_refine"); prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE); - RNA_def_property_clear_flag(prop, PROP_EDITABLE); /* must be unique */ RNA_def_property_ui_text(prop, "Name", "Available as as GameObject attributes in the game engines python api"); RNA_def_struct_name_property(srna, prop); + RNA_def_property_string_funcs(prop, NULL, NULL, "rna_GameProperty_name_set"); prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE); - RNA_def_property_clear_flag(prop, PROP_EDITABLE); RNA_def_property_enum_items(prop, gameproperty_type_items); RNA_def_property_ui_text(prop, "Type", ""); + RNA_def_property_enum_funcs(prop, NULL, "rna_GameProperty_type_set", NULL); prop= RNA_def_property(srna, "debug", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", PROP_DEBUG); diff --git a/source/blender/makesrna/intern/rna_world.c b/source/blender/makesrna/intern/rna_world.c index c93d18d4017..773037176de 100644 --- a/source/blender/makesrna/intern/rna_world.c +++ b/source/blender/makesrna/intern/rna_world.c @@ -422,6 +422,38 @@ void RNA_def_world(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Real Sky", "Render background with a real horizon, relative to the camera angle."); RNA_def_property_update(prop, NC_WORLD, NULL); + /* game settings */ + /* should go in a fake substruct however not sure if they move about */ + prop= RNA_def_property(srna, "game_fps", PROP_INT, PROP_NONE); + RNA_def_property_int_sdna(prop, NULL, "ticrate"); + RNA_def_property_range(prop, 1, 120); + RNA_def_property_ui_text(prop, "Frames Per Second", "The nominal number of game frames per second. Physics fixed timestep = 1/fps, independently of actual frame rate."); + + prop= RNA_def_property(srna, "game_logic_step_max", PROP_INT, PROP_NONE); + RNA_def_property_int_sdna(prop, NULL, "maxlogicstep"); + RNA_def_property_range(prop, 1, 5); + RNA_def_property_ui_text(prop, "Max Logic Steps", "The maxmimum number of logic frame per game frame if graphics slows down the game, higher value allows better synchronization with physics."); + + prop= RNA_def_property(srna, "game_physics_substep", PROP_INT, PROP_NONE); + RNA_def_property_int_sdna(prop, NULL, "physubstep"); + RNA_def_property_range(prop, 1, 5); + RNA_def_property_ui_text(prop, "Physics Sub Steps", "The maximum number of physics step per game frame if graphics slows down the game, higher value allows physics to keep up with realtime."); + + prop= RNA_def_property(srna, "game_physics_step_max", PROP_INT, PROP_NONE); + RNA_def_property_int_sdna(prop, NULL, "maxphystep"); + RNA_def_property_range(prop, 1, 5); + RNA_def_property_ui_text(prop, "Max Physics Steps", "The number of simulation substep per physic timestep, higher value give better physics precision."); + + prop= RNA_def_property(srna, "game_use_occlusion_culling", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "mode", WO_DBVT_CULLING); + RNA_def_property_ui_text(prop, "Enabled", "Use optimized Bullet DBVT tree for view frustrum and occlusion culling"); + + prop= RNA_def_property(srna, "game_occlusion_culling_resolution", PROP_INT, PROP_NONE); + RNA_def_property_int_sdna(prop, NULL, "occlusionRes"); + RNA_def_property_range(prop, 128, 1024); + RNA_def_property_ui_text(prop, "Occlusion Resolution", "The size of the occlusion buffer in pixel, use higher value for better precsion (slower)."); + + /* physics */ prop= RNA_def_property(srna, "physics_engine", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "physicsEngine"); |