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:
-rw-r--r--release/ui/buttons_world.py21
-rw-r--r--release/ui/space_logic.py25
-rw-r--r--source/blender/blenkernel/BKE_property.h1
-rw-r--r--source/blender/blenkernel/intern/property.c64
-rw-r--r--source/blender/editors/space_logic/logic_buttons.c6
-rw-r--r--source/blender/editors/space_logic/logic_window.c4
-rw-r--r--source/blender/makesdna/DNA_property_types.h7
-rw-r--r--source/blender/makesrna/intern/rna_object.c2
-rw-r--r--source/blender/makesrna/intern/rna_property.c24
-rw-r--r--source/blender/makesrna/intern/rna_world.c32
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");