- // grab a decal from the array and advance to the next decal to replace, wrapping to replace an old decal if necessary
- decal = decals + currentdecal;
- currentdecal++;
- if (currentdecal >= MAX_DECALS)
- currentdecal = 0;
- decal->tex = tex;
- VectorCopy(decalbestsurf->plane->normal, decal->direction);
- // reverse direction
- if (decalbestsurf->flags & SURF_PLANEBACK)
- VectorNegate(decal->direction, decal->direction);
- VectorNegate(decal->direction, decal->direction);
- // 0.25 to push it off the surface a bit
- decalbestdist -= 0.25f;
- decal->org[0] = center[0] = org[0] + decal->direction[0] * decalbestdist;
- decal->org[1] = center[1] = org[1] + decal->direction[1] * decalbestdist;
- decal->org[2] = center[2] = org[2] + decal->direction[2] * decalbestdist;
- // set up the 4 corners
- scale *= 0.5f;
- VectorVectors(decal->direction, right, up);
- decal->vert[0][0] = center[0] - right[0] * scale - up[0] * scale; // texcoords 0 1
- decal->vert[0][1] = center[1] - right[1] * scale - up[1] * scale;
- decal->vert[0][2] = center[2] - right[2] * scale - up[2] * scale;
- decal->vert[1][0] = center[0] - right[0] * scale + up[0] * scale; // texcoords 0 0
- decal->vert[1][1] = center[1] - right[1] * scale + up[1] * scale;
- decal->vert[1][2] = center[2] - right[2] * scale + up[2] * scale;
- decal->vert[2][0] = center[0] + right[0] * scale + up[0] * scale; // texcoords 1 0
- decal->vert[2][1] = center[1] + right[1] * scale + up[1] * scale;
- decal->vert[2][2] = center[2] + right[2] * scale + up[2] * scale;
- decal->vert[3][0] = center[0] + right[0] * scale - up[0] * scale; // texcoords 1 1
- decal->vert[3][1] = center[1] + right[1] * scale - up[1] * scale;
- decal->vert[3][2] = center[2] + right[2] * scale - up[2] * scale;
- // store the color
- decal->color[0] = (byte) bound(0, cred, 255);
- decal->color[1] = (byte) bound(0, cgreen, 255);
- decal->color[2] = (byte) bound(0, cblue, 255);
- decal->color[3] = (byte) bound(0, alpha, 255);
- // store the surface information for lighting
- decal->surface = decalbestsurf;
- decal->lightmapstep = ((decalbestsurf->extents[0]>>4)+1) * ((decalbestsurf->extents[1]>>4)+1)*3; // LordHavoc: *3 for colored lighting
- if (decalbestsurf->samples)
- decal->lightmapaddress = decalbestsurf->samples + decalbestlightmapofs * 3; // LordHavoc: *3 for colored lighitng
- else
- decal->lightmapaddress = NULL;
-}