Merging r49362 through r49385 from trunk into soc-2011-tomato
This commit is contained in:
28
extern/bullet2/patches/ghost_character.patch
vendored
Normal file
28
extern/bullet2/patches/ghost_character.patch
vendored
Normal 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);
|
||||
|
||||
4
extern/bullet2/readme.txt
vendored
4
extern/bullet2/readme.txt
vendored
@@ -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
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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];
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user