add lite reading

png-branch
an 2019-02-19 22:04:16 -05:00
parent 76dd2160e7
commit 848d6f4c5c
3 changed files with 178 additions and 63 deletions

View File

@ -369,7 +369,9 @@ main menu, and physics files. Here is a listing of all chunks used within them:
| Name | Description | | Name | Description |
| ---- | ----------- | | ---- | ----------- |
| `Minf` | Static Map Info structure |
| `PNTS` | Array of Points | | `PNTS` | Array of Points |
| `EPNT` | Array of Endpoints |
| `LINS` | Array of Lines | | `LINS` | Array of Lines |
| `SIDS` | Array of Sides | | `SIDS` | Array of Sides |
| `POLY` | Array of Polygons | | `POLY` | Array of Polygons |
@ -377,11 +379,9 @@ main menu, and physics files. Here is a listing of all chunks used within them:
| `NOTE` | Not analyzed (annotations) | | `NOTE` | Not analyzed (annotations) |
| `OBJS` | Array of Objects | | `OBJS` | Array of Objects |
| `påth` | Not analyzed (å is $8C) (guardpaths) | | `påth` | Not analyzed (å is $8C) (guardpaths) |
| `Minf` | Static Map Info structure |
| `plac` | Not analyzed (item placement) | | `plac` | Not analyzed (item placement) |
| `door` | No test data (extra door data) | | `door` | No test data (extra door data) |
| `plat` | No test data (platform static data) | | `PLAT` | No test data (platform static data) |
| `EPNT` | Array of Endpoints |
| `medi` | Media (liquids) | | `medi` | Media (liquids) |
| `ambi` | Not analyzed (ambient sounds) | | `ambi` | Not analyzed (ambient sounds) |
| `bonk` | Not analyzed (random sounds) | | `bonk` | Not analyzed (random sounds) |
@ -554,17 +554,17 @@ If `WadVersion` is greater than or equal to `VerDir`:
### Light Function ### ### Light Function ###
Light Function is 14 bytes. A light function specification. Light Function is 14 bytes.
| Name | Type | Offset | | Name | Type | Offset |
| ---- | ---- | ------ | | ---- | ---- | ------ |
| `Index` | `u16` | `0` | | `Type` | `u16` | `0` |
| `Period` | `u16` | `2` | | `Period` | `u16` | `2` |
| `DeltaPeriod` | `u16` | `4` | | `DeltaPeriod` | `u16` | `4` |
| `ValueHi` | `u16` | `6` | | `Value` | `u16` | `6` |
| `ValueLo` | `u16` | `8` | | `DeltaValue` | `u16` | `10` |
| `DeltaValueHi` | `u16` | `10` |
| `DeltaValueLo` | `u16` | `12` | - `Type` is a Light Function enumeration.
### Side Texture ### ### Side Texture ###
@ -703,7 +703,7 @@ shape and automatically split them.)
| `OrigCei` | `struct` | `112` | | `OrigCei` | `struct` | `112` |
| `Media` | `u16` | `116` | | `Media` | `u16` | `116` |
| `MediaLight` | `u16` | `118` | | `MediaLight` | `u16` | `118` |
| `Sound` | `u16` | `120` | | `SoundIndices` | `u16` | `120` |
| `SoundAmbient` | `u16` | `122` | | `SoundAmbient` | `u16` | `122` |
| `SoundRandom` | `u16` | `124` | | `SoundRandom` | `u16` | `124` |
@ -712,8 +712,9 @@ shape and automatically split them.)
- `Area` is the power-of-two area of the polygon. - `Area` is the power-of-two area of the polygon.
- `ObjectFst` must be `65535`. - `ObjectFst` must be `65535`.
- `Center` is a Point structure. - `Center` is a Point structure.
- `OrigFlr` is a Point structure. - `OrigFlr` is a Point structure for the texture offset of the floor.
- `OrigCei` is a Point structure. - `OrigCei` is a Point structure for the texture offset of the ceiling.
- `Media` is an Object ID.
- `SoundAmbient` is an Object ID. - `SoundAmbient` is an Object ID.
- `SoundRandom` is an Object ID. - `SoundRandom` is an Object ID.
@ -734,6 +735,11 @@ Light is 100 bytes.
| `InactMid` | `struct` | `76` | | `InactMid` | `struct` | `76` |
| `Tag` | `u16` | `90` | | `Tag` | `u16` | `90` |
- `Type` is a Light Type enumeration.
- `Flags` is a Light Flags bit field.
- `ActivPri`, `ActivSec` and `ActivMid` are Light Function structures.
- `InactPri`, `InactSec` and `InactMid` are Light Function structures.
### Object ### ### Object ###
Object is 16 bytes. Object is 16 bytes.
@ -1398,9 +1404,9 @@ Marathon 2 itself acknowledges how redundant this enumeration is.
| Name | Value | Description | | Name | Value | Description |
| ---- | ----- | ----------- | | ---- | ----- | ----------- |
| TODO | `0` | Normal light | | `Normal` | `0` | Normal light |
| TODO | `1` | Strobe light | | `Strobe` | `1` | Strobe light |
| TODO | `2` | Media light | | `Media` | `2` | Media light |
### Wad Version ### ### Wad Version ###
@ -1488,6 +1494,20 @@ fall off at 10 world units unobstructed.
full volume for twice the distance as a normal sound, and fall off at 15 units full volume for twice the distance as a normal sound, and fall off at 15 units
unobstructed. unobstructed.
### Light Function ###
| Name | Value |
| ---- | ----- |
| `Constant` | `0` |
| `Linear` | `1` |
| `Smooth` | `2` |
| `Flicker` | `3` |
- `Constant` maintains the final intensity for `Period`.
- `Linear` transitions between the initial and final intensities over `Period`.
- `Smooth` does a sine transition in the same fashion as `Linear`.
- `Flicker` flickers between a random smoothed intensity and the final one.
# FLAGS ####################################################################### # FLAGS #######################################################################
### Endpoint Flags ### ### Endpoint Flags ###
@ -1619,8 +1639,9 @@ gravity.
| Name | Bit | | Name | Bit |
| ---- | --- | | ---- | --- |
| TODO | `0` | | `InitActive` | `0` |
| `Stateless` | `1` | | `SlaveValue` | `1` |
| `Stateless` | `2` |
### Entry Point Flags ### ### Entry Point Flags ###

