]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - model_brush.c
changed default value of cl_stainmaps to 0 (was 1)
[xonotic/darkplaces.git] / model_brush.c
index 98229c7e3b404b3836724a6a01e48f255dbfb436..ebcd7bf1cc40995351e277e4e6dfa9465ae8ad87 100644 (file)
@@ -824,10 +824,26 @@ static void Mod_Q1BSP_TraceBox(struct model_s *model, int frame, trace_t *trace,
                rhc.hull = &model->brushq1.hulls[0]; // 0x0x0
        else if (model->brush.ismcbsp)
        {
-               if (boxsize[2] < 48) // pick the nearest of 40 or 56
-                       rhc.hull = &model->brushq1.hulls[2]; // 16x16x40
-               else
-                       rhc.hull = &model->brushq1.hulls[1]; // 16x16x56
+               int i;
+               float vdist, dist;
+               int vdisti = 0;
+
+               vdist = 0;      // shut up compiler warning
+
+       // find the closest hull size (this algorithm probably sucks, a qc field to override it might be in order...)
+               for (i = 1; i < model->brushq1.numhulls; i++)
+               {
+                       dist = fabs(model->brushq1.hulls[i].clip_size[0] - boxsize[0]) +
+                                       fabs(model->brushq1.hulls[i].clip_size[1] - boxsize[1]) +
+                                       fabs(model->brushq1.hulls[i].clip_size[2] - boxsize[2]) * 0.25;
+
+                       if (!vdisti || dist < vdist)
+                       {
+                               vdisti = i;
+                               vdist = dist;
+                       }
+               }
+               rhc.hull = &model->brushq1.hulls[vdisti];
        }
        else if (model->brush.ishlbsp)
        {
@@ -1378,6 +1394,14 @@ static void Mod_Q1BSP_LoadTextures(lump_t *l)
                        tx->surfaceflags = mod_q1bsp_texture_solid.surfaceflags;
                }
                tx->currentframe = tx;
+
+               // clear water settings
+               tx->reflectmin = 0;
+               tx->reflectmax = 1;
+               tx->refractfactor = 1;
+               Vector4Set(tx->refractcolor4f, 1, 1, 1, 1);
+               tx->reflectfactor = 1;
+               Vector4Set(tx->reflectcolor4f, 1, 1, 1, 1);
        }
 
        if (!m)
