added penetration support to particle collisions JS callbacks

This commit is contained in:
ZappoMan 2014-03-05 15:03:54 -08:00
parent b329030c60
commit d89cb2bf5e
13 changed files with 69 additions and 40 deletions

View file

@ -30,8 +30,9 @@ var gravity = {
var damping = 0.1; var damping = 0.1;
var scriptA = " " + var scriptA = " " +
" function collisionWithParticle(other) { " + " function collisionWithParticle(other, penetration) { " +
" print('collisionWithParticle(other.getID()=' + other.getID() + ')...'); " + " print('collisionWithParticle(other.getID()=' + other.getID() + ')...'); " +
" Vec3.print('penetration=', penetration); " +
" 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();" +
@ -45,8 +46,9 @@ var scriptA = " " +
" "; " ";
var scriptB = " " + var scriptB = " " +
" function collisionWithParticle(other) { " + " function collisionWithParticle(other, penetration) { " +
" print('collisionWithParticle(other.getID()=' + other.getID() + ')...'); " + " print('collisionWithParticle(other.getID()=' + other.getID() + ')...'); " +
" Vec3.print('penetration=', penetration); " +
" print('myID=' + Particle.getID() + '\\n'); " + " print('myID=' + Particle.getID() + '\\n'); " +
" Particle.setScript('Particle.setShouldDie(true);'); " + " Particle.setScript('Particle.setShouldDie(true);'); " +
" } " + " } " +

View file

@ -10,17 +10,23 @@
// //
function particleCollisionWithVoxel(particle, voxel) { print("hello...");
function particleCollisionWithVoxel(particle, voxel, penetration) {
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);
} }
function particleCollisionWithParticle(particleA, particleB) { function particleCollisionWithParticle(particleA, particleB, penetration) {
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);
} }
Particles.particleCollisionWithVoxel.connect(particleCollisionWithVoxel); Particles.particleCollisionWithVoxel.connect(particleCollisionWithVoxel);
Particles.particleCollisionWithParticle.connect(particleCollisionWithParticle); Particles.particleCollisionWithParticle.connect(particleCollisionWithParticle);
print("here... hello...");

View file

