File: SingleParticleEffect.cpp

package info (click to toggle)
freespace2 24.0.2%2Brepack-1
  • links: PTS, VCS
  • area: non-free
  • in suites: trixie
  • size: 43,188 kB
  • sloc: cpp: 583,107; ansic: 21,729; python: 1,174; sh: 464; makefile: 248; xml: 181
file content (82 lines) | stat: -rw-r--r-- 2,411 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include "particle/particle.h"
#include "particle/ParticleEffect.h"
#include "particle/ParticleSource.h"
#include "particle/effects/SingleParticleEffect.h"

#include "bmpman/bmpman.h"

/**
 * @defgroup particleEffects Particle Effects
 *
 * @ingroup particleSystems
 */

namespace particle {
namespace effects {
SingleParticleEffect::SingleParticleEffect(const SCP_string& name)
	: ParticleEffect(name) {}

bool SingleParticleEffect::processSource(ParticleSource* source) {
	if (!m_timing.continueProcessing(source)) {
		return false;
	}

	// This uses the internal features of the timing class for determining if and how many effects should be triggered
	// this frame
	util::EffectTiming::TimingState time_state;
	while (m_timing.shouldCreateEffect(source, time_state)) {
		particle_info info;

		source->getOrigin()->applyToParticleInfo(info);

		info.vel *= m_vel_inherit.next();

		m_particleProperties.createParticle(info);
	}

	// Continue processing this source
	return true;
}

void SingleParticleEffect::parseValues(bool nocreate) {
	m_particleProperties.parse(nocreate);

	if (optional_string("+Parent Velocity Factor:")) {
		m_vel_inherit = ::util::parseUniformRange<float>();
	}

	m_timing = util::EffectTiming::parseTiming();
}

void SingleParticleEffect::pageIn() {
	m_particleProperties.pageIn();
}

void SingleParticleEffect::initializeSource(ParticleSource& source) {
	m_timing.applyToSource(&source);
}

SingleParticleEffect* SingleParticleEffect::createInstance(int effectID, float minSize, float maxSize,
														   float lifetime) {
	Assertion(bm_is_valid(effectID), "Invalid effect id %d passed!", effectID);
	Assertion(minSize <= maxSize, "Maximum size %f is more than minimum size %f!", maxSize, minSize);
	Assertion(minSize >= 0.0f, "Minimum size may not be less than zero, got %f!", minSize);

	if (Is_standalone) {
		return nullptr;
	}

	auto effectPtr = new SingleParticleEffect("");
	effectPtr->m_particleProperties.m_bitmap_list.push_back(effectID);
	effectPtr->m_particleProperties.m_bitmap_range = ::util::UniformRange<size_t>(0, effectPtr->m_particleProperties.m_bitmap_list.size() - 1);
	effectPtr->m_particleProperties.m_radius = ::util::UniformFloatRange(minSize, maxSize);

	if (lifetime > 0.0f) {
		effectPtr->m_particleProperties.m_hasLifetime = true;
		effectPtr->m_particleProperties.m_lifetime = ::util::UniformFloatRange(lifetime);
	}

	return effectPtr;
}
}
}