00001 #include <stdio.h>
00002
00003 #include <vrs/sg/scenething.h>
00004
00005 #include <vrsode/PlaneShape.h>
00006
00007 #include "ReloadPlane.h"
00008
00009 using namespace VRS;
00010 using namespace vrsode;
00011
00012
00013 namespace random_racer
00014 {
00015
00016 ReloadPlane::PlaneWrapper::PlaneWrapper(
00017 SO<SceneThing> p_parent,
00018 SO<vrsode::Shape> p_shape,
00019 SO<ReloadPlane> p_reloadPlane) : CollisionBody(p_parent, p_shape)
00020 {
00021 m_reloadPlane = p_reloadPlane;
00022 }
00023
00024 ReloadPlane::PlaneWrapper::~PlaneWrapper()
00025 {
00026 }
00027
00028 void
00029 ReloadPlane::PlaneWrapper::handleCollision(SO<CollisionBody> p_partner)
00030 {
00031 m_reloadPlane->handleCollisionFromThread();
00032 }
00033
00034
00035 ReloadPlane::ReloadPlane(
00036 SO<SceneThing> p_parentThing,
00037 SO<Callback1<unsigned int> > p_collisionCallback,
00038 unsigned int p_id,
00039 bool p_propagate)
00040 {
00041 m_parentThing = p_parentThing;
00042 m_callback = p_collisionCallback;
00043 m_planeId = p_id;
00044 m_propagate = p_propagate;
00045
00046 m_sceneThing = new SceneThing(m_parentThing);
00047 m_shape = new PlaneShape(Vector(0,1,0),0.0);
00048
00049 m_ownBody = new PlaneWrapper(m_sceneThing, m_shape, this);
00050
00051 m_ownBody->surface()->setGhostMode(true);
00052 m_ownBody->setCollisionPartnerCategories(1);
00053
00054 m_collidedRecently = false;
00055
00056 m_gotIt = false;
00057 }
00058
00059 ReloadPlane::~ReloadPlane()
00060 {
00061 m_parentThing->remove(m_sceneThing);
00062 }
00063
00064 void
00065 ReloadPlane::handleCollisionFromThread()
00066 {
00067 if(m_propagate)
00068 {
00069 lock();
00070
00071 if(m_gotIt == false)
00072 m_collidedRecently = true;
00073
00074 else
00075 {
00076 m_gotIt = false;
00077
00078 }
00079
00080 unlock();
00081 }
00082 else
00083 m_callback->callback(m_planeId);
00084 }
00085
00086 void
00087 ReloadPlane::checkForCollision()
00088 {
00089 bool wasLocked = false;
00090
00091 lock();
00092
00093 if(m_collidedRecently)
00094 {
00095 m_collidedRecently = false;
00096
00097 if(m_gotIt == false)
00098 {
00099 wasLocked = true;
00100 m_gotIt = true;
00101 }
00102
00103
00104 }
00105
00106 unlock();
00107
00108 if(wasLocked)
00109 m_callback->callback(m_planeId);
00110 }
00111
00112 }