/* * Copyright (C) Oscar Shrimpton 2020 * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 3 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ // This program is free software: you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the Free // Software Foundation, either version 3 of the License, or (at your option) // any later version. // This program is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for // more details. // You should have received a copy of the GNU General Public License along // with this program. If not, see . use std::iter::Iterator; #[derive(Debug, Clone, PartialEq)] /// A texture from a BSP File. pub struct Texture { pub name: String, pub surface: SurfaceFlags, pub contents: ContentsFlags, } bitflags!( /// Extracted from the Q3 arena engine code. /// https://github.com/id-Software/Quake-III-Arena/blob/master/code/game/surfaceflags.h pub struct SurfaceFlags: u32 { /// never give falling damage const NO_DAMAGE = 0x1; /// affects game physics const SLICK = 0x2; /// lighting from environment map const SKY = 0x4; /// don't make missile explosions const NO_IMPACT = 0x10; /// function as a ladder const LADDER = 0x8; /// don't leave missile marks const NO_MARKS = 0x20; /// make flesh sounds and effects const FLESH = 0x40; /// don't generate a drawsurface at all const NODRAW = 0x80; /// make a primary bsp splitter const HINT = 0x01_00; /// completely ignore, allowing non-closed brushes const SKIP = 0x02_00; /// surface doesn't need a lightmap const NO_LIGHT_MAP = 0x04_00; /// generate lighting info at vertexes const POINT_LIGHT = 0x08_00; /// clanking footsteps const METAL_STEPS = 0x10_00; /// no footstep sounds const NO_STEPS = 0x20_00; /// don't collide against curves with this set const NON_SOLID = 0x40_00; /// act as a light filter during q3map -light const LIGHT_FILTER = 0x80_00; /// do per-pixel light shadow casting in q3map const ALPHA_SHADOW = 0x01_00_00; /// don't dlight even if solid (solid lava, skies) const NO_DLIGHT = 0x02_00_00; /// leave a dust trail when walking on this surface const DUST = 0x04_00_00; } ); bitflags!( /// Extracted from the Q3 arena engine code. Less documented than `SurfaceFlags`. /// https://github.com/id-Software/Quake-III-Arena/blob/master/code/game/surfaceflags.h pub struct ContentsFlags: u32 { // an eye is never valid in a solid const SOLID = 0x1; const LAVA = 0x8; const SLIME = 0x10; const WATER = 0x20; const FOG = 0x40; const NOT_TEAM1 = 0x00_80; const NOT_TEAM2 = 0x01_00; const NOT_BOT_CLIP = 0x02_00; const AREA_PORTAL = 0x80_00; /// bot specific contents type const PLAYER_CLIP = 0x01_00_00; /// bot specific contents type const MONSTER_CLIP = 0x02_00_00; const TELEPORTER = 0x04_00_00; const JUMP_PAD = 0x08_00_00; const CLUSTER_PORTAL = 0x10_00_00; const DO_NOT_ENTER = 0x20_00_00; const BOT_CLIP = 0x40_00_00; const MOVER = 0x80_00_00; // removed before bsping an entity const ORIGIN = 0x01_00_00_00; // should never be on a brush, only in game const BODY = 0x02_00_00_00; /// brush not used for the bsp const DETAIL = 0x08_00_00_00; /// brush not used for the bsp const CORPSE = 0x04_00_00_00; /// brushes used for the bsp const STRUCTURAL = 0x10_00_00_00; /// don't consume surface fragments inside const TRANSLUCENT = 0x20_00_00_00; const TRIGGER = 0x40_00_00_00; /// don't leave bodies or items (death fog, lava) const NODROP = 0x80_00_00_00; } ); pub trait HasTextures { type TexturesIter<'a>: Iterator; fn textures_iter(&self) -> Self::TexturesIter<'_>; fn get_texture(&self, idx: u32) -> Option<&Texture>; }