Exemple #1
0
/* Copyright 2014 <Piotr Derkowski> */

#include "terrains.hpp"
#include "TextureUtils.hpp"

const sf::VertexArray textures::terrains::hills = makeQuad(96, 48, sf::Vector2f(1, 197));
const sf::VertexArray textures::terrains::mountains = makeQuad(96, 48, sf::Vector2f(1, 197));
const sf::VertexArray textures::terrains::grassland = makeQuad(96, 48, sf::Vector2f(1, 99));
const sf::VertexArray textures::terrains::river = makeQuad(96, 48, sf::Vector2f(1, 99));
const sf::VertexArray textures::terrains::plains = makeQuad(96, 48, sf::Vector2f(1, 50));
const sf::VertexArray textures::terrains::forest = makeQuad(96, 48, sf::Vector2f(1, 50));
const sf::VertexArray textures::terrains::desert = makeQuad(96, 48, sf::Vector2f(1, 1));

const sf::VertexArray textures::terrains::visibleKnown = makeQuad(96, 48, sf::Vector2f(98, 50));
const sf::VertexArray textures::terrains::unvisibleKnown = makeQuad(96, 48, sf::Vector2f(98, 99));
const sf::VertexArray textures::terrains::unknown = makeQuad(96, 48, sf::Vector2f(98, 148));
// Should show two rotating cubes, one in the middle of the screen being rendered normally, the
// other one in the top right hand corner, being rendered onto a texture mapped on a quad
TEST_F(OsgScreenSpaceQuadRenderTests, RenderTextureTest)
{

	auto defaultCamera = viewElement->getCamera();
	auto camera = std::make_shared<OsgCamera>("RenderPass");
	camera->setProjectionMatrix(defaultCamera->getProjectionMatrix());
	camera->setRenderGroupReference("RenderPass");
	camera->setGroupReference(SurgSim::Graphics::Representation::DefaultGroupName);

	auto dimensions = viewElement->getView()->getDimensions();

	std::shared_ptr<OsgRenderTarget2d> renderTargetOsg =
		std::make_shared<OsgRenderTarget2d>(dimensions[0], dimensions[1], 1.0, 2, true);
	camera->setRenderTarget(renderTargetOsg);

	viewElement->addComponent(camera);

	int screenWidth = dimensions[0];
	int screenHeight = dimensions[1];

	int width = dimensions[0] / 3;
	int height = dimensions[1] / 3;

	std::shared_ptr<ScreenSpaceQuadRepresentation> quad;
	quad = makeQuad("Color1", width, height, screenWidth - width, screenHeight - height);
	quad->setTexture(renderTargetOsg->getColorTargetOsg(0));
	viewElement->addComponent(quad);

	quad = makeQuad("Color2", width, height, screenWidth - width, screenHeight - height * 2);
	quad->setTexture(renderTargetOsg->getColorTargetOsg(1));
	viewElement->addComponent(quad);

	quad = makeQuad("Depth", width, height, 0.0, screenHeight - height);
	quad->setTexture(renderTargetOsg->getDepthTargetOsg());
	viewElement->addComponent(quad);

	Quaterniond quat = Quaterniond::Identity();
	RigidTransform3d startPose = SurgSim::Math::makeRigidTransform(quat, Vector3d(0.0, 0.0, -0.2));
	quat = SurgSim::Math::makeRotationQuaternion(M_PI, Vector3d::UnitY().eval());
	RigidTransform3d endPose = SurgSim::Math::makeRigidTransform(quat, Vector3d(0.0, 0.0, -0.2));

	auto box = std::make_shared<OsgBoxRepresentation>("Graphics");
	box->setSizeXYZ(0.05, 0.05, 0.05);
	box->setGroupReference("RenderPass");
	auto boxElement1 = std::make_shared<BasicSceneElement>("Box 1");
	boxElement1->addComponent(box);
	boxElement1->setPose(startPose);
	scene->addSceneElement(boxElement1);

	box = std::make_shared<OsgBoxRepresentation>("Graphics");
	box->setSizeXYZ(0.05, 0.05, 0.05);
	auto boxElement2 = std::make_shared<BasicSceneElement>("Box 2");
	boxElement2->addComponent(box);
	boxElement2->setPose(startPose);
	scene->addSceneElement(boxElement2);

	/// Run the thread
	runtime->start();

	int numSteps = 100;
	boost::this_thread::sleep(boost::posix_time::milliseconds(1000));
	for (int i = 0; i < numSteps; ++i)
	{
		double t = static_cast<double>(i) / numSteps;
		boxElement1->setPose(SurgSim::Testing::interpolate<RigidTransform3d>(startPose, endPose, t));
		boxElement2->setPose(SurgSim::Testing::interpolate<RigidTransform3d>(endPose, startPose, t));
		boost::this_thread::sleep(boost::posix_time::milliseconds(1000 / 100));
	}

	graphicsManager->dumpDebugInfo();
}