@ -61,7 +61,8 @@ function shootBullet(position, velocity) {
Audio.playSound(fireSound, audioOptions); Audio.playSound(fireSound, audioOptions);
} }
function particleCollisionWithVoxel(particle, voxel) { function particleCollisionWithVoxel(particle, voxel, penetration) {
Vec3.print('particleCollisionWithVoxel() ... penetration=', penetration);
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;

View file

@ -62,8 +62,9 @@ function checkController() {
// 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) { " + " function collisionWithVoxel(voxel, penetration) { " +
" print('collisionWithVoxel(voxel)... '); " + " print('collisionWithVoxel(voxel)... '); " +
" Vec3.print('penetration=', penetration); " +
" 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,8 +392,9 @@ function deleteIfInvader(possibleInvaderParticle) {
} }
} }
function particleCollisionWithParticle(particleA, particleB) { function particleCollisionWithParticle(particleA, particleB, penetration) {
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);
if (missileFired) { if (missileFired) {
myMissile = Particles.identifyParticle(myMissile); myMissile = Particles.identifyParticle(myMissile);
if (myMissile.id == particleA.id) { if (myMissile.id == particleA.id) {

View file

@ -1560,14 +1560,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&)), SIGNAL(particleCollisionWithVoxel(const ParticleID&, const VoxelDetail&, const glm::vec3&)),
ScriptEngine::getParticlesScriptingInterface(), ScriptEngine::getParticlesScriptingInterface(),
SLOT(forwardParticleCollisionWithVoxel(const ParticleID&, const VoxelDetail&))); SLOT(forwardParticleCollisionWithVoxel(const ParticleID&, const VoxelDetail&, const glm::vec3&)));
connect(&_particleCollisionSystem, connect(&_particleCollisionSystem,
SIGNAL(particleCollisionWithParticle(const ParticleID&, const ParticleID&)), SIGNAL(particleCollisionWithParticle(const ParticleID&, const ParticleID&, const glm::vec3&)),
ScriptEngine::getParticlesScriptingInterface(), ScriptEngine::getParticlesScriptingInterface(),
SLOT(forwardParticleCollisionWithParticle(const ParticleID&, const ParticleID&))); SLOT(forwardParticleCollisionWithParticle(const ParticleID&, const ParticleID&, const glm::vec3&)));
_pieMenu.init("./resources/images/hifi-interface-tools-v2-pie.svg", _pieMenu.init("./resources/images/hifi-interface-tools-v2-pie.svg",
_glWidget->width(), _glWidget->width(),

View file

@ -884,25 +884,25 @@ void Particle::executeUpdateScripts() {
} }
} }
void Particle::collisionWithParticle(Particle* other) { void Particle::collisionWithParticle(Particle* other, const glm::vec3& penetration) {
// Only run this particle script if there's a script attached directly to the particle. // Only run this particle script if there's a script attached directly to the particle.
if (!_script.isEmpty()) { if (!_script.isEmpty()) {
ScriptEngine engine(_script); ScriptEngine engine(_script);
ParticleScriptObject particleScriptable(this); ParticleScriptObject particleScriptable(this);
startParticleScriptContext(engine, particleScriptable); startParticleScriptContext(engine, particleScriptable);
ParticleScriptObject otherParticleScriptable(other); ParticleScriptObject otherParticleScriptable(other);
particleScriptable.emitCollisionWithParticle(&otherParticleScriptable); particleScriptable.emitCollisionWithParticle(&otherParticleScriptable, penetration);
endParticleScriptContext(engine, particleScriptable); endParticleScriptContext(engine, particleScriptable);
} }
} }
void Particle::collisionWithVoxel(VoxelDetail* voxelDetails) { void Particle::collisionWithVoxel(VoxelDetail* voxelDetails, const glm::vec3& penetration) {
// Only run this particle script if there's a script attached directly to the particle. // Only run this particle script if there's a script attached directly to the particle.
if (!_script.isEmpty()) { if (!_script.isEmpty()) {
ScriptEngine engine(_script); ScriptEngine engine(_script);
ParticleScriptObject particleScriptable(this); ParticleScriptObject particleScriptable(this);
startParticleScriptContext(engine, particleScriptable); startParticleScriptContext(engine, particleScriptable);
particleScriptable.emitCollisionWithVoxel(*voxelDetails); particleScriptable.emitCollisionWithVoxel(*voxelDetails, penetration);
endParticleScriptContext(engine, particleScriptable); endParticleScriptContext(engine, particleScriptable);
} }
} }

View file

@ -295,8 +295,8 @@ public:
void applyHardCollision(const CollisionInfo& collisionInfo); void applyHardCollision(const CollisionInfo& collisionInfo);
void update(const quint64& now); void update(const quint64& now);
void collisionWithParticle(Particle* other); void collisionWithParticle(Particle* other, const glm::vec3& penetration);
void collisionWithVoxel(VoxelDetail* voxel); void collisionWithVoxel(VoxelDetail* voxel, const glm::vec3& penetration);
void debugDump() const; void debugDump() const;
@ -371,8 +371,10 @@ public:
//~ParticleScriptObject() { qDebug() << "~ParticleScriptObject() this=" << this; } //~ParticleScriptObject() { qDebug() << "~ParticleScriptObject() this=" << this; }
void emitUpdate() { emit update(); } void emitUpdate() { emit update(); }
void emitCollisionWithParticle(QObject* other) { emit collisionWithParticle(other); } void emitCollisionWithParticle(QObject* other, const glm::vec3& penetration)
void emitCollisionWithVoxel(const VoxelDetail& voxel) { emit collisionWithVoxel(voxel); } { emit collisionWithParticle(other, penetration); }
void emitCollisionWithVoxel(const VoxelDetail& voxel, const glm::vec3& penetration)
{ emit collisionWithVoxel(voxel, penetration); }
public slots: public slots:
unsigned int getID() const { return _particle->getID(); } unsigned int getID() const { return _particle->getID(); }
@ -417,8 +419,8 @@ public slots:
signals: signals:
void update(); void update();
void collisionWithVoxel(const VoxelDetail& voxel); void collisionWithVoxel(const VoxelDetail& voxel, const glm::vec3& penetration);
void collisionWithParticle(QObject* other); void collisionWithParticle(QObject* other, const glm::vec3& penetration);
private: private:
Particle* _particle; Particle* _particle;

