/xbmc/screensavers/rsxs-0.9/src/skyrocket/meteor.cc
http://github.com/xbmc/xbmc · C++ · 91 lines · 58 code · 11 blank · 22 comment · 5 complexity · a7a00cc8715d16ca41ef9f342046f125 MD5 · raw file
- /*
- * Really Slick XScreenSavers
- * Copyright (C) 2002-2006 Michael Chapman
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- *****************************************************************************
- *
- * This is a Linux port of the Really Slick Screensavers,
- * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com
- */
- #include <common.hh>
- #include <meteor.hh>
- #include <resources.hh>
- #include <skyrocket.hh>
- #include <star.hh>
- #include <vector.hh>
- void Meteor::update() {
- _remaining -= Common::elapsedTime;
- if (_remaining <= 0.0f || _pos.y() <= 0.0f) {
- _depth = DEAD_DEPTH;
- ++Hack::numDead;
- return;
- }
- _vel.y() -= Common::elapsedTime * 32.0f;
- _pos += _vel * Common::elapsedTime;
- _pos.x() +=
- (0.1f - 0.00175f * _pos.y() + 0.0000011f * _pos.y() * _pos.y()) *
- Hack::wind * Common::elapsedTime;
- float temp = (_lifetime - _remaining) / _lifetime;
- _brightness = 1.0f - temp * temp * temp * temp;
- Vector step(_pos - _sparkPos);
- float distance = step.normalize();
- if (distance > 10.0f) {
- unsigned int n = (unsigned int)(distance / 10.0f);
- step *= 10.0f;
- for (unsigned int i = 0; i < n; ++i) {
- Hack::pending.push_back(new Star(_sparkPos,
- _vel + Vector(
- Common::randomFloat(40.0f) - 20.0f,
- Common::randomFloat(40.0f) - 20.0f,
- Common::randomFloat(40.0f) - 20.0f
- ), 2.0f, Common::randomFloat(0.5f) + 1.5f, _RGB, 10.0f
- ));
- _sparkPos += step;
- }
- }
- Vector diff(Hack::cameraPos - _pos);
- _depth = diff.x() * Hack::cameraMat.get(8) +
- diff.y() * Hack::cameraMat.get(9) +
- diff.z() * Hack::cameraMat.get(10);
- }
- void Meteor::updateCameraOnly() {
- Vector diff(Hack::cameraPos - _pos);
- _depth = diff.x() * Hack::cameraMat.get(8) +
- diff.y() * Hack::cameraMat.get(9) +
- diff.z() * Hack::cameraMat.get(10);
- }
- void Meteor::draw() const {
- if (_depth < 0.0f)
- return;
- glPushMatrix();
- glTranslatef(_pos.x(), _pos.y(), _pos.z());
- glScalef(_size, _size, _size);
- glMultMatrixf(Hack::cameraMat.get());
- glColor4f(_RGB.r(), _RGB.g(), _RGB.b(), _brightness);
- glCallList(Resources::DisplayLists::flares);
- glPopMatrix();
- }