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)); }
void Physics3DTestDemo::onTouchesEnded(const std::vector<Touch*>& touches, cocos2d::Event *event) { if (!_needShootBox) return; if (!touches.empty()) { auto location = touches[0]->getLocationInView(); Vec3 nearP(location.x, location.y, -1.0f), farP(location.x, location.y, 1.0f); nearP = _camera->unproject(nearP); farP = _camera->unproject(farP); Vec3 dir(farP - nearP); shootBox(_camera->getPosition3D() + dir * 10.0f); } }
void clientKeyboard(unsigned char key, int x, int y) { if (key == '.') { shootBox(SimdVector3(0,0,0)); } if (key == '+') { bulletSpeed += 10.f; } if (key == '-') { bulletSpeed -= 10.f; } defaultKeyboard(key, x, y); }
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 clientMouseFunc(int button, int state, int x, int y) { //printf("button %i, state %i, x=%i,y=%i\n",button,state,x,y); //button 0, state 0 means left mouse down SimdVector3 rayTo = GetRayTo(x,y); switch (button) { case 2: { if (state==0) { shootBox(rayTo); } break; }; case 1: { if (state==0) { //apply an impulse if (physicsEnvironmentPtr) { float hit[3]; float normal[3]; PHY_IPhysicsController* hitObj = physicsEnvironmentPtr->rayTest(0,eye[0],eye[1],eye[2],rayTo.getX(),rayTo.getY(),rayTo.getZ(),hit[0],hit[1],hit[2],normal[0],normal[1],normal[2]); if (hitObj) { CcdPhysicsController* physCtrl = static_cast<CcdPhysicsController*>(hitObj); RigidBody* body = physCtrl->GetRigidBody(); if (body) { body->SetActivationState(ACTIVE_TAG); SimdVector3 impulse = rayTo; impulse.normalize(); float impulseStrength = 10.f; impulse *= impulseStrength; SimdVector3 relPos( hit[0] - body->getCenterOfMassPosition().getX(), hit[1] - body->getCenterOfMassPosition().getY(), hit[2] - body->getCenterOfMassPosition().getZ()); body->applyImpulse(impulse,relPos); } } } } else { } break; } case 0: { if (state==0) { //add a point to point constraint for picking if (physicsEnvironmentPtr) { float hit[3]; float normal[3]; PHY_IPhysicsController* hitObj = physicsEnvironmentPtr->rayTest(0,eye[0],eye[1],eye[2],rayTo.getX(),rayTo.getY(),rayTo.getZ(),hit[0],hit[1],hit[2],normal[0],normal[1],normal[2]); if (hitObj) { CcdPhysicsController* physCtrl = static_cast<CcdPhysicsController*>(hitObj); RigidBody* body = physCtrl->GetRigidBody(); if (body) { pickedBody = body; pickedBody->SetActivationState(DISABLE_DEACTIVATION); SimdVector3 pickPos(hit[0],hit[1],hit[2]); SimdVector3 localPivot = body->getCenterOfMassTransform().inverse() * pickPos; gPickingConstraintId = physicsEnvironmentPtr->createConstraint(physCtrl,0,PHY_POINT2POINT_CONSTRAINT, localPivot.getX(), localPivot.getY(), localPivot.getZ(), 0,0,0); //printf("created constraint %i",gPickingConstraintId); //save mouse position for dragging gOldPickingPos = rayTo; SimdVector3 eyePos(eye[0],eye[1],eye[2]); gOldPickingDist = (pickPos-eyePos).length(); Point2PointConstraint* p2p = static_cast<Point2PointConstraint*>(physicsEnvironmentPtr->getConstraintById(gPickingConstraintId)); if (p2p) { //very weak constraint for picking p2p->m_setting.m_tau = 0.1f; } } } } } else { if (gPickingConstraintId && physicsEnvironmentPtr) { physicsEnvironmentPtr->removeConstraint(gPickingConstraintId); //printf("removed constraint %i",gPickingConstraintId); gPickingConstraintId = 0; pickedBody->ForceActivationState(ACTIVE_TAG); pickedBody->m_deactivationTime = 0.f; pickedBody = 0; } } break; } default: { } } }
void Fenettre::RenderMe() { #if FRAME_TIME <= 0 sf::Clock clock; #endif bool run = false; PositionCamera(); while(isOpen()) { sf::Event event; while(pollEvent(event)) { if (event.type == sf::Event::Closed) { close(); } else if ((event.type == sf::Event::KeyPressed) && (event.key.code == sf::Keyboard::Escape)) { close(); } else if ((event.type == sf::Event::KeyPressed) && (event.key.code == sf::Keyboard::Space)) { run = !run; } else if ((event.type == sf::Event::KeyPressed) && (event.key.code == sf::Keyboard::R)) { camera->setPosition(btVector3(-100,50,0)); } // Adjust the viewport when the window is resized else if (event.type == sf::Event::Resized) { glViewport(0, 0, event.size.width, event.size.height); } else if (run && event.type == sf::Event::MouseMoved) { camera->MouseMoved(); } else if (run && event.type == sf::Event::MouseWheelMoved) { camera->MouseWheelMoved(event); } else if (run && event.type == sf::Event::MouseButtonPressed) { shootBox(camera->GetCible()); } } // Clear color and depth buffer glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Update dynamics if (run) { #if FRAME_TIME <= 0 World->stepSimulation(clock.GetElapsedTime()); camera->animate(clock.GetElapsedTime()); #else World->stepSimulation(1.0f/FRAME_TIME); camera->animate(1.0f/FRAME_TIME); #endif PositionCamera(); } RenderScene(); glFlush(); display(); } };
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: { } } }