BGE patch: bullet buttons UI change after discussion with Erwin: use a drop down instead of a series of buttons. Introduction of soft body option.

This commit is contained in:
2008-09-16 22:52:42 +00:00
parent 73c8d76ba4
commit 9b7d40dbae
6 changed files with 100 additions and 45 deletions

View File

@@ -960,7 +960,7 @@ Object *add_only_object(int type, char *name)
ob->anisotropicFriction[0] = 1.0f;
ob->anisotropicFriction[1] = 1.0f;
ob->anisotropicFriction[2] = 1.0f;
ob->gameflag= OB_PROP|OB_PHYSICS;
ob->gameflag= OB_PROP|OB_COLLISION;
ob->margin = 0.0;
/* NT fluid sim defaults */

View File

@@ -7794,7 +7794,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
if (main->versionfile < 247 || (main->versionfile == 247 && main->subversionfile < 2)){
Object *ob;
for(ob = main->object.first; ob; ob= ob->id.next) {
ob->gameflag |= OB_PHYSICS;
ob->gameflag |= OB_COLLISION;
ob->margin = 0.06;
}
}

View File

@@ -212,7 +212,8 @@ typedef struct Object {
short shapenr, shapeflag; /* current shape key for menu or pinned, flag for pinning */
float smoothresh; /* smoothresh is phong interpolation ray_shadow correction in render */
short recalco, pad4; /* recalco for temp storage of ob->recalc, bad design warning */
short recalco; /* recalco for temp storage of ob->recalc, bad design warning */
short body_type; /* for now used to temporarily holds the type of collision object */
struct FluidsimSettings *fluidsimSettings; /* if fluidsim enabled, store additional settings */
@@ -429,13 +430,21 @@ extern Object workob;
#define OB_PROP 16384
#define OB_MAINACTOR 32768
#define OB_PHYSICS 65536
#define OB_COLLISION 65536
#define OB_SOFT_BODY 0x20000
/* ob->gameflag2 */
#define OB_NEVER_DO_ACTIVITY_CULLING 1
#define OB_LIFE (OB_PROP|OB_DYNAMIC|OB_ACTOR|OB_MAINACTOR|OB_CHILD)
/* ob->body_type */
#define OB_BODY_TYPE_NO_COLLISION 0
#define OB_BODY_TYPE_STATIC 1
#define OB_BODY_TYPE_DYNAMIC 2
#define OB_BODY_TYPE_RIGID 3
#define OB_BODY_TYPE_SOFT 4
/* ob->scavisflag */
#define OB_VIS_SENS 1
#define OB_VIS_CONT 2

View File

@@ -3519,8 +3519,8 @@ static int Object_setRBMass( BPy_Object * self, PyObject * args )
/* this is too low level, possible to add helper methods */
#define GAMEFLAG_MASK ( OB_DYNAMIC | OB_CHILD | OB_ACTOR | OB_DO_FH | \
OB_ROT_FH | OB_ANISOTROPIC_FRICTION | OB_GHOST | OB_RIGID_BODY | \
#define GAMEFLAG_MASK ( OB_COLLISION | OB_DYNAMIC | OB_CHILD | OB_ACTOR | OB_DO_FH | \
OB_ROT_FH | OB_ANISOTROPIC_FRICTION | OB_GHOST | OB_RIGID_BODY | OB_SOFT_BODY | \
OB_BOUNDS | OB_COLLISION_RESPONSE | OB_SECTOR | OB_PROP | \
OB_MAINACTOR )
@@ -5497,6 +5497,7 @@ static PyObject *M_Object_RBFlagsDict( void )
if( M ) {
BPy_constant *d = ( BPy_constant * ) M;
PyConstant_Insert( d, "COLLISION", PyInt_FromLong( OB_COLLISION ) );
PyConstant_Insert( d, "DYNAMIC", PyInt_FromLong( OB_DYNAMIC ) );
PyConstant_Insert( d, "CHILD", PyInt_FromLong( OB_CHILD ) );
PyConstant_Insert( d, "ACTOR", PyInt_FromLong( OB_ACTOR ) );
@@ -5506,6 +5507,7 @@ static PyObject *M_Object_RBFlagsDict( void )
PyInt_FromLong( OB_ANISOTROPIC_FRICTION ) );
PyConstant_Insert( d, "GHOST", PyInt_FromLong( OB_GHOST ) );
PyConstant_Insert( d, "RIGIDBODY", PyInt_FromLong( OB_RIGID_BODY ) );
PyConstant_Insert( d, "SOFTBODY", PyInt_FromLong( OB_SOFT_BODY ) );
PyConstant_Insert( d, "BOUNDS", PyInt_FromLong( OB_BOUNDS ) );
PyConstant_Insert( d, "COLLISION_RESPONSE",
PyInt_FromLong( OB_COLLISION_RESPONSE ) );

