bool CTerrainData::Pick(const Vec3D& vRayPos, const Vec3D& vRayDir, Vec3D* pPos)const { // 格子地图的快速PICK int nIncX = vRayDir.x>0?1:-1; int nIncY = vRayDir.z>0?1:-1; float fK = vRayDir.z/vRayDir.x; float fB = vRayPos.z - fK*vRayPos.x; int nX = int(vRayPos.x)-nIncX; int nY = int(vRayPos.z)-nIncY; if (fK<1&&fK>-1) { for (int i = 0; i < MAX_PICK_COUNT; i++) { int nCellX = nX + nIncX; int nCellY = (int)(fK*(float)nCellX+fB); if (nCellY!=nY) { nY = nCellY; nCellX = nX - (nIncX<0); nCellY = nY - nIncY*(nIncX<0); } else { nX = nCellX; } if (PickCell(nCellX, nCellY, vRayPos, vRayDir, pPos)) { return true; } } } else { for (int i = 0; i < MAX_PICK_COUNT; i++) { int nCellY = nY + nIncY; int nCellX = (int)(((float)nCellY-fB)/fK); if (nCellX!=nX) { nX = nCellX; nCellX = nX - nIncX*(nIncY<0); nCellY = nY - (nIncY<0); } else { nY = nCellY; } if (PickCell(nCellX, nCellY, vRayPos, vRayDir, pPos)) { return true; } } } return false; }
void CUIDragDropReferenceList::OnItemDrop(CUIWindow* w, void* pData) { OnItemSelected(w, pData); CUICellItem* itm = smart_cast<CUICellItem*>(w); VERIFY(itm->OwnerList() == itm->OwnerList()); if(m_f_item_drop && m_f_item_drop(itm)) { DestroyDragItem(); return; } CUIDragDropListEx* old_owner = itm->OwnerList(); CUIDragDropListEx* new_owner = m_drag_item->BackList(); if(old_owner && new_owner && old_owner!=new_owner) { inherited::OnItemDrop(w, pData); return; } CActor* actor = smart_cast<CActor*>(Level().CurrentViewEntity()); if(actor) { Ivector2 vec = PickCell(GetUICursor().GetCursorPosition()); if(vec.x!=-1&&vec.y!=-1) { Ivector2 vec2 = m_container->GetItemPos(itm); if(vec2.x!=-1&&vec2.y!=-1) { u8 index = u8(vec2.x); shared_str tmp = ACTOR_DEFS::g_quick_use_slots[vec.x]; xr_strcpy(ACTOR_DEFS::g_quick_use_slots[vec.x], ACTOR_DEFS::g_quick_use_slots[index]); xr_strcpy(ACTOR_DEFS::g_quick_use_slots[index], tmp.c_str()); ReloadReferences(actor); return; } } } DestroyDragItem(); }