controllers, ray3
This commit is contained in:
		| @@ -48,110 +48,6 @@ public: | ||||
| 	b3RayCastSingleOutput hit; | ||||
| }; | ||||
|  | ||||
| class BodyDragger | ||||
| { | ||||
| public: | ||||
| 	BodyDragger(Ray3* ray, b3World* world) | ||||
| 	{ | ||||
| 		m_ray = ray; | ||||
| 		m_world = world; | ||||
| 		m_shape = nullptr; | ||||
| 		m_mouseJoint = nullptr; | ||||
| 	} | ||||
|  | ||||
| 	~BodyDragger() | ||||
| 	{ | ||||
|  | ||||
| 	} | ||||
| 	 | ||||
| 	bool StartDragging() | ||||
| 	{ | ||||
| 		B3_ASSERT(m_mouseJoint == nullptr); | ||||
|  | ||||
| 		b3RayCastSingleOutput out; | ||||
| 		if (m_world->RayCastSingle(&out, m_ray->A(), m_ray->B()) == false) | ||||
| 		{ | ||||
| 			return false; | ||||
| 		} | ||||
|  | ||||
| 		m_x = out.fraction; | ||||
| 		m_shape = out.shape; | ||||
|  | ||||
| 		b3BodyDef bd; | ||||
| 		b3Body* groundBody = m_world->CreateBody(bd); | ||||
| 		 | ||||
| 		b3Body* body = m_shape->GetBody(); | ||||
| 		body->SetAwake(true); | ||||
|  | ||||
| 		b3MouseJointDef jd; | ||||
| 		jd.bodyA = groundBody; | ||||
| 		jd.bodyB = body; | ||||
| 		jd.target = out.point; | ||||
| 		jd.maxForce = 2000.0f * body->GetMass(); | ||||
|  | ||||
| 		m_mouseJoint = (b3MouseJoint*)m_world->CreateJoint(jd); | ||||
|  | ||||
| 		m_p = body->GetLocalPoint(out.point); | ||||
|  | ||||
| 		return true; | ||||
| 	} | ||||
|  | ||||
| 	void Drag() | ||||
| 	{ | ||||
| 		B3_ASSERT(m_mouseJoint); | ||||
| 		m_mouseJoint->SetTarget(GetPointB()); | ||||
| 	} | ||||
|  | ||||
| 	void StopDragging() | ||||
| 	{ | ||||
| 		B3_ASSERT(m_mouseJoint); | ||||
|  | ||||
| 		b3Body* groundBody = m_mouseJoint->GetBodyA(); | ||||
| 		m_world->DestroyJoint(m_mouseJoint); | ||||
| 		m_mouseJoint = nullptr; | ||||
| 		m_world->DestroyBody(groundBody); | ||||
| 		m_shape = nullptr; | ||||
| 	} | ||||
|  | ||||
| 	bool IsSelected() const | ||||
| 	{ | ||||
| 		return m_mouseJoint != nullptr; | ||||
| 	} | ||||
|  | ||||
|  | ||||
| 	Ray3* GetRay() const | ||||
| 	{ | ||||
| 		return m_ray; | ||||
| 	} | ||||
|  | ||||
| 	b3Body* GetBody() const | ||||
| 	{ | ||||
| 		B3_ASSERT(m_shape); | ||||
| 		return m_shape->GetBody(); | ||||
| 	} | ||||
|  | ||||
| 	b3Vec3 GetPointA() const | ||||
| 	{ | ||||
| 		B3_ASSERT(m_shape); | ||||
| 		return m_shape->GetBody()->GetWorldPoint(m_p); | ||||
| 	} | ||||
|  | ||||
| 	b3Vec3 GetPointB() const | ||||
| 	{ | ||||
| 		B3_ASSERT(m_mouseJoint); | ||||
| 		return (1.0f - m_x) * m_ray->A() + m_x * m_ray->B(); | ||||
| 	} | ||||
|  | ||||
| private: | ||||
| 	Ray3* m_ray; | ||||
| 	float32 m_x; | ||||
|  | ||||
| 	b3World* m_world; | ||||
| 	b3Shape* m_shape; | ||||
| 	b3Vec3 m_p; | ||||
| 	b3MouseJoint* m_mouseJoint; | ||||
| }; | ||||
|  | ||||
| class Test : public b3ContactListener | ||||
| { | ||||
| public: | ||||
| @@ -162,9 +58,9 @@ public: | ||||
|  | ||||
| 	virtual void Step(); | ||||
|  | ||||
| 	virtual void MouseMove(const Ray3& pw); | ||||
| 	virtual void MouseLeftDown(const Ray3& pw); | ||||
| 	virtual void MouseLeftUp(const Ray3& pw); | ||||
| 	virtual void MouseMove(const b3Ray3& pw); | ||||
| 	virtual void MouseLeftDown(const b3Ray3& pw); | ||||
| 	virtual void MouseLeftUp(const b3Ray3& pw); | ||||
| 	virtual void KeyDown(int button) { } | ||||
| 	virtual void KeyUp(int button) { } | ||||
|  | ||||
| @@ -177,8 +73,8 @@ public: | ||||
|  | ||||
| 	b3World m_world; | ||||
|  | ||||
| 	Ray3 m_bodyRay; | ||||
| 	BodyDragger m_bodyDragger; | ||||
| 	b3Ray3 m_bodyRay; | ||||
| 	b3BodyDragger m_bodyDragger; | ||||
|  | ||||
| 	b3BoxHull m_groundHull; | ||||
| 	b3GridMesh<50, 50> m_groundMesh; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user