aboutsummaryrefslogtreecommitdiff
path: root/stockton-levels/src/traits/textures.rs
diff options
context:
space:
mode:
Diffstat (limited to 'stockton-levels/src/traits/textures.rs')
-rw-r--r--stockton-levels/src/traits/textures.rs149
1 files changed, 149 insertions, 0 deletions
diff --git a/stockton-levels/src/traits/textures.rs b/stockton-levels/src/traits/textures.rs
new file mode 100644
index 0000000..d1a2a83
--- /dev/null
+++ b/stockton-levels/src/traits/textures.rs
@@ -0,0 +1,149 @@
+// Copyright (C) Oscar Shrimpton 2019
+
+// 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 <http://www.gnu.org/licenses/>.
+
+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<'a> {
+ type TexturesIter: Iterator<Item = &'a Texture>;
+
+ fn textures_iter(&'a self) -> Self::TexturesIter;
+}