diff --git a/engine/client/wad.c b/engine/client/wad.c index 54e97d814..6bb2530c4 100644 --- a/engine/client/wad.c +++ b/engine/client/wad.c @@ -930,18 +930,17 @@ void Mod_ParseInfoFromEntityLump(model_t *wmodel) //actually, this should be in else if (!strcmp("skyaxis", key)) //q2 feature { char *s; - Q_strncpyz(key, token, sizeof(key)); - s = COM_ParseOut(key, token, sizeof(token)); + s = COM_ParseOut(token, key, sizeof(key)); if (s) { - cl.skyaxis[0] = atof(s); - s = COM_ParseOut(s, token, sizeof(token)); + cl.skyaxis[0] = atof(key); + s = COM_ParseOut(s, key, sizeof(key)); if (s) { - cl.skyaxis[1] = atof(s); - COM_ParseOut(s, token, sizeof(token)); + cl.skyaxis[1] = atof(key); + COM_ParseOut(s, key, sizeof(key)); if (s) - cl.skyaxis[2] = atof(s); + cl.skyaxis[2] = atof(key); } } } diff --git a/engine/common/gl_q2bsp.c b/engine/common/gl_q2bsp.c index d93fd3c2c..2401e8bdc 100644 --- a/engine/common/gl_q2bsp.c +++ b/engine/common/gl_q2bsp.c @@ -1668,6 +1668,9 @@ static qboolean CModQ2_LoadFaces (model_t *mod, qbyte *mod_base, lump_t *l, lump int ti; int style; + struct decoupled_lm_info_s *decoupledlm; + unsigned int dcsize, lofs; + unsigned short lmshift, lmscale; char buf[64]; lightmapoverrides_t overrides = {0}; @@ -1700,6 +1703,12 @@ static qboolean CModQ2_LoadFaces (model_t *mod, qbyte *mod_base, lump_t *l, lump } } + decoupledlm = BSPX_FindLump(bspx, mod_base, "DECOUPLED_LM", &dcsize); //RGB packed data + if (dcsize == count*sizeof(*decoupledlm)) + mod->facelmvecs = ZG_Malloc(&mod->memgroup, count * sizeof(*mod->facelmvecs)); //seems good. + else + decoupledlm = NULL; //wrong size somehow... discard it. + for ( surfnum=0 ; surfnumfirstedge = LittleLong(in->firstedge); @@ -1736,11 +1745,40 @@ static qboolean CModQ2_LoadFaces (model_t *mod, qbyte *mod_base, lump_t *l, lump out->lmshift = overrides.shifts[surfnum]; else out->lmshift = lmshift; - CalcSurfaceExtents (mod, out); - if (overrides.extents) + + + if (decoupledlm) { - out->extents[0] = overrides.extents[surfnum*2+0]; - out->extents[1] = overrides.extents[surfnum*2+1]; + lofs = LittleLong(decoupledlm->lmoffset); + out->texturemins[0] = out->texturemins[1] = 0; // should be handled by the now-per-surface vecs[][3] value. + out->lmshift = 0; //redundant. + out->extents[0] = (unsigned short)LittleShort(decoupledlm->lmsize[0]) - 1; + out->extents[1] = (unsigned short)LittleShort(decoupledlm->lmsize[1]) - 1; + mod->facelmvecs[surfnum].lmvecs[0][0] = LittleFloat(decoupledlm->lmvecs[0][0]); + mod->facelmvecs[surfnum].lmvecs[0][1] = LittleFloat(decoupledlm->lmvecs[0][1]); + mod->facelmvecs[surfnum].lmvecs[0][2] = LittleFloat(decoupledlm->lmvecs[0][2]); + mod->facelmvecs[surfnum].lmvecs[0][3] = LittleFloat(decoupledlm->lmvecs[0][3]) + 0.5f; //sigh + mod->facelmvecs[surfnum].lmvecs[1][0] = LittleFloat(decoupledlm->lmvecs[1][0]); + mod->facelmvecs[surfnum].lmvecs[1][1] = LittleFloat(decoupledlm->lmvecs[1][1]); + mod->facelmvecs[surfnum].lmvecs[1][2] = LittleFloat(decoupledlm->lmvecs[1][2]); + mod->facelmvecs[surfnum].lmvecs[1][3] = LittleFloat(decoupledlm->lmvecs[1][3]) + 0.5f; //sigh + mod->facelmvecs[surfnum].lmvecscale[0] = 1.0f/Length(mod->facelmvecs[surfnum].lmvecs[0]); //luxels->qu + mod->facelmvecs[surfnum].lmvecscale[1] = 1.0f/Length(mod->facelmvecs[surfnum].lmvecs[1]); + decoupledlm++; + } + else + { + if (overrides.offsets) + lofs = overrides.offsets[surfnum]; + else + lofs = LittleLong(in->lightofs); + + CalcSurfaceExtents (mod, out); + if (overrides.extents) + { + out->extents[0] = overrides.extents[surfnum*2+0]; + out->extents[1] = overrides.extents[surfnum*2+1]; + } } // lighting info @@ -1782,16 +1820,12 @@ static qboolean CModQ2_LoadFaces (model_t *mod, qbyte *mod_base, lump_t *l, lump } for ( ; istyles[i] = INVALID_LIGHTSTYLE; - if (overrides.offsets) - i = overrides.offsets[surfnum]; - else - i = LittleLong(in->lightofs); - if (i == -1) + if (lofs == ~0u) out->samples = NULL; else if (lightofsisdouble) - out->samples = mod->lightdata + (i/2); + out->samples = mod->lightdata + (lofs/2); else - out->samples = mod->lightdata + i; + out->samples = mod->lightdata + lofs; // set the drawing flags @@ -4924,7 +4958,7 @@ static cmodel_t *CM_LoadMap (model_t *mod, qbyte *filein, size_t filelen, qboole header.lumps[i].fileofs = LittleLong (header.lumps[i].fileofs); i++; } - BSPX_Setup(mod, mod_base, filelen, header.lumps, i); + bspx = BSPX_Setup(mod, mod_base, filelen, header.lumps, i); #if defined(HAVE_CLIENT) && defined(IMAGEFMT_PCX) if (CM_GetQ2Palette()) @@ -4985,8 +5019,7 @@ static cmodel_t *CM_LoadMap (model_t *mod, qbyte *filein, size_t filelen, qboole if (noerrors) Mod_LoadEntities (mod, mod_base, &header.lumps[Q2LUMP_ENTITIES]); noerrors = noerrors && CModQ2_LoadFaces (mod, mod_base, &header.lumps[Q2LUMP_FACES], &header.lumps[Q2LUMP_LIGHTING], header.version == BSPVERSION_Q2W, bspx); - if (header.version == BSPVERSION_Q2W) - /*noerrors = noerrors &&*/ Mod_LoadVertexNormals(mod, bspx, mod_base, &header.lumps[19]); + Mod_LoadVertexNormals(mod, bspx, mod_base, (header.version == BSPVERSION_Q2W)?&header.lumps[19]:NULL); noerrors = noerrors && Mod_LoadMarksurfaces (mod, mod_base, &header.lumps[Q2LUMP_LEAFFACES], false); noerrors = noerrors && CModQ2_LoadVisibility (mod, mod_base, &header.lumps[Q2LUMP_VISIBILITY]); noerrors = noerrors && CModQ2_LoadBrushSides (mod, mod_base, &header.lumps[Q2LUMP_BRUSHSIDES]); diff --git a/engine/common/q1bsp.c b/engine/common/q1bsp.c index dca0c6f8e..98381f978 100644 --- a/engine/common/q1bsp.c +++ b/engine/common/q1bsp.c @@ -2932,6 +2932,9 @@ qboolean Mod_BSPXRW_Read(struct bspxrw *ctx, const char *fname) ,"lightgrididx" #endif }; +#endif +#ifdef Q2BSPS + static const char *q2corelumpnames[Q2HEADER_LUMPS] = {"entities","planes","vertexes","visibility","nodes","texinfo","faces","lighting","leafs","leaffaces","leafbrushes","edges","surfedges","models","brushes","brushsides","pop","areas","areaportals"}; #endif static const char *q1corelumpnames[HEADER_LUMPS] = {"entities","planes","textures","vertexes","visibility","nodes","texinfo","faces","lighting","clipnodes","leafs","marksurfaces","edges","surfedges","models"}; ctx->fname = fname; @@ -2961,6 +2964,7 @@ qboolean Mod_BSPXRW_Read(struct bspxrw *ctx, const char *fname) // case BSPVERSION_Q2W: ctx->fg = fg_quake2; ctx->corelumps = Q2HEADER_LUMPS; + corelumpnames = q2corelumpnames; break; #endif #ifdef Q3BSPS