Exemplo n.º 1
0
		//-----------------------------------------------------------------------------
		Vector3D  Vector3D::AsNormalSafe() const
		{
			float t = Magnitude();
			Vector3D result;
			if (t != 0.0f)
			{
				float mag = 1.0f / t;
				result.Set(x * mag, y * mag, z * mag);
			}
			else
			{
				result.Set(1.0f,0.0f, 0.0f);
			}
			return result;
		}
Exemplo n.º 2
0
// get the six planes, normals pointing outwards
void AABBox::GetPlanes(Plane *pPlanes)
{
	Vector3D vcN;
   
	if(!pPlanes) 
		return;

	// right side
	vcN.Set(1.0f, 0.0f, 0.0f);
	pPlanes[0].Set(vcN, vcMax);
   
	// left side
	vcN.Set(-1.0f, 0.0f, 0.0f);
	pPlanes[1].Set(vcN, vcMin);

	// front side
	vcN.Set(0.0f, 0.0f, -1.0f);
	pPlanes[2].Set(vcN, vcMin);

	// back side
	vcN.Set(0.0f, 0.0f, 1.0f);
	pPlanes[3].Set(vcN, vcMax);

	// top side
	vcN.Set(0.0f, 1.0f, 0.0f);
	pPlanes[4].Set(vcN, vcMax);

	// bottom side
	vcN.Set(0.0f, -1.0f, 0.0f);
	pPlanes[5].Set(vcN, vcMin);
}
Exemplo n.º 3
0
void OBBox::DeTransform(const OBBox &obb, const Matrix4x4 &m)
{
	Matrix4x4 mat = m;
	Vector3D vcT;
   
	// erase translation from mat
	vcT.Set(mat._41, mat._42, mat._43);
	mat._41 = mat._42 = mat._43 = 0.0f;

	// rotate center and axis to matrix coord.-space
	this->vcCenter =  obb.vcCenter * mat;
	this->vcA0     =  obb.vcA0 * mat;
	this->vcA1     =  obb.vcA1 * mat;
	this->vcA2     =  obb.vcA2 * mat;

	// set translation
	this->vcCenter += vcT;

	// copy axis length
	fA0 = obb.fA0;
	fA1 = obb.fA1;
	fA2 = obb.fA2;
}
Exemplo n.º 4
0
 void UnplacedSphere::Extent(Vector3D<Precision> & aMin, Vector3D<Precision> & aMax) const
 {
   // Returns the full 3D cartesian extent of the solid.
     aMin.Set(-fRmax);
     aMax.Set(fRmax);
 }
