/* * R_LoadBspSurfaces */ static void R_LoadBspSurfaces(const d_bsp_lump_t *l) { const d_bsp_face_t *in; r_bsp_surface_t *out; int i, count, surf_num; int plane_num, side; int ti; in = (const void *) (mod_base + l->file_ofs); if (l->file_len % sizeof(*in)) { Com_Error(ERR_DROP, "R_LoadBspSurfaces: Funny lump size in %s.", r_load_model->name); } count = l->file_len / sizeof(*in); out = R_HunkAlloc(count * sizeof(*out)); r_load_model->surfaces = out; r_load_model->num_surfaces = count; R_BeginBuildingLightmaps(); for (surf_num = 0; surf_num < count; surf_num++, in++, out++) { out->first_edge = LittleLong(in->first_edge); out->num_edges = LittleShort(in->num_edges); // resolve plane plane_num = LittleShort(in->plane_num); out->plane = r_load_model->planes + plane_num; // and sidedness side = LittleShort(in->side); if (side) { out->flags |= R_SURF_SIDE_BACK; VectorNegate(out->plane->normal, out->normal); } else VectorCopy(out->plane->normal, out->normal); // then texinfo ti = LittleShort(in->texinfo); if (ti < 0 || ti >= r_load_model->num_texinfo) { Com_Error(ERR_DROP, "R_LoadBspSurfaces: Bad texinfo number: %d.", ti); } out->texinfo = r_load_model->texinfo + ti; if (!(out->texinfo->flags & (SURF_WARP | SURF_SKY))) out->flags |= R_SURF_LIGHTMAP; // and size, texcoords, etc R_SetupBspSurface(out); // lastly lighting info i = LittleLong(in->light_ofs); if (i != -1) out->samples = r_load_model->lightmap_data + i; else out->samples = NULL; // create lightmaps R_CreateSurfaceLightmap(out); // and flare R_CreateSurfaceFlare(out); } R_EndBuildingLightmaps(); }
/* * @brief Loads all r_bsp_surface_t for the specified BSP model. Lightmap and * deluxemap creation is driven by this function. */ static void R_LoadBspSurfaces(r_bsp_model_t *bsp, const d_bsp_lump_t *l) { r_bsp_surface_t *out; uint16_t i; const d_bsp_face_t *in = (const void *) (mod_base + l->file_ofs); if (l->file_len % sizeof(*in)) { Com_Error(ERR_DROP, "Funny lump size\n"); } bsp->num_surfaces = l->file_len / sizeof(*in); bsp->surfaces = out = Z_LinkMalloc(bsp->num_surfaces * sizeof(*out), bsp); R_BeginBspSurfaceLightmaps(bsp); for (i = 0; i < bsp->num_surfaces; i++, in++, out++) { out->first_edge = LittleLong(in->first_edge); out->num_edges = LittleShort(in->num_edges); // resolve plane const uint16_t plane_num = (uint16_t) LittleShort(in->plane_num); out->plane = bsp->planes + plane_num; // and sidedness const int16_t side = LittleShort(in->side); if (side) { out->flags |= R_SURF_SIDE_BACK; VectorNegate(out->plane->normal, out->normal); } else VectorCopy(out->plane->normal, out->normal); // then texinfo const uint16_t ti = LittleShort(in->texinfo); if (ti >= bsp->num_texinfo) { Com_Error(ERR_DROP, "Bad texinfo number: %d\n", ti); } out->texinfo = bsp->texinfo + ti; if (!(out->texinfo->flags & (SURF_WARP | SURF_SKY))) out->flags |= R_SURF_LIGHTMAP; // and size, texcoords, etc R_SetupBspSurface(bsp, out); // lastly lighting info const int32_t ofs = LittleLong(in->light_ofs); const byte *data = (ofs == -1) ? NULL : bsp->lightmaps->data + ofs; // to create the lightmap and deluxemap R_CreateBspSurfaceLightmap(bsp, out, data); // and flare R_CreateBspSurfaceFlare(bsp, out); } R_EndBspSurfaceLightmaps(bsp); // free the lightmap lump, we're done with it if (bsp->lightmaps->size) { Z_Free(bsp->lightmaps->data); bsp->lightmaps->size = 0; } }