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::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); }