/* * Copyright (c) 2013 Google, Inc. * * 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. */ #include #include #define B2PARTICLECOLOR_BITS_PER_COMPONENT (sizeof(uint8) << 3) // Maximum value of a b2ParticleColor component. #define B2PARTICLECOLOR_MAX_VALUE \ ((1U << B2PARTICLECOLOR_BITS_PER_COMPONENT) - 1) /// Number of bits used to store each b2ParticleColor component. const uint8 b2ParticleColor::k_bitsPerComponent = B2PARTICLECOLOR_BITS_PER_COMPONENT; const float32 b2ParticleColor::k_maxValue = (float)B2PARTICLECOLOR_MAX_VALUE; const float32 b2ParticleColor::k_inverseMaxValue = 1.0f / (float)B2PARTICLECOLOR_MAX_VALUE; b2ParticleColor b2ParticleColor_zero(0, 0, 0, 0); b2ParticleColor::b2ParticleColor(const b2Color& color) { Set(color); } b2Color b2ParticleColor::GetColor() const { return b2Color(k_inverseMaxValue * r, k_inverseMaxValue * g, k_inverseMaxValue * b); } void b2ParticleColor::Set(const b2Color& color) { Set((uint8)(k_maxValue * color.r), (uint8)(k_maxValue * color.g), (uint8)(k_maxValue * color.b), B2PARTICLECOLOR_MAX_VALUE); } int32 b2CalculateParticleIterations( float32 gravity, float32 radius, float32 timeStep) { // In some situations you may want more particle iterations than this, // but to avoid excessive cycle cost, don't recommend more than this. const int32 B2_MAX_RECOMMENDED_PARTICLE_ITERATIONS = 8; const float32 B2_RADIUS_THRESHOLD = 0.01f; int32 iterations = (int32) ceilf(b2Sqrt(gravity / (B2_RADIUS_THRESHOLD * radius)) * timeStep); return b2Clamp(iterations, 1, B2_MAX_RECOMMENDED_PARTICLE_ITERATIONS); }