Skip to content

Commit 92774e7

Browse files
authored
Merge pull request #464 from Laupetin/feature/material-iw3-t5
feat: add templated json material loading/dumping for IW3 and T5
2 parents f3c83f7 + 2082805 commit 92774e7

40 files changed

Lines changed: 3962 additions & 597 deletions

src/Common/Game/IW3/CommonIW3.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@ namespace IW3
2121
return result;
2222
}
2323

24+
static constexpr uint32_t R_HashString(const char* string)
25+
{
26+
return R_HashString(string, 0u);
27+
}
28+
2429
static PackedTexCoords Vec2PackTexCoords(const float (&in)[2]);
2530
static PackedUnitVec Vec3PackUnitVec(const float (&in)[3]);
2631
static GfxColor Vec4PackGfxColor(const float (&in)[4]);

src/Common/Game/IW3/IW3_Assets.h

Lines changed: 136 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -566,7 +566,8 @@ namespace IW3
566566
GFXS_BLEND_INVDESTALPHA = 0x8,
567567
GFXS_BLEND_DESTCOLOR = 0x9,
568568
GFXS_BLEND_INVDESTCOLOR = 0xA,
569-
GFXS_BLEND_MASK = 0xF,
569+
570+
GFXS_BLEND_COUNT
570571
};
571572

572573
enum GfxBlendOp
@@ -577,7 +578,40 @@ namespace IW3
577578
GFXS_BLENDOP_REVSUBTRACT = 0x3,
578579
GFXS_BLENDOP_MIN = 0x4,
579580
GFXS_BLENDOP_MAX = 0x5,
580-
GFXS_BLENDOP_MASK = 0x7,
581+
582+
GFXS_BLENDOP_COUNT
583+
};
584+
585+
enum GfxAlphaTest_e
586+
{
587+
GFXS_ALPHA_TEST_GT_0 = 1,
588+
GFXS_ALPHA_TEST_LT_128 = 2,
589+
GFXS_ALPHA_TEST_GE_128 = 3,
590+
591+
GFXS_ALPHA_TEST_COUNT
592+
};
593+
594+
enum GfxCullFace_e
595+
{
596+
GFXS_CULL_NONE = 1,
597+
GFXS_CULL_BACK = 2,
598+
GFXS_CULL_FRONT = 3,
599+
};
600+
601+
enum GfxDepthTest_e
602+
{
603+
GFXS_DEPTHTEST_ALWAYS = 0,
604+
GFXS_DEPTHTEST_LESS = 1,
605+
GFXS_DEPTHTEST_EQUAL = 2,
606+
GFXS_DEPTHTEST_LESSEQUAL = 3
607+
};
608+
609+
enum GfxPolygonOffset_e
610+
{
611+
GFXS_POLYGON_OFFSET_0 = 0,
612+
GFXS_POLYGON_OFFSET_1 = 1,
613+
GFXS_POLYGON_OFFSET_2 = 2,
614+
GFXS_POLYGON_OFFSET_SHADOWMAP = 3
581615
};
582616

583617
enum GfxStencilOp
@@ -589,10 +623,19 @@ namespace IW3
589623
GFXS_STENCILOP_DECRSAT = 0x4,
590624
GFXS_STENCILOP_INVERT = 0x5,
591625
GFXS_STENCILOP_INCR = 0x6,
592-
GFXS_STENCILOP_DECR = 0x7,
626+
GFXS_STENCILOP_DECR = 0x7
627+
};
593628

594-
GFXS_STENCILOP_COUNT,
595-
GFXS_STENCILOP_MASK = 0x7
629+
enum GfxStencilFunc
630+
{
631+
GFXS_STENCILFUNC_NEVER = 0x0,
632+
GFXS_STENCILFUNC_LESS = 0x1,
633+
GFXS_STENCILFUNC_EQUAL = 0x2,
634+
GFXS_STENCILFUNC_LESSEQUAL = 0x3,
635+
GFXS_STENCILFUNC_GREATER = 0x4,
636+
GFXS_STENCILFUNC_NOTEQUAL = 0x5,
637+
GFXS_STENCILFUNC_GREATEREQUAL = 0x6,
638+
GFXS_STENCILFUNC_ALWAYS = 0x7
596639
};
597640

