bool SnapPivot_Mode::DrawBounds(ViewExp *vpt, bool hitTest, bool hightLight, Point3& hitPoint) { if (mPreviewMesh == nullptr) return false; GraphicsWindow *gw = vpt->getGW(); gw->setTransform(mBoundingTM); if (hitTest) { gw->setRndLimits(gw->getRndLimits() | GW_PICK); gw->clearHitCode(); } Box3 bounds; bounds.Init(); bool useSel = false; for (int i = 0; i < mPreviewMesh->numv; i++) { if (mPreviewMesh->v[i].GetFlag(MN_DEAD)) continue; if (mPreviewMesh->v[i].GetFlag(MN_SEL)) { useSel = true; break; } } Matrix3 tm; Matrix3 boundsTMInverse; boundsTMInverse = Inverse(mBoundingTM); tm = mMeshTM * boundsTMInverse; for (int i = 0; i < mPreviewMesh->numv; i++) { if (mPreviewMesh->v[i].GetFlag(MN_DEAD)) continue; if (useSel) { if (mPreviewMesh->v[i].GetFlag(MN_SEL)) bounds += mPreviewMesh->v[i].p*tm; } else bounds += mPreviewMesh->v[i].p*tm; } Point3 p[9]; gw->setColor(ColorType::LINE_COLOR, mBoundsColor); gw->startMarkers(); p[0] = bounds[0]; p[1] = bounds[1]; p[2] = bounds[2]; p[3] = bounds[3]; bool hit = DrawBoxFace(gw, p, hitTest, hitPoint); if (hit && hitTest) return true; p[0] = bounds[4]; p[1] = bounds[5]; p[2] = bounds[6]; p[3] = bounds[7]; hit = DrawBoxFace(gw, p, hitTest, hitPoint); if (hit && hitTest) return true; p[0] = (bounds[0] + bounds[4])*0.5f; p[1] = (bounds[1] + bounds[5])*0.5f; p[2] = (bounds[2] + bounds[6])*0.5f; p[3] = (bounds[3] + bounds[7])*0.5f; hit = DrawBoxFace(gw, p, hitTest, hitPoint); if (hit && hitTest) return true; gw->endMarkers(); Point3 edgeColor(mBoundsColor); edgeColor *= 0.8f; gw->setColor(ColorType::LINE_COLOR, edgeColor); gw->startSegments(); p[0] = bounds[0]; p[1] = bounds[1]; p[2] = bounds[3]; p[3] = bounds[2]; p[4] = bounds[0]; for (int i = 0; i < 4; i++) gw->segment(&p[i], 1); p[0] = bounds[4]; p[1] = bounds[5]; p[2] = bounds[7]; p[3] = bounds[6]; p[4] = bounds[4]; for (int i = 0; i < 4; i++) gw->segment(&p[i], 1); p[0] = bounds[0]; p[1] = bounds[4]; gw->segment(&p[0], 1); p[0] = bounds[1]; p[1] = bounds[5]; gw->segment(&p[0], 1); p[0] = bounds[2]; p[1] = bounds[6]; gw->segment(&p[0], 1); p[0] = bounds[3]; p[1] = bounds[7]; gw->segment(&p[0], 1); gw->endSegments(); return false; }