1
0
mirror of https://gitlab.com/OpenMW/openmw.git synced 2025-01-31 15:32:45 +00:00

277 Commits

Author SHA1 Message Date
Alexei Dobrohotov
7a0c13fcf8 Make better use of std::clamp 2021-11-06 08:47:32 +03:00
psi29a
523289c531 Merge branch 'refactor_bullet_shape' into 'master'
Refactor bullet shape

See merge request OpenMW/openmw!1333
2021-11-02 20:30:22 +00:00
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
elsid
8e71c246bf
Remove redundant BulletShape getters 2021-10-30 03:44:08 +02:00
fredzio
68f4c336ce Rework again SetPos command to make more mods work.
Previous version skipped collision the frame immediately after a call to SetPos. It worked for one-off calls (teleports for instance) and continuous call along a pre-defined path (scenic travel). However, in the case of mod which uses SetPos to simulate a player-controlled movement, it is equivalent to using tcl.
Solution:
1/ skip update of mPosition and  mPreviousPosition to avoid janky interpolation
2/ use back plain moveObject() instead of moveObjectBy() since we don't want physics simulation
3/ rework a little bit waterwalking influence on coordinate because of 1/
2021-10-29 23:20:17 +02:00
elsid
29a772c33f
Rename Resource::BulletShape::CollisionBox fields according to styleguide 2021-10-29 21:05:58 +02:00
psi29a
e3cfe5d35a Merge branch 'backproj' into 'master'
Move the projectile simulation to the background thread

