Talk:M2: Difference between revisions

From wowdev
Jump to navigation Jump to search
 
(53 intermediate revisions by 7 users not shown)
Line 2: Line 2:
--[[User:Schlumpf|schlumpf_]] 00:53, 23 August 2008 (CEST)
--[[User:Schlumpf|schlumpf_]] 00:53, 23 August 2008 (CEST)


== Animation blocks in WotLK ==
== Deleted Blocks ==
=== Block D ===


* Previously M2s used a single-timeline approach, chaining all animations into one long piece and separating them via begin and end given in animation data. Now, each animation has an own timeline.
*'''nD records of (int16, int16) starting at ofsD'''
* Animation blocks contain a list of lists of timestamps and a list of lists of values, where the first list is by animation and the second one by timestamp-entry.


  template<typename T>
Maybe a lookup table for animations? Since the numbers happen to be in fixed positions. The first short seems to increase with the position for models with all animations (like characters), the second seems to be flags or a modifier? Or something.
  struct array_ref
  {
    uint32_t number;
    T* elements;  // in file obviously an offset only
  };
 
  template<typename T>
  struct animation_block
  {
    uint16_t interpolation_type;
    uint16_t global_sequence;
    array_ref<array_ref<uint32_t>> timestamps;
    array_ref<array_ref<T>> values;
  };


* Thus, as example, with
 
  struct bone
  {
    int32_t bone_id;
    uint32_t flags;
    int16_t parent_bone;
    uint16_t _1[3];
    animation_block<vec3_float> translation;
    animation_block<quat_short> rotation;
    animation_block<vec3_float> scale;
    vec3_float pivot;
  } b;


one may get the number of animations having translation information with
Contain indices into the texture animations list, or -1 meaning a static texture.


  b.translation.timestamps.number


and the number of timestamps in the first animation using


  b.translation.timestamps.elements[0].number
== Render Flags ==


and the first timestamp value of the first animation via
''Please forgive any ignorance I show here as I'm not a professional programmer. I'm just trying to help improve Wow Model Viewer, which has very few staff left and these pages have been invaluable for understanding it :)  I just wanted to mention something that confused me and I'm not sure if it needs correcting...''


  b.translation.timestamps.elements[0].elements[0]
The Render Flags section of this page has two different tables for blend modes, with no mention of what the difference is. Is one out of date? The settings they recommend are different for a few modes, but they agree on others. I also tried them out in WMV and found that blend mode 1 is not working right with the settings from the tables (sections are appearing completely invisible when they shouldn't be) so maybe it's out of date in both, or there's something I'm not understanding. Perhaps it's meant to be used in conjunction with GL_ALPHA_TEST or glAlphaFunc() or something.


The actual translation vector for animation 0 at timestamp 0 is at
Thanks for all your work here! :)


  b.translation.values.elements[0].elements[0]
- Wain


* Some timestamps/values.elements entries may have number/elements = 0, if for that animation id no animation is given.
* the second table was created by relax by tracing directx stuff in the MoP client, the first one was later created by schlumpf based on reverse engineering the WoD beta client. The first table assumes alpha test to be the same, the second one lists them separate. there might be errors in both, tbh. feel free to fix them if you find them, or come to quakenet#modcraft to discuss them. :) --[[User:Schlumpf|Schlumpf]] ([[User talk:Schlumpf|talk]]) 16:47, 14 October 2015 (UTC)
* .anim files are just a blob of data which may as well be in the main model file, that is pointed to by the first array_ref layer.
* [model file name][animation id]-[animation sub-id].anim
* it seems like it is possible to detect if animation data is stored in-m2 or externally via
** All animations which have flags & 0x20 are stored internally.
** Animations which do not have flags & 0x20 are not stored internally.
** Animations which do not have flags & 0x20 AND do not have flags & 0x40 are in .anim files
** Animations which do not have flags & 0x20 AND DO have flags 0x40 are stored... somewhere. I have no clue.


== Deleted Blocks ==
* Aha! Thanks very much :) I'll experiment with the modes more and see what I can find.
=== Block D ===
-- Wain
 
 
== Particle Emitters ==
 
