PHYS: Difference between revisions
m (→PHYS) |
mNo edit summary |
||
Line 39: | Line 39: | ||
Loading is partially backwards compatible and fills up with default values if loading older versions. Since version 2* it no longer reuses chunk identifiers but has separate identifiers for versions (BDY2, SHP2, WLJ2). It still is able to parse old ones, and fills up with defaults. | Loading is partially backwards compatible and fills up with default values if loading older versions. Since version 2* it no longer reuses chunk identifiers but has separate identifiers for versions (BDY2, SHP2, WLJ2). It still is able to parse old ones, and fills up with defaults. | ||
=BODY, BDY2= | =BODY, BDY2, BDY3, BDY4= | ||
struct | struct | ||
{ | { | ||
/*0x00*/ unsigned short type; // maps to dmBodyDef type enum. 0 -> 1, 1 -> 0 = dm_dynamicBody, * -> 2. Only one should be of type 0 (root). possibly only 0 and 1. | |||
/*0x02*/ char PADDING_a[2]; | |||
/*0x04*/ vec3 position; | |||
/*0x10*/ unsigned short modelBoneIndex; | |||
/*0x12*/ char PADDING_b[2]; | |||
/*0x14*/ int shapes_base; // starting at shapes[shapes_base] | |||
/*0x18*/ int shapes_count; // shapes_count shapes are in this body. | |||
#if version >= 2 | #if version >= {{Template:Unverified|2}} // BDY2 | ||
/*0x1c*/ float _x1c; // default 1.0 | |||
#endif | |||
#if version >= {{Template:Unverified|3}} // BDY3 | |||
/*0x20*/ char unk_20[0x0c]; | |||
#endif | |||
#if version >= {{Template:Unverified|4}} // BDY4 | |||
/*0x2c*/ char unk_2c[0x04]; | |||
#endif | #endif | ||
} bodies[]; | } bodies[]; | ||
Line 57: | Line 63: | ||
struct | struct | ||
{ | { | ||
/*0x00*/ short shapeType; // 0 -> box, 1 -> capsule, 2 -> sphere | |||
/*0x02*/ short shapeIndex; // into the corresponding chunk | |||
/*0x04*/ char unk[4]; | |||
/*0x08*/ float friction; | |||
/*0x0c*/ float restitution; | |||
/*0x10*/ float density; | |||
#if version >= 2 | #if version >= 2 | ||
/*0x14*/ uint32_t _x14; // default 0 | |||
/*0x18*/ float _x18; // default 1.0 | |||
/*0x1c*/ uint16_t _x1c; // default 0 | |||
/*0x1e*/ uint16_t _x1e; // no default, padding? | |||
#endif | #endif | ||
} shapes[]; | } shapes[]; | ||
Line 74: | Line 80: | ||
struct BOXSEntry | struct BOXSEntry | ||
{ | { | ||
/*0x00*/ mat3x4 a; | |||
/*0x30*/ vec3 c; | |||
} boxShapes[]; | } boxShapes[]; | ||
Line 117: | Line 123: | ||
struct | struct | ||
{ | { | ||
/*0x00*/ mat3x4 frameA; | |||
/*0x30*/ mat3x4 frameB; | |||
/*0x60*/ float frequency; | |||
/*0x64*/ float dampingRatio; | |||
#if version >= 2 | #if version >= 2 | ||
/*0x68*/ uint32_t _x68; // default 0 | |||
/*0x6c*/ uint32_t _x6c; // default 0 | |||
#endif | #endif | ||
} weldJoints[]; | } weldJoints[]; | ||
Line 145: | Line 151: | ||
float coneAngle; | float coneAngle; | ||
#if version >= 2 | #if version >= 2 | ||
char _x6c[8]; // NO BACKWARDS COMPATIBILITY as of {{Template:Sandbox/PrettyVersion|expansionlevel=7|build=7.0.1.20979}} and {{Template:Sandbox/PrettyVersion|expansionlevel=7|build=7.0. | char _x6c[8]; // NO BACKWARDS COMPATIBILITY as of {{Template:Sandbox/PrettyVersion|expansionlevel=7|build=7.0.1.20979}} and {{Template:Sandbox/PrettyVersion|expansionlevel=7|build=7.3.0.24931}}! client always assumes new size! | ||
#endif | #endif | ||
} shoulderJoints[]; | } shoulderJoints[]; | ||
Line 180: | Line 186: | ||
{{Template:SectionBox/VersionRange|min_expansionlevel=7|min_build=7.0.1.20773}} | {{Template:SectionBox/VersionRange|min_expansionlevel=7|min_build=7.0.1.20773}} | ||
uint32_t phyt; // default: 0 | uint32_t phyt; // default: 0 | ||
=PLYT (version ???>=3)= | |||
[[Category:Format]] | [[Category:Format]] |
Revision as of 00:25, 1 September 2017
.phys files are chunked. The files are used by Blizzard's Domino physics engine which got added to WoW in the fourth expansion (MoP). In build (5.0.1.15464), there is one .phys file "item/objectcomponents/waist/buckle_panstart_a_01.phys". .phys files are an extension to M2s. The M2 requests a .phys file to be loaded by having GlobalModelFlags & 0x20 set.
The main PHYS chunk is followed by an unordered sequence of unique chunks of the other types.
// vec*: * floats // mat*x*: * times * floats.
- 1 phys
- n body
- n shapes
- 1 box
- 1 capsule
- 1 sphere
- 1 (tree mesh [*])
- 1 (height field [*])
- n shapes
- n joints
- 1 weld
- 1 spherical
- 1 shoulder
- 1 (mouse [*])
- 1 distance (version 2+)
- 1 revolute (version 2+)
- 1 prismatic (version 2+)
[*] supported by domino, but not available in wow
One body is connected to one bone. Bodies are connected via joints. A joint is of type weld, spherical or shoulder. A body is constructed out of shapes. A shape is a box, capsule or sphere.
PHYS
short version; // since (5.0.1.15???): 0 // since (7.0.1.20773): 1 // since (7.0.1.20979): 2 // since (7.0.1.21063): 2* -- not a different version in file or client parsing, but changed semantics and chunk names // since 7.0.1.21063 < ??? <= 7.3.0.24931ᵘ: 3 // since 7.0.1.21063 < ??? <= 7.3.0.24931ᵘ: 4 // since 7.0.1.21063 < ??? <= 7.3.0.24931ᵘ: 5
Loading is partially backwards compatible and fills up with default values if loading older versions. Since version 2* it no longer reuses chunk identifiers but has separate identifiers for versions (BDY2, SHP2, WLJ2). It still is able to parse old ones, and fills up with defaults.
BODY, BDY2, BDY3, BDY4
struct { /*0x00*/ unsigned short type; // maps to dmBodyDef type enum. 0 -> 1, 1 -> 0 = dm_dynamicBody, * -> 2. Only one should be of type 0 (root). possibly only 0 and 1. /*0x02*/ char PADDING_a[2]; /*0x04*/ vec3 position; /*0x10*/ unsigned short modelBoneIndex; /*0x12*/ char PADDING_b[2]; /*0x14*/ int shapes_base; // starting at shapes[shapes_base] /*0x18*/ int shapes_count; // shapes_count shapes are in this body. #if version >= 2ᵘ // BDY2 /*0x1c*/ float _x1c; // default 1.0 #endif #if version >= 3ᵘ // BDY3 /*0x20*/ char unk_20[0x0c]; #endif #if version >= 4ᵘ // BDY4 /*0x2c*/ char unk_2c[0x04]; #endif } bodies[];
SHAP, SHP2
struct { /*0x00*/ short shapeType; // 0 -> box, 1 -> capsule, 2 -> sphere /*0x02*/ short shapeIndex; // into the corresponding chunk /*0x04*/ char unk[4]; /*0x08*/ float friction; /*0x0c*/ float restitution; /*0x10*/ float density; #if version >= 2 /*0x14*/ uint32_t _x14; // default 0 /*0x18*/ float _x18; // default 1.0 /*0x1c*/ uint16_t _x1c; // default 0 /*0x1e*/ uint16_t _x1e; // no default, padding? #endif } shapes[];
BOXS
struct BOXSEntry { /*0x00*/ mat3x4 a; /*0x30*/ vec3 c; } boxShapes[];
CAPS
struct CAPSEntry { vec3 localPosition1; vec3 localPosition2; float radius; } capsuleShapes[];
SPHS
struct SPHSEntry { vec3 localPosition; float radius; } sphereShapes[];
JOIN
struct JOINEntry { unsigned int bodyAIdx; unsigned int bodyBIdx; char unk[4]; enum { sphericalJoint = 0, shoulderJoint = 1, weldJoint = 2, #if version >= 2 revoluteJoint = 3, prismaticJoint = 4, distanceJoint = 5, #endif }; short jointType; short jointId; // reference into the corresponding chunk entries. } joints[];
WELJ, WLJ2
struct { /*0x00*/ mat3x4 frameA; /*0x30*/ mat3x4 frameB; /*0x60*/ float frequency; /*0x64*/ float dampingRatio; #if version >= 2 /*0x68*/ uint32_t _x68; // default 0 /*0x6c*/ uint32_t _x6c; // default 0 #endif } weldJoints[];
SPHJ
struct SPHJEntry { vec3 anchorA; vec3 anchorB; float frictionTorque; } sphericalJointEntries[];
SHOJ
Note that even though this chunk is handled differently since version 2, it does not have a version 2* chunk name.
struct SHOJEntry { mat3x4 frameA; mat3x4 frameB; float lowerTwistAngle; float upperTwistAngle; float coneAngle; #if version >= 2 char _x6c[8]; // NO BACKWARDS COMPATIBILITY as of (7.0.1.20979) and (7.3.0.24931)! client always assumes new size! #endif } shoulderJoints[];
PRSJ (version 2+)
struct { char _unk[0x78]; } prismaticJoints[];
REVJ (version 2+)
struct { char _unk[0x70]; } revoluteJoints[];
DSTJ (version 2+)
struct { char _unk[0x1c]; } distanceJoints[];
PHYV (version 1+)
struct { float _unk[0x6]; } phyv[];
PHYT (version 1+)
uint32_t phyt; // default: 0