See merge request OpenMW/openmw!1276
2021-10-29 12:52:41 +00:00
fredzio
3750eb9cd8 Move Projectile simulation to the background thread. 2021-10-27 22:17:06 +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
Andrei Kortunov
3ee6657768 Early out from LOS check when source and target is the same (bug 5913) 2021-10-27 10:01:06 +04:00
Andrei Kortunov
107a9ecb17 Fix variables hiding 2021-10-24 18:45:04 +04:00
Bo Svensson
a854a6e04a
removes UnrefQueue (#3181)
Currently, we use an `UnrefQueue` which supposedly aims to transfer destruction costs to another thread. The implications of this unusual pattern can not be well understood because some allocators might free resources more efficiently if they are freed by the same thread that allocated them. In addition, `UnrefQueue` complicates the validation of thread safety in our engine. Lastly, our current usage of `UnrefQueue` triggers `ref()`, `unref()` atomic operations as objects are passed into the queue. These operations could be more expensive than the actual destruction.

With this PR we thus remove `UnrefQueue`. We can expect these changes to have a minor impact at most because we free most resources elsewhere in `ResourceSystem::updateCache`.
2021-10-20 23:02:15 +02:00
elsid
7c5a590890
Replace float type for arguments to create heightfield with int
To reduce amount of computations on the caller side and restrict possible
values.

* verts can't be non-int because it's a number of things.
* worldsize is initially defined as int by ESM::Land::REAL_SIZE.
* Put function to calculate heightfied shift into components to be able to
  reuse by other binaries.
2021-10-11 19:28:08 +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
psi29a
bd866cf210 Merge branch 'fix_infidelities' into 'master'
Fix Infidelities quest from Tribunal (#6307)

Closes #6307

See merge request OpenMW/openmw!1248
2021-10-01 21:12:15 +00:00
Bret Curtis
8309910d9d Restore the cell grid to its former non-exorbitant size, reducing stutter and also threw in a simple alternative fix for the actor position adjustment issue. 2021-09-30 22:58:40 +02:00
Andrei Kortunov
fc2076db1a
Fix MSVC warnings about local variables redeclaration (#3130) 2021-09-29 09:36:05 +02:00
elsid
c0ef4417c3
Check AiTravel destination for other actors presence
Use faster aabbTest but without destance filter. To avoid dependency on a
specific constant and correctly handle situations when there is a big
difference between actors sizes.
2021-09-29 01:05:23 +02:00
Petr Mikheev
e760a6c7e6 Merge branch 'forlua' into 'master'
Simple Physics API modification for Lua

See merge request OpenMW/openmw!1216

(cherry picked from commit d88494c90b501d0832ae0330a0ca81d8b8e5aa50)

02dd055a Save hitObject in castSphere() just like in castRay()
0793d0bf Allow to override collision mask and group for castSphere() as for castRay()
2021-09-27 19:50:57 +00:00
psi29a
2cee222e73 Merge branch 'explosion_at_impact' into 'master'
Bring arrow behaviour in line with vanilla (#6233 and other change)

See merge request OpenMW/openmw!1188
2021-09-27 19:00:53 +00:00
Frederic Chardon
7b26058fa5 moveObject() has side effects that might invalidate iterators from mActors. Instead of iterating over mActors, make a copy of needed data and iterate over the copies. 2021-09-06 12:51:25 +02:00
fredzio
d20730458d Replace std::map with std::unordered_map for mActors and mObjects.
Use Ptr.mRef as a key instead of Ptr: it is constant for the lifetime of
the object.
2021-09-03 13:14:05 +02:00
fredzio
0bce6c09e1 Change projectile behaviour to be like in vanilla wrt. water plane:
- enchanted arrow explode upon hit the water plane
- non enchanted arrow disappear (or more accurately, they hit nothingness)
- enchanted arrow shot underwater explode immediately
- non enchanted arrow disappear immediately

Also, solve a bug that occured previously and could theoritically still happens where we use the last tested collision position for instead of the last registered hit:
Use the hit position as saved inside Projectile::hit() instead of the last position saved inside the callback.
If a projectile collides with several objects (bottom of the sea and water surface for instance), the last collision tested won't necessarily be the impact position as we have no control over the order in which the tests are performed.
2021-09-03 10:24:05 +02:00
Alexei Dobrohotov
7665ebfa67 Merge branch 'another_fix' into 'master'
Fix #6219

Closes #6219

See merge request OpenMW/openmw!1137
2021-08-16 01:15:52 +00:00
elsid
f966fdb65e Merge branch 'noweak' into 'master'
use shared_ptr inside the physics simulation to simplify the code

See merge request OpenMW/openmw!1141
2021-08-15 21:59:47 +00: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
713f612bdb Partially revert !1046: the player is added before the scene exists, so we need to check again the grounded state, as it correctly was. 2021-08-13 18:01:16 +02:00
jvoisin
b01ef2629c Fix two Wreorder clang warnings 2021-08-13 13:59:57 +02:00
fredzio
de9ee2f196 Revert "Calls directly MovementSolver::traceDown instead of"
This reverts commit c1e50f530b6b7c229864b20ab26be284e3edec42.
2021-08-11 21:53:04 +02:00
jvoisin
586d8684d0 Fix two coverity issues about uninitialised variables 2021-08-09 12:43:30 +02:00
psi29a
cb7a4d20dd Merge branch 'killmutex' into 'master'
Remove mutex from PtrHolder

See merge request OpenMW/openmw!1110
2021-08-08 19:45:16 +00:00
fredzio
c1e50f530b Calls directly MovementSolver::traceDown instead of
PhysicsSystem::traceDown before inserting into mActors.

The latter does nothing until the actor is inserted into mActors.
We can't move the call after the insertion either because then
the actor is part of the simulation, and we'd have a race.
2021-08-08 18:26:35 +02:00
fredzio
07fa1803f7 Use btCollisionObject* instead of MWWorld::Ptr inside of Projectile
collision handling and castRay() to avoid calling getPtr(). It is a step forward
removing the mutex inside of PtrHolder.

Do the same for DeepestNotMeContactTestResultCallback. It is used
only for not-ranged combat for now, but do it anyway for parity with all
other callback. This way, once the PtrHolder mutex is gone one will not
have to worry about wether it is safe to use the callback in a specific
context.

To avoid use-after-free with projectile / projectile collision, defer deletion of projectile.
Since instead of storing a copy of target Ptr we have a pointer to its collision object,
we can't delete projectiles until after we finished iterating over the loops.
2021-08-08 15:05:07 +02:00
fredzio
bcd6541d3e Reorganize ActorFrameData members:
- constify all read-only variables
- order them so that all variables modified as aprt of the simulation
  fits in one cache line
2021-08-07 13:38:24 +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
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
fredzio
9472728fa4 Do not generate data for immobile actors instead of early out from the solver 2021-08-07 13:38:24 +02:00
fredzio
bc738c5640 Use extract/insert instead of erase/emplace
When we call moveObject(), we might trigger a change of cell for the
actor, which in turn triggers updatePtr(). The erase/emplace
construct invalidate references, whereas extract/insert do not.

The reason is was working before !1075 is because we were always
"refreshing" the reference by a call to getActor().
2021-08-03 07:00:42 +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
c76387162b Add projectiles number to the resources stats 2021-07-31 23:08:50 +02:00
fredzio
88a5ca440b Change moveObject() to take a osg::Vec3f argument instead of 3 floats
for readability.
2021-07-30 23:24:49 +02:00
fredzio
f348b70733 Set mCanWaterWalk and mOnGround when adding Actor to the scene.
mCanWaterWalk was set to false and updated during next frame's simulation
mOnGround is set to true but then was updated as part of the scene
loading logic.
2021-07-23 18:04:58 +02:00
fredzio
f02d01ef0c Do not store btTransform into Object class: reduce its size by 104 bytes 2021-07-17 13:11:41 +02:00
Evil Eye
0a15d7740a Delay physics for objects created by scripts 2021-07-05 18:34:06 +02:00
Evil Eye
4f264af5a9 Merge branch 'staticsload' into 'master'
Loads statics before actors II (#5379)

See merge request OpenMW/openmw!588
2021-06-28 20:25:51 +00:00