mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-10-31 22:26:41 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			337 lines
		
	
	
	
		
			7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			337 lines
		
	
	
	
		
			7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
|   OpenMW - The completely unofficial reimplementation of Morrowind
 | |
|   Copyright (C) 2008-2010  Nicolay Korslund
 | |
|   Email: < korslund@gmail.com >
 | |
|   WWW: http://openmw.sourceforge.net/
 | |
| 
 | |
|   This file (controller.h) is part of the OpenMW package.
 | |
| 
 | |
|   OpenMW is distributed as free software: you can redistribute it
 | |
|   and/or modify it under the terms of the GNU General Public License
 | |
|   version 3, 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
 | |
|   version 3 along with this program. If not, see
 | |
|   http://www.gnu.org/licenses/ .
 | |
| 
 | |
|  */
 | |
| 
 | |
| #ifndef OPENMW_COMPONENTS_NIF_CONTROLLER_HPP
 | |
| #define OPENMW_COMPONENTS_NIF_CONTROLLER_HPP
 | |
| 
 | |
| #include "record.hpp"
 | |
| #include "niffile.hpp"
 | |
| #include "recordptr.hpp"
 | |
| 
 | |
| namespace Nif
 | |
| {
 | |
| 
 | |
| class Controller : public Record
 | |
| {
 | |
| public:
 | |
|     ControllerPtr next;
 | |
|     int flags;
 | |
|     float frequency, phase;
 | |
|     float timeStart, timeStop;
 | |
|     ControlledPtr target;
 | |
| 
 | |
|     void read(NIFStream *nif)
 | |
|     {
 | |
|         next.read(nif);
 | |
| 
 | |
|         flags = nif->getUShort();
 | |
| 
 | |
|         frequency = nif->getFloat();
 | |
|         phase = nif->getFloat();
 | |
|         timeStart = nif->getFloat();
 | |
|         timeStop = nif->getFloat();
 | |
| 
 | |
|         target.read(nif);
 | |
|     }
 | |
| 
 | |
|     void post(NIFFile *nif)
 | |
|     {
 | |
|         Record::post(nif);
 | |
|         next.post(nif);
 | |
|         target.post(nif);
 | |
|     }
 | |
| };
 | |
| 
 | |
| class NiParticleSystemController : public Controller
 | |
| {
 | |
| public:
 | |
|     struct Particle {
 | |
|         Ogre::Vector3 velocity;
 | |
|         float lifetime;
 | |
|         float lifespan;
 | |
|         float timestamp;
 | |
|         int vertex;
 | |
|     };
 | |
| 
 | |
|     float velocity;
 | |
|     float velocityRandom;
 | |
| 
 | |
|     float verticalDir; // 0=up, pi/2=horizontal, pi=down
 | |
|     float verticalAngle;
 | |
|     float horizontalDir;
 | |
|     float horizontalAngle;
 | |
| 
 | |
|     float size;
 | |
|     float startTime;
 | |
|     float stopTime;
 | |
| 
 | |
|     float emitRate;
 | |
|     float lifetime;
 | |
|     float lifetimeRandom;
 | |
| 
 | |
|     enum EmitFlags
 | |
|     {
 | |
|         NoAutoAdjust = 0x1 // If this flag is set, we use the emitRate value. Otherwise,
 | |
|                            // we calculate an emit rate so that the maximum number of particles
 | |
|                            // in the system (numParticles) is never exceeded.
 | |
|     };
 | |
|     int emitFlags;
 | |
| 
 | |
|     Ogre::Vector3 offsetRandom;
 | |
| 
 | |
|     NodePtr emitter;
 | |
| 
 | |
|     int numParticles;
 | |
|     int activeCount;
 | |
|     std::vector<Particle> particles;
 | |
| 
 | |
|     ExtraPtr extra;
 | |
| 
 | |
|     void read(NIFStream *nif)
 | |
|     {
 | |
|         Controller::read(nif);
 | |
| 
 | |
|         velocity = nif->getFloat();
 | |
|         velocityRandom = nif->getFloat();
 | |
|         verticalDir = nif->getFloat();
 | |
|         verticalAngle = nif->getFloat();
 | |
|         horizontalDir = nif->getFloat();
 | |
|         horizontalAngle = nif->getFloat();
 | |
|         /*normal?*/ nif->getVector3();
 | |
|         /*color?*/ nif->getVector4();
 | |
|         size = nif->getFloat();
 | |
|         startTime = nif->getFloat();
 | |
|         stopTime = nif->getFloat();
 | |
|         nif->getChar();
 | |
|         emitRate = nif->getFloat();
 | |
|         lifetime = nif->getFloat();
 | |
|         lifetimeRandom = nif->getFloat();
 | |
| 
 | |
|         emitFlags = nif->getUShort();
 | |
|         offsetRandom = nif->getVector3();
 | |
| 
 | |
|         emitter.read(nif);
 | |
| 
 | |
|         /* Unknown Short, 0?
 | |
|          * Unknown Float, 1.0?
 | |
|          * Unknown Int, 1?
 | |
|          * Unknown Int, 0?
 | |
|          * Unknown Short, 0?
 | |
|          */
 | |
|         nif->skip(16);
 | |
| 
 | |
|         numParticles = nif->getUShort();
 | |
|         activeCount = nif->getUShort();
 | |
| 
 | |
|         particles.resize(numParticles);
 | |
|         for(size_t i = 0;i < particles.size();i++)
 | |
|         {
 | |
|             particles[i].velocity = nif->getVector3();
 | |
|             nif->getVector3(); /* unknown */
 | |
|             particles[i].lifetime = nif->getFloat();
 | |
|             particles[i].lifespan = nif->getFloat();
 | |
|             particles[i].timestamp = nif->getFloat();
 | |
|             nif->getUShort(); /* unknown */
 | |
|             particles[i].vertex = nif->getUShort();
 | |
|         }
 | |
| 
 | |
|         nif->getUInt(); /* -1? */
 | |
|         extra.read(nif);
 | |
|         nif->getUInt(); /* -1? */
 | |
|         nif->getChar();
 | |
|     }
 | |
| 
 | |
|     void post(NIFFile *nif)
 | |
|     {
 | |
|         Controller::post(nif);
 | |
|         emitter.post(nif);
 | |
|         extra.post(nif);
 | |
|     }
 | |
| };
 | |
| typedef NiParticleSystemController NiBSPArrayController;
 | |
| 
 | |
| class NiMaterialColorController : public Controller
 | |
| {
 | |
| public:
 | |
|     NiPosDataPtr data;
 | |
| 
 | |
|     void read(NIFStream *nif)
 | |
|     {
 | |
|         Controller::read(nif);
 | |
|         data.read(nif);
 | |
|     }
 | |
| 
 | |
|     void post(NIFFile *nif)
 | |
|     {
 | |
|         Controller::post(nif);
 | |
|         data.post(nif);
 | |
|     }
 | |
| };
 | |
| 
 | |
| class NiPathController : public Controller
 | |
| {
 | |
| public:
 | |
|     NiPosDataPtr posData;
 | |
|     NiFloatDataPtr floatData;
 | |
| 
 | |
|     void read(NIFStream *nif)
 | |
|     {
 | |
|         Controller::read(nif);
 | |
| 
 | |
|         /*
 | |
|            int = 1
 | |
|            2xfloat
 | |
|            short = 0 or 1
 | |
|         */
 | |
|         nif->skip(14);
 | |
|         posData.read(nif);
 | |
|         floatData.read(nif);
 | |
|     }
 | |
| 
 | |
|     void post(NIFFile *nif)
 | |
|     {
 | |
|         Controller::post(nif);
 | |
| 
 | |
|         posData.post(nif);
 | |
|         floatData.post(nif);
 | |
|     }
 | |
| };
 | |
| 
 | |
| class NiUVController : public Controller
 | |
| {
 | |
| public:
 | |
|     NiUVDataPtr data;
 | |
| 
 | |
|     void read(NIFStream *nif)
 | |
|     {
 | |
|         Controller::read(nif);
 | |
| 
 | |
|         nif->getUShort(); // always 0
 | |
|         data.read(nif);
 | |
|     }
 | |
| 
 | |
|     void post(NIFFile *nif)
 | |
|     {
 | |
|         Controller::post(nif);
 | |
|         data.post(nif);
 | |
|     }
 | |
| };
 | |
| 
 | |
| class NiKeyframeController : public Controller
 | |
| {
 | |
| public:
 | |
|     NiKeyframeDataPtr data;
 | |
| 
 | |
|     void read(NIFStream *nif)
 | |
|     {
 | |
|         Controller::read(nif);
 | |
|         data.read(nif);
 | |
|     }
 | |
| 
 | |
|     void post(NIFFile *nif)
 | |
|     {
 | |
|         Controller::post(nif);
 | |
|         data.post(nif);
 | |
|     }
 | |
| };
 | |
| 
 | |
| class NiAlphaController : public Controller
 | |
| {
 | |
| public:
 | |
|     NiFloatDataPtr data;
 | |
| 
 | |
|     void read(NIFStream *nif)
 | |
|     {
 | |
|         Controller::read(nif);
 | |
|         data.read(nif);
 | |
|     }
 | |
| 
 | |
|     void post(NIFFile *nif)
 | |
|     {
 | |
|         Controller::post(nif);
 | |
|         data.post(nif);
 | |
|     }
 | |
| };
 | |
| 
 | |
| class NiGeomMorpherController : public Controller
 | |
| {
 | |
| public:
 | |
|     NiMorphDataPtr data;
 | |
| 
 | |
|     void read(NIFStream *nif)
 | |
|     {
 | |
|         Controller::read(nif);
 | |
|         data.read(nif);
 | |
|         nif->getChar(); // always 0
 | |
|     }
 | |
| 
 | |
|     void post(NIFFile *nif)
 | |
|     {
 | |
|         Controller::post(nif);
 | |
|         data.post(nif);
 | |
|     }
 | |
| };
 | |
| 
 | |
| class NiVisController : public Controller
 | |
| {
 | |
| public:
 | |
|     NiVisDataPtr data;
 | |
| 
 | |
|     void read(NIFStream *nif)
 | |
|     {
 | |
|         Controller::read(nif);
 | |
|         data.read(nif);
 | |
|     }
 | |
| 
 | |
|     void post(NIFFile *nif)
 | |
|     {
 | |
|         Controller::post(nif);
 | |
|         data.post(nif);
 | |
|     }
 | |
| };
 | |
| 
 | |
| class NiFlipController : public Controller
 | |
| {
 | |
| public:
 | |
|     int mTexSlot; // NiTexturingProperty::TextureType
 | |
|     float mDelta; // Time between two flips. delta = (start_time - stop_time) / num_sources
 | |
|     NiSourceTextureList mSources;
 | |
| 
 | |
|     void read(NIFStream *nif)
 | |
|     {
 | |
|         Controller::read(nif);
 | |
|         mTexSlot = nif->getUInt();
 | |
|         /*unknown=*/nif->getUInt();/*0?*/
 | |
|         mDelta = nif->getFloat();
 | |
|         mSources.read(nif);
 | |
|     }
 | |
| 
 | |
|     void post(NIFFile *nif)
 | |
|     {
 | |
|         Controller::post(nif);
 | |
|         mSources.post(nif);
 | |
|     }
 | |
| };
 | |
| 
 | |
| } // Namespace
 | |
| #endif
 |