/*! Compute a force based on a mass attached to the cursor * and add this force to the global cursor force. */ void OscCursorCHAI::addCursorMassForce() { double timestep = simulation()->timestep(); // if no mass, just update the mass position if (m_mass.m_value <= 0) { m_massVel = (m_pCursor->m_deviceGlobalPos - m_massPos) / timestep; m_massPos = m_pCursor->m_deviceGlobalPos; return; } double k=10; // stiffness of mass-spring double b=0.001;//2*sqrt(k*m_mass.m_value); // critical damping cVector3d posdiff(m_pCursor->m_deviceGlobalPos - m_massPos); cVector3d springVel((posdiff - m_lastPosDiff)/timestep); m_lastPosDiff = posdiff; cVector3d veldiff(m_pCursor->m_deviceGlobalVel - m_massVel); cVector3d force(-k*posdiff - b*springVel); m_massPos += m_massVel*timestep; m_massVel -= force/m_mass.m_value*timestep; m_pCursor->m_lastComputedGlobalForce += force*10; }
static void sel_extend(pos selpoint) { if (term.selected) { if (!term.sel_rect) { /* * For normal selection, we extend by moving * whichever end of the current selection is closer * to the mouse. */ if (posdiff(selpoint, term.sel_start) < posdiff(term.sel_end, term.sel_start) / 2) { term.sel_anchor = term.sel_end; decpos(term.sel_anchor); } else term.sel_anchor = term.sel_start; } else { /* * For rectangular selection, we have a choice of * _four_ places to put sel_anchor and selpoint: the * four corners of the selection. */ term.sel_anchor.x = selpoint.x * 2 < term.sel_start.x + term.sel_end.x ? term.sel_end.x - 1 : term.sel_start.x; term.sel_anchor.y = selpoint.y * 2 < term.sel_start.y + term.sel_end.y ? term.sel_end.y : term.sel_start.y; } } else term.sel_anchor = selpoint; sel_drag(selpoint); }