]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - model_shared.c
q3 shader parsing now sets more materialflags (such as transparency)
[xonotic/darkplaces.git] / model_shared.c
index c5e9d2f6c2e7581ae3a7db81d7dd528616e2337c..34859f8c8ad611ab30ef73a06c0fcca25c0c6171 100644 (file)
@@ -35,7 +35,7 @@ model_t *loadmodel;
 static model_t mod_known[MAX_MOD_KNOWN];
 
 rtexturepool_t *mod_shared_texturepool;
-rtexture_t *r_notexture;
+rtexture_t *r_texture_notexture;
 rtexture_t *mod_shared_detailtextures[NUM_DETAILTEXTURES];
 rtexture_t *mod_shared_distorttexture[64];
 
@@ -136,36 +136,8 @@ void Mod_BuildDistortTexture (void)
        return;
 }
 
-texture_t r_surf_notexture;
-
 void Mod_SetupNoTexture(void)
 {
-       int x, y;
-       qbyte pix[16][16][4];
-
-       // this makes a light grey/dark grey checkerboard texture
-       for (y = 0;y < 16;y++)
-       {
-               for (x = 0;x < 16;x++)
-               {
-                       if ((y < 8) ^ (x < 8))
-                       {
-                               pix[y][x][0] = 128;
-                               pix[y][x][1] = 128;
-                               pix[y][x][2] = 128;
-                               pix[y][x][3] = 255;
-                       }
-                       else
-                       {
-                               pix[y][x][0] = 64;
-                               pix[y][x][1] = 64;
-                               pix[y][x][2] = 64;
-                               pix[y][x][3] = 255;
-                       }
-               }
-       }
-
-       r_notexture = R_LoadTexture2D(mod_shared_texturepool, "notexture", 16, 16, &pix[0][0][0], TEXTYPE_RGBA, TEXF_MIPMAP, NULL);
 }
 
 static void mod_start(void)
@@ -194,30 +166,30 @@ static void mod_shutdown(void)
 
 static void mod_newmap(void)
 {
-       msurface_t *surf;
-       int i, surfnum, ssize, tsize;
+       msurface_t *surface;
+       int i, surfacenum, ssize, tsize;
 
-       if (!cl_stainmapsclearonload.integer)
+       if (!cl_stainmaps_clearonload.integer)
                return;
 
-       for (i=0; i<MAX_MOD_KNOWN; i++)
+       for (i = 0;i < MAX_MOD_KNOWN;i++)
        {
-               if (mod_known[i].name[0] && mod_known[i].type == mod_brushq1)
+               if (mod_known[i].name[0])
                {
-                       for (surfnum=0, surf=mod_known[i].brushq1.surfaces; surfnum<mod_known[i].brushq1.numsurfaces;surfnum++, surf++)
+                       for (surfacenum = 0, surface = mod_known[i].brush.data_surfaces;surfacenum < mod_known[i].brush.num_surfaces;surfacenum++, surface++)
                        {
-                               if (surf->texinfo->texture->flags & SURF_LIGHTMAP)
+                               if (surface->stainsamples)
                                {
-                                       ssize = (surf->extents[0] >> 4) + 1;
-                                       tsize = (surf->extents[1] >> 4) + 1;
-                                       
+                                       ssize = (surface->extents[0] >> 4) + 1;
+                                       tsize = (surface->extents[1] >> 4) + 1;
+
                                        if (ssize > 256 || tsize > 256)
                                                Host_Error("Bad surface extents");
 
-                                       if (surf->stainsamples)
-                                               memset(surf->stainsamples, 255, ssize * tsize * 3);
+                                       if (surface->stainsamples)
+                                               memset(surface->stainsamples, 255, ssize * tsize * 3);
 
-                                       surf->cached_dlight = true;
+                                       surface->cached_dlight = true;
                                }
                        }
                }
@@ -785,6 +757,43 @@ void Mod_BuildTextureVectorsAndNormals(int numverts, int numtriangles, const flo
                        VectorNormalize(v);
 }
 
+surfmesh_t *Mod_AllocSurfMesh(mempool_t *mempool, int numvertices, int numtriangles, int numcollisionvertices, int numcollisiontriangles, qboolean detailtexcoords, qboolean lightmapoffsets, qboolean vertexcolors)
+{
+       surfmesh_t *mesh;
+       qbyte *data;
+       mesh = Mem_Alloc(mempool, sizeof(surfmesh_t) + numvertices * (3 + 3 + 3 + 3 + 2 + 2 + (detailtexcoords ? 2 : 0) + (vertexcolors ? 4 : 0)) * sizeof(float) + numvertices * (lightmapoffsets ? 1 : 0) * sizeof(int) + numtriangles * (3 + 3) * sizeof(int) + numcollisionvertices * sizeof(float[3]) + numcollisiontriangles * sizeof(int[3]));
+       mesh->num_vertices = numvertices;
+       mesh->num_triangles = numtriangles;
+       mesh->num_collisionvertices = numcollisionvertices;
+       mesh->num_collisiontriangles = numcollisiontriangles;
+       data = (qbyte *)(mesh + 1);
+       if (mesh->num_vertices)
+       {
+               mesh->data_vertex3f = (float *)data, data += sizeof(float[3]) * mesh->num_vertices;
+               mesh->data_svector3f = (float *)data, data += sizeof(float[3]) * mesh->num_vertices;
+               mesh->data_tvector3f = (float *)data, data += sizeof(float[3]) * mesh->num_vertices;
+               mesh->data_normal3f = (float *)data, data += sizeof(float[3]) * mesh->num_vertices;
+               mesh->data_texcoordtexture2f = (float *)data, data += sizeof(float[2]) * mesh->num_vertices;
+               mesh->data_texcoordlightmap2f = (float *)data, data += sizeof(float[2]) * mesh->num_vertices;
+               if (detailtexcoords)
+                       mesh->data_texcoorddetail2f = (float *)data, data += sizeof(float[2]) * mesh->num_vertices;
+               if (vertexcolors)
+                       mesh->data_lightmapcolor4f = (float *)data, data += sizeof(float[4]) * mesh->num_vertices;
+               if (lightmapoffsets)
+                       mesh->data_lightmapoffsets = (int *)data, data += sizeof(int) * mesh->num_vertices;
+       }
+       if (mesh->num_triangles)
+       {
+               mesh->data_element3i = (int *)data, data += sizeof(int[3]) * mesh->num_triangles;
+               mesh->data_neighbor3i = (int *)data, data += sizeof(int[3]) * mesh->num_triangles;
+       }
+       if (mesh->num_collisionvertices)
+               mesh->data_collisionvertex3f = (float *)data, data += sizeof(float[3]) * mesh->num_collisionvertices;
+       if (mesh->num_collisiontriangles)
+               mesh->data_collisionelement3i = (int *)data, data += sizeof(int[3]) * mesh->num_collisiontriangles;
+       return mesh;
+}
+
 shadowmesh_t *Mod_ShadowMesh_Alloc(mempool_t *mempool, int maxverts, int maxtriangles, rtexture_t *map_diffuse, rtexture_t *map_specular, rtexture_t *map_normal, int light, int neighbors, int expandable)
 {
        shadowmesh_t *newmesh;