I'm not yet sure what to do with the new parameters: '''MultiTexParamX''' (2 values), and '''MultiTexParam0''' and '''MultiTexParam1''' (each two pairs of x and y values).
 
Below I've included values for a sample of models that use multitextured particles, along with some other parameters from the same particle emitter structure. You'll note that some of the texture tile rotation values are also unusual, as they are expected to be -1, 0 or 1.
 
Only particles that have multitexturing flagged are included, as the rest always seem to have zero for these parameters.
 
 
{| style="background:#FCFCFC ; color:black; text-align:left;"
!! width="60" | Blend !! width="60" | Emitter !! width="80" |Texture !! width="200" colspan = "2" style="background: #CCCCCC" | MultitexParamX !! width="400"  colspan = "4" style="background: #DDDDDD" | MultitexParam0 !! width="400"  colspan = "4" style="background: #EEEEEE" | MultitexParam1
|-
| '''Type''' || '''Type''' || '''Tile Rotat''' || '''[0]''' || '''[1]''' || '''[0].x''' || '''[0].y'''  || '''[1].x''' || '''[1].y''' || '''[0].x''' || '''[0].y''' || '''[1].x''' || '''[1].y'''
|-
| colspan="13" | ''moosemount.m2''
|-
| 7 || 2 || 7 || 0.1875 || 0.09375 || 0.0234375 || 0.0234375 || -0.0136719 || -0.0136719 || 0.00585938 || 0.00585938 || 0.00585938 || 0.00585938
|-
| 2 || 2 || 4 || 0.5 || 0.6875 || 0 || 0.138438 || 0 || 0.138438 || 0.0488281 || 0.0488281 || 0.0234375 || 0.0234375
|-
| 2 || 1 || 4 || 0.5 || 0.6875 || 0 || 0.0996094 || 0 || 0.0488281 || 0.00976562 || 0.00976562 || 0.00390625 || 0.00390625
|-
| colspan="13" | ''saber2mount.m2''
|-
| 4 || 1 || 0 || 0.78125 || 1 || 0 || 0.0996094 || 0 || 0 || 0 || 0 || 0 || 0.0996094
|-
| 4 || 1 || 0 || 0.375 || 0.28125 || 0 || 0.0996094 || 0 || 0 || 0 || 0 || 0 || 0.0996094
|-
| colspan="13" | ''ironhordeclefthoof.m2''
|-
| 7 || 1 || 1 || 0.25 || 0.4375 || 0 || 0.298828 || 0 || 0.199219 || 0.0585938 || 0.0585938 || 0.0488281 || 0.0488281
|-
| colspan="13" | ''ironhordeelekk.m2''
|-
| 7 || 1 || 1 || 0.25 || 0.4375 || 0 || 0.298828 || 0 || 0.199219 || 0.0585938 || 0.0585938 || 0.0488281 || 0.0488281
|-
| colspan="13" | ''ironhordewolf.m2''
|-
| 2 || 1 || 0 || 0.09375 || 0.1875 || 0.0292969 || 0.0292969 || -0.0292969 || 0.0292969 || 0.00390625 || 0.00390625 || 0.00390625 || 0.00390625
|-
| 7 || 1 || 1 || 0.25 || 0.4375 || 0 || 0.298828 || 0 || 0.199219 || 0.0585938 || 0.0585938 || 0.0488281 || 0.0488281
|-
| colspan="13" | ''archimonde3.m2''
|-
| 7 || 1 || 5 || 0.5 || 0.25 || 0 || 0.199219 || 0 || 0.199219 || 0 || 0.138438 || 0 || 0.138438
|-
| colspan="13" | ''voidcaller_v2.m2''
|-
| 2 || 2 || -3 || 1 || 1.375 || 0 || -0.199219 || 0 || -0.298828 || 0.0996094 || 0.0234375 || 0.138438 || 0.0488281
|-
| 2 || 2 || -1 || 0.5 || 0.6875 || 0 || 0.0488281 || 0 || 0.0742188 || 0.0234375 || 0.0234375 || 0.00390625 || 0.00390625
|-
| 7 || 2 || 2 || 1 || 0.5 || 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0
|-
| 7 || 2 || 0 || 0.5 || 0.1875 || 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0
|-
| 7 || 1 || 0 || 0.5 || 0.1875 || 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0
|-
| colspan="13" | ''lavahorse.m2''
|-
| 7 || 1 || 5 || 0.5 || 0.25 || 0 || 0.199219 || 0 || 0.199219 || 0 || 0.138438 || 0 || 0.138438
|-
| 4 || 1 || 0 || 0.25 || 0.5 || 0 || 0.00976562 || 0 || 0.0195312 || 0.00195312 || 0.00195312 || 0.00195312 || 0.00195312
|-
| colspan="13" | ''corehound2.m2''
|-
| 7 || 1 || 0 || 0.25 || 0.4375 || 0 || 0.298828 || 0 || 0.199219 || 0 || 0.0488281 || 0 || 0.0488281
|-
| 4 || 1 || 0 || 0.25 || 0.5 || 0 || 0.00976562 || 0 || 0.0195312 || 0.00195312 || 0.00195312 || 0.00195312 || 0.00195312
|-
| colspan="13" | ''dreadravenwarbirdfel.m2''
|-
| 4 || 1 || 0 || 0.25 || 0.5 || 0 || 0.00976562 || 0 || 0.0195312 || 0.00195312 || 0.00195312 || 0.00195312 || 0.00195312
|-
| 7 || 1 || 0 || 0.25 || 0.4375 || 0 || 0.298828 || 0 || 0.199219 || 0 || 0.0488281 || 0 || 0.0488281
|-
| colspan="13" | ''dreadravenwarbirdsun.m2''
|-
| 4 || 1 || 0 || 0.25 || 0.5 || 0 || 0.00976562 || 0 || 0.0195312 || 0.00195312 || 0.00195312 || 0.00195312 || 0.00195312
|-
| 7 || 1 || 0 || 0.25 || 0.4375 || 0 || 0.298828 || 0 || 0.199219 || 0 || 0.0488281 || 0 || 0.0488281
|}


*'''nD records of (int16, int16) starting at ofsD'''
-- [[User:Wain|Wain]] ([[User talk:Wain|talk]]) 14:57, 4 November 2015 (UTC)


Maybe a lookup table for animations? Since the numbers happen to be in fixed positions. The first short seems to increase with the position for models with all animations (like characters), the second seems to be flags or a modifier? Or something.
Note that all the above MultitexParamX values are exact fractions of 32 (0.4375 = 14/32, etc.). This seems to be a complicated way of storing info that could be just represented as a simple uint8. -- [[User:Wain|Wain]] ([[User talk:Wain|talk]]) 03:15, 4 February 2016 (UTC)


== Blend values ==


Contain indices into the texture animations list, or -1 meaning a static texture.
Those arrays were retrieved from client
char* blendModes[14] = {
    "Blend_Opaque",           //0
    "Blend_AlphaKey",          //1
    "Blend_Alpha",            //2
    "Blend_Add",              //3
    "Blend_Mod",              //4
    "Blend_Mod2x",            //5
    "Blend_ModAdd",            //6
    "Blend_InvSrcAlphaAdd",    //7
    "Blend_InvSrcAlphaOpaque", //8
    "Blend_SrcAlphaOpaque",    //9
    "Blend_NoAlphaAdd",        //10
    "Blend_ConstantAlpha",    //11
    "Blend_Screen",            //12
    "Blend_BlendAdd"          //13
}
uint64 sourceRGBBlendFactorEnum[14]  = {
    1,            //0
    1,            //1
    4,            //2
    4,            //3
    6,            //4
    6,            //5
    6,            //6
    5,            //7
    5,            //8
    4,            //9
    1,            //10
    0x0B,        //11
    7,            //12
    1            //13
}
uint64 destRGBBlendFactorEnum[14] = {
    0,          //0
    0,          //1
    5,          //2
    1,          //3
    0,          //4
    2,          //5
    1,          //6
    1,          //7
    0,          //8
    0,          //9
    1,          //10
    0x0C,        //11
    1,          //12
    5            //13
}
uint64 sourceAlphaBlendFactorEnum[14] = {
    1,            //0
    1,            //1
    1,            //2
    0,            //3
    8,            //4
    8,            //5
    8,            //6
    5,            //7
    5,            //8
    4,            //9
    0,            //10
    0x0D,        //11
    1,            //12
    1            //13
}
uint64 destAlphaBlendFactorEnum[14] = {
    0,            //0
    0,            //1
    5,            //2
    1,            //3
    0,            //4
    4,            //5
    1,            //6
    1,            //7
    0,            //8
    0,            //9
    1,            //10
    0x0E,        //11
    0,            //12
    5            //13
  }


== cheap nike Snapback Hats paypal
I think the lower 5 bits of GxBlendStateDesc(where this comes from) is index into this array. So based on info from notes in https://wowdev.wiki/M2/WotLK#Render_flags the blend modes are mapped this way:
  iupkfcbuj ==
  0 - Blend_Opaque(0),
  1 - Blend_AlphaKey(1),
  2 - Blend_Alpha(2),
  3 - Blend_NoAlphaAdd(10),
  4 - Blend_Add(3)
  5 - Blend_Mod(4)
  6 - Blend_Mod2x(5)
  7 - Blend_BlendAdd(13)


, Then state this isolated city, has almost become a dead city, she did not know Li Jijun will walk away eloquent State last little flesh and blood after pressing to do, do not know that this city will not happen overnight. Yang Ji industry or fold Yu Xun captured. By that time, she was a weak woman, in turn become a who's plaything in the hands of it?.  <a href=http://delagarzafence.com/nfl/20150926-baltimore-ravens-terrell-suggs-jersey-9-1450.html>2015 baltimore ravens terrell suggs jersey</a> <a href=http://greenstarled.com/nfl/20150926-san-francisco-49ers-patrick-willis-jersey-9-70.html>2015 san francisco 49ers patrick willis jersey</a> <a href=http://flightcomposites.com/nfl/20150926-denver-broncos-shannon-sharpe-jersey-5-336.html>2015 denver broncos shannon sharpe jersey</a>  I imagine the way a single pair of shoes could stretch my limited wardrobe, instructed in this theory by a well-dressed arts patron who once told me that people pay more attention to your jacket, your handbag and your shoes than your pants or your skirt. Then there are the unwritten rules about daytime and nighttime wear -- leather shoes for daytime, and satin shoes or metallic sandals for night -- that force the enlargement of one's shoe wardrobe. A fabulous piece of jewelry can also change an outfit.  <a href=http://flightcomposites.com/nfl/20150926-houston-texans-brian-cushing-jersey-5-1876.html>2015 houston texans brian cushing jersey</a> <a href=http://jast.org/nfl/20150926-new-england-patriots-rob-gronkowski-jersey-5-1176.html>2015 new england patriots rob gronkowski jersey</a> <a href=http://necasa.org/nfl/20150926-detroit-lions-calvin-johnson-jersey-2-883.html>2015 detroit lions calvin johnson jersey</a> 
I this assumption, it's a matter of correlation between numbers and blend modes
How come inexpensive louboutin sandals Christian louboutin uk shoes jump out to begin with is definitely the refined nail-varnish reddish colored coloured single that has been the signature. This is their explanation are one of the the majority of dominant Christian Louboutin d'orsays creator in the world. Complete thing .
{| class="wikitable sortable"
|-
!
! blendMode
! RenderFlag blend
! Src Color
! Dest Color
! Src Alpha
! Dest Alpha
|-
| 0
| Blend_Opaque
| 0
| 1
| 0
| 1
| 0
|-
| 1
| Blend_AlphaKey
| 1
| 1
| 0
| 1
| 0
|-
| 2
| Blend_Alpha
| 2
| 4
| 5
| 1
| 5
|-
| 3
| Blend_Add
| 4
| 4
| 1
| 0
| 1
|-
| 4
| Blend_Mod
| 5
| 6
| 0
| 8
| 0
|-
| 5
| Blend_Mod2x
| 6
| 6
| 2
| 8
| 4
|-
| 6
| Blend_ModAdd
| -1
| 6
| 1
| 8
| 1
|-
| 7
| Blend_InvSrcAlphaAdd
| -1
| 5
| 1
| 5
| 1
|-
| 8
| Blend_InvSrcAlphaOpaque
| -1
| 5
| 0
| 5
| 0
|-
| 9
| Blend_SrcAlphaOpaque
| -1
| 4
| 0
| 4
| 0
|-
| 10
| Blend_NoAlphaAdd
| 3
| 1
| 1
| 0
| 1
|-
| 11
| Blend_ConstantAlpha
| -1
| 11
| 12
| 13
| 14
|-
| 12
| Blend_Screen
| -1
| 7
| 1
| 1
| 0
|-
| 13
| Blend_BlendAdd
| 7
| 1
| 5
| 1
| 5
|}


== Cheap nfl jerseys
Based on info from article my current guess for values in this table is:
  tyoiodzjs ==
<code>
#define GL_ZERO                            0
#define GL_ONE                            1
#define GL_SRC_COLOR                      2
#define GL_ONE_MINUS_SRC_COLOR            3
#define GL_SRC_ALPHA                      4
#define GL_ONE_MINUS_SRC_ALPHA            5
#define GL_DST_ALPHA                      6
#define GL_ONE_MINUS_DST_ALPHA            7
#define GL_DST_COLOR                      8
#define GL_ONE_MINUS_DST_COLOR            9
#define GL_SRC_ALPHA_SATURATE              10
#define GL_CONSTANT_COLOR                  11
#define GL_ONE_MINUS_CONSTANT_COLOR        12
#define GL_CONSTANT_ALPHA                  13
#define GL_ONE_MINUS_CONSTANT_ALPHA        14
</code>
{| class="wikitable sortable"
|-
!
! blendMode
! RenderFlag blend
! Src Color
! Dest Color
! Src Alpha
! Dest Alpha
|-
| 0
| Blend_Opaque
| 0
| GL_ONE
| GL_ZERO
| GL_ONE
| GL_ZERO
|-
| 1
| Blend_AlphaKey
| 1
| GL_ONE
| GL_ZERO
| GL_ONE
| GL_ZERO
|-
| 2
| Blend_Alpha
| 2
| GL_SRC_ALPHA
| GL_ONE_MINUS_SRC_ALPHA
| GL_ONE
| GL_ONE_MINUS_SRC_ALPHA
|-
| 3
| Blend_Add
| 4
| GL_SRC_ALPHA
| GL_ONE
| GL_ZERO
| GL_ONE
|-
| 4
| Blend_Mod
| 5
| GL_DST_ALPHA
| GL_ZERO
| GL_DST_COLOR
| GL_ZERO
|-
| 5
| Blend_Mod2x
| 6
| GL_DST_ALPHA
| GL_SRC_COLOR
| GL_DST_COLOR
| GL_SRC_ALPHA
|-
| 6
| Blend_ModAdd
| -1
| GL_DST_ALPHA
| GL_ONE
| GL_DST_COLOR
| GL_ONE
|-
| 7
| Blend_InvSrcAlphaAdd
| -1
| GL_ONE_MINUS_SRC_ALPHA
| GL_ONE
| GL_ONE_MINUS_SRC_ALPHA
| GL_ONE
|-
| 8
| Blend_InvSrcAlphaOpaque
| -1
| GL_ONE_MINUS_SRC_ALPHA
| GL_ZERO
| GL_ONE_MINUS_SRC_ALPHA
| GL_ZERO
|-
| 9
| Blend_SrcAlphaOpaque
| -1
| GL_SRC_ALPHA
| GL_ZERO
| GL_SRC_ALPHA
| GL_ZERO
|-
| 10
| Blend_NoAlphaAdd
| 3
| GL_ONE
| GL_ONE
| GL_ZERO
| GL_ONE
|-
| 11
| Blend_ConstantAlpha
| -1
| GL_CONSTANT_COLOR
| GL_ONE_MINUS_CONSTANT_COLOR
| GL_CONSTANT_ALPHA
| GL_ONE_MINUS_CONSTANT_ALPHA
|-
| 12
| Blend_Screen
| -1
| GL_ONE_MINUS_DST_ALPHA
| GL_ONE
| GL_ONE
| GL_ZERO
|-
| 13
| Blend_BlendAdd
| 7
| GL_ONE
| GL_ONE_MINUS_SRC_ALPHA
| GL_ONE
| GL_ONE_MINUS_SRC_ALPHA
|}


East Fang Xiandi thick rain after Once upon a drastic change, disappeared, who do not know the rain thick Emperor Xian of life and death, but I believe the rain thick cents Emperor Yoshihito own deputy head will be fine. Fierce Devil killing Cave, has thousands of years does not appear, but the elapsed time is longer, to killing Cave greater the likelihood of, King of the wind Do not worry, father-in-law will send someone to help you inquire about the things you said. Off Light & Magic Emperor said..  <a href=http://sabusinesshalloffame.com/nfl/20150926-new-york-giants--jason-pierre-paul-jersey-2-743.html>2015 new york giants  jason pierre paul jersey</a> <a href=http://sabusinesshalloffame.com/nfl/20150926-dallas-cowboys-roger-staubach-jersey-6-567.html>2015 dallas cowboys roger staubach jersey</a> <a href=http://delagarzafence.com/nfl/20150926-detroit-lions-matthew-stafford-jersey-1-902.html>2015 detroit lions matthew stafford jersey</a>  Air Jordan shoes also popularly known as Air Jordans are a line of shoes from the Nike shoe makers. The Air Jordan line was introduced in the year 1985 but continues to go strong till this day and age. In fact,Nike Air Presto, this line has been so popular that Air Jordan models are coming up like clock work every year since their year of release.  <a href=http://msaaircraft.com/nfl/20150926-oakland-raiders-michael-crabtree-jersey-7-1298.html>2015 oakland raiders michael crabtree jersey</a> <a href=http://msaaircraft.com/nfl/20150926-carolina-panthers-kelvin-benjamin-jersey-6-1077.html>2015 carolina panthers kelvin benjamin jersey</a> <a href=http://dbe-inc.com/nfl/20150926-new-england-patriots-chandler-jones-jersey-3-1104.html>2015 new england patriots chandler jones jersey</a> 
(updated using fallenoak's findings)
As a top price of expensive shoes, F50 adizero PRIME has a high added value. It not only comes with a second deputy laces and a lightweight, comfortable two shoelaces, but also more specifically designed for the F50 adizero PRIME mesh shoe, and a special shoe cloth. This set of shoes also use a special pullbox packaging, but also a unique look F50 adizero PRIME.

Latest revision as of 20:06, 21 November 2016

Finished for Build 8820 now. Post changes here first! And please pay attention to the style when you add something.. --schlumpf_ 00:53, 23 August 2008 (CEST)

Deleted Blocks

Block D

  • nD records of (int16, int16) starting at ofsD

Maybe a lookup table for animations? Since the numbers happen to be in fixed positions. The first short seems to increase with the position for models with all animations (like characters), the second seems to be flags or a modifier? Or something.


Contain indices into the texture animations list, or -1 meaning a static texture.


Render Flags

Please forgive any ignorance I show here as I'm not a professional programmer. I'm just trying to help improve Wow Model Viewer, which has very few staff left and these pages have been invaluable for understanding it :) I just wanted to mention something that confused me and I'm not sure if it needs correcting...

The Render Flags section of this page has two different tables for blend modes, with no mention of what the difference is. Is one out of date? The settings they recommend are different for a few modes, but they agree on others. I also tried them out in WMV and found that blend mode 1 is not working right with the settings from the tables (sections are appearing completely invisible when they shouldn't be) so maybe it's out of date in both, or there's something I'm not understanding. Perhaps it's meant to be used in conjunction with GL_ALPHA_TEST or glAlphaFunc() or something.

Thanks for all your work here! :)

- Wain

  • the second table was created by relax by tracing directx stuff in the MoP client, the first one was later created by schlumpf based on reverse engineering the WoD beta client. The first table assumes alpha test to be the same, the second one lists them separate. there might be errors in both, tbh. feel free to fix them if you find them, or come to quakenet#modcraft to discuss them. :) --Schlumpf (talk) 16:47, 14 October 2015 (UTC)
  • Aha! Thanks very much :) I'll experiment with the modes more and see what I can find.

-- Wain


Particle Emitters

I'm not yet sure what to do with the new parameters: MultiTexParamX (2 values), and MultiTexParam0 and MultiTexParam1 (each two pairs of x and y values).

Below I've included values for a sample of models that use multitextured particles, along with some other parameters from the same particle emitter structure. You'll note that some of the texture tile rotation values are also unusual, as they are expected to be -1, 0 or 1.

Only particles that have multitexturing flagged are included, as the rest always seem to have zero for these parameters.


Blend Emitter Texture MultitexParamX MultitexParam0 MultitexParam1
Type Type Tile Rotat [0] [1] [0].x [0].y [1].x [1].y [0].x [0].y [1].x [1].y
moosemount.m2
7 2 7 0.1875 0.09375 0.0234375 0.0234375 -0.0136719 -0.0136719 0.00585938 0.00585938 0.00585938 0.00585938
2 2 4 0.5 0.6875 0 0.138438 0 0.138438 0.0488281 0.0488281 0.0234375 0.0234375
2 1 4 0.5 0.6875 0 0.0996094 0 0.0488281 0.00976562 0.00976562 0.00390625 0.00390625
saber2mount.m2
4 1 0 0.78125 1 0 0.0996094 0 0 0 0 0 0.0996094
4 1 0 0.375 0.28125 0 0.0996094 0 0 0 0 0 0.0996094
ironhordeclefthoof.m2
7 1 1 0.25 0.4375 0 0.298828 0 0.199219 0.0585938 0.0585938 0.0488281 0.0488281
ironhordeelekk.m2
7 1 1 0.25 0.4375 0 0.298828 0 0.199219 0.0585938 0.0585938 0.0488281 0.0488281
ironhordewolf.m2
2 1 0 0.09375 0.1875 0.0292969 0.0292969 -0.0292969 0.0292969 0.00390625 0.00390625 0.00390625 0.00390625
7 1 1 0.25 0.4375 0 0.298828 0 0.199219 0.0585938 0.0585938 0.0488281 0.0488281
archimonde3.m2
7 1 5 0.5 0.25 0 0.199219 0 0.199219 0 0.138438 0 0.138438
voidcaller_v2.m2
2 2 -3 1 1.375 0 -0.199219 0 -0.298828 0.0996094 0.0234375 0.138438 0.0488281
2 2 -1 0.5 0.6875 0 0.0488281 0 0.0742188 0.0234375 0.0234375 0.00390625 0.00390625
7 2 2 1 0.5 0 0 0 0 0 0 0 0
7 2 0 0.5 0.1875 0 0 0 0 0 0 0 0
7 1 0 0.5 0.1875 0 0 0 0 0 0 0 0
lavahorse.m2
7 1 5 0.5 0.25 0 0.199219 0 0.199219 0 0.138438 0 0.138438
4 1 0 0.25 0.5 0 0.00976562 0 0.0195312 0.00195312 0.00195312 0.00195312 0.00195312
corehound2.m2
7 1 0 0.25 0.4375 0 0.298828 0 0.199219 0 0.0488281 0 0.0488281
4 1 0 0.25 0.5 0 0.00976562 0 0.0195312 0.00195312 0.00195312 0.00195312 0.00195312
dreadravenwarbirdfel.m2
4 1 0 0.25 0.5 0 0.00976562 0 0.0195312 0.00195312 0.00195312 0.00195312 0.00195312
7 1 0 0.25 0.4375 0 0.298828 0 0.199219 0 0.0488281 0 0.0488281
dreadravenwarbirdsun.m2
4 1 0 0.25 0.5 0 0.00976562 0 0.0195312 0.00195312 0.00195312 0.00195312 0.00195312
7 1 0 0.25 0.4375 0 0.298828 0 0.199219 0 0.0488281 0 0.0488281

-- Wain (talk) 14:57, 4 November 2015 (UTC)

Note that all the above MultitexParamX values are exact fractions of 32 (0.4375 = 14/32, etc.). This seems to be a complicated way of storing info that could be just represented as a simple uint8. -- Wain (talk) 03:15, 4 February 2016 (UTC)

Blend values

Those arrays were retrieved from client

char* blendModes[14] = {
    "Blend_Opaque",            //0
    "Blend_AlphaKey",          //1
    "Blend_Alpha",             //2
    "Blend_Add",               //3
    "Blend_Mod",               //4
    "Blend_Mod2x",             //5
    "Blend_ModAdd",            //6
    "Blend_InvSrcAlphaAdd",    //7
    "Blend_InvSrcAlphaOpaque", //8
    "Blend_SrcAlphaOpaque",    //9
    "Blend_NoAlphaAdd",        //10
    "Blend_ConstantAlpha",     //11
    "Blend_Screen",            //12
    "Blend_BlendAdd"           //13
}
uint64 sourceRGBBlendFactorEnum[14]   = {
    1,            //0
    1,            //1
    4,            //2
    4,            //3
    6,            //4
    6,            //5
    6,            //6
    5,            //7
    5,            //8
    4,            //9
    1,            //10
    0x0B,         //11
    7,            //12
    1             //13
}
uint64 destRGBBlendFactorEnum[14] = {
    0,           //0
    0,           //1
    5,           //2
    1,           //3
    0,           //4
    2,           //5
    1,           //6
    1,           //7
    0,           //8
    0,           //9
    1,           //10
    0x0C,        //11
    1,           //12
    5            //13
}
uint64 sourceAlphaBlendFactorEnum[14] = {
    1,            //0
    1,            //1
    1,            //2
    0,            //3
    8,            //4
    8,            //5
    8,            //6
    5,            //7
    5,            //8
    4,            //9
    0,            //10
    0x0D,         //11
    1,            //12
    1             //13
}
uint64 destAlphaBlendFactorEnum[14] = {
    0,            //0
    0,            //1
    5,            //2
    1,            //3
    0,            //4
    4,            //5
    1,            //6
    1,            //7
    0,            //8
    0,            //9
    1,            //10
    0x0E,         //11
    0,            //12
    5             //13
 }

I think the lower 5 bits of GxBlendStateDesc(where this comes from) is index into this array. So based on info from notes in https://wowdev.wiki/M2/WotLK#Render_flags the blend modes are mapped this way:

 0 - Blend_Opaque(0),
 1 - Blend_AlphaKey(1),
 2 - Blend_Alpha(2),
 3 - Blend_NoAlphaAdd(10),
 4 - Blend_Add(3)
 5 - Blend_Mod(4)
 6 - Blend_Mod2x(5)
 7 - Blend_BlendAdd(13)

I this assumption, it's a matter of correlation between numbers and blend modes

blendMode RenderFlag blend Src Color Dest Color Src Alpha Dest Alpha
0 Blend_Opaque 0 1 0 1 0
1 Blend_AlphaKey 1 1 0 1 0
2 Blend_Alpha 2 4 5 1 5
3 Blend_Add 4 4 1 0 1
4 Blend_Mod 5 6 0 8 0
5 Blend_Mod2x 6 6 2 8 4
6 Blend_ModAdd -1 6 1 8 1
7 Blend_InvSrcAlphaAdd -1 5 1 5 1
8 Blend_InvSrcAlphaOpaque -1 5 0 5 0
9 Blend_SrcAlphaOpaque -1 4 0 4 0
10 Blend_NoAlphaAdd 3 1 1 0 1
11 Blend_ConstantAlpha -1 11 12 13 14
12 Blend_Screen -1 7 1 1 0
13 Blend_BlendAdd 7 1 5 1 5

Based on info from article my current guess for values in this table is:

  1. define GL_ZERO 0
  2. define GL_ONE 1
  3. define GL_SRC_COLOR 2
  4. define GL_ONE_MINUS_SRC_COLOR 3
  5. define GL_SRC_ALPHA 4
  6. define GL_ONE_MINUS_SRC_ALPHA 5
  7. define GL_DST_ALPHA 6
  8. define GL_ONE_MINUS_DST_ALPHA 7
  9. define GL_DST_COLOR 8
  10. define GL_ONE_MINUS_DST_COLOR 9
  11. define GL_SRC_ALPHA_SATURATE 10
  12. define GL_CONSTANT_COLOR 11
  13. define GL_ONE_MINUS_CONSTANT_COLOR 12
  14. define GL_CONSTANT_ALPHA 13
  15. define GL_ONE_MINUS_CONSTANT_ALPHA 14

blendMode RenderFlag blend Src Color Dest Color Src Alpha Dest Alpha
0 Blend_Opaque 0 GL_ONE GL_ZERO GL_ONE GL_ZERO
1 Blend_AlphaKey 1 GL_ONE GL_ZERO GL_ONE GL_ZERO
2 Blend_Alpha 2 GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA GL_ONE GL_ONE_MINUS_SRC_ALPHA
3 Blend_Add 4 GL_SRC_ALPHA GL_ONE GL_ZERO GL_ONE
4 Blend_Mod 5 GL_DST_ALPHA GL_ZERO GL_DST_COLOR GL_ZERO
5 Blend_Mod2x 6 GL_DST_ALPHA GL_SRC_COLOR GL_DST_COLOR GL_SRC_ALPHA
6 Blend_ModAdd -1 GL_DST_ALPHA GL_ONE GL_DST_COLOR GL_ONE
7 Blend_InvSrcAlphaAdd -1 GL_ONE_MINUS_SRC_ALPHA GL_ONE GL_ONE_MINUS_SRC_ALPHA GL_ONE
8 Blend_InvSrcAlphaOpaque -1 GL_ONE_MINUS_SRC_ALPHA GL_ZERO GL_ONE_MINUS_SRC_ALPHA GL_ZERO
9 Blend_SrcAlphaOpaque -1 GL_SRC_ALPHA GL_ZERO GL_SRC_ALPHA GL_ZERO
10 Blend_NoAlphaAdd 3 GL_ONE GL_ONE GL_ZERO GL_ONE
11 Blend_ConstantAlpha -1 GL_CONSTANT_COLOR GL_ONE_MINUS_CONSTANT_COLOR GL_CONSTANT_ALPHA GL_ONE_MINUS_CONSTANT_ALPHA
12 Blend_Screen -1 GL_ONE_MINUS_DST_ALPHA GL_ONE GL_ONE GL_ZERO
13 Blend_BlendAdd 7 GL_ONE GL_ONE_MINUS_SRC_ALPHA GL_ONE GL_ONE_MINUS_SRC_ALPHA

(updated using fallenoak's findings)