ParticleEffect* NS_CUSTOM::ParticleEffect::createFromCache(const string name) { auto p = particleCache.at(name); if (p == nullptr){ auto tmp = ParticleEffect::create(); tmp->loadEmitters(name); tmp->loadEmitterImages(getPathForFilename(name)); particleCache.insert(name, tmp); return tmp; } else{ auto tmp = ParticleEffect::create(); tmp->init(p); return tmp; } }
void ParticlesGame::initialize() { // Display the gameplay splash screen displayScreen(this, &ParticlesGame::drawSplash, NULL, 250L); setMultiTouch(true); // Set keyboard state. _wDown = _aDown = _sDown = _dDown = false; _touched = false; _prevX = _prevY = 0; // Create a scene with a camera node. // The camera node is a child of a node at the same location as the particle emitter. // The camera node is offset from its parent, looking straight at it. // That way, when we rotate the parent node, the camera stays aimed at the particle emitter. _scene = Scene::create(); Node* cameraNode = _scene->addNode("Camera"); _cameraParent = _scene->addNode("CameraParent"); _cameraParent->addChild(cameraNode); Camera* camera = Camera::createPerspective(45.0f, (float)getWidth() / (float)getHeight(), 0.25f, 1000.0f); cameraNode->setCamera(camera); cameraNode->setTranslation(0.0f, 0.0f, ZOOM_DEFAULT); _scene->setActiveCamera(camera); SAFE_RELEASE(camera); addGrid(61); // Create a font for drawing the framerate. _font = Font::create("res/ui/arial.gpb"); // Load the form for editing ParticleEmitters. _form = Form::create("res/editor.form"); _form->setConsumeInputEvents(false); //_form->setState(Control::FOCUS); // Store pointers to UI controls we care about. _startRed = (Slider*)_form->getControl("startRed"); _startGreen = (Slider*)_form->getControl("startGreen"); _startBlue = (Slider*)_form->getControl("startBlue"); _startAlpha = (Slider*)_form->getControl("startAlpha"); _endRed = (Slider*)_form->getControl("endRed"); _endGreen = (Slider*)_form->getControl("endGreen"); _endBlue = (Slider*)_form->getControl("endBlue"); _endAlpha = (Slider*)_form->getControl("endAlpha"); _particleProperties = (Container*)_form->getControl("particleProperties"); _startMin = (Slider*)_form->getControl("startMin"); _startMax = (Slider*)_form->getControl("startMax"); _endMin = (Slider*)_form->getControl("endMin"); _endMax = (Slider*)_form->getControl("endMax"); _energyMin = (Slider*)_form->getControl("energyMin"); _energyMax = (Slider*)_form->getControl("energyMax"); _emissionRate = (Slider*)_form->getControl("emissionRate"); _started = (CheckBox*)_form->getControl("started"); _reset = (Button*)_form->getControl("reset"); _emit = (Button*)_form->getControl("emit"); _zoomIn = (Button*)_form->getControl("zoomIn"); _zoomOut = (Button*)_form->getControl("zoomOut"); _save = (Button*)_form->getControl("save"); _load = (Button*)_form->getControl("load"); _burstSize = (Slider*)_form->getControl("burstSize"); _posVarX = (Slider*)_form->getControl("posVarX"); _posVarY = (Slider*)_form->getControl("posVarY"); _posVarZ = (Slider*)_form->getControl("posVarZ"); _velX = (Slider*)_form->getControl("velocityX"); _velY = (Slider*)_form->getControl("velocityY"); _velZ = (Slider*)_form->getControl("velocityZ"); _velVarX = (Slider*)_form->getControl("velocityVarX"); _velVarY = (Slider*)_form->getControl("velocityVarY"); _velVarZ = (Slider*)_form->getControl("velocityVarZ"); _accelX = (Slider*)_form->getControl("accelX"); _accelY = (Slider*)_form->getControl("accelY"); _accelZ = (Slider*)_form->getControl("accelZ"); _accelVarX = (Slider*)_form->getControl("accelVarX"); _accelVarY = (Slider*)_form->getControl("accelVarY"); _accelVarZ = (Slider*)_form->getControl("accelVarZ"); _spinSpeedMin = (Slider*)_form->getControl("spinSpeedMin"); _spinSpeedMax = (Slider*)_form->getControl("spinSpeedMax"); _axisX = (Slider*)_form->getControl("axisX"); _axisY = (Slider*)_form->getControl("axisY"); _axisZ = (Slider*)_form->getControl("axisZ"); _axisVarX = (Slider*)_form->getControl("axisVarX"); _axisVarY = (Slider*)_form->getControl("axisVarY"); _axisVarZ = (Slider*)_form->getControl("axisVarZ"); _rotationSpeedMin = (Slider*)_form->getControl("rotationSpeedMin"); _rotationSpeedMax = (Slider*)_form->getControl("rotationSpeedMax"); _vsync = (CheckBox*)_form->getControl("vsync"); // Listen for UI events. _startRed->addListener(this, Listener::VALUE_CHANGED); _startGreen->addListener(this, Listener::VALUE_CHANGED); _startBlue->addListener(this, Listener::VALUE_CHANGED); _startAlpha->addListener(this, Listener::VALUE_CHANGED); _endRed->addListener(this, Listener::VALUE_CHANGED); _endGreen->addListener(this, Listener::VALUE_CHANGED); _endBlue->addListener(this, Listener::VALUE_CHANGED); _endAlpha->addListener(this, Listener::VALUE_CHANGED); _startMin->addListener(this, Listener::VALUE_CHANGED); _startMax->addListener(this, Listener::VALUE_CHANGED); _endMin->addListener(this, Listener::VALUE_CHANGED); _endMax->addListener(this, Listener::VALUE_CHANGED); _energyMin->addListener(this, Listener::VALUE_CHANGED); _energyMax->addListener(this, Listener::VALUE_CHANGED); _emissionRate->addListener(this, Listener::VALUE_CHANGED); _started->addListener(this, Listener::VALUE_CHANGED); _reset->addListener(this, Listener::CLICK); _emit->addListener(this, Listener::CLICK); _zoomIn->addListener(this, Listener::PRESS); _zoomIn->addListener(this, Listener::RELEASE); _zoomOut->addListener(this, Listener::PRESS); _zoomOut->addListener(this, Listener::RELEASE); _save->addListener(this, Listener::RELEASE); _load->addListener(this, Listener::RELEASE); _burstSize->addListener(this, Listener::VALUE_CHANGED); _form->getControl("posX")->addListener(this, Listener::VALUE_CHANGED); _form->getControl("posY")->addListener(this, Listener::VALUE_CHANGED); _form->getControl("posZ")->addListener(this, Listener::VALUE_CHANGED); _posVarX->addListener(this, Listener::VALUE_CHANGED); _posVarY->addListener(this, Listener::VALUE_CHANGED); _posVarZ->addListener(this, Listener::VALUE_CHANGED); _velX->addListener(this, Listener::VALUE_CHANGED); _velY->addListener(this, Listener::VALUE_CHANGED); _velZ->addListener(this, Listener::VALUE_CHANGED); _velVarX->addListener(this, Listener::VALUE_CHANGED); _velVarY->addListener(this, Listener::VALUE_CHANGED); _velVarZ->addListener(this, Listener::VALUE_CHANGED); _accelX->addListener(this, Listener::VALUE_CHANGED); _accelY->addListener(this, Listener::VALUE_CHANGED); _accelZ->addListener(this, Listener::VALUE_CHANGED); _accelVarX->addListener(this, Listener::VALUE_CHANGED); _accelVarY->addListener(this, Listener::VALUE_CHANGED); _accelVarZ->addListener(this, Listener::VALUE_CHANGED); _spinSpeedMin->addListener(this, Listener::VALUE_CHANGED); _spinSpeedMax->addListener(this, Listener::VALUE_CHANGED); _axisX->addListener(this, Listener::VALUE_CHANGED); _axisY->addListener(this, Listener::VALUE_CHANGED); _axisZ->addListener(this, Listener::VALUE_CHANGED); _axisVarX->addListener(this, Listener::VALUE_CHANGED); _axisVarY->addListener(this, Listener::VALUE_CHANGED); _axisVarZ->addListener(this, Listener::VALUE_CHANGED); _rotationSpeedMin->addListener(this, Listener::VALUE_CHANGED); _rotationSpeedMax->addListener(this, Listener::VALUE_CHANGED); _vsync->addListener(this, Listener::VALUE_CHANGED); _form->getControl("sprite")->addListener(this, Listener::CLICK); _form->getControl("additive")->addListener(this, Listener::VALUE_CHANGED); _form->getControl("transparent")->addListener(this, Listener::VALUE_CHANGED); _form->getControl("multiply")->addListener(this, Listener::VALUE_CHANGED); _form->getControl("opaque")->addListener(this, Listener::VALUE_CHANGED); _form->getControl("updateFrames")->addListener(this, Listener::CLICK); // Load preset emitters. loadEmitters(); updateImageControl(); }
static void wizardPreparePaintScreen (CompScreen *s, int time) { WIZARD_SCREEN (s); WIZARD_DISPLAY (s->display); if (ws->active && !ws->pollHandle) { (*wd->mpFunc->getCurrentPosition) (s, &ws->mx, &ws->my); ws->pollHandle = (*wd->mpFunc->addPositionPolling) (s, positionUpdate); } if (ws->active && !ws->ps) { ws->ps = calloc(1, sizeof (ParticleSystem)); if (!ws->ps) { UNWRAP (ws, s, preparePaintScreen); (*s->preparePaintScreen) (s, time); WRAP (ws, s, preparePaintScreen, wizardPreparePaintScreen); return; } loadGPoints (s, ws->ps); loadEmitters (s, ws->ps); initParticles (wizardGetHardLimit (s), wizardGetSoftLimit (s), ws->ps); ws->ps->darken = wizardGetDarken (s); ws->ps->blendMode = (wizardGetBlend (s)) ? GL_ONE : GL_ONE_MINUS_SRC_ALPHA; ws->ps->tnew = wizardGetTnew (s); ws->ps->told = wizardGetTold (s); ws->ps->gx = wizardGetGx (s); ws->ps->gy = wizardGetGy (s); glGenTextures (1, &ws->ps->tex); glBindTexture (GL_TEXTURE_2D, ws->ps->tex); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, 128, 128, 0, GL_RGBA, GL_UNSIGNED_BYTE, particleTex); glBindTexture (GL_TEXTURE_2D, 0); } if (ws->ps && ws->active && ws->ps->e) { Emitter *ei = ws->ps->e; GPoint *gi = ws->ps->g; int i; for (i = 0; i < ws->ps->ng; i++, gi++) { if (gi->movement==MOVEMENT_BOUNCE || gi->movement==MOVEMENT_WRAP) { gi->x += gi->espeed * cos (gi->eangle) * time; gi->y += gi->espeed * sin (gi->eangle) * time; if (gi->x >= s->width) { if (gi->movement==MOVEMENT_BOUNCE) { gi->x = 2*s->width - gi->x - 1; gi->eangle = M_PI - gi->eangle; } else if (gi->movement==MOVEMENT_WRAP) gi->x -= s->width; } else if (gi->x < 0) { if (gi->movement==MOVEMENT_BOUNCE) { gi->x *= -1; gi->eangle = M_PI - gi->eangle; } else if (gi->movement==MOVEMENT_WRAP) gi->x += s->width; } if (gi->y >= s->height) { if (gi->movement==MOVEMENT_BOUNCE) { gi->y = 2*s->height - gi->y - 1; gi->eangle *= -1; } else if (gi->movement==MOVEMENT_WRAP) gi->y -= s->height; } else if (gi->y < 0) { if (gi->movement==MOVEMENT_BOUNCE) { gi->y *= -1; gi->eangle *= -1; } else if (gi->movement==MOVEMENT_WRAP) gi->y += s->height; } } if (gi->movement==MOVEMENT_FOLLOWMOUSE && (ws->my!=gi->y||ws->mx!=gi->x)) { gi->eangle = atan2(ws->my-gi->y, ws->mx-gi->x); gi->x += gi->espeed * cos(gi->eangle) * time; gi->y += gi->espeed * sin(gi->eangle) * time; } } for (i = 0; i < ws->ps->ne; i++, ei++) { if (ei->movement==MOVEMENT_BOUNCE || ei->movement==MOVEMENT_WRAP) { ei->x += ei->espeed * cos (ei->eangle) * time; ei->y += ei->espeed * sin (ei->eangle) * time; if (ei->x >= s->width) { if (ei->movement==MOVEMENT_BOUNCE) { ei->x = 2*s->width - ei->x - 1; ei->eangle = M_PI - ei->eangle; } else if (ei->movement==MOVEMENT_WRAP) ei->x -= s->width; } else if (ei->x < 0) { if (ei->movement==MOVEMENT_BOUNCE) { ei->x *= -1; ei->eangle = M_PI - ei->eangle; } else if (ei->movement==MOVEMENT_WRAP) ei->x += s->width; } if (ei->y >= s->height) { if (ei->movement==MOVEMENT_BOUNCE) { ei->y = 2*s->height - ei->y - 1; ei->eangle *= -1; } else if (ei->movement==MOVEMENT_WRAP) ei->y -= s->height; } else if (ei->y < 0) { if (ei->movement==MOVEMENT_BOUNCE) { ei->y *= -1; ei->eangle *= -1; } else if (ei->movement==MOVEMENT_WRAP) ei->y += s->height; } } if (ei->movement==MOVEMENT_FOLLOWMOUSE && (ws->my!=ei->y||ws->mx!=ei->x)) { ei->eangle = atan2 (ws->my-ei->y, ws->mx-ei->x); ei->x += ei->espeed * cos (ei->eangle) * time; ei->y += ei->espeed * sin (ei->eangle) * time; } if (ei->trigger == TRIGGER_RANDOMPERIOD && ei->set_active && !((int)random ()&0xff)) ei->active = !ei->active; if (ei->active && ( (ei->trigger == TRIGGER_PERSISTENT) || (ei->trigger == TRIGGER_RANDOMSHOT && !((int)random()&0xff)) || (ei->trigger == TRIGGER_RANDOMPERIOD) )) genNewParticles (ws->ps, ei); } } if (ws->ps && ws->ps->active) { updateParticles (ws->ps, time); damageRegion (s); } UNWRAP (ws, s, preparePaintScreen); (*s->preparePaintScreen) (s, time); WRAP (ws, s, preparePaintScreen, wizardPreparePaintScreen); }