////////////////////////////////////////////////////////////////////////////////// // SPARK particle engine // // Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // // // // This software is provided 'as-is', without any express or implied // // warranty. In no event will the authors be held liable for any damages // // arising from the use of this software. // // // // Permission is granted to anyone to use this software for any purpose, // // including commercial applications, and to alter it and redistribute it // // freely, subject to the following restrictions: // // // // 1. The origin of this software must not be misrepresented; you must not // // claim that you wrote the original software. If you use this software // // in a product, an acknowledgment in the product documentation would be // // appreciated but is not required. // // 2. Altered source versions must be plainly marked as such, and must not be // // misrepresented as being the original software. // // 3. This notice may not be removed or altered from any source distribution. // ////////////////////////////////////////////////////////////////////////////////// #ifndef H_SPK_DEF #define H_SPK_DEF #include #include #include #include #include #include #include #include #include #include #include #include // 1.02.02 Compatibility with older versions #ifdef SPK_DLL #define SPK_CORE_IMPORT #endif #ifdef SPK_CORE_EXPORT #define SPK_PREFIX __declspec(dllexport) #elif defined(SPK_IMPORT) || defined(SPK_CORE_IMPORT) #define SPK_PREFIX __declspec(dllimport) #else #define SPK_PREFIX #endif #ifdef _MSC_VER #pragma warning(disable : 4251) // disables the warning about exporting STL classes in DLLs #endif // Trace for debugging //#define SPK_DEBUG #ifdef SPK_DEBUG #define SPK_TRACE(text) std::cout << text << std::endl; #else #define SPK_TRACE(text) #endif /** * @mainpage SPARK Particle Engine * * SPARK is an open source library allowing to easily implement full particle systems in C++ applications.
*
* SPARK has been designed to be : *
    *
  • user friendly and easy to implement
  • *
  • very configurable and as complete as possible
  • *
  • evolving and upgradable by users
  • *
  • portable and library free (it only uses the standard library)
  • *
*
* @section intro_sec Global Description * in SPARK, a SPK::System is a collection of Groups of Particles. * A SPK::Group contains a SPK::Pool of Particles and defines an complete universe for Particle evolution. * This universe holds 3 types of physical objects : *
    *
  • the Emitters : an SPK::Emitter is an object that generates Particles
  • *
  • the Modifiers : a SPK::Modifier is an object that will modify Particles behavior
  • *
  • the Particles themselves : a SPK::Particle is a point that will follow physical laws and will be given some parameters that will evolve from their birth to their death.
  • *
* Those parameters are defined by a SPK::Model of Particles.
* The Emitters and Modifiers are physical entities whose body is represented by a SPK::Zone.
* A SPK::Vector3D is the primitive object used in SPARK to represents triplets of coordinates in a universe 3D.
*
* Finally a system/groups can be renderered using a SPK::Renderer. */ /** * @namespace SPK * @brief the namespace for the whole SPARK library */ namespace SPK { /** @brief the random seed for the pseudo random numbers generation (1 by default) */ extern SPK_PREFIX unsigned int randomSeed; /** * @brief Returns a random number in the range [min,max[ * * Note that the sequence of pseudo random number generated depends on the initial seed which can be set by setting randomSeed.
* * @param min : the minimum value * @param max : the maximum value * * @return a random number within [min,max[ */ template T random(T min,T max) { // optimized standard minimal long tmp0 = 16807L * (randomSeed & 0xFFFFL); long tmp1 = 16807L * (randomSeed >> 16); long tmp2 = (tmp0 >> 16) + tmp1; tmp0 = ((tmp0 & 0xFFFF)|((tmp2 & 0x7FFF) << 16)) + (tmp2 >> 15); // correction of the error if ((tmp0 & 0x80000000L) != 0) tmp0 = (tmp0 + 1) & 0x7FFFFFFFL; randomSeed = tmp0; // find a random number in the interval return static_cast(min + ((randomSeed - 1) / 2147483646.0) * (max - min)); } ///////////////////////// // global enumerations // ///////////////////////// /** * @enum ModelParam * @brief Constants for the Model parameters */ enum ModelParam { PARAM_RED = 0, /**< The red component of the Particle */ PARAM_GREEN = 1, /**< The green component of the Particle */ PARAM_BLUE = 2, /**< The blue component of the Particle */ PARAM_ALPHA = 3, /**< The alpha component of the Particle */ PARAM_SIZE = 4, /**< The size of the Particle */ PARAM_MASS = 5, /**< The mass of the Particle */ PARAM_ANGLE = 6, /**< The angle of the texture of the Particle */ PARAM_TEXTURE_INDEX = 7, /**< the index of texture of the Particle */ PARAM_ROTATION_SPEED = 8, /**< the rotation speed of the particle (must be used with a rotator modifier) */ PARAM_CUSTOM_0 = 9, /**< Reserved for a user custom parameter. This is not used by SPARK */ PARAM_CUSTOM_1 = 10, /**< Reserved for a user custom parameter. This is not used by SPARK */ PARAM_CUSTOM_2 = 11, /**< Reserved for a user custom parameter. This is not used by SPARK */ }; } #endif