1
0
mirror of https://gitlab.com/OpenMW/openmw.git synced 2025-01-28 14:53:58 +00:00

59 Commits

Author SHA1 Message Date
fredzio
8c21b0b503 Apply waterwalking even when we skip simulation.
This chunk was supposed to be part of !1324 but somehow got stuck staged in my tree.
2021-11-01 12:44:36 +01:00
fredzio
3750eb9cd8 Move Projectile simulation to the background thread. 2021-10-27 22:17:06 +02:00
fredzio
a245981e4e Make interpolateMovement works with PtrHolder instead of Actor 2021-10-27 22:05:19 +02:00
fredzio
ad7a810a62 Unify interface for Actor and Projectile 2021-10-27 22:03:04 +02:00
Frederic Chardon
5009b66ef5 Use std::variant in the physics simulation for the different types of objects. For now only support only for actors. 2021-10-27 22:02:46 +02:00
fredzio
3b174d72d8 Introduce 3 scoped mutex wrappers to allow to conditionally skip taking
mutexes in synchronous case.
2021-10-05 15:52:27 +02:00
fredzio
21dbe314bf Use common function for sync and async case. Now both cases follow the
same flow, synchronous simulation is just a special case.
2021-10-05 15:44:20 +02:00
Frederic Chardon
499b161e7b Merge handleFall() and updateMechanics() into updateActor(). It remove gratuitious differences between sync and async cases. Also, it will make the after simulation update logic easier to follow when projectiles move into the simulation thread. 2021-10-05 15:44:20 +02:00
fredzio
ec871e6bf7 Use shared_ptr instead of weak_ptr for actors handle inside the
simulation

The purpose of weak_ptr is to avoid performing the simulation on deleted
Actor by promoting it to a shared_ptr via a lock() call. This clutter
the code with a lot of branches, whereas the overwhelmingly common case is for the call to succeed.
Since the simulation is decoupled from the engine state, we can use a shared_ptr instead of a weak_ptr.
This allow us to ignore (ie not handle) the rarer case where the actor is delete from the scene. This means that the simulation
will run for one frame more than before for each actor, whereas the rest of the engine
will be ignorant of this.
2021-08-15 16:21:16 +02:00
fredzio
8e3984ae5a Clear mActors when reseting the simulation. Otherwise during next run we can try to read past the end of mActorsFrameData. 2021-08-09 14:46:41 +02:00
fredzio
0c5cf6ec19 Store the btCollisionObject* of the object we're standing on instead of
MWWorld::Ptr:
- they are equivalent
- btCollisionObject* is readily available from the simulation, it saves
  a call to a mutex
- btCollisionObject* is smaller
2021-08-07 13:38:24 +02:00
fredzio
26d9052b8c Move the weak_ptr<Actor> outside of ActorFrameData. 2021-08-07 13:38:24 +02:00
fredzio
f68273c3c0 Remove Actor* from ActorFrameData 2021-08-07 13:38:24 +02:00
fredzio
9e911cc8b5 Introduce helper function to write back updated values inside parent Actor class 2021-08-07 13:38:24 +02:00
fredzio
b04c958410 Modify the way swimming is handled:
- compute the swimming state instead of storing it, it changes as part of the simulation and was not updated, so it was wrong anyway.
- store the swim level in ActorFrameData, it is constant per Actor so no need to compute it inside the simulation
2021-08-07 13:38:24 +02:00
fredzio
51514e44cc Handle jump as part of the simulation preparation (inside of
PhysicsSystem) instead of inside the simulaiton.
For mechanics, we don't care how the jump is handled, just that it will be.
2021-08-07 13:38:24 +02:00
fredzio
1bfaf353be Explicitely store all the potential states an Actor can have into the
ActActorFrameData structure. It makes it easier to reason about the
simulation (and hopefully simplify it).
Remove atomics from Actor class as a side effect.

Rename mFloatToSurface to mInert to make is explicit what it represent, not what it is used for
Store the Actor rotation (1 Vec2) instead of the whole ESM::Position (2 Vec3)
2021-08-07 13:38:24 +02:00
psi29a
547bc4a252 Merge branch 'notonlyactors' into 'master'
Refactor the physics simulation to make it not actor centric.

