OBB OBBTransform(const mat4& mat, const OBB& obb) { OBB result; mat4 matIT = TransposeOfInverse(mat); result.m_center = TransformPoint(mat, obb.m_center); for(int i = 0; i < 3; ++i) result.m_b[i] = TransformVec(matIT, obb.m_b[i]); return result; }
void TransformVec (ElementId ei, const T & vec, TRANSFORM_TYPE type) const { TransformVec (ei.Nr(), ei.IsBoundary(), vec, type); }
bool VecSliderMenuItem::OnKey(int key, int mod) { float inc = m_scale * kInc; if(mod & KMOD_SHIFT) inc = m_scale * kLargeInc; else if(mod & KMOD_CTRL) inc = m_scale * kSmallInc; float incAmt = 0.f; switch(key) { case SDLK_UP: m_pos = Max(0, m_pos - 1); break; case SDLK_DOWN: m_pos = Min(VECSLIDE_NUM-1, m_pos + 1); break; case SDLK_LEFT: incAmt = -inc; break; case SDLK_RIGHT: incAmt = inc; break; case SDLK_BACKSPACE: menu_DeactivateMenuItem(); break; default: break; } vec3 val = m_get(); vec3 old = val; float radAmt = (M_PI / 180.f) * incAmt; mat4 rotmat; static const vec3 kXAxis = {1,0,0}; static const vec3 kYAxis = {0,1,0}; static const vec3 kZAxis = {0,0,1}; switch(m_pos) { case VECSLIDE_RotateX: rotmat = RotateAround(kXAxis, radAmt); val = TransformVec(rotmat, val); break; case VECSLIDE_RotateY: rotmat = RotateAround(kYAxis, radAmt); val = TransformVec(rotmat, val); break; case VECSLIDE_RotateZ: rotmat = RotateAround(kZAxis, radAmt); val = TransformVec(rotmat, val); break; case VECSLIDE_X: val.x += incAmt; break; case VECSLIDE_Y: val.y += incAmt; break; case VECSLIDE_Z: val.z += incAmt; break; case VECSLIDE_Length: { float len = Length(val); val = val * (len+incAmt) / len; } break; default:break; } vec3 newVal = m_limits(val); if(newVal != old) { m_set(newVal); UpdateData(); } return true; }