@@ -1486,7 +1510,7 @@ static void Mod_Q1BSP_LoadTextures(lump_t *l)
                        {
                                if (loadmodel->isworldmodel)
                                {
-                                       data = loadimagepixels(tx->name, false, 0, 0);
+                                       data = loadimagepixels(tx->name, false, 0, 0, false);
                                        if (data)
                                        {
                                                R_Q1BSP_LoadSplitSky(data, image_width, image_height, 4);
@@ -1537,14 +1561,7 @@ static void Mod_Q1BSP_LoadTextures(lump_t *l)
                                if (strncmp(tx->name,"*lava",5)
                                 && strncmp(tx->name,"*teleport",9)
                                 && strncmp(tx->name,"*rift",5)) // Scourge of Armagon texture
-                                {
                                        tx->basematerialflags |= MATERIALFLAG_WATERALPHA | MATERIALFLAG_NOSHADOW | MATERIALFLAG_WATERSHADER;
-                                       VectorSet(tx->reflectcolor, 1, 1, 1);
-                                       VectorSet(tx->refractcolor, 1, 1, 1);
-                                       tx->refractmin = 0;
-                                       tx->refractmax = 1;
-                                       tx->refractfactor = 1;
-                               }
                                tx->basematerialflags |= MATERIALFLAG_WATER | MATERIALFLAG_LIGHTBOTHSIDES | MATERIALFLAG_NOSHADOW;
                        }
                        else if (!strncmp(tx->name, "sky", 3))
@@ -3404,8 +3421,10 @@ void Mod_Q1BSP_Load(model_t *mod, void *buffer, void *bufferend)
                        Host_Error("Mod_Q1BSP_Load: %s has wrong version number(%i should be %i)", mod->name, i, MCBSPVERSION);
 
        // read hull info
-               hullinfo.numhulls = LittleLong(*(int*)index); index += 4;
+               hullinfo.numhulls = SB_ReadInt (&index);
                hullinfo.filehulls = hullinfo.numhulls;
+               mod->brushq1.numhulls = hullinfo.numhulls;
+
                VectorClear (hullinfo.hullsizes[0][0]);
                VectorClear (hullinfo.hullsizes[0][1]);
                for (i = 1; i < hullinfo.numhulls; i++)
@@ -3447,6 +3466,7 @@ void Mod_Q1BSP_Load(model_t *mod, void *buffer, void *bufferend)
 
                        hullinfo.numhulls = 4;
                        hullinfo.filehulls = 4;
+                       mod->brushq1.numhulls = 4;
                        VectorSet (hullinfo.hullsizes[1][0], -16, -16, -36);
                        VectorSet (hullinfo.hullsizes[1][1], 16, 16, 36);
                        VectorSet (hullinfo.hullsizes[2][0], -32, -32, -32);
@@ -3458,6 +3478,7 @@ void Mod_Q1BSP_Load(model_t *mod, void *buffer, void *bufferend)
                {
                        hullinfo.numhulls = 3;
                        hullinfo.filehulls = 4;
+                       mod->brushq1.numhulls = 3;
                        VectorSet (hullinfo.hullsizes[1][0], -16, -16, -24);
                        VectorSet (hullinfo.hullsizes[1][1], 16, 16, 32);
                        VectorSet (hullinfo.hullsizes[2][0], -32, -32, -24);
@@ -3666,7 +3687,7 @@ void Mod_Q1BSP_Load(model_t *mod, void *buffer, void *bufferend)
                                // we only need to have a drawsky function if it is used(usually only on world model)
                                if (surface->texture->basematerialflags & MATERIALFLAG_SKY)
                                        mod->DrawSky = R_Q1BSP_DrawSky;
-                               if (surface->texture->basematerialflags & (MATERIALFLAG_WATERSHADER | MATERIALFLAG_REFLECTION))
+                               if (surface->texture->basematerialflags & (MATERIALFLAG_WATERSHADER | MATERIALFLAG_REFRACTION | MATERIALFLAG_REFLECTION))
                                        mod->DrawAddWaterPlanes = R_Q1BSP_DrawAddWaterPlanes;
                                // calculate bounding shapes
                                for (k = 0, vec = (loadmodel->surfmesh.data_vertex3f + 3 * surface->num_firstvertex);k < surface->num_vertices;k++, vec += 3)
@@ -4226,7 +4247,7 @@ static void Mod_Q3BSP_LoadTextures(lump_t *l)
 
        c = 0;
        for (i = 0;i < count;i++, in++, out++)
-               if (Mod_LoadTextureFromQ3Shader(out, out->name, false, true, false))
+               if (!Mod_LoadTextureFromQ3Shader(out, out->name, false, true, false))
                        c++;
        if (c)
                Con_DPrintf("%s: %i textures missing shaders\n", loadmodel->name, c);
@@ -5770,7 +5791,7 @@ void Mod_Q3BSP_Load(model_t *mod, void *buffer, void *bufferend)
                        mod->DrawSky = NULL;
 
                for (j = 0;j < mod->nummodelsurfaces;j++)
-                       if (mod->data_surfaces[j + mod->firstmodelsurface].texture->basematerialflags & (MATERIALFLAG_WATERSHADER | MATERIALFLAG_REFLECTION))
+                       if (mod->data_surfaces[j + mod->firstmodelsurface].texture->basematerialflags & (MATERIALFLAG_WATERSHADER | MATERIALFLAG_REFRACTION | MATERIALFLAG_REFLECTION))
                                break;
                if (j < mod->nummodelsurfaces)
                        mod->DrawAddWaterPlanes = R_Q1BSP_DrawAddWaterPlanes;