See merge request OpenMW/openmw!1075
2021-07-31 23:39:22 +00:00
fredzio
35928cf4d3 Refactor a bit the physics simulation to make it not actor centric:
- inline PhysicsSystem::applyQueuedMovements() into PhysicsSystem::stepSimulation()
- rename PhysicsTaskScheduler::moveActors() to PhysicsTaskScheduler::applyQueuedMovements()
- move the actor movement code from World::doPhysics() to
  PhysicsSystem::moveActors() (analogically to the projectile manager)
2021-07-31 23:39:04 +02:00
fredzio
4e7c128d25 The LOS cache is now unconditionally used without async physics as well
with a TTL of 0 frame. It helps performance when several subsystems
request the same LOS in the same frame (combat, headtracking, etc).
Except it doesn't work if the cache is never trimmed.
2021-07-30 22:23:42 +02:00
fredzio
7145ef4ce0 Update AABB also in sync cases 2021-07-25 18:00:48 +02:00
psi29a
469cc44ef7 Merge branch 'tweaks' into 'master'
Change settings for async physics

See merge request OpenMW/openmw!778
2021-07-22 07:18:41 +00:00
fredzio
1650dabed8 Assign the return value of weak_ptr::lock() to a variable, so that the
shared object lifetime is properly extended. Otherwise there is a
possibility that the Actor gets destroyed during call to unstuck().
2021-07-11 18:01:20 +02:00
fredzio
643a64cb2f Change some settings for async physics:
- default to 1 thread
- default to always use defered aabb update, remove option
- always keep a cache of LOS request for at least the current frame.
This decreases number of raycast, especially when a lot of actors are
involved and "NPCs avoid collisions" is on
2021-07-11 17:07:39 +02:00
jvoisin
c1e3869f25 Remove an unused struct 2021-05-15 19:49:15 +02:00
elsid
626e032931
Do not store callback inside Misc::Barrier
The only wait method can be provided with it so pass it as a template
parameter there.
2021-05-05 23:42:47 +02:00
fredzio
4fa0972b2d Tone down actor's skip simulation flag to an optional skip collision
detection flag.
2021-05-01 14:22:30 +02:00
fredzio
6e1c67a9ae Account for waterwalking when updating position. Otherwise we might
trace down the actor at waterlevel at the wrong coordinate.

Triggered by multimark mod with waterwalking effect.
2021-04-09 23:33:21 +02:00
fredzio
b58244ac26 Guard the Bullet drawing method with a read lock on the
btCollisionWorld. It closes a race on the collision shapes coordinates.
2021-03-26 23:49:31 +01:00
fredzio
dbd6e3bfee Replace pointless usage of shared_ptr by unique_ptr / non-owning raw
pointer for btCollisionWorld.
2021-03-26 23:49:31 +01:00
wareya
63f01d8c5f Prevent physics death spiral by falling back to true delta time when needed 2021-03-21 20:45:46 +00:00
wareya
1471ef003a fix async physics interpolation 2021-03-18 13:53:00 -04:00
fredzio
03b86c232b Apply the position offset even if the simulation is not performed
because we're too fast.
2021-03-13 09:52:05 +01:00
Frederic Chardon
7cd7fa2f08 Collect all available stats if OPENMW_OSG_STATS_FILE is set and point to
a valid file.
2021-01-27 08:04:33 +00:00
fredzio
e37e5d4d16 Don't run unstuck if there is no simulation running in async case.
In this case, the actor mPreviousPosition is not updated, so the actor
position is interpolated between an old (stucked) position and the new
(unstucked) position. The new position is most likely "stucked", so the
unstuck code strikes again, making the actor "vibrates".

That's exactly what the sync code path does, and it doesn't exhibit this
behavior.
2021-01-18 17:45:57 +01:00
elsid
8b7f3fe908 Merge branch 'nodeadlock' into 'master'
Avoid a rare but possible deadlock around mCollisionWorldMutex.

