- Use the same darkening amount for default blood and custom blood particles.

- Cache particle colors so custom particle colors don't require a full scan of the palette each
  time they're created. Also fixes a bug with custom blood colors.

SVN r3385 (trunk)
This commit is contained in:
Randy Heit 2012-02-23 02:50:36 +00:00
parent 9457a1b3f8
commit 22dfc82338
1 changed files with 29 additions and 10 deletions

View File

@ -208,6 +208,28 @@ void P_FindParticleSubsectors ()
} }
} }
static TMap<int, int> ColorSaver;
static uint32 ParticleColor(int rgb)
{
int *val;
int stuff;
val = ColorSaver.CheckKey(rgb);
if (val != NULL)
{
return *val;
}
stuff = rgb | (ColorMatcher.Pick(RPART(rgb), GPART(rgb), BPART(rgb)) << 24);
ColorSaver[rgb] = stuff;
return stuff;
}
static uint32 ParticleColor(int r, int g, int b)
{
return ParticleColor(MAKERGB(r, g, b));
}
void P_InitEffects () void P_InitEffects ()
{ {
const struct ColorList *color = Colors; const struct ColorList *color = Colors;
@ -215,15 +237,13 @@ void P_InitEffects ()
P_InitParticles(); P_InitParticles();
while (color->color) while (color->color)
{ {
*(color->color) = (MAKERGB(color->r, color->g, color->b) *(color->color) = ParticleColor(color->r, color->g, color->b);
| (ColorMatcher.Pick (color->r, color->g, color->b) << 24));
color++; color++;
} }
int kind = gameinfo.defaultbloodparticlecolor; int kind = gameinfo.defaultbloodparticlecolor;
int kind3 = MAKERGB(RPART(kind)/3, GPART(kind)/3, BPART(kind)/3); blood1 = ParticleColor(kind);
blood1 = kind | (ColorMatcher.Pick(RPART(kind), GPART(kind), BPART(kind)) << 24); blood2 = ParticleColor(RPART(kind)/3, GPART(kind)/3, BPART(kind)/3);
blood2 = kind3 | (ColorMatcher.Pick(RPART(kind3), GPART(kind3), BPART(kind3)) << 24);
} }
@ -522,9 +542,8 @@ void P_DrawSplash2 (int count, fixed_t x, fixed_t y, fixed_t z, angle_t angle, i
color2 = grey1; color2 = grey1;
break; break;
default: // colorized blood default: // colorized blood
color1 = kind | (ColorMatcher.Pick(RPART(kind), GPART(kind), BPART(kind)) << 24); color1 = ParticleColor(kind);
color2 = MAKERGB((kind)>>1, GPART(kind)>>1, BPART(kind)>>1) color2 = ParticleColor(RPART(kind)/3, GPART(kind)/3, BPART(kind)/3);
| (ColorMatcher.Pick(RPART(kind)>>1, GPART(kind)>>1, BPART(kind)>>1) << 24);
break; break;
} }
@ -649,7 +668,7 @@ void P_DrawRailTrail (AActor *source, const FVector3 &start, const FVector3 &end
FVector3 spiral_step = step * r_rail_spiralsparsity; FVector3 spiral_step = step * r_rail_spiralsparsity;
int spiral_steps = steps * r_rail_spiralsparsity; int spiral_steps = steps * r_rail_spiralsparsity;
color1 = color1 == 0 ? -1 : color1 | (ColorMatcher.Pick(RPART(color1), GPART(color1), BPART(color1)) <<24); color1 = color1 == 0 ? -1 : ParticleColor(color1);
pos = start; pos = start;
deg = FAngle(270); deg = FAngle(270);
for (i = spiral_steps; i; i--) for (i = spiral_steps; i; i--)
@ -702,7 +721,7 @@ void P_DrawRailTrail (AActor *source, const FVector3 &start, const FVector3 &end
FVector3 trail_step = step * r_rail_trailsparsity; FVector3 trail_step = step * r_rail_trailsparsity;
int trail_steps = steps * r_rail_trailsparsity; int trail_steps = steps * r_rail_trailsparsity;
color2 = color2 == 0 ? -1 : color2 | (ColorMatcher.Pick(RPART(color2), GPART(color2), BPART(color2)) <<24); color2 = color2 == 0 ? -1 : ParticleColor(color2);
FVector3 diff(0, 0, 0); FVector3 diff(0, 0, 0);
pos = start; pos = start;