void ParticlesGame::saveFile() { std::string filename; filename = FileSystem::displayFileDialog(FileSystem::SAVE, "Save Particle File", "Particle Files", "particle", "res"); if (filename.length() == 0) return; ParticleEmitter* e = _particleEmitter; // Extract just the particle name from the filename std::string dir = FileSystem::getDirectoryName(filename.c_str()); std::string ext = FileSystem::getExtension(filename.c_str()); std::string name = filename.substr(dir.length(), filename.length() - dir.length() - ext.length()); Texture* texture = e->getTexture(); std::string texturePath = texture->getPath(); std::string textureDir = FileSystem::getDirectoryName(texturePath.c_str()); texturePath = texturePath.substr(textureDir.length()); // Get camera rotation as axis-angle Vector3 cameraAxis; float cameraAngle = MATH_RAD_TO_DEG(_cameraParent->getRotation().toAxisAngle(&cameraAxis)); // Write out a properties file std::ostringstream s; s << "particle " << name << "\n" << "{\n" << " sprite\n" << " {\n" << " path = " << texturePath << "\n" << " width = " << e->getSpriteWidth() << "\n" << " height = " << e->getSpriteHeight() << "\n" << " blending = " << toString(e->getTextureBlending()) << "\n" << " animated = " << toString(e->isSpriteAnimated()) << "\n" << " looped = " << toString(e->isSpriteLooped()) << "\n" << " frameCount = " << e->getSpriteFrameCount() << "\n" << " frameRandomOffset = " << e->getSpriteFrameRandomOffset() << "\n" << " frameDuration = " << e->getSpriteFrameDuration() << "\n" << " }\n" << "\n" << " particleCountMax = " << e->getParticleCountMax() << "\n" << " emissionRate = " << e->getEmissionRate() << "\n" << " ellipsoid = " << toString(e->isEllipsoid()) << "\n" << " orbitPosition = " << toString(e->getOrbitPosition()) << "\n" << " orbitVelocity = " << toString(e->getOrbitVelocity()) << "\n" << " orbitAcceleration = " << toString(e->getOrbitAcceleration()) << "\n" << " sizeStartMin = " << e->getSizeStartMin() << "\n" << " sizeStartMax = " << e->getSizeStartMax() << "\n" << " sizeEndMin = " << e->getSizeEndMin() << "\n" << " sizeEndMax = " << e->getSizeEndMax() << "\n" << " energyMin = " << e->getEnergyMin() << "\n" << " energyMax = " << e->getEnergyMax() << "\n" << " colorStart = " << toString(e->getColorStart()) << "\n" << " colorStartVar = " << toString(e->getColorStartVariance()) << "\n" << " colorEnd = " << toString(e->getColorEnd()) << "\n" << " colorEndVar = " << toString(e->getColorEndVariance()) << "\n" << " position = " << toString(e->getPosition()) << "\n" << " positionVar = " << toString(e->getPositionVariance()) << "\n" << " velocity = " << toString(e->getVelocity()) << "\n" << " velocityVar = " << toString(e->getVelocityVariance()) << "\n" << " acceleration = " << toString(e->getAcceleration()) << "\n" << " accelerationVar = " << toString(e->getAccelerationVariance()) << "\n" << " rotationPerParticleSpeedMin = " << e->getRotationPerParticleSpeedMin() << "\n" << " rotationPerParticleSpeedMax = " << e->getRotationPerParticleSpeedMax() << "\n" << "\n" << " editor\n" << " {\n" << " cameraTranslation = " << toString(_cameraParent->getTranslation()) << "\n" << " cameraZoom = " << toString(_scene->getActiveCamera()->getNode()->getTranslation()) << "\n" << " cameraRotation = " << toString(cameraAxis) << ", " << cameraAngle << "\n" << " sizeMax = " << _startMax->getMax() << "\n" << " energyMax = " << _energyMax->getMax() << "\n" << " }\n" "}\n"; std::string text = s.str(); Stream* stream = FileSystem::open(filename.c_str(), FileSystem::WRITE); stream->write(text.c_str(), 1, text.length()); stream->close(); SAFE_DELETE(stream); }
void ParticlesGame::controlEvent(Control* control, EventType evt) { std::string id = control->getId(); // Handle UI events. ParticleEmitter* emitter = _particleEmitterNode->getParticleEmitter(); switch(evt) { case Listener::VALUE_CHANGED: if (control == _startRed) { Vector4 startColor = emitter->getColorStart(); startColor.x = _startRed->getValue(); emitter->setColor(startColor, emitter->getColorStartVariance(), emitter->getColorEnd(), emitter->getColorEndVariance()); } else if (control == _startGreen) { Vector4 startColor = emitter->getColorStart(); startColor.y = _startGreen->getValue(); emitter->setColor(startColor, emitter->getColorStartVariance(), emitter->getColorEnd(), emitter->getColorEndVariance()); } else if (control == _startBlue) { Vector4 startColor = emitter->getColorStart(); startColor.z = _startBlue->getValue(); emitter->setColor(startColor, emitter->getColorStartVariance(), emitter->getColorEnd(), emitter->getColorEndVariance()); } else if (control == _startAlpha) { Vector4 startColor = emitter->getColorStart(); startColor.w = _startAlpha->getValue(); emitter->setColor(startColor, emitter->getColorStartVariance(), emitter->getColorEnd(), emitter->getColorEndVariance()); } else if (control == _endRed) { Vector4 endColor = emitter->getColorEnd(); endColor.x = _endRed->getValue(); emitter->setColor(emitter->getColorStart(), emitter->getColorStartVariance(), endColor, emitter->getColorEndVariance()); } else if (control == _endGreen) { Vector4 endColor = emitter->getColorEnd(); endColor.y = _endGreen->getValue(); emitter->setColor(emitter->getColorStart(), emitter->getColorStartVariance(), endColor, emitter->getColorEndVariance()); } else if (control == _endBlue) { Vector4 endColor = emitter->getColorEnd(); endColor.z = _endBlue->getValue(); emitter->setColor(emitter->getColorStart(), emitter->getColorStartVariance(), endColor, emitter->getColorEndVariance()); } else if (control == _endAlpha) { Vector4 endColor = emitter->getColorEnd(); endColor.w = _endAlpha->getValue(); emitter->setColor(emitter->getColorStart(), emitter->getColorStartVariance(), endColor, emitter->getColorEndVariance()); } else if (control == _startMin) { emitter->setSize(_startMin->getValue(), emitter->getSizeStartMax(), emitter->getSizeEndMin(), emitter->getSizeEndMax()); } else if (control == _startMax) { emitter->setSize(emitter->getSizeStartMin(), _startMax->getValue(), emitter->getSizeEndMin(), emitter->getSizeEndMax()); } else if (control == _endMin) { emitter->setSize(emitter->getSizeStartMin(), emitter->getSizeStartMax(), _endMin->getValue(), emitter->getSizeEndMax()); } else if (control == _endMax) { emitter->setSize(emitter->getSizeStartMin(), emitter->getSizeStartMax(), emitter->getSizeEndMin(), _endMax->getValue()); } else if (control == _energyMin) { emitter->setEnergy(_energyMin->getValue(), emitter->getEnergyMax()); } else if (control == _energyMax) { emitter->setEnergy(emitter->getEnergyMin(), _energyMax->getValue()); } else if (control == _emissionRate) { emitter->setEmissionRate(_emissionRate->getValue()); } else if (id == "posX") { Vector3 pos(emitter->getPosition()); pos.x = ((Slider*)control)->getValue(); emitter->setPosition(pos, emitter->getPositionVariance()); } else if (id == "posY") { Vector3 pos(emitter->getPosition()); pos.y = ((Slider*)control)->getValue(); emitter->setPosition(pos, emitter->getPositionVariance()); } else if (id == "posZ") { Vector3 pos(emitter->getPosition()); pos.z = ((Slider*)control)->getValue(); emitter->setPosition(pos, emitter->getPositionVariance()); } else if (control == _posVarX) { Vector3 posVar = emitter->getPositionVariance(); posVar.x = _posVarX->getValue(); emitter->setPosition(emitter->getPosition(), posVar); } else if (control == _posVarY) { Vector3 posVar = emitter->getPositionVariance(); posVar.y = _posVarY->getValue(); emitter->setPosition(emitter->getPosition(), posVar); } else if (control == _posVarZ) { Vector3 posVar = emitter->getPositionVariance(); posVar.z = _posVarZ->getValue(); emitter->setPosition(emitter->getPosition(), posVar); } else if (control == _velX) { Vector3 vel = emitter->getVelocity(); vel.x = _velX->getValue(); emitter->setVelocity(vel, emitter->getVelocityVariance()); } else if (control == _velY) { Vector3 vel = emitter->getVelocity(); vel.y = _velY->getValue(); emitter->setVelocity(vel, emitter->getVelocityVariance()); } else if (control == _velZ) { Vector3 vel = emitter->getVelocity(); vel.z = _velZ->getValue(); emitter->setVelocity(vel, emitter->getVelocityVariance()); } else if (control == _velVarX) { Vector3 velVar = emitter->getVelocityVariance(); velVar.x = _velVarX->getValue(); emitter->setVelocity(emitter->getVelocity(), velVar); } else if (control == _velVarY) { Vector3 velVar = emitter->getVelocityVariance(); velVar.y = _velVarY->getValue(); emitter->setVelocity(emitter->getVelocity(), velVar); } else if (control == _velVarZ) { Vector3 velVar = emitter->getVelocityVariance(); velVar.z = _velVarZ->getValue(); emitter->setVelocity(emitter->getVelocity(), velVar); } else if (control == _accelX) { Vector3 accel = emitter->getAcceleration(); accel.x = _accelX->getValue(); emitter->setAcceleration(accel, emitter->getAccelerationVariance()); } else if (control == _accelY) { Vector3 accel = emitter->getAcceleration(); accel.y = _accelY->getValue(); emitter->setAcceleration(accel, emitter->getAccelerationVariance()); } else if (control == _accelZ) { Vector3 accel = emitter->getAcceleration(); accel.z = _accelZ->getValue(); emitter->setAcceleration(accel, emitter->getAccelerationVariance()); } else if (control == _accelVarX) { Vector3 accelVar = emitter->getAccelerationVariance(); accelVar.x = _accelVarX->getValue(); emitter->setAcceleration(emitter->getAcceleration(), accelVar); } else if (control == _accelVarY) { Vector3 accelVar = emitter->getAccelerationVariance(); accelVar.y = _accelVarY->getValue(); emitter->setAcceleration(emitter->getAcceleration(), accelVar); } else if (control == _accelVarZ) { Vector3 accelVar = emitter->getAccelerationVariance(); accelVar.z = _accelVarZ->getValue(); emitter->setAcceleration(emitter->getAcceleration(), accelVar); } else if (control == _spinSpeedMin) { emitter->setRotationPerParticle(_spinSpeedMin->getValue(), emitter->getRotationPerParticleSpeedMax()); } else if (control == _spinSpeedMax) { emitter->setRotationPerParticle(emitter->getRotationPerParticleSpeedMin(), _spinSpeedMax->getValue()); } else if (control == _axisX) { Vector3 axis = emitter->getRotationAxis(); axis.x = _axisX->getValue(); emitter->setRotation(emitter->getRotationSpeedMin(), emitter->getRotationSpeedMax(), axis, emitter->getRotationAxisVariance()); } else if (control == _axisY) { Vector3 axis = emitter->getRotationAxis(); axis.y = _axisY->getValue(); emitter->setRotation(emitter->getRotationSpeedMin(), emitter->getRotationSpeedMax(), axis, emitter->getRotationAxisVariance()); } else if (control == _axisZ) { Vector3 axis = emitter->getRotationAxis(); axis.z = _axisZ->getValue(); emitter->setRotation(emitter->getRotationSpeedMin(), emitter->getRotationSpeedMax(), axis, emitter->getRotationAxisVariance()); } else if (control == _axisVarX) { Vector3 axisVar = emitter->getRotationAxisVariance(); axisVar.x = _axisVarX->getValue(); emitter->setRotation(emitter->getRotationSpeedMin(), emitter->getRotationSpeedMax(), emitter->getRotationAxis(), axisVar); } else if (control == _axisVarY) { Vector3 axisVar = emitter->getRotationAxisVariance(); axisVar.y = _axisVarY->getValue(); emitter->setRotation(emitter->getRotationSpeedMin(), emitter->getRotationSpeedMax(), emitter->getRotationAxis(), axisVar); } else if (control == _axisVarZ) { Vector3 axisVar = emitter->getRotationAxisVariance(); axisVar.z = _axisVarZ->getValue(); emitter->setRotation(emitter->getRotationSpeedMin(), emitter->getRotationSpeedMax(), emitter->getRotationAxis(), axisVar); } else if (control == _rotationSpeedMin) { emitter->setRotation(_rotationSpeedMin->getValue(), emitter->getRotationSpeedMax(), emitter->getRotationAxis(), emitter->getRotationAxisVariance()); } else if (control == _rotationSpeedMax) { emitter->setRotation(emitter->getRotationSpeedMin(), _rotationSpeedMax->getValue(), emitter->getRotationAxis(), emitter->getRotationAxisVariance()); } else if (control == _started) { if (_started->isChecked()) { emitter->start(); } else { emitter->stop(); } } else if (control == _vsync) { Game::getInstance()->setVsync(_vsync->isChecked()); } else if (id == "additive") { if (((RadioButton*)control)->isSelected()) emitter->setTextureBlending(ParticleEmitter::BLEND_ADDITIVE); } else if (id == "transparent") { if (((RadioButton*)control)->isSelected()) emitter->setTextureBlending(ParticleEmitter::BLEND_TRANSPARENT); } else if (id == "multiply") { if (((RadioButton*)control)->isSelected()) emitter->setTextureBlending(ParticleEmitter::BLEND_MULTIPLIED); } else if (id == "opaque") { if (((RadioButton*)control)->isSelected()) emitter->setTextureBlending(ParticleEmitter::BLEND_OPAQUE); } break; case Listener::CLICK: if (control == _reset) { // Re-load the current emitter and reset the view _particleEmitter = ParticleEmitter::create(_url.c_str()); emitterChanged(); } else if (control == _emit) { // Emit a burst of particles. unsigned int burstSize = (unsigned int)_burstSize->getValue(); emitter->emitOnce(burstSize); } else if (id == "sprite") { updateTexture(); } else if (id == "updateFrames") { updateFrames(); } break; case Listener::PRESS: if (control == _zoomIn) { _wDown = true; } else if (control == _zoomOut) { _sDown = true; } break; case Listener::RELEASE: if (control == _zoomIn) { _wDown = false; } else if (control == _zoomOut) { _sDown = false; } else if (control == _save) { Game::getInstance()->pause(); saveFile(); Game::getInstance()->resume(); } else if (control == _load) { Game::getInstance()->pause(); std::string filename = FileSystem::displayFileDialog(FileSystem::OPEN, "Select Particle File", "Particle Files", "particle", "res"); if (filename.length() > 0) { _url = filename; _particleEmitter = ParticleEmitter::create(_url.c_str()); emitterChanged(); } Game::getInstance()->resume(); } break; } }
void ParticlesGame::emitterChanged() { ParticleEmitter* emitter = _particleEmitter; // Set the new emitter on the node. _particleEmitterNode->setParticleEmitter(_particleEmitter); _particleEmitter->release(); // Reset camera view and zoom. _scene->getActiveCamera()->getNode()->setTranslation(0.0f, 0.0f, 40.0f); _cameraParent->setIdentity(); _particleEmitterNode->setIdentity(); // Parse editor section of particle properties Properties* p = Properties::create(_url.c_str()); Properties* ns = p->getNamespace("editor", true); if (ns) { Vector3 v3; if (ns->getVector3("cameraTranslation", &v3)) { _cameraParent->setTranslation(v3); } if (ns->getVector3("cameraZoom", &v3)) { _scene->getActiveCamera()->getNode()->setTranslation(v3); } Quaternion q; if (ns->getQuaternionFromAxisAngle("cameraRotation", &q)) { _cameraParent->setRotation(q); } float f; if ((f = ns->getFloat("sizeMax")) != 0.0f) { _startMin->setMax(f); _startMax->setMax(f); _endMin->setMax(f); _endMax->setMax(f); } if ((f = ns->getFloat("energyMax")) != 0.0f) { _energyMin->setMax(f); _energyMax->setMax(f); } } SAFE_DELETE(p); // Set the values of UI controls to display the new emitter's settings. _startRed->setValue(emitter->getColorStart().x); _startGreen->setValue(emitter->getColorStart().y); _startBlue->setValue(emitter->getColorStart().z); _startAlpha->setValue(emitter->getColorStart().w); _endRed->setValue(emitter->getColorEnd().x); _endGreen->setValue(emitter->getColorEnd().y); _endBlue->setValue(emitter->getColorEnd().z); _endAlpha->setValue(emitter->getColorEnd().w); _startMin->setValue(emitter->getSizeStartMin()); _startMax->setValue(emitter->getSizeStartMax()); _endMin->setValue(emitter->getSizeEndMin()); _endMax->setValue(emitter->getSizeEndMax()); _energyMin->setValue(emitter->getEnergyMin()); _energyMax->setValue(emitter->getEnergyMax()); _emissionRate->setValue(emitter->getEmissionRate()); const Vector3& posVar = emitter->getPositionVariance(); _posVarX->setValue(posVar.x); _posVarY->setValue(posVar.y); _posVarZ->setValue(posVar.z); const Vector3& vel = emitter->getVelocity(); _velX->setValue(vel.x); _velY->setValue(vel.y); _velZ->setValue(vel.z); const Vector3& velVar = emitter->getVelocityVariance(); _velVarX->setValue(velVar.x); _velVarY->setValue(velVar.y); _velVarZ->setValue(velVar.z); const Vector3& accel = emitter->getAcceleration(); _accelX->setValue(accel.x); _accelY->setValue(accel.y); _accelZ->setValue(accel.z); const Vector3& accelVar = emitter->getAccelerationVariance(); _accelVarX->setValue(accelVar.x); _accelVarY->setValue(accelVar.y); _accelVarZ->setValue(accelVar.z); _spinSpeedMin->setValue(emitter->getRotationPerParticleSpeedMin()); _spinSpeedMax->setValue(emitter->getRotationPerParticleSpeedMax()); const Vector3& axis = emitter->getRotationAxis(); _axisX->setValue(axis.x); _axisY->setValue(axis.y); _axisZ->setValue(axis.z); const Vector3& axisVar = emitter->getRotationAxisVariance(); _axisVarX->setValue(axisVar.x); _axisVarY->setValue(axisVar.y); _axisVarZ->setValue(axisVar.z); _rotationSpeedMin->setValue(emitter->getRotationSpeedMin()); _rotationSpeedMax->setValue(emitter->getRotationSpeedMax()); // Update our image control updateImageControl(); // Start the emitter emitter->start(); }