Welcome to mirror list, hosted at ThFree Co, Russian Federation.

BL_Shader.h « Ketsji « gameengine « source - git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 19e0cb8e9b30f818abea19fd306a4f520df0e717 (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
#ifndef __BL_SHADER_H__
#define __BL_SHADER_H__

#include "PyObjectPlus.h"
#include "BL_Material.h"

// -----------------------------------
// user state management
typedef struct uSampler
{
	unsigned int	type;
	int				pass;
	int				unit;
	int				loc;
	unsigned int	glTexture;
}uSampler;

#define SAMP_2D		1
#define SAMP_CUBE	2


// -----------------------------------
typedef struct uBlending
{
	unsigned int pass;
	int src;	// GL_ blend func values
	int dest;
	float const_color[4];
}uBlending;
// -----------------------------------

// ----------------
class BL_Shader : public PyObjectPlus
{
	Py_Header;
private:
	unsigned int	mShader, 
					mVert,
					mFrag;
	int				mPass;
	bool			mOk;
	bool			mUse;
	uSampler		mSampler[MAXTEX];
	uBlending		mBlending;
	char*			vertProg;
	char*			fragProg;
	bool			LinkProgram();
	void			printInfo(unsigned int pr);

public:
	BL_Shader(int n, PyTypeObject *T=&Type);
	virtual ~BL_Shader();

	char*		GetVertPtr();
	char*		GetFragPtr();
	void		SetVertPtr( char *vert );
	void		SetFragPtr( char *frag );
	
	// ---
	int getNumPass()	{return mPass;}
	bool use()			{return mUse;}

	// ---
	// access
	const uSampler*		getSampler(int i);
	const uBlending*	getBlending( int pass );
	const bool			Ok()const;

	unsigned int		GetProg();
	unsigned int		GetVertexShader();
	unsigned int		GetFragmentShader();
	
	void InitializeSampler(
		int type,
		int unit,
		int pass,
		unsigned int texture
	);

	// -----------------------------------
	// python interface
	virtual PyObject* _getattr(const STR_String& attr);

	KX_PYMETHOD_DOC( BL_Shader, setSource );
	KX_PYMETHOD_DOC( BL_Shader, delSource );
	KX_PYMETHOD_DOC( BL_Shader, getVertexProg );
	KX_PYMETHOD_DOC( BL_Shader, getFragmentProg );
	KX_PYMETHOD_DOC( BL_Shader, setNumberOfPasses );

	// -----------------------------------
	KX_PYMETHOD_DOC( BL_Shader, isValid);
	KX_PYMETHOD_DOC( BL_Shader, validate);
	KX_PYMETHOD_DOC( BL_Shader, setUniform4f );
	KX_PYMETHOD_DOC( BL_Shader, setUniform3f );
	KX_PYMETHOD_DOC( BL_Shader, setUniform2f );
	KX_PYMETHOD_DOC( BL_Shader, setUniform1f );
	KX_PYMETHOD_DOC( BL_Shader, setUniform4i );
	KX_PYMETHOD_DOC( BL_Shader, setUniform3i );
	KX_PYMETHOD_DOC( BL_Shader, setUniform2i );
	KX_PYMETHOD_DOC( BL_Shader, setUniform1i );

	KX_PYMETHOD_DOC( BL_Shader, setUniformfv );
	KX_PYMETHOD_DOC( BL_Shader, setUniformiv );

	KX_PYMETHOD_DOC( BL_Shader, setUniformMatrix4 );
	KX_PYMETHOD_DOC( BL_Shader, setUniformMatrix3 );

	// these come from within the material buttons
	// sampler2d/samplerCube work
	KX_PYMETHOD_DOC( BL_Shader, setSampler);
	// user blending funcs
	KX_PYMETHOD_DOC( BL_Shader, setBlending );
};



#endif//__BL_SHADER_H__