598641
enum GfxStateBitsEnum : unsigned int
@@ -613,10 +656,10 @@ namespace IW3
613656
GFXS0_ATEST_GE_128 = 0x3000,
614657
GFXS0_ATEST_MASK = 0x3000,
615658

616-
GFXS0_CULL_SHIFT = 0xE,
617659
GFXS0_CULL_NONE = 0x4000,
618660
GFXS0_CULL_BACK = 0x8000,
619661
GFXS0_CULL_FRONT = 0xC000,
662+
GFXS0_CULL_SHIFT = 0xE,
620663
GFXS0_CULL_MASK = 0xC000,
621664

622665
GFXS0_SRCBLEND_ALPHA_SHIFT = 0x10,
@@ -638,18 +681,18 @@ namespace IW3
638681
GFXS1_DEPTHWRITE = 0x1,
639682

640683
GFXS1_DEPTHTEST_DISABLE = 0x2,
641-
GFXS1_DEPTHTEST_SHIFT = 0x2,
642684
GFXS1_DEPTHTEST_ALWAYS = 0x0,
643685
GFXS1_DEPTHTEST_LESS = 0x4,
644686
GFXS1_DEPTHTEST_EQUAL = 0x8,
645687
GFXS1_DEPTHTEST_LESSEQUAL = 0xC,
688+
GFXS1_DEPTHTEST_SHIFT = 0x2,
646689
GFXS1_DEPTHTEST_MASK = 0xC,
647690

648-
GFXS1_POLYGON_OFFSET_SHIFT = 0x4,
649691
GFXS1_POLYGON_OFFSET_0 = 0x0,
650692
GFXS1_POLYGON_OFFSET_1 = 0x10,
651693
GFXS1_POLYGON_OFFSET_2 = 0x20,
652694
GFXS1_POLYGON_OFFSET_SHADOWMAP = 0x30,
695+
GFXS1_POLYGON_OFFSET_SHIFT = 0x4,
653696
GFXS1_POLYGON_OFFSET_MASK = 0x30,
654697

655698
GFXS1_STENCIL_FRONT_ENABLE = 0x40,
@@ -672,16 +715,61 @@ namespace IW3
672715
GFXS1_STENCILOP_FRONTBACK_MASK = 0x1FF1FF00,
673716
};
674717

718+
struct GfxStateBitsLoadBitsStructured
719+
{
720+
// Byte 0
721+
unsigned int srcBlendRgb : 4; // 0-3
722+
unsigned int dstBlendRgb : 4; // 4-7
723+
unsigned int blendOpRgb : 3; // 8-10
724+
unsigned int alphaTestDisabled : 1; // 11
725+
unsigned int alphaTest : 2; // 12-13
726+
unsigned int cullFace : 2; // 14-15
727+
unsigned int srcBlendAlpha : 4; // 16-19
728+
unsigned int dstBlendAlpha : 4; // 20-23
729+
unsigned int blendOpAlpha : 3; // 24-26
730+
unsigned int colorWriteRgb : 1; // 27
731+
unsigned int colorWriteAlpha : 1; // 28
732+
unsigned int unused1 : 2; // 29-30
733+
unsigned int polymodeLine : 1; // 31
734+
735+
// Byte 1
736+
unsigned int depthWrite : 1; // 0
737+
unsigned int depthTestDisabled : 1; // 1
738+
unsigned int depthTest : 2; // 2-3
739+
unsigned int polygonOffset : 2; // 4-5
740+
unsigned int stencilFrontEnabled : 1; // 6
741+
unsigned int stencilBackEnabled : 1; // 7
742+
unsigned int stencilFrontPass : 3; // 8-10
743+
unsigned int stencilFrontFail : 3; // 11-13
744+
unsigned int stencilFrontZFail : 3; // 14-16
745+
unsigned int stencilFrontFunc : 3; // 17-19
746+
unsigned int stencilBackPass : 3; // 20-22
747+
unsigned int stencilBackFail : 3; // 23-25
748+
unsigned int stencilBackZFail : 3; // 26-28
749+
unsigned int stencilBackFunc : 3; // 29-31
750+
};
751+
752+
union GfxStateBitsLoadBits
753+
{
754+
unsigned int raw[2];
755+
GfxStateBitsLoadBitsStructured structured;
756+
};
757+
758+
#ifndef __zonecodegenerator
759+
static_assert(sizeof(GfxStateBitsLoadBits) == 8);
760+
static_assert(sizeof(GfxStateBitsLoadBitsStructured) == 8);
761+
#endif
762+
675763
struct GfxStateBits
676764
{
677-
unsigned int loadBits[2];
765+
GfxStateBitsLoadBits loadBits;
678766
};
679767

