BulletObject::BulletObject(Scene * scene, btCollisionWorld *collisionWorld, UserNode *_userNode, const Matrix4 &pWorldTransform) :collWorld(collisionWorld), collisionPartTransform(&((Matrix4&)pWorldTransform)), userNode(_userNode), updateFlag(true), shape(NULL), collisionObject(0), trimesh(0), meshNode(0), entity(0), box(0) { CreateBoxObject(); }
void BulletObject::UpdateCollisionObject() { if (!updateFlag) return; if (!(*collisionPartTransform == createdWith)) { DeleteCollisionObject(); if(box) CreateFromAABox(); else if(entity) CreateFromEntity(); else if(meshNode) CreateCollisionObject(); else if(userNode) CreateBoxObject(); } /* btTransform btt; btt.setIdentity(); //scale Vector3 scale = collisionPartTransform->GetScaleVector(); shape->setLocalScaling(btVector3(scale.x, scale.y, scale.z)); //origin Vector3 origin = collisionPartTransform->GetTranslationVector(); btt.setOrigin(btVector3(origin.x, origin.y, origin.z)); //rotation Quaternion qt; qt.Construct(*collisionPartTransform); btt.setRotation(btQuaternion(qt.x, qt.y, qt.z, qt.w)); btt.setFromOpenGLMatrix(collisionPartTransform->data); collisionObject->setWorldTransform(btt); */ }
virtual bool BulldozerTest::Setup(Pint& pint, const PintCaps& caps) { CreateMeshesFromRegisteredSurfaces(pint, caps, *this, &mHighFrictionMaterial); VehicleData* UserData = ICE_NEW(VehicleData); pint.mUserData = UserData; const float TrackWidth = mInsideCylinder.mHalfHeight + mOutsideCylinder.mHalfHeight*2.0f; const float TrackGap = 0.1f; const Point ChassisExtents(3.0f, 2.0f, 1.0f); const float GroundClearance = 0.5f; const Point ChassisPos(0.0f, ChassisExtents.y+GroundClearance, 0.0f); const float ChassisMass = 100.0f; const float ChassisGap = (TrackWidth+TrackGap)*2.0f; const float SideDistToGround = 0.5f*2.0f; const Point SideExtents(4.0f, 0.2f, 0.2f); const Point LeftSidePos(SideExtents.x-ChassisExtents.x, SideExtents.y+SideDistToGround, -ChassisExtents.z-ChassisGap-SideExtents.z); const Point RightSidePos(SideExtents.x-ChassisExtents.x, SideExtents.y+SideDistToGround, ChassisExtents.z+ChassisGap+SideExtents.z); const float SideMass = 1.0f; PINT_BOX_CREATE ChassisBoxDesc; ChassisBoxDesc.mExtents = ChassisExtents; ChassisBoxDesc.mRenderer = CreateBoxRenderer(ChassisExtents); PintObjectHandle ChassisObject = null; if(1) { // Caterpillar tracks const udword NbGears = 3; Point GearOffsets[3]; const float GearMass = 10.0f; GearOffsets[0] = Point(0.0f, 2.0f, 0.0f); GearOffsets[1] = Point(-2.0f, 0.0f, 0.0f); GearOffsets[2] = Point(2.0f, 0.0f, 0.0f); if(0) { CaterpillarTrackObjects CTO; for(udword i=0;i<2;i++) { const float Coeff = i ? -1.0f : 1.0f; const Point Pos(0.0f, 1.5f, Coeff*(ChassisExtents.z+TrackGap+TrackWidth)); CreateCaterpillarTrackWIP(pint, CTO, &mHighFrictionMaterial, Pos, mInsideCylinder, GetRegisteredRenderers()[0], mOutsideCylinder, GetRegisteredRenderers()[1], NbGears, GearOffsets, GearMass ); } } else { PINT_SHAPE_CREATE* StartShape = null; PINT_SHAPE_CREATE* CurrentShape = null; for(udword i=0;i<2;i++) { const float Coeff = i ? -1.0f : 1.0f; /*const*/ Point Pos(0.0f, 1.5f, Coeff*(ChassisExtents.z+TrackGap+TrackWidth)); Pos -= ChassisPos; { Point GearCenter(0.0f, 0.0f, 0.0f); for(udword i=0;i<NbGears;i++) { const Point GearPos = Pos + GearOffsets[i]; GearCenter += GearPos; } GearCenter /= float(NbGears); StartShape = CreateGearHolderShapes(StartShape, CurrentShape, Pos, GearCenter, NbGears, GearOffsets, mInsideCylinder, &mHighFrictionMaterial, GearCenter); } } PintObjectHandle GearHolder = null; if(StartShape) { if(1) { ChassisBoxDesc.mNext = StartShape; PINT_OBJECT_CREATE ChassisObjectDesc; ChassisObjectDesc.mPosition = ChassisPos; ChassisObjectDesc.mShapes = &ChassisBoxDesc; ChassisObjectDesc.mMass = ChassisMass; GearHolder = CreatePintObject(pint, ChassisObjectDesc); ChassisObject = GearHolder; } else { PINT_OBJECT_CREATE ObjectDesc; ObjectDesc.mShapes = StartShape; ObjectDesc.mMass = 10.0f; ObjectDesc.mPosition = Point(0.0f, 0.0f, 0.0f); GearHolder = CreatePintObject(pint, ObjectDesc); } while(StartShape) { PINT_SHAPE_CREATE* NextShape = const_cast<PINT_SHAPE_CREATE*>(StartShape->mNext); DELETESINGLE(StartShape); StartShape = NextShape; } } if(1) { UserData->mChassis = GearHolder; UserData->mFront[0].mParent = GearHolder; UserData->mFront[1].mParent = GearHolder; UserData->mRear[0].mParent = GearHolder; UserData->mRear[1].mParent = GearHolder; for(udword i=0;i<2;i++) { const float Coeff = i ? -1.0f : 1.0f; /*const*/ Point Pos(0.0f, 1.5f, Coeff*(ChassisExtents.z+TrackGap+TrackWidth)); Point GearCenter(0.0f, 0.0f, 0.0f); for(udword j=0;j<NbGears;j++) { const Point GearPos = Pos + GearOffsets[j]; GearCenter += GearPos; } GearCenter /= float(NbGears); GearCenter -= ChassisPos; CaterpillarTrackObjects CTO; CreateCaterpillarTrackWIP(pint, CTO, &mHighFrictionMaterial, Pos, mInsideCylinder, GetRegisteredRenderers()[0], mOutsideCylinder, GetRegisteredRenderers()[1], NbGears, GearOffsets, GearMass, GearHolder, &GearCenter); { UserData->mFront[i].mWheel = CTO.mGears[1]; UserData->mRear[i].mWheel = CTO.mGears[2]; } } } } } PintObjectHandle LeftSideObject = CreateBoxObject(pint, SideExtents, LeftSidePos, SideMass); PintObjectHandle RightSideObject = CreateBoxObject(pint, SideExtents, RightSidePos, SideMass); const Point HingeAxis(0.0f, 0.0f, 1.0f); CreateHinge(pint, ChassisObject, LeftSideObject, Point(-ChassisExtents.x, -ChassisExtents.y+SideExtents.y, -ChassisExtents.z-ChassisGap), Point(-SideExtents.x, 0.0f, SideExtents.z), HingeAxis, HingeAxis); CreateHinge(pint, ChassisObject, RightSideObject, Point(-ChassisExtents.x, -ChassisExtents.y+SideExtents.y, ChassisExtents.z+ChassisGap), Point(-SideExtents.x, 0.0f, -SideExtents.z), HingeAxis, HingeAxis); // Blade if(1) { const float BladeMinSize = ChassisExtents.z + ChassisGap + SideExtents.z * 2.0f; const float BladeSize = BladeMinSize + 0.5f; const Point BladeExtents(0.1f, 0.75f, BladeSize); const Point BladePos( LeftSidePos.x + SideExtents.x + BladeExtents.x, SideDistToGround + BladeExtents.y, 0.0f); const float BladeMass = 1.0f; PintObjectHandle BladeObject = CreateBoxObject(pint, BladeExtents, BladePos, BladeMass); const float dz = fabsf(BladePos.z - LeftSidePos.z); CreateHinge(pint, BladeObject, LeftSideObject, Point(-BladeExtents.x, -BladeExtents.y+SideExtents.y, -dz), Point(SideExtents.x, 0.0f, 0.0f), HingeAxis, HingeAxis); CreateHinge(pint, BladeObject, RightSideObject, Point(-BladeExtents.x, -BladeExtents.y+SideExtents.y, dz), Point(SideExtents.x, 0.0f, 0.0f), HingeAxis, HingeAxis); { const Point Ext1(-BladeExtents.x, BladeExtents.y, dz); const Point p1 = BladePos + Ext1; const Point Ext0(0.0f, SideExtents.y, 0.0f); const Point p0 = RightSidePos + Ext0; CreatePrismatic(pint, p0, p1, RightSideObject, Ext0, BladeObject, Ext1); } { const Point Ext1(-BladeExtents.x, BladeExtents.y, -dz); const Point p1 = BladePos + Ext1; const Point Ext0(0.0f, SideExtents.y, 0.0f); const Point p0 = LeftSidePos + Ext0; CreatePrismatic(pint, p0, p1, LeftSideObject, Ext0, BladeObject, Ext1); } for(udword i=0;i<2;i++) { const float Coeff = i ? -1.0f : 1.0f; const float Offset = Coeff*0.5f; const Point Ext0(ChassisExtents.x, ChassisExtents.y, Offset); const Point p0 = ChassisPos + Ext0; const Point Ext1(-BladeExtents.x, 0.0f, Offset); const Point p1 = BladePos + Ext1; CreatePrismatic(pint, p0, p1, ChassisObject, Ext0, BladeObject, Ext1); } } if(1) { PINT_CONVEX_CREATE ConvexCreate[14]; MyConvex C[14]; for(udword i=0;i<14;i++) { C[i].LoadFile(i); ConvexCreate[i].mNbVerts = C[i].mNbVerts; ConvexCreate[i].mVerts = C[i].mVerts; ConvexCreate[i].mRenderer = CreateConvexRenderer(ConvexCreate[i].mNbVerts, ConvexCreate[i].mVerts); } const float Amplitude = 1.5f; const udword NbLayers = 12; const udword NbX = 12+4; const udword NbY = 12+4; BasicRandom Rnd(42); for(udword j=0;j<NbLayers;j++) { const float Scale = 4.0f; for(udword y=0;y<NbY;y++) { for(udword x=0;x<NbX;x++) { const float xf = (float(x)-float(NbX)*0.5f)*Scale; const float yf = (float(y)-float(NbY)*0.5f)*Scale; const Point pos = Point(xf+40.0f, Amplitude + (Amplitude * 2.0f * float(j)), yf); const udword Index = 10 + Rnd.Randomize() % 4; PintObjectHandle Handle = CreateSimpleObject(pint, &ConvexCreate[Index], 0.1f, pos); ASSERT(Handle); } } } } return true; }