View file

@ -71,15 +71,18 @@ void ParticleCollisionSystem::checkParticle(Particle* particle) {
updateCollisionWithAvatars(particle); updateCollisionWithAvatars(particle);
} }
void ParticleCollisionSystem::emitGlobalParticleCollisionWithVoxel(Particle* particle, VoxelDetail* voxelDetails) { void ParticleCollisionSystem::emitGlobalParticleCollisionWithVoxel(Particle* particle,
VoxelDetail* voxelDetails, const glm::vec3& penetration) {
ParticleID particleID = particle->getParticleID(); ParticleID particleID = particle->getParticleID();
emit particleCollisionWithVoxel(particleID, *voxelDetails); emit particleCollisionWithVoxel(particleID, *voxelDetails, penetration);
} }
void ParticleCollisionSystem::emitGlobalParticleCollisionWithParticle(Particle* particleA, Particle* particleB) { void ParticleCollisionSystem::emitGlobalParticleCollisionWithParticle(Particle* particleA,
Particle* particleB, const glm::vec3& penetration) {
ParticleID idA = particleA->getParticleID(); ParticleID idA = particleA->getParticleID();
ParticleID idB = particleB->getParticleID(); ParticleID idB = particleB->getParticleID();
emit particleCollisionWithParticle(idA, idB); emit particleCollisionWithParticle(idA, idB, penetration);
} }
void ParticleCollisionSystem::updateCollisionWithVoxels(Particle* particle) { void ParticleCollisionSystem::updateCollisionWithVoxels(Particle* particle) {
@ -95,10 +98,10 @@ void ParticleCollisionSystem::updateCollisionWithVoxels(Particle* particle) {
if (_voxels->findSpherePenetration(center, radius, collisionInfo._penetration, (void**)&voxelDetails)) { if (_voxels->findSpherePenetration(center, radius, collisionInfo._penetration, (void**)&voxelDetails)) {
// 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); particle->collisionWithVoxel(voxelDetails, collisionInfo._penetration);
// let the global script run their collision scripts for particles if they have them // let the global script run their collision scripts for particles if they have them
emitGlobalParticleCollisionWithVoxel(particle, voxelDetails); emitGlobalParticleCollisionWithVoxel(particle, voxelDetails, collisionInfo._penetration);
updateCollisionSound(particle, collisionInfo._penetration, COLLISION_FREQUENCY); updateCollisionSound(particle, collisionInfo._penetration, COLLISION_FREQUENCY);
collisionInfo._penetration /= (float)(TREE_SCALE); collisionInfo._penetration /= (float)(TREE_SCALE);
@ -125,9 +128,9 @@ void ParticleCollisionSystem::updateCollisionWithParticles(Particle* particleA)
// we don't want to count this as a collision. // we don't want to count this as a collision.
glm::vec3 relativeVelocity = particleA->getVelocity() - particleB->getVelocity(); glm::vec3 relativeVelocity = particleA->getVelocity() - particleB->getVelocity();
if (glm::dot(relativeVelocity, penetration) > 0.0f) { if (glm::dot(relativeVelocity, penetration) > 0.0f) {
particleA->collisionWithParticle(particleB); particleA->collisionWithParticle(particleB, penetration);
particleB->collisionWithParticle(particleA); particleB->collisionWithParticle(particleA, penetration * -1.0f); // the penetration is reversed
emitGlobalParticleCollisionWithParticle(particleA, particleB); emitGlobalParticleCollisionWithParticle(particleA, particleB, penetration);
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;

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); void particleCollisionWithVoxel(const ParticleID& particleID, const VoxelDetail& voxel, const glm::vec3& penetration);
void particleCollisionWithParticle(const ParticleID& idA, const ParticleID& idB); void particleCollisionWithParticle(const ParticleID& idA, const ParticleID& idB, const glm::vec3& penetration);
private: private:
static bool updateOperation(OctreeElement* element, void* extraData); static bool updateOperation(OctreeElement* element, void* extraData);
void emitGlobalParticleCollisionWithVoxel(Particle* particle, VoxelDetail* voxelDetails); void emitGlobalParticleCollisionWithVoxel(Particle* particle, VoxelDetail* voxelDetails, const glm::vec3& penetration);
void emitGlobalParticleCollisionWithParticle(Particle* particleA, Particle* particleB); void emitGlobalParticleCollisionWithParticle(Particle* particleA, Particle* particleB, const glm::vec3& penetration);
ParticleEditPacketSender* _packetSender; ParticleEditPacketSender* _packetSender;
ParticleTree* _particles; ParticleTree* _particles;

View file

@ -29,12 +29,13 @@ public:
private slots: private slots:
/// inbound slots for external collision systems /// inbound slots for external collision systems
void forwardParticleCollisionWithVoxel(const ParticleID& particleID, const VoxelDetail& voxel) { void forwardParticleCollisionWithVoxel(const ParticleID& particleID,
emit particleCollisionWithVoxel(particleID, voxel); const VoxelDetail& voxel, const glm::vec3& penetration) {
emit particleCollisionWithVoxel(particleID, voxel, penetration);
} }
void forwardParticleCollisionWithParticle(const ParticleID& idA, const ParticleID& idB) { void forwardParticleCollisionWithParticle(const ParticleID& idA, const ParticleID& idB, const glm::vec3& penetration) {
emit particleCollisionWithParticle(idA, idB); emit particleCollisionWithParticle(idA, idB, penetration);
} }
public slots: public slots:
@ -65,8 +66,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); void particleCollisionWithVoxel(const ParticleID& particleID, const VoxelDetail& voxel, const glm::vec3& penetration);
void particleCollisionWithParticle(const ParticleID& idA, const ParticleID& idB); void particleCollisionWithParticle(const ParticleID& idA, const ParticleID& idB, const glm::vec3& penetration);
private: private:
void queueParticleMessage(PacketType packetType, ParticleID particleID, const ParticleProperties& properties); void queueParticleMessage(PacketType packetType, ParticleID particleID, const ParticleProperties& properties);

View file

@ -9,6 +9,8 @@
// //
// //
#include <QDebug>
#include "Vec3.h" #include "Vec3.h"
glm::vec3 Vec3::multiply(const glm::vec3& v1, const glm::vec3& v2) { glm::vec3 Vec3::multiply(const glm::vec3& v1, const glm::vec3& v2) {
@ -32,3 +34,11 @@ glm::vec3 Vec3::subtract(const glm::vec3& v1, const glm::vec3& v2) {
float Vec3::length(const glm::vec3& v) { float Vec3::length(const glm::vec3& v) {
return glm::length(v); return glm::length(v);
} }
glm::vec3 Vec3::normalize(const glm::vec3& v) {
return glm::normalize(v);
}
void Vec3::print(const QString& lable, const glm::vec3& v) {
qDebug() << qPrintable(lable) << v.x << "," << v.y << "," << v.z;
}

View file

@ -27,6 +27,8 @@ public slots:
glm::vec3 sum(const glm::vec3& v1, const glm::vec3& v2); glm::vec3 sum(const glm::vec3& v1, const glm::vec3& v2);
glm::vec3 subtract(const glm::vec3& v1, const glm::vec3& v2); glm::vec3 subtract(const glm::vec3& v1, const glm::vec3& v2);
float length(const glm::vec3& v); float length(const glm::vec3& v);
glm::vec3 normalize(const glm::vec3& v);
void print(const QString& lable, const glm::vec3& v);
}; };