]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - model_brush.c
note that in some cases, crypto_aeslevel changes need crypto_reload to apply (namely...
[xonotic/darkplaces.git] / model_brush.c
index c3ab5ade14821d814242f5f320da9fddc791abb6..463991c82e7a06725471d830aa29a4dc9061615d 100644 (file)
@@ -40,6 +40,7 @@ cvar_t r_subdivisions_collision_maxtess = {0, "r_subdivisions_collision_maxtess"
 cvar_t r_subdivisions_collision_maxvertices = {0, "r_subdivisions_collision_maxvertices", "4225", "maximum vertices allowed per subdivided curve"};
 cvar_t r_trippy = {0, "r_trippy", "0", "easter egg"};
 cvar_t mod_noshader_default_offsetmapping = {CVAR_SAVE, "mod_noshader_default_offsetmapping", "1", "use offsetmapping by default on all surfaces that are not using q3 shader files"};
+cvar_t mod_obj_orientation = {0, "mod_obj_orientation", "1", "fix orientation of OBJ models to the usual conventions (if zero, use coordinates as is)"};
 cvar_t mod_q3bsp_curves_collisions = {0, "mod_q3bsp_curves_collisions", "1", "enables collisions with curves (SLOW)"};
 cvar_t mod_q3bsp_curves_collisions_stride = {0, "mod_q3bsp_curves_collisions_stride", "16", "collisions against curves: optimize performance by doing a combined collision check for this triangle amount first (-1 avoids any box tests)"};
 cvar_t mod_q3bsp_curves_stride = {0, "mod_q3bsp_curves_stride", "16", "particle effect collisions against curves: optimize performance by doing a combined collision check for this triangle amount first (-1 avoids any box tests)"};
@@ -81,6 +82,7 @@ void Mod_BrushInit(void)
        Cvar_RegisterVariable(&r_subdivisions_collision_maxvertices);
        Cvar_RegisterVariable(&r_trippy);
        Cvar_RegisterVariable(&mod_noshader_default_offsetmapping);
+       Cvar_RegisterVariable(&mod_obj_orientation);
        Cvar_RegisterVariable(&mod_q3bsp_curves_collisions);
        Cvar_RegisterVariable(&mod_q3bsp_curves_collisions_stride);
        Cvar_RegisterVariable(&mod_q3bsp_curves_stride);
@@ -7294,13 +7296,28 @@ static void Mod_Q3BSP_Load(dp_model_t *mod, void *buffer, void *bufferend)
                        Mod_BuildVBOs();
        }
 
-       if (mod_q3bsp_sRGBlightmaps.integer && vid_sRGB.integer && vid_sRGB_fallback.integer && !vid.sRGB3D)
+       if (mod_q3bsp_sRGBlightmaps.integer)
        {
-               // actually we do in sRGB fallback with sRGB lightmaps: Image_sRGBFloatFromLinear_Lightmap(Image_LinearFloatFromsRGBFloat(x))
-               // neutral point is at Image_sRGBFloatFromLinearFloat(0.5)
-               // so we need to map Image_sRGBFloatFromLinearFloat(0.5) to 0.5
-               // factor is 0.5 / Image_sRGBFloatFromLinearFloat(0.5)
-               loadmodel->lightmapscale *= 0.679942f; // fixes neutral level
+               if (vid_sRGB.integer && vid_sRGB_fallback.integer && !vid.sRGB3D)
+               {
+                       // actually we do in sRGB fallback with sRGB lightmaps: Image_sRGBFloatFromLinear_Lightmap(Image_LinearFloatFromsRGBFloat(x))
+                       // neutral point is at Image_sRGBFloatFromLinearFloat(0.5)
+                       // so we need to map Image_sRGBFloatFromLinearFloat(0.5) to 0.5
+                       // factor is 0.5 / Image_sRGBFloatFromLinearFloat(0.5)
+                       //loadmodel->lightmapscale *= 0.679942f; // fixes neutral level
+               }
+               else // if this is NOT set, regular rendering looks right by this requirement anyway
+               {
+                       /*
+                       // we want color 1 to do the same as without sRGB
+                       // so, we want to map 1 to Image_LinearFloatFromsRGBFloat(2) instead of to 2
+                       loadmodel->lightmapscale *= 2.476923f; // fixes max level
+                       */
+
+                       // neutral level 0.5 gets uploaded as sRGB and becomes Image_LinearFloatFromsRGBFloat(0.5)
+                       // we need to undo that
+                       loadmodel->lightmapscale *= 2.336f; // fixes neutral level
+               }
        }
 
        Con_DPrintf("Stats for q3bsp model \"%s\": %i faces, %i nodes, %i leafs, %i clusters, %i clusterportals, mesh: %i vertices, %i triangles, %i surfaces\n", loadmodel->name, loadmodel->num_surfaces, loadmodel->brush.num_nodes, loadmodel->brush.num_leafs, mod->brush.num_pvsclusters, loadmodel->brush.num_portals, loadmodel->surfmesh.num_vertices, loadmodel->surfmesh.num_triangles, loadmodel->num_surfaces);
@@ -7481,9 +7498,18 @@ void Mod_OBJ_Load(dp_model_t *mod, void *buffer, void *bufferend)
                                maxv = max(maxv * 2, 1024);
                                v = (float *)Mem_Realloc(tempmempool, v, maxv * sizeof(float[3]));
                        }
