Merging r49362 through r49385 from trunk into soc-2011-tomato

This commit is contained in:
Sergey Sharybin
2012-07-30 07:53:05 +00:00
6 changed files with 64 additions and 22 deletions

View File

@@ -0,0 +1,28 @@
Index: extern/bullet2/src/BulletDynamics/Character/btKinematicCharacterController.cpp
===================================================================
--- extern/bullet2/src/BulletDynamics/Character/btKinematicCharacterController.cpp (revision 49183)
+++ extern/bullet2/src/BulletDynamics/Character/btKinematicCharacterController.cpp (working copy)
@@ -77,6 +77,9 @@
if (convexResult.m_hitCollisionObject == m_me)
return btScalar(1.0);
+ if (!convexResult.m_hitCollisionObject->hasContactResponse())
+ return btScalar(1.0);
+
btVector3 hitNormalWorld;
if (normalInWorldSpace)
{
@@ -173,7 +176,12 @@
m_manifoldArray.resize(0);
btBroadphasePair* collisionPair = &m_ghostObject->getOverlappingPairCache()->getOverlappingPairArray()[i];
-
+ btCollisionObject* obj0 = static_cast<btCollisionObject*>(collisionPair->m_pProxy0->m_clientObject);
+ btCollisionObject* obj1 = static_cast<btCollisionObject*>(collisionPair->m_pProxy1->m_clientObject);
+
+ if ((obj0 && !obj0->hasContactResponse()) || (obj1 && !obj1->hasContactResponse()))
+ continue;
+
if (collisionPair->m_algorithm)
collisionPair->m_algorithm->getAllContactManifolds(m_manifoldArray);

View File

@@ -13,3 +13,7 @@ Originally committed in blender svn revision: 45908.
Apply patches/make_id.patch to prevent duplicated define of MAKE_ID macro in blender
side and bullet side.
Sergey
Apply patches/ghost_character.path to prevent characters from colliding with ghost objects.
Mitchell

View File

@@ -77,6 +77,9 @@ public:
if (convexResult.m_hitCollisionObject == m_me)
return btScalar(1.0);
if (!convexResult.m_hitCollisionObject->hasContactResponse())
return btScalar(1.0);
btVector3 hitNormalWorld;
if (normalInWorldSpace)
{
@@ -173,7 +176,12 @@ bool btKinematicCharacterController::recoverFromPenetration ( btCollisionWorld*
m_manifoldArray.resize(0);
btBroadphasePair* collisionPair = &m_ghostObject->getOverlappingPairCache()->getOverlappingPairArray()[i];
btCollisionObject* obj0 = static_cast<btCollisionObject*>(collisionPair->m_pProxy0->m_clientObject);
btCollisionObject* obj1 = static_cast<btCollisionObject*>(collisionPair->m_pProxy1->m_clientObject);
if ((obj0 && !obj0->hasContactResponse()) || (obj1 && !obj1->hasContactResponse()))
continue;
if (collisionPair->m_algorithm)
collisionPair->m_algorithm->getAllContactManifolds(m_manifoldArray);

View File

@@ -1256,7 +1256,7 @@ static IK_Scene *convert_tree(Scene *blscene, Object *ob, bPoseChannel *pchan)
ret = arm->addSegment(joint, parent, KDL::Joint::TransY, rot[ikchan->ndof - 1]);
const float ikstretch = pchan->ikstretch * pchan->ikstretch;
/* why invert twice here? */
weight[1] = (1.0 - minf(1.0 - ikstretch, 1.0f - IK_STRETCH_STIFF_EPS));
weight[1] = (1.0 - minf(1.0 - ikstretch, 1.0f - 0.001f));
weights.push_back(weight[1]);
}
if (!ret)

View File

@@ -238,6 +238,7 @@ void BL_SkinDeformer::BGEDeformVerts()
MDeformVert *dverts = m_bmesh->dvert;
bDeformGroup *dg;
int defbase_tot = BLI_countlist(&m_objMesh->defbase);
Eigen::Matrix4f pre_mat, post_mat, chan_mat, norm_chan_mat;
if (!dverts)
return;
@@ -257,15 +258,18 @@ void BL_SkinDeformer::BGEDeformVerts()
}
}
post_mat = Eigen::Matrix4f::Map((float*)m_obmat).inverse() * Eigen::Matrix4f::Map((float*)m_armobj->GetArmatureObject()->obmat);
pre_mat = post_mat.inverse();
MDeformVert *dv= dverts;
MDeformWeight *dw;
for (int i=0; i<m_bmesh->totvert; ++i, dv++)
{
float contrib = 0.f, weight, max_weight=0.f;
float contrib = 0.f, weight, max_weight=-1.f;
bPoseChannel *pchan=NULL;
Eigen::Map<Eigen::Vector3f> norm(m_transnors[i]);
Eigen::Map<Eigen::Vector3f> norm = Eigen::Vector3f::Map(m_transnors[i]);
Eigen::Vector4f vec(0, 0, 0, 1);
Eigen::Matrix4f norm_chan_mat;
Eigen::Vector4f co(m_transverts[i][0],
m_transverts[i][1],
m_transverts[i][2],
@@ -274,7 +278,9 @@ void BL_SkinDeformer::BGEDeformVerts()
if (!dv->totweight)
continue;
MDeformWeight *dw= dv->dw;
co = pre_mat * co;
dw= dv->dw;
for (unsigned int j= dv->totweight; j != 0; j--, dw++)
{
@@ -286,12 +292,10 @@ void BL_SkinDeformer::BGEDeformVerts()
if (weight)
{
Eigen::Vector4f cop(co);
Eigen::Matrix4f chan_mat = Eigen::Matrix4f::Map((float*)pchan->chan_mat);
chan_mat = Eigen::Matrix4f::Map((float*)pchan->chan_mat);
// Update Vertex Position
cop = chan_mat*cop;
vec += (cop - co)*weight;
vec.noalias() += (chan_mat*co - co)*weight;
// Save the most influential channel so we can use it to update the vertex normal
if (weight > max_weight)
@@ -304,16 +308,14 @@ void BL_SkinDeformer::BGEDeformVerts()
}
}
}
// Update Vertex Normal
norm = norm_chan_mat.topLeftCorner<3, 3>()*norm;
if (contrib > 0.0001f)
{
vec *= 1.f/contrib;
co += vec;
}
co.noalias() += vec/contrib;
co[3] = 1.f; // Make sure we have a 1 for the w component!
co = post_mat * co;
m_transverts[i][0] = co[0];
m_transverts[i][1] = co[1];

View File

@@ -784,21 +784,21 @@ else
// Handle the animations independently of the logic time step
if (GetRestrictAnimationFPS())
{
m_logger->StartLog(tc_animations, m_kxsystem->GetTimeInSeconds(), true);
double clocktime = m_kxsystem->GetTimeInSeconds();
m_logger->StartLog(tc_animations, clocktime, true);
SG_SetActiveStage(SG_STAGE_ANIMATION_UPDATE);
double anim_timestep = 1.0/KX_GetActiveScene()->GetAnimationFPS();
if (m_clockTime - m_previousAnimTime > anim_timestep)
if (clocktime - m_previousAnimTime > anim_timestep)
{
// Sanity/debug print to make sure we're actually going at the fps we want (should be close to anim_timestep)
// printf("Anim fps: %f\n", 1.0/(m_clockTime - m_previousAnimTime));
m_previousAnimTime = m_clockTime;
m_previousAnimTime = clocktime;
for (sceneit = m_scenes.begin();sceneit != m_scenes.end(); ++sceneit)
{
(*sceneit)->UpdateAnimations(m_frameTime);
(*sceneit)->UpdateAnimations(clocktime);
}
}
m_previousClockTime = m_clockTime;
}
// Start logging time spend outside main loop