diff options
author | Benoit Bolsee <benoit.bolsee@online.be> | 2008-09-28 01:52:20 +0400 |
---|---|---|
committer | Benoit Bolsee <benoit.bolsee@online.be> | 2008-09-28 01:52:20 +0400 |
commit | c723b91446a04a953ed4ec761310c2f5c675268f (patch) | |
tree | 84c7358fc73ccac9e5d801641bed5ef152271c22 /source | |
parent | 5f7359a4ad712e91a012fe7331f2df33b7031375 (diff) |
BGE patch: create new BulletSoftBody data block to store bullet soft body specific parameters.
Previously we tried to share the parameters with the
blender render soft body but there were too many differences.
MSVC project files updated.
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenkernel/BKE_bullet.h | 43 | ||||
-rw-r--r-- | source/blender/blenkernel/BKE_object.h | 3 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/bullet.c | 62 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/object.c | 21 | ||||
-rw-r--r-- | source/blender/blenloader/intern/readfile.c | 2 | ||||
-rw-r--r-- | source/blender/blenloader/intern/writefile.c | 1 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_object_force.h | 10 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_object_types.h | 4 | ||||
-rw-r--r-- | source/blender/src/buttons_logic.c | 38 | ||||
-rw-r--r-- | source/blender/src/editobject.c | 6 | ||||
-rw-r--r-- | source/gameengine/Converter/BL_BlenderDataConversion.cpp | 18 |
11 files changed, 170 insertions, 38 deletions
diff --git a/source/blender/blenkernel/BKE_bullet.h b/source/blender/blenkernel/BKE_bullet.h new file mode 100644 index 00000000000..1c3bb175d66 --- /dev/null +++ b/source/blender/blenkernel/BKE_bullet.h @@ -0,0 +1,43 @@ +/** + * + * $Id$ + * + * ***** 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) Blender Foundation. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): none yet. + * + * ***** END GPL LICENSE BLOCK ***** + */ +#ifndef BKE_BULLET_H +#define BKE_BULLET_H + +struct BulletSoftBody; + + +/* allocates and initializes general main data */ +extern struct BulletSoftBody *bsbNew(void); + +/* frees internal data and softbody itself */ +extern void bsbFree(struct BulletSoftBody *sb); + +#endif + diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h index 116a59fa97e..ab76fc922ea 100644 --- a/source/blender/blenkernel/BKE_object.h +++ b/source/blender/blenkernel/BKE_object.h @@ -41,6 +41,7 @@ struct Camera; struct BoundBox; struct View3D; struct SoftBody; +struct BulletSoftBody; struct Group; struct bAction; @@ -48,10 +49,12 @@ void clear_workob(void); void copy_baseflags(void); void copy_objectflags(void); struct SoftBody *copy_softbody(struct SoftBody *sb); +struct BulletSoftBody *copy_bulletsoftbody(struct BulletSoftBody *sb); void copy_object_particlesystems(struct Object *obn, struct Object *ob); void copy_object_softbody(struct Object *obn, struct Object *ob); void object_free_particlesystems(struct Object *ob); void object_free_softbody(struct Object *ob); +void object_free_bulletsoftbody(struct Object *ob); void update_base_layer(struct Object *ob); void free_object(struct Object *ob); diff --git a/source/blender/blenkernel/intern/bullet.c b/source/blender/blenkernel/intern/bullet.c new file mode 100644 index 00000000000..8e075669819 --- /dev/null +++ b/source/blender/blenkernel/intern/bullet.c @@ -0,0 +1,62 @@ +/* + * + * $Id$ + * + * ***** 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) Blender Foundation + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): none yet. + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#include "MEM_guardedalloc.h" + +/* types */ +#include "DNA_object_force.h" /* here is the softbody struct */ + +#include "BKE_bullet.h" + + +/* ************ Object level, exported functions *************** */ + +/* allocates and initializes general main data */ +BulletSoftBody *bsbNew(void) +{ + BulletSoftBody *bsb; + + bsb= MEM_callocN(sizeof(BulletSoftBody), "bulletsoftbody"); + + bsb->flag = OB_BSB_SHAPE_MATCHING; + bsb->linStiff = 0.5f; + bsb->angStiff = 1.0f; + bsb->volume = 1.0f; + return bsb; +} + +/* frees all */ +void bsbFree(BulletSoftBody *bsb) +{ + /* no internal data yet */ + MEM_freeN(bsb); +} + + diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c index 7b53d770861..2dfa849fc43 100644 --- a/source/blender/blenkernel/intern/object.c +++ b/source/blender/blenkernel/intern/object.c @@ -179,6 +179,14 @@ void object_free_softbody(Object *ob) } } +void object_free_bulletsoftbody(Object *ob) +{ + if(ob->bsoft) { + sbFree(ob->bsoft); + ob->bsoft= NULL; + } +} + void object_free_modifiers(Object *ob) { while (ob->modifiers.first) { @@ -269,6 +277,7 @@ void free_object(Object *ob) MEM_freeN(ob->pd); } if(ob->soft) sbFree(ob->soft); + if(ob->bsoft) bsbFree(ob->bsoft); if(ob->gpulamp.first) GPU_lamp_free(ob); } @@ -1047,6 +1056,17 @@ SoftBody *copy_softbody(SoftBody *sb) return sbn; } +BulletSoftBody *copy_bulletsoftbody(BulletSoftBody *bsb) +{ + BulletSoftBody *bsbn; + + if (bsb == NULL) + return NULL; + bsbn = MEM_dupallocN(bsb); + /* no pointer in this structure yet */ + return bsbn; +} + ParticleSystem *copy_particlesystem(ParticleSystem *psys) { ParticleSystem *psysn; @@ -1217,6 +1237,7 @@ Object *copy_object(Object *ob) id_us_plus(&(obn->pd->tex->id)); } obn->soft= copy_softbody(ob->soft); + obn->bsoft = copy_bulletsoftbody(ob->bsoft); copy_object_particlesystems(obn, ob); diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 5692627281d..0999c8b0ce3 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -141,6 +141,7 @@ #include "BKE_sca.h" // for init_actuator #include "BKE_scene.h" #include "BKE_softbody.h" // sbNew() +#include "BKE_bullet.h" // bsbNew() #include "BKE_sculpt.h" #include "BKE_texture.h" // for open_plugin_tex #include "BKE_utildefines.h" // SWITCH_INT DATA ENDB DNA1 O_BINARY GLOB USER TEST REND @@ -3334,6 +3335,7 @@ static void direct_link_object(FileData *fd, Object *ob) if(sb->pointcache) direct_link_pointcache(fd, sb->pointcache); } + ob->bsoft= newdataadr(fd, ob->bsoft); ob->fluidsimSettings= newdataadr(fd, ob->fluidsimSettings); /* NT */ link_list(fd, &ob->particlesystem); diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c index e53c725867a..9ca9a3d9287 100644 --- a/source/blender/blenloader/intern/writefile.c +++ b/source/blender/blenloader/intern/writefile.c @@ -922,6 +922,7 @@ static void write_objects(WriteData *wd, ListBase *idbase) writestruct(wd, DATA, "PartDeflect", 1, ob->pd); writestruct(wd, DATA, "SoftBody", 1, ob->soft); if(ob->soft) writestruct(wd, DATA, "PointCache", 1, ob->soft->pointcache); + writestruct(wd, DATA, "BulletSoftBody", 1, ob->bsoft); write_particlesystems(wd, &ob->particlesystem); write_modifiers(wd, &ob->modifiers); diff --git a/source/blender/makesdna/DNA_object_force.h b/source/blender/makesdna/DNA_object_force.h index 5900e16d5e8..081b83c3d02 100644 --- a/source/blender/makesdna/DNA_object_force.h +++ b/source/blender/makesdna/DNA_object_force.h @@ -84,6 +84,16 @@ typedef struct SBVertex { float vec[4]; } SBVertex; +typedef struct BulletSoftBody { + int flag; /* various boolean options */ + float linStiff; /* linear stiffness 0..1 */ + float angStiff; /* angular stiffness 0..1 */ + float volume; /* volume preservation 0..1 */ +} BulletSoftBody; + +/* BulletSoftBody.flag */ +#define OB_BSB_SHAPE_MATCHING 2 + typedef struct SoftBody { struct ParticleSystem *particles; /* particlesystem softbody */ diff --git a/source/blender/makesdna/DNA_object_types.h b/source/blender/makesdna/DNA_object_types.h index c12da6b0194..fad5c020727 100644 --- a/source/blender/makesdna/DNA_object_types.h +++ b/source/blender/makesdna/DNA_object_types.h @@ -193,7 +193,9 @@ typedef struct Object { * bit 15: Always ignore activity culling */ int gameflag2; - short softflag; /* softboday settings */ + struct BulletSoftBody *bsoft; /* settings for game engine bullet soft body */ + + short softflag; /* softbody settings */ short recalc; /* dependency flag */ float anisotropicFriction[3]; diff --git a/source/blender/src/buttons_logic.c b/source/blender/src/buttons_logic.c index db3081070be..cec04910de5 100644 --- a/source/blender/src/buttons_logic.c +++ b/source/blender/src/buttons_logic.c @@ -67,6 +67,7 @@ #include "BKE_property.h" #include "BKE_property.h" #include "BKE_utildefines.h" +#include "BKE_bullet.h" #include "BIF_gl.h" #include "BIF_resources.h" @@ -3007,28 +3008,27 @@ static uiBlock *advanced_bullet_menu(void *arg_ob) "Collision margin"); } if (ob->gameflag & OB_SOFT_BODY) { - if (ob->soft) + /* create a BulletSoftBody structure if not already existing */ + if (!ob->bsoft) + ob->bsoft = bsbNew(); + if (ob->bsoft) { - - uiDefButBitS(block, TOG, OB_SB_GOAL, 0, "Shape matching", - xco+=120, yco, 118, 19, &ob->softflag, 0, 0, 0, 0, + uiDefButBitI(block, TOG, OB_BSB_SHAPE_MATCHING, 0, "Shape matching", + xco+=120, yco, 118, 19, &ob->bsoft->flag, 0, 0, 0, 0, "Enable soft body shape matching goal"); yco -= 25; xco = 0; uiDefButF(block, NUMSLI, 0, "LinStiff ", xco, yco, 238, 19, - &ob->soft->inspring, 0.0, 1.0, 1, 0, + &ob->bsoft->linStiff, 0.0, 1.0, 1, 0, "Linear stiffness of the soft body vertex spring"); - /* yco -= 25; uiDefButF(block, NUMSLI, 0, "AngStiff ", xco, yco, 238, 19, - &ob->angularStiffness, 0.0, 1.0, 1, 0, + &ob->bsoft->angStiff, 0.0, 1.0, 1, 0, "Angular stiffness of the soft body vertex spring"); yco -= 25; uiDefButF(block, NUMSLI, 0, "Volume ", xco, yco, 238, 19, - &ob->volumePreservation, 0.0, 1.0, 1, 0, + &ob->bsoft->volume, 0.0, 1.0, 1, 0, "Factor of soft body volume preservation"); - */ - } } @@ -3056,20 +3056,10 @@ void buttons_bullet(uiBlock *block, Object *ob) ob->body_type = OB_BODY_TYPE_SOFT; //only enable game soft body if Blender Soft Body exists - if (ob->soft) - { - but = uiDefButS(block, MENU, REDRAWVIEW3D, - "Object type%t|No collision%x0|Static%x1|Dynamic%x2|Rigid body%x3|Soft body%x4", - 10, 205, 120, 19, &ob->body_type, 0, 0, 0, 0, "Selects the type of physical representation"); - uiButSetFunc(but, check_body_type, but, ob); - } else - { - but = uiDefButS(block, MENU, REDRAWVIEW3D, - "Object type%t|No collision%x0|Static%x1|Dynamic%x2|Rigid body%x3", - 10, 205, 120, 19, &ob->body_type, 0, 0, 0, 0, "Selects the type of physical representation"); - uiButSetFunc(but, check_body_type, but, ob); - } - + but = uiDefButS(block, MENU, REDRAWVIEW3D, + "Object type%t|No collision%x0|Static%x1|Dynamic%x2|Rigid body%x3|Soft body%x4", + 10, 205, 120, 19, &ob->body_type, 0, 0, 0, 0, "Selects the type of physical representation"); + uiButSetFunc(but, check_body_type, but, ob); if (ob->gameflag & OB_COLLISION) { diff --git a/source/blender/src/editobject.c b/source/blender/src/editobject.c index 6f926f7396e..370f116d318 100644 --- a/source/blender/src/editobject.c +++ b/source/blender/src/editobject.c @@ -3529,10 +3529,8 @@ void copy_attr(short event) base->object->boundtype = ob->boundtype; } base->object->margin= ob->margin; - //base->object->linearStiffness= ob->linearStiffness; - //base->object->angularStiffness= ob->angularStiffness; - //base->object->volumePreservation= ob->volumePreservation; - //base->object->gamesoftFlag= ob->gamesoftFlag; + base->object->bsoft= copy_bulletsoftbody(ob->bsoft); + } else if(event==17) { /* tex space */ copy_texture_space(base->object, ob); diff --git a/source/gameengine/Converter/BL_BlenderDataConversion.cpp b/source/gameengine/Converter/BL_BlenderDataConversion.cpp index 5b72a10cd0d..784a103f3e3 100644 --- a/source/gameengine/Converter/BL_BlenderDataConversion.cpp +++ b/source/gameengine/Converter/BL_BlenderDataConversion.cpp @@ -1324,19 +1324,19 @@ void BL_CreatePhysicsObjectNew(KX_GameObject* gameobj, objprop.m_angular_rigidbody = (blenderobject->gameflag & OB_RIGID_BODY) != 0; ///for game soft bodies - if (blenderobject->soft) + if (blenderobject->bsoft) { - objprop.m_linearStiffness = blenderobject->soft->inspring; - objprop.m_angularStiffness = 1.f;//blenderobject->angularStiffness; - objprop.m_volumePreservation = 1.f;//blenderobject->volumePreservation; - objprop.m_gamesoftFlag = blenderobject->softflag;//blenderobject->gamesoftFlag; + objprop.m_linearStiffness = blenderobject->bsoft->linStiff; + objprop.m_angularStiffness = blenderobject->bsoft->angStiff; + objprop.m_volumePreservation = blenderobject->bsoft->volume; + objprop.m_gamesoftFlag = blenderobject->bsoft->flag; } else { - objprop.m_linearStiffness = 0.5;//blenderobject->linearStiffness; - objprop.m_angularStiffness = 1.f;//blenderobject->angularStiffness; - objprop.m_volumePreservation = 1.f;//blenderobject->volumePreservation; - objprop.m_gamesoftFlag = 1;//blenderobject->gamesoftFlag; + objprop.m_linearStiffness = 0.5;//blenderobject->bsoft->linStiff; + objprop.m_angularStiffness = 1.f;//blenderobject->bsoft->angStiff; + objprop.m_volumePreservation = 1.f;//blenderobject->bsoft->volume; + objprop.m_gamesoftFlag = 1;//blenderobject->bsoft->flag; } objprop.m_ghost = (blenderobject->gameflag & OB_GHOST) != 0; |