Exemplo n.º 5
0
void GameWorld::CreateObjects()
{
	objectManager->CreateTerrain();
	objectManager->CreateSkybox();

	objectManager->AddObject("terrainBox", "model");
	objectManager->Get("terrainBox")->SetMesh("Models/RoomAssets/TopVent_Exported/TopVent.obj");
	objectManager->Get("terrainBox")->transform()->Translate(objectManager->GetTerrain()->GetSize()/2, -1.0f, objectManager->GetTerrain()->GetSize()/2);
	objectManager->Get("terrainBox")->SetBoundingBox(objectManager->GetTerrain()->GetSize()/2, 0.9f, objectManager->GetTerrain()->GetSize()/2);
	objectManager->Get("terrainBox")->EnablePhysics(1.0f);
	objectManager->Get("terrainBox")->PhysicallyStatic(true);
	objectManager->Get("terrainBox")->SetTerrainTrack(false);

	objectManager->AddObject("TopVent", "model");
	objectManager->Get("TopVent")->transform()->Translate(256.705f, 2.08f, 259.538f);
	objectManager->Get("TopVent")->SetMesh("Models/RoomAssets/TopVent_Exported/TopVent.obj");
	objectManager->Get("TopVent")->transform()->Scale(1.0f, 1.0f, 1.0f);
	objectManager->Get("TopVent")->SetTerrainTrack(false);

	objectManager->AddObject("BottomVent_Tall", "model");
	objectManager->Get("BottomVent_Tall")->transform()->Translate(257.61f, 0.38f, 259.543f);
	objectManager->Get("BottomVent_Tall")->SetMesh("Models/RoomAssets/BottomVent_Exported/BottomVent_Tall.obj");
	objectManager->Get("BottomVent_Tall")->transform()->Scale(1.0f, 1.0f, 1.0f);
	objectManager->Get("BottomVent_Tall")->SetTerrainTrack(false);

	objectManager->AddObject("BottomVent_Short", "model");
	objectManager->Get("BottomVent_Short")->transform()->Translate(256.63f, 0.34f, 259.543f);
	objectManager->Get("BottomVent_Short")->SetMesh("Models/RoomAssets/BottomVent_Exported/BottomVent_Short.obj");
	objectManager->Get("BottomVent_Short")->transform()->Scale(1.0f, 1.0f, 1.0f);
	objectManager->Get("BottomVent_Short")->SetTerrainTrack(false);

	objectManager->AddObject("SmlWhiteBoard1", "model");
	objectManager->Get("SmlWhiteBoard1")->transform()->Translate(258.15f, 1.86f, 257.48f);
	objectManager->Get("SmlWhiteBoard1")->transform()->Rotate(0.0f,90.0f,0.0f,0,1,0);
	objectManager->Get("SmlWhiteBoard1")->SetMesh("Models/RoomAssets/Whiteboard_Exported/SmlWhiteBoard.obj");
	objectManager->Get("SmlWhiteBoard1")->transform()->Scale(1.0f, 1.0f, 1.0f);
	objectManager->Get("SmlWhiteBoard1")->SetTerrainTrack(false);

	objectManager->AddObject("Switch1", "model");
	objectManager->Get("Switch1")->transform()->Translate(255.7f, 1.53f, 259.544f);
	objectManager->Get("Switch1")->SetMesh("Models/RoomAssets/Switch_Exported/Switch.obj");
	objectManager->Get("Switch1")->transform()->Scale(1.0f, 1.0f, 1.0f);
	objectManager->Get("Switch1")->SetTerrainTrack(false);

	objectManager->AddObject("Switch2", "model");
	objectManager->Get("Switch2")->transform()->Translate(255.7f, 1.36f, 259.544f);
	objectManager->Get("Switch2")->SetMesh("Models/RoomAssets/Switch_Exported/Switch.obj");
	objectManager->Get("Switch2")->transform()->Scale(1.0f, 1.0f, 1.0f);
	objectManager->Get("Switch2")->SetTerrainTrack(false);

	objectManager->AddObject("Switch3", "model");
	objectManager->Get("Switch3")->transform()->Translate(255.46f, 1.36f, 259.544f);
	objectManager->Get("Switch3")->SetMesh("Models/RoomAssets/Switch_Exported/Switch.obj");
	objectManager->Get("Switch3")->transform()->Scale(1.0f, 1.0f, 1.0f);
	objectManager->Get("Switch3")->SetTerrainTrack(false);

	objectManager->AddObject("Socket1", "model");
	objectManager->Get("Socket1")->transform()->Translate(255.9f, 0.1f, 259.49f);
	objectManager->Get("Socket1")->SetMesh("Models/RoomAssets/Socket_Exported/Socket.obj");
	objectManager->Get("Socket1")->transform()->Scale(1.0f, 1.0f, 1.0f);
	objectManager->Get("Socket1")->SetTerrainTrack(false);

	objectManager->AddObject("Socket2", "model");
	objectManager->Get("Socket2")->transform()->Translate(256.15f, 0.1f, 259.49f);
	objectManager->Get("Socket2")->SetMesh("Models/RoomAssets/Socket_Exported/Socket.obj");
	objectManager->Get("Socket2")->transform()->Scale(1.0f, 1.0f, 1.0f);
	objectManager->Get("Socket2")->SetTerrainTrack(false);

	objectManager->AddObject("Socket3", "model");
	objectManager->Get("Socket3")->transform()->Translate(255.24f, 0.08f, 252.4f);
	objectManager->Get("Socket3")->transform()->Rotate(0.0f,180.0f,0.0f,0,1,0);
	objectManager->Get("Socket3")->SetMesh("Models/RoomAssets/Socket_Exported/Socket.obj");
	objectManager->Get("Socket3")->transform()->Scale(1.0f, 1.0f, 1.0f);
	objectManager->Get("Socket3")->SetTerrainTrack(false);

	objectManager->AddObject("Socket4", "model");
	objectManager->Get("Socket4")->transform()->Translate(257.62f, 0.08f, 252.4f);
	objectManager->Get("Socket4")->transform()->Rotate(0.0f,180.0f,0.0f,0,1,0);
	objectManager->Get("Socket4")->SetMesh("Models/RoomAssets/Socket_Exported/Socket.obj");
	objectManager->Get("Socket4")->transform()->Scale(1.0f, 1.0f, 1.0f);
	objectManager->Get("Socket4")->SetTerrainTrack(false);

	objectManager->AddObject("Socket5", "model");
	objectManager->Get("Socket5")->transform()->Translate(257.84f, 0.08f, 252.4f);
	objectManager->Get("Socket5")->transform()->Rotate(0.0f,180.0f,0.0f,0,1,0);
	objectManager->Get("Socket5")->SetMesh("Models/RoomAssets/Socket_Exported/Socket.obj");
	objectManager->Get("Socket5")->transform()->Scale(1.0f, 1.0f, 1.0f);
	objectManager->Get("Socket5")->SetTerrainTrack(false);

	objectManager->AddObject("Socket6", "model");
	objectManager->Get("Socket6")->transform()->Translate(258.17f, 0.08f, 256.755f);
	objectManager->Get("Socket6")->transform()->Rotate(0.0f,90.0f,0.0f,0,1,0);
	objectManager->Get("Socket6")->SetMesh("Models/RoomAssets/Socket_Exported/Socket.obj");
	objectManager->Get("Socket6")->transform()->Scale(1.0f, 1.0f, 1.0f);
	objectManager->Get("Socket6")->SetTerrainTrack(false);

	objectManager->AddObject("Sign", "model");
	objectManager->Get("Sign")->transform()->Translate(258.2f, 1.55f, 253.36f);
	objectManager->Get("Sign")->transform()->Rotate(0.0f,90.0f,0.0f,0,1,0);
	objectManager->Get("Sign")->SetMesh("Models/RoomAssets/Sign_Exported/Sign.obj");
	objectManager->Get("Sign")->transform()->Scale(1.0f, 1.0f, 1.0f);
	objectManager->Get("Sign")->SetTerrainTrack(false);

	objectManager->AddObject("Sign2", "model");
	objectManager->Get("Sign2")->transform()->Translate(255.605f, 1.785f, 259.544f);
	objectManager->Get("Sign2")->SetMesh("Models/RoomAssets/Sign_Exported/Sign.obj");
	objectManager->Get("Sign2")->transform()->Scale(1.0f, 1.0f, 1.0f);
	objectManager->Get("Sign2")->SetTerrainTrack(false);

	objectManager->AddObject("ProjectorScreen", "model");
	objectManager->Get("ProjectorScreen")->transform()->Translate(258.2f, 2.6f, 255.95f);
	objectManager->Get("ProjectorScreen")->transform()->Rotate(0.0f,90.0f,0.0f,0,1,0);
	objectManager->Get("ProjectorScreen")->SetMesh("Models/RoomAssets/ProjectorScreen_Exported/ProjectorScreen.obj");
	objectManager->Get("ProjectorScreen")->transform()->Scale(1.0f, 1.0f, 1.0f);
	objectManager->Get("ProjectorScreen")->SetTerrainTrack(false);

	objectManager->AddObject("Projector", "model");
	objectManager->Get("Projector")->transform()->Translate(256.0f, 2.6f, 255.92f);
	objectManager->Get("Projector")->transform()->Rotate(0.0f,-90.0f,0.0f,0,1,0);
	objectManager->Get("Projector")->SetMesh("Models/RoomAssets/Projector_Exported/Projector.obj");
	objectManager->Get("Projector")->transform()->Scale(1.0f, 1.0f, 1.0f);
	objectManager->Get("Projector")->SetTerrainTrack(false);

	objectManager->AddObject("Light1", "model");
	objectManager->Get("Light1")->transform()->Translate(255.2f, 2.96f, 256.6f);
	objectManager->Get("Light1")->SetMesh("Models/RoomAssets/Light_Exported/Light.obj");
	objectManager->Get("Light1")->transform()->Scale(1.0f, 1.0f, 1.0f);
	objectManager->Get("Light1")->SetTerrainTrack(false);

	objectManager->AddObject("Light2", "model");
	objectManager->Get("Light2")->transform()->Translate(255.2f, 2.96f, 254.15f);
	objectManager->Get("Light2")->SetMesh("Models/RoomAssets/Light_Exported/Light.obj");
	objectManager->Get("Light2")->transform()->Scale(1.0f, 1.0f, 1.0f);
	objectManager->Get("Light2")->SetTerrainTrack(false);

	objectManager->AddObject("Light3", "model");
	objectManager->Get("Light3")->transform()->Translate(257.2f, 2.96f, 256.6f);
	objectManager->Get("Light3")->SetMesh("Models/RoomAssets/Light_Exported/Light.obj");
	objectManager->Get("Light3")->transform()->Scale(1.0f, 1.0f, 1.0f);
	objectManager->Get("Light3")->SetTerrainTrack(false);

	objectManager->AddObject("Light4", "model");
	objectManager->Get("Light4")->transform()->Translate(257.2f, 2.96f, 254.15f);
	objectManager->Get("Light4")->SetMesh("Models/RoomAssets/Light_Exported/Light.obj");
	objectManager->Get("Light4")->transform()->Scale(1.0f, 1.0f, 1.0f);
	objectManager->Get("Light4")->SetTerrainTrack(false);

	objectManager->AddObject("Light5", "model");
	objectManager->Get("Light5")->transform()->Translate(255.2f, 2.96f, 259.01f);
	objectManager->Get("Light5")->SetMesh("Models/RoomAssets/Light_Exported/Light.obj");
	objectManager->Get("Light5")->transform()->Scale(1.0f, 1.0f, 1.0f);
	objectManager->Get("Light5")->SetTerrainTrack(false);

	objectManager->AddObject("Light6", "model");
	objectManager->Get("Light6")->transform()->Translate(257.2f, 2.96f, 259.01f);
	objectManager->Get("Light6")->SetMesh("Models/RoomAssets/Light_Exported/Light.obj");
	objectManager->Get("Light6")->transform()->Scale(1.0f, 1.0f, 1.0f);
	objectManager->Get("Light6")->SetTerrainTrack(false);

	objectManager->AddObject("Doorway", "model");
	objectManager->Get("Doorway")->transform()->Translate(254.84f, 0.001f, 259.52f);
	objectManager->Get("Doorway")->SetMesh("Models/RoomAssets/Door_Exported/Doorway.obj");
	objectManager->Get("Doorway")->transform()->Scale(1.0f, 1.0f, 1.0f);
	objectManager->Get("Doorway")->SetTerrainTrack(false);

	objectManager->AddObject("Door", "model");
	objectManager->Get("Door")->transform()->Translate(254.84f, 0.001f, 259.53f);
	objectManager->Get("Door")->SetMesh("Models/RoomAssets/Door_Exported/Door.obj");
	objectManager->Get("Door")->transform()->Scale(1.0f, 1.0f, 1.0f);
	objectManager->Get("Door")->SetTerrainTrack(false);

	objectManager->AddObject("Curtain1", "model");
	objectManager->Get("Curtain1")->transform()->Translate(256.57f, 0.65f, 252.25f);
	objectManager->Get("Curtain1")->transform()->Rotate(0.0f,180.0f,0.0f,0,1,0);
	objectManager->Get("Curtain1")->SetMesh("Models/RoomAssets/Curtain_Exported/Curtain.obj");
	objectManager->Get("Curtain1")->transform()->Scale(1.0f, 1.0f, 1.0f);
	objectManager->Get("Curtain1")->SetTerrainTrack(false);

	objectManager->AddObject("Curtain2", "model");
	objectManager->Get("Curtain2")->transform()->Translate(258.76f, 0.65f, 252.25f);
	objectManager->Get("Curtain2")->transform()->Rotate(0.0f,180.0f,0.0f,0,1,0);
	objectManager->Get("Curtain2")->SetMesh("Models/RoomAssets/Curtain_Exported/Curtain.obj");
	objectManager->Get("Curtain2")->transform()->Scale(1.0f, 1.0f, 1.0f);
	objectManager->Get("Curtain2")->SetTerrainTrack(false);

	objectManager->AddObject("Clock", "model");
	objectManager->Get("Clock")->transform()->Translate(253.77f, 2.2f, 255.97f);
	objectManager->Get("Clock")->transform()->Rotate(0.0f,-90.0f,0.0f,0,1,0);
	objectManager->Get("Clock")->SetMesh("Models/RoomAssets/Clock_Exported/Clock.obj");
	objectManager->Get("Clock")->transform()->Scale(1.0f, 1.0f, 1.0f);
	objectManager->Get("Clock")->SetTerrainTrack(false);

	objectManager->AddObject("Bin", "model");
	objectManager->Get("Bin")->transform()->Translate(258.0f, 0.01f, 258.8f);
	objectManager->Get("Bin")->transform()->Rotate(0.0f,-90.0f,0.0f,0,1,0);
	objectManager->Get("Bin")->SetMesh("Models/RoomAssets/Bin_Exported/Bin.obj");
	objectManager->Get("Bin")->transform()->Scale(1.0f, 1.0f, 1.0f);
	objectManager->Get("Bin")->SetTerrainTrack(false);

//---------------TEST OBJECTS -> delete when ready
	objectManager->AddObject("t1", "model");
	objectManager->Get("t1")->transform()->Translate(267.0f, 4.01f, 248.8f);
	objectManager->Get("t1")->SetMesh("Models/RoomAssets/Chair_Exported/Chair_inv.obj");
	objectManager->Get("t1")->Color(1.0f, 0.0f, 0.0f, 1.0f);
	objectManager->Get("t1")->transform()->Scale(1.2f, 1.2f, 1.2f);
	objectManager->Get("t1")->SetBoundingBox(0.3f, 0.5f, 0.3f);
    objectManager->Get("t1")->Bounds()->transform().Translate(Vector3D(0,-0.5f,0), true);
	objectManager->Get("t1")->EnablePhysics(1.0f);
	objectManager->Get("t1")->Gravity(true);
	//objectManager->Get("t1")->ObjectTag("test");
	objectManager->Get("t1")->SetTerrainTrack(false);
	/*
	objectManager->AddObject("t2", "model");
	objectManager->Get("t2")->transform()->Translate(268.0f, 0.01f, 298.8f);
	objectManager->Get("t2")->transform()->Rotate(0.0f,0.0f,0.0f,0,1,0);
	objectManager->Get("t2")->SetMesh("Models/RoomAssets/Test_Sphere/Sphere.obj");
	objectManager->Get("t2")->Color(1.0f, 0.0f, 1.0f, 1.0f);
	objectManager->Get("t2")->transform()->Velocity(0.0f, -0.0f,-0.5f);
	objectManager->Get("t2")->SetBoundingSphere(1.3f);//, 1.3f, 1.3f);
	objectManager->Get("t2")->EnablePhysics(1.0f);
	objectManager->Get("t2")->PolygonMode(1);
	//objectManager->Get("t2")->ObjectTag("test");
	objectManager->Get("t2")->SetTerrainTrack(false);
	
	objectManager->AddObject("t3", "model");
	objectManager->Get("t3")->transform()->Translate(298.0f, 0.01f, 298.8f);
	objectManager->Get("t3")->transform()->Rotate(0.0f,0.0f,0.0f,0,1,0);
	objectManager->Get("t3")->SetMesh("Models/RoomAssets/Test_Sphere/Sphere.obj");
	objectManager->Get("t3")->Color(0.0f, 1.0f, 0.0f, 1.0f);
	objectManager->Get("t3")->transform()->Velocity(0.00f, 0.1f, 0.00f);
	objectManager->Get("t3")->transform()->RotationalVelocity(0.0f, 10.0f, 0.0f, 0,1,0,0);
	objectManager->Get("t3")->SetBoundingBox(1.3f, 1.3f, 1.3f);
	objectManager->Get("t3")->EnablePhysics(100.0f);
	//objectManager->Get("t3")->ObjectTag("test");
	objectManager->Get("t3")->SetTerrainTrack(false);*/
	
	objectManager->AddObject("t2", "model");
	objectManager->Get("t2")->transform()->Translate(268.0f, 10.01f, 268.8f);
	objectManager->Get("t2")->transform()->Rotate(0.0f,0.0f,0.0f,0,1,0);
	objectManager->Get("t2")->SetMesh("Models/RoomAssets/Test_Sphere/Sphere.obj");
	objectManager->Get("t2")->Color(1.0f, 0.0f, 1.0f, 1.0f);
	objectManager->Get("t2")->transform()->Velocity(0.0f, 0.0f,0.0f);
	objectManager->Get("t2")->SetBoundingBox(10.3f, 5.3f, 1.3f);
	objectManager->Get("t2")->EnablePhysics(1000.0f);
	objectManager->Get("t2")->PolygonMode(1);
	//objectManager->Get("t2")->ObjectTag("test");
	objectManager->Get("t2")->SetTerrainTrack(false);

	objectManager->AddObject("t3", "model");
	objectManager->Get("t3")->transform()->Translate(278.0f, 10.01f, 368.8f);
	objectManager->Get("t3")->transform()->Rotate(0.0f,0.0f,0.0f,0,1,0);
	objectManager->Get("t3")->SetMesh("Models/RoomAssets/Test_Sphere/Sphere.obj");
	objectManager->Get("t3")->Color(0.0f, 1.0f, 0.0f, 1.0f);
	objectManager->Get("t3")->transform()->Velocity(0.00f, 0.0f, -0.1f);
	//objectManager->Get("t3")->transform()->RotationalVelocity(0.0f, 10.0f, 0.0f, 0,1,0,0);
	objectManager->Get("t3")->SetBoundingSphere(1.3f);//, 1.3f, 1.3f);
	objectManager->Get("t3")->EnablePhysics(100.0f);
	//objectManager->Get("t3")->ObjectTag("test");
	objectManager->Get("t3")->SetTerrainTrack(false);

	objectManager->AddObject("t4", "model");
	//objectManager->Get("t4")->transform()->Translate(278.0f, 0.01f, 298.8f);
	objectManager->Get("t4")->transform()->Translate(277.0f, 4.01f, 248.8f);
	objectManager->Get("t4")->transform()->Rotate(0.0f,0.0f,0.0f,0,0,0);
	objectManager->Get("t4")->SetMesh("Models/RoomAssets/Test_Sphere/Sphere.obj");
	objectManager->Get("t4")->Color(0.0f, 0.0f, 1.0f, 1.0f);
	objectManager->Get("t4")->transform()->Velocity(0.000f, -0.0f, 0.00f);
	objectManager->Get("t4")->transform()->RotationalVelocity(0.0f, 10.0f, 0.0f, 0,1,1,0);
	objectManager->Get("t4")->SetBoundingBox(1.3f, 1.3f, 1.3f);
	objectManager->Get("t4")->EnablePhysics(100.0f);
	//objectManager->Get("t4")->ObjectTag("test");
	objectManager->Get("t4")->SetTerrainTrack(false);

	objectManager->AddObject("t5", "model");
	objectManager->Get("t5")->transform()->Translate(0.0f, 0.01f, 0.0f);
	objectManager->Get("t5")->transform()->Rotate(0.0f,0.0f,0.0f,0,0,0);
	objectManager->Get("t5")->SetMesh("Models/RoomAssets/Test_Sphere/Sphere.obj");
	objectManager->Get("t5")->transform()->Scale(0.5f, 0.5f, 0.5f);
	objectManager->Get("t5")->PolygonMode(1);
	objectManager->Get("t5")->Color(0.0f, 0.0f, 1.0f, 0.3f);
	objectManager->Get("t5")->SetTerrainTrack(false);
//---------------TEST OBJECTS

    objectManager->AddObject("Graffiti1","model");
    objectManager->Get("Graffiti1")->transform()->Translate(258.1f, 1.4f, 253.98f);
	objectManager->Get("Graffiti1")->transform()->Rotate(0.0f,180.0f,0.0f,0,1,0);
    objectManager->Get("Graffiti1")->transform()->Scale(Vector3D(0,0,0));
    objectManager->Get("Graffiti1")->SetMesh("Models/Graffiti/Graffiti1.obj");

    objectManager->AddObject("Graffiti2","model");
    objectManager->Get("Graffiti2")->transform()->Translate(258.1f, 1.8f, 253.98f);
	objectManager->Get("Graffiti2")->transform()->Rotate(0.0f,180.0f,0.0f,0,1,0);
    objectManager->Get("Graffiti2")->transform()->Scale(Vector3D(0,0,0));
    objectManager->Get("Graffiti2")->SetMesh("Models/Graffiti/Graffiti2.obj");

    objectManager->AddObject("Graffiti3","model");
    objectManager->Get("Graffiti3")->transform()->Translate(258.1f, 1.4f, 254.48f);
	objectManager->Get("Graffiti3")->transform()->Rotate(0.0f,180.0f,0.0f,0,1,0);
    objectManager->Get("Graffiti3")->transform()->Scale(Vector3D(0,0,0));
    objectManager->Get("Graffiti3")->SetMesh("Models/Graffiti/Graffiti3.obj");

    objectManager->AddObject("Graffiti4","model");
    objectManager->Get("Graffiti4")->transform()->Translate(258.15f, 1.8f, 254.98f);
	objectManager->Get("Graffiti4")->transform()->Rotate(0.0f,180.0f,0.0f,0,1,0);
    objectManager->Get("Graffiti4")->transform()->Scale(Vector3D(0,0,0));
    objectManager->Get("Graffiti4")->SetMesh("Models/Graffiti/Graffiti4.obj");

    objectManager->AddObject("Graffiti5","model");
    objectManager->Get("Graffiti5")->transform()->Translate(258.15f, 1.4f, 255.98f);
	objectManager->Get("Graffiti5")->transform()->Rotate(0.0f,180.0f,0.0f,0,1,0);
    objectManager->Get("Graffiti5")->transform()->Scale(Vector3D(0,0,0));
    objectManager->Get("Graffiti5")->SetMesh("Models/Graffiti/Graffiti5.obj");

    objectManager->AddObject("Graffiti6","model");
    objectManager->Get("Graffiti6")->transform()->Translate(258.15f, 1.8f, 255.48f);
	objectManager->Get("Graffiti6")->transform()->Rotate(0.0f,180.0f,0.0f,0,1,0);
    objectManager->Get("Graffiti6")->transform()->Scale(Vector3D(0,0,0));
    objectManager->Get("Graffiti6")->SetMesh("Models/Graffiti/Graffiti6.obj");

    objectManager->AddObject("Graffiti7","model");
    objectManager->Get("Graffiti7")->transform()->Translate(258.15f, 1.8f, 256.48f);
	objectManager->Get("Graffiti7")->transform()->Rotate(0.0f,180.0f,0.0f,0,1,0);
    objectManager->Get("Graffiti7")->transform()->Scale(Vector3D(0,0,0));
    objectManager->Get("Graffiti7")->SetMesh("Models/Graffiti/Graffiti7.obj");

    objectManager->AddObject("Graffiti8","model");
    objectManager->Get("Graffiti8")->transform()->Translate(258.1f, 1.4f, 257.48f);
	objectManager->Get("Graffiti8")->transform()->Rotate(0.0f,180.0f,0.0f,0,1,0);
    objectManager->Get("Graffiti8")->transform()->Scale(Vector3D(0,0,0));
    objectManager->Get("Graffiti8")->SetMesh("Models/Graffiti/Graffiti8.obj");

    objectManager->AddObject("Graffiti9","model");
    objectManager->Get("Graffiti9")->transform()->Translate(258.1f, 1.8f, 257.48f);
	objectManager->Get("Graffiti9")->transform()->Rotate(0.0f,180.0f,0.0f,0,1,0);
    objectManager->Get("Graffiti9")->transform()->Scale(Vector3D(0,0,0));
    objectManager->Get("Graffiti9")->SetMesh("Models/Graffiti/Graffiti9.obj");

    objectManager->AddObject("Graffiti10","model");
    objectManager->Get("Graffiti10")->transform()->Translate(258.1f, 1.8f, 257.98f);
	objectManager->Get("Graffiti10")->transform()->Rotate(0.0f,180.0f,0.0f,0,1,0);
    objectManager->Get("Graffiti10")->transform()->Scale(Vector3D(0,0,0));
    objectManager->Get("Graffiti10")->SetMesh("Models/Graffiti/Graffiti10.obj");

	objectManager->AddObject("SmlWhiteBoard2", "model");
	objectManager->Get("SmlWhiteBoard2")->transform()->Translate(258.15f, 1.86f, 253.9f);
	objectManager->Get("SmlWhiteBoard2")->transform()->Rotate(0.0f,90.0f,0.0f,0,1,0);
	objectManager->Get("SmlWhiteBoard2")->SetMesh("Models/RoomAssets/Whiteboard_Exported/SmlWhiteBoard.obj");
	objectManager->Get("SmlWhiteBoard2")->transform()->Scale(1.0f, 1.0f, 1.0f);
	objectManager->Get("SmlWhiteBoard2")->SetTerrainTrack(false);
	
	objectManager->AddObject("BigWhiteBoard", "model");
	GameObject* B_WB = objectManager->Get("BigWhiteBoard");
	B_WB->transform()->Translate(258.2f, 1.8f, 255.98f);
	B_WB->transform()->Rotate(0.0f,90.0f,0.0f,0,1,0);
	B_WB->transform()->Scale(1.0f, 1.0f, 1.0f);
    B_WB->SetBoundingBox(2.5f, 1.0f, 0.2f);
	B_WB->Bounds()->transform().Translate(Vector3D(-0.5f, -0.2f, 0.0f));
	B_WB->EnablePhysics(100.0f);
	B_WB->PhysicallyStatic(true);
	B_WB->SetMesh("Models/RoomAssets/Whiteboard_Exported/BigWhiteBoard.obj");
	B_WB->SetTerrainTrack(false);
	B_WB->Affordances()->AddAffordance("Graffiti", 0, AffordanceTable::PERCEIVED);
	B_WB->SetInteractionObject("draw graffiti", "erase graffiti", "test3", "test4");
	
	Vector3D tableChairOffset;
	tableChairOffset.Set(-0.21f, 0.0f, 0.0f);
	std::string table, chair;

	Vector3D tableCoord[4];
	tableCoord[0].Set(254.51f, 0.001f, 257.675f);
	//tableCoord[1].Set(255.78f, 0.001f, 257.675f);
	//tableCoord[2].Set(257.05f, 0.001f, 257.655f);
	//tableCoord[3].Set(254.51f, 0.001f, 256.845f);
	//tableCoord[4].Set(255.78f, 0.001f, 256.845f);
	tableCoord[1].Set(257.05f, 0.001f, 256.845f);
	//tableCoord[6].Set(254.51f, 0.001f, 255.72f);
	//tableCoord[7].Set(255.78f, 0.001f, 255.72f);
	//tableCoord[8].Set(257.05f, 0.001f, 255.72f);
	//tableCoord[9].Set(254.51f, 0.001f, 254.9f);
	tableCoord[2].Set(255.78f, 0.001f, 254.9f);
	//tableCoord[11].Set(257.05f, 0.001f, 254.9f);
	//tableCoord[12].Set(254.51f, 0.001f, 254.08f);
	//tableCoord[13].Set(255.78f, 0.001f, 254.08f);
	//tableCoord[14].Set(257.05f, 0.001f, 254.08f);
	tableCoord[3].Set(254.51f, 0.001f, 252.9f);
	//tableCoord[16].Set(255.78f, 0.001f, 252.9f);
	//tableCoord[17].Set(257.05f, 0.001f, 252.9f);
	//tableCoord[18].Set(255.78f, 0.001f, 258.995f);
	//tableCoord[19].Set(257.05f, 0.001f, 258.995f);
	
	for (unsigned long long i = 0; i < 4; i++)
	{
		table = "table" + std::to_string(i);
		chair = "chair" + std::to_string(i);

		objectManager->AddObject(table, "model");
		objectManager->Get(table)->transform()->Translate(tableCoord[i]);
		objectManager->Get(table)->transform()->Rotate(0.0f,90.0f,0.0f,0,1,0);
        objectManager->Get(table)->transform()->Scale(1.0f, 1.0f, 1.0f);
		objectManager->Get(table)->SetMesh("Models/RoomAssets/Table_Exported/Table.obj");
		objectManager->Get(table)->transform()->Scale(1.0f, 1.0f, 1.0f);
		objectManager->Get(table)->SetBoundingBox(0.4f, 0.9f, 0.3f);
		objectManager->Get(table)->SetTerrainTrack(false);
        objectManager->Get(table)->Affordances()->AddAffordance("flip", 10);
        objectManager->Get(table)->Affordances()->AddAffordance("un flip", 0);
        objectManager->Get(table)->SetInteractionObject("flip", "un flip", "test3", "test4");

		
		objectManager->AddObject(chair, "model");
		objectManager->Get(chair)->transform()->Translate(objectManager->Get(table)->transform()->Position() + tableChairOffset);
		objectManager->Get(chair)->transform()->Rotate(0.0f,90.0f,0.0f,0,1,0);
		objectManager->Get(chair)->SetMesh("Models/RoomAssets/Chair_Exported/Chair_inv.obj");
		objectManager->Get(chair)->transform()->Scale(1.0f, 1.0f, 1.0f);
		objectManager->Get(chair)->SetTerrainTrack(false);
        objectManager->Get(chair)->SetBoundingBox(0.3f, 1.0f, 0.3f);
        objectManager->Get(chair)->Affordances()->AddAffordance("flip", 10);
        objectManager->Get(chair)->Affordances()->AddAffordance("un flip", 0);
        objectManager->Get(chair)->SetInteractionObject("flip", "un flip", "test3", "test4");
	}
	
	objectManager->AddObject("Room", "model");
	objectManager->Get("Room")->transform()->Translate(256, 0.001, 256);
	objectManager->Get("Room")->SetMesh("Models/RoomAssets/Room_Exported/Room.obj");
	objectManager->Get("Room")->transform()->Scale(1.0f, 1.0f, 1.0f);
	//objectManager->Get("Room")->transform()->Velocity(0.1f, 0.0f, 0.0f, 1, 0, 0);
	objectManager->Get("Room")->SetTerrainTrack(false);

	objectManager->AddObject("player", "player");
	objectManager->Get("player")->transform()->Translate(objectManager->GetTerrain()->GetSize()/2,
														objectManager->GetTerrain()->GetHeightAverage(objectManager->GetTerrain()->GetSize()/2, objectManager->GetTerrain()->GetSize()/2),
														objectManager->GetTerrain()->GetSize()/2);

	((Player*)objectManager->Get("player"))->SetCamera(10.0f, 10.0f, 10.0f, 1.8f, 0.0f);
	((Player*)objectManager->Get("player"))->Speed(2.0f);
	objectManager->Get("player")->SetTerrainTrack(true);
	objectManager->Get("player")->ObjectTag("player");
    objectManager->Get("player")->SetBoundingSphere(0.1f);

    // Create the personality types here.
	PersonalityObject* p1 = new PersonalityObject("TEACHER");
	p1->SetEmotionCorners("happy", "angry", "fear", "sad");
	p1->SetPreferredMood(glm::vec2(0.5f, 0.5f));
	p1->AddMoodModifier("hears happy conversation", glm::vec2(0.5f,0.5f));
	p1->AddMoodModifier("is sworn at", glm::vec2(-0.5f,0.5f));
	p1->AddMoodModifier("hears sad conversation", glm::vec2(-0.5f,-0.5f));
	p1->AddMoodModifier("hears scary conversation", glm::vec2(0.5f,-0.5f));
	p1->AddMoodModifier("was punched", glm::vec2(0.3f, -0.3f));
    p1->AddMoodModifier("bad student", glm::vec2(-0.7f, -0.7f));

    PersonalityObject* p2 = new PersonalityObject("STIRRER");
    p2->SetEmotionCorners("happy", "angry", "fear", "sad");
	p2->SetPreferredMood(glm::vec2(0.1f, 0.1f));
    p2->AddMoodModifier("is sworn at", glm::vec2(0.5f, 0.5f));
	p2->AddMoodModifier("hears angry conversation", glm::vec2(-0.5f, 0.5f));
	p2->AddMoodModifier("hears sad conversation", glm::vec2(-0.5f, -0.5f));
	p2->AddMoodModifier("hears scary conversation", glm::vec2(0.5f, -0.5f));
	p2->AddMoodModifier("TEST", glm::vec2(-0.1f, -0.1f));
	p2->AddMoodModifier("was punched", glm::vec2(1.7f, -1.7f));
    p2->AddMoodModifier("flipped table", glm::vec2(1.5f, 1.5f));
    p2->AddMoodModifier("yelled at", glm::vec2(-0.7f, 0.7f));

    PersonalityObject* p3 = new PersonalityObject("TEACHER'S PET");
    p3->SetEmotionCorners("happy", "angry", "fear", "sad");
	p3->SetPreferredMood(glm::vec2(-0.8f, -0.8f));
    p3->AddMoodModifier("is sworn at", glm::vec2(0.1f, 0.1f));
	p3->AddMoodModifier("teacher is sad", glm::vec2(-1.5f, 1.5f));
	p3->AddMoodModifier("hears sad conversation", glm::vec2(-0.3f, -0.3f));
	p3->AddMoodModifier("hears scary conversation", glm::vec2(0.4f, -0.4f));
	p3->AddMoodModifier("yelled at", glm::vec2(0.6f, -0.6f));

    // Create the NPCs after all of the personality types have been created.
	objectManager->AddObject("NPC", "npc");
	GameObject* NPC_ = objectManager->Get("NPC");
	NPC_->transform()->Translate(256, 0.001f, 256);
	NPC_->SetMesh("Models/NPC/NPC_1.obj");
	NPC_->transform()->Scale(0.7f, 1.0f, 0.7f);
	NPC_->SetTerrainTrack(false);
	NPC_->SetBoundingBox(0.5f, 2.0f, 0.5f);
	NPC_->DisablePhysics();
	((NPC*)NPC_)->Personality(p1);
	NPC_->SetInteractionObject("punch", "happy talk", "sad talk", "swear");

    objectManager->AddObject("NPC2", "npc");
	GameObject* NPC_2 = objectManager->Get("NPC2");
	NPC_2->transform()->Translate(257, 0.001f, 258);
	NPC_2->SetMesh("Models/NPC/NPC_2.obj");
	NPC_2->transform()->Scale(0.7f, 1.0f, 0.7f);
	NPC_2->SetTerrainTrack(false);
	NPC_2->SetBoundingBox(0.5f, 2.0f, 0.5f);
	NPC_2->DisablePhysics();
	((NPC*)NPC_2)->Personality(p2);
	NPC_2->SetInteractionObject("punch", "swear", "sad talk", "scary talk");

    objectManager->AddObject("NPC3", "npc");
	GameObject* NPC_3 = objectManager->Get("NPC3");
	NPC_3->transform()->Translate(255, 0.001f, 255);
	NPC_3->SetMesh("Models/NPC/NPC_3.obj");
	NPC_3->transform()->Scale(0.7f, 1.0f, 0.7f);
	NPC_3->SetTerrainTrack(false);
	NPC_3->SetBoundingBox(0.5f, 2.0f, 0.5f);
	NPC_3->DisablePhysics();
	((NPC*)NPC_3)->Personality(p3);
	NPC_3->SetInteractionObject("punch", "swear", "angry talk", "scary talk");

    // Create a mood bubble for each NPC.
    objectManager->AddObject("MOOD", "model");
    GameObject* MOOD = objectManager->Get("MOOD");      // <---- Short-hand for convenience.
    MOOD->transform()->Translate(256, 2.0f, 256);
    MOOD->transform()->Scale(0.2f, 0.2f, 0.2f);
    MOOD->SetMesh("Models/NPC/Anger_Max.obj");

    objectManager->AddObject("MOOD2", "model");
    GameObject* MOOD2 = objectManager->Get("MOOD2");    // <---- Short-hand for convenience.
    MOOD2->transform()->Translate(258, 2.0f, 256);
    MOOD2->transform()->Scale(0.2f, 0.2f, 0.2f);
    MOOD2->SetMesh("Models/NPC/Anger_Max.obj");

    objectManager->AddObject("MOOD3", "model");
    GameObject* MOOD3 = objectManager->Get("MOOD3");    // <---- Short-hand for convenience.
    MOOD3->transform()->Translate(258, 2.0f, 256);
    MOOD3->transform()->Scale(0.2f, 0.2f, 0.2f);
    MOOD3->SetMesh("Models/NPC/Anger_Max.obj");

    // Link each mood bubble to a NPC.
    ((NPC*)NPC_)->LinkMoodBubble(MOOD);
    ((NPC*)NPC_2)->LinkMoodBubble(MOOD2);
    ((NPC*)NPC_3)->LinkMoodBubble(MOOD3);

	CreateResolutions();
}
//////////////////////////////////
// main function
int main(int argc, char * argv[])
{
  int axis= 0;

  double axis1_start= 0.;
  double axis1_end= 0.;

  double axis2_start= 0.;
  double axis2_end= 0.;

  double pixel_width= 0;
  double pixel_axis= 1.;

  if( argc < 5 )
  {
    std::cerr<< std::endl;
    std::cerr<< "Need to give rootfile, volumename, axis and number of axis"<< std::endl;
    std::cerr<< "USAGE : ./XRayBenchmarkFromROOTFile [rootfile] [VolumeName] [ViewDirection(Axis)]"
             << "[PixelWidth(OutputImageSize)] [--usolids|--vecgeom(Default:usolids)] [--novoxel(Default:voxel)]"
             << std::endl;
    std::cerr<< "  ex) ./XRayBenchmarkFromROOTFile cms2015.root BSCTrap y 95"<< std::endl;
    std::cerr<< "      ./XRayBenchmarkFromROOTFile cms2015.root PLT z 500 --vecgeom --novoxel"<< std::endl<< std::endl;
    return 1;
  }

  TGeoManager::Import( argv[1] );
  std::string testvolume( argv[2] );

  if( strcmp(argv[3], "x")==0 )
    axis= 1;
  else if( strcmp(argv[3], "y")==0 )
    axis= 2;
  else if( strcmp(argv[3], "z")==0 )
    axis= 3;
  else
  {
    std::cerr<< "Incorrect axis"<< std::endl<< std::endl;
    return 1;
  }

  pixel_width= atof(argv[4]);

  for(auto i= 5; i< argc; i++)
  {
    if( ! strcmp(argv[i], "--usolids") )
      usolids= true;
    if( ! strcmp(argv[i], "--vecgeom") )
      usolids= false;
    if( ! strcmp(argv[i], "--novoxel") )
      voxelize = false;
  }

  int found = 0;
  TGeoVolume * foundvolume = NULL;
  // now try to find shape with logical volume name given on the command line
  TObjArray *vlist = gGeoManager->GetListOfVolumes( );
  for( auto i = 0; i < vlist->GetEntries(); ++i )
  {
    TGeoVolume * vol = reinterpret_cast<TGeoVolume*>(vlist->At( i ));
    std::string fullname(vol->GetName());
    
    std::size_t founds = fullname.compare(testvolume);
    if ( founds==0 ){
      found++;
      foundvolume = vol;

      std::cerr << "("<< i<< ")found matching volume " << foundvolume->GetName()
        << " of type " << foundvolume->GetShape()->ClassName() << "\n";
    }
  }

  std::cerr << "volume found " << found << " times \n\n";

  // if volume not found take world
  if( ! foundvolume ) {
      std::cerr << "specified volume not found; xraying complete detector\n";
      foundvolume = gGeoManager->GetTopVolume();
  }

  if( foundvolume ) {
    foundvolume->GetShape()->InspectShape();
    std::cerr << "volume capacity " 
          << foundvolume->GetShape()->Capacity() << "\n";

    // get bounding box to generate x-ray start positions
    double dx = ((TGeoBBox*)foundvolume->GetShape())->GetDX()*1.05;
    double dy = ((TGeoBBox*)foundvolume->GetShape())->GetDY()*1.05;
    double dz = ((TGeoBBox*)foundvolume->GetShape())->GetDZ()*1.05;
    double origin[3]= {0., };
    origin[0]= ((TGeoBBox*)foundvolume->GetShape())->GetOrigin()[0];
    origin[1]= ((TGeoBBox*)foundvolume->GetShape())->GetOrigin()[1];
    origin[2]= ((TGeoBBox*)foundvolume->GetShape())->GetOrigin()[2];
    
    TGeoMaterial * matVacuum = new TGeoMaterial("Vacuum",0,0,0);
    TGeoMedium * vac = new TGeoMedium("Vacuum",1,matVacuum);

    TGeoVolume* boundingbox= gGeoManager->MakeBox("BoundingBox", vac,
            std::abs(origin[0]) + dx,
            std::abs(origin[1]) + dy,
            std::abs(origin[2]) + dz );

    // TGeoManager * geom = boundingbox->GetGeoManager();
    std::cout << gGeoManager->CountNodes() << "\n";

    if(! voxelize ) DeleteROOTVoxels();

    gGeoManager = 0;

    TGeoManager * mgr2 = new TGeoManager();

//    delete gGeoManager;
//    gGeoManager = new TGeoManager();
    boundingbox->AddNode( foundvolume, 1);
    mgr2->SetTopVolume( boundingbox );
    mgr2->CloseGeometry();
    gGeoManager = mgr2;
    gGeoManager->Export("DebugGeom.root");

    mgr2->GetTopNode()->GetMatrix()->Print();

    std::cout << gGeoManager->CountNodes() << "\n";
    //delete world->GetVoxels();
    //world->SetVoxelFinder(0);
    
    std::cout<< std::endl;
    std::cout<< "BoundingBoxDX: "<< dx<< std::endl;
    std::cout<< "BoundingBoxDY: "<< dy<< std::endl;
    std::cout<< "BoundingBoxDZ: "<< dz<< std::endl;
    
    std::cout<< std::endl;
    std::cout<< "BoundingBoxOriginX: "<< origin[0]<< std::endl;
    std::cout<< "BoundingBoxOriginY: "<< origin[1]<< std::endl;
    std::cout<< "BoundingBoxOriginZ: "<< origin[2]<< std::endl<< std::endl;
  
    Vector3D<Precision> p;
    Vector3D<Precision> dir;
    
    if(axis== 1)
    {
      dir.Set(1., 0., 0.);
      //Transformation3D trans( 0, 0, 0, 5, 5, 5);
      //trans.Print();
     // dir = trans.TransformDirection( Vector3D<Precision> (1,0,0));

      axis1_start= origin[1]- dy;
      axis1_end= origin[1]+ dy;
      axis2_start= origin[2]- dz;
      axis2_end= origin[2]+ dz;
      pixel_axis= (dy*2)/pixel_width;
    }
    else if(axis== 2)
    {
      dir.Set(0., 1., 0.);
      //vecgeom::Transformation3D trans( 0, 0, 0, 5, 5, 5);
      //dir = trans.TransformDirection(dir);
      axis1_start= origin[0]- dx;
      axis1_end= origin[0]+ dx;
      axis2_start= origin[2]- dz;
      axis2_end= origin[2]+ dz;
      pixel_axis= (dx*2)/pixel_width;
    }
    else if(axis== 3)
    {
      dir.Set(0., 0., 1.);
      //vecgeom::Transformation3D trans( 0, 0, 0, 5, 5, 5);
      //dir = trans.TransformDirection(dir);
      axis1_start= origin[0]- dx;
      axis1_end= origin[0]+ dx;
      axis2_start= origin[1]- dy;
      axis2_end= origin[1]+ dy;
      pixel_axis= (dx*2)/pixel_width;
    }

    // init data for image
    int data_size_x= (axis1_end-axis1_start)/pixel_axis;
    int data_size_y= (axis2_end-axis2_start)/pixel_axis;
    int *volume_result= (int*) new int[data_size_y * data_size_x*3];

#ifdef VECGEOM_GEANT4
    int *volume_result_Geant4= (int*) new int[data_size_y * data_size_x*3];
#endif
    int *volume_result_VecGeom= (int*) new int[data_size_y * data_size_x*3];
    int *volume_result_VecGeomABB= (int*) new int[data_size_y * data_size_x*3];

    Stopwatch timer;
    timer.Start();
#ifdef CALLGRIND
    CALLGRIND_START_INSTRUMENTATION;
#endif
    XRayWithROOT( axis,
            Vector3D<Precision>(origin[0],origin[1],origin[2]),
            Vector3D<Precision>(dx,dy,dz),
            dir,
            axis1_start, axis1_end,
            axis2_start, axis2_end,
            data_size_x, data_size_y,
            pixel_axis,
            volume_result );
#ifdef CALLGRIND
    CALLGRIND_STOP_INSTRUMENTATION;
    CALLGRIND_DUMP_STATS;
#endif
    timer.Stop();

    std::cout << std::endl;
    std::cout << " ROOT Elapsed time : "<< timer.Elapsed() << std::endl;

    // Make bitmap file; generate filename
    std::stringstream imagenamebase;
    imagenamebase << "volumeImage_" << testvolume;
    if(axis==1) imagenamebase << "x";
    if(axis==2) imagenamebase << "y";
    if(axis==3) imagenamebase << "z";
    if(voxelize) imagenamebase << "_VOXELIZED_";
    std::stringstream ROOTimage;
    ROOTimage << imagenamebase.str();
    ROOTimage << "_ROOT.bmp";

    make_bmp(volume_result, ROOTimage.str().c_str(), data_size_x, data_size_y);
    make_bmp(volume_result, "foo.bmp", data_size_x, data_size_y, false);
#ifdef VECGEOM_GEANT4

    G4VPhysicalVolume * world = SetupGeant4Geometry( testvolume, Vector3D<Precision>( std::abs(origin[0]) + dx,
            std::abs(origin[1]) + dy,
            std::abs(origin[2]) + dz ) );
    G4GeoManager::Instance().LoadG4Geometry( world );

    timer.Start();

    XRayWithGeant4( world, axis,
            Vector3D<Precision>(origin[0],origin[1],origin[2]),
            Vector3D<Precision>(dx,dy,dz),
            dir,
            axis1_start, axis1_end,
            axis2_start, axis2_end,
            data_size_x, data_size_y,
            pixel_axis,
            volume_result_Geant4 );
    timer.Stop();

    std::stringstream G4image;
    G4image << imagenamebase.str();
    G4image << "_Geant4.bmp";
    make_bmp(volume_result_Geant4, G4image.str().c_str(), data_size_x, data_size_y);
    std::cout << std::endl;
    std::cout << " Geant4 Elapsed time : "<< timer.Elapsed() << std::endl;
    make_diff_bmp(volume_result, volume_result_Geant4, "diffROOTGeant4.bmp", data_size_x, data_size_y);
#endif

    // convert current gGeoManager to a VecGeom geometry
    RootGeoManager::Instance().LoadRootGeometry();
    std::cout << "Detector loaded " << "\n";
    ABBoxManager::Instance().InitABBoxesForCompleteGeometry();
    std::cout << "voxelized " << "\n";
    timer.Start();
#ifdef CALLGRIND
    CALLGRIND_START_INSTRUMENTATION;
#endif
    XRayWithVecGeom<SimpleNavigator>( axis,
               Vector3D<Precision>(origin[0],origin[1],origin[2]),
               Vector3D<Precision>(dx,dy,dz),
               dir,
               axis1_start, axis1_end,
               axis2_start, axis2_end,
               data_size_x, data_size_y,
               pixel_axis,
               volume_result_VecGeom );
#ifdef CALLGRIND
    CALLGRIND_START_INSTRUMENTATION;
    CALLGRIND_DUMP_STATS;
#endif
    timer.Stop();

    std::stringstream VecGeomimage;
    VecGeomimage << imagenamebase.str();
    VecGeomimage << "_VecGeom.bmp";
    make_bmp(volume_result_VecGeom, VecGeomimage.str().c_str(), data_size_x, data_size_y);

    make_diff_bmp(volume_result, volume_result_VecGeom, "diffROOTVecGeom.bmp", data_size_x, data_size_y);

    std::cout << std::endl;
    std::cout << " VecGeom Elapsed time : "<< timer.Elapsed() << std::endl;

    timer.Start();
#ifdef CALLGRIND
    CALLGRIND_START_INSTRUMENTATION;
#endif
    XRayWithVecGeom<ABBoxNavigator>( axis,
    Vector3D<Precision>(origin[0],origin[1],origin[2]),
    Vector3D<Precision>(dx,dy,dz),
    dir,
    axis1_start, axis1_end,
    axis2_start, axis2_end,
    data_size_x, data_size_y,
    pixel_axis,
    volume_result_VecGeomABB );
#ifdef CALLGRIND
    CALLGRIND_STOP_INSTRUMENTATION;
    CALLGRIND_DUMP_STATS;
#endif
    timer.Stop();

    std::stringstream VecGeomABBimage;
    VecGeomABBimage << imagenamebase.str();
    VecGeomABBimage << "_VecGeomABB.bmp";
    make_bmp(volume_result_VecGeomABB, VecGeomABBimage.str().c_str(), data_size_x, data_size_y);

    make_diff_bmp(volume_result_VecGeom, volume_result_VecGeomABB, "diffVecGeomSimplevsABB.bmp", data_size_x, data_size_y);
    make_diff_bmp(volume_result, volume_result_VecGeomABB, "diffROOTVecGeomABB.bmp", data_size_x, data_size_y);


    std::cout << std::endl;
    std::cout << " VecGeom ABB Elapsed time : "<< timer.Elapsed() << std::endl;

    return 0;

    // use the vector interface
    timer.Start();
    XRayWithVecGeom_VecNav( axis,
                   Vector3D<Precision>(origin[0],origin[1],origin[2]),
                   Vector3D<Precision>(dx,dy,dz),
                   dir,
                   axis1_start, axis1_end,
                   axis2_start, axis2_end,
                   data_size_x, data_size_y,
                   pixel_axis,
                   volume_result );
    timer.Stop();
    std::cout << std::endl;
    std::cout << " VecGeom Vector Interface Elapsed time : "<< timer.Elapsed() << std::endl;

    std::stringstream VecGeomimagevec;
    VecGeomimagevec << imagenamebase.str();
    VecGeomimagevec << "_VecGeomVecNav.bmp";
    make_bmp(volume_result, VecGeomimagevec.str().c_str(), data_size_x, data_size_y);



    delete[] volume_result;
  }
  return 0;
}
void XRayWithVecGeom(int axis,
                  Vector3D<Precision> origin,
                  Vector3D<Precision> bbox,
                  Vector3D<Precision> dir,
                  double axis1_start, double axis1_end,
                  double axis2_start, double axis2_end,
                  int data_size_x,
                  int data_size_y,
                  double pixel_axis,
                  int * image) {



if(VERBOSE){
    std::cout << "from [" << axis1_start << ";" << axis2_start
              << "] to [" << axis1_end   << ";" << axis2_end << "]\n";
    std::cout << "Xpixels " << data_size_x << " YPixels " << data_size_y << "\n";

    std::cout << pixel_axis << "\n";
}
    double pixel_width_1 = (axis1_end-axis1_start)/data_size_x;
    double pixel_width_2 = (axis2_end-axis2_start)/data_size_y;

    if(VERBOSE){
        std::cout << pixel_width_1 << "\n";
        std::cout << pixel_width_2 << "\n";
    }

    NavigationState * newnavstate = NavigationState::MakeInstance( GeoManager::Instance().getMaxDepth() );
    NavigationState * curnavstate = NavigationState::MakeInstance( GeoManager::Instance().getMaxDepth() );

    for( int pixel_count_2 = 0; pixel_count_2 < data_size_y; ++pixel_count_2 ){
        for( int pixel_count_1 = 0; pixel_count_1 < data_size_x; ++pixel_count_1 )
        {
            double axis1_count = axis1_start + pixel_count_1 * pixel_width_1 + 1E-6;
            double axis2_count = axis2_start + pixel_count_2 * pixel_width_2 + 1E-6;

            if(VERBOSE) {
                std::cout << "\n OutputPoint("<< axis1_count<< ", "<< axis2_count<< ")\n";
            }
         //   std::cout << pixel_count_1 << " " << pixel_count_2 << "\n";

            // set start point of XRay
            Vector3D<Precision> p;
            if( axis== 1 )
              p.Set( origin[0]-bbox[0], axis1_count, axis2_count);
            else if( axis== 2)
              p.Set( axis1_count, origin[1]-bbox[1], axis2_count);
            else if( axis== 3)
              p.Set( axis1_count, axis2_count, origin[2]-bbox[2]);

            SimpleNavigator nav;
            curnavstate->Clear();
            nav.LocatePoint( GeoManager::Instance().GetWorld(), p, *curnavstate, true );

#ifdef VECGEOM_DISTANCE_DEBUG
            gGeoManager->GetCurrentNavigator()->FindNode( p.x(), p.y(), p.z() );
#endif

//          curnavstate->Print();

            double distancetravelled=0.;
            int crossedvolumecount=0;

            if(VERBOSE) {
              std::cout << " StartPoint(" << p[0] << ", " << p[1] << ", " << p[2] << ")";
              std::cout << " Direction <" << dir[0] << ", " << dir[1] << ", " << dir[2] << ">"<< std::endl;
            }

            while( ! curnavstate->IsOutside() ) {
                double step = 0;
                newnavstate->Clear();
                Nav_t navigator;
                navigator.FindNextBoundaryAndStep( p,
                        dir,
                        *curnavstate,
                        *newnavstate,
                        vecgeom::kInfinity, step);

                //std::cout << "step " << step << "\n";
                distancetravelled+=step;
//
//              std::cout << "GOING FROM "
//                       << curnavstate->Top()->GetLabel() << "(";
//                        curnavstate->Top()->PrintType();
//                     std::cout << ") to ";
//
//                if( newnavstate->Top() ){
//                    std::cout << newnavstate->Top()->GetLabel() << "(";
//                    newnavstate->Top()->PrintType();
//                    std::cout << ")";
//                }
//                else
//                    std::cout << "outside ";
//
//                if ( curnavstate->Top() == newnavstate->Top() ) {
//                    std::cout << " CROSSING PROBLEM \n";
//                    curnavstate->Print();
//                    newnavstate->Print();
//                }
//
//                std::cout << "# step " << step << " crossed "<< crossedvolumecount << "\n";

                // here we have to propagate particle ourselves and adjust navigation state
                p = p + dir*(step + 1E-6);

//                std::cout << p << "\n";

                newnavstate->CopyTo(curnavstate);

                // Increase passed_volume
                // TODO: correct counting of travel in "world" bounding box
                if(step>0) crossedvolumecount++;

              //  if(crossedvolumecount > 1000){
                    //std::cerr << "OOPS: Problem for pixel " << pixel_count_1 << " " << pixel_count_2 << " \n";
                    //break;}
             } // end while

             ///////////////////////////////////
             // Store the number of passed volume at 'volume_result'
             *(image+pixel_count_2*data_size_x+pixel_count_1) = crossedvolumecount;

      } // end inner loop
    } // end outer loop

    NavigationState::ReleaseInstance( curnavstate );
    NavigationState::ReleaseInstance( newnavstate );

} // end XRayWithVecGeom
void XRayWithROOT(int axis,
                 Vector3D<Precision> origin,
                 Vector3D<Precision> bbox,
                 Vector3D<Precision> dir,
                 double axis1_start, double axis1_end,
                 double axis2_start, double axis2_end,
                 int data_size_x,
                 int data_size_y,
                 double pixel_axis,
                 int * image) {

if(VERBOSE){
    std::cout << "from [" << axis1_start << ";" << axis2_start
              << "] to [" << axis1_end   << ";" << axis2_end << "]\n";
    std::cout << "Xpixels " << data_size_x << " YPixels " << data_size_y << "\n";

    std::cout << pixel_axis << "\n";
}

double pixel_width_1 = (axis1_end-axis1_start)/data_size_x;
double pixel_width_2 = (axis2_end-axis2_start)/data_size_y;

    if(VERBOSE){
    std::cout << pixel_width_1 << "\n";
    std::cout << pixel_width_2 << "\n";
    }

    for( int pixel_count_2 = 0; pixel_count_2 < data_size_y; ++pixel_count_2 ){
        for( int pixel_count_1 = 0; pixel_count_1 < data_size_x; ++pixel_count_1 )
        {
            double axis1_count = axis1_start + pixel_count_1 * pixel_width_1 + 1E-6;
            double axis2_count = axis2_start + pixel_count_2 * pixel_width_2 + 1E-6;

            if(VERBOSE) {
                std::cout << "\n OutputPoint("<< axis1_count<< ", "<< axis2_count<< ")\n";
            }
            // set start point of XRay
            Vector3D<Precision> p;

            if( axis== 1 )
              p.Set( origin[0]-bbox[0], axis1_count, axis2_count);
            else if( axis== 2)
              p.Set( axis1_count, origin[1]-bbox[1], axis2_count);
            else if( axis== 3)
              p.Set( axis1_count, axis2_count, origin[2]-bbox[2]);

            TGeoNavigator * nav = gGeoManager->GetCurrentNavigator();
            nav->SetCurrentPoint( p.x(), p.y(), p.z() );
            nav->SetCurrentDirection( dir.x(), dir.y(), dir.z() );

            double distancetravelled=0.;
            int crossedvolumecount=0;
            double accumulateddensity =0.;

            if(VERBOSE) {
              std::cout << " StartPoint(" << p[0] << ", " << p[1] << ", " << p[2] << ")";
              std::cout << " Direction <" << dir[0] << ", " << dir[1] << ", " << dir[2] << ">"<< std::endl;
            }

            // propagate until we leave detector
            TGeoNode const * node = nav->FindNode();
            TGeoMaterial const * curmat = node->GetVolume()->GetMaterial();

          //  std::cout << pixel_count_1 << " " << pixel_count_2 << " " << dir << "\t" << p << "\t";
          //  std::cout << "IN|OUT" << nav->IsOutside() << "\n";
          //  if( node ) std::cout <<    node->GetVolume()->GetName() << "\t";
            while( node !=NULL ) {
                node = nav->FindNextBoundaryAndStep( vecgeom::kInfinity );
                distancetravelled+=nav->GetStep();
                accumulateddensity+=curmat->GetDensity() * distancetravelled;

                if(VERBOSE) {
                    if( node != NULL ){
                        std::cout << "  VolumeName: "<< node->GetVolume()->GetName();
                    }
                    else
                       std::cout << "  NULL: ";

                    std::cout << " step[" << nav->GetStep()<< "]"<< std::endl;
                    double const * pROOT = nav->GetCurrentPoint();
                    p = Vector3D<Precision>(pROOT[0],pROOT[1],pROOT[2]);
                    std::cout << " point(" << p[0] << ", " << p[1] << ", " << p[2] << ")";
                }
                // Increase passed_volume
                // TODO: correct counting of travel in "world" bounding box
                crossedvolumecount++;
                curmat = (node!=0) ? node->GetVolume()->GetMaterial() : 0;
            } // end while
            // std::cout << crossedvolumecount << "\n";

            ///////////////////////////////////
            // Store the number of passed volume at 'volume_result'
            *(image+pixel_count_2*data_size_x+pixel_count_1) = crossedvolumecount;// accumulateddensity ;// crossedvolumecount;

            if(VERBOSE) {
                std::cout << "  EndOfBoundingBox:";
                std::cout << " PassedVolume:" << "<"<< crossedvolumecount << " ";
                std::cout << " step[" << nav->GetStep()<< "]";
                std::cout << " Distance: " << distancetravelled<< std::endl;
            }
      } // end inner loop
    } // end outer loop
} // end XRayWithROOT
Exemplo n.º 9
0
void SPHSolver::AdvanceLeapFrog(float dt)
{
	for(int i = 0; i < mTotalParticles; i++)
	{
		Fluid* f_i = &mParticles[i];



		Vector3D accel = f_i->force;
		if(f_i->density == 0.0f)
			accel.Set(0,0,0);
		else
		    accel *= 1/f_i->density;
		
        accel.z += -9.81f;
		//accel += *part->ArtifVis;

		
		float speed = accel.DistanceSquared();
		if(speed > 200*200)
		{
			accel *= 200/std::sqrt(speed);
		}

        
		//Calculate the new veloctiy
		Vector3D vNext = accel; 
		vNext *= dt;

		vNext += f_i->velEval;
		
		//vNext += *part->VelocityAdjust;

		f_i->pos.x += vNext.x*dt;
		f_i->pos.y += vNext.y*dt;
		f_i->pos.z += vNext.z*dt;

		float boxSize = 1.0f;


		if(f_i->pos.z < -1-EPSILON)
		{
			f_i->pos.z = -1;
			vNext.z *= -0.01f;
		}
		
		if(f_i->pos.x < -boxSize-EPSILON)
		{
			f_i->pos.x = -boxSize;
			vNext.x *= -0.01f;
		}
		else if(f_i->pos.x > boxSize+EPSILON)
		{
			f_i->pos.x = boxSize;
			vNext.x *= -0.01f;
		}
		if(f_i->pos.y < -boxSize-EPSILON)
		{
			f_i->pos.y = -boxSize;
			vNext.y *= -0.01f;
		}
		else if(f_i->pos.y > boxSize+EPSILON)
		{
			f_i->pos.y = boxSize;
			vNext.y *= -0.01f;
		}
		
		//Evaluate the velocity
		f_i->vel.x = vNext.x + f_i->velEval.x;
		f_i->vel.y = vNext.y + f_i->velEval.y;
		f_i->vel.z = vNext.z + f_i->velEval.z;
		f_i->vel *= 0.5f;
		f_i->velEval.Set(vNext.x,vNext.y,vNext.z);



	}
}