1
0
mirror of https://gitlab.com/OpenMW/openmw.git synced 2025-01-25 15:35:23 +00:00

423 Commits

Author SHA1 Message Date
elsid
94dc696f4f
Fix gcc build
In file included from /home/elsid/dev/openmw/apps/openmw/mwphysics/actor.hpp:7,
                 from /home/elsid/dev/openmw/apps/openmw/mwphysics/trace.cpp:9:
/home/elsid/dev/openmw/apps/openmw/mwphysics/ptrholder.hpp: In member function ‘osg::Vec3f MWPhysics::PtrHolder::velocity()’:
/home/elsid/dev/openmw/apps/openmw/mwphysics/ptrholder.hpp:42:25: error: ‘exchange’ is not a member of ‘std’
   42 |             return std::exchange(mVelocity, osg::Vec3f());
      |                         ^~~~~~~~
2022-05-16 15:59:18 +02:00
elsid
79676aee15
Make Environment a storage of referencing pointers instead of owned
Engine controls lifetime of managers therefore it should own them. Environment
is only access provider.

This allows to avoid redundant virtual calls and also some functions from
managers base classes can be removed if they are used only by Engine.
2022-05-06 23:44:01 +02:00
fredzio
d05a2facf3 Handle NCC flag in Nif files. Objects with this flag will collide only with camera.
Expose objects with NC flag to be used by Lua mods.
2022-04-17 20:03:00 +02:00
uramer
5aa8e475a4 Merge branch 'rendering_raycast' into 'master'
Rendering raycasts in Lua

See merge request OpenMW/openmw!1768
2022-04-12 19:15:28 +00:00
Petr Mikheev
51845e9553 Rendering raycasts in Lua 2022-04-11 23:36:54 +02:00
elsid
39da3bfef8
Ignore player when checking whether AiTravel destination is occupied by other actor 2022-04-11 19:30:54 +02:00
Matt
49e21e121a Revert "Merge branch 'refactor/6677-2' into 'master'"
This reverts merge request !1733
2022-04-04 17:09:52 +00:00
Matt
21e4c10fa9 Introduce IndexedVector 2022-04-04 13:56:19 +00:00
elsid
42d6032c8b
Support compilation with c++20 2022-02-24 00:49:40 +01:00
psi29a
dd281e1e93 Merge branch 'fix_collision_boxes' into 'master'
Fix #6616: Fix incorrect collision box calculations

Closes #6616

See merge request OpenMW/openmw!1687
2022-02-23 08:26:50 +00:00
Alexei Kotov
38a0659b7f Merge branch 'weak_ptr' into 'master'
Store std::weak_ptr into mUpdateAabb.

