avoid wavefront obj texture index out-of-bounds (most obj out-of-bounds are not checked)

use second controller button
This commit is contained in:
erwin coumans
2016-10-04 08:53:59 -07:00
parent a287227384
commit d6f449762b
3 changed files with 62 additions and 16 deletions

View File

@@ -33,6 +33,10 @@ GLInstanceGraphicsShape* btgCreateGraphicsShapeFromWavefrontObj(std::vector<tiny
int vtxBaseIndex = vertices->size(); int vtxBaseIndex = vertices->size();
if (f<0 && f>=shape.mesh.indices.size())
{
continue;
}
GLInstanceVertex vtx0; GLInstanceVertex vtx0;
vtx0.xyzw[0] = shape.mesh.positions[shape.mesh.indices[f]*3+0]; vtx0.xyzw[0] = shape.mesh.positions[shape.mesh.indices[f]*3+0];
@@ -40,10 +44,22 @@ GLInstanceGraphicsShape* btgCreateGraphicsShapeFromWavefrontObj(std::vector<tiny
vtx0.xyzw[2] = shape.mesh.positions[shape.mesh.indices[f]*3+2]; vtx0.xyzw[2] = shape.mesh.positions[shape.mesh.indices[f]*3+2];
vtx0.xyzw[3] = 0.f; vtx0.xyzw[3] = 0.f;
if (shape.mesh.texcoords.size())
if (shape.mesh.texcoords.size() )
{ {
vtx0.uv[0] = shape.mesh.texcoords[shape.mesh.indices[f]*2+0]; int uv0Index = shape.mesh.indices[f]*2+0;
vtx0.uv[1] = shape.mesh.texcoords[shape.mesh.indices[f]*2+1]; int uv1Index = shape.mesh.indices[f]*2+1;
if (uv0Index>=0 && uv1Index>=0 && (uv0Index < shape.mesh.texcoords.size()) && (uv1Index < shape.mesh.texcoords.size()))
{
vtx0.uv[0] = shape.mesh.texcoords[uv0Index];
vtx0.uv[1] = shape.mesh.texcoords[uv1Index];
} else
{
b3Warning("obj texture coordinate out-of-range!");
vtx0.uv[0] = 0;
vtx0.uv[1] = 0;
}
} else } else
{ {
vtx0.uv[0] = 0.5; vtx0.uv[0] = 0.5;
@@ -58,8 +74,18 @@ GLInstanceGraphicsShape* btgCreateGraphicsShapeFromWavefrontObj(std::vector<tiny
if (shape.mesh.texcoords.size()) if (shape.mesh.texcoords.size())
{ {
vtx1.uv[0] = shape.mesh.texcoords[shape.mesh.indices[f+1]*2+0]; int uv0Index = shape.mesh.indices[f+1]*2+0;
vtx1.uv[1] = shape.mesh.texcoords[shape.mesh.indices[f+1]*2+1]; int uv1Index = shape.mesh.indices[f+1]*2+1;
if (uv0Index>=0 && uv1Index>=0 && (uv0Index < shape.mesh.texcoords.size()) && (uv1Index < shape.mesh.texcoords.size()))
{
vtx1.uv[0] = shape.mesh.texcoords[uv0Index];
vtx1.uv[1] = shape.mesh.texcoords[uv1Index];
} else
{
b3Warning("obj texture coordinate out-of-range!");
vtx1.uv[0] = 0;
vtx1.uv[1] = 0;
}
} else } else
{ {
vtx1.uv[0] = 0.5f; vtx1.uv[0] = 0.5f;
@@ -73,8 +99,18 @@ GLInstanceGraphicsShape* btgCreateGraphicsShapeFromWavefrontObj(std::vector<tiny
vtx2.xyzw[3] = 0.f; vtx2.xyzw[3] = 0.f;
if (shape.mesh.texcoords.size()) if (shape.mesh.texcoords.size())
{ {
vtx2.uv[0] = shape.mesh.texcoords[shape.mesh.indices[f+2]*2+0]; int uv0Index = shape.mesh.indices[f+2]*2+0;
vtx2.uv[1] = shape.mesh.texcoords[shape.mesh.indices[f+2]*2+1]; int uv1Index = shape.mesh.indices[f+2]*2+1;
if (uv0Index>=0 && uv1Index>=0 && (uv0Index < shape.mesh.texcoords.size()) && (uv1Index < shape.mesh.texcoords.size()))
{
vtx2.uv[0] = shape.mesh.texcoords[uv0Index];
vtx2.uv[1] = shape.mesh.texcoords[uv1Index];
} else
{
b3Warning("obj texture coordinate out-of-range!");
vtx2.uv[0] = 0;
vtx2.uv[1] = 0;
}
} else } else
{ {
vtx2.uv[0] = 0.5; vtx2.uv[0] = 0.5;

View File

@@ -27,7 +27,9 @@
#include "../CommonInterfaces/CommonGUIHelperInterface.h" #include "../CommonInterfaces/CommonGUIHelperInterface.h"
#include "SharedMemoryCommands.h" #include "SharedMemoryCommands.h"
//@todo(erwincoumans) those globals are hacks for a VR demo, move this to Python/pybullet!
btVector3 gLastPickPos(0, 0, 0); btVector3 gLastPickPos(0, 0, 0);
bool gCloseToKuka=false;
bool gEnableRealTimeSimVR=false; bool gEnableRealTimeSimVR=false;
int gCreateObjectSimVR = -1; int gCreateObjectSimVR = -1;
btScalar simTimeScalingFactor = 1; btScalar simTimeScalingFactor = 1;
@@ -2931,8 +2933,9 @@ btVector3 gVRGripperPos(0,0,0.2);
btQuaternion gVRGripperOrn(0,0,0,1); btQuaternion gVRGripperOrn(0,0,0,1);
btVector3 gVRController2Pos(0,0,0.2); btVector3 gVRController2Pos(0,0,0.2);
btQuaternion gVRController2Orn(0,0,0,1); btQuaternion gVRController2Orn(0,0,0,1);
btScalar gVRGripper2Analog = 0;
btScalar gVRGripperAnalog = 0; btScalar gVRGripperAnalog = 0;
bool gVRGripperClosed = false; bool gVRGripperClosed = false;
@@ -3146,7 +3149,7 @@ void PhysicsServerCommandProcessor::stepSimulationRealTime(double dtInSec)
btMultiBodyJointMotor* motor = (btMultiBodyJointMotor*)childBody->m_multiBody->getLink(1).m_userPtr; btMultiBodyJointMotor* motor = (btMultiBodyJointMotor*)childBody->m_multiBody->getLink(1).m_userPtr;
if (motor) if (motor)
{ {
btScalar posTarget = (-0.048)*btMin(btScalar(0.75), gVRGripperAnalog) / 0.75; btScalar posTarget = (-0.048)*btMin(btScalar(0.75), gVRGripper2Analog) / 0.75;
motor->setPositionTarget(posTarget, .2); motor->setPositionTarget(posTarget, .2);
motor->setVelocityTarget(0.0, .5); motor->setVelocityTarget(0.0, .5);
motor->setMaxAppliedImpulse(5.0); motor->setMaxAppliedImpulse(5.0);
@@ -3196,7 +3199,7 @@ void PhysicsServerCommandProcessor::stepSimulationRealTime(double dtInSec)
btMultiBody* mb = bodyHandle->m_multiBody; btMultiBody* mb = bodyHandle->m_multiBody;
btScalar sqLen = (mb->getBaseWorldTransform().getOrigin() - gVRController2Pos).length2(); btScalar sqLen = (mb->getBaseWorldTransform().getOrigin() - gVRController2Pos).length2();
btScalar distanceThreshold = 1.3; btScalar distanceThreshold = 1.3;
bool closeToKuka=(sqLen<(distanceThreshold*distanceThreshold)); gCloseToKuka=(sqLen<(distanceThreshold*distanceThreshold));
int numDofs = bodyHandle->m_multiBody->getNumDofs(); int numDofs = bodyHandle->m_multiBody->getNumDofs();
btAlignedObjectArray<double> q_new; btAlignedObjectArray<double> q_new;
@@ -3217,7 +3220,7 @@ void PhysicsServerCommandProcessor::stepSimulationRealTime(double dtInSec)
q_new[5] = -SIMD_HALF_PI*0.66; q_new[5] = -SIMD_HALF_PI*0.66;
q_new[6] = 0; q_new[6] = 0;
if (closeToKuka) if (gCloseToKuka)
{ {
double dampIk[6] = {1.0, 1.0, 1.0, 1.0, 1.0, 0.0}; double dampIk[6] = {1.0, 1.0, 1.0, 1.0, 1.0, 0.0};

View File

@@ -16,6 +16,7 @@
#define MAX_VR_CONTROLLERS 8 #define MAX_VR_CONTROLLERS 8
//@todo(erwincoumans) those globals are hacks for a VR demo, move this to Python/pybullet!
extern btVector3 gLastPickPos; extern btVector3 gLastPickPos;
btVector3 gVRTeleportPos(0,0,0); btVector3 gVRTeleportPos(0,0,0);
btQuaternion gVRTeleportOrn(0, 0, 0,1); btQuaternion gVRTeleportOrn(0, 0, 0,1);
@@ -24,6 +25,8 @@ extern btQuaternion gVRGripperOrn;
extern btVector3 gVRController2Pos; extern btVector3 gVRController2Pos;
extern btQuaternion gVRController2Orn; extern btQuaternion gVRController2Orn;
extern btScalar gVRGripperAnalog; extern btScalar gVRGripperAnalog;
extern btScalar gVRGripper2Analog;
extern bool gCloseToKuka;
extern bool gEnableRealTimeSimVR; extern bool gEnableRealTimeSimVR;
extern int gCreateObjectSimVR; extern int gCreateObjectSimVR;
static int gGraspingController = -1; static int gGraspingController = -1;
@@ -191,6 +194,8 @@ void MotionThreadFunc(void* userPtr,void* lsMemory)
args->m_physicsServerPtr->removePickingConstraint(); args->m_physicsServerPtr->removePickingConstraint();
} }
if (!gCloseToKuka)
{
if (args->m_isVrControllerPicking[c]) if (args->m_isVrControllerPicking[c])
{ {
args->m_isVrControllerPicking[c] = false; args->m_isVrControllerPicking[c] = false;
@@ -198,6 +203,7 @@ void MotionThreadFunc(void* userPtr,void* lsMemory)
args->m_physicsServerPtr->pickBody(from,-toZ); args->m_physicsServerPtr->pickBody(from,-toZ);
//printf("PICK!\n"); //printf("PICK!\n");
} }
}
if (args->m_isVrControllerDragging[c]) if (args->m_isVrControllerDragging[c])
{ {
@@ -1254,6 +1260,7 @@ void PhysicsServerExample::vrControllerMoveCallback(int controllerId, float pos[
} }
else else
{ {
gVRGripper2Analog = analogAxis;
gVRController2Pos.setValue(pos[0] + gVRTeleportPos[0], pos[1] + gVRTeleportPos[1], pos[2] + gVRTeleportPos[2]); gVRController2Pos.setValue(pos[0] + gVRTeleportPos[0], pos[1] + gVRTeleportPos[1], pos[2] + gVRTeleportPos[2]);
btQuaternion orgOrn(orn[0], orn[1], orn[2], orn[3]); btQuaternion orgOrn(orn[0], orn[1], orn[2], orn[3]);
gVRController2Orn = orgOrn*btQuaternion(btVector3(0, 0, 1), SIMD_HALF_PI)*btQuaternion(btVector3(0, 1, 0), SIMD_HALF_PI); gVRController2Orn = orgOrn*btQuaternion(btVector3(0, 0, 1), SIMD_HALF_PI)*btQuaternion(btVector3(0, 1, 0), SIMD_HALF_PI);