summaryrefslogtreecommitdiff
path: root/cheat/gmod/IVModelInfoClient.hpp
blob: 957c6d9a0fcb243bdbcc97f315f5529921d93b5d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#pragma once
#include "IVEngineClient.hpp"
#include "IClientEntityList.hpp"

struct DrawModelState_t;

struct mstudiobbox_t
{
	int bone;
	int group;
	vec3_t min;
	vec3_t max;
	int	szhitboxnameindex;

	const char* get_name( ) {
		if( szhitboxnameindex == 0 )
			return "";

		return ( ( const char* )this ) + szhitboxnameindex;
	}

	int unused[ 8 ];
};

struct mstudiobone_t
{
	int	sznameindex;
	inline char * const get_name( void ) const { return ( ( char * )this ) + sznameindex; }
	int parent;
	char pad01[ 152 ];
	int flags;
	char pad02[ 52 ];
};

struct mstudiohitboxset_t
{
	int					sznameindex;
	inline char * const	get_name( void ) const { return ( ( char * )this ) + sznameindex; }
	int					numhitboxes;
	int					hitboxindex;
	inline mstudiobbox_t *get_hitbox( int i ) const { return ( mstudiobbox_t * )( ( ( unsigned char * )this ) + hitboxindex ) + i; };
};

struct studiohdr_t
{
	char pad00[ 12 ];
	char name[ 64 ];
	char pad01[ 80 ];
	int numbones;
	int boneIndex;
	inline mstudiobone_t *get_bone( int i ) { return ( mstudiobone_t * )( ( ( unsigned char* )this ) + boneIndex ) + i; }
	char pad02[ 8 ];
	int numhitboxsets;
	int hitboxsetindex;

	mstudiohitboxset_t* get_hitbox_set( int i ) {
		return ( mstudiohitboxset_t * )( ( ( char * )this ) + hitboxsetindex ) + i;
	}

	char pad03[ 24 ];
	int numtextures;
	inline mstudiobbox_t* get_hit_box( int index ) { return ( ( mstudiohitboxset_t* )( ( unsigned char* )this + hitboxsetindex ) )->get_hitbox( index ); }
};

struct ModelRenderInfo_t {
	vec3_t m_origin;
	vec3_t m_angles;
	char pad[ 0x4 ];
	void* m_renderable;
	const model_t* m_model;
	const matrix3x4* m_model2world;
	const matrix3x4* m_light_offset;
	const vec3_t* m_light_origin;
	int m_flags;
	int m_entity_index;
	int m_skin;
	int m_body;
	int m_hitboxset;
	uint16_t* m_instance;

	ModelRenderInfo_t( ) {
		m_model2world = nullptr;
		m_light_offset = nullptr;
		m_light_origin = nullptr;
	}
};

class IVModelInfoClient {
public:
	model_t* GetModel( int index ) {
		using fn = model_t*( __thiscall* )( void*, int );
		return util::get_vfunc< fn >( this, 1 )( this, index );
	}

	int GetModelIndex( const char* name ) {
		using fn = int( __thiscall* )( void*, const char* );
		return util::get_vfunc< fn >( this, 2 )( this, name );
	}

	const char* GetModelName( const model_t* model ) {
		using fn = const char* ( __thiscall* )( void*, const model_t* );
		return util::get_vfunc< fn >( this, 3 )( this, model );
	}

	studiohdr_t* GetStudiomodel( const model_t* mod ) {
		using fn = studiohdr_t* ( __thiscall* )( void*, const model_t* );
		return util::get_vfunc< fn >( this, 28 )( this, mod );
	}

	void GetModelMaterials( const model_t *model, int count, class IMaterial** ppMaterial ) {
		using fn = const void( __thiscall* )( void*, const model_t*, int, IMaterial** );
		util::get_vfunc< fn >( this, 16 )( this, model, count, ppMaterial );
	}
};

enum OverrideType_t {
	OVERRIDE_NORMAL = 0,
	OVERRIDE_BUILD_SHADOWS,
	OVERRIDE_DEPTH_WRITE,
	OVERRIDE_SSAO_DEPTH_WRITE,
};

class IVModelRender {
public:
	void ForcedMaterialOverride( IMaterial* newMaterial, OverrideType_t nOverrideType = OVERRIDE_NORMAL, int unk = 0 ) {
		using fn = void( __thiscall* )( void*, IMaterial*, OverrideType_t, int );
		return util::get_vfunc< fn >( this, 1 )( this, newMaterial, nOverrideType, unk );
	}

	void DrawModelExecute( void* matctx, const DrawModelState_t& state, const ModelRenderInfo_t& pInfo, matrix3x4* pCustomBoneToWorld ) {
		using fn = void( __thiscall* )( void*, void*, const DrawModelState_t&, const ModelRenderInfo_t&, matrix3x4* );
		util::get_vfunc< fn >( this, 21 )( this, matctx, state, pInfo, pCustomBoneToWorld );
	}
};