bool CTerrainMod_Suck::ApplyMod( Vector &vecTargetPos, Vector const &vecOriginalPos ) { if( vecTargetPos.x < m_BBMin.x || vecTargetPos.y < m_BBMin.y || vecTargetPos.z < m_BBMin.z || vecTargetPos.x > m_BBMax.x || vecTargetPos.y > m_BBMax.y || vecTargetPos.z > m_BBMax.z ) { return false; } Vector vPos, vOriginalPos; if( m_bSuckToNormal ) { // put in a space where +z moves along the normal m_mNormalTransform.V3Mul( vecTargetPos, vPos ); m_mNormalTransform.V3Mul( vecOriginalPos, vOriginalPos ); } else { vPos = vecTargetPos; vOriginalPos = vecOriginalPos; } Vector vDir = vPos - m_vCenter; float flDist = vDir.AsVector2D().Length(); if( flDist < m_flRadius && vPos.z < m_vCenter.z ) { float flPercent = (m_flRadius - flDist) / m_flRadius; flPercent = ApplyGain( flPercent ); // (smooth out near 0 and 1) vPos.z += m_flStrength * flPercent; vPos.z = min( vPos.z, m_vCenter.z ); // Clamp the distance. LockDist( vPos, vOriginalPos, m_bStayAboveOriginal ); // Transform back to the original space. if( m_bSuckToNormal ) m_mInvNormalTransform.V3Mul( vPos, vecTargetPos ); else vecTargetPos = vPos; return true; } else { return false; } }
const std::vector <float> & CARCONTROLMAP_LOCAL::ProcessInput(const std::string & joytype, EVENTSYSTEM_SDL & eventsystem, float steerpos, float dt, bool joy_200, float carms, float speedsens, int screenw, int screenh, float button_ramp, bool hgateshifter) { assert(inputs.size() == CARINPUT::INVALID); //this looks weird, but it ensures that our inputs vector contains exactly one item per input assert(lastinputs.size() == CARINPUT::INVALID); //this looks weird, but it ensures that our inputs vector contains exactly one item per input for (std::map <CARINPUT::CARINPUT, std::vector <CONTROL> >::iterator n = controls.begin(); n != controls.end(); ++n) { float newval = 0.0; for (std::vector <CONTROL>::iterator i = n->second.begin(); i != n->second.end(); ++i) { bool handled = false; float tempval = newval; if (i->type == CONTROL::JOY) { //cout << "type joy" << std::endl; if (i->joytype == CONTROL::JOYAXIS) { float val = eventsystem.GetJoyAxis(i->joynum, i->joyaxis); if (i->joyaxistype == CONTROL::NEGATIVE) val = -val; val = ApplyDeadzone(i->deadzone,val); val = ApplyGain(i->gain,val); double absval = val; bool neg = false; if (val < 0) { absval = -val; neg = true; } val = ApplyExponent(i->exponent,absval); if (neg) val = -val; tempval = val; handled = true; } else if (i->joytype == CONTROL::JOYBUTTON) { TOGGLE button = eventsystem.GetJoyButton(i->joynum, i->joybutton); if (i->onetime) { if (i->joypushdown && button.GetImpulseRising()) tempval = 1.0; else if (!i->joypushdown && button.GetImpulseFalling()) tempval = 1.0; else tempval = 0.0; handled = true; } else { float downval = 1.0; float upval = 0.0; if (!i->joypushdown) { downval = 0.0; upval = 1.0; } tempval = Ramp(lastinputs[n->first], button.GetState() ? downval : upval, button_ramp, dt); handled = true; } } } else if (i->type == CONTROL::KEY) { //cout << "type key" << std::endl; EVENTSYSTEM_SDL::BUTTON_STATE keystate = eventsystem.GetKeyState(SDLKey(i->keycode)); if (i->onetime) { if (i->keypushdown && keystate.just_down) tempval = 1.0; else if (!i->keypushdown && keystate.just_up) tempval = 1.0; else tempval = 0.0; handled = true; } else { float downval = 1.0; float upval = 0.0; if (!i->keypushdown) { downval = 0.0; upval = 1.0; } //if (inputs[n->first] != keystate.down ? downval : upval) std::cout << "Key ramp: " << i->keycode << ", " << n->first << std::endl; tempval = Ramp(lastinputs[n->first], keystate.down ? downval : upval, button_ramp, dt); handled = true; } } else if (i->type == CONTROL::MOUSE) { //cout << "type mouse" << std::endl; if (i->mousetype == CONTROL::MOUSEBUTTON) { //cout << "mousebutton" << std::endl; EVENTSYSTEM_SDL::BUTTON_STATE buttonstate = eventsystem.GetMouseButtonState(i->mbutton); if (i->onetime) { if (i->mouse_push_down && buttonstate.just_down) tempval = 1.0; else if (!i->mouse_push_down && buttonstate.just_up) tempval = 1.0; else tempval = 0.0; handled = true; } else { float downval = 1.0; float upval = 0.0; if (!i->mouse_push_down) { downval = 0.0; upval = 1.0; } tempval = Ramp(lastinputs[n->first], buttonstate.down ? downval : upval, button_ramp, dt); handled = true; } } else if (i->mousetype == CONTROL::MOUSEMOTION) { //cout << "mousemotion" << std::endl; std::vector <int> pos = eventsystem.GetMousePosition(); //std::cout << pos[0] << "," << pos[1] << std::endl; float xval = (pos[0]-screenw/2.0)/(screenw/4.0); if (xval < -1) xval = -1; if (xval > 1) xval = 1; float yval = (pos[1]-screenh/2.0)/(screenh/4.0); if (yval < -1) yval = -1; if (yval > 1) yval = 1; float val = 0; if (i->mdir == CONTROL::UP) val = -yval; else if (i->mdir == CONTROL::DOWN) val = yval; else if (i->mdir == CONTROL::LEFT) val = -xval; else if (i->mdir == CONTROL::RIGHT) val = xval; if (val < 0) val = 0; else if (val > 1) val = 1; val = ApplyDeadzone(i->deadzone,val); val = ApplyGain(i->gain,val); if (val < 0) val = 0; else if (val > 1) val = 1; double absval = val; bool neg = false; if (val < 0) { absval = -val; neg = true; } val = ApplyExponent(i->exponent,absval); if (neg) val = -val; if (val < 0) val = 0; else if (val > 1) val = 1; tempval = val; //cout << val << std::endl; handled = true; } //else cout << "mouse???" << std::endl; } //else cout << "type invalid" << std::endl; if (tempval > newval) newval = tempval; assert(handled); } if (newval < 0) newval = 0; if (newval > 1.0) newval = 1.0; inputs[n->first] = newval; //std::cout << "New input value: " << inputs[n->first] << std::endl; } if (hgateshifter) { bool havegear = inputs[CARINPUT::FIRST_GEAR] || inputs[CARINPUT::SECOND_GEAR] || inputs[CARINPUT::THIRD_GEAR] || inputs[CARINPUT::FOURTH_GEAR] || inputs[CARINPUT::FIFTH_GEAR] || inputs[CARINPUT::SIXTH_GEAR] || inputs[CARINPUT::REVERSE]; if (!havegear) inputs[CARINPUT::NEUTRAL] = 1.0; } lastinputs = inputs; //do steering processing ProcessSteering(joytype, steerpos, dt, joy_200, carms*2.23693629, speedsens); return inputs; }