void Tutorial::tutorial2Update(float deltaTime) { for (int i=0;i<m_bodies.size();i++) { m_bodies[i]->m_gravityAcceleration.setValue(0,-10,0); } }
virtual void renderScene() { m_app->m_renderer->renderScene(); m_app->drawText3D("X",1,0,0,1); m_app->drawText3D("Y",0,1,0,1); m_app->drawText3D("Z",0,0,1,1); for (int i=0;i<m_contactPoints.size();i++) { const LWContactPoint& contact = m_contactPoints[i]; b3Vector3 color=b3MakeVector3(1,1,0); float lineWidth=3; if (contact.m_distance<0) { color.setValue(1,0,0); } m_app->m_renderer->drawLine(contact.m_ptOnAWorld,contact.m_ptOnBWorld,color,lineWidth); } }
void ShipComponentDataWeapon::getAttributes(stdvector<std::pair<std::string, Unicode::String> >::fwd & data) const { ServerShipComponentData::getAttributes(data); Unicode::String attrib; static char buffer[128]; static const size_t buffer_size = sizeof (buffer); snprintf(buffer, buffer_size, "%.1f-%.1f", m_weaponDamageMinimum, m_weaponDamageMaximum); attrib = Unicode::narrowToWide(buffer); data.push_back(std::make_pair(cm_shipComponentCategory + SharedObjectAttributes::ship_component_weapon_damage, attrib)); snprintf(buffer, buffer_size, "%.3f", m_weaponEffectivenessShields); attrib = Unicode::narrowToWide(buffer); data.push_back(std::make_pair(cm_shipComponentCategory + SharedObjectAttributes::ship_component_weapon_effectiveness_shields, attrib)); snprintf(buffer, buffer_size, "%.3f", m_weaponEffectivenessArmor); attrib = Unicode::narrowToWide(buffer); data.push_back(std::make_pair(cm_shipComponentCategory + SharedObjectAttributes::ship_component_weapon_effectiveness_armor, attrib)); snprintf(buffer, buffer_size, "%.1f", m_weaponEnergyPerShot); attrib = Unicode::narrowToWide(buffer); data.push_back(std::make_pair(cm_shipComponentCategory + SharedObjectAttributes::ship_component_weapon_energy_per_shot, attrib)); snprintf(buffer, buffer_size, "%.3f", m_weaponRefireRate); attrib = Unicode::narrowToWide(buffer); data.push_back(std::make_pair(cm_shipComponentCategory + SharedObjectAttributes::ship_component_weapon_refire_rate, attrib)); if(m_weaponAmmoMaximum != 0) { IGNORE_RETURN(_itoa(m_weaponAmmoCurrent, buffer, 10)); attrib = Unicode::narrowToWide(buffer); attrib += cm_slash; IGNORE_RETURN(_itoa(m_weaponAmmoMaximum, buffer, 10)); attrib += Unicode::narrowToWide(buffer); data.push_back(std::make_pair(cm_shipComponentCategory + SharedObjectAttributes::ship_component_weapon_ammo, attrib)); } }
void Tutorial::tutorial1Update(float deltaTime) { for (int i=0;i<m_bodies.size();i++) { switch (m_stage) { case 0: { m_bodies[i]->m_angularVelocity=b3MakeVector3(0,0,0); m_bodies[i]->m_linearVelocity=b3MakeVector3(1,0,0); break; } case 1: { m_bodies[i]->m_linearVelocity=b3MakeVector3(-1,0,0); break; } case 2: { m_bodies[i]->m_linearVelocity=b3MakeVector3(0,1,0); break; } case 3: { m_bodies[i]->m_linearVelocity=b3MakeVector3(0,-1,0); break; } case 4: { m_bodies[i]->m_linearVelocity=b3MakeVector3(0,0,1); break; } case 5: { m_bodies[i]->m_linearVelocity=b3MakeVector3(0,0,-1); break; } case 6: { m_bodies[i]->m_linearVelocity=b3MakeVector3(0,0,0); m_bodies[i]->m_angularVelocity=b3MakeVector3(1,0,0); break; } case 7: { m_bodies[i]->m_angularVelocity=b3MakeVector3(-1,0,0); break; } case 8: { m_bodies[i]->m_angularVelocity=b3MakeVector3(0,1,0); break; } case 9: { m_bodies[i]->m_angularVelocity=b3MakeVector3(0,-1,0); break; } case 10: { m_bodies[i]->m_angularVelocity=b3MakeVector3(0,0,1); break; } case 11: { m_bodies[i]->m_angularVelocity=b3MakeVector3(0,0,-1); break; } default: { m_bodies[i]->m_angularVelocity=b3MakeVector3(0,0,0); } }; } m_counter++; if (m_counter>60) { m_counter=0; m_stage++; if (m_stage>11) m_stage=0; b3Printf("Stage = %d\n",m_stage); b3Printf("linVel = %f,%f,%f\n",m_bodies[0]->m_linearVelocity.x,m_bodies[0]->m_linearVelocity.y,m_bodies[0]->m_linearVelocity.z); b3Printf("angVel = %f,%f,%f\n",m_bodies[0]->m_angularVelocity.x,m_bodies[0]->m_angularVelocity.y,m_bodies[0]->m_angularVelocity.z); } }
virtual void stepSimulation(float deltaTime) { switch (m_tutorialIndex) { case TUT_VELOCITY: { tutorial1Update(deltaTime); float xPos = m_bodies[0]->m_worldPose.m_position.x; float xVel = m_bodies[0]->m_linearVelocity.x; m_timeSeriesCanvas0->insertDataAtCurrentTime(xPos,0,true); m_timeSeriesCanvas0->insertDataAtCurrentTime(xVel,1,true); break; } case TUT_ACCELERATION: { tutorial2Update(deltaTime); float yPos = m_bodies[0]->m_worldPose.m_position.y; float yVel = m_bodies[0]->m_linearVelocity.y; m_timeSeriesCanvas1->insertDataAtCurrentTime(yPos,0,true); m_timeSeriesCanvas1->insertDataAtCurrentTime(yVel,1,true); break; } case TUT_COLLISION: { m_contactPoints.clear(); LWContactPoint contactPoint; tutorialCollisionUpdate(deltaTime, contactPoint); m_contactPoints.push_back(contactPoint); m_timeSeriesCanvas1->insertDataAtCurrentTime(contactPoint.m_distance,0,true); break; } case TUT_SOLVE_CONTACT_CONSTRAINT: { m_contactPoints.clear(); LWContactPoint contactPoint; tutorialSolveContactConstraintUpdate(deltaTime, contactPoint); m_contactPoints.push_back(contactPoint); if (contactPoint.m_distance<0) { m_bodies[0]->computeInvInertiaTensorWorld(); m_bodies[1]->computeInvInertiaTensorWorld(); b3Scalar appliedImpulse = resolveCollision(*m_bodies[0], *m_bodies[1], contactPoint ); m_timeSeriesCanvas1->insertDataAtCurrentTime(appliedImpulse,1,true); } else { m_timeSeriesCanvas1->insertDataAtCurrentTime(0.,1,true); } m_timeSeriesCanvas1->insertDataAtCurrentTime(contactPoint.m_distance,0,true); break; } default: { } }; if (m_timeSeriesCanvas0) m_timeSeriesCanvas0->nextTick(); if (m_timeSeriesCanvas1) m_timeSeriesCanvas1->nextTick(); for (int i=0;i<m_bodies.size();i++) { m_bodies[i]->integrateAcceleration(deltaTime); m_bodies[i]->integrateVelocity(deltaTime); m_app->m_renderer->writeSingleInstanceTransformToCPU(m_bodies[i]->m_worldPose.m_position, m_bodies[i]->m_worldPose.m_orientation, m_bodies[i]->m_graphicsIndex); } m_app->m_renderer->writeTransforms(); }
Tutorial(GUIHelperInterface* guiHelper, int tutorialIndex) :m_app(guiHelper->getAppInterface()), m_guiHelper(guiHelper), m_tutorialIndex(tutorialIndex), m_stage(0), m_counter(0), m_timeSeriesCanvas0(0), m_timeSeriesCanvas1(0) { int numBodies = 1; m_app->setUpAxis(1); m_app->m_renderer->enableBlend(true); switch (m_tutorialIndex) { case TUT_VELOCITY: { numBodies=10; m_timeSeriesCanvas0 = new TimeSeriesCanvas(m_app->m_2dCanvasInterface,512,256,"Constant Velocity"); m_timeSeriesCanvas0 ->setupTimeSeries(2,60, 0); m_timeSeriesCanvas0->addDataSource("X position (m)", 255,0,0); m_timeSeriesCanvas0->addDataSource("X velocity (m/s)", 0,0,255); m_timeSeriesCanvas0->addDataSource("dX/dt (m/s)", 0,0,0); break; } case TUT_ACCELERATION: { numBodies=10; m_timeSeriesCanvas1 = new TimeSeriesCanvas(m_app->m_2dCanvasInterface,256,512,"Constant Acceleration"); m_timeSeriesCanvas1 ->setupTimeSeries(50,60, 0); m_timeSeriesCanvas1->addDataSource("Y position (m)", 255,0,0); m_timeSeriesCanvas1->addDataSource("Y velocity (m/s)", 0,0,255); m_timeSeriesCanvas1->addDataSource("dY/dt (m/s)", 0,0,0); break; } case TUT_COLLISION: { numBodies=2; m_timeSeriesCanvas1 = new TimeSeriesCanvas(m_app->m_2dCanvasInterface,512,200,"Distance"); m_timeSeriesCanvas1 ->setupTimeSeries(1.5,60, 0); m_timeSeriesCanvas1->addDataSource("distance", 255,0,0); break; } case TUT_SOLVE_CONTACT_CONSTRAINT: { numBodies=2; m_timeSeriesCanvas1 = new TimeSeriesCanvas(m_app->m_2dCanvasInterface,512,200,"Collision Impulse"); m_timeSeriesCanvas1 ->setupTimeSeries(1.5,60, 0); m_timeSeriesCanvas1->addDataSource("Distance", 0,0,255); m_timeSeriesCanvas1->addDataSource("Impulse magnutide", 255,0,0); { SliderParams slider("Restitution",&gRestitution); slider.m_minVal=0; slider.m_maxVal=1; m_guiHelper->getParameterInterface()->registerSliderFloatParameter(slider); } { SliderParams slider("Mass A",&gMassA); slider.m_minVal=0; slider.m_maxVal=100; m_guiHelper->getParameterInterface()->registerSliderFloatParameter(slider); } { SliderParams slider("Mass B",&gMassB); slider.m_minVal=0; slider.m_maxVal=100; m_guiHelper->getParameterInterface()->registerSliderFloatParameter(slider); } break; } default: { m_timeSeriesCanvas0 = new TimeSeriesCanvas(m_app->m_2dCanvasInterface,512,256,"Unknown"); m_timeSeriesCanvas0 ->setupTimeSeries(1,60, 0); } }; if (m_tutorialIndex==TUT_VELOCITY) { int boxId = m_app->registerCubeShape(100,1,100); b3Vector3 pos = b3MakeVector3(0,-3.5,0); b3Quaternion orn(0,0,0,1); b3Vector4 color = b3MakeVector4(1,1,1,1); b3Vector3 scaling = b3MakeVector3(1,1,1); m_app->m_renderer->registerGraphicsInstance(boxId,pos,orn,color,scaling); } for (int i=0;i<numBodies;i++) { m_bodies.push_back(new LWRigidBody()); } for (int i=0;i<m_bodies.size();i++) { m_bodies[i]->m_worldPose.m_position.setValue((i/4)*5,3,(i&3)*5); } { int textureIndex = -1; if (1) { int width,height,n; const char* filename = "data/cube.png"; const unsigned char* image=0; const char* prefix[]={"./","../","../../","../../../","../../../../"}; int numprefix = sizeof(prefix)/sizeof(const char*); for (int i=0;!image && i<numprefix;i++) { char relativeFileName[1024]; sprintf(relativeFileName,"%s%s",prefix[i],filename); image = stbi_load(relativeFileName, &width, &height, &n, 0); } b3Assert(image); if (image) { textureIndex = m_app->m_renderer->registerTexture(image,width,height); } } // int boxId = m_app->registerCubeShape(1,1,1,textureIndex); int boxId = m_app->registerGraphicsUnitSphereShape(SPHERE_LOD_HIGH, textureIndex); b3Vector4 color = b3MakeVector4(1,1,1,0.8); b3Vector3 scaling = b3MakeVector3(SPHERE_RADIUS,SPHERE_RADIUS,SPHERE_RADIUS); for (int i=0;i<m_bodies.size();i++) { m_bodies[i]->m_collisionShape.m_sphere.m_radius = SPHERE_RADIUS; m_bodies[i]->m_collisionShape.m_type = LW_SPHERE_TYPE; m_bodies[i]->m_graphicsIndex = m_app->m_renderer->registerGraphicsInstance(boxId,m_bodies[i]->m_worldPose.m_position, m_bodies[i]->m_worldPose.m_orientation,color,scaling); m_app->m_renderer->writeSingleInstanceTransformToCPU(m_bodies[i]->m_worldPose.m_position, m_bodies[i]->m_worldPose.m_orientation, m_bodies[i]->m_graphicsIndex); } } if (m_tutorialIndex == TUT_SOLVE_CONTACT_CONSTRAINT) { m_bodies[0]->m_invMass = gMassA? 1./gMassA : 0; m_bodies[0]->m_collisionShape.m_sphere.computeLocalInertia(gMassA,m_bodies[0]->m_localInertia); m_bodies[1]->m_invMass =gMassB? 1./gMassB : 0; m_bodies[1]->m_collisionShape.m_sphere.computeLocalInertia(gMassB,m_bodies[1]->m_localInertia); if (gMassA) m_bodies[0]->m_linearVelocity.setValue(0,0,1); if (gMassB) m_bodies[1]->m_linearVelocity.setValue(0,0,-1); } m_app->m_renderer->writeTransforms(); }