bool ComTerrain::CalcPickedPosition(D3DXVECTOR3 & out, WORD screenX, WORD screenY) { Ray ray = Ray::RayAtWorldSpace(screenX, screenY); float minDist = FLT_MAX; float dist = 0; bool bIntersect = false; for (size_t i = 0; i < m_surfaceVertices.size(); i += 3) { if (ray.CalcIntersectTri(&m_surfaceVertices[i], &dist)) { if (dist < minDist) { bIntersect = true; minDist = dist; out = ray.m_pos + dist * ray.m_dir; } } } return bIntersect; }
bool ComCharacter::CheckPickingMon() { if (m_pFollow == NULL) return false; Mouse* pMouse = Input::GetInstance()->m_pMouse; Vector3 mousePos = Input::GetInstance()->m_pMouse->GetPosition(); list<GameObject*> listMonster = GameObject::FindAll(eTag_Monster); for (auto & o : listMonster) { ComRenderCubePN* pCube = (ComRenderCubePN*)o->GetComponent("ComRenderCubePN"); // 죽었을 때는 몬스터 픽킹을 하지 않는다 if (pCube->Enable == false) continue; Ray ray = Ray::RayAtWorldSpace(mousePos.x, mousePos.y); vector<Vector3>& vertices = pCube->GetVector(); for (size_t i = 0; i < vertices.size(); i += 3) { float dist = 0; bool pickMon = ray.CalcIntersectTri(&vertices[i], &dist); if (pickMon == true) { // 몬스터를 따라간다. m_pFollow->pTarget = o; m_pFollow->fMoveSpeed = Status->MOVE_SPEED; pAttackTarget = (ComSmallderonAI*)o->GetComponent("ComCharacter"); return true; } } } return false; }