Exemple #1
0
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();
}
Exemple #2
0
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;
	}