+void Entity::UpdateModel() noexcept {
+ state.AdjustHeading();
+ if (model) {
+ Part::State &body_state = model.BodyState();
+ Part::State &eyes_state = model.EyesState();
+ if (&body_state != &eyes_state) {
+ body_state.orientation = glm::quat(glm::vec3(0.0f, state.yaw, 0.0f));
+ eyes_state.orientation = glm::quat(glm::vec3(state.pitch, 0.0f, 0.0f));
+ } else {
+ eyes_state.orientation = glm::quat(glm::vec3(state.pitch, state.yaw, 0.0f));
+ }
+ }
+}
+
+void Entity::Update(float dt) {
+ if (HasController()) {
+ GetController().Update(*this, dt);
+ }
+}
+
+
+EntityController::~EntityController() {
+
+}
+
+bool EntityController::MaxOutForce(
+ glm::vec3 &out,
+ const glm::vec3 &add,
+ float max
+) noexcept {
+ if (iszero(add) || any(isnan(add))) {
+ return false;
+ }
+ float current = iszero(out) ? 0.0f : length(out);
+ float remain = max - current;
+ if (remain <= 0.0f) {
+ return true;
+ }
+ float additional = length(add);
+ if (additional > remain) {
+ out += normalize(add) * remain;
+ return true;
+ } else {
+ out += add;
+ return false;
+ }
+}
+