680768
struct type_align(16) MaterialConstantDef
681769
{
682770
unsigned int nameHash;
683771
char name[12];
684-
float literal[4];
772+
vec4_t literal;
685773
};
686774

687775
struct complex_s
@@ -718,6 +806,26 @@ namespace IW3
718806
water_t* water;
719807
};
720808

809+
enum TextureFilter
810+
{
811+
TEXTURE_FILTER_DISABLED = 0x0,
812+
TEXTURE_FILTER_NEAREST = 0x1,
813+
TEXTURE_FILTER_LINEAR = 0x2,
814+
TEXTURE_FILTER_ANISO2X = 0x3,
815+
TEXTURE_FILTER_ANISO4X = 0x4,
816+
817+
TEXTURE_FILTER_COUNT
818+
};
819+
820+
enum SamplerStateBitsMipMap_e
821+
{
822+
SAMPLER_MIPMAP_ENUM_DISABLED,
823+
SAMPLER_MIPMAP_ENUM_NEAREST,
824+
SAMPLER_MIPMAP_ENUM_LINEAR,
825+
826+
SAMPLER_MIPMAP_ENUM_COUNT
827+
};
828+
721829
enum SamplerStateBits_e
722830
{
723831
SAMPLER_FILTER_SHIFT = 0x0,
@@ -743,13 +851,26 @@ namespace IW3
743851
SAMPLER_CLAMP_MASK = 0xE0,
744852
};
745853

854+
struct MaterialTextureDefSamplerState
855+
{
856+
unsigned char filter : 3;
857+
unsigned char mipMap : 2;
858+
unsigned char clampU : 1;
859+
unsigned char clampV : 1;
860+
unsigned char clampW : 1;
861+
};
862+
863+
#ifndef __zonecodegenerator
864+
static_assert(sizeof(MaterialTextureDefSamplerState) == 1u);
865+
#endif
866+
746867
struct MaterialTextureDef
747868
{
748869
unsigned int nameHash;
749870
char nameStart;
750871
char nameEnd;
751-
unsigned char samplerState; // SamplerStateBits_e
752-
unsigned char semantic; // TextureSemantic
872+
MaterialTextureDefSamplerState samplerState; // SamplerStateBits_e
873+
unsigned char semantic; // TextureSemantic
753874
MaterialTextureDefInfo u;
754875
};
755876

@@ -842,8 +963,9 @@ namespace IW3
842963
CAMERA_REGION_LIT = 0x0,
843964
CAMERA_REGION_DECAL = 0x1,
844965
CAMERA_REGION_EMISSIVE = 0x2,
845-
CAMERA_REGION_COUNT = 0x3,
846-
CAMERA_REGION_NONE = 0x3,
966+
967+
CAMERA_REGION_COUNT,
968+
CAMERA_REGION_NONE = CAMERA_REGION_COUNT,
847969
};
848970

849971
enum MaterialStateFlags

src/Common/Game/T5/CommonT5.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,21 @@ namespace T5
1111
static int Com_HashString(const char* str);
1212
static int Com_HashString(const char* str, int len);
1313

14+
static constexpr uint32_t R_HashString(const char* str, uint32_t hash)
15+
{
16+
for (const auto* pos = str; *pos; pos++)
17+
{
18+
hash = 33 * hash ^ (*pos | 0x20);
19+
}
20+
21+
return hash;
22+
}
23+
24+
static constexpr uint32_t R_HashString(const char* string)
25+
{
26+
return R_HashString(string, 0u);
27+
}
28+
1429
static PackedTexCoords Vec2PackTexCoords(const float (&in)[2]);
1530
static PackedUnitVec Vec3PackUnitVec(const float (&in)[3]);
1631
static GfxColor Vec4PackGfxColor(const float (&in)[4]);

0 commit comments

Comments
 (0)