/* ** 2012 June 2 ** ** The author disclaims copyright to this source code. In place of ** a legal notice, here is a blessing: ** May you do good and not evil. ** May you find forgiveness for yourself and forgive others. ** May you share freely, never taking more than you give. */ package info.ata4.bspsrc.modules; import info.ata4.bsplib.BspFileReader; import info.ata4.bsplib.lump.LumpType; import info.ata4.bsplib.struct.LevelFlag; import info.ata4.log.LogUtils; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import org.apache.commons.compress.archivers.zip.ZipArchiveEntry; import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream; /** * * @author Nico Bergemann <barracuda415 at yahoo.de> */ public class BspCompileParams extends ModuleRead { private static final Logger L = LogUtils.getLogger(); private List<String> vbspParams = new ArrayList<>(); private List<String> vvisParams = new ArrayList<>(); private List<String> vradParams = new ArrayList<>(); private boolean vvisRun = false; private boolean vradRun = false; public BspCompileParams(BspFileReader reader) { super(reader); reader.loadFlags(); boolean stale = false; boolean hasVhv = false; try (ZipArchiveInputStream zis = bspFile.getPakFile().getArchiveInputStream()) { ZipArchiveEntry ze; while ((ze = zis.getNextZipEntry()) != null) { // check for stale.txt, which marks possibly screwed up maps if (ze.getName().equals("stale.txt")) { stale = true; } // check for .vhv files, which contain the vertex lighting data if (ze.getName().endsWith(".vhv")) { hasVhv = true; } if (stale && hasVhv) { // we're done here break; } } } catch (IOException ex) { L.log(Level.WARNING, "Couldn''t read pakfile", ex); } // both parameters produce marked files, there's probably no way to // distinguish them if (stale) { vbspParams.add("-onlyents/-keepstalezip"); } // check for an empty visibility lump vvisRun = bspFile.getLump(LumpType.LUMP_VISIBILITY).getLength() > 0; boolean sprpLight = false; // also check the map flags, if available if (bsp.mapFlags != null) { sprpLight = bsp.mapFlags.contains(LevelFlag.LVLFLAGS_BAKED_STATIC_PROP_LIGHTING_HDR) || bsp.mapFlags.contains(LevelFlag.LVLFLAGS_BAKED_STATIC_PROP_LIGHTING_NONHDR); } // check both lighting lumps if they're non-empty boolean ldr = bspFile.getLump(LumpType.LUMP_LIGHTING).getLength() > 0; boolean hdr = bspFile.getLump(LumpType.LUMP_LIGHTING_HDR).getLength() > 0; vradRun = ldr || hdr; if (vradRun) { if (ldr && hdr) { vradParams.add("-both"); } else if (ldr) { vradParams.add("-ldr"); } else if (hdr) { vradParams.add("-hdr"); } else { // no lighting? } if (sprpLight || hasVhv) { vradParams.add("-StaticPropLighting"); } } } public List<String> getVbspParams() { return Collections.unmodifiableList(vbspParams); } public List<String> getVvisParams() { return Collections.unmodifiableList(vvisParams); } public List<String> getVradParams() { return Collections.unmodifiableList(vradParams); } public boolean isVvisRun() { return vvisRun; } public boolean isVradRun() { return vradRun; } }