//----------------------------------------------------------------------------- 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; }
// 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); }
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; }
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); }
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
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); } }