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); }