Bone() : m_vOffset(Vector3(0,0,0)), m_matOrient(Matrix33Identity()) {}
//----------------------------------------------------------------------------- // инициализация класса //----------------------------------------------------------------------------- CSpaceStars::CSpaceStars() { Age = 0.0f; TimeLastUpdate = -1.0f; // положение системы Location = VECTOR3D( 0.0f, 0.0f, 0.0f); Size = 0.003f; CreationSize = VECTOR3D(5.21f,5.21f,5.21f); Texture = vw_FindTextureByName("DATA/GFX/flare1.tga"); DeadZone = 5.2f; if (Setup.UseGLSL) { GLSL = vw_FindShaderByName("SpaceStars"); UniformLocations[0] = vw_GetUniformLocation(GLSL, "ParticleTexture"); UniformLocations[1] = vw_GetUniformLocation(GLSL, "ParticleAge"); } // начальные установки для мартиц поворотов Matrix33Identity(CurrentRotationMat); Matrix33Identity(OldInvRotationMat); // настройка массива Start = 0; End = 0; unsigned int ParticlesCreated = 10000 - 4000*Setup.VisualEffectsQuality; // пока не создадим все необходимые частицы while (ParticlesCreated > 0) { // создаем новую частицу CStar *NewParticle = 0; NewParticle = new CStar; if (NewParticle == 0) return; // считаем значение альфы NewParticle->Alpha = 0.5f + 0.5f * vw_Randf1; // убираем переполнение Clamp( NewParticle->Alpha, 0.0f, 1.0f ); // считаем дельту альфы NewParticle->AlphaDelta = (1.5f + 1.5f * vw_Randf1) / 3.0f; // выпускаем частицу возле места нахождения системы // в сфере VECTOR3D tmp; float minDist = CreationSize.x*CreationSize.x+CreationSize.y*CreationSize.y+CreationSize.z*CreationSize.z; // если зона больше чем радиус излучения - выключаем ее if (minDist <= DeadZone*DeadZone) DeadZone = 0.0f; // прибавляем к рандому, чтобы избежать вероятности появления всех трех нулей и деления на ноль в дальнейшем tmp.x = (vw_Randf0 + 0.00001f) * CreationSize.x; tmp.y = vw_Randf0 * CreationSize.y; tmp.z = vw_Randf0 * CreationSize.z; float ParticleDist = tmp.x*tmp.x + tmp.y*tmp.y + tmp.z*tmp.z; while (ParticleDist > minDist || ParticleDist < DeadZone*DeadZone) { if (ParticleDist > minDist) { // ум. радиус VECTOR3D tmp1 = tmp; tmp1.Normalize(); tmp1 = tmp1^(1/100.0f); tmp = tmp - tmp1; } if ( ParticleDist < DeadZone*DeadZone) { // ув. радиус VECTOR3D tmp1 = tmp; tmp1.Normalize(); tmp1 = tmp1^(1/100.0f); tmp = tmp + tmp1; if (tmp.x > 0.0f) {if (tmp.x > CreationSize.x) tmp.x = CreationSize.x;} else {if (tmp.x < -CreationSize.x) tmp.x = -CreationSize.x;} if (tmp.y > 0.0f) {if (tmp.y > CreationSize.y) tmp.y = CreationSize.y;} else {if (tmp.y < -CreationSize.y) tmp.y = -CreationSize.y;} if (tmp.z > 0.0f) {if (tmp.z > CreationSize.z) tmp.z = CreationSize.z;} else {if (tmp.z < -CreationSize.z) tmp.z = -CreationSize.z;} } ParticleDist = tmp.x*tmp.x + tmp.y*tmp.y + tmp.z*tmp.z; } Matrix33CalcPoint(&tmp, CurrentRotationMat); NewParticle->Location = Location + tmp; // подключаем частицу к системе Attach(NewParticle); // уменьшаем необходимое количество частиц ParticlesCreated--; } list = 0; tmpDATA = 0; VBO = 0; LastCameraAngleX = LastCameraAngleY = LastCameraAngleZ = 0.0f; }