
#include <iostream>
#include <stdexcept>

#include <osg/PositionAttitudeTransform>
#include <osg/ShapeDrawable>
#include <osgShadow/ShadowedScene>
#include <osgShadow/ShadowMap>
#include <osgViewer/Viewer>



namespace
{

	void application(int argc, char * argv[]);

}



int main(int argc, char * argv[])
{
	try
	{
		application(argc, argv);
	}

	catch (const std::exception & error)
	{
		std::cerr << "ERROR: " << error.what() << std::endl;
	}

	catch (...)
	{
		std::cerr << "ERROR: unhandled excepion" << std::endl;
	}
}



namespace {



void application(int argc, char * argv[])
{
	using namespace osg;

	ArgumentParser args(&argc, argv);

	osgViewer::Viewer viewer(args);

	ref_ptr<Geode> ball_geode(new Geode);
	ball_geode->addDrawable(new ShapeDrawable(new Sphere(Vec3(0,0,0), 0.01)));

	ref_ptr<PositionAttitudeTransform> ball_pat(new PositionAttitudeTransform);
	ball_pat->addChild(ball_geode.get());

	ref_ptr<osgShadow::ShadowedScene> shadowed_scene(new osgShadow::ShadowedScene);
	ref_ptr<osgShadow::ShadowMap> shadow_map(new osgShadow::ShadowMap);

	shadowed_scene->setShadowTechnique(shadow_map.get());
	shadowed_scene->addChild(ball_pat.get());

	ref_ptr<Group> root(new Group);
	root->addChild(shadowed_scene.get());

	viewer.setSceneData(root.get());
	//viewer.setThreadingModel(osgViewer::ViewerBase::SingleThreaded);

	viewer.run();
}



} // namespace