See merge request OpenMW/openmw!1578
2022-02-23 06:10:29 +00:00
Alexei Kotov
087084abdc Merge branch 'projectilefix' into 'master'
Fix for projectile movement simulation (#6526 and probably #6434)

See merge request OpenMW/openmw!1518
2022-02-23 05:34:35 +00:00
Abdu Sharif
de3092f014 Revert "Merge branch 'offset_the_deads' into 'master'"
This reverts commit 7dd02076f5a05528d0df308bf68e6bd733bd1b43
2022-02-22 04:04:08 +00:00
elsid
3caeda7299
Consider animated object unchanged if no transform updates done 2022-02-03 22:09:52 +01:00
elsid
832ab103cb
Filter out unchanged animated objects for navigator update 2022-02-03 22:09:52 +01:00
psi29a
bb6b031afd Merge branch 'fix_simulation_crash' into 'master'
Fix use after free and possible deadlock on exit (#6577)

Closes #6577

See merge request OpenMW/openmw!1601
2022-02-02 21:06:18 +00:00
psi29a
7dd02076f5 Merge branch 'offset_the_deads' into 'master'
#6410: Use the scaled mesh translation for collision shape position for living actors

See merge request OpenMW/openmw!1446
2022-01-29 20:28:23 +00:00
elsid
8b7ae9afd8
Fix use after free and possible deadlock on exit
Lock Simulation weak_ptr in all visitors to avoid use after free.

And swap order for weak_ptr locking with locking collision world mutex to avoid
deadlock when underlying object tries to lock the same mutex in the destructor.

Add SimulationImpl type to avoid use of FrameData without locking weak_ptr.
2022-01-29 14:59:51 +01:00
Bret Curtis
d1fb854521 move most of the files from esm to esm3, keep common code in esm; this is make space for a future with esm4
esm typo

esm typo
2022-01-23 17:04:48 +01:00
fredzio
26bdba88a2 Store std::weak_ptr into mUpdateAabb. This avoid extending the lifetime
of collision objects beyond what they should.
2022-01-22 17:17:20 +01:00
elsid
580edf18b9 Use weak_ptr for Actor and Projectile simulations (#6515) 2022-01-21 00:28:56 +00:00
wareya
20cbf941fb re-introduce short circuiting, but only under certain circumstances 2022-01-16 17:58:04 -05:00
wareya
784b1888a9 Merge branch 'upstream' into movement_tweaks 2022-01-16 17:19:20 -05:00
Cody Glassman
cdae1c4c97 Heavily mitigate jittery objects far from origin 2022-01-06 22:01:28 +00:00
Frederic Chardon
63bf4bf868 Solve 2 bugs in projectile movement simulation:
- properly initialize mSimulationPosition in the constructor. Unlucky thread scheduling can cause processHits to be called before the first simulation run, causing the projectile to vanish to whatever value the variable happens to contains.
- don't continue moving the projectile after a hit. The position would continue to be updated to some senseless value.
2021-12-29 15:20:44 +01:00
elsid
5a6b39f8e0
Store mesh source data in recast mesh 2021-12-10 23:55:02 +01:00
fredzio
989f09930a Use the scaled mesh translation for collision shape position for living actors. It seems only (some) dead
actors really needs to use the vertical half-extent.
2021-11-28 18:58:40 +01:00
elsid
6b43ce0662
Fix deadlock in physics system
1. Reorder unlock and notify_all calls to avoid notifying when not all worker
   threads are waiting.
2. Make sure main thread does not attempt to exclusively lock mSimulationMutex
   while not all workers are done with previous frame.
3. Replace mNewFrame flag by counter to avoid modification from multiple
   threads.
2021-11-25 19:28:31 +01:00
Alexei Dobrohotov
7a0c13fcf8 Make better use of std::clamp 2021-11-06 08:47:32 +03:00
wareya
49d2daee6a Movement solver tweaks
1) As much as I dislike it, upping the collision margin from 0.1 to 0.2
fixes bugs, particularly involving walking into upwards-slanted walls.

2) There were still some problems involving acute crevices/seams; they
were using the adjusted instead of unadjusted normal, and also they need
to bypass the don't-slide-upwards check to prevent (see #6379)

3) The move-away-from-what-we-just-hit code needs to run always, not
just on non-initial iterations. No idea why I did it this way before.

4) Force bullet to give actor boxes a tiny collision margin of 0.001
instead of the default 0.04. I can't tell whether this is actually
working or not, but it should reduce unexplained weirdness.

5) A piece of code that was meant to prevent bugs by short-circuiting
the movement solver if its direction changed more than 180 degrees
actually caused problems instead of preventing them, so I deleted it.
2021-11-05 14:56:55 -04:00
psi29a
c9f3c27dc7 Merge branch 'phys_perf_test' into 'master'
Help bullet optimize collisions with very complex collision meshes by making small collision tests if possible

