| 140 | } |
| 141 | |
| 142 | void zEntHangable_Update(zEntHangable* ent, xScene*, F32 dt) |
| 143 | { |
| 144 | xVec3 sub; |
| 145 | xVec3 unitHang; |
| 146 | F32 dot; |
| 147 | |
| 148 | xMat3x3GetEuler((xMat3x3*)ent->model->Mat, &ent->frame->oldrot.axis); |
| 149 | ent->frame->oldmat = *(xMat4x3*)(ent->model->Mat); |
| 150 | |
| 151 | if ((ent->enabled < 0) && (ent->enabled++, ent->enabled == 0)) |
| 152 | { |
| 153 | ent->enabled = 1; |
| 154 | } |
| 155 | |
| 156 | zEntHangable_UpdateFX(ent); |
| 157 | |
| 158 | if (!(ent->hangInfo->flags & 0x80000000)) |
| 159 | { |
| 160 | ent->hangInfo->leverArm -= globals.player.ent.bound.cyl.r; |
| 161 | ent->hangInfo->flags |= 0x80000000; |
| 162 | } |
| 163 | |
| 164 | ent->grabTimer = 0.0f > ent->grabTimer - dt ? 0.0f : ent->grabTimer - dt; |
| 165 | |
| 166 | if (globals.player.HangEnt == ent) |
| 167 | { |
| 168 | return; |
| 169 | } |
| 170 | |
| 171 | zEntHangable_FollowUpdate(ent); |
| 172 | |
| 173 | unitHang.x = 0.0f; |
| 174 | unitHang.y = -ent->hangInfo->gravity; |
| 175 | unitHang.z = 0.0f; |
| 176 | |
| 177 | xVec3Sub(&sub, &ent->endpos, &ent->pivot); |
| 178 | xVec3Normalize(&sub, &sub); |
| 179 | |
| 180 | dot = xVec3Dot(&sub, &unitHang); |
| 181 | unitHang.x = -((dot * sub.x) - unitHang.x); |
| 182 | unitHang.y = -((dot * sub.y) - unitHang.y); |
| 183 | unitHang.z = -((dot * sub.z) - unitHang.z); |
| 184 | |
| 185 | ent->vel.x = (unitHang.x * dt) + ent->vel.x; |
| 186 | ent->vel.y = (unitHang.y * dt) + ent->vel.y; |
| 187 | ent->vel.z = (unitHang.z * dt) + ent->vel.z; |
| 188 | |
| 189 | dot = xVec3Dot(&sub, &ent->vel); |
| 190 | ent->vel.x = -((dot * sub.x) - ent->vel.x); |
| 191 | ent->vel.y = -((dot * sub.y) - ent->vel.y); |
| 192 | ent->vel.z = -((dot * sub.z) - ent->vel.z); |
| 193 | |
| 194 | xVec3SMul(&ent->vel, &ent->vel, 0.97f); |
| 195 | |
| 196 | if (xVec3Length2(&ent->vel) < 0.001f) |
| 197 | { |
| 198 | ent->vel.x = 0.0f; |
| 199 | ent->vel.y = 0.0f; |
nothing calls this directly
no test coverage detected