View File

@ -53,6 +53,7 @@ fn dump_chunk(opt: &Options, cid: Ident, cnk: &[u8], eid: u16) -> ResultS<()>
b"LINS" => make_yaml(opt, &rd_array(cnk, map::read_lins)?)?, b"LINS" => make_yaml(opt, &rd_array(cnk, map::read_lins)?)?,
b"SIDS" => make_yaml(opt, &rd_array(cnk, map::read_sids)?)?, b"SIDS" => make_yaml(opt, &rd_array(cnk, map::read_sids)?)?,
b"POLY" => make_yaml(opt, &rd_array(cnk, map::read_poly)?)?, b"POLY" => make_yaml(opt, &rd_array(cnk, map::read_poly)?)?,
b"LITE" => make_yaml(opt, &rd_array(cnk, map::read_lite)?)?,
b"term" => make_yaml(opt, &rd_array(cnk, trm::read_term)?)?, b"term" => make_yaml(opt, &rd_array(cnk, trm::read_term)?)?,
_ => (), _ => (),
} }

View File

@ -25,6 +25,22 @@ pub fn read_minf(b: &[u8]) -> ResultS<Minf>
levelnam}) levelnam})
} }
pub fn read_lightfunc(b: &[u8]) -> ResultS<LightFunc>
{
read_data! {
14, BE in b =>
ftype = u16[0];
prd_nrm = u16[2];
prd_dta = u16[4];
val_nrm = u16[6];
val_dta = u16[10];
}
let ftype = LightFuncType::from_repr(ftype)?;
Ok(LightFunc{ftype, prd_nrm, prd_dta, val_nrm, val_dta})
}
pub fn read_sidetex(b: &[u8]) -> ResultS<SideTex> pub fn read_sidetex(b: &[u8]) -> ResultS<SideTex>
{ {
read_data! { read_data! {
@ -119,7 +135,6 @@ pub fn read_poly(b: &[u8]) -> ResultS<(Polygon, usize)>
read_data! { read_data! {
128, BE in b => 128, BE in b =>
ptype = u16[0]; ptype = u16[0];
flags = u16[2];
pdata = i16[4]; pdata = i16[4];
tex_flr = u16[40]; tex_flr = u16[40];
tex_cei = u16[42]; tex_cei = u16[42];
@ -131,14 +146,13 @@ pub fn read_poly(b: &[u8]) -> ResultS<(Polygon, usize)>
xfr_cei = u16[66]; xfr_cei = u16[66];
ori_flr = read_point[108..112]; ori_flr = read_point[108..112];
ori_cei = read_point[112..116]; ori_cei = read_point[112..116];
media = u16[116]; med_ind = u16[116];
media_l = u16[118]; med_ctl = u16[118];
sound = u16[120]; snd_ind = u16[120];
snd_amb = u16[122]; snd_amb = u16[122];
snd_rnd = u16[124]; snd_rnd = u16[124];
} }
let flags = ok!(PolyFlags::from_bits(flags), "bad PolyFlags")?;
let xfr_flr = TransferMode::from_repr(xfr_flr)?; let xfr_flr = TransferMode::from_repr(xfr_flr)?;
let xfr_cei = TransferMode::from_repr(xfr_cei)?; let xfr_cei = TransferMode::from_repr(xfr_cei)?;
let ptype = PolyType::from_repr(ptype)?; let ptype = PolyType::from_repr(ptype)?;
@ -146,12 +160,36 @@ pub fn read_poly(b: &[u8]) -> ResultS<(Polygon, usize)>
let tex_cei = ObjID::from_repr(tex_cei); let tex_cei = ObjID::from_repr(tex_cei);
let snd_amb = ObjID::from_repr(snd_amb); let snd_amb = ObjID::from_repr(snd_amb);
let snd_rnd = ObjID::from_repr(snd_rnd); let snd_rnd = ObjID::from_repr(snd_rnd);
let med_ind = ObjID::from_repr(med_ind);
let hei_flr = Unit::from_bits(hei_flr); let hei_flr = Unit::from_bits(hei_flr);
let hei_cei = Unit::from_bits(hei_cei); let hei_cei = Unit::from_bits(hei_cei);
Ok((Polygon{ptype, flags, pdata, tex_flr, tex_cei, hei_flr, hei_cei, Ok((Polygon{ptype, pdata, tex_flr, tex_cei, hei_flr, hei_cei, lit_flr,
lit_flr, lit_cei, xfr_flr, xfr_cei, ori_flr, ori_cei, media, lit_cei, xfr_flr, xfr_cei, ori_flr, ori_cei, med_ind, med_ctl,
media_l, sound, snd_amb, snd_rnd}, 128)) snd_ind, snd_amb, snd_rnd}, 128))
}
pub fn read_lite(b: &[u8]) -> ResultS<(Light, usize)>
{
read_data! {
100, BE in b =>
ltype = u16[0];
flags = u16[2];
phase = i16[4];
act_pri = read_lightfunc[6..20];
act_sec = read_lightfunc[20..34];
act_mid = read_lightfunc[34..48];
ina_pri = read_lightfunc[48..62];
ina_sec = read_lightfunc[62..76];
ina_mid = read_lightfunc[76..90];
tag = u16[90];
}
let flags = ok!(LightFlags::from_bits(flags), "bad LightFlags")?;
let ltype = LightType::from_repr(ltype)?;
Ok((Light{ltype, flags, phase, act_pri, act_sec, act_mid, ina_pri, ina_sec,
ina_mid, tag}, 100))
} }
#[derive(Clone, PartialEq, Serialize)] #[derive(Clone, PartialEq, Serialize)]
@ -164,59 +202,83 @@ pub struct Point
#[derive(Debug, Serialize)] #[derive(Debug, Serialize)]
pub struct Line pub struct Line
{ {
flags: LineFlags, pub flags: LineFlags,
pnt_beg: u16, pub pnt_beg: u16,
pnt_end: u16, pub pnt_end: u16,
side_fr: ObjID, pub side_fr: ObjID,
side_bk: ObjID, pub side_bk: ObjID,
poly_fr: ObjID, pub poly_fr: ObjID,
poly_bk: ObjID, pub poly_bk: ObjID,
} }
#[derive(Debug, Serialize)] #[derive(Debug, Serialize)]
pub struct SideTex pub struct SideTex
{ {
offs: Point, pub offs: Point,
tex_id: ObjID, pub tex_id: ObjID,
} }
#[derive(Debug, Serialize)] #[derive(Debug, Serialize)]
pub struct Side pub struct Side
{ {
stype: SideType, pub stype: SideType,
flags: SideFlags, pub flags: SideFlags,
tex_pri: SideTex, pub tex_pri: SideTex,
tex_sec: SideTex, pub tex_sec: SideTex,
tex_tra: SideTex, pub tex_tra: SideTex,
paneltyp: u16, pub paneltyp: u16,
paneldat: i16, pub paneldat: i16,
xfer_pri: TransferMode, pub xfer_pri: TransferMode,
xfer_sec: TransferMode, pub xfer_sec: TransferMode,
xfer_tra: TransferMode, pub xfer_tra: TransferMode,
shade: Fixed, pub shade: Fixed,
} }
#[derive(Debug, Serialize)] #[derive(Debug, Serialize)]
pub struct Polygon pub struct Polygon
{ {
ptype: PolyType, pub ptype: PolyType,
flags: PolyFlags, pub pdata: i16,
pdata: i16, pub tex_flr: ObjID,
tex_flr: ObjID, pub tex_cei: ObjID,
tex_cei: ObjID, pub hei_flr: Unit,
hei_flr: Unit, pub hei_cei: Unit,
hei_cei: Unit, pub lit_flr: u16,
lit_flr: u16, pub lit_cei: u16,
lit_cei: u16, pub xfr_flr: TransferMode,
xfr_flr: TransferMode, pub xfr_cei: TransferMode,
xfr_cei: TransferMode, pub ori_flr: Point,
ori_flr: Point, pub ori_cei: Point,
ori_cei: Point, pub med_ind: ObjID,
media: u16, pub med_ctl: u16,
media_l: u16, pub snd_ind: u16,
sound: u16, pub snd_amb: ObjID,
snd_amb: ObjID, pub snd_rnd: ObjID,
snd_rnd: ObjID, }
#[derive(Debug, Serialize)]
pub struct LightFunc
{
pub ftype: LightFuncType,
pub prd_nrm: u16,
pub prd_dta: u16,
pub val_nrm: u16,
pub val_dta: u16,
}
#[derive(Debug, Serialize)]
pub struct Light
{
pub ltype: LightType,
pub flags: LightFlags,
pub phase: i16,
pub act_pri: LightFunc,
pub act_sec: LightFunc,
pub act_mid: LightFunc,
pub ina_pri: LightFunc,
pub ina_sec: LightFunc,
pub ina_mid: LightFunc,
pub tag: u16,
} }
#[derive(Debug, PartialEq, Serialize)] #[derive(Debug, PartialEq, Serialize)]
@ -314,6 +376,16 @@ bitflags! {
} }
} }
bitflags! {
#[derive(Serialize)]
pub struct LightFlags: u16
{
const InitActive = 1;
const SlaveValue = 1 << 1;
const Stateless = 1 << 2;
}
}
c_enum! { c_enum! {
#[derive(Debug, Serialize)] #[derive(Debug, Serialize)]
pub enum SideType: u16 pub enum SideType: u16
@ -352,6 +424,27 @@ c_enum! {
} }
} }
c_enum! {
#[derive(Debug, Serialize)]
pub enum LightFuncType: u16
{
0 => Constant,
1 => Linear,
2 => Smooth,
3 => Flicker,
}
}
c_enum! {
#[derive(Debug, Serialize)]
pub enum LightType: u16
{
0 => Normal,
1 => Strobe,
2 => Media,
}
}
impl fmt::Debug for Point impl fmt::Debug for Point
{ {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result