Exemple #1
0
void FX_CreateLight(const FXSegment_t *segment, vec3_t origin)
{
	FXLightSegment_t *light;
	fxLight_t *effect;

	if(!segment)
	{	// NULL segment pointer?
		return;
	}
	if(!segment->SegmentData.FXLightSegment)
	{	// No particle segment data?
		return;
	}
	if(segment->segmentType != EFXS_LIGHT)
	{	// Not a particle?
		return;
	}
	light = segment->SegmentData.FXLightSegment;
	effect = (fxLight_t *)malloc(sizeof(fxLight_t));
	FX_LightInit((fxPrimitive_t *)effect);
	effect->culldist = flrand(light->cullrange[0], light->cullrange[1]);
	effect->culldist *= effect->culldist; // allows for VLSquared
	effect->startTime = fx_time + Q_irand(light->delay[0], light->delay[1]);
	effect->endTime = effect->startTime + Q_irand(light->life[0], light->life[1]);
	VectorCopy(origin, effect->origin);

	if((segment->spawnflags & FXSFLAG_CHEAPORIGINCALC))
	{
		vec3_t offset;
		vecrandom(light->origin[0], light->origin[1], offset);
		VectorAdd(effect->origin, offset, effect->origin);
	}
	vecrandom(light->rgb.start.sv[0], light->rgb.start.sv[1], effect->startRGB);

	if(light->rgb.flags != 0 || !(light->rgb.flags & FXTLF_CONSTANT))
	{
		vecrandom(light->rgb.end.ev[0], light->rgb.end.ev[1], effect->endRGB);
	}
	else
	{
		VectorCopy(effect->startRGB, effect->endRGB);
	}
	//effect->RGBflags = light->rgb.flags;
	VectorCopy(effect->startRGB, effect->RGB);

	effect->startsize = effect->size = flrand(light->size.start.sf[0], light->size.start.sf[1]);

	if(light->size.flags != 0 || !(light->size.flags & FXTLF_CONSTANT))
	{
		// TODO: make the distinction between wave, clamp, nonlinear, etc
		effect->endsize = flrand(light->size.end.ef[0], light->size.end.ef[1]);
	}
	else
	{
		effect->endsize = effect->startsize;
	}
	//effect->sizeFlags = light->size.flags;

	FX_AddPrimitive((fxPrimitive_t *)effect, effect->startTime, effect->endTime);
}
void FX_CreateParticle(const FXSegment_t *segment, vec3_t origin, vec3_t dir)
{
	FXParticleSegment_t *particle;
	fxParticle_t *effect;

	if(!segment)
	{	// NULL segment pointer?
		return;
	}
	if(!segment->SegmentData.FXParticleSegment)
	{	// No particle segment data?
		return;
	}
	if(segment->segmentType != EFXS_PARTICLE)
	{	// Not a particle?
		return;
	}
	particle = segment->SegmentData.FXParticleSegment;
	effect = (fxParticle_t *)malloc(sizeof(fxParticle_t));
	FX_ParticleInit((fxPrimitive_t *)effect);
	effect->culldist = flrand(particle->cullrange[0], particle->cullrange[1]);
	effect->culldist *= effect->culldist; // allows for VLSquared
	effect->startTime = fx_time + Q_irand(particle->delay[0], particle->delay[1]);
	effect->endTime = effect->startTime + Q_irand(particle->life[0], particle->life[1]);
	effect->flags = segment->flags;
	VectorCopy(origin, effect->origin);

	//if((segment->spawnflags & FXSFLAG_CHEAPORIGINCALC))
	{
		vec3_t offset;
		vecrandom(particle->origin[0], particle->origin[1], offset);
		VectorAdd(effect->origin, offset, effect->origin);
	}
	vecrandom(particle->rgb.start.sv[0], particle->rgb.start.sv[1], effect->startRGB);

	if(particle->rgb.flags != 0 || !(particle->rgb.flags & FXTLF_CONSTANT))
	{
		vecrandom(particle->rgb.end.ev[0], particle->rgb.end.ev[1], effect->endRGB);
	}
	else
	{
		VectorCopy(effect->startRGB, effect->endRGB);
	}
	//effect->RGBflags = light->rgb.flags;
	VectorCopy(effect->startRGB, effect->RGB);

	effect->startsize = effect->size = flrand(particle->size.start.sf[0], particle->size.start.sf[1]);

	if(particle->size.flags != 0 || !(particle->size.flags & FXTLF_CONSTANT))
	{
		// TODO: make the distinction between wave, clamp, nonlinear, etc
		effect->endsize = flrand(particle->size.end.ef[0], particle->size.end.ef[1]);
	}
	else
	{
		effect->endsize = effect->startsize;
	}
	//effect->sizeFlags = light->size.flags;

	effect->startalpha = effect->alpha = flrand(particle->alpha.start.sf[0], particle->alpha.start.sf[1]);
	if(particle->alpha.flags != 0 || !(particle->alpha.flags & FXTLF_CONSTANT))
	{
		// TODO: make the distinction between wave, clamp, nonlinear, etc
		effect->endalpha = flrand(particle->alpha.end.ef[0], particle->alpha.end.ef[1]);
	}
	else
	{
		effect->endalpha = effect->startalpha;
	}
	//effect->alphaFlags = particle->alpha.flags;

	effect->startrotation = effect->rotation = flrand(particle->rotation[0], particle->rotation[1]);
	effect->deltarotation = flrand(particle->rotationDelta[0], particle->rotationDelta[1]);

	vecrandom(particle->velocity[0], particle->velocity[1], effect->velocity);
	vecrandom(particle->acceleration[0], particle->acceleration[1], effect->accel);

	effect->shader = particle->shader.fieldHandles[Q_irand(0, particle->shader.numFields-1)];

	FX_AddPrimitive((fxPrimitive_t *)effect, effect->startTime, effect->endTime);
}