See merge request OpenMW/openmw!1317
2021-11-03 11:49:44 +00: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
wareya
940e338453 Constifications 2021-11-02 15:17:26 +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
wareya
8c0102e1ee Optimize short-trace test to only be done when particularly helpful 2021-10-29 15:11:08 -04: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
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
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
wareya
e23b0edda4 Add pre-pass to collision trace function that traces over less distance if possible 2021-10-22 23:11:23 -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
501316a9f7
Add missing initialization in MWPhysics::Object
==16218== Conditional jump or move depends on uninitialised value(s)
==16218==    at 0xCDBC27: MWPhysics::Object::commitPositionChange() (object.cpp:68)
==16218==    by 0xCE5B64: MWPhysics::PhysicsTaskScheduler::updatePtrAabb(std::shared_ptr<MWPhysics::PtrHolder> const&) (mtphysics.cpp:446)
==16218==    by 0xCE5CC3: operator() (mtphysics.cpp:432)
==16218==    by 0xCE5CC3: for_each<std::_Rb_tree_const_iterator<std::shared_ptr<MWPhysics::PtrHolder> >, MWPhysics::PhysicsTaskScheduler::updateAabbs()::<lambda(const std::shared_ptr<MWPhysics::PtrHolder>&)> > (stl_algo.h:3820)
==16218==    by 0xCE5CC3: MWPhysics::PhysicsTaskScheduler::updateAabbs() (mtphysics.cpp:431)
==16218==    by 0xCE5E35: MWPhysics::PhysicsTaskScheduler::afterPreStep() (mtphysics.cpp:586)
==16218==    by 0xCE6238: operator() (mtphysics.cpp:533)
==16218==    by 0xCE6238: wait<MWPhysics::PhysicsTaskScheduler::doSimulation()::<lambda()> > (barrier.hpp:33)
==16218==    by 0xCE6238: MWPhysics::PhysicsTaskScheduler::doSimulation() (mtphysics.cpp:533)
==16218==    by 0xCE6377: MWPhysics::PhysicsTaskScheduler::worker() (mtphysics.cpp:464)
==16218==    by 0x74523C3: execute_native_thread_routine (thread.cc:82)
==16218==    by 0x76FF258: start_thread (in /usr/lib/libpthread-2.33.so)
==16218==    by 0x78155E2: clone (in /usr/lib/libc-2.33.so)
==16218==

==16218== Conditional jump or move depends on uninitialised value(s)
==16218==    at 0xCDBC30: MWPhysics::Object::commitPositionChange() (object.cpp:73)
==16218==    by 0xCE5B64: MWPhysics::PhysicsTaskScheduler::updatePtrAabb(std::shared_ptr<MWPhysics::PtrHolder> const&) (mtphysics.cpp:446)
==16218==    by 0xCE5CC3: operator() (mtphysics.cpp:432)
==16218==    by 0xCE5CC3: for_each<std::_Rb_tree_const_iterator<std::shared_ptr<MWPhysics::PtrHolder> >, MWPhysics::PhysicsTaskScheduler::updateAabbs()::<lambda(const std::shared_ptr<MWPhysics::PtrHolder>&)> > (stl_algo.h:3820)
==16218==    by 0xCE5CC3: MWPhysics::PhysicsTaskScheduler::updateAabbs() (mtphysics.cpp:431)
==16218==    by 0xCE5E35: MWPhysics::PhysicsTaskScheduler::afterPreStep() (mtphysics.cpp:586)
==16218==    by 0xCE6238: operator() (mtphysics.cpp:533)
==16218==    by 0xCE6238: wait<MWPhysics::PhysicsTaskScheduler::doSimulation()::<lambda()> > (barrier.hpp:33)
==16218==    by 0xCE6238: MWPhysics::PhysicsTaskScheduler::doSimulation() (mtphysics.cpp:533)
==16218==    by 0xCE6377: MWPhysics::PhysicsTaskScheduler::worker() (mtphysics.cpp:464)
==16218==    by 0x74523C3: execute_native_thread_routine (thread.cc:82)
==16218==    by 0x76FF258: start_thread (in /usr/lib/libpthread-2.33.so)
==16218==    by 0x78155E2: clone (in /usr/lib/libc-2.33.so)
==16218==
2021-10-16 00:43:50 +02:00
psi29a
67fa8413f3 Merge branch 'physics_heightfield' into 'master'
Replace float type for arguments to create heightfield with int

See merge request OpenMW/openmw!1285
2021-10-12 07:58:34 +00:00
psi29a
207a7245bc Merge branch 'navigator_settings' into 'master'
Initialize navigator max climb and max slope settings in makeSettingsFromSettingsManager

See merge request OpenMW/openmw!1283
2021-10-12 07:02:08 +00:00