Merge pull request #2609 from AndrewMeadows/avatar-interaction

More details in JS collision events
This commit is contained in:
Brad Hefta-Gaub 2014-04-08 06:52:04 -10:00
commit 881383a5f2
11 changed files with 82 additions and 58 deletions

View file

@ -30,9 +30,10 @@ var gravity = {
var damping = 0.1; var damping = 0.1;
var scriptA = " " + var scriptA = " " +
" function collisionWithParticle(other, penetration) { " + " function collisionWithParticle(other, collision) { " +
" print('collisionWithParticle(other.getID()=' + other.getID() + ')...'); " + " print('collisionWithParticle(other.getID()=' + other.getID() + ')...'); " +
" Vec3.print('penetration=', penetration); " + " Vec3.print('penetration=', collision.penetration); " +
" Vec3.print('contactPoint=', collision.contactPoint); " +
" print('myID=' + Particle.getID() + '\\n'); " + " print('myID=' + Particle.getID() + '\\n'); " +
" var colorBlack = { red: 0, green: 0, blue: 0 };" + " var colorBlack = { red: 0, green: 0, blue: 0 };" +
" var otherColor = other.getColor();" + " var otherColor = other.getColor();" +
@ -46,9 +47,10 @@ var scriptA = " " +
" "; " ";
var scriptB = " " + var scriptB = " " +
" function collisionWithParticle(other, penetration) { " + " function collisionWithParticle(other, collision) { " +
" print('collisionWithParticle(other.getID()=' + other.getID() + ')...'); " + " print('collisionWithParticle(other.getID()=' + other.getID() + ')...'); " +
" Vec3.print('penetration=', penetration); " + " Vec3.print('penetration=', collision.penetration); " +
" Vec3.print('contactPoint=', collision.contactPoint); " +
" print('myID=' + Particle.getID() + '\\n'); " + " print('myID=' + Particle.getID() + '\\n'); " +
" Particle.setScript('Particle.setShouldDie(true);'); " + " Particle.setScript('Particle.setShouldDie(true);'); " +
" } " + " } " +

View file

@ -12,18 +12,20 @@
print("hello..."); print("hello...");
function particleCollisionWithVoxel(particle, voxel, penetration) { function particleCollisionWithVoxel(particle, voxel, collision) {
print("particleCollisionWithVoxel().."); print("particleCollisionWithVoxel()..");
print(" particle.getID()=" + particle.id); print(" particle.getID()=" + particle.id);
print(" voxel color...=" + voxel.red + ", " + voxel.green + ", " + voxel.blue); print(" voxel color...=" + voxel.red + ", " + voxel.green + ", " + voxel.blue);
Vec3.print('penetration=', penetration); Vec3.print('penetration=', collision.penetration);
Vec3.print('contactPoint=', collision.contactPoint);
} }
function particleCollisionWithParticle(particleA, particleB, penetration) { function particleCollisionWithParticle(particleA, particleB, collision) {
print("particleCollisionWithParticle().."); print("particleCollisionWithParticle()..");
print(" particleA.getID()=" + particleA.id); print(" particleA.getID()=" + particleA.id);
print(" particleB.getID()=" + particleB.id); print(" particleB.getID()=" + particleB.id);
Vec3.print('penetration=', penetration); Vec3.print('penetration=', collision.penetration);
Vec3.print('contactPoint=', collision.contactPoint);
} }
Particles.particleCollisionWithVoxel.connect(particleCollisionWithVoxel); Particles.particleCollisionWithVoxel.connect(particleCollisionWithVoxel);

View file

@ -145,24 +145,21 @@ function shootTarget() {
function particleCollisionWithVoxel(particle, voxel, penetration) { function particleCollisionWithVoxel(particle, voxel, collision) {
var HOLE_SIZE = 0.125; var HOLE_SIZE = 0.125;
var particleProperties = Particles.getParticleProperties(particle); var particleProperties = Particles.getParticleProperties(particle);
var position = particleProperties.position; var position = particleProperties.position;
Particles.deleteParticle(particle); Particles.deleteParticle(particle);
// Make a hole in this voxel // Make a hole in this voxel
Vec3.print("penetration", penetration); Vec3.print("penetration", collision.penetration);
Vec3.print("position", position); Vec3.print("contactPoint", collision.contactPoint);
var pointOfEntry = Vec3.subtract(position, penetration); Voxels.eraseVoxel(contactPoint.x, contactPoint.y, contactPoint.z, HOLE_SIZE);
Vec3.print("pointOfEntry", pointOfEntry);
Voxels.eraseVoxel(pointOfEntry.x, pointOfEntry.y, pointOfEntry.z, HOLE_SIZE);
Voxels.eraseVoxel(position.x, position.y, position.z, HOLE_SIZE); Voxels.eraseVoxel(position.x, position.y, position.z, HOLE_SIZE);
//audioOptions.position = position;
audioOptions.position = Vec3.sum(Camera.getPosition(), Quat.getFront(Camera.getOrientation())); audioOptions.position = Vec3.sum(Camera.getPosition(), Quat.getFront(Camera.getOrientation()));
Audio.playSound(impactSound, audioOptions); Audio.playSound(impactSound, audioOptions);
} }
function particleCollisionWithParticle(particle1, particle2) { function particleCollisionWithParticle(particle1, particle2, collision) {
score++; score++;
if (showScore) { if (showScore) {
Overlays.editOverlay(text, { text: "Score: " + score } ); Overlays.editOverlay(text, { text: "Score: " + score } );
@ -174,9 +171,11 @@ function particleCollisionWithParticle(particle1, particle2) {
var endTime = new Date(); var endTime = new Date();
var msecs = endTime.valueOf() - shotTime.valueOf(); var msecs = endTime.valueOf() - shotTime.valueOf();
print("hit, msecs = " + msecs); print("hit, msecs = " + msecs);
Vec3.print("penetration = ", collision.penetration);
Vec3.print("contactPoint = ", collision.contactPoint);
Particles.deleteParticle(particle1); Particles.deleteParticle(particle1);
Particles.deleteParticle(particle2); Particles.deleteParticle(particle2);
audioOptions.position = newPosition; // play the sound near the camera so the shooter can hear it
audioOptions.position = Vec3.sum(Camera.getPosition(), Quat.getFront(Camera.getOrientation())); audioOptions.position = Vec3.sum(Camera.getPosition(), Quat.getFront(Camera.getOrientation()));
Audio.playSound(targetHitSound, audioOptions); Audio.playSound(targetHitSound, audioOptions);
} }

View file

@ -62,9 +62,10 @@ function checkController(deltaTime) {
// This is the script for the particles that this gun shoots. // This is the script for the particles that this gun shoots.
var script = var script =
" function collisionWithVoxel(voxel, penetration) { " + " function collisionWithVoxel(voxel, collision) { " +
" print('collisionWithVoxel(voxel)... '); " + " print('collisionWithVoxel(voxel)... '); " +
" Vec3.print('penetration=', penetration); " + " Vec3.print('penetration=', collision.penetration); " +
" Vec3.print('contactPoint=', collision.contactPoint); " +
" print('myID=' + Particle.getID() + '\\n'); " + " print('myID=' + Particle.getID() + '\\n'); " +
" var voxelColor = { red: voxel.red, green: voxel.green, blue: voxel.blue };" + " var voxelColor = { red: voxel.red, green: voxel.green, blue: voxel.blue };" +
" var voxelAt = { x: voxel.x, y: voxel.y, z: voxel.z };" + " var voxelAt = { x: voxel.x, y: voxel.y, z: voxel.z };" +

View file

@ -392,9 +392,10 @@ function deleteIfInvader(possibleInvaderParticle) {
} }
} }
function particleCollisionWithParticle(particleA, particleB, penetration) { function particleCollisionWithParticle(particleA, particleB, collision) {
print("particleCollisionWithParticle() a.id="+particleA.id + " b.id=" + particleB.id); print("particleCollisionWithParticle() a.id="+particleA.id + " b.id=" + particleB.id);
Vec3.print('particleCollisionWithParticle() penetration=', penetration); Vec3.print('particleCollisionWithParticle() penetration=', collision.penetration);
Vec3.print('particleCollisionWithParticle() contactPoint=', collision.contactPoint);
if (missileFired) { if (missileFired) {
myMissile = Particles.identifyParticle(myMissile); myMissile = Particles.identifyParticle(myMissile);
if (myMissile.id == particleA.id) { if (myMissile.id == particleA.id) {

View file

@ -1572,14 +1572,14 @@ void Application::init() {
// connect the _particleCollisionSystem to our script engine's ParticleScriptingInterface // connect the _particleCollisionSystem to our script engine's ParticleScriptingInterface
connect(&_particleCollisionSystem, connect(&_particleCollisionSystem,
SIGNAL(particleCollisionWithVoxel(const ParticleID&, const VoxelDetail&, const glm::vec3&)), SIGNAL(particleCollisionWithVoxel(const ParticleID&, const VoxelDetail&, const CollisionInfo&)),
ScriptEngine::getParticlesScriptingInterface(), ScriptEngine::getParticlesScriptingInterface(),
SLOT(forwardParticleCollisionWithVoxel(const ParticleID&, const VoxelDetail&, const glm::vec3&))); SIGNAL(particleCollisionWithVoxels(const ParticleID&, const VoxelDetail&, const CollisionInfo&)));
connect(&_particleCollisionSystem, connect(&_particleCollisionSystem,
SIGNAL(particleCollisionWithParticle(const ParticleID&, const ParticleID&, const glm::vec3&)), SIGNAL(particleCollisionWithParticle(const ParticleID&, const ParticleID&, const CollisionInfo&)),
ScriptEngine::getParticlesScriptingInterface(), ScriptEngine::getParticlesScriptingInterface(),
SLOT(forwardParticleCollisionWithParticle(const ParticleID&, const ParticleID&, const glm::vec3&))); SIGNAL(particleCollisionWithParticle(const ParticleID&, const ParticleID&, const CollisionInfo&)));
_audio.init(_glWidget); _audio.init(_glWidget);

View file

@ -72,17 +72,17 @@ void ParticleCollisionSystem::checkParticle(Particle* particle) {
} }
void ParticleCollisionSystem::emitGlobalParticleCollisionWithVoxel(Particle* particle, void ParticleCollisionSystem::emitGlobalParticleCollisionWithVoxel(Particle* particle,
VoxelDetail* voxelDetails, const glm::vec3& penetration) { VoxelDetail* voxelDetails, const CollisionInfo& collision) {
ParticleID particleID = particle->getParticleID(); ParticleID particleID = particle->getParticleID();
emit particleCollisionWithVoxel(particleID, *voxelDetails, penetration); emit particleCollisionWithVoxel(particleID, *voxelDetails, collision);
} }
void ParticleCollisionSystem::emitGlobalParticleCollisionWithParticle(Particle* particleA, void ParticleCollisionSystem::emitGlobalParticleCollisionWithParticle(Particle* particleA,
Particle* particleB, const glm::vec3& penetration) { Particle* particleB, const CollisionInfo& collision) {
ParticleID idA = particleA->getParticleID(); ParticleID idA = particleA->getParticleID();
ParticleID idB = particleB->getParticleID(); ParticleID idB = particleB->getParticleID();
emit particleCollisionWithParticle(idA, idB, penetration); emit particleCollisionWithParticle(idA, idB, collision);
} }
void ParticleCollisionSystem::updateCollisionWithVoxels(Particle* particle) { void ParticleCollisionSystem::updateCollisionWithVoxels(Particle* particle) {
@ -100,11 +100,17 @@ void ParticleCollisionSystem::updateCollisionWithVoxels(Particle* particle) {
// let the particles run their collision scripts if they have them // let the particles run their collision scripts if they have them
particle->collisionWithVoxel(voxelDetails, collisionInfo._penetration); particle->collisionWithVoxel(voxelDetails, collisionInfo._penetration);
// let the global script run their collision scripts for particles if they have them // findSpherePenetration() only computes the penetration but we also want some other collision info
emitGlobalParticleCollisionWithVoxel(particle, voxelDetails, collisionInfo._penetration); // so we compute it ourselves here. Note that we must multiply scale by TREE_SCALE when feeding
// the results to systems outside of this octree reference frame.
updateCollisionSound(particle, collisionInfo._penetration, COLLISION_FREQUENCY); updateCollisionSound(particle, collisionInfo._penetration, COLLISION_FREQUENCY);
collisionInfo._contactPoint = (float)TREE_SCALE * (particle->getPosition() + particle->getRadius() * glm::normalize(collisionInfo._penetration));
// let the global script run their collision scripts for particles if they have them
emitGlobalParticleCollisionWithVoxel(particle, voxelDetails, collisionInfo);
// we must scale back down to the octree reference frame before updating the particle properties
collisionInfo._penetration /= (float)(TREE_SCALE); collisionInfo._penetration /= (float)(TREE_SCALE);
collisionInfo._contactPoint /= (float)(TREE_SCALE);
particle->applyHardCollision(collisionInfo); particle->applyHardCollision(collisionInfo);
queueParticlePropertiesUpdate(particle); queueParticlePropertiesUpdate(particle);
@ -121,8 +127,7 @@ void ParticleCollisionSystem::updateCollisionWithParticles(Particle* particleA)
glm::vec3 penetration; glm::vec3 penetration;
Particle* particleB; Particle* particleB;
if (_particles->findSpherePenetration(center, radius, penetration, (void**)&particleB, Octree::NoLock)) { if (_particles->findSpherePenetration(center, radius, penetration, (void**)&particleB, Octree::NoLock)) {
// NOTE: 'penetration' is the depth that 'particleA' overlaps 'particleB'. // NOTE: 'penetration' is the depth that 'particleA' overlaps 'particleB'. It points from A into B.
// That is, it points from A into B.
// Even if the particles overlap... when the particles are already moving appart // Even if the particles overlap... when the particles are already moving appart
// we don't want to count this as a collision. // we don't want to count this as a collision.
@ -130,7 +135,12 @@ void ParticleCollisionSystem::updateCollisionWithParticles(Particle* particleA)
if (glm::dot(relativeVelocity, penetration) > 0.0f) { if (glm::dot(relativeVelocity, penetration) > 0.0f) {
particleA->collisionWithParticle(particleB, penetration); particleA->collisionWithParticle(particleB, penetration);
particleB->collisionWithParticle(particleA, penetration * -1.0f); // the penetration is reversed particleB->collisionWithParticle(particleA, penetration * -1.0f); // the penetration is reversed
emitGlobalParticleCollisionWithParticle(particleA, particleB, penetration);
CollisionInfo collision;
collision._penetration = penetration;
// for now the contactPoint is the average between the the two paricle centers
collision._contactPoint = (0.5f * (float)TREE_SCALE) * (particleA->getPosition() + particleB->getPosition());
emitGlobalParticleCollisionWithParticle(particleA, particleB, collision);
glm::vec3 axis = glm::normalize(penetration); glm::vec3 axis = glm::normalize(penetration);
glm::vec3 axialVelocity = glm::dot(relativeVelocity, axis) * axis; glm::vec3 axialVelocity = glm::dot(relativeVelocity, axis) * axis;
@ -142,25 +152,25 @@ void ParticleCollisionSystem::updateCollisionWithParticles(Particle* particleA)
float massB = (particleB->getInHand()) ? MAX_MASS : particleB->getMass(); float massB = (particleB->getInHand()) ? MAX_MASS : particleB->getMass();
float totalMass = massA + massB; float totalMass = massA + massB;
// handle A particle // handle particle A
particleA->setVelocity(particleA->getVelocity() - axialVelocity * (2.0f * massB / totalMass)); particleA->setVelocity(particleA->getVelocity() - axialVelocity * (2.0f * massB / totalMass));
particleA->setPosition(particleA->getPosition() - 0.5f * penetration); particleA->setPosition(particleA->getPosition() - 0.5f * penetration);
ParticleProperties propertiesA; ParticleProperties propertiesA;
ParticleID particleAid(particleA->getID()); ParticleID idA(particleA->getID());
propertiesA.copyFromParticle(*particleA); propertiesA.copyFromParticle(*particleA);
propertiesA.setVelocity(particleA->getVelocity() * (float)TREE_SCALE); propertiesA.setVelocity(particleA->getVelocity() * (float)TREE_SCALE);
propertiesA.setPosition(particleA->getPosition() * (float)TREE_SCALE); propertiesA.setPosition(particleA->getPosition() * (float)TREE_SCALE);
_packetSender->queueParticleEditMessage(PacketTypeParticleAddOrEdit, particleAid, propertiesA); _packetSender->queueParticleEditMessage(PacketTypeParticleAddOrEdit, idA, propertiesA);
// handle B particle // handle particle B
particleB->setVelocity(particleB->getVelocity() + axialVelocity * (2.0f * massA / totalMass)); particleB->setVelocity(particleB->getVelocity() + axialVelocity * (2.0f * massA / totalMass));
particleA->setPosition(particleB->getPosition() + 0.5f * penetration); particleA->setPosition(particleB->getPosition() + 0.5f * penetration);
ParticleProperties propertiesB; ParticleProperties propertiesB;
ParticleID particleBid(particleB->getID()); ParticleID idB(particleB->getID());
propertiesB.copyFromParticle(*particleB); propertiesB.copyFromParticle(*particleB);
propertiesB.setVelocity(particleB->getVelocity() * (float)TREE_SCALE); propertiesB.setVelocity(particleB->getVelocity() * (float)TREE_SCALE);
propertiesB.setPosition(particleB->getPosition() * (float)TREE_SCALE); propertiesB.setPosition(particleB->getPosition() * (float)TREE_SCALE);
_packetSender->queueParticleEditMessage(PacketTypeParticleAddOrEdit, particleBid, propertiesB); _packetSender->queueParticleEditMessage(PacketTypeParticleAddOrEdit, idB, propertiesB);
_packetSender->releaseQueuedMessages(); _packetSender->releaseQueuedMessages();

View file

@ -53,13 +53,13 @@ public:
void updateCollisionSound(Particle* particle, const glm::vec3 &penetration, float frequency); void updateCollisionSound(Particle* particle, const glm::vec3 &penetration, float frequency);
signals: signals:
void particleCollisionWithVoxel(const ParticleID& particleID, const VoxelDetail& voxel, const glm::vec3& penetration); void particleCollisionWithVoxel(const ParticleID& particleID, const VoxelDetail& voxel, const CollisionInfo& penetration);
void particleCollisionWithParticle(const ParticleID& idA, const ParticleID& idB, const glm::vec3& penetration); void particleCollisionWithParticle(const ParticleID& idA, const ParticleID& idB, const CollisionInfo& penetration);
private: private:
static bool updateOperation(OctreeElement* element, void* extraData); static bool updateOperation(OctreeElement* element, void* extraData);
void emitGlobalParticleCollisionWithVoxel(Particle* particle, VoxelDetail* voxelDetails, const glm::vec3& penetration); void emitGlobalParticleCollisionWithVoxel(Particle* particle, VoxelDetail* voxelDetails, const CollisionInfo& penetration);
void emitGlobalParticleCollisionWithParticle(Particle* particleA, Particle* particleB, const glm::vec3& penetration); void emitGlobalParticleCollisionWithParticle(Particle* particleA, Particle* particleB, const CollisionInfo& penetration);
ParticleEditPacketSender* _packetSender; ParticleEditPacketSender* _packetSender;
ParticleTree* _particles; ParticleTree* _particles;

View file

@ -11,6 +11,8 @@
#include <QtCore/QObject> #include <QtCore/QObject>
#include <CollisionInfo.h>
#include <OctreeScriptingInterface.h> #include <OctreeScriptingInterface.h>
#include "ParticleEditPacketSender.h" #include "ParticleEditPacketSender.h"
@ -27,17 +29,6 @@ public:
void setParticleTree(ParticleTree* particleTree) { _particleTree = particleTree; } void setParticleTree(ParticleTree* particleTree) { _particleTree = particleTree; }
ParticleTree* getParticleTree(ParticleTree*) { return _particleTree; } ParticleTree* getParticleTree(ParticleTree*) { return _particleTree; }
private slots:
/// inbound slots for external collision systems
void forwardParticleCollisionWithVoxel(const ParticleID& particleID,
const VoxelDetail& voxel, const glm::vec3& penetration) {
emit particleCollisionWithVoxel(particleID, voxel, penetration);
}
void forwardParticleCollisionWithParticle(const ParticleID& idA, const ParticleID& idB, const glm::vec3& penetration) {
emit particleCollisionWithParticle(idA, idB, penetration);
}
public slots: public slots:
/// adds a particle with the specific properties /// adds a particle with the specific properties
ParticleID addParticle(const ParticleProperties& properties); ParticleID addParticle(const ParticleProperties& properties);
@ -66,8 +57,8 @@ public slots:
QVector<ParticleID> findParticles(const glm::vec3& center, float radius) const; QVector<ParticleID> findParticles(const glm::vec3& center, float radius) const;
signals: signals:
void particleCollisionWithVoxel(const ParticleID& particleID, const VoxelDetail& voxel, const glm::vec3& penetration); void particleCollisionWithVoxel(const ParticleID& particleID, const VoxelDetail& voxel, const CollisionInfo& collision);
void particleCollisionWithParticle(const ParticleID& idA, const ParticleID& idB, const glm::vec3& penetration); void particleCollisionWithParticle(const ParticleID& idA, const ParticleID& idB, const CollisionInfo& collision);
private: private:
void queueParticleMessage(PacketType packetType, ParticleID particleID, const ParticleProperties& properties); void queueParticleMessage(PacketType packetType, ParticleID particleID, const ParticleProperties& properties);

View file

@ -16,6 +16,7 @@ static int vec2MetaTypeId = qRegisterMetaType<glm::vec2>();
static int quatMetaTypeId = qRegisterMetaType<glm::quat>(); static int quatMetaTypeId = qRegisterMetaType<glm::quat>();
static int xColorMetaTypeId = qRegisterMetaType<xColor>(); static int xColorMetaTypeId = qRegisterMetaType<xColor>();
static int pickRayMetaTypeId = qRegisterMetaType<PickRay>(); static int pickRayMetaTypeId = qRegisterMetaType<PickRay>();
static int collisionMetaTypeId = qRegisterMetaType<CollisionInfo>();
void registerMetaTypes(QScriptEngine* engine) { void registerMetaTypes(QScriptEngine* engine) {
qScriptRegisterMetaType(engine, vec4toScriptValue, vec4FromScriptValue); qScriptRegisterMetaType(engine, vec4toScriptValue, vec4FromScriptValue);
@ -24,6 +25,7 @@ void registerMetaTypes(QScriptEngine* engine) {
qScriptRegisterMetaType(engine, quatToScriptValue, quatFromScriptValue); qScriptRegisterMetaType(engine, quatToScriptValue, quatFromScriptValue);
qScriptRegisterMetaType(engine, xColorToScriptValue, xColorFromScriptValue); qScriptRegisterMetaType(engine, xColorToScriptValue, xColorFromScriptValue);
qScriptRegisterMetaType(engine, pickRayToScriptValue, pickRayFromScriptValue); qScriptRegisterMetaType(engine, pickRayToScriptValue, pickRayFromScriptValue);
qScriptRegisterMetaType(engine, collisionToScriptValue, collisionFromScriptValue);
} }
QScriptValue vec4toScriptValue(QScriptEngine* engine, const glm::vec4& vec4) { QScriptValue vec4toScriptValue(QScriptEngine* engine, const glm::vec4& vec4) {
@ -122,3 +124,14 @@ void pickRayFromScriptValue(const QScriptValue& object, PickRay& pickRay) {
} }
} }
QScriptValue collisionToScriptValue(QScriptEngine* engine, const CollisionInfo& collision) {
QScriptValue obj = engine->newObject();
obj.setProperty("penetration", vec3toScriptValue(engine, collision._penetration));
obj.setProperty("contactPoint", vec3toScriptValue(engine, collision._contactPoint));
return obj;
}
void collisionFromScriptValue(const QScriptValue &object, CollisionInfo& collision) {
// TODO: implement this when we know what it means to accept collision events from JS
}

View file

@ -15,6 +15,7 @@
#include <QtScript/QScriptEngine> #include <QtScript/QScriptEngine>
#include "CollisionInfo.h"
#include "SharedUtil.h" #include "SharedUtil.h"
Q_DECLARE_METATYPE(glm::vec4) Q_DECLARE_METATYPE(glm::vec4)
@ -50,4 +51,8 @@ Q_DECLARE_METATYPE(PickRay)
QScriptValue pickRayToScriptValue(QScriptEngine* engine, const PickRay& pickRay); QScriptValue pickRayToScriptValue(QScriptEngine* engine, const PickRay& pickRay);
void pickRayFromScriptValue(const QScriptValue& object, PickRay& pickRay); void pickRayFromScriptValue(const QScriptValue& object, PickRay& pickRay);
Q_DECLARE_METATYPE(CollisionInfo)
QScriptValue collisionToScriptValue(QScriptEngine* engine, const CollisionInfo& collision);
void collisionFromScriptValue(const QScriptValue &object, CollisionInfo& collision);
#endif #endif