#include #include #include #include #include "Car3DS.h" #include "CarSimple.h" #include "random_utils/LogManager.h" #include "random_utils/ThreadSafeCanvas.h" #include "PhysicsManager.h" #include "PhysicsBody.h" #include "PhysicsJointBall.h" #include "SamplePlane.h" #include "SampleBox.h" #include "PlaneShape.h" #include "BoxShape.h" using namespace VRS; using namespace vrsode; class VrsTest : public SharedObj { public: VrsTest(); private: void keyEvent(); SO m_keyCallBack; SO m_canvas; SO m_rootNode; SO m_boxBody; SO m_ballJoint; }; VrsTest::VrsTest() { // initialize glut and create canvas for this application m_canvas = new random_utils::ThreadSafeCanvas( "VrsTest", 1024, 768, GLCanvas::RGBDDS); // create scene graph root m_rootNode = new SceneThing(); // attach some background color m_rootNode->append(new BackgroundGL(Color(0.2), Color(0.9), BackgroundGL::TopToBottom)); // attach some nice green color as default m_rootNode->append(new ShapeMaterialGL( Color(0.5, 1.0, 0.5), Color(0.15, 0.3, 0.15))); m_rootNode->append(new TransparencyTechniqueGL()); SO geometryRoot = new SceneThing(m_rootNode); SO boxNode = new SceneThing(geometryRoot); boxNode->append(new Box(Vector(-5,-5,-5), Vector(5,5,5))); m_boxBody = new vrsode::PhysicsBody(boxNode, CS_Sphere); SO groundNode = new SceneThing(geometryRoot); groundNode->append(new Box(Vector(-100,-20,-100), Vector(100,-15,100))); SO groundShape = new PlaneShape(Vector(0,1,0), -15); SO groundBody = new CollisionBody(groundNode, groundShape); m_ballJoint = new PhysicsJointBall(m_boxBody, 0, Vector(5,5,5)); SO jointVisNode = new SceneThing(geometryRoot); jointVisNode->append(new Box(Vector(4,4,4), Vector(6,6,6))); // create a camera SO view = new SceneThing(); view->append(new Camera( new Perspective(72, 0.1, 200.0), new LookAt(Vector(-70,6,40), Vector(0,0,0)))); // let there be light view->append(new DistantLight(Vector(1,1,1))); view->append(new PointLight(Vector(0,1,-2))); m_canvas->append(view); m_canvas->append(m_rootNode); // create and connect behaviors m_canvas->append(new TrackBall(m_rootNode)); // add keyboard callback m_canvas->append(m_keyCallBack = new BehaviorCallback()); m_keyCallBack->setCanvasCallback( new MethodCallback(this, &VrsTest::keyEvent)); m_keyCallBack->activate(); PhysicsManager::get()->startThread(); } void VrsTest::keyEvent() { KeyEvent* event = VRS_Cast(KeyEvent, m_keyCallBack->currentCanvasEvent()); if(event != NULL && event->pressed ()) switch(event->keyCode()) { case Key::Escape: exit(0); break; case Key::Up: m_boxBody->addForce(Vector(0,50,0)); m_boxBody->addTorque(Vector(10,1,1)); break; case Key::Down: m_boxBody->setDebugNode(!(m_boxBody->debugNode())); break; } if(event != NULL && event->released()) switch(event->keyCode()) { } m_canvas->postForRedisplay(); } // don't let SDL rename our main #ifdef __APPLE__ #undef main #endif int main(int p_argc, char** p_argv) { glutInit(&p_argc, p_argv); SDL_Init(SDL_INIT_EVENTTHREAD | SDL_INIT_TIMER); SO application = new VrsTest; glutMainLoop(); SDL_Quit(); return 0; }