View File

@@ -2849,10 +2849,10 @@ void buttons_enji(uiBlock *block, Object *ob)
void buttons_ketsji(uiBlock *block, Object *ob)
{
uiDefButBitI(block, TOG, OB_PHYSICS, B_REDR, "Physics",
uiDefButBitI(block, TOG, OB_COLLISION, B_REDR, "Physics",
10,205,70,19, &ob->gameflag, 0, 0, 0, 0,
"Objects that have a physics representation");
if (ob->gameflag & OB_PHYSICS) {
if (ob->gameflag & OB_COLLISION) {
uiBlockBeginAlign(block);
uiDefButBitI(block, TOG, OB_ACTOR, B_REDR, "Actor",
80,205,55,19, &ob->gameflag, 0, 0, 0, 0,
@@ -2933,46 +2933,90 @@ void buttons_ketsji(uiBlock *block, Object *ob)
}
}
static void check_actor(void *arg1_but, void *arg2_object)
{
int *gameflag = arg2_object;
/* force enabled ACTOR for body >= dynamic */
if (*gameflag & OB_DYNAMIC)
*gameflag |= OB_ACTOR;
}
static void check_body_type(void *arg1_but, void *arg2_object)
{
Object *ob = arg2_object;
switch (ob->body_type) {
case OB_BODY_TYPE_NO_COLLISION:
ob->gameflag &= ~OB_COLLISION;
break;
case OB_BODY_TYPE_STATIC:
ob->gameflag |= OB_COLLISION;
ob->gameflag &= ~(OB_DYNAMIC|OB_RIGID_BODY|OB_SOFT_BODY);
break;
case OB_BODY_TYPE_DYNAMIC:
ob->gameflag |= OB_COLLISION|OB_DYNAMIC|OB_ACTOR;
ob->gameflag &= ~(OB_RIGID_BODY|OB_SOFT_BODY);
break;
case OB_BODY_TYPE_RIGID:
ob->gameflag |= OB_COLLISION|OB_DYNAMIC|OB_RIGID_BODY|OB_ACTOR;
ob->gameflag &= ~(OB_SOFT_BODY);
break;
default:
case OB_BODY_TYPE_SOFT:
ob->gameflag |= OB_COLLISION|OB_DYNAMIC|OB_SOFT_BODY|OB_ACTOR;
ob->gameflag &= ~(OB_RIGID_BODY);
break;
}
}
void buttons_bullet(uiBlock *block, Object *ob)
{
uiDefButBitI(block, TOG, OB_PHYSICS, B_REDR, "Physics",
10,205,70,19, &ob->gameflag, 0, 0, 0, 0,
"Objects that have a physics representation");
if (ob->gameflag & OB_PHYSICS) {
uiBlockBeginAlign(block);
uiDefButBitI(block, TOG, OB_ACTOR, B_REDR, "Actor",
80,205,55,19, &ob->gameflag, 0, 0, 0, 0,
uiBut *but;
/* determine the body_type setting based on flags */
if (!(ob->gameflag & OB_COLLISION))
ob->body_type = OB_BODY_TYPE_NO_COLLISION;
else if (!(ob->gameflag & OB_DYNAMIC) || !(ob->gameflag & OB_DYNAMIC))
ob->body_type = OB_BODY_TYPE_STATIC;
else if (!(ob->gameflag & (OB_RIGID_BODY|OB_SOFT_BODY)))
ob->body_type = OB_BODY_TYPE_DYNAMIC;
else if (ob->gameflag & OB_RIGID_BODY)
ob->body_type = OB_BODY_TYPE_RIGID;
else
ob->body_type = OB_BODY_TYPE_SOFT;
uiBlockBeginAlign(block);
but = uiDefButS(block, MENU, REDRAWVIEW3D,
"Object type%t|No collision%x0|Static%x1|Dynamic%x2|Rigid body%x3|Soft body%x4",
10, 205, 150, 19, &ob->body_type, 0, 0, 0, 0, "Selects the type of physical representation of the object");
uiButSetFunc(but, check_body_type, but, ob);
if (ob->gameflag & OB_COLLISION) {
but = uiDefButBitI(block, TOG, OB_ACTOR, B_REDR, "Actor",
160,205,55,19, &ob->gameflag, 0, 0, 0, 0,
"Objects that are detected by the Near and Radar sensor");
if(ob->gameflag & OB_ACTOR) {
uiDefButBitI(block, TOG, OB_GHOST, B_REDR, "Ghost", 135,205,55,19,
&ob->gameflag, 0, 0, 0, 0,
"Objects that don't restitute collisions (like a ghost)");
uiDefButBitI(block, TOG, OB_DYNAMIC, B_REDR, "Dynamic", 190,205,75,19,
&ob->gameflag, 0, 0, 0, 0,
"Motion defined by laws of physics");
uiButSetFunc(but, check_actor, but, &ob->gameflag);
if(ob->gameflag & OB_DYNAMIC) {
uiDefButBitI(block, TOG, OB_RIGID_BODY, B_REDR, "Rigid Body", 265,205,85,19,
&ob->gameflag, 0, 0, 0, 0,
"Enable rolling physics");
uiDefButBitI(block, TOG, OB_GHOST, B_REDR, "Ghost", 215,205,55,19,
&ob->gameflag, 0, 0, 0, 0,
"Objects that don't restitute collisions (like a ghost)");
if(ob->gameflag & OB_DYNAMIC) {
uiDefButBitI(block, TOG, OB_COLLISION_RESPONSE, B_REDR, "No sleeping", 270,205,80,19,
&ob->gameflag, 0, 0, 0, 0,
"Disable auto (de)activation");
uiDefButF(block, NUM, B_DIFF, "Mass:", 10, 185, 170, 19,
&ob->mass, 0.01, 10000.0, 10, 2,
"The mass of the Object");
uiDefButF(block, NUM, REDRAWVIEW3D, "Radius:", 180, 185, 170, 19,
&ob->inertia, 0.01, 10.0, 10, 2,
"Bounding sphere radius, not used for other bounding shapes");
uiDefButF(block, NUM, B_DIFF, "Mass:", 10, 185, 130, 19,
&ob->mass, 0.01, 10000.0, 10, 2,
"The mass of the Object");
uiDefButF(block, NUM, REDRAWVIEW3D, "Radius:", 140, 185, 130, 19,
&ob->inertia, 0.01, 10.0, 10, 2,
"Bounding sphere radius, not used for other bounding shapes");
uiDefButBitI(block, TOG, OB_COLLISION_RESPONSE, B_REDR, "No sleeping", 270,185,80,19,
&ob->gameflag, 0, 0, 0, 0,
"Disable auto (de)activation");
uiDefButF(block, NUMSLI, B_DIFF, "Damp ", 10, 165, 150, 19,
&ob->damping, 0.0, 1.0, 10, 0,
"General movement damping");
uiDefButF(block, NUMSLI, B_DIFF, "RotDamp ", 160, 165, 190, 19,
&ob->rdamping, 0.0, 1.0, 10, 0,
"General rotation damping");
}
uiDefButF(block, NUMSLI, B_DIFF, "Damp ", 10, 165, 150, 19,
&ob->damping, 0.0, 1.0, 10, 0,
"General movement damping");
uiDefButF(block, NUMSLI, B_DIFF, "RotDamp ", 160, 165, 190, 19,
&ob->rdamping, 0.0, 1.0, 10, 0,
"General rotation damping");
}
uiBlockEndAlign(block);
@@ -2999,8 +3043,8 @@ void buttons_bullet(uiBlock *block, Object *ob)
&ob->gameflag, 0, 0, 0, 0,
"Add Children");
}
uiBlockEndAlign(block);
}
uiBlockEndAlign(block);
}
static void check_controller_state_mask(void *arg1_but, void *arg2_mask)

View File

@@ -1280,7 +1280,7 @@ void BL_CreatePhysicsObjectNew(KX_GameObject* gameobj,
//bool bRigidBody = (userigidbody == 0);
// object has physics representation?
if (!(blenderobject->gameflag & OB_PHYSICS))
if (!(blenderobject->gameflag & OB_COLLISION))
return;
// get Root Parent of blenderobject