TLTreeItem* PointSearch (TLTreeItem* pStart, POINT mpt, int* iType) { TLTreeItem* p; TLTreeItem* pp; p = pStart; while (p) { if (PtInRect (&p->buttonRect, mpt)) { *iType = TLK_BUTTON; return p; } if (PtInRect (&p->selectRect, mpt)) { *iType = TLK_SELECT; return p; } if (p->state & TLIS_EXPANDED) { pp = PointSearch (p->childItem, mpt, iType); if (pp) return pp; } if (p->buttonRect.right < p->buttonRect.left) { *iType = TLK_NONE; return NULL; } p = p->nextItem; } *iType = TLK_NONE; return NULL; }
void TLLeftButtonDblClk (TLWndData* pWD, WPARAM wParam, LPARAM lParam) { int iHitType; TLTreeItem* pHit; POINT mpt; BOOL bControl; mpt.x = LOWORD (lParam); mpt.y = HIWORD (lParam); if (wParam & MK_CONTROL) bControl = TRUE; else bControl = FALSE; pHit = PointSearch (pWD->rootItem, mpt, &iHitType); switch (iHitType) { case TLK_NONE : break; case TLK_BUTTON : if (pHit->state & TLIS_EXPANDED) { pHit->state &= ~TLIS_EXPANDED; } else { pHit->state |= TLIS_EXPANDED; if (bControl) TLExpandTree (pHit->childItem); TLExpandAutoScroll (pWD, pHit); } InvalidateRect (pWD->hWnd, &pWD->tlInval, TRUE); break; case TLK_SELECT : if (pHit->childItem) { if (pHit->state & TLIS_EXPANDED) { pHit->state &= ~TLIS_EXPANDED; } else { pHit->state |= TLIS_EXPANDED; if (bControl) TLExpandTree (pHit->childItem); TLExpandAutoScroll (pWD, pHit); } InvalidateRect (pWD->hWnd, &pWD->tlInval, TRUE); } else { pWD->nmTreeList.itemOld.hItem = NULL; pWD->nmTreeList.itemNew.hItem = (HTLITEM)pHit; pWD->nmTreeList.itemNew.state = pHit->state; pWD->nmTreeList.flags = TLC_BYMOUSE; pWD->nmTreeList.hdr.code = TLN_ITEMDBLCLICKED; pWD->nmTreeList.ptDrag = mpt; SendMessage (pWD->hWndParent, WM_NOTIFY, pWD->id, (LPARAM)&(pWD->nmTreeList)); } break; } }
void PolygonCollider::Init(std::vector<Vec2>& vec) { mType = PolygonType; FirstPoint(vec); PointAngle(vec); PointSort(vec, vertices); PointSearch(vec, vertices); Vec2 normal{}; Vec2 u = vertices[1] - vertices[0]; Vec2 v = vertices[2] - vertices[0]; normal = Cross(u, v); Normalize(normal); for (unsigned i = 0; i < vertices.size(); i++) { vertices[i].nx = normal.x; vertices[i].ny = normal.y; vertices[i].nz = normal.z; } COPY_TO_VERTEXBUFFER(); axes.reserve(getVertsNum()); for (unsigned i = 0; i < getVertsNum(); i++) { // get the current vertex Vec2 p1 = vertices[i]; // get the next vertex Vec2 p2 = vertices[i + 1 == getVertsNum() ? 0 : i + 1]; // subtract thw two to get the edge vector Vec2 edge = Subtract(p1, p2); // get either perpendicular vector Vec2 normal = edge.Perpendicular(); Normalize(normal); axes.emplace_back(normal); } }
void TLRightButtonDown (TLWndData* pWD, WPARAM wParam, LPARAM lParam) { int iHitType; TLTreeItem* pHit; POINT mpt; if (wParam & MK_CONTROL) return; if (GetKeyState (VK_SHIFT) & 0x8000) return; mpt.x = LOWORD (lParam); mpt.y = HIWORD (lParam); pWD->nmTreeList.flags = 0; pWD->nmTreeList.itemNew.hItem = NULL; pWD->nmTreeList.itemOld.hItem = NULL; pHit = PointSearch (pWD->rootItem, mpt, &iHitType); switch (iHitType) { case TLK_NONE : TLDeselectTree (pWD, pWD->rootItem, NULL); pWD->firstSelectItem = NULL; pWD->nmTreeList.flags |= TLC_BYMOUSE; if (pWD->focusItem) { pHit = pWD->focusItem; pWD->focusItem = NULL; TLInvalidateItem (pWD, pHit); } break; case TLK_BUTTON : break; case TLK_SELECT : SendMessage (pWD->hWndToolTip, TTM_TRACKACTIVATE, FALSE, 0); if (!(pHit->state & TLIS_SELECTED)) { TLDeselectTree (pWD, pWD->rootItem, pHit); pHit->state |= TLIS_SELECTED; pWD->iNumberSelected = 1; if (TLSelectAutoScroll (pWD, pHit)) InvalidateRect (pWD->hWnd, &pWD->tlInval, TRUE); pWD->nmTreeList.itemNew.hItem = (HTLITEM)pHit; pWD->nmTreeList.itemNew.state = pHit->state; pWD->nmTreeList.flags |= TLC_BYMOUSE; } if (pWD->focusItem) { pWD->focusItem->state &= ~TLIS_FOCUSED; pWD->nmTreeList.itemOld.hItem = (HTLITEM)pWD->focusItem; pWD->nmTreeList.itemOld.state = pWD->focusItem->state; TLInvalidateItem (pWD, pWD->focusItem); } pHit->state |= TLIS_FOCUSED; pWD->focusItem = pHit; TLInvalidateItem (pWD, pHit); break; } if (pWD->nmTreeList.flags) { if (pWD->iNumberSelected > 1) pWD->nmTreeList.flags |= TLC_MULTIPLE; pWD->nmTreeList.hdr.code = TLN_SELCHANGED; pWD->nmTreeList.ptDrag = mpt; SendMessage (pWD->hWndParent, WM_NOTIFY, pWD->id, (LPARAM)&(pWD->nmTreeList)); } }
BOOL DragOverInternal (TLWndData* pWD, LPARAM lParam) { INT irow, iHitType; TLTreeItem* pHit; POINT mpt; BOOL bRet; BOOL bShift = FALSE; mpt.x = LOWORD (lParam); mpt.y = HIWORD (lParam); pWD->nmTreeList.hdr.code = 0; pWD->nmTreeList.itemNew.hItem = NULL; pWD->nmTreeList.itemNew.state = 0; pWD->nmTreeList.itemOld.hItem = NULL; pHit = PointSearch (pWD->rootItem, mpt, &iHitType); switch (iHitType) { case TLK_NONE : TLDeDragOverTree (pWD, pWD->rootItem, NULL); SetCursor (pWD->hCursorNoDrag); pWD->firstSelectItem = NULL; if (pWD->focusItem) { pHit = pWD->focusItem; pWD->focusItem = NULL; } pWD->nmTreeList.itemNew.hItem = NULL; pWD->nmTreeList.itemNew.state = 0; pWD->nmTreeList.hdr.code = TLN_DRAGGEDOVER; bRet = FALSE; break; default : if (pWD->uDragScrollState == 0) { irow = 0; TLGetRow (pWD->rootItem, pHit, &irow); if (irow == pWD->iFirstRow) { pWD->iFirstRow--; if (pWD->iFirstRow < 0) pWD->iFirstRow = 0; else { SetTimer (pWD->hWnd, DRAGSCROLLTIMERID, DRAGSCROLLTIME, NULL); pWD->uDragScrollState = DRAGSCROLL_DOWN; pWD->nmTreeList.itemNew.hItem = NULL; pWD->nmTreeList.itemNew.state = 0; pWD->nmTreeList.hdr.code = TLN_AUTOSCROLLED; pWD->nmTreeList.flags |= TLC_BYMOUSE; SendMessage (pWD->hWndParent, WM_NOTIFY, pWD->id, (LPARAM)&(pWD->nmTreeList)); } } if (irow == (pWD->iFirstRow + pWD->iMaxRows)) { pWD->iFirstRow++; SetTimer (pWD->hWnd, DRAGSCROLLTIMERID, DRAGSCROLLTIME, NULL); pWD->uDragScrollState = DRAGSCROLL_UP; pWD->nmTreeList.itemNew.hItem = NULL; pWD->nmTreeList.itemNew.state = 0; pWD->nmTreeList.hdr.code = TLN_AUTOSCROLLED; pWD->nmTreeList.flags |= TLC_BYMOUSE; SendMessage (pWD->hWndParent, WM_NOTIFY, pWD->id, (LPARAM)&(pWD->nmTreeList)); } } TLDeDragOverTree (pWD, pWD->rootItem, pHit); SetCursor (pWD->hCursorDragging); pWD->iNumberSelected = 0; pHit->state |= TLIS_DRAGGEDOVER; (pWD->iNumberSelected)++; pWD->nmTreeList.itemNew.hItem = (HTLITEM)pHit; pWD->nmTreeList.itemNew.state = pHit->state; pWD->nmTreeList.hdr.code = TLN_DRAGGEDOVER; if (pWD->focusItem != pHit) { if (pWD->focusItem) { pWD->focusItem->state &= ~TLIS_FOCUSED; pWD->nmTreeList.itemOld.hItem = (HTLITEM)pWD->focusItem; pWD->nmTreeList.itemOld.state = pWD->focusItem->state; } } bRet = TRUE; break; } if (pWD->nmTreeList.hdr.code) { pWD->nmTreeList.flags |= TLC_BYMOUSE; pWD->nmTreeList.ptDrag = mpt; SendMessage (pWD->hWndParent, WM_NOTIFY, pWD->id, (LPARAM)&(pWD->nmTreeList)); } return bRet; }