]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cl_particles.c
laid groundwork for a new decal system
[xonotic/darkplaces.git] / cl_particles.c
index d7cef616a7cd9547b38cc5994cba582edfe86b52..663e656d978e424b26b3e4ddb084d05056d2ffd2 100644 (file)
@@ -181,6 +181,7 @@ particletexture_t;
 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};
@@ -1836,9 +1837,10 @@ static void R_InitParticleTexture (void)
        // 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;
@@ -1979,7 +1981,8 @@ static void R_InitParticleTexture (void)
                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);
        }
@@ -2097,6 +2100,8 @@ static void r_part_shutdown(void)
 
 static void r_part_newmap(void)
 {
+       if (decalskinframe)
+               R_SkinFrame_MarkUsed(decalskinframe);
        CL_Particles_LoadEffectInfo();
 }
 
@@ -2133,8 +2138,9 @@ void R_DrawDecal_TransparentCallback(const entity_render_t *ent, const rtlight_t
        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);
@@ -2155,7 +2161,7 @@ void R_DrawDecal_TransparentCallback(const entity_render_t *ent, const rtlight_t
                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);
@@ -2284,10 +2290,11 @@ void R_DrawParticle_TransparentCallback(const entity_render_t *ent, const rtligh
        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);
@@ -2317,7 +2324,7 @@ void R_DrawParticle_TransparentCallback(const entity_render_t *ent, const rtligh
                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];
@@ -2336,7 +2343,7 @@ void R_DrawParticle_TransparentCallback(const entity_render_t *ent, const rtligh
                        // 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;