-
Notifications
You must be signed in to change notification settings - Fork 2
/
demo1.cpp
128 lines (110 loc) · 4.77 KB
/
demo1.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#include <iostream>
#include <osgGA/NodeTrackerManipulator>
#include <osgGA/StateSetManipulator>
#include <osgGA/TrackballManipulator>
#include <osgShadow/ShadowedScene>
#include <osgShadow/ShadowMap>
#include <osgViewer/CompositeViewer>
#include <osgViewer/Viewer>
#include <osgViewer/ViewerEventHandlers>
#include "lib/dynamic_box.h"
#include "lib/dynamic_cylinder.h"
#include "lib/dynamic_model.h"
#include "lib/dynamic_sphere.h"
#include "lib/dynamic_vehicle.h"
#include "lib/gldebugdrawer.h"
#include "lib/vehicle_keyboard_handler.h"
#include "lib/world.h"
void configureDisplay(World& world, osgViewer::CompositeViewer& viewer, osg::Group *scene) {
osg::GraphicsContext::WindowingSystemInterface* wsi =
osg::GraphicsContext::getWindowingSystemInterface();
if (!wsi) {
osg::notify(osg::NOTICE) << "Error, no WindowSystemInterface available, cannot create windows." << std::endl;
return;
}
unsigned int width, height;
wsi->getScreenResolution(osg::GraphicsContext::ScreenIdentifier(0), width, height);
osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;
traits->x = 100;
traits->y = 100;
traits->width = 1000;
traits->height = 800;
traits->windowDecoration = true;
traits->doubleBuffer = true;
traits->sharedContext = 0;
osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());
if (gc.valid()) {
osg::notify(osg::INFO)<<" GraphicsWindow has been created successfully."<<std::endl;
gc->setClearColor(osg::Vec4f(0.2f,0.2f,0.6f,1.0f));
gc->setClearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}
else {
osg::notify(osg::NOTICE)<<" GraphicsWindow has not been created successfully."<<std::endl;
}
osgViewer::View* view = new osgViewer::View;
view->setName("View one");
viewer.addView(view);
view->setSceneData(scene);
view->getCamera()->setName("Cam one");
view->getCamera()->setViewport(new osg::Viewport(0, 0, traits->width, traits->height));
view->getCamera()->setGraphicsContext(gc.get());
view->setCameraManipulator(new osgGA::TrackballManipulator);
view->addEventHandler(new osgViewer::StatsHandler);
view->addEventHandler(new osgViewer::HelpHandler);
view->addEventHandler(new osgViewer::WindowSizeHandler);
view->addEventHandler(new VehicleKeyboardHandler(&world));
osg::ref_ptr<osgGA::StateSetManipulator> statesetManipulator = new osgGA::StateSetManipulator;
statesetManipulator->setStateSet(view->getCamera()->getOrCreateStateSet());
view->addEventHandler( statesetManipulator.get() );
}
void createWorld(World &world, osg::Group *worldNode, btDynamicsWorld *dynamicsWorld) {
DynamicObject* ground = new DynamicModel("4wd.osga/models/demo1_ground.ive", btScalar(0));
ground->setPosition(0, 0, -3.5);
world.addDynamicObject("ground", ground);
DynamicVehicle* vehicle = new DynamicVehicle();
// vehicle->setPosition(0, 0, 20);
world.addDynamicObject("vehicle", vehicle);
}
int main(int argc, char *argv[]) {
osg::ref_ptr<osg::Group> root = new osg::Group();
osgViewer::CompositeViewer viewer;
osg::ref_ptr<osgShadow::ShadowedScene> shadowedScene = new osgShadow::ShadowedScene;
root->addChild(shadowedScene.get());
/*
const int ReceivesShadowTraversalMask = 0x1;
const int CastsShadowTraversalMask = 0x2;
shadowedScene->setReceivesShadowTraversalMask(ReceivesShadowTraversalMask);
shadowedScene->setCastsShadowTraversalMask(CastsShadowTraversalMask);
osg::ref_ptr<osgShadow::ShadowMap> sm = new osgShadow::ShadowMap;
shadowedScene->setShadowTechnique(sm.get());
int mapres = 1024;
sm->setTextureSize(osg::Vec2s(mapres,mapres));
*/
osg::Group* lightGroup = new osg::Group;
osg::Light* light = new osg::Light;
light->setLightNum(0);
light->setPosition(osg::Vec4(0, 0, 10, 1.0f));
light->setAmbient(osg::Vec4(1.0f, 1.0f, 1.0f, 1.0f));
light->setDiffuse(osg::Vec4(1.0f, 1.0f, 1.0f, 1.0f));
light->setSpotCutoff(90.0f);
light->setSpotExponent(0.0f);
light->setDirection(osg::Vec3(0.0f, 0.0f, -1.0f));
light->setLinearAttenuation(0.1);
osg::LightSource* light_source = new osg::LightSource;
light_source->setLight(light);
light_source->setLocalStateSetModes(osg::StateAttribute::ON);
lightGroup->addChild(light_source);
shadowedScene->addChild(lightGroup);
World world;
world.setRoot(shadowedScene.get());
createWorld(world, shadowedScene.get(), world.getDynamics());
btDynamicsWorld *dynamicsWorld = world.getDynamics();
GLDebugDrawer* debug_drawer = new GLDebugDrawer();
// debug_drawer->setDebugMode(btIDebugDraw::DBG_MAX_DEBUG_DRAW_MODE);
debug_drawer->setDebugMode(btIDebugDraw::DBG_DrawConstraints|btIDebugDraw::DBG_DrawConstraintLimits|btIDebugDraw::DBG_FastWireframe);
dynamicsWorld->setDebugDrawer(debug_drawer);
root->addChild(debug_drawer->getSceneGraph());
configureDisplay(world, viewer, root.get());
world.render(&viewer, debug_drawer);
return 0;
}