See merge request OpenMW/openmw!525
2021-01-10 13:41:31 +00:00
fredzio
9bc687e209 Avoid a rare but possible deadlock around mCollisionWorldMutex.
What happened is that the last handle to an Actor shared_ptr was a
promoted weak_ptr. When the shared_ptr goes out of scope, the Actor dtor
is invoked. That involves removing the Actor collision object after
exclusively locking mCollisionWorldMutex. In this case, the lock was
already held in the outter scope of the promoted weak_ptr.

Reduce the scope of the mCollisionWorldMutex to never encompass the
lifetime of a promoted weak_ptr.
2021-01-09 21:10:29 +01:00
Andrei Kortunov
33648313a6 Initialize variables 2021-01-09 14:21:57 +04:00
wareya
18ef32ca82 values for this higher than sGroundOffset cause jittering on some surface; use safe-seeming value slightly less than sGroundOffset 2020-12-27 22:16:11 +00:00
Alexei Dobrohotov
e9a8636d18 Merge branch 'restore_absolute_position_handling' into 'master'
Restore pre-async handling of absolute actors positionning

See merge request OpenMW/openmw!486
2020-12-20 22:52:35 +00:00
Alexei Dobrohotov
ce36dd8a52 Merge branch 'misc_cleanup' into 'master'
Small cleanup

See merge request OpenMW/openmw!482
2020-12-20 19:10:06 +00:00
fredzio
5bd921fa3a Restore pre-async handling of absolute actors positionning
One of the issue since the introduction of async physics is the quirky
handling of scripted moves. Previous attempt to account for them was
based on detecting changes in actor position while the physics thread is
running. To this end, semantics of Actor::updatePosition() (which is
responsible for set the absolute position of an actor in the world) was
toned down to merely store the desired position, with the physics system
actually responsible for moving the actor. For the cases were complete
override of the physics simulation was needed, I introduced
Actor::resetPosition(), which actually have same semantics as
original updatePosition(). This in turn introduced a loads of new bugs
when the weakened semantics broke key assumptions inside the engine
(spawning, summoning, teleport, etc).
Instead of tracking them down, count on the newly introduced support for
object relative movements in the engine (World::moveObjectBy) to
register relative movements and restore original handling of absolute positionning.

Changes are relatively small:
- move resetPosition() content into updatePosition()
- call updatePosition() everywhere it was called before
- remove all added calls to the now non-existing resetPosition()

tldr; ditch last month worth of bug introduction and eradication and redo
it properly
2020-12-20 19:23:09 +01:00
fredzio
8e084dea2e Don't cache Ptr, it can be updated while the simulation is running. 2020-12-18 22:22:37 +01:00
fredzio
58297ffbf4 Move stats update into their own function. 2020-12-18 21:18:04 +01:00
fredzio
4e7c9b6696 Embed physics simulation results inside of actor class.
This gives finer control over reseting positions (switch off tcl is no
longer glitchy) and solve most of the erroneous usage of stale World::Ptr
indicated by:
"Error in frame: moveTo: object is not in this cell"
2020-12-18 12:54:02 +01:00
fredzio
7bae6691b6 Introduce World::moveObjectBy() function to translate an object relatively to
its current position.
Use it in relevant MWScripts opcode (move and moveworld).
Remove the fragile detection of scripted translation from PhysicsTaskScheduler.

No user visible change, just a more robust mechanism.
2020-12-18 08:40:38 +01:00
fredzio
66fe3b0d38 Modify projectile collision to work with async physics 2020-12-08 09:06:33 +01:00
fredzio
7843dad35d Don't let the actor "nowhere" after a teleport but move them in their
place.
This solve the problem where after loading, an empty frame was rendered
because the player is "nowhere".
2020-12-05 01:09:43 +01:00
fredzio
5a4872393a Rework actor position reset. While solving the issue with invalid
position being used under heavy load, I introduced a regression that
prevented the position to be updated in case of teleport.
Move the logic in its own function and decide in PhysicsSystem whether a
reset is needed.
2020-12-03 12:57:57 +01:00
fredzio
ea2ba27084 Move the moment when the actor origin is saved before simulation so to
be sure the simulation is over. Otherwise, if the simulation is too slow
the position is wrong, and the actors would jump back and forth between
old and new position instead of actually moving.
2020-11-28 21:36:45 +01:00