qbyte mod_novis[(MAX_MAP_LEAFS + 7)/ 8];
-cvar_t r_subdivide_size = {CVAR_SAVE, "r_subdivide_size", "128"};
+//cvar_t r_subdivide_size = {CVAR_SAVE, "r_subdivide_size", "128"};
cvar_t halflifebsp = {0, "halflifebsp", "0"};
cvar_t r_novis = {0, "r_novis", "0"};
cvar_t r_miplightmaps = {CVAR_SAVE, "r_miplightmaps", "0"};
cvar_t r_lightmaprgba = {0, "r_lightmaprgba", "1"};
cvar_t r_vertexsurfacesthreshold = {CVAR_SAVE, "r_vertexsurfacesthreshold", "0"};
cvar_t r_nosurftextures = {0, "r_nosurftextures", "0"};
+cvar_t r_sortsurfaces = {0, "r_sortsurfaces", "0"};
+
+#define NUM_DETAILTEXTURES 1
+static rtexture_t *detailtextures[NUM_DETAILTEXTURES];
+static rtexturepool_t *detailtexturepool;
/*
===============
*/
void Mod_BrushInit (void)
{
- Cvar_RegisterVariable(&r_subdivide_size);
+// Cvar_RegisterVariable(&r_subdivide_size);
Cvar_RegisterVariable(&halflifebsp);
Cvar_RegisterVariable(&r_novis);
Cvar_RegisterVariable(&r_miplightmaps);
Cvar_RegisterVariable(&r_lightmaprgba);
Cvar_RegisterVariable(&r_vertexsurfacesthreshold);
Cvar_RegisterVariable(&r_nosurftextures);
+ Cvar_RegisterVariable(&r_sortsurfaces);
memset(mod_novis, 0xff, sizeof(mod_novis));
}
+void Mod_BrushStartup (void)
+{
+ int i, x, y, light;
+ float vc[3], vx[3], vy[3], vn[3], lightdir[3];
+#define DETAILRESOLUTION 256
+ qbyte data[DETAILRESOLUTION][DETAILRESOLUTION][4], noise[DETAILRESOLUTION][DETAILRESOLUTION];
+ detailtexturepool = R_AllocTexturePool();
+ lightdir[0] = 0.5;
+ lightdir[1] = 1;
+ lightdir[2] = -0.25;
+ VectorNormalize(lightdir);
+ for (i = 0;i < NUM_DETAILTEXTURES;i++)
+ {
+ fractalnoise(&noise[0][0], DETAILRESOLUTION, DETAILRESOLUTION >> 4);
+ for (y = 0;y < DETAILRESOLUTION;y++)
+ {
+ for (x = 0;x < DETAILRESOLUTION;x++)
+ {
+ vc[0] = x;
+ vc[1] = y;
+ vc[2] = noise[y][x] * (1.0f / 32.0f);
+ vx[0] = x + 1;
+ vx[1] = y;
+ vx[2] = noise[y][(x + 1) % DETAILRESOLUTION] * (1.0f / 32.0f);
+ vy[0] = x;
+ vy[1] = y + 1;
+ vy[2] = noise[(y + 1) % DETAILRESOLUTION][x] * (1.0f / 32.0f);
+ VectorSubtract(vx, vc, vx);
+ VectorSubtract(vy, vc, vy);
+ CrossProduct(vx, vy, vn);
+ VectorNormalize(vn);
+ light = 128 - DotProduct(vn, lightdir) * 128;
+ light = bound(0, light, 255);
+ data[y][x][0] = data[y][x][1] = data[y][x][2] = light;
+ data[y][x][3] = 255;
+ }
+ }
+ detailtextures[i] = R_LoadTexture(detailtexturepool, va("detailtexture%i", i), DETAILRESOLUTION, DETAILRESOLUTION, &data[0][0][0], TEXTYPE_RGBA, TEXF_MIPMAP | TEXF_PRECACHE);
+ }
+}
+
+void Mod_BrushShutdown (void)
+{
+ int i;
+ for (i = 0;i < NUM_DETAILTEXTURES;i++)
+ R_FreeTexture(detailtextures[i]);
+ R_FreeTexturePool(&detailtexturepool);
+}
+
/*
===============
Mod_PointInLeaf
===============
*/
-mleaf_t *Mod_PointInLeaf (vec3_t p, model_t *model)
+mleaf_t *Mod_PointInLeaf (const vec3_t p, model_t *model)
{
mnode_t *node;
if (!R_TextureHasAlpha(tx->texture))
tx->flags |= SURF_CLIPSOLID;
}
+
+ tx->detailtexture = detailtextures[i % NUM_DETAILTEXTURES];
}
// sequence the animations
}
}
+#if 0
#define MAX_SUBDIVPOLYTRIANGLES 4096
#define MAX_SUBDIVPOLYVERTS (MAX_SUBDIVPOLYTRIANGLES * 3)
v->st[1] = DotProduct (v->v, surf->texinfo->vecs[1]);
}
}
+#endif
void Mod_GenerateVertexLitMesh (msurface_t *surf)
{
s = DotProduct (out->v, surf->texinfo->vecs[0]) + surf->texinfo->vecs[0][3];
t = DotProduct (out->v, surf->texinfo->vecs[1]) + surf->texinfo->vecs[1][3];
+ out->ab[0] = s * (1.0f / 16.0f);
+ out->ab[1] = t * (1.0f / 16.0f);
+
out->st[0] = s / surf->texinfo->texture->width;
out->st[1] = t / surf->texinfo->texture->height;
s = DotProduct (out->v, surf->texinfo->vecs[0]) + surf->texinfo->vecs[0][3];
t = DotProduct (out->v, surf->texinfo->vecs[1]) + surf->texinfo->vecs[1][3];
+ out->ab[0] = s * (1.0f / 16.0f);
+ out->ab[1] = t * (1.0f / 16.0f);
+
out->st[0] = s / surf->texinfo->texture->width;
out->st[1] = t / surf->texinfo->texture->height;
void Mod_GenerateVertexMesh (msurface_t *surf)
{
int i, *index;
- float *in;
+ float *in, s, t;
surfvertex_t *out;
surfmesh_t *mesh;
for (i = 0, in = surf->poly_verts, out = mesh->vertex;i < mesh->numverts;i++, in += 3, out++)
{
VectorCopy (in, out->v);
- out->st[0] = (DotProduct (out->v, surf->texinfo->vecs[0]) + surf->texinfo->vecs[0][3]) / surf->texinfo->texture->width;
- out->st[1] = (DotProduct (out->v, surf->texinfo->vecs[1]) + surf->texinfo->vecs[1][3]) / surf->texinfo->texture->height;
+ s = (DotProduct (out->v, surf->texinfo->vecs[0]) + surf->texinfo->vecs[0][3]);
+ t = (DotProduct (out->v, surf->texinfo->vecs[1]) + surf->texinfo->vecs[1][3]);
+ out->st[0] = s / surf->texinfo->texture->width;
+ out->st[1] = t / surf->texinfo->texture->height;
+ out->ab[0] = s * (1.0f / 16.0f);
+ out->ab[1] = t * (1.0f / 16.0f);
}
}
void Mod_GenerateSurfacePolygon (msurface_t *surf)
{
- float *vert;
- int i;
- int lindex;
- float *vec;
+ int i, lindex;
+ float *vec, *vert, mins[3], maxs[3];
// convert edges back to a normal polygon
surf->poly_numverts = surf->numedges;
VectorCopy (vec, vert);
vert += 3;
}
+ vert = surf->poly_verts;
+ VectorCopy(vert, mins);
+ VectorCopy(vert, maxs);
+ vert += 3;
+ for (i = 1;i < surf->poly_numverts;i++)
+ {
+ if (mins[0] > vert[0]) mins[0] = vert[0];if (maxs[0] < vert[0]) maxs[0] = vert[0];
+ if (mins[1] > vert[1]) mins[1] = vert[1];if (maxs[1] < vert[1]) maxs[1] = vert[1];
+ if (mins[2] > vert[2]) mins[2] = vert[2];if (maxs[2] < vert[2]) maxs[2] = vert[2];
+ vert += 3;
+ }
+ surf->poly_center[0] = (mins[0] + maxs[0]) * 0.5f;
+ surf->poly_center[1] = (mins[1] + maxs[1]) * 0.5f;
+ surf->poly_center[2] = (mins[2] + maxs[2]) * 0.5f;
}
static void Mod_SplitSurfMeshIfTooBig(msurface_t *s)
{
out->shader = &Cshader_sky;
out->samples = NULL;
- Mod_GenerateWarpMesh (out);
+ Mod_GenerateVertexMesh (out);
}
else if (out->texinfo->texture->flags & SURF_DRAWTURB)
{
out->shader = &Cshader_water;
out->samples = NULL;
- Mod_GenerateWarpMesh (out);
+ Mod_GenerateVertexMesh (out);
}
else
{
out->shader = &Cshader_water;
out->shader = &Cshader_water;
out->samples = NULL;
- Mod_GenerateWarpMesh (out);
+ Mod_GenerateVertexMesh (out);
}
- else if ((out->extents[0]+1) > (256*16) || (out->extents[1]+1) > (256*16))
+ else if ((out->extents[0] >> 4) + 1 > (256) || (out->extents[1] >> 4) + 1 > (256))
{
Con_Printf ("Bad surface extents, converting to fullbright polygon");
out->shader = &Cshader_wall_fullbright;
for (surfnum = 0;surfnum < sortmodel->nummodelsurfaces;surfnum++)
sortmodel->modelsortedsurfaces[surfnum] = &sortmodel->surfaces[surfnum + sortmodel->firstmodelsurface];
- qsort(sortmodel->modelsortedsurfaces, sortmodel->nummodelsurfaces, sizeof(msurface_t *), Mod_SurfaceQSortCompare);
+ if (r_sortsurfaces.integer)
+ qsort(sortmodel->modelsortedsurfaces, sortmodel->nummodelsurfaces, sizeof(msurface_t *), Mod_SurfaceQSortCompare);
}