static rtexturepool_t *particletexturepool;
static rtexture_t *particlefonttexture;
static particletexture_t particletexture[MAX_PARTICLETEXTURES];
+skinframe_t *decalskinframe;
// texture numbers in particle font
static const int tex_smoke[8] = {0, 1, 2, 3, 4, 5, 6, 7};
// we invert it again during the blendfunc to make it work...
#ifndef DUMPPARTICLEFONT
- particlefonttexture = loadtextureimage(particletexturepool, "particles/particlefont.tga", false, TEXF_ALPHA | TEXF_PRECACHE | TEXF_FORCELINEAR, true);
- if (particlefonttexture)
+ decalskinframe = R_SkinFrame_LoadExternal("particles/particlefont.tga", TEXF_ALPHA | TEXF_PRECACHE | TEXF_FORCELINEAR, false);
+ if (decalskinframe)
{
+ particlefonttexture = decalskinframe->base;
// TODO maybe allow custom grid size?
particlefontwidth = image_width;
particlefontheight = image_height;
Image_WriteTGABGRA ("particles/particlefont.tga", PARTICLEFONTSIZE, PARTICLEFONTSIZE, particletexturedata);
#endif
- particlefonttexture = R_LoadTexture2D(particletexturepool, "particlefont", PARTICLEFONTSIZE, PARTICLEFONTSIZE, particletexturedata, TEXTYPE_BGRA, TEXF_ALPHA | TEXF_PRECACHE | TEXF_FORCELINEAR, NULL);
+ decalskinframe = R_SkinFrame_LoadInternalBGRA("particlefont", TEXF_ALPHA | TEXF_PRECACHE | TEXF_FORCELINEAR, particletexturedata, PARTICLEFONTSIZE, PARTICLEFONTSIZE);
+ particlefonttexture = decalskinframe->base;
Mem_Free(particletexturedata);
}
static void r_part_newmap(void)
{
+ if (decalskinframe)
+ R_SkinFrame_MarkUsed(decalskinframe);
CL_Particles_LoadEffectInfo();
}
float alphascale = (1.0f / 65536.0f) * cl_particles_alpha.value * r_refdef.view.colorscale;
float particle_vertex3f[BATCHSIZE*12], particle_texcoord2f[BATCHSIZE*8], particle_color4f[BATCHSIZE*16];
+ RSurf_ActiveWorldEntity();
+
r_refdef.stats.decals += numsurfaces;
- R_Mesh_Matrix(&identitymatrix);
R_Mesh_ResetTextureState();
R_Mesh_VertexPointer(particle_vertex3f, 0, 0);
R_Mesh_TexCoordPointer(0, 2, particle_texcoord2f, 0, 0);
c4f = particle_color4f + 16*surfacelistindex;
ca = d->alpha * alphascale;
if (r_refdef.fogenabled)
- ca *= FogPoint_World(d->org);
+ ca *= RSurf_FogVertex(d->org);
Vector4Set(c4f, d->color[0] * ca, d->color[1] * ca, d->color[2] * ca, 1);
Vector4Copy(c4f, c4f + 4);
Vector4Copy(c4f, c4f + 8);
vec4_t colormultiplier;
float particle_vertex3f[BATCHSIZE*12], particle_texcoord2f[BATCHSIZE*8], particle_color4f[BATCHSIZE*16];
+ RSurf_ActiveWorldEntity();
+
Vector4Set(colormultiplier, r_refdef.view.colorscale * (1.0 / 256.0f), r_refdef.view.colorscale * (1.0 / 256.0f), r_refdef.view.colorscale * (1.0 / 256.0f), cl_particles_alpha.value * (1.0 / 256.0f));
r_refdef.stats.particles += numsurfaces;
- R_Mesh_Matrix(&identitymatrix);
R_Mesh_ResetTextureState();
R_Mesh_VertexPointer(particle_vertex3f, 0, 0);
R_Mesh_TexCoordPointer(0, 2, particle_texcoord2f, 0, 0);
case PBLEND_ADD:
// additive and modulate can just fade out in fog (this is correct)
if (r_refdef.fogenabled)
- c4f[3] *= FogPoint_World(p->org);
+ c4f[3] *= RSurf_FogVertex(p->org);
// collapse alpha into color for these blends (so that the particlefont does not need alpha on most textures)
c4f[0] *= c4f[3];
c4f[1] *= c4f[3];
// mix in the fog color
if (r_refdef.fogenabled)
{
- fog = FogPoint_World(p->org);
+ fog = RSurf_FogVertex(p->org);
ifog = 1 - fog;
c4f[0] = c4f[0] * fog + r_refdef.fogcolor[0] * ifog;
c4f[1] = c4f[1] * fog + r_refdef.fogcolor[1] * ifog;