PHYS: Difference between revisions

From wowdev
Jump to navigation Jump to search
No edit summary
No edit summary
Line 6: Line 6:
  // mat*x*: * times * floats.
  // mat*x*: * times * floats.


* pyhs
* 1 phys
* body
* n body
** shapes
** n shapes
*** box
*** 1 box
*** capsule
*** 1 capsule
*** sphere
*** 1 sphere
*** (height field [*])
*** 1 (tree mesh [*])
* joints
*** 1 (height field [*])
** weld
* n joints
** spherical
** 1 weld
** shoulder
** 1 spherical
** (mouse [*])
** 1 shoulder
** (distance [*])
** 1 (mouse [*])
** (revolute [*])
** 1 (distance [*])
** 1 (revolute [*])
[*] supported by domino, but not available in wow


[*] 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=
=PHYS=

Revision as of 17:23, 7 April 2012

.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 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 joints
    • 1 weld
    • 1 spherical
    • 1 shoulder
    • 1 (mouse [*])
    • 1 (distance [*])
    • 1 (revolute [*])

[*] 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 must_be_null; // PhysData::Load fails otherwise. (if (phys->token != 'PHYS' || phys->must_be_null) return false;)

BODY

struct BODYEntry
{
  short type; // maps to dmBodyDef type enum. 0 -> 1, 1 -> 0, 2 -> 2. Only one should be of type 0 (root)
  short a;
  int b;
  int c;
  int d;
  short bone; // the bone this body is representing in the model.
  short f;
  int shapes_base; // starting at shapes[shapes_base]
  int shapes_count; // shapes_count shapes are in this body.
} bodies[];

SHAP

struct SHAPEntry
{
  short shapeType; // 0 -> box, 1 -> capsule, 2 -> sphere
  short shapeIndex; // into the corresponding chunk
  vec3 position?;
  float weight;
} shapes[];

BOXS

struct BOXSEntry
{
  mat3x3 a;
  vec3 b;
  vec3 c;
} boxShapes[];

CAPS

struct CAPSEntry
{
  int a;
  int b;
  int c;
  vec4 d;
} capsuleShapes[];

SPHS

struct SPHSEntry
{
  char a[0x10];
} sphereShapes[];

JOIN

struct JOINEntry
{
  int body_1;
  int body_2;
  int unk;
  short jointType; // 0 == sphericalJoint, 1 == shoulderJoint, 2 == weldJoint
  short jointId; // reference into the corresponding chunk entries.
} joins[];

WELJ

struct WELJEntry
{
  mat3x3 matrix;
  vec3 a;
  mat3x3 matrix2;
  vec3 a2;
  vec2 b;
} weldJoins[];

SPHJ

struct SPHJEntry
{
  char a[0x1C];
} sphericalJointEntries[];

SHOJ

struct SHOJEntry
{
  char a[0x6C];
} shoulderJoints[];