void MainForm::InitScene() { scene = drawPanel->GetScene(); #ifdef WORK_PC scene->SetShadersPath("E:\\D3D\\ShaderTamplates"); #else scene->SetShadersPath("E:\\Projects\\D3D\\ShaderTamplates"); #endif scene->Init(); scene->SetGlobalAmbient(0.03f, 0.03f, 0.03f, 1.0f); scene->SetBackgroundColor(Color::Blue()); MainScene::Set(scene); CameraPtr camPtr = scene->AddCamera(); Camera * cam = camPtr.Get(); cam->SetPosition(0.0f,0.0f,-130.0f); cam->LookAt(0.0f,0.0f,0.0f); cam->SetNearDistance(2.0f); cam->SetFarDistance(10000.0f); cam->SetFOV(45.0f); scene->SetActiveCamera(camPtr); cameraController.SetCamera(camPtr); cameraController.SetMoveAmount(2.0f); cameraController.SetZoomAmount(10.0f); cameraController.SetRotateAmount(3.0f); }
void Object_Picking_Test::RunTest(float mX, float mY) { CameraPtr ptr = scene->GetActiveCamera(); Camera * cam = ptr.Get(); cam->CalcPickingRay(mX, mY); using namespace DirectX; for (unsigned int i = 0; i < pickable.size(); i++) { SceneObj obj = pickable[i]; StaticEntity * ent = obj.obj.Get(); XMFLOAT4X4 mat = ent->GetWorldMatrix(); XMMATRIX world = XMLoadFloat4x4((XMFLOAT4X4*)&mat); world = XMMatrixTranspose(world); XMVECTOR det = XMMatrixDeterminant(world); XMMATRIX invWorld = XMMatrixInverse(&det, world); Vector3 org = cam->GetPosition(); Vector3 dir = cam->GetPickingRayDirection(); XMVECTOR orgInv = XMVector3TransformCoord(XMLoadFloat3((XMFLOAT3*)&org), invWorld); XMVECTOR dirInv = XMVector3TransformNormal(XMLoadFloat3((XMFLOAT3*)&dir), invWorld); dirInv = XMVector3Normalize(dirInv); XMStoreFloat3((XMFLOAT3*)&org, orgInv); XMStoreFloat3((XMFLOAT3*)&dir, dirInv); AABB bbox = ent->GetAABB(); /*XMVECTOR max = XMLoadFloat3((XMFLOAT3*)&bbox.max); XMVECTOR min = XMLoadFloat3((XMFLOAT3*)&bbox.min); max = XMVector3TransformCoord(max, world); min = XMVector3TransformCoord(min, world); XMStoreFloat3((XMFLOAT3*)&bbox.max, max); XMStoreFloat3((XMFLOAT3*)&bbox.min, min);*/ if (bbox.RayIntersact(org, dir)) { obj.bbox.Get()->SetVisible(!obj.bbox.Get()->IsVisible()); } } }