void mouseMotionFunc(int x, int y) { // printf("m_mouseButtons = %d\n", m_mouseButtons ); float dx, dy; dx = btScalar(x) - m_mouseOldX; dy = btScalar(y) - m_mouseOldY; ///only if ALT key is pressed (Maya style) { if((m_mouseButtons == 5) || (m_mouseButtons & 2)) { btVector3 hor = getRayTo(0,0)-getRayTo(1,0); btVector3 vert = getRayTo(0,0)-getRayTo(0,1); btScalar multiplierX = btScalar(0.001); btScalar multiplierY = btScalar(0.001); if (m_ortho) { multiplierX = 1; multiplierY = 1; } m_cameraTargetPosition += hor* dx * multiplierX; m_cameraTargetPosition += vert* dy * multiplierY; } else { if(m_mouseButtons & (2 << 2) && m_mouseButtons & 1) { } else if(m_mouseButtons & 1) { m_azi += dx * btScalar(0.2); m_azi = fmodf(m_azi, btScalar(360.f)); m_ele += dy * btScalar(0.2); m_ele = fmodf(m_ele, btScalar(180.f)); } else if(m_mouseButtons & 4) { m_cameraDistance -= dy * btScalar(0.02f); if (m_cameraDistance<btScalar(0.1)) m_cameraDistance = btScalar(0.1); } } } m_mouseOldX = x; m_mouseOldY = y; }
bool Bullet2RigidBodyDemo::mouseButtonCallback(int button, int state, float x, float y) { if (state==1) { if(button==0 && (!m_altPressed && !m_controlPressed)) { btVector3 camPos; m_glApp->m_instancingRenderer->getCameraPosition(camPos); btVector3 rayFrom = camPos; btVector3 rayTo = getRayTo(x,y); m_physicsSetup->pickBody(rayFrom, rayTo); } } else { if (button==0) { m_physicsSetup->removePickingConstraint(); //remove p2p } } //printf("button=%d, state=%d\n",button,state); return false; }
void FeatherstoneMultiBodyDemo::mouseMotionFunc(int x,int y) { if (m_pickingMultiBodyPoint2Point) { //keep it at the same picking distance btVector3 newRayTo = getRayTo(x,y); btVector3 rayFrom; btVector3 oldPivotInB = m_pickingMultiBodyPoint2Point->getPivotInB(); btVector3 newPivotB; if (m_ortho) { newPivotB = oldPivotInB; newPivotB.setX(newRayTo.getX()); newPivotB.setY(newRayTo.getY()); } else { rayFrom = m_cameraPosition; btVector3 dir = newRayTo-rayFrom; dir.normalize(); dir *= gOldPickingDist; newPivotB = rayFrom + dir; } m_pickingMultiBodyPoint2Point->setPivotInB(newPivotB); } DemoApplication::mouseMotionFunc(x,y); }
void DefracDemo::mouseMotionFunc(int x,int y) { if(m_spring) { btVector3 newRayTo = getRayTo(x,y); btVector3 rayFrom; btVector3 oldPivotInB = m_spring->getSourcePosition(); btVector3 newPivotB; if (m_ortho) { newPivotB = oldPivotInB; newPivotB.setX(newRayTo.getX()); newPivotB.setY(newRayTo.getY()); } else { rayFrom = m_cameraPosition; btVector3 dir = newRayTo-rayFrom; dir.normalize(); dir *= m_oldPickingDist; newPivotB = rayFrom + dir; } m_spring->setSourcePosition(newPivotB); } else { DemoApplication::mouseMotionFunc(x,y); } }
bool Bullet2RigidBodyDemo::mouseMoveCallback(float x,float y) { // if (m_data->m_altPressed!=0 || m_data->m_controlPressed!=0) // return false; if (m_pickedBody && m_pickedConstraint) { btPoint2PointConstraint* pickCon = static_cast<btPoint2PointConstraint*>(m_pickedConstraint); if (pickCon) { //keep it at the same picking distance btVector3 newRayTo = getRayTo(x,y); btVector3 rayFrom; btVector3 oldPivotInB = pickCon->getPivotInB(); btVector3 newPivotB; m_glApp->m_instancingRenderer->getCameraPosition(rayFrom); btVector3 dir = newRayTo-rayFrom; dir.normalize(); dir *= m_oldPickingDist; newPivotB = rayFrom + dir; pickCon->setPivotB(newPivotB); } } return false; }
virtual bool mouseMoveCallback(float x,float y) { if (m_replay) return false; CommonRenderInterface* renderer = m_multiThreadedHelper->m_childGuiHelper->getRenderInterface();// m_guiHelper->getRenderInterface(); if (!renderer) { return false; } btVector3 rayTo = getRayTo(int(x), int(y)); btVector3 rayFrom; renderer->getActiveCamera()->getCameraPosition(rayFrom); MyMouseCommand cmd; cmd.m_rayFrom = rayFrom; cmd.m_rayTo = rayTo; cmd.m_type = MyMouseMove; m_args[0].m_cs->lock(); m_args[0].m_mouseCommands.push_back(cmd); m_args[0].m_cs->unlock(); return false; };
JNIEXPORT void JNICALL Java_com_bullet_DemoLib_add(JNIEnv * env, jobject obj, jfloat normalizedX, jfloat normalizedY, int heightPixels, int widthPixels) { // LOGI("%f%f",normalizedX,normalizedY); //sphere[x++]=new Sphere(m_dynamicsWorld, 0, 30, 0); //LOGI("%d",x); //getRayTo(normalizedX,normalizedY); shootBox(getRayTo(normalizedX,normalizedY,heightPixels,widthPixels)); }
bool Bullet2RigidBodyDemo::mouseMoveCallback(float x,float y) { btVector3 rayTo = getRayTo(x, y); btVector3 rayFrom; m_glApp->m_instancingRenderer->getCameraPosition(rayFrom); m_physicsSetup->movePickedBody(rayFrom,rayTo); return false; }
virtual bool mouseButtonCallback(int button, int state, float x, float y) { if (m_replay) return false; CommonRenderInterface* renderer = m_guiHelper->getRenderInterface(); if (!renderer) { return false; } CommonWindowInterface* window = m_guiHelper->getAppInterface()->m_window; if (state==1) { if(button==0 && (!window->isModifierKeyPressed(B3G_ALT) && !window->isModifierKeyPressed(B3G_CONTROL) )) { btVector3 camPos; renderer->getActiveCamera()->getCameraPosition(camPos); btVector3 rayFrom = camPos; btVector3 rayTo = getRayTo(int(x),int(y)); MyMouseCommand cmd; cmd.m_rayFrom = rayFrom; cmd.m_rayTo = rayTo; cmd.m_type = MyMouseButtonDown; m_args[0].m_cs->lock(); m_args[0].m_mouseCommands.push_back(cmd); m_args[0].m_cs->unlock(); } } else { if (button==0) { //m_physicsServer.removePickingConstraint(); MyMouseCommand cmd; cmd.m_rayFrom.setValue(0,0,0); cmd.m_rayTo.setValue(0, 0, 0); cmd.m_type = MyMouseButtonUp; m_args[0].m_cs->lock(); m_args[0].m_mouseCommands.push_back(cmd); m_args[0].m_cs->unlock(); //remove p2p } } //printf("button=%d, state=%d\n",button,state); return false; }
void GL_DialogDynamicsWorld::mouseMotionFunc(int x,int y) { if (m_pickConstraint) { //move the constraint pivot btPoint2PointConstraint* p2p = static_cast<btPoint2PointConstraint*>(m_pickConstraint); if (p2p) { //keep it at the same picking distance btVector3 newRayTo = getRayTo(x,y); btVector3 rayFrom; btVector3 oldPivotInB = p2p->getPivotInB(); btVector3 newPivotB; if (1)//_ortho) { newPivotB = oldPivotInB; newPivotB.setX(newRayTo.getX()); newPivotB.setY(newRayTo.getY()); } else { //rayFrom = m_cameraPosition; // btVector3 dir = newRayTo-rayFrom; // dir.normalize(); // dir *= gOldPickingDist; // newPivotB = rayFrom + dir; } p2p->setPivotB(newPivotB); } } btScalar dx, dy; dx = btScalar(x) - m_mouseOldX; dy = btScalar(y) - m_mouseOldY; m_mouseOldX = x; m_mouseOldY = y; // updateCamera(); }
virtual bool mouseMoveCallback(float x,float y) { CommonRenderInterface* renderer = m_guiHelper->getRenderInterface(); if (!renderer) { btAssert(0); return false; } btVector3 rayTo = getRayTo(int(x), int(y)); btVector3 rayFrom; renderer->getActiveCamera()->getCameraPosition(rayFrom); m_physicsServer.movePickedBody(rayFrom,rayTo); return false; };
virtual bool mouseButtonCallback(int button, int state, float x, float y) { if (m_replay) return false; CommonRenderInterface* renderer = m_guiHelper->getRenderInterface(); if (!renderer) { btAssert(0); return false; } CommonWindowInterface* window = m_guiHelper->getAppInterface()->m_window; if (state==1) { if(button==0 && (!window->isModifierKeyPressed(B3G_ALT) && !window->isModifierKeyPressed(B3G_CONTROL) )) { btVector3 camPos; renderer->getActiveCamera()->getCameraPosition(camPos); btVector3 rayFrom = camPos; btVector3 rayTo = getRayTo(int(x),int(y)); m_physicsServer.pickBody(rayFrom, rayTo); } } else { if (button==0) { m_physicsServer.removePickingConstraint(); //remove p2p } } //printf("button=%d, state=%d\n",button,state); return false; }
void DemoApplication::mouseMotionFunc(int x,int y) { if (m_pickConstraint) { //move the constraint pivot if (m_pickConstraint->getConstraintType() == D6_CONSTRAINT_TYPE) { btGeneric6DofConstraint* pickCon = static_cast<btGeneric6DofConstraint*>(m_pickConstraint); if (pickCon) { //keep it at the same picking distance btVector3 newRayTo = getRayTo(x,y); btVector3 rayFrom; btVector3 oldPivotInB = pickCon->getFrameOffsetA().getOrigin(); btVector3 newPivotB; if (m_ortho) { newPivotB = oldPivotInB; newPivotB.setX(newRayTo.getX()); newPivotB.setY(newRayTo.getY()); } else { rayFrom = m_cameraPosition; btVector3 dir = newRayTo-rayFrom; dir.normalize(); dir *= gOldPickingDist; newPivotB = rayFrom + dir; } pickCon->getFrameOffsetA().setOrigin(newPivotB); } } else { btPoint2PointConstraint* pickCon = static_cast<btPoint2PointConstraint*>(m_pickConstraint); if (pickCon) { //keep it at the same picking distance btVector3 newRayTo = getRayTo(x,y); btVector3 rayFrom; btVector3 oldPivotInB = pickCon->getPivotInB(); btVector3 newPivotB; if (m_ortho) { newPivotB = oldPivotInB; newPivotB.setX(newRayTo.getX()); newPivotB.setY(newRayTo.getY()); } else { rayFrom = m_cameraPosition; btVector3 dir = newRayTo-rayFrom; dir.normalize(); dir *= gOldPickingDist; newPivotB = rayFrom + dir; } pickCon->setPivotB(newPivotB); } } } float dx, dy; dx = btScalar(x) - m_mouseOldX; dy = btScalar(y) - m_mouseOldY; ///only if ALT key is pressed (Maya style) if (m_modifierKeys& BT_ACTIVE_ALT) { if(m_mouseButtons & 2) { btVector3 hor = getRayTo(0,0)-getRayTo(1,0); btVector3 vert = getRayTo(0,0)-getRayTo(0,1); btScalar multiplierX = btScalar(0.01); btScalar multiplierY = btScalar(0.01); if (m_ortho) { multiplierX = 1; multiplierY = 1; } m_cameraTargetPosition += hor* dx * multiplierX; m_cameraTargetPosition += vert* dy * multiplierY; } if(m_mouseButtons & (2 << 2) && m_mouseButtons & 1) { } else if(m_mouseButtons & 1) { m_azi += dx * btScalar(0.2); m_azi = fmodf(m_azi, btScalar(360.f)); m_ele += dy * btScalar(0.2); m_ele = fmodf(m_ele, btScalar(180.f)); } else if(m_mouseButtons & 4) { m_cameraDistance -= dy * btScalar(0.2f); if (m_cameraDistance<btScalar(0.1)) m_cameraDistance = btScalar(0.1); } } m_mouseOldX = x; m_mouseOldY = y; updateCamera(); }
void DemoApplication::mouseFunc(int button, int state, int x, int y) { if (state == 0) { m_mouseButtons |= 1<<button; } else { m_mouseButtons = 0; } m_mouseOldX = x; m_mouseOldY = y; updateModifierKeys(); if ((m_modifierKeys& BT_ACTIVE_ALT) && (state==0)) { return; } //printf("button %i, state %i, x=%i,y=%i\n",button,state,x,y); //button 0, state 0 means left mouse down btVector3 rayTo = getRayTo(x,y); switch (button) { case 2: { if (state==0) { shootBox(rayTo); } break; }; case 1: { if (state==0) { #if 0 //apply an impulse if (m_dynamicsWorld) { btCollisionWorld::ClosestRayResultCallback rayCallback(m_cameraPosition,rayTo); m_dynamicsWorld->rayTest(m_cameraPosition,rayTo,rayCallback); if (rayCallback.hasHit()) { btRigidBody* body = btRigidBody::upcast(rayCallback.m_collisionObject); if (body) { body->setActivationState(ACTIVE_TAG); btVector3 impulse = rayTo; impulse.normalize(); float impulseStrength = 10.f; impulse *= impulseStrength; btVector3 relPos = rayCallback.m_hitPointWorld - body->getCenterOfMassPosition(); body->applyImpulse(impulse,relPos); } } } #endif } else { } break; } case 0: { if (state==0) { //add a point to point constraint for picking if (m_dynamicsWorld) { btVector3 rayFrom; if (m_ortho) { rayFrom = rayTo; rayFrom.setZ(-100.f); } else { rayFrom = m_cameraPosition; } btCollisionWorld::ClosestRayResultCallback rayCallback(rayFrom,rayTo); m_dynamicsWorld->rayTest(rayFrom,rayTo,rayCallback); if (rayCallback.hasHit()) { btRigidBody* body = btRigidBody::upcast(rayCallback.m_collisionObject); if (body) { //other exclusions? if (!(body->isStaticObject() || body->isKinematicObject())) { pickedBody = body; pickedBody->setActivationState(DISABLE_DEACTIVATION); btVector3 pickPos = rayCallback.m_hitPointWorld; printf("pickPos=%f,%f,%f\n",pickPos.getX(),pickPos.getY(),pickPos.getZ()); btVector3 localPivot = body->getCenterOfMassTransform().inverse() * pickPos; if (use6Dof) { btTransform tr; tr.setIdentity(); tr.setOrigin(localPivot); btGeneric6DofConstraint* dof6 = new btGeneric6DofConstraint(*body, tr,false); dof6->setLinearLowerLimit(btVector3(0,0,0)); dof6->setLinearUpperLimit(btVector3(0,0,0)); dof6->setAngularLowerLimit(btVector3(0,0,0)); dof6->setAngularUpperLimit(btVector3(0,0,0)); m_dynamicsWorld->addConstraint(dof6); m_pickConstraint = dof6; dof6->setParam(BT_CONSTRAINT_STOP_CFM,0.8,0); dof6->setParam(BT_CONSTRAINT_STOP_CFM,0.8,1); dof6->setParam(BT_CONSTRAINT_STOP_CFM,0.8,2); dof6->setParam(BT_CONSTRAINT_STOP_CFM,0.8,3); dof6->setParam(BT_CONSTRAINT_STOP_CFM,0.8,4); dof6->setParam(BT_CONSTRAINT_STOP_CFM,0.8,5); dof6->setParam(BT_CONSTRAINT_STOP_ERP,0.1,0); dof6->setParam(BT_CONSTRAINT_STOP_ERP,0.1,1); dof6->setParam(BT_CONSTRAINT_STOP_ERP,0.1,2); dof6->setParam(BT_CONSTRAINT_STOP_ERP,0.1,3); dof6->setParam(BT_CONSTRAINT_STOP_ERP,0.1,4); dof6->setParam(BT_CONSTRAINT_STOP_ERP,0.1,5); } else { btPoint2PointConstraint* p2p = new btPoint2PointConstraint(*body,localPivot); m_dynamicsWorld->addConstraint(p2p); m_pickConstraint = p2p; p2p->m_setting.m_impulseClamp = mousePickClamping; //very weak constraint for picking p2p->m_setting.m_tau = 0.001f; /* p2p->setParam(BT_CONSTRAINT_CFM,0.8,0); p2p->setParam(BT_CONSTRAINT_CFM,0.8,1); p2p->setParam(BT_CONSTRAINT_CFM,0.8,2); p2p->setParam(BT_CONSTRAINT_ERP,0.1,0); p2p->setParam(BT_CONSTRAINT_ERP,0.1,1); p2p->setParam(BT_CONSTRAINT_ERP,0.1,2); */ } use6Dof = !use6Dof; //save mouse position for dragging gOldPickingPos = rayTo; gHitPos = pickPos; gOldPickingDist = (pickPos-rayFrom).length(); } } } } } else { if (m_pickConstraint && m_dynamicsWorld) { m_dynamicsWorld->removeConstraint(m_pickConstraint); delete m_pickConstraint; //printf("removed constraint %i",gPickingConstraintId); m_pickConstraint = 0; pickedBody->forceActivationState(ACTIVE_TAG); pickedBody->setDeactivationTime( 0.f ); pickedBody = 0; } } break; } default: { } } }
void DemoApplication::keyboardCallback(unsigned char key, int x, int y) { (void)x; (void)y; m_lastKey = 0; #ifndef BT_NO_PROFILE if (key >= 0x31 && key <= 0x39) { int child = key-0x31; m_profileIterator->Enter_Child(child); } if (key==0x30) { m_profileIterator->Enter_Parent(); } #endif //BT_NO_PROFILE switch (key) { case 'q' : #ifdef BT_USE_FREEGLUT //return from glutMainLoop(), detect memory leaks etc. glutLeaveMainLoop(); #else exit(0); #endif break; case 'l' : stepLeft(); break; case 'r' : stepRight(); break; case 'f' : stepFront(); break; case 'b' : stepBack(); break; case 'z' : zoomIn(); break; case 'x' : zoomOut(); break; case 'i' : toggleIdle(); break; case 'g' : m_enableshadows=!m_enableshadows;break; case 'u' : m_shapeDrawer->enableTexture(!m_shapeDrawer->enableTexture(false));break; case 'h': if (m_debugMode & btIDebugDraw::DBG_NoHelpText) m_debugMode = m_debugMode & (~btIDebugDraw::DBG_NoHelpText); else m_debugMode |= btIDebugDraw::DBG_NoHelpText; break; case 'w': if (m_debugMode & btIDebugDraw::DBG_DrawWireframe) m_debugMode = m_debugMode & (~btIDebugDraw::DBG_DrawWireframe); else m_debugMode |= btIDebugDraw::DBG_DrawWireframe; break; case 'p': if (m_debugMode & btIDebugDraw::DBG_ProfileTimings) m_debugMode = m_debugMode & (~btIDebugDraw::DBG_ProfileTimings); else m_debugMode |= btIDebugDraw::DBG_ProfileTimings; break; case '=': { int maxSerializeBufferSize = 1024*1024*5; btDefaultSerializer* serializer = new btDefaultSerializer(maxSerializeBufferSize); //serializer->setSerializationFlags(BT_SERIALIZE_NO_DUPLICATE_ASSERT); m_dynamicsWorld->serialize(serializer); FILE* f2 = fopen("testFile.bullet","wb"); fwrite(serializer->getBufferPointer(),serializer->getCurrentBufferSize(),1,f2); fclose(f2); delete serializer; break; } case 'm': if (m_debugMode & btIDebugDraw::DBG_EnableSatComparison) m_debugMode = m_debugMode & (~btIDebugDraw::DBG_EnableSatComparison); else m_debugMode |= btIDebugDraw::DBG_EnableSatComparison; break; case 'n': if (m_debugMode & btIDebugDraw::DBG_DisableBulletLCP) m_debugMode = m_debugMode & (~btIDebugDraw::DBG_DisableBulletLCP); else m_debugMode |= btIDebugDraw::DBG_DisableBulletLCP; break; case 't' : if (m_debugMode & btIDebugDraw::DBG_DrawText) m_debugMode = m_debugMode & (~btIDebugDraw::DBG_DrawText); else m_debugMode |= btIDebugDraw::DBG_DrawText; break; case 'y': if (m_debugMode & btIDebugDraw::DBG_DrawFeaturesText) m_debugMode = m_debugMode & (~btIDebugDraw::DBG_DrawFeaturesText); else m_debugMode |= btIDebugDraw::DBG_DrawFeaturesText; break; case 'a': if (m_debugMode & btIDebugDraw::DBG_DrawAabb) m_debugMode = m_debugMode & (~btIDebugDraw::DBG_DrawAabb); else m_debugMode |= btIDebugDraw::DBG_DrawAabb; break; case 'c' : if (m_debugMode & btIDebugDraw::DBG_DrawContactPoints) m_debugMode = m_debugMode & (~btIDebugDraw::DBG_DrawContactPoints); else m_debugMode |= btIDebugDraw::DBG_DrawContactPoints; break; case 'C' : if (m_debugMode & btIDebugDraw::DBG_DrawConstraints) m_debugMode = m_debugMode & (~btIDebugDraw::DBG_DrawConstraints); else m_debugMode |= btIDebugDraw::DBG_DrawConstraints; break; case 'L' : if (m_debugMode & btIDebugDraw::DBG_DrawConstraintLimits) m_debugMode = m_debugMode & (~btIDebugDraw::DBG_DrawConstraintLimits); else m_debugMode |= btIDebugDraw::DBG_DrawConstraintLimits; break; case 'd' : if (m_debugMode & btIDebugDraw::DBG_NoDeactivation) m_debugMode = m_debugMode & (~btIDebugDraw::DBG_NoDeactivation); else m_debugMode |= btIDebugDraw::DBG_NoDeactivation; if (m_debugMode & btIDebugDraw::DBG_NoDeactivation) { gDisableDeactivation = true; } else { gDisableDeactivation = false; } break; case 'o' : { m_ortho = !m_ortho;//m_stepping = !m_stepping; break; } case 's' : clientMoveAndDisplay(); break; // case ' ' : newRandom(); break; case ' ': clientResetScene(); break; case '1': { if (m_debugMode & btIDebugDraw::DBG_EnableCCD) m_debugMode = m_debugMode & (~btIDebugDraw::DBG_EnableCCD); else m_debugMode |= btIDebugDraw::DBG_EnableCCD; break; } case '.': { shootBox(getRayTo(x,y));//getCameraTargetPosition()); break; } case '+': { m_ShootBoxInitialSpeed += 10.f; break; } case '-': { m_ShootBoxInitialSpeed -= 10.f; break; } default: // std::cout << "unused key : " << key << std::endl; break; } if (getDynamicsWorld() && getDynamicsWorld()->getDebugDrawer()) getDynamicsWorld()->getDebugDrawer()->setDebugMode(m_debugMode); }
void DefracDemo::mouseFunc(int button, int state, int x, int y) { if(button == 0)//left button { if(state == 0) //pressed { btVector3 rayTo = getRayTo(x,y); btVector3 rayFrom; if (m_ortho) { rayFrom = rayTo; rayFrom.setZ(-100.f); } else { rayFrom = m_cameraPosition; } btDefracDynamicsWorld* world = getDefracDynamicsWorld(); btScalar minTime(BT_LARGE_FLOAT); for(int b=0; b < world->getNumDefracBodies(); ++b) { btDefracBody* body = world->getDefracBody(b); for(int i=0; i < body->getTetrahedronCount(); ++i) { btTetrahedron* t = body->getTetrahedron(i); btVector3 min, max; t->getAABB(min, max); btScalar time(0); if(btDefracUtils::SegmentAABBIntersect(rayFrom, rayTo, min, max, &time) && time < minTime) { minTime = time; btVector3 pickPos = rayFrom + (rayTo-rayFrom)*time; m_oldPickingDist = (pickPos - rayFrom).length(); if(m_spring == NULL) m_spring = new btSpring(t, btVector4(0.25,0.25,0.25,0.25), 1000, 0.2); else m_spring->setTetrahedron(t); m_spring->setSourcePosition(pickPos); } } } if(m_spring != NULL) world->addSpring(m_spring); } else if(state == 1) //released { btDefracDynamicsWorld* world = getDefracDynamicsWorld(); world->removeSpring(m_spring); delete m_spring; m_spring = NULL; } } if(m_spring == NULL) { DemoApplication::mouseFunc(button,state,x,y); } }
void mouseMotionFunc(int x,int y) { if (m_pickConstraint) { //move the constraint pivot if (m_pickConstraint->getConstraintType() == D6_CONSTRAINT_TYPE) { btGeneric6DofConstraint* pickCon = static_cast<btGeneric6DofConstraint*>(m_pickConstraint); if (pickCon) { //keep it at the same picking distance btVector3 newRayTo = getRayTo(x,y); btVector3 rayFrom; btVector3 oldPivotInB = pickCon->getFrameOffsetA().getOrigin(); btVector3 newPivotB; if (m_ortho) { newPivotB = oldPivotInB; newPivotB.setX(newRayTo.getX()); newPivotB.setY(newRayTo.getY()); } else { rayFrom = m_cameraPosition; btVector3 dir = newRayTo-rayFrom; dir.normalize(); dir *= gOldPickingDist; newPivotB = rayFrom + dir; } pickCon->getFrameOffsetA().setOrigin(newPivotB); } } else { btPoint2PointConstraint* pickCon = static_cast<btPoint2PointConstraint*>(m_pickConstraint); if (pickCon) { //keep it at the same picking distance btVector3 newRayTo = getRayTo(x,y); btVector3 rayFrom; btVector3 oldPivotInB = pickCon->getPivotInB(); btVector3 newPivotB; if (m_ortho) { newPivotB = oldPivotInB; newPivotB.setX(newRayTo.getX()); newPivotB.setY(newRayTo.getY()); } else { rayFrom = m_cameraPosition; btVector3 dir = newRayTo-rayFrom; dir.normalize(); dir *= gOldPickingDist; newPivotB = rayFrom + dir; } pickCon->setPivotB(newPivotB); } } } float dx, dy; dx = btScalar(x) - m_mouseOldX; dy = btScalar(y) - m_mouseOldY; m_mouseOldX = x; m_mouseOldY = y; }
bool GL_DialogDynamicsWorld::mouseFunc(int button, int state, int x, int y) { if (state == 0) { m_mouseButtons |= 1<<button; } else { m_mouseButtons = 0; } m_mouseOldX = x; m_mouseOldY = y; //printf("button %i, state %i, x=%i,y=%i\n",button,state,x,y); //button 0, state 0 means left mouse down btVector3 rayTo = getRayTo(x,y); switch (button) { case 1: { if (state==0) { #if 0 //apply an impulse if (m_dynamicsWorld) { btCollisionWorld::ClosestRayResultCallback rayCallback(m_cameraPosition,rayTo); m_dynamicsWorld->rayTest(m_cameraPosition,rayTo,rayCallback); if (rayCallback.hasHit()) { btRigidBody* body = btRigidBody::upcast(rayCallback.m_collisionObject); if (body) { body->setActivationState(ACTIVE_TAG); btVector3 impulse = rayTo; impulse.normalize(); float impulseStrength = 10.f; impulse *= impulseStrength; btVector3 relPos = rayCallback.m_hitPointWorld - body->getCenterOfMassPosition(); body->applyImpulse(impulse,relPos); } } } #endif } else { } break; } case 0: { if (state==0) { //add a point to point constraint for picking if (m_dynamicsWorld) { btVector3 rayFrom; if (1)//m_ortho) { rayFrom = rayTo; rayFrom.setZ(-100.f); } //else //{ // rayFrom = m_cameraPosition; //} btCollisionWorld::ClosestRayResultCallback rayCallback(rayFrom,rayTo); m_dynamicsWorld->rayTest(rayFrom,rayTo,rayCallback); if (rayCallback.hasHit()) { btScalar maxPickingClamp = mousePickClamping; btRigidBody* body = btRigidBody::upcast(rayCallback.m_collisionObject); if (body) { bool doPick = true; if (body->getUserPointer()) { ///deal with controls in a special way GL_DialogControl* ctrl = (GL_DialogControl*)body->getUserPointer(); switch(ctrl->getType()) { case GL_TOGGLE_CONTROL: { GL_ToggleControl* toggle = (GL_ToggleControl*) ctrl; toggle->m_active = !toggle->m_active; doPick = false; break; } case GL_SLIDER_CONTROL: { GL_SliderControl* slider = (GL_SliderControl*) ctrl; btTypedConstraint* constraint = slider->getConstraint(); if (constraint->getConstraintType() == SLIDER_CONSTRAINT_TYPE) { btSliderConstraint* sliderConstraint = (btSliderConstraint*) constraint; sliderConstraint->setLowerLinLimit(slider->getLowerLimit()); sliderConstraint->setUpperLinLimit(slider->getUpperLimit()); } maxPickingClamp = 100; } default: { } }; }; if (doPick) { //other exclusions? if (!(body->isStaticObject() || body->isKinematicObject())) { pickedBody = body; pickedBody->setActivationState(DISABLE_DEACTIVATION); btVector3 pickPos = rayCallback.m_hitPointWorld; //printf("pickPos=%f,%f,%f\n",pickPos.getX(),pickPos.getY(),pickPos.getZ()); btVector3 localPivot = body->getCenterOfMassTransform().inverse() * pickPos; btPoint2PointConstraint* p2p = new btPoint2PointConstraint(*body,localPivot); p2p->m_setting.m_impulseClamp = maxPickingClamp; m_dynamicsWorld->addConstraint(p2p); m_pickConstraint = p2p; //save mouse position for dragging gOldPickingPos = rayTo; gHitPos = pickPos; gOldPickingDist = (pickPos-rayFrom).length(); //very weak constraint for picking p2p->m_setting.m_tau = 0.1f; } } return true; } } } } else { if (m_pickConstraint && m_dynamicsWorld) { m_dynamicsWorld->removeConstraint(m_pickConstraint); delete m_pickConstraint; //printf("removed constraint %i",gPickingConstraintId); m_pickConstraint = 0; pickedBody->forceActivationState(ACTIVE_TAG); pickedBody->setDeactivationTime( 0.f ); if (pickedBody->getUserPointer()) { ///deal with controls in a special way GL_DialogControl* ctrl = (GL_DialogControl*)pickedBody->getUserPointer(); if (ctrl->getType()==GL_SLIDER_CONTROL) { GL_SliderControl* sliderControl = (GL_SliderControl*) ctrl; btSliderConstraint* slider = 0; btTypedConstraint* constraint = sliderControl->getConstraint(); if (constraint->getConstraintType() == SLIDER_CONSTRAINT_TYPE) { slider = (btSliderConstraint*)constraint; } if (slider) { btScalar linDepth = slider->getLinearPos(); btScalar lowLim = slider->getLowerLinLimit(); btScalar hiLim = slider->getUpperLinLimit(); slider->setPoweredLinMotor(false); if(linDepth <= lowLim) { slider->setLowerLinLimit(lowLim); slider->setUpperLinLimit(lowLim); } else if(linDepth > hiLim) { slider->setLowerLinLimit(hiLim); slider->setUpperLinLimit(hiLim); } else { slider->setLowerLinLimit(linDepth); slider->setUpperLinLimit(linDepth); } } } } pickedBody = 0; } } break; } default: { } } return false; }
void BtApplication::mouseFunc(int button, int state, int x, int y) { if (state == 0) { m_mouseButtons |= 1<<button; } else { m_mouseButtons = 0; } m_mouseOldX = x; m_mouseOldY = y; updateModifierKeys(); if ((m_modifierKeys& BT_ACTIVE_ALT) && (state==0)) { return; } //printf("button %i, state %i, x=%i,y=%i\n",button,state,x,y); //button 0, state 0 means left mouse down btVector3 rayTo = getRayTo(x,y); switch (button) { case 2: { if (state==0) { shootBox(rayTo); } break; }; case 1: { if (state==0) { #if 0 //apply an impulse if (m_dynamicsWorld) { btCollisionWorld::ClosestRayResultCallback rayCallback(m_cameraPosition,rayTo); m_dynamicsWorld->rayTest(m_cameraPosition,rayTo,rayCallback); if (rayCallback.hasHit()) { btRigidBody* body = btRigidBody::upcast(rayCallback.m_collisionObject); if (body) { body->setActivationState(ACTIVE_TAG); btVector3 impulse = rayTo; impulse.normalize(); float impulseStrength = 10.f; impulse *= impulseStrength; btVector3 relPos = rayCallback.m_hitPointWorld - body->getCenterOfMassPosition(); body->applyImpulse(impulse,relPos); } } } #endif } else { } break; } case 0: { if (state==0) { //add a point to point constraint for picking if (m_dynamicsWorld) { btVector3 rayFrom; if (m_ortho) { rayFrom = rayTo; rayFrom.setZ(-100.f); } else { rayFrom = m_cameraPosition; } btCollisionWorld::ClosestRayResultCallback rayCallback(rayFrom,rayTo); m_dynamicsWorld->rayTest(rayFrom,rayTo,rayCallback); if (rayCallback.hasHit()) { btVector3 pickPos = rayCallback.m_hitPointWorld; pickObject(pickPos, rayCallback.m_collisionObject); gOldPickingPos = rayTo; gHitPos = pickPos; gOldPickingDist = (pickPos-rayFrom).length(); } } } else { removePickingConstraint(); } break; } default: { } } }
bool Bullet2RigidBodyDemo::mouseButtonCallback(int button, int state, float x, float y) { if (state==1) { if(button==0)// && (m_data->m_altPressed==0 && m_data->m_controlPressed==0)) { btVector3 camPos; m_glApp->m_instancingRenderer->getCameraPosition(camPos); btVector3 rayFrom = camPos; btVector3 rayTo = getRayTo(x,y); btCollisionWorld::ClosestRayResultCallback rayCallback(rayFrom,rayTo); m_dynamicsWorld->rayTest(rayFrom,rayTo,rayCallback); if (rayCallback.hasHit()) { btVector3 pickPos = rayCallback.m_hitPointWorld; btRigidBody* body = (btRigidBody*)btRigidBody::upcast(rayCallback.m_collisionObject); if (body) { //other exclusions? if (!(body->isStaticObject() || body->isKinematicObject())) { m_pickedBody = body; m_pickedBody->setActivationState(DISABLE_DEACTIVATION); //printf("pickPos=%f,%f,%f\n",pickPos.getX(),pickPos.getY(),pickPos.getZ()); btVector3 localPivot = body->getCenterOfMassTransform().inverse() * pickPos; btPoint2PointConstraint* p2p = new btPoint2PointConstraint(*body,localPivot); m_dynamicsWorld->addConstraint(p2p,true); m_pickedConstraint = p2p; btScalar mousePickClamping = 30.f; p2p->m_setting.m_impulseClamp = mousePickClamping; //very weak constraint for picking p2p->m_setting.m_tau = 0.001f; } } // pickObject(pickPos, rayCallback.m_collisionObject); m_oldPickingPos = rayTo; m_hitPos = pickPos; m_oldPickingDist = (pickPos-rayFrom).length(); // printf("hit !\n"); //add p2p } } } else { if (button==0) { if (m_pickedConstraint) { m_dynamicsWorld->removeConstraint(m_pickedConstraint); delete m_pickedConstraint; m_pickedConstraint=0; m_pickedBody = 0; } //remove p2p } } //printf("button=%d, state=%d\n",button,state); return false; }
bool mouseButtonCallback(int button, int state, float x, float y) { if (state==1) { if(button==0)// && (m_data->m_altPressed==0 && m_data->m_controlPressed==0)) { btVector3 camPos; m_glApp->m_instancingRenderer->getCameraPosition(camPos); btVector3 rayFrom = camPos; btVector3 rayTo = getRayTo(x,y); btCollisionWorld::ClosestRayResultCallback rayCallback(rayFrom,rayTo); m_dynamicsWorld->rayTest(rayFrom,rayTo,rayCallback); if (rayCallback.hasHit()) { btVector3 pickPos = rayCallback.m_hitPointWorld; btRigidBody* body = (btRigidBody*)btRigidBody::upcast(rayCallback.m_collisionObject); if (body) { //other exclusions? if (!(body->isStaticObject() || body->isKinematicObject())) { m_pickedBody = body; m_pickedBody->setActivationState(DISABLE_DEACTIVATION); //printf("pickPos=%f,%f,%f\n",pickPos.getX(),pickPos.getY(),pickPos.getZ()); btVector3 localPivot = body->getCenterOfMassTransform().inverse() * pickPos; btPoint2PointConstraint* p2p = new btPoint2PointConstraint(*body,localPivot); m_dynamicsWorld->addConstraint(p2p,true); m_pickedConstraint = p2p; btScalar mousePickClamping = 30.f; p2p->m_setting.m_impulseClamp = mousePickClamping; //very weak constraint for picking p2p->m_setting.m_tau = 0.001f; } } else { btMultiBodyLinkCollider* multiCol = (btMultiBodyLinkCollider*)btMultiBodyLinkCollider::upcast(rayCallback.m_collisionObject); if (multiCol && multiCol->m_multiBody) { multiCol->m_multiBody->setCanSleep(false); btVector3 pivotInA = multiCol->m_multiBody->worldPosToLocal(multiCol->m_link, pickPos); btMultiBodyPoint2Point* p2p = new btMultiBodyPoint2Point(multiCol->m_multiBody,multiCol->m_link,0,pivotInA,pickPos); //if you add too much energy to the system, causing high angular velocities, simulation 'explodes' //see also http://www.bulletphysics.org/Bullet/phpBB3/viewtopic.php?f=4&t=949 //so we try to avoid it by clamping the maximum impulse (force) that the mouse pick can apply //it is not satisfying, hopefully we find a better solution (higher order integrator, using joint friction using a zero-velocity target motor with limited force etc?) p2p->setMaxAppliedImpulse(20*scaling); btMultiBodyDynamicsWorld* world = (btMultiBodyDynamicsWorld*) m_dynamicsWorld; world->addMultiBodyConstraint(p2p); m_pickingMultiBodyPoint2Point =p2p; } } // pickObject(pickPos, rayCallback.m_collisionObject); m_oldPickingPos = rayTo; m_hitPos = pickPos; m_oldPickingDist = (pickPos-rayFrom).length(); // printf("hit !\n"); //add p2p } } } else { if (button==0) { if (m_pickedConstraint) { m_dynamicsWorld->removeConstraint(m_pickedConstraint); delete m_pickedConstraint; m_pickedConstraint=0; m_pickedBody = 0; } if (m_pickingMultiBodyPoint2Point) { m_pickingMultiBodyPoint2Point->getMultiBodyA()->setCanSleep(true); btMultiBodyDynamicsWorld* world = (btMultiBodyDynamicsWorld*) m_dynamicsWorld; world->removeMultiBodyConstraint(m_pickingMultiBodyPoint2Point); delete m_pickingMultiBodyPoint2Point; m_pickingMultiBodyPoint2Point = 0; } //remove p2p } } //printf("button=%d, state=%d\n",button,state); return false; }
void mouseFunc(int button, int state, int x, int y) { if (state == 0) { m_mouseButtons |= 1<<button; } else { m_mouseButtons = 0; } m_mouseOldX = x; m_mouseOldY = y; //printf("button %i, state %i, x=%i,y=%i\n",button,state,x,y); //button 0, state 0 means left mouse down btVector3 rayTo = getRayTo(x,y); switch (button) { case 0: { if (state==0) { //add a point to point constraint for picking if (dynWorld) { btVector3 rayFrom; if (m_ortho) { rayFrom = rayTo; rayFrom.setZ(-100.f); } else { rayFrom = m_cameraPosition; } btCollisionWorld::ClosestRayResultCallback rayCallback(rayFrom,rayTo); dynWorld->rayTest(rayFrom,rayTo,rayCallback); if (rayCallback.hasHit()) { btRigidBody* body = btRigidBody::upcast(rayCallback.m_collisionObject); if (body) { //other exclusions? if (!(body->isStaticObject() || body->isKinematicObject())) { pickedBody = body; pickedBody->setActivationState(DISABLE_DEACTIVATION); btVector3 pickPos = rayCallback.m_hitPointWorld; //printf("pickPos=%f,%f,%f\n",pickPos.getX(),pickPos.getY(),pickPos.getZ()); btVector3 localPivot = body->getCenterOfMassTransform().inverse() * pickPos; if (use6Dof) { btTransform tr; tr.setIdentity(); tr.setOrigin(localPivot); btGeneric6DofConstraint* dof6 = new btGeneric6DofConstraint(*body, tr,false); dof6->setLinearLowerLimit(btVector3(0,0,0)); dof6->setLinearUpperLimit(btVector3(0,0,0)); dof6->setAngularLowerLimit(btVector3(0,0,0)); dof6->setAngularUpperLimit(btVector3(0,0,0)); dynWorld->addConstraint(dof6); m_pickConstraint = dof6; dof6->setParam(BT_CONSTRAINT_STOP_CFM,0.8,0); dof6->setParam(BT_CONSTRAINT_STOP_CFM,0.8,1); dof6->setParam(BT_CONSTRAINT_STOP_CFM,0.8,2); dof6->setParam(BT_CONSTRAINT_STOP_CFM,0.8,3); dof6->setParam(BT_CONSTRAINT_STOP_CFM,0.8,4); dof6->setParam(BT_CONSTRAINT_STOP_CFM,0.8,5); dof6->setParam(BT_CONSTRAINT_STOP_ERP,0.1,0); dof6->setParam(BT_CONSTRAINT_STOP_ERP,0.1,1); dof6->setParam(BT_CONSTRAINT_STOP_ERP,0.1,2); dof6->setParam(BT_CONSTRAINT_STOP_ERP,0.1,3); dof6->setParam(BT_CONSTRAINT_STOP_ERP,0.1,4); dof6->setParam(BT_CONSTRAINT_STOP_ERP,0.1,5); } else { btPoint2PointConstraint* p2p = new btPoint2PointConstraint(*body,localPivot); dynWorld->addConstraint(p2p); m_pickConstraint = p2p; p2p->m_setting.m_impulseClamp = mousePickClamping; //very weak constraint for picking p2p->m_setting.m_tau = 0.001f; /* p2p->setParam(BT_CONSTRAINT_CFM,0.8,0); p2p->setParam(BT_CONSTRAINT_CFM,0.8,1); p2p->setParam(BT_CONSTRAINT_CFM,0.8,2); p2p->setParam(BT_CONSTRAINT_ERP,0.1,0); p2p->setParam(BT_CONSTRAINT_ERP,0.1,1); p2p->setParam(BT_CONSTRAINT_ERP,0.1,2); */ } use6Dof = !use6Dof; //save mouse position for dragging gOldPickingPos = rayTo; gHitPos = pickPos; gOldPickingDist = (pickPos-rayFrom).length(); } } } } } else { removePickingConstraint(); } break; } default: { } } }
Vector3f Camera::getRayToFromCenter() { static scalar width = SGET_F("WIDTH"); static scalar height = SGET_F("HEIGHT"); return getRayTo(width/2, height/2); }
void bulletBaseApp::mouseMotionFunc(int x,int y) { if (m_pickConstraint) { //move the constraint pivot btPoint2PointConstraint* p2p = static_cast<btPoint2PointConstraint*>(m_pickConstraint); if (p2p) { //keep it at the same picking distance btVector3 newRayTo = getRayTo(x,y); btVector3 rayFrom; btVector3 oldPivotInB = p2p->getPivotInB(); btVector3 newPivotB; if (m_ortho) { newPivotB = oldPivotInB; newPivotB.setX(newRayTo.getX()); newPivotB.setY(newRayTo.getY()); } else { rayFrom = m_cameraPosition; btVector3 dir = newRayTo-rayFrom; dir.normalize(); dir *= gOldPickingDist; newPivotB = rayFrom + dir; } p2p->setPivotB(newPivotB); } } float dx, dy; dx = x - m_mouseOldX; dy = y - m_mouseOldY; ///only if ALT key is pressed (Maya style) if (m_modifierKeys& BT_ACTIVE_ALT) { if(m_mouseButtons & 2) { btVector3 hor = getRayTo(0,0)-getRayTo(1,0); btVector3 vert = getRayTo(0,0)-getRayTo(0,1); btScalar multiplierX = 0.01; btScalar multiplierY = 0.01; if (m_ortho) { multiplierX = 1; multiplierY = 1; } m_cameraTargetPosition += hor* dx * multiplierX; m_cameraTargetPosition += vert* dy * multiplierY; } if(m_mouseButtons & (2 << 2) && m_mouseButtons & 1) { } else if(m_mouseButtons & 1) { m_azi += dx * 0.2; m_azi = fmodf(m_azi, 180.f); m_ele += dy * 0.2; m_ele = fmodf(m_ele, 180.f); } else if(m_mouseButtons & 4) { m_cameraDistance -= dy * 0.2f; if (m_cameraDistance<0.1) m_cameraDistance = 0.1; } } m_mouseOldX = x; m_mouseOldY = y; updateCamera(); }