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()); } } }
void Object_Picking_Test::Init(Scene * scene) { this->scene = scene; currentBox = 0; StaticEntityPtr dogPtr2 = scene->AddStaticEntity("assets/sphere.smodel", "dog"); StaticEntityPtr dogBBox = CreateBBox(dogPtr2); SceneObj obj; obj.obj = dogPtr2; obj.bbox = dogBBox; pickable.push_back(obj); StaticEntity * dog = dogPtr2.Get(); dog->Illuminate(false); dog->SetPosition(20.0f, 0.0, 0.0f); dog->SetScale(100.0f, 100.0f, 100.0f); dog->SetRotationY(40.0f); dogBBox.Get()->SetScale(100.0f, 100.0f, 100.0f); //dogBBox.Get()->CalculateTransform(false); DirectX::XMFLOAT4X4 dogMat = dog->GetWorldMatrix(); dogBBox.Get()->CalculateTransform(false); dogBBox.Get()->SetTransform(dogMat); DirectX::XMFLOAT4X4 boxMat = dogBBox.Get()->GetWorldMatrix(); //dog->SetRotation(0.0f, -60.0f, 180.0f); //dog->SetRotationY(45.0f); Material * pMat = dog->GetMaterial(0); pMat->SetDiffuseColor(Color(1.0, 0.0f, 0.0f, 1.0f)); }