You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
o3de/Code/Legacy/CryCommon/VertexFormats.h

1387 lines
26 KiB
C++

/*
* Copyright (c) Contributors to the Open 3D Engine Project
*
* SPDX-License-Identifier: Apache-2.0 OR MIT
*
*/
#ifndef CRYINCLUDE_CRYCOMMON_VERTEXFORMATS_H
#define CRYINCLUDE_CRYCOMMON_VERTEXFORMATS_H
#pragma once
#include <CryArray.h>
// Stream Configuration options
#define ENABLE_NORMALSTREAM_SUPPORT 1
enum EVertexFormat : uint8
{
eVF_Unknown,
// Base stream
eVF_P3F_C4B_T2F,
eVF_P3F_C4B_T2F_T2F,
eVF_P3S_C4B_T2S,
eVF_P3S_C4B_T2S_T2S, // For UV2 support
eVF_P3S_N4B_C4B_T2S,
eVF_P3F_C4B_T4B_N3F2, // Particles.
eVF_TP3F_C4B_T2F, // Fonts (28 bytes).
eVF_TP3F_T2F_T3F, // Miscellaneus.
eVF_P3F_T3F, // Miscellaneus. (AuxGeom)
eVF_P3F_T2F_T3F, // Miscellaneus.
// Additional streams
eVF_T2F, // Light maps TC (8 bytes).
eVF_W4B_I4S, // Skinned weights/indices stream.
eVF_C4B_C4B, // SH coefficients.
eVF_P3F_P3F_I4B, // Shape deformation stream.
eVF_P3F, // Velocity stream.
eVF_C4B_T2S, // General (Position is merged with Tangent stream)
// Lens effects simulation
eVF_P2F_T4F_C4F, // primary
eVF_P2F_T4F_T4F_C4F,
eVF_P2S_N4B_C4B_T1F,
eVF_P3F_C4B_T2S,
eVF_P2F_C4B_T2F_F4B, // UI
eVF_P3F_C4B,// Auxiliary geometry
eVF_P3F_C4F_T2F, //numbering for tracking the new vertex formats and for comparison with testing 23
eVF_P3F_C4F_T2F_T3F,
eVF_P3F_C4F_T2F_T3F_T3F,
eVF_P3F_C4F_T2F_T1F,
eVF_P3F_C4F_T2F_T1F_T3F,
eVF_P3F_C4F_T2F_T1F_T3F_T3F,
eVF_P3F_C4F_T4F_T2F,
eVF_P3F_C4F_T4F_T2F_T3F, //30
eVF_P3F_C4F_T4F_T2F_T3F_T3F,
eVF_P3F_C4F_T4F_T2F_T1F,
eVF_P3F_C4F_T4F_T2F_T1F_T3F,
eVF_P3F_C4F_T4F_T2F_T1F_T3F_T3F,
eVF_P3F_C4F_T2F_T2F_T1F, //35
eVF_P3F_C4F_T2F_T2F_T1F_T3F,
eVF_P3F_C4F_T2F_T2F_T1F_T3F_T3F,
eVF_P3F_C4F_T2F_T2F_T1F_T1F,
eVF_P3F_C4F_T2F_T2F_T1F_T1F_T3F,
eVF_P3F_C4F_T2F_T2F_T1F_T1F_T3F_T3F, //40
eVF_P4F_T2F_C4F_T4F_T4F,
eVF_P3F_C4F_T2F_T4F,
eVF_P3F_C4F_T2F_T3F_T4F,
eVF_P3F_C4F_T2F_T3F_T3F_T4F,
eVF_P3F_C4F_T2F_T1F_T4F, //45
eVF_P3F_C4F_T2F_T1F_T3F_T4F,
eVF_P3F_C4F_T2F_T1F_T3F_T3F_T4F,
eVF_P3F_C4F_T4F_T2F_T4F,
eVF_P3F_C4F_T4F_T2F_T3F_T4F,
eVF_P3F_C4F_T4F_T2F_T3F_T3F_T4F, //50
eVF_P3F_C4F_T4F_T2F_T1F_T4F,
eVF_P3F_C4F_T4F_T2F_T1F_T3F_T4F,
eVF_P3F_C4F_T4F_T2F_T1F_T3F_T3F_T4F,
eVF_P3F_C4F_T2F_T2F_T1F_T4F,
eVF_P3F_C4F_T2F_T2F_T1F_T3F_T4F, //55
eVF_P3F_C4F_T2F_T2F_T1F_T3F_T3F_T4F,
eVF_P3F_C4F_T2F_T2F_T1F_T1F_T4F,
eVF_P3F_C4F_T2F_T2F_T1F_T1F_T3F_T4F,
eVF_P3F_C4F_T2F_T2F_T1F_T1F_T3F_T3F_T4F,
eVF_P4F_T2F_C4F_T4F_T4F_T4F, //60
eVF_P3F_C4F_T2F_T4F_T4F,
eVF_P3F_C4F_T2F_T3F_T4F_T4F,
eVF_P3F_C4F_T2F_T3F_T3F_T4F_T4F,
eVF_P3F_C4F_T2F_T1F_T4F_T4F,
eVF_P3F_C4F_T2F_T1F_T3F_T4F_T4F, //65
eVF_P3F_C4F_T2F_T1F_T3F_T3F_T4F_T4F,
eVF_P3F_C4F_T4F_T2F_T4F_T4F,
eVF_P3F_C4F_T4F_T2F_T3F_T4F_T4F,
eVF_P3F_C4F_T4F_T2F_T3F_T3F_T4F_T4F,
eVF_P3F_C4F_T4F_T2F_T1F_T4F_T4F, //70
eVF_P3F_C4F_T4F_T2F_T1F_T3F_T4F_T4F,
eVF_P3F_C4F_T4F_T2F_T1F_T3F_T3F_T4F_T4F,
eVF_P3F_C4F_T2F_T2F_T1F_T4F_T4F,
eVF_P3F_C4F_T2F_T2F_T1F_T3F_T4F_T4F,
eVF_P3F_C4F_T2F_T2F_T1F_T3F_T3F_T4F_T4F, //75
eVF_P3F_C4F_T2F_T2F_T1F_T1F_T4F_T4F,
eVF_P3F_C4F_T2F_T2F_T1F_T1F_T3F_T4F_T4F,
eVF_P3F_C4F_T2F_T2F_T1F_T1F_T3F_T3F_T4F_T4F,
eVF_P4F_T2F_C4F_T4F_T4F_T4F_T4F,
eVF_Max,
};
typedef Vec4_tpl<int16> Vec4sf; // Used for tangents only.
struct UCol
{
union
{
uint32 dcolor;
uint8 bcolor[4];
struct
{
uint8 b, g, r, a;
};
struct
{
uint8 z, y, x, w;
};
};
// get normal vector from unsigned 8bit integers (can't point up/down and is not normal)
ILINE Vec3 GetN()
{
return Vec3
(
(bcolor[0] - 128.0f) / 127.5f,
(bcolor[1] - 128.0f) / 127.5f,
(bcolor[2] - 128.0f) / 127.5f
);
}
AUTO_STRUCT_INFO
};
struct Vec3f16
: public CryHalf4
{
_inline Vec3f16()
{
}
_inline Vec3f16(f32 _x, f32 _y, f32 _z)
{
x = CryConvertFloatToHalf(_x);
y = CryConvertFloatToHalf(_y);
z = CryConvertFloatToHalf(_z);
w = CryConvertFloatToHalf(1.0f);
}
float operator[](int i) const
{
assert(i <= 3);
return CryConvertHalfToFloat(((CryHalf*)this)[i]);
}
_inline Vec3f16& operator = (const Vec3& sl)
{
x = CryConvertFloatToHalf(sl.x);
y = CryConvertFloatToHalf(sl.y);
z = CryConvertFloatToHalf(sl.z);
w = CryConvertFloatToHalf(1.0f);
return *this;
}
_inline Vec3f16& operator = (const Vec4A& sl)
{
x = CryConvertFloatToHalf(sl.x);
y = CryConvertFloatToHalf(sl.y);
z = CryConvertFloatToHalf(sl.z);
w = CryConvertFloatToHalf(sl.w);
return *this;
}
_inline Vec3 ToVec3() const
{
Vec3 v;
v.x = CryConvertHalfToFloat(x);
v.y = CryConvertHalfToFloat(y);
v.z = CryConvertHalfToFloat(z);
return v;
}
};
struct Vec2f16
: public CryHalf2
{
_inline Vec2f16()
{
}
_inline Vec2f16(f32 _x, f32 _y)
{
x = CryConvertFloatToHalf(_x);
y = CryConvertFloatToHalf(_y);
}
Vec2f16& operator = (const Vec2f16& sl)
{
x = sl.x;
y = sl.y;
return *this;
}
Vec2f16& operator = (const Vec2& sl)
{
x = CryConvertFloatToHalf(sl.x);
y = CryConvertFloatToHalf(sl.y);
return *this;
}
float operator[](int i) const
{
assert(i <= 1);
return CryConvertHalfToFloat(((CryHalf*)this)[i]);
}
_inline Vec2 ToVec2() const
{
Vec2 v;
v.x = CryConvertHalfToFloat(x);
v.y = CryConvertHalfToFloat(y);
return v;
}
};
struct SVF_P3F_C4B
{
Vec3 xyz;
UCol color;
};
struct SVF_P3F_C4B_T2F
{
Vec3 xyz;
UCol color;
Vec2 st;
};
struct SVF_P3F_C4B_T2F_T2F
{
Vec3 xyz;
UCol color;
Vec2 st;
Vec2 st2;
};
struct SVF_P2F_C4B_T2F_F4B
{
Vec2 xy;
UCol color;
Vec2 st;
uint8 texIndex;
uint8 texHasColorChannel;
uint8 texIndex2;
uint8 pad;
};
struct SVF_TP3F_C4B_T2F //Fonts
{
Vec4 pos;
UCol color;
Vec2 st;
};
struct SVF_P3S_C4B_T2S
{
Vec3f16 xyz;
UCol color;
Vec2f16 st;
AUTO_STRUCT_INFO
};
struct SVF_P3S_C4B_T2S_T2S
{
Vec3f16 xyz;
UCol color;
Vec2f16 st;
Vec2f16 st2;
AUTO_STRUCT_INFO
};
struct SVF_P3F_C4B_T2S
{
Vec3 xyz;
UCol color;
Vec2f16 st;
};
struct SVF_P3S_N4B_C4B_T2S
{
Vec3f16 xyz;
UCol normal;
UCol color;
Vec2f16 st;
};
struct SVF_P2S_N4B_C4B_T1F
{
CryHalf2 xy;
UCol normal;
UCol color;
float z;
};
struct SVF_T2F
{
Vec2 st;
};
struct SVF_W4B_I4S
{
UCol weights;
uint16 indices[4];
};
struct SVF_C4B_C4B
{
UCol coef0;
UCol coef1;
};
struct SVF_P3F_P3F_I4B
{
Vec3 thin;
Vec3 fat;
UCol index;
};
struct SVF_P3F
{
Vec3 xyz;
};
struct SVF_P3F_T3F
{
Vec3 p;
Vec3 st;
};
struct SVF_P3F_T2F_T3F
{
Vec3 p;
Vec2 st0;
Vec3 st1;
};
struct SVF_TP3F_T2F_T3F
{
Vec4 p;
Vec2 st0;
Vec3 st1;
};
struct SVF_P2F_T4F_C4F
{
Vec2 p;
Vec4 st;
Vec4 color;
};
struct SVF_P2F_T4F_T4F_C4F
{
Vec2 p;
Vec4 st;
Vec4 st2;
Vec4 color;
};
struct SVF_P3F_C4B_I4B_PS4F
{
Vec3 xyz;
Vec2 prevXaxis;
Vec2 prevYaxis;
UCol color;
Vec3 prevPos;
struct SpriteInfo
{
uint8 tex_x, tex_y, tex_z, backlight; // xyzw
} info;
Vec2 xaxis;
Vec2 yaxis;
};
struct SVF_P3F_C4B_T4B_N3F2
{
Vec3 xyz;
UCol color;
UCol st; // st is used as a color, even though st usually refers to a TexCoord
Vec3 xaxis;
Vec3 yaxis;
#ifdef PARTICLE_MOTION_BLUR
Vec3 prevPos;
Vec3 prevXTan;
Vec3 prevYTan;
#endif
};
struct SVF_C4B_T2S
{
UCol color;
Vec2f16 st;
};
struct SVF_P3F_C4F_T2F
{
Vec3 xyz;
Vec4 color;
Vec2 st;
};
struct SVF_P3F_C4F_T2F_T3F
{
Vec3 xyz;
Vec4 color;
Vec2 st0;
Vec3 st1;
};
struct SVF_P3F_C4F_T2F_T3F_T3F
{
Vec3 xyz;
Vec4 color;
Vec2 st0;
Vec3 st1;
Vec3 st2;
};
struct SVF_P3F_C4F_T2F_T1F
{
Vec3 xyz;
Vec4 color;
Vec2 st;
float z;
};
struct SVF_P3F_C4F_T2F_T1F_T3F
{
Vec3 xyz;
Vec4 color;
Vec2 st0;
float z;
Vec3 st1;
};
struct SVF_P3F_C4F_T2F_T1F_T3F_T3F
{
Vec3 xyz;
Vec4 color;
Vec2 st0;
float z;
Vec3 st1;
Vec3 st2;
};
struct SVF_P3F_C4F_T4F_T2F
{
Vec3 xyz;
Vec4 color;
Vec4 st0;
Vec2 st1;
};
struct SVF_P3F_C4F_T4F_T2F_T3F
{
Vec3 xyz;
Vec4 color;
Vec4 st0;
Vec2 st1;
Vec3 st2;
};
struct SVF_P3F_C4F_T4F_T2F_T3F_T3F
{
Vec3 xyz;
Vec4 color;
Vec4 st0;
Vec2 st1;
Vec3 st2;
Vec3 st3;
};
struct SVF_P3F_C4F_T4F_T2F_T1F
{
Vec3 xyz;
Vec4 color;
Vec4 st0;
Vec2 st1;
float z;
};
struct SVF_P3F_C4F_T4F_T2F_T1F_T3F
{
Vec3 xyz;
Vec4 color;
Vec4 st0;
Vec2 st1;
float z;
Vec3 st2;
};
struct SVF_P3F_C4F_T4F_T2F_T1F_T3F_T3F
{
Vec3 xyz;
Vec4 color;
Vec4 st0;
Vec2 st1;
float z;
Vec3 st2;
Vec3 st3;
};
struct SVF_P3F_C4F_T2F_T2F_T1F
{
Vec3 xyz;
Vec4 color;
Vec2 st0;
Vec2 st1;
float z;
};
struct SVF_P3F_C4F_T2F_T2F_T1F_T3F
{
Vec3 xyz;
Vec4 color;
Vec2 st0;
Vec2 st1;
float z;
Vec3 st2;
};
struct SVF_P3F_C4F_T2F_T2F_T1F_T3F_T3F
{
Vec3 xyz;
Vec4 color;
Vec2 st0;
Vec2 st1;
float z;
Vec3 st2;
Vec3 st3;
};
struct SVF_P3F_C4F_T2F_T2F_T1F_T1F
{
Vec3 xyz;
Vec4 color;
Vec2 st0;
Vec2 st1;
float z0;
float z1;
};
struct SVF_P3F_C4F_T2F_T2F_T1F_T1F_T3F
{
Vec3 xyz;
Vec4 color;
Vec2 st0;
Vec2 st1;
float z0;
float z1;
Vec3 st2;
};
struct SVF_P3F_C4F_T2F_T2F_T1F_T1F_T3F_T3F
{
Vec3 xyz;
Vec4 color;
Vec2 st0;
Vec2 st1;
float z0;
float z1;
Vec3 st2;
Vec3 st3;
};
struct SVF_P4F_T2F_C4F_T4F_T4F
{
Vec4 xyzw;
Vec2 st0;
Vec4 color;
Vec4 st1;
Vec4 st2;
};
struct SVF_P3F_C4F_T2F_T4F
{
Vec3 xyz;
Vec4 color;
Vec2 st0;
Vec4 st1;
};
struct SVF_P3F_C4F_T2F_T3F_T4F
{
Vec3 xyz;
Vec4 color;
Vec2 st0;
Vec3 st1;
Vec4 st2;
};
struct SVF_P3F_C4F_T2F_T3F_T3F_T4F
{
Vec3 xyz;
Vec4 color;
Vec2 st0;
Vec3 st1;
Vec3 st2;
Vec4 st3;
};
struct SVF_P3F_C4F_T2F_T1F_T4F
{
Vec3 xyz;
Vec4 color;
Vec2 st0;
float z;
Vec4 st1;
};
struct SVF_P3F_C4F_T2F_T1F_T3F_T4F
{
Vec3 xyz;
Vec4 color;
Vec2 st0;
float z;
Vec3 st1;
Vec4 st2;
};
struct SVF_P3F_C4F_T2F_T1F_T3F_T3F_T4F
{
Vec3 xyz;
Vec4 color;
Vec2 st0;
float z;
Vec3 st1;
Vec3 st2;
Vec4 st3;
};
struct SVF_P3F_C4F_T4F_T2F_T4F
{
Vec3 xyz;
Vec4 color;
Vec4 st0;
Vec2 st1;
Vec4 st2;
};
struct SVF_P3F_C4F_T4F_T2F_T3F_T4F
{
Vec3 xyz;
Vec4 color;
Vec4 st0;
Vec2 st1;
Vec3 st2;
Vec4 st3;
};
struct SVF_P3F_C4F_T4F_T2F_T3F_T3F_T4F
{
Vec3 xyz;
Vec4 color;
Vec4 st0;
Vec2 st1;
Vec3 st2;
Vec3 st3;
Vec4 st4;
};
struct SVF_P3F_C4F_T4F_T2F_T1F_T4F
{
Vec3 xyz;
Vec4 color;
Vec4 st0;
Vec2 st1;
float z;
Vec4 st2;
};
struct SVF_P3F_C4F_T4F_T2F_T1F_T3F_T4F
{
Vec3 xyz;
Vec4 color;
Vec4 st0;
Vec2 st1;
float z;
Vec3 st2;
Vec4 st3;
};
struct SVF_P3F_C4F_T4F_T2F_T1F_T3F_T3F_T4F
{
Vec3 xyz;
Vec4 color;
Vec4 st0;
Vec2 st1;
float z;
Vec3 st2;
Vec3 st3;
Vec4 st4;
};
struct SVF_P3F_C4F_T2F_T2F_T1F_T4F
{
Vec3 xyz;
Vec4 color;
Vec2 st0;
Vec2 st1;
float z;
Vec4 st2;
};
struct SVF_P3F_C4F_T2F_T2F_T1F_T3F_T4F
{
Vec3 xyz;
Vec4 color;
Vec2 st0;
Vec2 st1;
float z;
Vec3 st2;
Vec4 st3;
};
struct SVF_P3F_C4F_T2F_T2F_T1F_T3F_T3F_T4F
{
Vec3 xyz;
Vec4 color;
Vec2 st0;
Vec2 st1;
float z;
Vec3 st2;
Vec3 st3;
Vec4 st4;
};
struct SVF_P3F_C4F_T2F_T2F_T1F_T1F_T4F
{
Vec3 xyz;
Vec4 color;
Vec2 st0;
Vec2 st1;
float z0;
float z1;
Vec4 st2;
};
struct SVF_P3F_C4F_T2F_T2F_T1F_T1F_T3F_T4F
{
Vec3 xyz;
Vec4 color;
Vec2 st0;
Vec2 st1;
float z0;
float z1;
Vec3 st2;
Vec4 st3;
};
struct SVF_P3F_C4F_T2F_T2F_T1F_T1F_T3F_T3F_T4F
{
Vec3 xyz;
Vec4 color;
Vec2 st0;
Vec2 st1;
float z0;
float z1;
Vec3 st2;
Vec3 st3;
Vec4 st4;
};
struct SVF_P4F_T2F_C4F_T4F_T4F_T4F
{
Vec4 xyzw;
Vec2 st0;
Vec4 color;
Vec4 st1;
Vec4 st2;
Vec4 st3;
};
struct SVF_P3F_C4F_T2F_T4F_T4F
{
Vec3 xyz;
Vec4 color;
Vec2 st0;
Vec4 st1;
Vec4 st2;
};
struct SVF_P3F_C4F_T2F_T3F_T4F_T4F
{
Vec3 xyz;
Vec4 color;
Vec2 st0;
Vec3 st1;
Vec4 st2;
Vec4 st3;
};
struct SVF_P3F_C4F_T2F_T3F_T3F_T4F_T4F
{
Vec3 xyz;
Vec4 color;
Vec2 st0;
Vec3 st1;
Vec3 st2;
Vec4 st3;
Vec4 st4;
};
struct SVF_P3F_C4F_T2F_T1F_T4F_T4F
{
Vec3 xyz;
Vec4 color;
Vec2 st0;
float z;
Vec4 st1;
Vec4 st2;
};
struct SVF_P3F_C4F_T2F_T1F_T3F_T4F_T4F
{
Vec3 xyz;
Vec4 color;
Vec2 st0;
float z;
Vec3 st1;
Vec4 st2;
Vec4 st3;
};
struct SVF_P3F_C4F_T2F_T1F_T3F_T3F_T4F_T4F
{
Vec3 xyz;
Vec4 color;
Vec2 st0;
float z;
Vec3 st1;
Vec3 st2;
Vec4 st3;
Vec4 st4;
};
struct SVF_P3F_C4F_T4F_T2F_T4F_T4F
{
Vec3 xyz;
Vec4 color;
Vec4 st0;
Vec2 st1;
Vec4 st2;
Vec4 st3;
};
struct SVF_P3F_C4F_T4F_T2F_T3F_T4F_T4F
{
Vec3 xyz;
Vec4 color;
Vec4 st0;
Vec2 st1;
Vec3 st2;
Vec4 st3;
Vec4 st4;
};
struct SVF_P3F_C4F_T4F_T2F_T3F_T3F_T4F_T4F
{
Vec3 xyz;
Vec4 color;
Vec4 st0;
Vec2 st1;
Vec3 st2;
Vec3 st3;
Vec4 st4;
Vec4 st5;
};
struct SVF_P3F_C4F_T4F_T2F_T1F_T4F_T4F
{
Vec3 xyz;
Vec4 color;
Vec4 st0;
Vec2 st1;
float z;
Vec4 st2;
Vec4 st3;
};
struct SVF_P3F_C4F_T4F_T2F_T1F_T3F_T4F_T4F
{
Vec3 xyz;
Vec4 color;
Vec4 st0;
Vec2 st1;
float z;
Vec3 st2;
Vec4 st3;
Vec4 st4;
};
struct SVF_P3F_C4F_T4F_T2F_T1F_T3F_T3F_T4F_T4F
{
Vec3 xyz;
Vec4 color;
Vec4 st0;
Vec2 st1;
float z;
Vec3 st2;
Vec3 st3;
Vec4 st4;
Vec4 st5;
};
struct SVF_P3F_C4F_T2F_T2F_T1F_T4F_T4F
{
Vec3 xyz;
Vec4 color;
Vec2 st0;
Vec2 st1;
float z;
Vec4 st2;
Vec4 st3;
};
struct SVF_P3F_C4F_T2F_T2F_T1F_T3F_T4F_T4F
{
Vec3 xyz;
Vec4 color;
Vec2 st0;
Vec2 st1;
float z;
Vec3 st2;
Vec4 st3;
Vec4 st4;
};
struct SVF_P3F_C4F_T2F_T2F_T1F_T3F_T3F_T4F_T4F
{
Vec3 xyz;
Vec4 color;
Vec2 st0;
Vec2 st1;
float z;
Vec3 st2;
Vec3 st3;
Vec4 st4;
Vec4 st5;
};
struct SVF_P3F_C4F_T2F_T2F_T1F_T1F_T4F_T4F
{
Vec3 xyz;
Vec4 color;
Vec2 st0;
Vec2 st1;
float z0;
float z1;
Vec4 st2;
Vec4 st3;
};
struct SVF_P3F_C4F_T2F_T2F_T1F_T1F_T3F_T4F_T4F
{
Vec3 xyz;
Vec4 color;
Vec2 st0;
Vec2 st1;
float z0;
float z1;
Vec3 st2;
Vec4 st3;
Vec4 st4;
};
struct SVF_P3F_C4F_T2F_T2F_T1F_T1F_T3F_T3F_T4F_T4F
{
Vec3 xyz;
Vec4 color;
Vec2 st0;
Vec2 st1;
float z0;
float z1;
Vec3 st2;
Vec3 st3;
Vec4 st4;
Vec4 st5;
};
struct SVF_P4F_T2F_C4F_T4F_T4F_T4F_T4F
{
Vec4 xyzw;
Vec2 st0;
Vec4 color;
Vec4 st1;
Vec4 st2;
Vec4 st3;
Vec4 st4;
};
//=============================================================
// Signed norm value packing [-1,+1]
namespace PackingSNorm
{
ILINE int16 tPackF2B(const float f)
{
return (int16)(f * 32767.0f);
}
ILINE int16 tPackS2B(const int16 s)
{
return (int16)(s * 32767);
}
ILINE float tPackB2F(const int16 i)
{
return (float)((float)i / 32767.0f);
}
ILINE int16 tPackB2S(const int16 s)
{
// OPT: "(s >> 15) + !(s >> 15)" works as well
return (int16)(s / 32767);
}
ILINE Vec4sf tPackF2Bv(const Vec4& v)
{
Vec4sf vs;
vs.x = tPackF2B(v.x);
vs.y = tPackF2B(v.y);
vs.z = tPackF2B(v.z);
vs.w = tPackF2B(v.w);
return vs;
}
ILINE Vec4sf tPackF2Bv(const Vec3& v)
{
Vec4sf vs;
vs.x = tPackF2B(v.x);
vs.y = tPackF2B(v.y);
vs.z = tPackF2B(v.z);
vs.w = tPackF2B(1.0f);
return vs;
}
ILINE Vec4 tPackB2F(const Vec4sf& v)
{
Vec4 vs;
vs.x = tPackB2F(v.x);
vs.y = tPackB2F(v.y);
vs.z = tPackB2F(v.z);
vs.w = tPackB2F(v.w);
return vs;
}
ILINE void tPackB2F(const Vec4sf& v, Vec4& vDst)
{
vDst.x = tPackB2F(v.x);
vDst.y = tPackB2F(v.y);
vDst.z = tPackB2F(v.z);
vDst.w = 1.0f;
}
ILINE void tPackB2FScale(const Vec4sf& v, Vec4& vDst, const Vec3& vScale)
{
vDst.x = (float)v.x * vScale.x;
vDst.y = (float)v.y * vScale.y;
vDst.z = (float)v.z * vScale.z;
vDst.w = 1.0f;
}
ILINE void tPackB2FScale(const Vec4sf& v, Vec3& vDst, const Vec3& vScale)
{
vDst.x = (float)v.x * vScale.x;
vDst.y = (float)v.y * vScale.y;
vDst.z = (float)v.z * vScale.z;
}
ILINE void tPackB2F(const Vec4sf& v, Vec3& vDst)
{
vDst.x = tPackB2F(v.x);
vDst.y = tPackB2F(v.y);
vDst.z = tPackB2F(v.z);
}
};
//=============================================================
// Pip => Graphics Pipeline structures, used for inputs for the GPU's Input Assembler
// These structures are optimized for fast decoding (ALU and bandwidth) and
// might be slow to encode on-the-fly
struct SPipTangents
{
SPipTangents() {}
private:
Vec4sf Tangent;
Vec4sf Bitangent;
public:
explicit SPipTangents(const Vec4sf& othert, const Vec4sf& otherb, const int16& othersign)
{
using namespace PackingSNorm;
Tangent = othert;
Tangent.w = PackingSNorm::tPackS2B(othersign);
Bitangent = otherb;
Bitangent.w = PackingSNorm::tPackS2B(othersign);
}
explicit SPipTangents(const Vec4sf& othert, const Vec4sf& otherb, const SPipTangents& othersign)
{
Tangent = othert;
Tangent.w = othersign.Tangent.w;
Bitangent = otherb;
Bitangent.w = othersign.Bitangent.w;
}
explicit SPipTangents(const Vec4sf& othert, const Vec4sf& otherb)
{
Tangent = othert;
Bitangent = otherb;
}
explicit SPipTangents(const Vec3& othert, const Vec3& otherb, const int16& othersign)
{
Tangent = Vec4sf(PackingSNorm::tPackF2B(othert.x), PackingSNorm::tPackF2B(othert.y), PackingSNorm::tPackF2B(othert.z), PackingSNorm::tPackS2B(othersign));
Bitangent = Vec4sf(PackingSNorm::tPackF2B(otherb.x), PackingSNorm::tPackF2B(otherb.y), PackingSNorm::tPackF2B(otherb.z), PackingSNorm::tPackS2B(othersign));
}
explicit SPipTangents(const Vec3& othert, const Vec3& otherb, const SPipTangents& othersign)
{
Tangent = Vec4sf(PackingSNorm::tPackF2B(othert.x), PackingSNorm::tPackF2B(othert.y), PackingSNorm::tPackF2B(othert.z), othersign.Tangent.w);
Bitangent = Vec4sf(PackingSNorm::tPackF2B(otherb.x), PackingSNorm::tPackF2B(otherb.y), PackingSNorm::tPackF2B(otherb.z), othersign.Bitangent.w);
}
explicit SPipTangents(const Quat& other, const int16& othersign)
{
Vec3 othert = other.GetColumn0();
Vec3 otherb = other.GetColumn1();
Tangent = Vec4sf(PackingSNorm::tPackF2B(othert.x), PackingSNorm::tPackF2B(othert.y), PackingSNorm::tPackF2B(othert.z), PackingSNorm::tPackS2B(othersign));
Bitangent = Vec4sf(PackingSNorm::tPackF2B(otherb.x), PackingSNorm::tPackF2B(otherb.y), PackingSNorm::tPackF2B(otherb.z), PackingSNorm::tPackS2B(othersign));
}
void ExportTo(Vec4sf& othert, Vec4sf& otherb) const
{
othert = Tangent;
otherb = Bitangent;
}
// get normal tangent and bitangent vectors
void GetTB(Vec4& othert, Vec4& otherb) const
{
othert = PackingSNorm::tPackB2F(Tangent);
otherb = PackingSNorm::tPackB2F(Bitangent);
}
// get normal vector (perpendicular to tangent and bitangent plane)
ILINE Vec3 GetN() const
{
Vec4 tng, btg;
GetTB(tng, btg);
Vec3 tng3(tng.x, tng.y, tng.z),
btg3(btg.x, btg.y, btg.z);
// assumes w 1 or -1
return tng3.Cross(btg3) * tng.w;
}
// get normal vector (perpendicular to tangent and bitangent plane)
void GetN(Vec3& othern) const
{
othern = GetN();
}
// get the tangent-space basis as individual normal vectors (tangent, bitangent and normal)
void GetTBN(Vec3& othert, Vec3& otherb, Vec3& othern) const
{
Vec4 tng, btg;
GetTB(tng, btg);
Vec3 tng3(tng.x, tng.y, tng.z),
btg3(btg.x, btg.y, btg.z);
// assumes w 1 or -1
othert = tng3;
otherb = btg3;
othern = tng3.Cross(btg3) * tng.w;
}
// get normal vector sign (reflection)
ILINE int16 GetR() const
{
return PackingSNorm::tPackB2S(Tangent.w);
}
// get normal vector sign (reflection)
void GetR(int16& sign) const
{
sign = GetR();
}
void TransformBy(const Matrix34& trn)
{
Vec4 tng, btg;
GetTB(tng, btg);
Vec3 tng3(tng.x, tng.y, tng.z),
btg3(btg.x, btg.y, btg.z);
tng3 = trn.TransformVector(tng3);
btg3 = trn.TransformVector(btg3);
*this = SPipTangents(tng3, btg3, PackingSNorm::tPackB2S(Tangent.w));
}
void TransformSafelyBy(const Matrix34& trn)
{
Vec4 tng, btg;
GetTB(tng, btg);
Vec3 tng3(tng.x, tng.y, tng.z),
btg3(btg.x, btg.y, btg.z);
tng3 = trn.TransformVector(tng3);
btg3 = trn.TransformVector(btg3);
// normalize in case "trn" wasn't length-preserving
tng3.Normalize();
btg3.Normalize();
*this = SPipTangents(tng3, btg3, PackingSNorm::tPackB2S(Tangent.w));
}
friend struct SMeshTangents;
};
struct SPipQTangents
{
SPipQTangents() {}
private:
Vec4sf QTangent;
public:
explicit SPipQTangents(const Vec4sf& other)
{
QTangent = other;
}
bool operator ==(const SPipQTangents& other) const
{
return
QTangent[0] == other.QTangent[0] ||
QTangent[1] == other.QTangent[1] ||
QTangent[2] == other.QTangent[2] ||
QTangent[3] == other.QTangent[3];
}
bool operator !=(const SPipQTangents& other) const
{
return !(*this == other);
}
// get quaternion
ILINE Quat GetQ() const
{
Quat q;
q.v.x = PackingSNorm::tPackB2F(QTangent.x);
q.v.y = PackingSNorm::tPackB2F(QTangent.y);
q.v.z = PackingSNorm::tPackB2F(QTangent.z);
q.w = PackingSNorm::tPackB2F(QTangent.w);
return q;
}
// get normal vector from quaternion
ILINE Vec3 GetN() const
{
const Quat q = GetQ();
return q.GetColumn2() * (q.w < 0.0f ? -1.0f : +1.0f);
}
friend struct SMeshQTangents;
};
struct SPipNormal
: public Vec3
{
SPipNormal() {}
explicit SPipNormal(const Vec3& othern)
{
x = othern.x;
y = othern.y;
z = othern.z;
}
// get normal vector
ILINE Vec3 GetN() const
{
return *this;
}
// get normal vector
void GetN(Vec3& othern) const
{
othern = GetN();
}
void TransformBy(const Matrix34& trn)
{
*this = SPipNormal(trn.TransformVector(*this));
}
void TransformSafelyBy(const Matrix34& trn)
{
// normalize in case "trn" wasn't length-preserving
*this = SPipNormal(trn.TransformVector(*this).normalize());
}
friend struct SMeshNormal;
};
//==================================================================================================
typedef SVF_P3F_C4B_T2F SAuxVertex;
////////////////////////////////////////////////////////////////////////////////////////////////////
// Vertex Sizes
//extern const int m_VertexSize[];
//============================================================================
// Custom vertex streams definitions
// NOTE: If you add new stream ID also include vertex declarations creating in
// CD3D9Renderer::EF_InitD3DVertexDeclarations (D3DRendPipeline.cpp)
// Stream IDs
enum EStreamIDs
{
VSF_GENERAL, // General vertex buffer
VSF_TANGENTS, // Tangents buffer
VSF_QTANGENTS, // Tangents buffer
VSF_HWSKIN_INFO, // HW skinning buffer
VSF_VERTEX_VELOCITY, // Velocity buffer
# if ENABLE_NORMALSTREAM_SUPPORT
VSF_NORMALS, // Normals, used for skinning
#endif
// <- Insert new stream IDs here
VSF_NUM, // Number of vertex streams
VSF_MORPHBUDDY = 8, // Morphing (from m_pMorphBuddy)
VSF_INSTANCED = 9, // Data is for instance stream
VSF_MORPHBUDDY_WEIGHTS = 15, // Morphing weights
};
// Stream Masks (Used during updating)
enum EStreamMasks
{
VSM_GENERAL = 1 << VSF_GENERAL,
VSM_TANGENTS = ((1 << VSF_TANGENTS) | (1 << VSF_QTANGENTS)),
VSM_HWSKIN = 1 << VSF_HWSKIN_INFO,
VSM_VERTEX_VELOCITY = 1 << VSF_VERTEX_VELOCITY,
# if ENABLE_NORMALSTREAM_SUPPORT
VSM_NORMALS = 1 << VSF_NORMALS,
#endif
VSM_MORPHBUDDY = 1 << VSF_MORPHBUDDY,
VSM_INSTANCED = 1 << VSF_INSTANCED,
VSM_MASK = ((1 << VSF_NUM) - 1),
};
//==================================================================================================================
#endif // CRYINCLUDE_CRYCOMMON_VERTEXFORMATS_H