2d Filters updated, now you can use custom filter and write your own GLSL shader program to filter rendering result.
This commit is contained in:
		| @@ -2820,7 +2820,8 @@ static void lib_link_object(FileData *fd, Main *main) | |||||||
| 					ma->toObject= newlibadr(fd, ob->id.lib, ma->toObject); | 					ma->toObject= newlibadr(fd, ob->id.lib, ma->toObject); | ||||||
| 				} | 				} | ||||||
| 				else if(act->type==ACT_2DFILTER){ | 				else if(act->type==ACT_2DFILTER){ | ||||||
| 					/* bTwoDFilterActuator *_2dfa = act->data; */ | 					bTwoDFilterActuator *_2dfa = act->data;  | ||||||
|  | 					_2dfa->text= newlibadr(fd, ob->id.lib, _2dfa->text); | ||||||
| 				} | 				} | ||||||
| 				act= act->next; | 				act= act->next; | ||||||
| 			} | 			} | ||||||
|   | |||||||
| @@ -38,6 +38,7 @@ struct Object; | |||||||
| struct Mesh; | struct Mesh; | ||||||
| struct Scene; | struct Scene; | ||||||
| struct Group; | struct Group; | ||||||
|  | struct Text; | ||||||
|  |  | ||||||
| /* ****************** ACTUATORS ********************* */ | /* ****************** ACTUATORS ********************* */ | ||||||
|  |  | ||||||
| @@ -192,14 +193,16 @@ typedef struct bVisibilityActuator { | |||||||
| } bVisibilityActuator; | } bVisibilityActuator; | ||||||
|  |  | ||||||
| typedef struct bTwoDFilterActuator{ | typedef struct bTwoDFilterActuator{ | ||||||
|  | 	char pad[4]; | ||||||
| 	/* Tells what type of 2D Filter*/ | 	/* Tells what type of 2D Filter*/ | ||||||
| 	short type; | 	short type; | ||||||
| 	/* (flag == 0) means 2D filter is activate and | 	/* (flag == 0) means 2D filter is activate and | ||||||
| 	   (flag != 0) means 2D filter is inactive*/ | 	   (flag != 0) means 2D filter is inactive*/ | ||||||
| 	short flag; | 	short flag; | ||||||
|  | 	int   int_arg; | ||||||
| 	/* a float argument */ | 	/* a float argument */ | ||||||
| 	float float_arg; | 	float float_arg; | ||||||
| 	int   int_arg; | 	struct Text *text; | ||||||
| }bTwoDFilterActuator; | }bTwoDFilterActuator; | ||||||
|  |  | ||||||
| typedef struct bActuator { | typedef struct bActuator { | ||||||
| @@ -404,19 +407,22 @@ typedef struct FreeCamera { | |||||||
| #define ACT_VISIBILITY_INVISIBLE       (1 << 0) | #define ACT_VISIBILITY_INVISIBLE       (1 << 0) | ||||||
|  |  | ||||||
| /* twodfilter->type */ | /* twodfilter->type */ | ||||||
| #define ACT_2DFILTER_NOFILTER			-1 | #define ACT_2DFILTER_ENABLED			-2 | ||||||
| #define ACT_2DFILTER_MOTIONBLUR			0 | #define ACT_2DFILTER_DISABLED			-1 | ||||||
| #define ACT_2DFILTER_BLUR				1 | #define ACT_2DFILTER_NOFILTER			0 | ||||||
| #define ACT_2DFILTER_SHARPEN			2 | #define ACT_2DFILTER_MOTIONBLUR			1 | ||||||
| #define ACT_2DFILTER_DILATION			3 | #define ACT_2DFILTER_BLUR				2 | ||||||
| #define ACT_2DFILTER_EROSION			4 | #define ACT_2DFILTER_SHARPEN			3 | ||||||
| #define ACT_2DFILTER_LAPLACIAN			5 | #define ACT_2DFILTER_DILATION			4 | ||||||
| #define ACT_2DFILTER_SOBEL				6 | #define ACT_2DFILTER_EROSION			5 | ||||||
| #define ACT_2DFILTER_PREWITT			7 | #define ACT_2DFILTER_LAPLACIAN			6 | ||||||
| #define ACT_2DFILTER_GRAYSCALE			8 | #define ACT_2DFILTER_SOBEL				7 | ||||||
| #define ACT_2DFILTER_SEPIA				9 | #define ACT_2DFILTER_PREWITT			8 | ||||||
| #define ACT_2DFILTER_INVERT				10 | #define ACT_2DFILTER_GRAYSCALE			9 | ||||||
| #define ACT_2DFILTER_NUMBER_OF_FILTERS	11 | #define ACT_2DFILTER_SEPIA				10 | ||||||
|  | #define ACT_2DFILTER_INVERT				11 | ||||||
|  | #define ACT_2DFILTER_CUSTOMFILTER		12 | ||||||
|  | #define ACT_2DFILTER_NUMBER_OF_FILTERS	13 | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -2178,7 +2178,11 @@ static short draw_actuatorbuttons(bActuator *act, uiBlock *block, short xco, sho | |||||||
| 	case ACT_2DFILTER: | 	case ACT_2DFILTER: | ||||||
| 		tdfa = act->data; | 		tdfa = act->data; | ||||||
|  |  | ||||||
| 		ysize= 50; | 		ysize = 50; | ||||||
|  | 		if(tdfa->type == ACT_2DFILTER_CUSTOMFILTER) | ||||||
|  | 		{ | ||||||
|  | 			ysize +=20; | ||||||
|  | 		} | ||||||
|         glRects( xco, yco-ysize, xco+width, yco );  |         glRects( xco, yco-ysize, xco+width, yco );  | ||||||
| 		uiEmboss( (float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1 ); | 		uiEmboss( (float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1 ); | ||||||
|  |  | ||||||
| @@ -2206,12 +2210,19 @@ static short draw_actuatorbuttons(bActuator *act, uiBlock *block, short xco, sho | |||||||
| 			case ACT_2DFILTER_SEPIA: | 			case ACT_2DFILTER_SEPIA: | ||||||
| 			case ACT_2DFILTER_INVERT: | 			case ACT_2DFILTER_INVERT: | ||||||
| 			case ACT_2DFILTER_NOFILTER: | 			case ACT_2DFILTER_NOFILTER: | ||||||
| 				uiDefButI(block, NUM, B_REDR, "Pass Number:", xco+30,yco-44,width-60,19,&tdfa->int_arg,-1.0,MAX_RENDER_PASS-1,0.0,0.0,"Set motion blur value"); | 			case ACT_2DFILTER_DISABLED: | ||||||
|  | 			case ACT_2DFILTER_ENABLED: | ||||||
|  | 				uiDefButI(block, NUM, B_REDR, "Pass Number:", xco+30,yco-44,width-60,19,&tdfa->int_arg,0.0,MAX_RENDER_PASS-1,0.0,0.0,"Set motion blur value"); | ||||||
|  | 				break; | ||||||
|  | 			case ACT_2DFILTER_CUSTOMFILTER: | ||||||
|  | 				uiDefButI(block, NUM, B_REDR, "Pass Number:", xco+30,yco-44,width-60,19,&tdfa->int_arg,0.0,MAX_RENDER_PASS-1,0.0,0.0,"Set motion blur value"); | ||||||
|  | 				uiDefIDPoinBut(block, test_scriptpoin_but, ID_SCRIPT, 1, "Script: ", xco+30,yco-64,width-60, 19, &tdfa->text, ""); | ||||||
| 				break; | 				break; | ||||||
| 		} | 		} | ||||||
| 		 | 		 | ||||||
| 		str= "2D Filter   %t|Motion Blur   %x0|Blur %x1|Sharpen %x2|Dilation %x3|Erosion %x4|" | 		str= "2D Filter   %t|Motion Blur   %x1|Blur %x2|Sharpen %x3|Dilation %x4|Erosion %x5|" | ||||||
| 				"Laplacian %x5|Sobel %x6|Prewitt %x7|Gray Scale %x8|Sepia %x9|Invert %x10|No Filter %x-1|"; | 				"Laplacian %x6|Sobel %x7|Prewitt %x8|Gray Scale %x9|Sepia %x10|Invert %x11|Custom Filter %x12|" | ||||||
|  | 				"Enable Filter %x-2|Disable Filter %x-1|Remove Filter %x0|"; | ||||||
| 		uiDefButS(block, MENU, B_REDR, str,	xco+30,yco-24,width-60, 19, &tdfa->type, 0.0, 0.0, 0.0, 0.0, "2D filter type"); | 		uiDefButS(block, MENU, B_REDR, str,	xco+30,yco-24,width-60, 19, &tdfa->type, 0.0, 0.0, 0.0, 0.0, "2D filter type"); | ||||||
| 		 | 		 | ||||||
| 		yco -= ysize; | 		yco -= ysize; | ||||||
|   | |||||||
| @@ -475,9 +475,9 @@ void KX_BlenderRenderTools::MotionBlur(RAS_IRasterizer* rasterizer) | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| void KX_BlenderRenderTools::Update2DFilter(RAS_2DFilterManager::RAS_2DFILTER_MODE filtermode, int pass) | void KX_BlenderRenderTools::Update2DFilter(RAS_2DFilterManager::RAS_2DFILTER_MODE filtermode, int pass, STR_String& text) | ||||||
| { | { | ||||||
| 	m_filtermanager.EnableFilter(filtermode, pass); | 	m_filtermanager.EnableFilter(filtermode, pass, text); | ||||||
| } | } | ||||||
|  |  | ||||||
| void KX_BlenderRenderTools::Render2DFilters(RAS_ICanvas* canvas) | void KX_BlenderRenderTools::Render2DFilters(RAS_ICanvas* canvas) | ||||||
|   | |||||||
| @@ -104,7 +104,7 @@ public: | |||||||
|  |  | ||||||
| 	virtual void MotionBlur(RAS_IRasterizer* rasterizer); | 	virtual void MotionBlur(RAS_IRasterizer* rasterizer); | ||||||
|  |  | ||||||
| 	virtual void Update2DFilter(RAS_2DFilterManager::RAS_2DFILTER_MODE filtermode, int pass); | 	virtual void Update2DFilter(RAS_2DFilterManager::RAS_2DFILTER_MODE filtermode, int pass, STR_String& text); | ||||||
|  |  | ||||||
| 	virtual	void Render2DFilters(RAS_ICanvas* canvas); | 	virtual	void Render2DFilters(RAS_ICanvas* canvas); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -37,6 +37,8 @@ | |||||||
|  |  | ||||||
| #define BLENDER_HACK_DTIME 0.02 | #define BLENDER_HACK_DTIME 0.02 | ||||||
|  |  | ||||||
|  | #include "MEM_guardedalloc.h" | ||||||
|  |  | ||||||
| #include "KX_BlenderSceneConverter.h" | #include "KX_BlenderSceneConverter.h" | ||||||
| #include "KX_ConvertActuators.h" | #include "KX_ConvertActuators.h" | ||||||
|  |  | ||||||
| @@ -70,7 +72,7 @@ | |||||||
| #include "KX_GameObject.h" | #include "KX_GameObject.h" | ||||||
|  |  | ||||||
| /* This little block needed for linking to Blender... */ | /* This little block needed for linking to Blender... */ | ||||||
|  | #include "BKE_text.h" | ||||||
| #include "BLI_blenlib.h" | #include "BLI_blenlib.h" | ||||||
|  |  | ||||||
| #include "KX_NetworkMessageActuator.h" | #include "KX_NetworkMessageActuator.h" | ||||||
| @@ -879,9 +881,18 @@ void BL_ConvertActuators(char* maggiename, | |||||||
| 				case ACT_2DFILTER_INVERT: | 				case ACT_2DFILTER_INVERT: | ||||||
| 					filtermode = RAS_2DFilterManager::RAS_2DFILTER_INVERT; | 					filtermode = RAS_2DFilterManager::RAS_2DFILTER_INVERT; | ||||||
| 					break; | 					break; | ||||||
|  | 				case ACT_2DFILTER_CUSTOMFILTER: | ||||||
|  | 					filtermode = RAS_2DFilterManager::RAS_2DFILTER_CUSTOMFILTER; | ||||||
|  | 					break; | ||||||
| 				case ACT_2DFILTER_NOFILTER: | 				case ACT_2DFILTER_NOFILTER: | ||||||
| 					filtermode = RAS_2DFilterManager::RAS_2DFILTER_NOFILTER; | 					filtermode = RAS_2DFilterManager::RAS_2DFILTER_NOFILTER; | ||||||
| 					break; | 					break; | ||||||
|  | 				case ACT_2DFILTER_DISABLED: | ||||||
|  | 					filtermode = RAS_2DFilterManager::RAS_2DFILTER_DISABLED; | ||||||
|  | 					break; | ||||||
|  | 				case ACT_2DFILTER_ENABLED: | ||||||
|  | 					filtermode = RAS_2DFilterManager::RAS_2DFILTER_ENABLED; | ||||||
|  | 					break; | ||||||
| 				default: | 				default: | ||||||
| 					filtermode = RAS_2DFilterManager::RAS_2DFILTER_NOFILTER; | 					filtermode = RAS_2DFilterManager::RAS_2DFILTER_NOFILTER; | ||||||
| 					break; | 					break; | ||||||
| @@ -890,6 +901,18 @@ void BL_ConvertActuators(char* maggiename, | |||||||
| 			tmp = new SCA_2DFilterActuator(gameobj, filtermode, _2dfilter->flag, | 			tmp = new SCA_2DFilterActuator(gameobj, filtermode, _2dfilter->flag, | ||||||
| 				_2dfilter->float_arg,_2dfilter->int_arg,ketsjiEngine->GetRasterizer(),rendertools); | 				_2dfilter->float_arg,_2dfilter->int_arg,ketsjiEngine->GetRasterizer(),rendertools); | ||||||
|  |  | ||||||
|  | 			if (_2dfilter->text) | ||||||
|  | 			{ | ||||||
|  | 				char *buf; | ||||||
|  | 				// this is some blender specific code | ||||||
|  | 				buf = txt_to_buf(_2dfilter->text); | ||||||
|  | 				if (buf) | ||||||
|  | 				{ | ||||||
|  | 					tmp->SetShaderText(STR_String(buf)); | ||||||
|  | 					MEM_freeN(buf); | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  |  | ||||||
|             baseact = tmp; |             baseact = tmp; | ||||||
| 			 | 			 | ||||||
| 		} | 		} | ||||||
|   | |||||||
| @@ -8,6 +8,9 @@ | |||||||
| #include <iostream> | #include <iostream> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | SCA_2DFilterActuator::~SCA_2DFilterActuator() | ||||||
|  | { | ||||||
|  | } | ||||||
|  |  | ||||||
| SCA_2DFilterActuator::SCA_2DFilterActuator( | SCA_2DFilterActuator::SCA_2DFilterActuator( | ||||||
|         SCA_IObject *gameobj,  |         SCA_IObject *gameobj,  | ||||||
| @@ -28,13 +31,13 @@ SCA_2DFilterActuator::SCA_2DFilterActuator( | |||||||
| { | { | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void SCA_2DFilterActuator::SetShaderText(STR_String& text) | ||||||
| SCA_2DFilterActuator::~SCA_2DFilterActuator() |  | ||||||
| { | { | ||||||
|  | 	m_shaderText = text; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| CValue* SCA_2DFilterActuator::GetReplica() | CValue* SCA_2DFilterActuator::GetReplica() | ||||||
| { | { | ||||||
|     SCA_2DFilterActuator* replica = new SCA_2DFilterActuator(*this); |     SCA_2DFilterActuator* replica = new SCA_2DFilterActuator(*this); | ||||||
| @@ -69,7 +72,7 @@ bool SCA_2DFilterActuator::Update() | |||||||
| 	} | 	} | ||||||
| 	else if(m_type < RAS_2DFilterManager::RAS_2DFILTER_NUMBER_OF_FILTERS) | 	else if(m_type < RAS_2DFilterManager::RAS_2DFILTER_NUMBER_OF_FILTERS) | ||||||
| 	{ | 	{ | ||||||
| 		m_rendertools->Update2DFilter(m_type, m_int_arg); | 		m_rendertools->Update2DFilter(m_type, m_int_arg, m_shaderText); | ||||||
| 	} | 	} | ||||||
|     return true; |     return true; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -16,6 +16,7 @@ private: | |||||||
| 	short m_flag; | 	short m_flag; | ||||||
| 	float m_float_arg; | 	float m_float_arg; | ||||||
| 	int   m_int_arg; | 	int   m_int_arg; | ||||||
|  | 	STR_String	m_shaderText; | ||||||
| 	RAS_IRasterizer* m_rasterizer; | 	RAS_IRasterizer* m_rasterizer; | ||||||
| 	RAS_IRenderTools* m_rendertools; | 	RAS_IRenderTools* m_rendertools; | ||||||
|  |  | ||||||
| @@ -32,7 +33,7 @@ public: | |||||||
|         PyTypeObject* T=&Type |         PyTypeObject* T=&Type | ||||||
|         ); |         ); | ||||||
|  |  | ||||||
|  | 	void	SetShaderText(STR_String& text); | ||||||
|     virtual ~SCA_2DFilterActuator(); |     virtual ~SCA_2DFilterActuator(); | ||||||
|     virtual bool Update(); |     virtual bool Update(); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -593,9 +593,9 @@ void GPC_RenderTools::MotionBlur(RAS_IRasterizer* rasterizer) | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| void GPC_RenderTools::Update2DFilter(RAS_2DFilterManager::RAS_2DFILTER_MODE filtermode, int pass) | void GPC_RenderTools::Update2DFilter(RAS_2DFilterManager::RAS_2DFILTER_MODE filtermode, int pass, STR_String& text) | ||||||
| { | { | ||||||
| 	m_filtermanager.EnableFilter(filtermode, pass); | 	m_filtermanager.EnableFilter(filtermode, pass, text); | ||||||
| } | } | ||||||
|  |  | ||||||
| void GPC_RenderTools::Render2DFilters(RAS_ICanvas* canvas) | void GPC_RenderTools::Render2DFilters(RAS_ICanvas* canvas) | ||||||
|   | |||||||
| @@ -152,7 +152,7 @@ public: | |||||||
|  |  | ||||||
| 	virtual void MotionBlur(RAS_IRasterizer* rasterizer); | 	virtual void MotionBlur(RAS_IRasterizer* rasterizer); | ||||||
|  |  | ||||||
| 	virtual void Update2DFilter(RAS_2DFilterManager::RAS_2DFILTER_MODE filtermode, int pass); | 	virtual void Update2DFilter(RAS_2DFilterManager::RAS_2DFILTER_MODE filtermode, int pass, STR_String& text); | ||||||
|  |  | ||||||
| 	virtual	void Render2DFilters(RAS_ICanvas* canvas); | 	virtual	void Render2DFilters(RAS_ICanvas* canvas); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -12,6 +12,7 @@ | |||||||
| #include "RAS_OpenGLFilters/RAS_Sepia2DFilter.h" | #include "RAS_OpenGLFilters/RAS_Sepia2DFilter.h" | ||||||
| #include "RAS_OpenGLFilters/RAS_Invert2DFilter.h" | #include "RAS_OpenGLFilters/RAS_Invert2DFilter.h" | ||||||
|  |  | ||||||
|  | #include "STR_String.h" | ||||||
| #include "RAS_ICanvas.h" | #include "RAS_ICanvas.h" | ||||||
| #include "RAS_2DFilterManager.h" | #include "RAS_2DFilterManager.h" | ||||||
| #include <iostream> | #include <iostream> | ||||||
| @@ -48,11 +49,10 @@ numberoffilters(0),texname(-1) | |||||||
|  |  | ||||||
| 	int passindex; | 	int passindex; | ||||||
| 	for(passindex =0; passindex<MAX_RENDER_PASS; passindex++) | 	for(passindex =0; passindex<MAX_RENDER_PASS; passindex++) | ||||||
|  | 	{ | ||||||
| 		m_filters[passindex] = 0; | 		m_filters[passindex] = 0; | ||||||
|  | 		m_enabled[passindex] = 0; | ||||||
| 	int programindex; | 	} | ||||||
| 	for(programindex=0; programindex<RAS_2DFILTER_NUMBER_OF_FILTERS; programindex++) |  | ||||||
| 		m_programs[programindex] = 0; |  | ||||||
|  |  | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -129,20 +129,31 @@ unsigned int RAS_2DFilterManager::CreateShaderProgram(int filtermode) | |||||||
| 		return 0; | 		return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| void RAS_2DFilterManager::StartShaderProgram(int filtermode) | void RAS_2DFilterManager::StartShaderProgram(unsigned int shaderprogram) | ||||||
| { | { | ||||||
|     GLint uniformLoc; |     GLint uniformLoc; | ||||||
| 	bgl::blUseProgramObjectARB(m_programs[filtermode]); | 	bgl::blUseProgramObjectARB(shaderprogram); | ||||||
| 	uniformLoc = bgl::blGetUniformLocationARB(m_programs[filtermode], "sampler0"); | 	uniformLoc = bgl::blGetUniformLocationARB(shaderprogram, "bgl_RenderedTexture"); | ||||||
|     if (uniformLoc != -1) |     if (uniformLoc != -1) | ||||||
|     { |     { | ||||||
| 		bgl::blUniform1iARB(uniformLoc, 0); | 		bgl::blUniform1iARB(uniformLoc, 0); | ||||||
|     } |     } | ||||||
| 	uniformLoc = bgl::blGetUniformLocationARB(m_programs[filtermode], "tc_offset"); | 	uniformLoc = bgl::blGetUniformLocationARB(shaderprogram, "bgl_TextureCoordinateOffset"); | ||||||
|     if (uniformLoc != -1) |     if (uniformLoc != -1) | ||||||
|     { |     { | ||||||
|         bgl::blUniform2fvARB(uniformLoc, 9, textureoffsets); |         bgl::blUniform2fvARB(uniformLoc, 9, textureoffsets); | ||||||
|     } |     } | ||||||
|  | 	uniformLoc = bgl::blGetUniformLocationARB(shaderprogram, "bgl_RenderedTextureWidth"); | ||||||
|  |     if (uniformLoc != -1) | ||||||
|  |     { | ||||||
|  | 		bgl::blUniform1fARB(uniformLoc,texturewidth); | ||||||
|  |     } | ||||||
|  | 	uniformLoc = bgl::blGetUniformLocationARB(shaderprogram, "bgl_RenderedTextureHeight"); | ||||||
|  |     if (uniformLoc != -1) | ||||||
|  |     { | ||||||
|  | 		bgl::blUniform1fARB(uniformLoc,textureheight); | ||||||
|  |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|  |  | ||||||
| void RAS_2DFilterManager::EndShaderProgram() | void RAS_2DFilterManager::EndShaderProgram() | ||||||
| @@ -200,7 +211,7 @@ void RAS_2DFilterManager::UpdateOffsetMatrix(int width, int height) | |||||||
|  |  | ||||||
| void RAS_2DFilterManager::RenderFilters(RAS_ICanvas* canvas) | void RAS_2DFilterManager::RenderFilters(RAS_ICanvas* canvas) | ||||||
| { | { | ||||||
| 	if(numberoffilters<=0 || !isshadersupported) | 	if(!isshadersupported) | ||||||
| 		return; | 		return; | ||||||
|  |  | ||||||
| 	if(canvaswidth != canvas->GetWidth() || canvasheight != canvas->GetHeight()) | 	if(canvaswidth != canvas->GetWidth() || canvasheight != canvas->GetHeight()) | ||||||
| @@ -213,7 +224,7 @@ void RAS_2DFilterManager::RenderFilters(RAS_ICanvas* canvas) | |||||||
| 	bool first = true; | 	bool first = true; | ||||||
| 	for(passindex =0; passindex<MAX_RENDER_PASS; passindex++) | 	for(passindex =0; passindex<MAX_RENDER_PASS; passindex++) | ||||||
| 	{ | 	{ | ||||||
| 		if(m_filters[passindex]) | 		if(m_filters[passindex] && m_enabled[passindex]) | ||||||
| 		{ | 		{ | ||||||
| 			if(first) | 			if(first) | ||||||
| 			{ | 			{ | ||||||
| @@ -253,33 +264,48 @@ void RAS_2DFilterManager::RenderFilters(RAS_ICanvas* canvas) | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| void RAS_2DFilterManager::EnableFilter(RAS_2DFILTER_MODE mode, int pass) | void RAS_2DFilterManager::EnableFilter(RAS_2DFILTER_MODE mode, int pass, STR_String& text) | ||||||
| { | { | ||||||
| 	if(!isshadersupported) | 	if(!isshadersupported) | ||||||
| 		return; | 		return; | ||||||
| 	if( pass == -1) | 	if(pass<0 || pass>=MAX_RENDER_PASS) | ||||||
|  | 		return; | ||||||
|  |  | ||||||
|  | 	if(mode == RAS_2DFILTER_DISABLED) | ||||||
| 	{ | 	{ | ||||||
| 		if(m_programs[mode] == 0) | 		m_enabled[pass] = 0; | ||||||
| 		m_programs[mode] = CreateShaderProgram(mode); | 		return; | ||||||
| 	} | 	} | ||||||
| 	else if( pass < MAX_RENDER_PASS ) |  | ||||||
|  | 	if(mode == RAS_2DFILTER_ENABLED) | ||||||
| 	{ | 	{ | ||||||
| 		if(mode == RAS_2DFILTER_NOFILTER ) | 		m_enabled[pass] = 1; | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if(mode == RAS_2DFILTER_NOFILTER) | ||||||
| 	{ | 	{ | ||||||
| 			if(m_filters[pass] != 0) | 		if(m_filters[pass]) | ||||||
| 				numberoffilters--; | 			bgl::blDeleteObjectARB(m_filters[pass]); | ||||||
|  | 		m_enabled[pass] = 0; | ||||||
| 		m_filters[pass] = 0; | 		m_filters[pass] = 0; | ||||||
|  | 		return; | ||||||
| 	} | 	} | ||||||
| 		else | 	 | ||||||
|  | 	if(mode == RAS_2DFILTER_CUSTOMFILTER) | ||||||
| 	{ | 	{ | ||||||
| 			if(!m_programs[mode]) | 		if(m_filters[pass]) | ||||||
| 				m_programs[mode] = CreateShaderProgram(mode); | 			bgl::blDeleteObjectARB(m_filters[pass]); | ||||||
| 			if(m_programs[mode]) | 		m_filters[pass] = CreateShaderProgram(text.Ptr()); | ||||||
|  | 		m_enabled[pass] = 1; | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if(mode>=RAS_2DFILTER_MOTIONBLUR && mode<=RAS_2DFILTER_INVERT) | ||||||
| 	{ | 	{ | ||||||
| 				if(m_filters[pass] == 0) | 		if(m_filters[pass]) | ||||||
| 					numberoffilters++; | 			bgl::blDeleteObjectARB(m_filters[pass]); | ||||||
| 				m_filters[pass] = mode; | 		m_filters[pass] = CreateShaderProgram(mode); | ||||||
| 			} | 		m_enabled[pass] = 1; | ||||||
| 		} |  | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|   | |||||||
| @@ -10,7 +10,7 @@ class RAS_2DFilterManager | |||||||
| private: | private: | ||||||
| 	unsigned int	CreateShaderProgram(char* shadersource); | 	unsigned int	CreateShaderProgram(char* shadersource); | ||||||
| 	unsigned int	CreateShaderProgram(int filtermode); | 	unsigned int	CreateShaderProgram(int filtermode); | ||||||
| 	void			StartShaderProgram(int filtermode); | 	void			StartShaderProgram(unsigned int shaderprogram); | ||||||
| 	void			EndShaderProgram(); | 	void			EndShaderProgram(); | ||||||
|  |  | ||||||
| 	float			textureoffsets[18]; | 	float			textureoffsets[18]; | ||||||
| @@ -25,6 +25,8 @@ private: | |||||||
| 	bool			isshadersupported; | 	bool			isshadersupported; | ||||||
| public: | public: | ||||||
| 	enum RAS_2DFILTER_MODE { | 	enum RAS_2DFILTER_MODE { | ||||||
|  | 		RAS_2DFILTER_ENABLED = -2, | ||||||
|  | 		RAS_2DFILTER_DISABLED = -1, | ||||||
| 		RAS_2DFILTER_NOFILTER = 0, | 		RAS_2DFILTER_NOFILTER = 0, | ||||||
| 		RAS_2DFILTER_MOTIONBLUR, | 		RAS_2DFILTER_MOTIONBLUR, | ||||||
| 		RAS_2DFILTER_BLUR, | 		RAS_2DFILTER_BLUR, | ||||||
| @@ -37,12 +39,12 @@ public: | |||||||
| 		RAS_2DFILTER_GRAYSCALE, | 		RAS_2DFILTER_GRAYSCALE, | ||||||
| 		RAS_2DFILTER_SEPIA, | 		RAS_2DFILTER_SEPIA, | ||||||
| 		RAS_2DFILTER_INVERT, | 		RAS_2DFILTER_INVERT, | ||||||
|  | 		RAS_2DFILTER_CUSTOMFILTER, | ||||||
| 		RAS_2DFILTER_NUMBER_OF_FILTERS | 		RAS_2DFILTER_NUMBER_OF_FILTERS | ||||||
| 	}; | 	}; | ||||||
|  |  | ||||||
| 	int	m_filters[MAX_RENDER_PASS]; | 	unsigned int	m_filters[MAX_RENDER_PASS]; | ||||||
|  | 	short			m_enabled[MAX_RENDER_PASS]; | ||||||
| 	unsigned int m_programs[RAS_2DFILTER_NUMBER_OF_FILTERS]; |  | ||||||
|  |  | ||||||
| 	RAS_2DFilterManager(); | 	RAS_2DFilterManager(); | ||||||
|  |  | ||||||
| @@ -54,6 +56,6 @@ public: | |||||||
|  |  | ||||||
| 	void RenderFilters(RAS_ICanvas* canvas); | 	void RenderFilters(RAS_ICanvas* canvas); | ||||||
|  |  | ||||||
| 	void EnableFilter(RAS_2DFILTER_MODE mode, int pass); | 	void EnableFilter(RAS_2DFILTER_MODE mode, int pass, STR_String& text); | ||||||
| }; | }; | ||||||
| #endif | #endif | ||||||
|   | |||||||
| @@ -183,7 +183,7 @@ public: | |||||||
|  |  | ||||||
| 	virtual | 	virtual | ||||||
| 		void | 		void | ||||||
| 		Update2DFilter(RAS_2DFilterManager::RAS_2DFILTER_MODE filtermode, int pass)=0; | 		Update2DFilter(RAS_2DFilterManager::RAS_2DFILTER_MODE filtermode, int pass, STR_String& text)=0; | ||||||
|  |  | ||||||
| 	virtual | 	virtual | ||||||
| 		void | 		void | ||||||
|   | |||||||
| @@ -2,8 +2,8 @@ | |||||||
| #define __RAS_BLUR2DFILTER | #define __RAS_BLUR2DFILTER | ||||||
|  |  | ||||||
| char * BlurFragmentShader=STRINGIFY( | char * BlurFragmentShader=STRINGIFY( | ||||||
| uniform sampler2D sampler0; | uniform sampler2D bgl_RenderedTexture; | ||||||
| uniform vec2 tc_offset[9]; | uniform vec2 bgl_TextureCoordinateOffset[9]; | ||||||
|  |  | ||||||
| void main(void) | void main(void) | ||||||
| { | { | ||||||
| @@ -11,8 +11,8 @@ void main(void) | |||||||
|  |  | ||||||
|     for (int i = 0; i < 9; i++) |     for (int i = 0; i < 9; i++) | ||||||
|     { |     { | ||||||
|         sample[i] = texture2D(sampler0,  |         sample[i] = texture2D(bgl_RenderedTexture,  | ||||||
|                               gl_TexCoord[0].st + tc_offset[i]); |                               gl_TexCoord[0].st + bgl_TextureCoordinateOffset[i]); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     gl_FragColor = (sample[0] + (2.0*sample[1]) + sample[2] +  |     gl_FragColor = (sample[0] + (2.0*sample[1]) + sample[2] +  | ||||||
|   | |||||||
| @@ -2,8 +2,8 @@ | |||||||
| #define __RAS_DILATION2DFILTER | #define __RAS_DILATION2DFILTER | ||||||
|  |  | ||||||
| char * DilationFragmentShader=STRINGIFY( | char * DilationFragmentShader=STRINGIFY( | ||||||
| uniform sampler2D sampler0; | uniform sampler2D bgl_RenderedTexture; | ||||||
| uniform vec2 tc_offset[9]; | uniform vec2 bgl_TextureCoordinateOffset[9]; | ||||||
|  |  | ||||||
| void main(void) | void main(void) | ||||||
| { | { | ||||||
| @@ -12,8 +12,8 @@ void main(void) | |||||||
|  |  | ||||||
|     for (int i = 0; i < 9; i++) |     for (int i = 0; i < 9; i++) | ||||||
|     { |     { | ||||||
|         sample[i] = texture2D(sampler0,  |         sample[i] = texture2D(bgl_RenderedTexture,  | ||||||
|                               gl_TexCoord[0].st + tc_offset[i]); |                               gl_TexCoord[0].st + bgl_TextureCoordinateOffset[i]); | ||||||
|         maxValue = max(sample[i], maxValue); |         maxValue = max(sample[i], maxValue); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -2,8 +2,8 @@ | |||||||
| #define __RAS_EROSION2DFILTER | #define __RAS_EROSION2DFILTER | ||||||
|  |  | ||||||
| char * ErosionFragmentShader=STRINGIFY( | char * ErosionFragmentShader=STRINGIFY( | ||||||
| uniform sampler2D sampler0; | uniform sampler2D bgl_RenderedTexture; | ||||||
| uniform vec2 tc_offset[9]; | uniform vec2 bgl_TextureCoordinateOffset[9]; | ||||||
|  |  | ||||||
| void main(void) | void main(void) | ||||||
| { | { | ||||||
| @@ -12,8 +12,8 @@ void main(void) | |||||||
|  |  | ||||||
|     for (int i = 0; i < 9; i++) |     for (int i = 0; i < 9; i++) | ||||||
|     { |     { | ||||||
|         sample[i] = texture2D(sampler0,  |         sample[i] = texture2D(bgl_RenderedTexture,  | ||||||
|                               gl_TexCoord[0].st + tc_offset[i]); |                               gl_TexCoord[0].st + bgl_TextureCoordinateOffset[i]); | ||||||
|         minValue = min(sample[i], minValue); |         minValue = min(sample[i], minValue); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -2,11 +2,11 @@ | |||||||
| #define __RAS_GRAYSCALE2DFILTER | #define __RAS_GRAYSCALE2DFILTER | ||||||
|  |  | ||||||
| char * GrayScaleFragmentShader=STRINGIFY( | char * GrayScaleFragmentShader=STRINGIFY( | ||||||
| uniform sampler2D sampler0; | uniform sampler2D bgl_RenderedTexture; | ||||||
|  |  | ||||||
| void main(void) | void main(void) | ||||||
| { | { | ||||||
| 	vec4 texcolor = texture2D(sampler0, gl_TexCoord[0].st);  | 	vec4 texcolor = texture2D(bgl_RenderedTexture, gl_TexCoord[0].st);  | ||||||
| 	float gray = dot(texcolor.rgb, vec3(0.299, 0.587, 0.114)); | 	float gray = dot(texcolor.rgb, vec3(0.299, 0.587, 0.114)); | ||||||
|     gl_FragColor = vec4(gray, gray, gray, texcolor.a); |     gl_FragColor = vec4(gray, gray, gray, texcolor.a); | ||||||
| } | } | ||||||
|   | |||||||
| @@ -2,12 +2,11 @@ | |||||||
| #define __RAS_INVERT2DFILTER | #define __RAS_INVERT2DFILTER | ||||||
|  |  | ||||||
| char * InvertFragmentShader=STRINGIFY( | char * InvertFragmentShader=STRINGIFY( | ||||||
| uniform sampler2D sampler0; | uniform sampler2D bgl_RenderedTexture; | ||||||
| uniform vec2 offset[9]; |  | ||||||
|  |  | ||||||
| void main(void) | void main(void) | ||||||
| { | { | ||||||
| 	vec4 texcolor = texture2D(sampler0, gl_TexCoord[0].st);  | 	vec4 texcolor = texture2D(bgl_RenderedTexture, gl_TexCoord[0].st);  | ||||||
| 	gl_FragColor.rgb = 1.0 - texcolor.rgb; | 	gl_FragColor.rgb = 1.0 - texcolor.rgb; | ||||||
|     gl_FragColor.a = texcolor.a; |     gl_FragColor.a = texcolor.a; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -2,8 +2,8 @@ | |||||||
| #define __RAS_LAPLACION2DFILTER | #define __RAS_LAPLACION2DFILTER | ||||||
|  |  | ||||||
| char * LaplacionFragmentShader=STRINGIFY( | char * LaplacionFragmentShader=STRINGIFY( | ||||||
| uniform sampler2D sampler0; | uniform sampler2D bgl_RenderedTexture; | ||||||
| uniform vec2 tc_offset[9]; | uniform vec2 bgl_TextureCoordinateOffset[9]; | ||||||
|  |  | ||||||
| void main(void) | void main(void) | ||||||
| { | { | ||||||
| @@ -11,8 +11,8 @@ void main(void) | |||||||
|  |  | ||||||
|     for (int i = 0; i < 9; i++) |     for (int i = 0; i < 9; i++) | ||||||
|     { |     { | ||||||
|         sample[i] = texture2D(sampler0,  |         sample[i] = texture2D(bgl_RenderedTexture,  | ||||||
|                               gl_TexCoord[0].st + tc_offset[i]); |                               gl_TexCoord[0].st + bgl_TextureCoordinateOffset[i]); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     gl_FragColor = (sample[4] * 8.0) -  |     gl_FragColor = (sample[4] * 8.0) -  | ||||||
|   | |||||||
| @@ -2,8 +2,8 @@ | |||||||
| #define __RAS_PREWITT2DFILTER | #define __RAS_PREWITT2DFILTER | ||||||
|  |  | ||||||
| char * PrewittFragmentShader=STRINGIFY( | char * PrewittFragmentShader=STRINGIFY( | ||||||
| uniform sampler2D sampler0; | uniform sampler2D bgl_RenderedTexture; | ||||||
| uniform vec2 tc_offset[9]; | uniform vec2 bgl_TextureCoordinateOffset[9]; | ||||||
|  |  | ||||||
| void main(void) | void main(void) | ||||||
| { | { | ||||||
| @@ -11,8 +11,8 @@ void main(void) | |||||||
|  |  | ||||||
|     for (int i = 0; i < 9; i++) |     for (int i = 0; i < 9; i++) | ||||||
|     { |     { | ||||||
|         sample[i] = texture2D(sampler0,  |         sample[i] = texture2D(bgl_RenderedTexture,  | ||||||
|                               gl_TexCoord[0].st + tc_offset[i]); |                               gl_TexCoord[0].st + bgl_TextureCoordinateOffset[i]); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     vec4 horizEdge = sample[2] + sample[5] + sample[8] - |     vec4 horizEdge = sample[2] + sample[5] + sample[8] - | ||||||
|   | |||||||
| @@ -2,12 +2,11 @@ | |||||||
| #define __RAS_SEPIA2DFILTER | #define __RAS_SEPIA2DFILTER | ||||||
|  |  | ||||||
| char * SepiaFragmentShader=STRINGIFY( | char * SepiaFragmentShader=STRINGIFY( | ||||||
| uniform sampler2D sampler0; | uniform sampler2D bgl_RenderedTexture; | ||||||
| uniform vec2 offset[9]; |  | ||||||
|  |  | ||||||
| void main(void) | void main(void) | ||||||
| { | { | ||||||
| 	vec4 texcolor = texture2D(sampler0, gl_TexCoord[0].st);  | 	vec4 texcolor = texture2D(bgl_RenderedTexture, gl_TexCoord[0].st);  | ||||||
| 	float gray = dot(texcolor.rgb, vec3(0.299, 0.587, 0.114)); | 	float gray = dot(texcolor.rgb, vec3(0.299, 0.587, 0.114)); | ||||||
| 	gl_FragColor = vec4(gray * vec3(1.2, 1.0, 0.8), texcolor.a); | 	gl_FragColor = vec4(gray * vec3(1.2, 1.0, 0.8), texcolor.a); | ||||||
| } | } | ||||||
|   | |||||||
| @@ -2,8 +2,8 @@ | |||||||
| #define __RAS_SHARPEN2DFILTER | #define __RAS_SHARPEN2DFILTER | ||||||
|  |  | ||||||
| char * SharpenFragmentShader=STRINGIFY( | char * SharpenFragmentShader=STRINGIFY( | ||||||
| uniform sampler2D sampler0; | uniform sampler2D bgl_RenderedTexture; | ||||||
| uniform vec2 tc_offset[9]; | uniform vec2 bgl_TextureCoordinateOffset[9]; | ||||||
|  |  | ||||||
| void main(void) | void main(void) | ||||||
| { | { | ||||||
| @@ -11,8 +11,8 @@ void main(void) | |||||||
|  |  | ||||||
|     for (int i = 0; i < 9; i++) |     for (int i = 0; i < 9; i++) | ||||||
|     { |     { | ||||||
|         sample[i] = texture2D(sampler0,  |         sample[i] = texture2D(bgl_RenderedTexture,  | ||||||
|                               gl_TexCoord[0].st + tc_offset[i]); |                               gl_TexCoord[0].st + bgl_TextureCoordinateOffset[i]); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     gl_FragColor = (sample[4] * 9.0) -  |     gl_FragColor = (sample[4] * 9.0) -  | ||||||
|   | |||||||
| @@ -2,8 +2,8 @@ | |||||||
| #define __RAS_SOBEL2DFILTER | #define __RAS_SOBEL2DFILTER | ||||||
|  |  | ||||||
| char * SobelFragmentShader=STRINGIFY( | char * SobelFragmentShader=STRINGIFY( | ||||||
| uniform sampler2D sampler0; | uniform sampler2D bgl_RenderedTexture; | ||||||
| uniform vec2 tc_offset[9]; | uniform vec2 bgl_TextureCoordinateOffset[9]; | ||||||
|  |  | ||||||
| void main(void) | void main(void) | ||||||
| { | { | ||||||
| @@ -11,8 +11,8 @@ void main(void) | |||||||
|  |  | ||||||
|     for (int i = 0; i < 9; i++) |     for (int i = 0; i < 9; i++) | ||||||
|     { |     { | ||||||
|         sample[i] = texture2D(sampler0,  |         sample[i] = texture2D(bgl_RenderedTexture,  | ||||||
|                               gl_TexCoord[0].st + tc_offset[i]); |                               gl_TexCoord[0].st + bgl_TextureCoordinateOffset[i]); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     vec4 horizEdge = sample[2] + (2.0*sample[5]) + sample[8] - |     vec4 horizEdge = sample[2] + (2.0*sample[5]) + sample[8] - | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user