-                       v[numv*3+0] = atof(argv[1]);
-                       v[numv*3+2] = atof(argv[2]);
-                       v[numv*3+1] = atof(argv[3]);
+                       if(mod_obj_orientation.integer)
+                       {
+                               v[numv*3+0] = atof(argv[1]);
+                               v[numv*3+2] = atof(argv[2]);
+                               v[numv*3+1] = atof(argv[3]);
+                       }
+                       else
+                       {
+                               v[numv*3+0] = atof(argv[1]);
+                               v[numv*3+1] = atof(argv[2]);
+                               v[numv*3+2] = atof(argv[3]);
+                       }
                        numv++;
                }
                else if (!strcmp(argv[0], "vt"))
@@ -7504,9 +7530,18 @@ void Mod_OBJ_Load(dp_model_t *mod, void *buffer, void *bufferend)
                                maxvn = max(maxvn * 2, 1024);
                                vn = (float *)Mem_Realloc(tempmempool, vn, maxvn * sizeof(float[3]));
                        }
-                       vn[numvn*3+0] = atof(argv[1]);
-                       vn[numvn*3+2] = atof(argv[2]);
-                       vn[numvn*3+1] = atof(argv[3]);
+                       if(mod_obj_orientation.integer)
+                       {
+                               vn[numvn*3+0] = atof(argv[1]);
+                               vn[numvn*3+2] = atof(argv[2]);
+                               vn[numvn*3+1] = atof(argv[3]);
+                       }
+                       else
+                       {
+                               vn[numvn*3+0] = atof(argv[1]);
+                               vn[numvn*3+1] = atof(argv[2]);
+                               vn[numvn*3+2] = atof(argv[3]);
+                       }
                        numvn++;
                }
                else if (!strcmp(argv[0], "f"))
@@ -7575,9 +7610,18 @@ void Mod_OBJ_Load(dp_model_t *mod, void *buffer, void *bufferend)
                                                maxtriangles = max(maxtriangles * 2, 32768);
                                                vertices = (objvertex_t*)Mem_Realloc(loadmodel->mempool, vertices, maxtriangles * sizeof(objvertex_t[3]));
                                        }
-                                       vertices[numtriangles*3+0] = vfirst;
-                                       vertices[numtriangles*3+1] = vprev;
-                                       vertices[numtriangles*3+2] = vcurrent;
+                                       if(mod_obj_orientation.integer)
+                                       {
+                                               vertices[numtriangles*3+0] = vfirst;
+                                               vertices[numtriangles*3+1] = vprev;
+                                               vertices[numtriangles*3+2] = vcurrent;
+                                       }
+                                       else
+                                       {
+                                               vertices[numtriangles*3+0] = vfirst;
+                                               vertices[numtriangles*3+2] = vprev;
+                                               vertices[numtriangles*3+1] = vcurrent;
+                                       }
                                        numtriangles++;
                                }
                                vprev = vcurrent;