mirror of
https://github.com/Armored-Dragon/overte.git
synced 2025-03-11 16:13:16 +01:00
EntityCollisionSystem moves to interface
and interface connects EntityCollision system to EntityTree
This commit is contained in:
parent
cb6d9a4312
commit
cda8ac85c1
4 changed files with 44 additions and 37 deletions
|
@ -441,6 +441,7 @@ void Application::aboutToQuit() {
|
||||||
}
|
}
|
||||||
|
|
||||||
Application::~Application() {
|
Application::~Application() {
|
||||||
|
_entities.getTree()->setSimulation(NULL);
|
||||||
qInstallMessageHandler(NULL);
|
qInstallMessageHandler(NULL);
|
||||||
|
|
||||||
saveSettings();
|
saveSettings();
|
||||||
|
@ -1968,7 +1969,9 @@ void Application::init() {
|
||||||
_entities.init();
|
_entities.init();
|
||||||
_entities.setViewFrustum(getViewFrustum());
|
_entities.setViewFrustum(getViewFrustum());
|
||||||
|
|
||||||
_entityCollisionSystem.init(&_entityEditSender, _entities.getTree(), _voxels.getTree(), &_audio, &_avatarManager);
|
EntityTree* entityTree = _entities.getTree();
|
||||||
|
_entityCollisionSystem.init(&_entityEditSender, entityTree, _voxels.getTree(), &_audio, &_avatarManager);
|
||||||
|
entityTree->setSimulation(&_entityCollisionSystem);
|
||||||
|
|
||||||
// connect the _entityCollisionSystem to our script engine's EntityScriptingInterface
|
// connect the _entityCollisionSystem to our script engine's EntityScriptingInterface
|
||||||
connect(&_entityCollisionSystem, &EntityCollisionSystem::entityCollisionWithVoxel,
|
connect(&_entityCollisionSystem, &EntityCollisionSystem::entityCollisionWithVoxel,
|
||||||
|
@ -2319,11 +2322,12 @@ void Application::update(float deltaTime) {
|
||||||
|
|
||||||
if (!_aboutToQuit) {
|
if (!_aboutToQuit) {
|
||||||
PerformanceTimer perfTimer("entities");
|
PerformanceTimer perfTimer("entities");
|
||||||
|
// NOTE: the _entities.update() call below will wait for lock
|
||||||
|
// and will simulate entity motion (the EntityTree has been given an EntitySimulation).
|
||||||
_entities.update(); // update the models...
|
_entities.update(); // update the models...
|
||||||
{
|
// The _entityCollisionSystem.updateCollisions() call below merely tries for lock,
|
||||||
PerformanceTimer perfTimer("collisions");
|
// and on failure it skips collision detection.
|
||||||
_entityCollisionSystem.update(); // collide the entities...
|
_entityCollisionSystem.updateCollisions(); // collide the entities...
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
|
|
|
@ -31,7 +31,6 @@
|
||||||
#include <QSystemTrayIcon>
|
#include <QSystemTrayIcon>
|
||||||
|
|
||||||
#include <EntityEditPacketSender.h>
|
#include <EntityEditPacketSender.h>
|
||||||
#include <EntityCollisionSystem.h>
|
|
||||||
#include <NetworkPacket.h>
|
#include <NetworkPacket.h>
|
||||||
#include <NodeList.h>
|
#include <NodeList.h>
|
||||||
#include <PacketHeaders.h>
|
#include <PacketHeaders.h>
|
||||||
|
@ -60,6 +59,7 @@
|
||||||
#include "devices/SixenseManager.h"
|
#include "devices/SixenseManager.h"
|
||||||
#include "devices/Visage.h"
|
#include "devices/Visage.h"
|
||||||
#include "devices/DdeFaceTracker.h"
|
#include "devices/DdeFaceTracker.h"
|
||||||
|
#include "entities/EntityCollisionSystem.h"
|
||||||
#include "entities/EntityTreeRenderer.h"
|
#include "entities/EntityTreeRenderer.h"
|
||||||
#include "renderer/AmbientOcclusionEffect.h"
|
#include "renderer/AmbientOcclusionEffect.h"
|
||||||
#include "renderer/DeferredLightingEffect.h"
|
#include "renderer/DeferredLightingEffect.h"
|
||||||
|
|
|
@ -16,27 +16,33 @@
|
||||||
#include <CollisionInfo.h>
|
#include <CollisionInfo.h>
|
||||||
#include <HeadData.h>
|
#include <HeadData.h>
|
||||||
#include <HandData.h>
|
#include <HandData.h>
|
||||||
|
#include <PerfStat.h>
|
||||||
#include <SphereShape.h>
|
#include <SphereShape.h>
|
||||||
|
|
||||||
#include "EntityItem.h"
|
#include <EntityItem.h>
|
||||||
|
#include <EntityEditPacketSender.h>
|
||||||
|
#include <EntityTree.h>
|
||||||
|
#include <EntityTreeElement.h>
|
||||||
|
|
||||||
#include "EntityCollisionSystem.h"
|
#include "EntityCollisionSystem.h"
|
||||||
#include "EntityEditPacketSender.h"
|
|
||||||
#include "EntityTree.h"
|
|
||||||
#include "EntityTreeElement.h"
|
|
||||||
|
|
||||||
const int MAX_COLLISIONS_PER_Entity = 16;
|
const int MAX_COLLISIONS_PER_Entity = 16;
|
||||||
|
|
||||||
EntityCollisionSystem::EntityCollisionSystem(EntityEditPacketSender* packetSender,
|
EntityCollisionSystem::EntityCollisionSystem()
|
||||||
EntityTree* Entities, VoxelTree* voxels, AbstractAudioInterface* audio,
|
: SimpleEntitySimulation(),
|
||||||
AvatarHashMap* avatars) : _collisions(MAX_COLLISIONS_PER_Entity) {
|
_packetSender(NULL),
|
||||||
init(packetSender, Entities, voxels, audio, avatars);
|
_voxels(NULL),
|
||||||
|
_audio(NULL),
|
||||||
|
_avatars(NULL),
|
||||||
|
_collisions(MAX_COLLISIONS_PER_Entity) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void EntityCollisionSystem::init(EntityEditPacketSender* packetSender,
|
void EntityCollisionSystem::init(EntityEditPacketSender* packetSender,
|
||||||
EntityTree* Entities, VoxelTree* voxels, AbstractAudioInterface* audio,
|
EntityTree* entities, VoxelTree* voxels, AbstractAudioInterface* audio,
|
||||||
AvatarHashMap* avatars) {
|
AvatarHashMap* avatars) {
|
||||||
|
assert(entities);
|
||||||
|
setEntityTree(entities);
|
||||||
_packetSender = packetSender;
|
_packetSender = packetSender;
|
||||||
_entities = Entities;
|
|
||||||
_voxels = voxels;
|
_voxels = voxels;
|
||||||
_audio = audio;
|
_audio = audio;
|
||||||
_avatars = avatars;
|
_avatars = avatars;
|
||||||
|
@ -45,14 +51,15 @@ void EntityCollisionSystem::init(EntityEditPacketSender* packetSender,
|
||||||
EntityCollisionSystem::~EntityCollisionSystem() {
|
EntityCollisionSystem::~EntityCollisionSystem() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void EntityCollisionSystem::update() {
|
void EntityCollisionSystem::updateCollisions() {
|
||||||
|
PerformanceTimer perfTimer("collisions");
|
||||||
|
assert(_entityTree);
|
||||||
// update all Entities
|
// update all Entities
|
||||||
if (_entities->tryLockForRead()) {
|
if (_entityTree->tryLockForRead()) {
|
||||||
QList<EntityItem*>& movingEntities = _entities->getMovingEntities();
|
foreach (EntityItem* entity, _movingEntities) {
|
||||||
foreach (EntityItem* entity, movingEntities) {
|
|
||||||
checkEntity(entity);
|
checkEntity(entity);
|
||||||
}
|
}
|
||||||
_entities->unlock();
|
_entityTree->unlock();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -127,9 +134,8 @@ void EntityCollisionSystem::updateCollisionWithEntities(EntityItem* entityA) {
|
||||||
CollisionList collisions(MAX_COLLISIONS_PER_ENTITY);
|
CollisionList collisions(MAX_COLLISIONS_PER_ENTITY);
|
||||||
bool shapeCollisionsAccurate = false;
|
bool shapeCollisionsAccurate = false;
|
||||||
|
|
||||||
bool shapeCollisions = _entities->findShapeCollisions(&entityA->getCollisionShapeInMeters(),
|
bool shapeCollisions = _entityTree->findShapeCollisions(&entityA->getCollisionShapeInMeters(),
|
||||||
collisions, Octree::NoLock, &shapeCollisionsAccurate);
|
collisions, Octree::NoLock, &shapeCollisionsAccurate);
|
||||||
|
|
||||||
|
|
||||||
if (shapeCollisions) {
|
if (shapeCollisions) {
|
||||||
for(int i = 0; i < collisions.size(); i++) {
|
for(int i = 0; i < collisions.size(); i++) {
|
||||||
|
@ -203,7 +209,7 @@ void EntityCollisionSystem::updateCollisionWithEntities(EntityItem* entityA) {
|
||||||
propertiesA.setPosition(newPositionA * (float)TREE_SCALE);
|
propertiesA.setPosition(newPositionA * (float)TREE_SCALE);
|
||||||
propertiesA.setLastEdited(now);
|
propertiesA.setLastEdited(now);
|
||||||
|
|
||||||
_entities->updateEntity(idA, propertiesA);
|
_entityTree->updateEntity(idA, propertiesA);
|
||||||
_packetSender->queueEditEntityMessage(PacketTypeEntityAddOrEdit, idA, propertiesA);
|
_packetSender->queueEditEntityMessage(PacketTypeEntityAddOrEdit, idA, propertiesA);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -220,7 +226,7 @@ void EntityCollisionSystem::updateCollisionWithEntities(EntityItem* entityA) {
|
||||||
propertiesB.setPosition(newPositionB * (float)TREE_SCALE);
|
propertiesB.setPosition(newPositionB * (float)TREE_SCALE);
|
||||||
propertiesB.setLastEdited(now);
|
propertiesB.setLastEdited(now);
|
||||||
|
|
||||||
_entities->updateEntity(idB, propertiesB);
|
_entityTree->updateEntity(idB, propertiesB);
|
||||||
_packetSender->queueEditEntityMessage(PacketTypeEntityAddOrEdit, idB, propertiesB);
|
_packetSender->queueEditEntityMessage(PacketTypeEntityAddOrEdit, idB, propertiesB);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -326,6 +332,6 @@ void EntityCollisionSystem::applyHardCollision(EntityItem* entity, const Collisi
|
||||||
properties.setVelocity(velocity * (float)TREE_SCALE);
|
properties.setVelocity(velocity * (float)TREE_SCALE);
|
||||||
properties.setLastEdited(usecTimestampNow());
|
properties.setLastEdited(usecTimestampNow());
|
||||||
|
|
||||||
_entities->updateEntity(entityItemID, properties);
|
_entityTree->updateEntity(entityItemID, properties);
|
||||||
_packetSender->queueEditEntityMessage(PacketTypeEntityAddOrEdit, entityItemID, properties);
|
_packetSender->queueEditEntityMessage(PacketTypeEntityAddOrEdit, entityItemID, properties);
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,31 +20,29 @@
|
||||||
|
|
||||||
#include <AvatarHashMap.h>
|
#include <AvatarHashMap.h>
|
||||||
#include <CollisionInfo.h>
|
#include <CollisionInfo.h>
|
||||||
#include <SharedUtil.h>
|
#include <EntityItem.h>
|
||||||
#include <OctreePacketData.h>
|
#include <OctreePacketData.h>
|
||||||
|
#include <SharedUtil.h>
|
||||||
|
#include <SimpleEntitySimulation.h>
|
||||||
#include <VoxelDetail.h>
|
#include <VoxelDetail.h>
|
||||||
|
|
||||||
#include "EntityItem.h"
|
|
||||||
|
|
||||||
class AbstractAudioInterface;
|
class AbstractAudioInterface;
|
||||||
class AvatarData;
|
class AvatarData;
|
||||||
class EntityEditPacketSender;
|
class EntityEditPacketSender;
|
||||||
class EntityTree;
|
class EntityTree;
|
||||||
class VoxelTree;
|
class VoxelTree;
|
||||||
|
|
||||||
class EntityCollisionSystem : public QObject {
|
class EntityCollisionSystem : public QObject, public SimpleEntitySimulation {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
EntityCollisionSystem(EntityEditPacketSender* packetSender = NULL, EntityTree* Entitys = NULL,
|
EntityCollisionSystem();
|
||||||
VoxelTree* voxels = NULL, AbstractAudioInterface* audio = NULL,
|
|
||||||
AvatarHashMap* avatars = NULL);
|
|
||||||
|
|
||||||
void init(EntityEditPacketSender* packetSender, EntityTree* Entitys, VoxelTree* voxels,
|
void init(EntityEditPacketSender* packetSender, EntityTree* entities, VoxelTree* voxels,
|
||||||
AbstractAudioInterface* audio = NULL, AvatarHashMap* _avatars = NULL);
|
AbstractAudioInterface* audio = NULL, AvatarHashMap* _avatars = NULL);
|
||||||
|
|
||||||
~EntityCollisionSystem();
|
~EntityCollisionSystem();
|
||||||
|
|
||||||
void update();
|
void updateCollisions();
|
||||||
|
|
||||||
void checkEntity(EntityItem* Entity);
|
void checkEntity(EntityItem* Entity);
|
||||||
void updateCollisionWithVoxels(EntityItem* Entity);
|
void updateCollisionWithVoxels(EntityItem* Entity);
|
||||||
|
@ -65,7 +63,6 @@ private:
|
||||||
void emitGlobalEntityCollisionWithEntity(EntityItem* entityA, EntityItem* entityB, const CollisionInfo& penetration);
|
void emitGlobalEntityCollisionWithEntity(EntityItem* entityA, EntityItem* entityB, const CollisionInfo& penetration);
|
||||||
|
|
||||||
EntityEditPacketSender* _packetSender;
|
EntityEditPacketSender* _packetSender;
|
||||||
EntityTree* _entities;
|
|
||||||
VoxelTree* _voxels;
|
VoxelTree* _voxels;
|
||||||
AbstractAudioInterface* _audio;
|
AbstractAudioInterface* _audio;
|
||||||
AvatarHashMap* _avatars;
|
AvatarHashMap* _avatars;
|
||||||
|
|
Loading…
Reference in a new issue