1
0
Fork 1
mirror of https://github.com/TES3MP/openmw-tes3mp.git synced 2025-01-15 23:19:56 +00:00
Commit graph

249 commits

Author SHA1 Message Date
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
psi29a
6863c5a68f Merge branch 'raii' into 'master'
Make all physics object manage their own resources.

See merge request OpenMW/openmw!527
2021-01-10 20:50:55 +00:00
fredzio
d015f17a6c Make all physics object manage their own resources
Use smart pointer for heightfields and their members.
Move collision object addition inside of Object's ctor, as for Actors and HeightFields
2021-01-10 14:56:35 +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
Andrei Kortunov
6a12c2b58b Fix GCC build warnings 2020-12-28 12:06:41 +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
fredzio
ebb564ad22 call moveObject() after applying waterwalking
This unbreak abot's boat mods: they're continually teleporting
the boats (who is an actor with waterwalking effect). As such, the
physics simulation was never run and the boat never went to sea level.
2020-12-27 17:31:55 +01:00
Alexei Dobrohotov
22476281da Fix paralyze for swimming actors 2020-12-22 08:03:51 +03: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
33eb09f534 Remove unused headers 2020-12-20 18:28:21 +01:00
fredzio
93a12fe388 Avoid dynamic_cast when possible. 2020-12-18 23:47:01 +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
24a8b8c66a Remove redundant call to resetPosition(). adjustPosition() takes care of
it,
2020-12-18 21:16:48 +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
259d522800 When doing a ray cast to the next projectile position, ignore collisions
that occurs with the projectile own collision object. Otherwise a magic
bolt can explode "spontaneously".
2020-12-15 21:34:58 +01:00
fredzio
b39437dfb6 Don't allow projectiles to stand still when they hit an ally.
When an NPC fire a projectile, it should affect only its targeted actor.
To this end, after a hit is detected the target is checked against the
list of AI targets and reactivated if necessary.
Problem occurs when the hit occurs as a result of a friendly actor going
into the projectile (detected in ClosestNotMeConvexResultCallback):
while the projectile is inside the friend's collision box, it is
deactivated, just to be immediately reactivated. Effectively, the
projectile does nothing until the actor moves out.

Add a check inside the ClosestNotMeConvexResultCallback before declaring
a hit.
Since the necessary data is not safely accessible from the async thread,
maintain a copy inside the Projectile class.
2020-12-14 22:23:01 +01:00
Alexei Dobrohotov
15291f15d3 Make actor collision box components a struct 2020-12-11 20:07:59 +03:00
fredzio
4fbe1ed12c Ignore caster collision shape. Sometimes the magic bolt get launched
inside too near its caster.
2020-12-08 09:06:34 +01:00
fredzio
7e85235220 Projectile to projectile collision 2020-12-08 09:06:34 +01:00
fredzio
66fe3b0d38 Modify projectile collision to work with async physics 2020-12-08 09:06:33 +01:00
Andrei Kortunov
dc7b48e92e Generate physics collisions for projectiles (bug #3372)
Remove redundant now mHit field
2020-12-08 09:05:38 +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
Frederic Chardon
9aba55a21a Add the async physics worker to the profiler overlay. 2020-11-20 21:17:47 +01:00
AnyOldName3
06d1e70aac Make Bullet DebugDrawer's default state match the physics system 2020-11-18 15:34:21 +00:00
Frederic Chardon
bb5213670c Use bigger hammer to set Actor's position after teleporting. Otherwise traceDown() would use old collision object transform and gives incorrect results, making the Actor "fall" in the new position. 2020-11-16 11:35:50 +01:00
fredzio
d64ed6cf53 Get rid of the StandingActorsMap. Just embed the necessary info into
Actor class.
2020-11-15 01:58:21 +01:00
fredzio
e5fa457fe7 Properly account for interleaved move of actors.
Before this change, if an actor position was changed while the physics
simulation was running, the simulation result would be discarded. It is
fine in case of one off event such as teleport, but in the case of
scripts making use of this functionality to make lifts or conveyor (such
as Sotha Sil Expanded mod) it broke actor movement.

To alleviate this issue, at the end of the simulation, the position of the Actor
in the world is compared to the position it had at the beginning of the
simulation. A difference indicate a force move occured. In this case,
the Actor mPosition and mPreviousPosition are translated by the difference of position.

Since the Actor position will be really set while the next simulation runs, we
save it in the mNextPosition field.
2020-11-14 20:39:16 +01:00
fredzio
18e38d8810 Do not block a door when it turns away. 2020-11-01 23:01:18 +01:00
psi29a
ba3aad31c1 Merge branch 'hitdebug' into 'master'
Visualize hits in the debug overlay

See merge request OpenMW/openmw!379
2020-11-01 10:20:14 +00:00
Andrei Kortunov
64ba81ecf2 Fix some issues, found by CoverityScan 2020-10-28 18:02:31 +04:00
Frederic Chardon
574ccbf7bd Visualize hand to hand hits 2020-10-26 13:48:15 +01:00
fredzio
435b2e37f8 Allow to display collision points in the debug viewer 2020-10-26 13:42:46 +01:00
Bret Curtis
5a824d0333 components/compiler cleanup; also cleaned up related cascading warnings; fixed up final/override issues 2020-10-22 23:57:53 +02:00
fredzio
a19db73eca Fix bad rebase 2020-10-22 09:24:56 +02:00
fredzio
1357bba0a0 Use some C++17 where it makes the code more readable
Also replace boost::optional
2020-10-22 07:15:16 +02:00
fredzio
4fc5b6f6f4 Sort headers 2020-10-22 07:15:16 +02:00
fredzio
212b293803 Use same parameter name in definition and declaration 2020-10-22 07:15:16 +02:00
fredzio
2916a9462e Fix standing actors logic:
it is updated in the solver only if the actor is standing on
"something". The ground is not "something", so in case the actor goes
from standing on an object to the standing on the ground, this change was not taken
into account.
Clear the value before the simulation to solve this problem.
2020-10-21 21:32:06 +02:00
fredzio
a036183248 Use a much simpler and assert-free check for Bullet multithreading support 2020-10-19 21:31:52 +02:00
Bret Curtis
8050882baf
Merge pull request #3015 from akortunov/overrides
Mark overrided methods as overrides
2020-10-17 13:32:08 +02:00
Andrei Kortunov
8ca3c3b123 Mark overrided methods by override keyword 2020-10-16 22:18:54 +04:00
fredzio
978af12c2d Restore fall damage 2020-10-16 19:30:03 +02:00