Fix line endings in the new driver
This commit is contained in:
		| @@ -1,36 +1,36 @@ | |||||||
| // Copyright (C) 2023 Vitaliy Lobachevskiy | // Copyright (C) 2023 Vitaliy Lobachevskiy | ||||||
| // Copyright (C) 2015 Patryk Nadrowski | // Copyright (C) 2015 Patryk Nadrowski | ||||||
| // This file is part of the "Irrlicht Engine". | // This file is part of the "Irrlicht Engine". | ||||||
| // For conditions of distribution and use, see copyright notice in irrlicht.h | // For conditions of distribution and use, see copyright notice in irrlicht.h | ||||||
|  |  | ||||||
| #pragma once | #pragma once | ||||||
|  |  | ||||||
| #define GL_GLEXT_PROTOTYPES | #define GL_GLEXT_PROTOTYPES | ||||||
| #include <SDL_video.h> | #include <SDL_video.h> | ||||||
| #include <SDL_opengl.h> | #include <SDL_opengl.h> | ||||||
|  |  | ||||||
| namespace irr | namespace irr | ||||||
| { | { | ||||||
| namespace video | namespace video | ||||||
| { | { | ||||||
|  |  | ||||||
| 	// Forward declarations. | 	// Forward declarations. | ||||||
|  |  | ||||||
| 	class COpenGLCoreFeature; | 	class COpenGLCoreFeature; | ||||||
|  |  | ||||||
| 	template <class TOpenGLDriver> | 	template <class TOpenGLDriver> | ||||||
| 	class COpenGLCoreTexture; | 	class COpenGLCoreTexture; | ||||||
|  |  | ||||||
| 	template <class TOpenGLDriver, class TOpenGLTexture> | 	template <class TOpenGLDriver, class TOpenGLTexture> | ||||||
| 	class COpenGLCoreRenderTarget; | 	class COpenGLCoreRenderTarget; | ||||||
|  |  | ||||||
| 	template <class TOpenGLDriver, class TOpenGLTexture> | 	template <class TOpenGLDriver, class TOpenGLTexture> | ||||||
| 	class COpenGLCoreCacheHandler; | 	class COpenGLCoreCacheHandler; | ||||||
|  |  | ||||||
| 	class COpenGL3DriverBase; | 	class COpenGL3DriverBase; | ||||||
| 	typedef COpenGLCoreTexture<COpenGL3DriverBase> COpenGL3Texture; | 	typedef COpenGLCoreTexture<COpenGL3DriverBase> COpenGL3Texture; | ||||||
| 	typedef COpenGLCoreRenderTarget<COpenGL3DriverBase, COpenGL3Texture> COpenGL3RenderTarget; | 	typedef COpenGLCoreRenderTarget<COpenGL3DriverBase, COpenGL3Texture> COpenGL3RenderTarget; | ||||||
| 	typedef COpenGLCoreCacheHandler<COpenGL3DriverBase, COpenGL3Texture> COpenGL3CacheHandler; | 	typedef COpenGLCoreCacheHandler<COpenGL3DriverBase, COpenGL3Texture> COpenGL3CacheHandler; | ||||||
|  |  | ||||||
| } | } | ||||||
| } | } | ||||||
|   | |||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,395 +1,395 @@ | |||||||
| // Copyright (C) 2023 Vitaliy Lobachevskiy | // Copyright (C) 2023 Vitaliy Lobachevskiy | ||||||
| // Copyright (C) 2014 Patryk Nadrowski | // Copyright (C) 2014 Patryk Nadrowski | ||||||
| // Copyright (C) 2009-2010 Amundis | // Copyright (C) 2009-2010 Amundis | ||||||
| // This file is part of the "Irrlicht Engine". | // This file is part of the "Irrlicht Engine". | ||||||
| // For conditions of distribution and use, see copyright notice in Irrlicht.h | // For conditions of distribution and use, see copyright notice in Irrlicht.h | ||||||
|  |  | ||||||
| #pragma once | #pragma once | ||||||
|  |  | ||||||
| #include "SIrrCreationParameters.h" | #include "SIrrCreationParameters.h" | ||||||
|  |  | ||||||
| #include "Common.h" | #include "Common.h" | ||||||
| #include "CNullDriver.h" | #include "CNullDriver.h" | ||||||
| #include "IMaterialRendererServices.h" | #include "IMaterialRendererServices.h" | ||||||
| #include "EDriverFeatures.h" | #include "EDriverFeatures.h" | ||||||
| #include "fast_atof.h" | #include "fast_atof.h" | ||||||
| #include "ExtensionHandler.h" | #include "ExtensionHandler.h" | ||||||
| #include "IContextManager.h" | #include "IContextManager.h" | ||||||
|  |  | ||||||
| namespace irr | namespace irr | ||||||
| { | { | ||||||
| namespace video | namespace video | ||||||
| { | { | ||||||
| 	struct VertexType; | 	struct VertexType; | ||||||
|  |  | ||||||
| 	class COpenGL3FixedPipelineRenderer; | 	class COpenGL3FixedPipelineRenderer; | ||||||
| 	class COpenGL3Renderer2D; | 	class COpenGL3Renderer2D; | ||||||
|  |  | ||||||
| 	class COpenGL3DriverBase : public CNullDriver, public IMaterialRendererServices, public COpenGL3ExtensionHandler | 	class COpenGL3DriverBase : public CNullDriver, public IMaterialRendererServices, public COpenGL3ExtensionHandler | ||||||
| 	{ | 	{ | ||||||
| 		friend class COpenGLCoreTexture<COpenGL3DriverBase>; | 		friend class COpenGLCoreTexture<COpenGL3DriverBase>; | ||||||
|  |  | ||||||
| 	protected: | 	protected: | ||||||
| 		//! constructor (use createOpenGL3Driver instead) | 		//! constructor (use createOpenGL3Driver instead) | ||||||
| 		COpenGL3DriverBase(const SIrrlichtCreationParameters& params, io::IFileSystem* io, IContextManager* contextManager); | 		COpenGL3DriverBase(const SIrrlichtCreationParameters& params, io::IFileSystem* io, IContextManager* contextManager); | ||||||
|  |  | ||||||
| 	public: | 	public: | ||||||
|  |  | ||||||
| 		//! destructor | 		//! destructor | ||||||
| 		virtual ~COpenGL3DriverBase(); | 		virtual ~COpenGL3DriverBase(); | ||||||
|  |  | ||||||
| 		virtual bool beginScene(u16 clearFlag, SColor clearColor = SColor(255, 0, 0, 0), f32 clearDepth = 1.f, u8 clearStencil = 0, | 		virtual bool beginScene(u16 clearFlag, SColor clearColor = SColor(255, 0, 0, 0), f32 clearDepth = 1.f, u8 clearStencil = 0, | ||||||
| 			const SExposedVideoData& videoData = SExposedVideoData(), core::rect<s32>* sourceRect = 0) override; | 			const SExposedVideoData& videoData = SExposedVideoData(), core::rect<s32>* sourceRect = 0) override; | ||||||
|  |  | ||||||
| 		bool endScene() override; | 		bool endScene() override; | ||||||
|  |  | ||||||
| 		//! sets transformation | 		//! sets transformation | ||||||
| 		void setTransform(E_TRANSFORMATION_STATE state, const core::matrix4& mat) override; | 		void setTransform(E_TRANSFORMATION_STATE state, const core::matrix4& mat) override; | ||||||
|  |  | ||||||
| 		struct SHWBufferLink_opengl : public SHWBufferLink | 		struct SHWBufferLink_opengl : public SHWBufferLink | ||||||
| 		{ | 		{ | ||||||
| 			SHWBufferLink_opengl(const scene::IMeshBuffer *meshBuffer) | 			SHWBufferLink_opengl(const scene::IMeshBuffer *meshBuffer) | ||||||
| 			: SHWBufferLink(meshBuffer), vbo_verticesID(0), vbo_indicesID(0) | 			: SHWBufferLink(meshBuffer), vbo_verticesID(0), vbo_indicesID(0) | ||||||
| 			, vbo_verticesSize(0), vbo_indicesSize(0) | 			, vbo_verticesSize(0), vbo_indicesSize(0) | ||||||
| 			{} | 			{} | ||||||
|  |  | ||||||
| 			u32 vbo_verticesID; //tmp | 			u32 vbo_verticesID; //tmp | ||||||
| 			u32 vbo_indicesID; //tmp | 			u32 vbo_indicesID; //tmp | ||||||
|  |  | ||||||
| 			u32 vbo_verticesSize; //tmp | 			u32 vbo_verticesSize; //tmp | ||||||
| 			u32 vbo_indicesSize; //tmp | 			u32 vbo_indicesSize; //tmp | ||||||
| 		}; | 		}; | ||||||
|  |  | ||||||
| 		bool updateVertexHardwareBuffer(SHWBufferLink_opengl *HWBuffer); | 		bool updateVertexHardwareBuffer(SHWBufferLink_opengl *HWBuffer); | ||||||
| 		bool updateIndexHardwareBuffer(SHWBufferLink_opengl *HWBuffer); | 		bool updateIndexHardwareBuffer(SHWBufferLink_opengl *HWBuffer); | ||||||
|  |  | ||||||
| 		//! updates hardware buffer if needed | 		//! updates hardware buffer if needed | ||||||
| 		bool updateHardwareBuffer(SHWBufferLink *HWBuffer) override; | 		bool updateHardwareBuffer(SHWBufferLink *HWBuffer) override; | ||||||
|  |  | ||||||
| 		//! Create hardware buffer from mesh | 		//! Create hardware buffer from mesh | ||||||
| 		SHWBufferLink *createHardwareBuffer(const scene::IMeshBuffer* mb) override; | 		SHWBufferLink *createHardwareBuffer(const scene::IMeshBuffer* mb) override; | ||||||
|  |  | ||||||
| 		//! Delete hardware buffer (only some drivers can) | 		//! Delete hardware buffer (only some drivers can) | ||||||
| 		void deleteHardwareBuffer(SHWBufferLink *HWBuffer) override; | 		void deleteHardwareBuffer(SHWBufferLink *HWBuffer) override; | ||||||
|  |  | ||||||
| 		//! Draw hardware buffer | 		//! Draw hardware buffer | ||||||
| 		void drawHardwareBuffer(SHWBufferLink *HWBuffer) override; | 		void drawHardwareBuffer(SHWBufferLink *HWBuffer) override; | ||||||
|  |  | ||||||
| 		IRenderTarget* addRenderTarget() override; | 		IRenderTarget* addRenderTarget() override; | ||||||
|  |  | ||||||
| 		//! draws a vertex primitive list | 		//! draws a vertex primitive list | ||||||
| 		virtual void drawVertexPrimitiveList(const void* vertices, u32 vertexCount, | 		virtual void drawVertexPrimitiveList(const void* vertices, u32 vertexCount, | ||||||
| 				const void* indexList, u32 primitiveCount, | 				const void* indexList, u32 primitiveCount, | ||||||
| 				E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType, E_INDEX_TYPE iType) override; | 				E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType, E_INDEX_TYPE iType) override; | ||||||
|  |  | ||||||
| 		//! queries the features of the driver, returns true if feature is available | 		//! queries the features of the driver, returns true if feature is available | ||||||
| 		bool queryFeature(E_VIDEO_DRIVER_FEATURE feature) const override | 		bool queryFeature(E_VIDEO_DRIVER_FEATURE feature) const override | ||||||
| 		{ | 		{ | ||||||
| 			return FeatureEnabled[feature] && COpenGL3ExtensionHandler::queryFeature(feature); | 			return FeatureEnabled[feature] && COpenGL3ExtensionHandler::queryFeature(feature); | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		//! Sets a material. | 		//! Sets a material. | ||||||
| 		void setMaterial(const SMaterial& material) override; | 		void setMaterial(const SMaterial& material) override; | ||||||
|  |  | ||||||
| 		virtual void draw2DImage(const video::ITexture* texture, | 		virtual void draw2DImage(const video::ITexture* texture, | ||||||
| 				const core::position2d<s32>& destPos, | 				const core::position2d<s32>& destPos, | ||||||
| 				const core::rect<s32>& sourceRect, const core::rect<s32>* clipRect = 0, | 				const core::rect<s32>& sourceRect, const core::rect<s32>* clipRect = 0, | ||||||
| 				SColor color = SColor(255, 255, 255, 255), bool useAlphaChannelOfTexture = false) override; | 				SColor color = SColor(255, 255, 255, 255), bool useAlphaChannelOfTexture = false) override; | ||||||
|  |  | ||||||
| 		virtual void draw2DImage(const video::ITexture* texture, const core::rect<s32>& destRect, | 		virtual void draw2DImage(const video::ITexture* texture, const core::rect<s32>& destRect, | ||||||
| 			const core::rect<s32>& sourceRect, const core::rect<s32>* clipRect = 0, | 			const core::rect<s32>& sourceRect, const core::rect<s32>* clipRect = 0, | ||||||
| 			const video::SColor* const colors = 0, bool useAlphaChannelOfTexture = false) override; | 			const video::SColor* const colors = 0, bool useAlphaChannelOfTexture = false) override; | ||||||
|  |  | ||||||
| 		// internally used | 		// internally used | ||||||
| 		virtual void draw2DImage(const video::ITexture* texture, u32 layer, bool flip); | 		virtual void draw2DImage(const video::ITexture* texture, u32 layer, bool flip); | ||||||
|  |  | ||||||
| 		void draw2DImageBatch(const video::ITexture* texture, | 		void draw2DImageBatch(const video::ITexture* texture, | ||||||
| 				const core::array<core::position2d<s32> >& positions, | 				const core::array<core::position2d<s32> >& positions, | ||||||
| 				const core::array<core::rect<s32> >& sourceRects, | 				const core::array<core::rect<s32> >& sourceRects, | ||||||
| 				const core::rect<s32>* clipRect, | 				const core::rect<s32>* clipRect, | ||||||
| 				SColor color, | 				SColor color, | ||||||
| 				bool useAlphaChannelOfTexture) override; | 				bool useAlphaChannelOfTexture) override; | ||||||
|  |  | ||||||
| 		//! draw an 2d rectangle | 		//! draw an 2d rectangle | ||||||
| 		virtual void draw2DRectangle(SColor color, const core::rect<s32>& pos, | 		virtual void draw2DRectangle(SColor color, const core::rect<s32>& pos, | ||||||
| 				const core::rect<s32>* clip = 0) override; | 				const core::rect<s32>* clip = 0) override; | ||||||
|  |  | ||||||
| 		//!Draws an 2d rectangle with a gradient. | 		//!Draws an 2d rectangle with a gradient. | ||||||
| 		virtual void draw2DRectangle(const core::rect<s32>& pos, | 		virtual void draw2DRectangle(const core::rect<s32>& pos, | ||||||
| 				SColor colorLeftUp, SColor colorRightUp, SColor colorLeftDown, SColor colorRightDown, | 				SColor colorLeftUp, SColor colorRightUp, SColor colorLeftDown, SColor colorRightDown, | ||||||
| 				const core::rect<s32>* clip = 0) override; | 				const core::rect<s32>* clip = 0) override; | ||||||
|  |  | ||||||
| 		//! Draws a 2d line. | 		//! Draws a 2d line. | ||||||
| 		virtual void draw2DLine(const core::position2d<s32>& start, | 		virtual void draw2DLine(const core::position2d<s32>& start, | ||||||
| 				const core::position2d<s32>& end, | 				const core::position2d<s32>& end, | ||||||
| 				SColor color = SColor(255, 255, 255, 255)) override; | 				SColor color = SColor(255, 255, 255, 255)) override; | ||||||
|  |  | ||||||
| 		//! Draws a single pixel | 		//! Draws a single pixel | ||||||
| 		void drawPixel(u32 x, u32 y, const SColor & color) override; | 		void drawPixel(u32 x, u32 y, const SColor & color) override; | ||||||
|  |  | ||||||
| 		//! Draws a 3d line. | 		//! Draws a 3d line. | ||||||
| 		virtual void draw3DLine(const core::vector3df& start, | 		virtual void draw3DLine(const core::vector3df& start, | ||||||
| 				const core::vector3df& end, | 				const core::vector3df& end, | ||||||
| 				SColor color = SColor(255, 255, 255, 255)) override; | 				SColor color = SColor(255, 255, 255, 255)) override; | ||||||
|  |  | ||||||
| 		//! Draws a pixel | 		//! Draws a pixel | ||||||
| //			virtual void drawPixel(u32 x, u32 y, const SColor & color); | //			virtual void drawPixel(u32 x, u32 y, const SColor & color); | ||||||
|  |  | ||||||
| 		//! Returns the name of the video driver. | 		//! Returns the name of the video driver. | ||||||
| 		const wchar_t* getName() const override; | 		const wchar_t* getName() const override; | ||||||
|  |  | ||||||
| 		//! Returns the maximum texture size supported. | 		//! Returns the maximum texture size supported. | ||||||
| 		core::dimension2du getMaxTextureSize() const override; | 		core::dimension2du getMaxTextureSize() const override; | ||||||
|  |  | ||||||
| 		//! sets a viewport | 		//! sets a viewport | ||||||
| 		void setViewPort(const core::rect<s32>& area) override; | 		void setViewPort(const core::rect<s32>& area) override; | ||||||
|  |  | ||||||
| 		//! Only used internally by the engine | 		//! Only used internally by the engine | ||||||
| 		void OnResize(const core::dimension2d<u32>& size) override; | 		void OnResize(const core::dimension2d<u32>& size) override; | ||||||
|  |  | ||||||
| 		//! Returns type of video driver | 		//! Returns type of video driver | ||||||
| 		E_DRIVER_TYPE getDriverType() const override; | 		E_DRIVER_TYPE getDriverType() const override; | ||||||
|  |  | ||||||
| 		//! get color format of the current color buffer | 		//! get color format of the current color buffer | ||||||
| 		ECOLOR_FORMAT getColorFormat() const override; | 		ECOLOR_FORMAT getColorFormat() const override; | ||||||
|  |  | ||||||
| 		//! Returns the transformation set by setTransform | 		//! Returns the transformation set by setTransform | ||||||
| 		const core::matrix4& getTransform(E_TRANSFORMATION_STATE state) const override; | 		const core::matrix4& getTransform(E_TRANSFORMATION_STATE state) const override; | ||||||
|  |  | ||||||
| 		//! Can be called by an IMaterialRenderer to make its work easier. | 		//! Can be called by an IMaterialRenderer to make its work easier. | ||||||
| 		void setBasicRenderStates(const SMaterial& material, const SMaterial& lastmaterial, bool resetAllRenderstates) override; | 		void setBasicRenderStates(const SMaterial& material, const SMaterial& lastmaterial, bool resetAllRenderstates) override; | ||||||
|  |  | ||||||
| 		//! Compare in SMaterial doesn't check texture parameters, so we should call this on each OnRender call. | 		//! Compare in SMaterial doesn't check texture parameters, so we should call this on each OnRender call. | ||||||
| 		void setTextureRenderStates(const SMaterial& material, bool resetAllRenderstates); | 		void setTextureRenderStates(const SMaterial& material, bool resetAllRenderstates); | ||||||
|  |  | ||||||
| 		//! Get a vertex shader constant index. | 		//! Get a vertex shader constant index. | ||||||
| 		s32 getVertexShaderConstantID(const c8* name) override; | 		s32 getVertexShaderConstantID(const c8* name) override; | ||||||
|  |  | ||||||
| 		//! Get a pixel shader constant index. | 		//! Get a pixel shader constant index. | ||||||
| 		s32 getPixelShaderConstantID(const c8* name) override; | 		s32 getPixelShaderConstantID(const c8* name) override; | ||||||
|  |  | ||||||
| 		//! Sets a vertex shader constant. | 		//! Sets a vertex shader constant. | ||||||
| 		void setVertexShaderConstant(const f32* data, s32 startRegister, s32 constantAmount = 1) override; | 		void setVertexShaderConstant(const f32* data, s32 startRegister, s32 constantAmount = 1) override; | ||||||
|  |  | ||||||
| 		//! Sets a pixel shader constant. | 		//! Sets a pixel shader constant. | ||||||
| 		void setPixelShaderConstant(const f32* data, s32 startRegister, s32 constantAmount = 1) override; | 		void setPixelShaderConstant(const f32* data, s32 startRegister, s32 constantAmount = 1) override; | ||||||
|  |  | ||||||
| 		//! Sets a constant for the vertex shader based on an index. | 		//! Sets a constant for the vertex shader based on an index. | ||||||
| 		bool setVertexShaderConstant(s32 index, const f32* floats, int count) override; | 		bool setVertexShaderConstant(s32 index, const f32* floats, int count) override; | ||||||
|  |  | ||||||
| 		//! Int interface for the above. | 		//! Int interface for the above. | ||||||
| 		bool setVertexShaderConstant(s32 index, const s32* ints, int count) override; | 		bool setVertexShaderConstant(s32 index, const s32* ints, int count) override; | ||||||
|  |  | ||||||
| 		//! Uint interface for the above. | 		//! Uint interface for the above. | ||||||
| 		bool setVertexShaderConstant(s32 index, const u32* ints, int count) override; | 		bool setVertexShaderConstant(s32 index, const u32* ints, int count) override; | ||||||
|  |  | ||||||
| 		//! Sets a constant for the pixel shader based on an index. | 		//! Sets a constant for the pixel shader based on an index. | ||||||
| 		bool setPixelShaderConstant(s32 index, const f32* floats, int count) override; | 		bool setPixelShaderConstant(s32 index, const f32* floats, int count) override; | ||||||
|  |  | ||||||
| 		//! Int interface for the above. | 		//! Int interface for the above. | ||||||
| 		bool setPixelShaderConstant(s32 index, const s32* ints, int count) override; | 		bool setPixelShaderConstant(s32 index, const s32* ints, int count) override; | ||||||
|  |  | ||||||
| 		//! Uint interface for the above. | 		//! Uint interface for the above. | ||||||
| 		bool setPixelShaderConstant(s32 index, const u32* ints, int count) override; | 		bool setPixelShaderConstant(s32 index, const u32* ints, int count) override; | ||||||
|  |  | ||||||
| 		//! Adds a new material renderer to the VideoDriver | 		//! Adds a new material renderer to the VideoDriver | ||||||
| 		virtual s32 addShaderMaterial(const c8* vertexShaderProgram, const c8* pixelShaderProgram, | 		virtual s32 addShaderMaterial(const c8* vertexShaderProgram, const c8* pixelShaderProgram, | ||||||
| 				IShaderConstantSetCallBack* callback, E_MATERIAL_TYPE baseMaterial, s32 userData) override; | 				IShaderConstantSetCallBack* callback, E_MATERIAL_TYPE baseMaterial, s32 userData) override; | ||||||
|  |  | ||||||
| 		//! Adds a new material renderer to the VideoDriver | 		//! Adds a new material renderer to the VideoDriver | ||||||
| 		virtual s32 addHighLevelShaderMaterial( | 		virtual s32 addHighLevelShaderMaterial( | ||||||
| 				const c8* vertexShaderProgram, | 				const c8* vertexShaderProgram, | ||||||
| 				const c8* vertexShaderEntryPointName = 0, | 				const c8* vertexShaderEntryPointName = 0, | ||||||
| 				E_VERTEX_SHADER_TYPE vsCompileTarget = EVST_VS_1_1, | 				E_VERTEX_SHADER_TYPE vsCompileTarget = EVST_VS_1_1, | ||||||
| 				const c8* pixelShaderProgram = 0, | 				const c8* pixelShaderProgram = 0, | ||||||
| 				const c8* pixelShaderEntryPointName = 0, | 				const c8* pixelShaderEntryPointName = 0, | ||||||
| 				E_PIXEL_SHADER_TYPE psCompileTarget = EPST_PS_1_1, | 				E_PIXEL_SHADER_TYPE psCompileTarget = EPST_PS_1_1, | ||||||
| 				const c8* geometryShaderProgram = 0, | 				const c8* geometryShaderProgram = 0, | ||||||
| 				const c8* geometryShaderEntryPointName = "main", | 				const c8* geometryShaderEntryPointName = "main", | ||||||
| 				E_GEOMETRY_SHADER_TYPE gsCompileTarget = EGST_GS_4_0, | 				E_GEOMETRY_SHADER_TYPE gsCompileTarget = EGST_GS_4_0, | ||||||
| 				scene::E_PRIMITIVE_TYPE inType = scene::EPT_TRIANGLES, | 				scene::E_PRIMITIVE_TYPE inType = scene::EPT_TRIANGLES, | ||||||
| 				scene::E_PRIMITIVE_TYPE outType = scene::EPT_TRIANGLE_STRIP, | 				scene::E_PRIMITIVE_TYPE outType = scene::EPT_TRIANGLE_STRIP, | ||||||
| 				u32 verticesOut = 0, | 				u32 verticesOut = 0, | ||||||
| 				IShaderConstantSetCallBack* callback = 0, | 				IShaderConstantSetCallBack* callback = 0, | ||||||
| 				E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID, | 				E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID, | ||||||
| 				s32 userData=0) override; | 				s32 userData=0) override; | ||||||
|  |  | ||||||
| 		//! Returns pointer to the IGPUProgrammingServices interface. | 		//! Returns pointer to the IGPUProgrammingServices interface. | ||||||
| 		IGPUProgrammingServices* getGPUProgrammingServices() override; | 		IGPUProgrammingServices* getGPUProgrammingServices() override; | ||||||
|  |  | ||||||
| 		//! Returns a pointer to the IVideoDriver interface. | 		//! Returns a pointer to the IVideoDriver interface. | ||||||
| 		IVideoDriver* getVideoDriver() override; | 		IVideoDriver* getVideoDriver() override; | ||||||
|  |  | ||||||
| 		//! Returns the maximum amount of primitives | 		//! Returns the maximum amount of primitives | ||||||
| 		u32 getMaximalPrimitiveCount() const override; | 		u32 getMaximalPrimitiveCount() const override; | ||||||
|  |  | ||||||
| 		virtual ITexture* addRenderTargetTexture(const core::dimension2d<u32>& size, | 		virtual ITexture* addRenderTargetTexture(const core::dimension2d<u32>& size, | ||||||
| 				const io::path& name, const ECOLOR_FORMAT format = ECF_UNKNOWN) override; | 				const io::path& name, const ECOLOR_FORMAT format = ECF_UNKNOWN) override; | ||||||
|  |  | ||||||
| 		//! Creates a render target texture for a cubemap | 		//! Creates a render target texture for a cubemap | ||||||
| 		ITexture* addRenderTargetTextureCubemap(const irr::u32 sideLen, | 		ITexture* addRenderTargetTextureCubemap(const irr::u32 sideLen, | ||||||
| 				const io::path& name, const ECOLOR_FORMAT format) override; | 				const io::path& name, const ECOLOR_FORMAT format) override; | ||||||
|  |  | ||||||
| 		virtual bool setRenderTargetEx(IRenderTarget* target, u16 clearFlag, SColor clearColor = SColor(255, 0, 0, 0), | 		virtual bool setRenderTargetEx(IRenderTarget* target, u16 clearFlag, SColor clearColor = SColor(255, 0, 0, 0), | ||||||
| 			f32 clearDepth = 1.f, u8 clearStencil = 0) override; | 			f32 clearDepth = 1.f, u8 clearStencil = 0) override; | ||||||
|  |  | ||||||
| 		void clearBuffers(u16 flag, SColor color = SColor(255, 0, 0, 0), f32 depth = 1.f, u8 stencil = 0) override; | 		void clearBuffers(u16 flag, SColor color = SColor(255, 0, 0, 0), f32 depth = 1.f, u8 stencil = 0) override; | ||||||
|  |  | ||||||
| 		//! Returns an image created from the last rendered frame. | 		//! Returns an image created from the last rendered frame. | ||||||
| 		IImage* createScreenShot(video::ECOLOR_FORMAT format=video::ECF_UNKNOWN, video::E_RENDER_TARGET target=video::ERT_FRAME_BUFFER) override; | 		IImage* createScreenShot(video::ECOLOR_FORMAT format=video::ECF_UNKNOWN, video::E_RENDER_TARGET target=video::ERT_FRAME_BUFFER) override; | ||||||
|  |  | ||||||
| 		//! checks if an OpenGL error has happened and prints it (+ some internal code which is usually the line number) | 		//! checks if an OpenGL error has happened and prints it (+ some internal code which is usually the line number) | ||||||
| 		bool testGLError(int code=0); | 		bool testGLError(int code=0); | ||||||
|  |  | ||||||
| 		//! checks if an OGLES1 error has happened and prints it | 		//! checks if an OGLES1 error has happened and prints it | ||||||
| 		bool testEGLError(); | 		bool testEGLError(); | ||||||
|  |  | ||||||
| 		//! Set/unset a clipping plane. | 		//! Set/unset a clipping plane. | ||||||
| 		bool setClipPlane(u32 index, const core::plane3df& plane, bool enable = false) override; | 		bool setClipPlane(u32 index, const core::plane3df& plane, bool enable = false) override; | ||||||
|  |  | ||||||
| 		//! returns the current amount of user clip planes set. | 		//! returns the current amount of user clip planes set. | ||||||
| 		u32 getClipPlaneCount() const; | 		u32 getClipPlaneCount() const; | ||||||
|  |  | ||||||
| 		//! returns the 0 indexed Plane | 		//! returns the 0 indexed Plane | ||||||
| 		const core::plane3df& getClipPlane(u32 index) const; | 		const core::plane3df& getClipPlane(u32 index) const; | ||||||
|  |  | ||||||
| 		//! Enable/disable a clipping plane. | 		//! Enable/disable a clipping plane. | ||||||
| 		void enableClipPlane(u32 index, bool enable) override; | 		void enableClipPlane(u32 index, bool enable) override; | ||||||
|  |  | ||||||
| 		//! Returns the graphics card vendor name. | 		//! Returns the graphics card vendor name. | ||||||
| 		core::stringc getVendorInfo() override | 		core::stringc getVendorInfo() override | ||||||
| 		{ | 		{ | ||||||
| 			return VendorName; | 			return VendorName; | ||||||
| 		}; | 		}; | ||||||
|  |  | ||||||
| 		void removeTexture(ITexture* texture) override; | 		void removeTexture(ITexture* texture) override; | ||||||
|  |  | ||||||
| 		//! Check if the driver supports creating textures with the given color format | 		//! Check if the driver supports creating textures with the given color format | ||||||
| 		bool queryTextureFormat(ECOLOR_FORMAT format) const override; | 		bool queryTextureFormat(ECOLOR_FORMAT format) const override; | ||||||
|  |  | ||||||
| 		//! Used by some SceneNodes to check if a material should be rendered in the transparent render pass | 		//! Used by some SceneNodes to check if a material should be rendered in the transparent render pass | ||||||
| 		bool needsTransparentRenderPass(const irr::video::SMaterial& material) const override; | 		bool needsTransparentRenderPass(const irr::video::SMaterial& material) const override; | ||||||
|  |  | ||||||
| 		//! Convert E_BLEND_FACTOR to OpenGL equivalent | 		//! Convert E_BLEND_FACTOR to OpenGL equivalent | ||||||
| 		GLenum getGLBlend(E_BLEND_FACTOR factor) const; | 		GLenum getGLBlend(E_BLEND_FACTOR factor) const; | ||||||
|  |  | ||||||
| 		virtual bool getColorFormatParameters(ECOLOR_FORMAT format, GLint& internalFormat, GLenum& pixelFormat, | 		virtual bool getColorFormatParameters(ECOLOR_FORMAT format, GLint& internalFormat, GLenum& pixelFormat, | ||||||
| 			GLenum& pixelType, void(**converter)(const void*, s32, void*)) const; | 			GLenum& pixelType, void(**converter)(const void*, s32, void*)) const; | ||||||
|  |  | ||||||
| 		//! Get current material. | 		//! Get current material. | ||||||
| 		const SMaterial& getCurrentMaterial() const; | 		const SMaterial& getCurrentMaterial() const; | ||||||
|  |  | ||||||
| 		COpenGL3CacheHandler* getCacheHandler() const; | 		COpenGL3CacheHandler* getCacheHandler() const; | ||||||
|  |  | ||||||
| 	protected: | 	protected: | ||||||
| 		//! inits the opengl-es driver | 		//! inits the opengl-es driver | ||||||
| 		virtual bool genericDriverInit(const core::dimension2d<u32>& screenSize, bool stencilBuffer); | 		virtual bool genericDriverInit(const core::dimension2d<u32>& screenSize, bool stencilBuffer); | ||||||
|  |  | ||||||
| 		void chooseMaterial2D(); | 		void chooseMaterial2D(); | ||||||
|  |  | ||||||
| 		ITexture* createDeviceDependentTexture(const io::path& name, IImage* image) override; | 		ITexture* createDeviceDependentTexture(const io::path& name, IImage* image) override; | ||||||
|  |  | ||||||
| 		ITexture* createDeviceDependentTextureCubemap(const io::path& name, const core::array<IImage*>& image) override; | 		ITexture* createDeviceDependentTextureCubemap(const io::path& name, const core::array<IImage*>& image) override; | ||||||
|  |  | ||||||
| 		//! Map Irrlicht wrap mode to OpenGL enum | 		//! Map Irrlicht wrap mode to OpenGL enum | ||||||
| 		GLint getTextureWrapMode(u8 clamp) const; | 		GLint getTextureWrapMode(u8 clamp) const; | ||||||
|  |  | ||||||
| 		//! sets the needed renderstates | 		//! sets the needed renderstates | ||||||
| 		void setRenderStates3DMode(); | 		void setRenderStates3DMode(); | ||||||
|  |  | ||||||
| 		//! sets the needed renderstates | 		//! sets the needed renderstates | ||||||
| 		void setRenderStates2DMode(bool alpha, bool texture, bool alphaChannel); | 		void setRenderStates2DMode(bool alpha, bool texture, bool alphaChannel); | ||||||
|  |  | ||||||
| 		//! Prevent setRenderStateMode calls to do anything. | 		//! Prevent setRenderStateMode calls to do anything. | ||||||
| 		// hack to allow drawing meshbuffers in 2D mode. | 		// hack to allow drawing meshbuffers in 2D mode. | ||||||
| 		// Better solution would be passing this flag through meshbuffers, | 		// Better solution would be passing this flag through meshbuffers, | ||||||
| 		// but the way this is currently implemented in Irrlicht makes this tricky to implement | 		// but the way this is currently implemented in Irrlicht makes this tricky to implement | ||||||
| 		void lockRenderStateMode() | 		void lockRenderStateMode() | ||||||
| 		{ | 		{ | ||||||
| 			LockRenderStateMode = true; | 			LockRenderStateMode = true; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		//! Allow setRenderStateMode calls to work again | 		//! Allow setRenderStateMode calls to work again | ||||||
| 		void unlockRenderStateMode() | 		void unlockRenderStateMode() | ||||||
| 		{ | 		{ | ||||||
| 			LockRenderStateMode = false; | 			LockRenderStateMode = false; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		void draw2D3DVertexPrimitiveList(const void* vertices, | 		void draw2D3DVertexPrimitiveList(const void* vertices, | ||||||
| 				u32 vertexCount, const void* indexList, u32 primitiveCount, | 				u32 vertexCount, const void* indexList, u32 primitiveCount, | ||||||
| 				E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType, | 				E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType, | ||||||
| 				E_INDEX_TYPE iType, bool is3D); | 				E_INDEX_TYPE iType, bool is3D); | ||||||
|  |  | ||||||
| 		void createMaterialRenderers(); | 		void createMaterialRenderers(); | ||||||
|  |  | ||||||
| 		void loadShaderData(const io::path& vertexShaderName, const io::path& fragmentShaderName, c8** vertexShaderData, c8** fragmentShaderData); | 		void loadShaderData(const io::path& vertexShaderName, const io::path& fragmentShaderName, c8** vertexShaderData, c8** fragmentShaderData); | ||||||
|  |  | ||||||
| 		bool setMaterialTexture(irr::u32 layerIdx, const irr::video::ITexture* texture); | 		bool setMaterialTexture(irr::u32 layerIdx, const irr::video::ITexture* texture); | ||||||
|  |  | ||||||
| 		//! Same as `CacheHandler->setViewport`, but also sets `ViewPort` | 		//! Same as `CacheHandler->setViewport`, but also sets `ViewPort` | ||||||
| 		virtual void setViewPortRaw(u32 width, u32 height); | 		virtual void setViewPortRaw(u32 width, u32 height); | ||||||
|  |  | ||||||
| 		void drawQuad(const VertexType &vertexType, const S3DVertex (&vertices)[4]); | 		void drawQuad(const VertexType &vertexType, const S3DVertex (&vertices)[4]); | ||||||
| 		void drawArrays(GLenum primitiveType, const VertexType &vertexType, const void *vertices, int vertexCount); | 		void drawArrays(GLenum primitiveType, const VertexType &vertexType, const void *vertices, int vertexCount); | ||||||
| 		void drawElements(GLenum primitiveType, const VertexType &vertexType, const void *vertices, const u16 *indices, int indexCount); | 		void drawElements(GLenum primitiveType, const VertexType &vertexType, const void *vertices, const u16 *indices, int indexCount); | ||||||
| 		void drawElements(GLenum primitiveType, const VertexType &vertexType, uintptr_t vertices, uintptr_t indices, int indexCount); | 		void drawElements(GLenum primitiveType, const VertexType &vertexType, uintptr_t vertices, uintptr_t indices, int indexCount); | ||||||
|  |  | ||||||
| 		void beginDraw(const VertexType &vertexType, uintptr_t verticesBase); | 		void beginDraw(const VertexType &vertexType, uintptr_t verticesBase); | ||||||
| 		void endDraw(const VertexType &vertexType); | 		void endDraw(const VertexType &vertexType); | ||||||
|  |  | ||||||
| 		COpenGL3CacheHandler* CacheHandler; | 		COpenGL3CacheHandler* CacheHandler; | ||||||
| 		core::stringw Name; | 		core::stringw Name; | ||||||
| 		core::stringc VendorName; | 		core::stringc VendorName; | ||||||
| 		SIrrlichtCreationParameters Params; | 		SIrrlichtCreationParameters Params; | ||||||
|  |  | ||||||
| 		//! bool to make all renderstates reset if set to true. | 		//! bool to make all renderstates reset if set to true. | ||||||
| 		bool ResetRenderStates; | 		bool ResetRenderStates; | ||||||
| 		bool LockRenderStateMode; | 		bool LockRenderStateMode; | ||||||
| 		u8 AntiAlias; | 		u8 AntiAlias; | ||||||
|  |  | ||||||
| 		struct SUserClipPlane | 		struct SUserClipPlane | ||||||
| 		{ | 		{ | ||||||
| 			core::plane3df Plane; | 			core::plane3df Plane; | ||||||
| 			bool Enabled; | 			bool Enabled; | ||||||
| 		}; | 		}; | ||||||
|  |  | ||||||
| 		core::array<SUserClipPlane> UserClipPlane; | 		core::array<SUserClipPlane> UserClipPlane; | ||||||
|  |  | ||||||
| 		core::matrix4 TextureFlipMatrix; | 		core::matrix4 TextureFlipMatrix; | ||||||
|  |  | ||||||
| private: | private: | ||||||
|  |  | ||||||
| 		COpenGL3Renderer2D* MaterialRenderer2DActive; | 		COpenGL3Renderer2D* MaterialRenderer2DActive; | ||||||
| 		COpenGL3Renderer2D* MaterialRenderer2DTexture; | 		COpenGL3Renderer2D* MaterialRenderer2DTexture; | ||||||
| 		COpenGL3Renderer2D* MaterialRenderer2DNoTexture; | 		COpenGL3Renderer2D* MaterialRenderer2DNoTexture; | ||||||
|  |  | ||||||
| 		core::matrix4 Matrices[ETS_COUNT]; | 		core::matrix4 Matrices[ETS_COUNT]; | ||||||
|  |  | ||||||
| 		//! enumeration for rendering modes such as 2d and 3d for minimizing the switching of renderStates. | 		//! enumeration for rendering modes such as 2d and 3d for minimizing the switching of renderStates. | ||||||
| 		enum E_RENDER_MODE | 		enum E_RENDER_MODE | ||||||
| 		{ | 		{ | ||||||
| 			ERM_NONE = 0, // no render state has been set yet. | 			ERM_NONE = 0, // no render state has been set yet. | ||||||
| 			ERM_2D, // 2d drawing rendermode | 			ERM_2D, // 2d drawing rendermode | ||||||
| 			ERM_3D // 3d rendering mode | 			ERM_3D // 3d rendering mode | ||||||
| 		}; | 		}; | ||||||
|  |  | ||||||
| 		E_RENDER_MODE CurrentRenderMode; | 		E_RENDER_MODE CurrentRenderMode; | ||||||
| 		bool Transformation3DChanged; | 		bool Transformation3DChanged; | ||||||
| 		irr::io::path OGLES2ShaderPath; | 		irr::io::path OGLES2ShaderPath; | ||||||
|  |  | ||||||
| 		SMaterial Material, LastMaterial; | 		SMaterial Material, LastMaterial; | ||||||
|  |  | ||||||
| 		//! Color buffer format | 		//! Color buffer format | ||||||
| 		ECOLOR_FORMAT ColorFormat; | 		ECOLOR_FORMAT ColorFormat; | ||||||
|  |  | ||||||
| 		IContextManager* ContextManager; | 		IContextManager* ContextManager; | ||||||
|  |  | ||||||
| 		std::vector<u16> QuadsIndices; | 		std::vector<u16> QuadsIndices; | ||||||
| 		void initQuadsIndices(int max_vertex_count = 65536); | 		void initQuadsIndices(int max_vertex_count = 65536); | ||||||
|  |  | ||||||
| 		void debugCb(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *message); | 		void debugCb(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *message); | ||||||
| 		static void APIENTRY debugCb(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *message, const void *userParam); | 		static void APIENTRY debugCb(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *message, const void *userParam); | ||||||
| 	}; | 	}; | ||||||
|  |  | ||||||
| } // end namespace video | } // end namespace video | ||||||
| } // end namespace irr | } // end namespace irr | ||||||
|   | |||||||
| @@ -1,66 +1,66 @@ | |||||||
| // Copyright (C) 2015 Patryk Nadrowski | // Copyright (C) 2015 Patryk Nadrowski | ||||||
| // Copyright (C) 2009-2010 Amundis | // Copyright (C) 2009-2010 Amundis | ||||||
| // 2017 modified by Michael Zeilfelder (unifying extension handlers) | // 2017 modified by Michael Zeilfelder (unifying extension handlers) | ||||||
| // This file is part of the "Irrlicht Engine". | // This file is part of the "Irrlicht Engine". | ||||||
| // For conditions of distribution and use, see copyright notice in Irrlicht.h | // For conditions of distribution and use, see copyright notice in Irrlicht.h | ||||||
|  |  | ||||||
| #include "ExtensionHandler.h" | #include "ExtensionHandler.h" | ||||||
|  |  | ||||||
| #include "irrString.h" | #include "irrString.h" | ||||||
| #include "SMaterial.h" | #include "SMaterial.h" | ||||||
| #include "fast_atof.h" | #include "fast_atof.h" | ||||||
| #include <mt_opengl.h> | #include <mt_opengl.h> | ||||||
|  |  | ||||||
| namespace irr | namespace irr | ||||||
| { | { | ||||||
| namespace video | namespace video | ||||||
| { | { | ||||||
| 	void COpenGL3ExtensionHandler::initExtensions() | 	void COpenGL3ExtensionHandler::initExtensions() | ||||||
| 	{ | 	{ | ||||||
| 		GLint major, minor; | 		GLint major, minor; | ||||||
| 		glGetIntegerv(GL_MAJOR_VERSION, &major); | 		glGetIntegerv(GL_MAJOR_VERSION, &major); | ||||||
| 		glGetIntegerv(GL_MINOR_VERSION, &minor); | 		glGetIntegerv(GL_MINOR_VERSION, &minor); | ||||||
| 		Version = 100 * major + 10 * minor; | 		Version = 100 * major + 10 * minor; | ||||||
|  |  | ||||||
| 		GLint ext_count = 0; | 		GLint ext_count = 0; | ||||||
| 		GL.GetIntegerv(GL_NUM_EXTENSIONS, &ext_count); | 		GL.GetIntegerv(GL_NUM_EXTENSIONS, &ext_count); | ||||||
| 		for (int k = 0; k < ext_count; k++) { | 		for (int k = 0; k < ext_count; k++) { | ||||||
| 			auto ext_name = (char *)GL.GetStringi(GL_EXTENSIONS, k); | 			auto ext_name = (char *)GL.GetStringi(GL_EXTENSIONS, k); | ||||||
| 			for (size_t j=0; j<IRR_OGLES_Feature_Count; ++j) { | 			for (size_t j=0; j<IRR_OGLES_Feature_Count; ++j) { | ||||||
| 				if (!strcmp(getFeatureString(j), ext_name)) { | 				if (!strcmp(getFeatureString(j), ext_name)) { | ||||||
| 					FeatureAvailable[j] = true; | 					FeatureAvailable[j] = true; | ||||||
| 					break; | 					break; | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		GLint val=0; | 		GLint val=0; | ||||||
| 		glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &val); | 		glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &val); | ||||||
| 		Feature.MaxTextureUnits = static_cast<u8>(val); | 		Feature.MaxTextureUnits = static_cast<u8>(val); | ||||||
|  |  | ||||||
| 	#ifdef GL_EXT_texture_filter_anisotropic | 	#ifdef GL_EXT_texture_filter_anisotropic | ||||||
| 		if (FeatureAvailable[IRR_GL_EXT_texture_filter_anisotropic]) | 		if (FeatureAvailable[IRR_GL_EXT_texture_filter_anisotropic]) | ||||||
| 		{ | 		{ | ||||||
| 			glGetIntegerv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &val); | 			glGetIntegerv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &val); | ||||||
| 			MaxAnisotropy = static_cast<u8>(val); | 			MaxAnisotropy = static_cast<u8>(val); | ||||||
| 		} | 		} | ||||||
| 	#endif | 	#endif | ||||||
| 	#ifdef GL_MAX_ELEMENTS_INDICES | 	#ifdef GL_MAX_ELEMENTS_INDICES | ||||||
| 		glGetIntegerv(GL_MAX_ELEMENTS_INDICES, &val); | 		glGetIntegerv(GL_MAX_ELEMENTS_INDICES, &val); | ||||||
| 		MaxIndices=val; | 		MaxIndices=val; | ||||||
| 	#endif | 	#endif | ||||||
| 		glGetIntegerv(GL_MAX_TEXTURE_SIZE, &val); | 		glGetIntegerv(GL_MAX_TEXTURE_SIZE, &val); | ||||||
| 		MaxTextureSize=static_cast<u32>(val); | 		MaxTextureSize=static_cast<u32>(val); | ||||||
| 	#ifdef GL_EXT_texture_lod_bias | 	#ifdef GL_EXT_texture_lod_bias | ||||||
| 		if (FeatureAvailable[IRR_GL_EXT_texture_lod_bias]) | 		if (FeatureAvailable[IRR_GL_EXT_texture_lod_bias]) | ||||||
| 			glGetFloatv(GL_MAX_TEXTURE_LOD_BIAS_EXT, &MaxTextureLODBias); | 			glGetFloatv(GL_MAX_TEXTURE_LOD_BIAS_EXT, &MaxTextureLODBias); | ||||||
| 	#endif | 	#endif | ||||||
| 		glGetFloatv(GL_ALIASED_LINE_WIDTH_RANGE, DimAliasedLine); | 		glGetFloatv(GL_ALIASED_LINE_WIDTH_RANGE, DimAliasedLine); | ||||||
| 		glGetFloatv(GL_ALIASED_POINT_SIZE_RANGE, DimAliasedPoint); | 		glGetFloatv(GL_ALIASED_POINT_SIZE_RANGE, DimAliasedPoint); | ||||||
|  |  | ||||||
| 		Feature.MaxTextureUnits = core::min_(Feature.MaxTextureUnits, static_cast<u8>(MATERIAL_MAX_TEXTURES)); | 		Feature.MaxTextureUnits = core::min_(Feature.MaxTextureUnits, static_cast<u8>(MATERIAL_MAX_TEXTURES)); | ||||||
| 		Feature.ColorAttachment = 1; | 		Feature.ColorAttachment = 1; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| } // end namespace video | } // end namespace video | ||||||
| } // end namespace irr | } // end namespace irr | ||||||
|   | |||||||
| @@ -1,187 +1,187 @@ | |||||||
| // Copyright (C) 2023 Vitaliy Lobachevskiy | // Copyright (C) 2023 Vitaliy Lobachevskiy | ||||||
| // Copyright (C) 2015 Patryk Nadrowski | // Copyright (C) 2015 Patryk Nadrowski | ||||||
| // Copyright (C) 2009-2010 Amundis | // Copyright (C) 2009-2010 Amundis | ||||||
| // This file is part of the "Irrlicht Engine". | // This file is part of the "Irrlicht Engine". | ||||||
| // For conditions of distribution and use, see copyright notice in Irrlicht.h | // For conditions of distribution and use, see copyright notice in Irrlicht.h | ||||||
|  |  | ||||||
| #pragma once | #pragma once | ||||||
|  |  | ||||||
| #include "EDriverFeatures.h" | #include "EDriverFeatures.h" | ||||||
| #include "irrTypes.h" | #include "irrTypes.h" | ||||||
| #include "os.h" | #include "os.h" | ||||||
|  |  | ||||||
| #include "Common.h" | #include "Common.h" | ||||||
|  |  | ||||||
| #include "COGLESCoreExtensionHandler.h" | #include "COGLESCoreExtensionHandler.h" | ||||||
|  |  | ||||||
| namespace irr | namespace irr | ||||||
| { | { | ||||||
| namespace video | namespace video | ||||||
| { | { | ||||||
|  |  | ||||||
| 	class COpenGL3ExtensionHandler : public COGLESCoreExtensionHandler | 	class COpenGL3ExtensionHandler : public COGLESCoreExtensionHandler | ||||||
| 	{ | 	{ | ||||||
| 	public: | 	public: | ||||||
| 		COpenGL3ExtensionHandler() : COGLESCoreExtensionHandler() {} | 		COpenGL3ExtensionHandler() : COGLESCoreExtensionHandler() {} | ||||||
|  |  | ||||||
| 		void initExtensions(); | 		void initExtensions(); | ||||||
|  |  | ||||||
| 		bool queryFeature(video::E_VIDEO_DRIVER_FEATURE feature) const | 		bool queryFeature(video::E_VIDEO_DRIVER_FEATURE feature) const | ||||||
| 		{ | 		{ | ||||||
| 			switch (feature) | 			switch (feature) | ||||||
| 			{ | 			{ | ||||||
| 			case EVDF_RENDER_TO_TARGET: | 			case EVDF_RENDER_TO_TARGET: | ||||||
| 			case EVDF_HARDWARE_TL: | 			case EVDF_HARDWARE_TL: | ||||||
| 			case EVDF_MULTITEXTURE: | 			case EVDF_MULTITEXTURE: | ||||||
| 			case EVDF_BILINEAR_FILTER: | 			case EVDF_BILINEAR_FILTER: | ||||||
| 			case EVDF_MIP_MAP: | 			case EVDF_MIP_MAP: | ||||||
| 			case EVDF_MIP_MAP_AUTO_UPDATE: | 			case EVDF_MIP_MAP_AUTO_UPDATE: | ||||||
| 			case EVDF_VERTEX_SHADER_1_1: | 			case EVDF_VERTEX_SHADER_1_1: | ||||||
| 			case EVDF_PIXEL_SHADER_1_1: | 			case EVDF_PIXEL_SHADER_1_1: | ||||||
| 			case EVDF_PIXEL_SHADER_1_2: | 			case EVDF_PIXEL_SHADER_1_2: | ||||||
| 			case EVDF_PIXEL_SHADER_2_0: | 			case EVDF_PIXEL_SHADER_2_0: | ||||||
| 			case EVDF_VERTEX_SHADER_2_0: | 			case EVDF_VERTEX_SHADER_2_0: | ||||||
| 			case EVDF_ARB_GLSL: | 			case EVDF_ARB_GLSL: | ||||||
| 			case EVDF_TEXTURE_NSQUARE: | 			case EVDF_TEXTURE_NSQUARE: | ||||||
| 			case EVDF_TEXTURE_NPOT: | 			case EVDF_TEXTURE_NPOT: | ||||||
| 			case EVDF_FRAMEBUFFER_OBJECT: | 			case EVDF_FRAMEBUFFER_OBJECT: | ||||||
| 			case EVDF_VERTEX_BUFFER_OBJECT: | 			case EVDF_VERTEX_BUFFER_OBJECT: | ||||||
| 			case EVDF_COLOR_MASK: | 			case EVDF_COLOR_MASK: | ||||||
| 			case EVDF_ALPHA_TO_COVERAGE: | 			case EVDF_ALPHA_TO_COVERAGE: | ||||||
| 			case EVDF_POLYGON_OFFSET: | 			case EVDF_POLYGON_OFFSET: | ||||||
| 			case EVDF_BLEND_OPERATIONS: | 			case EVDF_BLEND_OPERATIONS: | ||||||
| 			case EVDF_BLEND_SEPARATE: | 			case EVDF_BLEND_SEPARATE: | ||||||
| 			case EVDF_TEXTURE_MATRIX: | 			case EVDF_TEXTURE_MATRIX: | ||||||
| 			case EVDF_TEXTURE_CUBEMAP: | 			case EVDF_TEXTURE_CUBEMAP: | ||||||
| 				return true; | 				return true; | ||||||
| 			case EVDF_ARB_VERTEX_PROGRAM_1: | 			case EVDF_ARB_VERTEX_PROGRAM_1: | ||||||
| 			case EVDF_ARB_FRAGMENT_PROGRAM_1: | 			case EVDF_ARB_FRAGMENT_PROGRAM_1: | ||||||
| 			case EVDF_GEOMETRY_SHADER: | 			case EVDF_GEOMETRY_SHADER: | ||||||
| 			case EVDF_MULTIPLE_RENDER_TARGETS: | 			case EVDF_MULTIPLE_RENDER_TARGETS: | ||||||
| 			case EVDF_MRT_BLEND: | 			case EVDF_MRT_BLEND: | ||||||
| 			case EVDF_MRT_COLOR_MASK: | 			case EVDF_MRT_COLOR_MASK: | ||||||
| 			case EVDF_MRT_BLEND_FUNC: | 			case EVDF_MRT_BLEND_FUNC: | ||||||
| 			case EVDF_OCCLUSION_QUERY: | 			case EVDF_OCCLUSION_QUERY: | ||||||
| 				return false; | 				return false; | ||||||
| 			case EVDF_TEXTURE_COMPRESSED_DXT: | 			case EVDF_TEXTURE_COMPRESSED_DXT: | ||||||
| 				return false; // NV Tegra need improvements here | 				return false; // NV Tegra need improvements here | ||||||
| 			case EVDF_TEXTURE_COMPRESSED_PVRTC: | 			case EVDF_TEXTURE_COMPRESSED_PVRTC: | ||||||
| 				return FeatureAvailable[IRR_GL_IMG_texture_compression_pvrtc]; | 				return FeatureAvailable[IRR_GL_IMG_texture_compression_pvrtc]; | ||||||
| 			case EVDF_TEXTURE_COMPRESSED_PVRTC2: | 			case EVDF_TEXTURE_COMPRESSED_PVRTC2: | ||||||
| 				return FeatureAvailable[IRR_GL_IMG_texture_compression_pvrtc2]; | 				return FeatureAvailable[IRR_GL_IMG_texture_compression_pvrtc2]; | ||||||
| 			case EVDF_TEXTURE_COMPRESSED_ETC1: | 			case EVDF_TEXTURE_COMPRESSED_ETC1: | ||||||
| 				return FeatureAvailable[IRR_GL_OES_compressed_ETC1_RGB8_texture]; | 				return FeatureAvailable[IRR_GL_OES_compressed_ETC1_RGB8_texture]; | ||||||
| 			case EVDF_TEXTURE_COMPRESSED_ETC2: | 			case EVDF_TEXTURE_COMPRESSED_ETC2: | ||||||
| 				return false; | 				return false; | ||||||
| 			case EVDF_STENCIL_BUFFER: | 			case EVDF_STENCIL_BUFFER: | ||||||
| 				return StencilBuffer; | 				return StencilBuffer; | ||||||
| 			default: | 			default: | ||||||
| 				return false; | 				return false; | ||||||
| 			}; | 			}; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		inline void irrGlActiveTexture(GLenum texture) | 		inline void irrGlActiveTexture(GLenum texture) | ||||||
| 		{ | 		{ | ||||||
| 			glActiveTexture(texture); | 			glActiveTexture(texture); | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		inline void irrGlCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, | 		inline void irrGlCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, | ||||||
| 			GLsizei imageSize, const void* data) | 			GLsizei imageSize, const void* data) | ||||||
| 		{ | 		{ | ||||||
| 			glCompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data); | 			glCompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data); | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		inline void irrGlCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, | 		inline void irrGlCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, | ||||||
| 			GLenum format, GLsizei imageSize, const void* data) | 			GLenum format, GLsizei imageSize, const void* data) | ||||||
| 		{ | 		{ | ||||||
| 			glCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data); | 			glCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data); | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		inline void irrGlUseProgram(GLuint prog) | 		inline void irrGlUseProgram(GLuint prog) | ||||||
| 		{ | 		{ | ||||||
| 			glUseProgram(prog); | 			glUseProgram(prog); | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		inline void irrGlBindFramebuffer(GLenum target, GLuint framebuffer) | 		inline void irrGlBindFramebuffer(GLenum target, GLuint framebuffer) | ||||||
| 		{ | 		{ | ||||||
| 			glBindFramebuffer(target, framebuffer); | 			glBindFramebuffer(target, framebuffer); | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		inline void irrGlDeleteFramebuffers(GLsizei n, const GLuint *framebuffers) | 		inline void irrGlDeleteFramebuffers(GLsizei n, const GLuint *framebuffers) | ||||||
| 		{ | 		{ | ||||||
| 			glDeleteFramebuffers(n, framebuffers); | 			glDeleteFramebuffers(n, framebuffers); | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		inline void irrGlGenFramebuffers(GLsizei n, GLuint *framebuffers) | 		inline void irrGlGenFramebuffers(GLsizei n, GLuint *framebuffers) | ||||||
| 		{ | 		{ | ||||||
| 			glGenFramebuffers(n, framebuffers); | 			glGenFramebuffers(n, framebuffers); | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		inline GLenum irrGlCheckFramebufferStatus(GLenum target) | 		inline GLenum irrGlCheckFramebufferStatus(GLenum target) | ||||||
| 		{ | 		{ | ||||||
| 			return glCheckFramebufferStatus(target); | 			return glCheckFramebufferStatus(target); | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		inline void irrGlFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) | 		inline void irrGlFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) | ||||||
| 		{ | 		{ | ||||||
| 			glFramebufferTexture2D(target, attachment, textarget, texture, level); | 			glFramebufferTexture2D(target, attachment, textarget, texture, level); | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		inline void irrGlGenerateMipmap(GLenum target) | 		inline void irrGlGenerateMipmap(GLenum target) | ||||||
| 		{ | 		{ | ||||||
| 			glGenerateMipmap(target); | 			glGenerateMipmap(target); | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		inline void irrGlActiveStencilFace(GLenum face) | 		inline void irrGlActiveStencilFace(GLenum face) | ||||||
| 		{ | 		{ | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		inline void irrGlDrawBuffer(GLenum mode) | 		inline void irrGlDrawBuffer(GLenum mode) | ||||||
| 		{ | 		{ | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		inline void irrGlDrawBuffers(GLsizei n, const GLenum *bufs) | 		inline void irrGlDrawBuffers(GLsizei n, const GLenum *bufs) | ||||||
| 		{ | 		{ | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		inline void irrGlBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha) | 		inline void irrGlBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha) | ||||||
| 		{ | 		{ | ||||||
| 			glBlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha); | 			glBlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha); | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		inline void irrGlBlendEquation(GLenum mode) | 		inline void irrGlBlendEquation(GLenum mode) | ||||||
| 		{ | 		{ | ||||||
| 			glBlendEquation(mode); | 			glBlendEquation(mode); | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		inline void irrGlEnableIndexed(GLenum target, GLuint index) | 		inline void irrGlEnableIndexed(GLenum target, GLuint index) | ||||||
| 		{ | 		{ | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		inline void irrGlDisableIndexed(GLenum target, GLuint index) | 		inline void irrGlDisableIndexed(GLenum target, GLuint index) | ||||||
| 		{ | 		{ | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		inline void irrGlColorMaskIndexed(GLuint buf, GLboolean r, GLboolean g, GLboolean b, GLboolean a) | 		inline void irrGlColorMaskIndexed(GLuint buf, GLboolean r, GLboolean g, GLboolean b, GLboolean a) | ||||||
| 		{ | 		{ | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		inline void irrGlBlendFuncIndexed(GLuint buf, GLenum src, GLenum dst) | 		inline void irrGlBlendFuncIndexed(GLuint buf, GLenum src, GLenum dst) | ||||||
| 		{ | 		{ | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		inline void irrGlBlendFuncSeparateIndexed(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) | 		inline void irrGlBlendFuncSeparateIndexed(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) | ||||||
| 		{ | 		{ | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		inline void irrGlBlendEquationIndexed(GLuint buf, GLenum mode) | 		inline void irrGlBlendEquationIndexed(GLuint buf, GLenum mode) | ||||||
| 		{ | 		{ | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		inline void irrGlBlendEquationSeparateIndexed(GLuint buf, GLenum modeRGB, GLenum modeAlpha) | 		inline void irrGlBlendEquationSeparateIndexed(GLuint buf, GLenum modeRGB, GLenum modeAlpha) | ||||||
| 		{ | 		{ | ||||||
| 		} | 		} | ||||||
| 	}; | 	}; | ||||||
|  |  | ||||||
| } | } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,334 +1,334 @@ | |||||||
| // Copyright (C) 2014 Patryk Nadrowski | // Copyright (C) 2014 Patryk Nadrowski | ||||||
| // This file is part of the "Irrlicht Engine". | // This file is part of the "Irrlicht Engine". | ||||||
| // For conditions of distribution and use, see copyright notice in Irrlicht.h | // For conditions of distribution and use, see copyright notice in Irrlicht.h | ||||||
|  |  | ||||||
| #include "FixedPipelineRenderer.h" | #include "FixedPipelineRenderer.h" | ||||||
|  |  | ||||||
| #include "IVideoDriver.h" | #include "IVideoDriver.h" | ||||||
|  |  | ||||||
| namespace irr | namespace irr | ||||||
| { | { | ||||||
| namespace video | namespace video | ||||||
| { | { | ||||||
|  |  | ||||||
| // Base callback | // Base callback | ||||||
|  |  | ||||||
| COpenGL3MaterialBaseCB::COpenGL3MaterialBaseCB() : | COpenGL3MaterialBaseCB::COpenGL3MaterialBaseCB() : | ||||||
| 	FirstUpdateBase(true), WVPMatrixID(-1), WVMatrixID(-1), NMatrixID(-1), GlobalAmbientID(-1), MaterialAmbientID(-1), MaterialDiffuseID(-1), MaterialEmissiveID(-1), MaterialSpecularID(-1), MaterialShininessID(-1), | 	FirstUpdateBase(true), WVPMatrixID(-1), WVMatrixID(-1), NMatrixID(-1), GlobalAmbientID(-1), MaterialAmbientID(-1), MaterialDiffuseID(-1), MaterialEmissiveID(-1), MaterialSpecularID(-1), MaterialShininessID(-1), | ||||||
| 	FogEnableID(-1), FogTypeID(-1), FogColorID(-1), FogStartID(-1), | 	FogEnableID(-1), FogTypeID(-1), FogColorID(-1), FogStartID(-1), | ||||||
| 	FogEndID(-1), FogDensityID(-1), ThicknessID(-1), LightEnable(false), MaterialAmbient(SColorf(0.f, 0.f, 0.f)), MaterialDiffuse(SColorf(0.f, 0.f, 0.f)), MaterialEmissive(SColorf(0.f, 0.f, 0.f)), MaterialSpecular(SColorf(0.f, 0.f, 0.f)), | 	FogEndID(-1), FogDensityID(-1), ThicknessID(-1), LightEnable(false), MaterialAmbient(SColorf(0.f, 0.f, 0.f)), MaterialDiffuse(SColorf(0.f, 0.f, 0.f)), MaterialEmissive(SColorf(0.f, 0.f, 0.f)), MaterialSpecular(SColorf(0.f, 0.f, 0.f)), | ||||||
| 	MaterialShininess(0.f), FogEnable(0), FogType(1), FogColor(SColorf(0.f, 0.f, 0.f, 1.f)), FogStart(0.f), FogEnd(0.f), FogDensity(0.f), Thickness(1.f) | 	MaterialShininess(0.f), FogEnable(0), FogType(1), FogColor(SColorf(0.f, 0.f, 0.f, 1.f)), FogStart(0.f), FogEnd(0.f), FogDensity(0.f), Thickness(1.f) | ||||||
| { | { | ||||||
| } | } | ||||||
|  |  | ||||||
| void COpenGL3MaterialBaseCB::OnSetMaterial(const SMaterial& material) | void COpenGL3MaterialBaseCB::OnSetMaterial(const SMaterial& material) | ||||||
| { | { | ||||||
| 	LightEnable = material.Lighting; | 	LightEnable = material.Lighting; | ||||||
| 	MaterialAmbient = SColorf(material.AmbientColor); | 	MaterialAmbient = SColorf(material.AmbientColor); | ||||||
| 	MaterialDiffuse = SColorf(material.DiffuseColor); | 	MaterialDiffuse = SColorf(material.DiffuseColor); | ||||||
| 	MaterialEmissive = SColorf(material.EmissiveColor); | 	MaterialEmissive = SColorf(material.EmissiveColor); | ||||||
| 	MaterialSpecular = SColorf(material.SpecularColor); | 	MaterialSpecular = SColorf(material.SpecularColor); | ||||||
| 	MaterialShininess = material.Shininess; | 	MaterialShininess = material.Shininess; | ||||||
|  |  | ||||||
| 	FogEnable = material.FogEnable ? 1 : 0; | 	FogEnable = material.FogEnable ? 1 : 0; | ||||||
|  |  | ||||||
| 	Thickness = (material.Thickness > 0.f) ? material.Thickness : 1.f; | 	Thickness = (material.Thickness > 0.f) ? material.Thickness : 1.f; | ||||||
| } | } | ||||||
|  |  | ||||||
| void COpenGL3MaterialBaseCB::OnSetConstants(IMaterialRendererServices* services, s32 userData) | void COpenGL3MaterialBaseCB::OnSetConstants(IMaterialRendererServices* services, s32 userData) | ||||||
| { | { | ||||||
| 	IVideoDriver* driver = services->getVideoDriver(); | 	IVideoDriver* driver = services->getVideoDriver(); | ||||||
|  |  | ||||||
| 	if (FirstUpdateBase) | 	if (FirstUpdateBase) | ||||||
| 	{ | 	{ | ||||||
| 		WVPMatrixID = services->getVertexShaderConstantID("uWVPMatrix"); | 		WVPMatrixID = services->getVertexShaderConstantID("uWVPMatrix"); | ||||||
| 		WVMatrixID = services->getVertexShaderConstantID("uWVMatrix"); | 		WVMatrixID = services->getVertexShaderConstantID("uWVMatrix"); | ||||||
| 		NMatrixID = services->getVertexShaderConstantID("uNMatrix"); | 		NMatrixID = services->getVertexShaderConstantID("uNMatrix"); | ||||||
| 		GlobalAmbientID = services->getVertexShaderConstantID("uGlobalAmbient"); | 		GlobalAmbientID = services->getVertexShaderConstantID("uGlobalAmbient"); | ||||||
| 		MaterialAmbientID = services->getVertexShaderConstantID("uMaterialAmbient"); | 		MaterialAmbientID = services->getVertexShaderConstantID("uMaterialAmbient"); | ||||||
| 		MaterialDiffuseID = services->getVertexShaderConstantID("uMaterialDiffuse"); | 		MaterialDiffuseID = services->getVertexShaderConstantID("uMaterialDiffuse"); | ||||||
| 		MaterialEmissiveID = services->getVertexShaderConstantID("uMaterialEmissive"); | 		MaterialEmissiveID = services->getVertexShaderConstantID("uMaterialEmissive"); | ||||||
| 		MaterialSpecularID = services->getVertexShaderConstantID("uMaterialSpecular"); | 		MaterialSpecularID = services->getVertexShaderConstantID("uMaterialSpecular"); | ||||||
| 		MaterialShininessID = services->getVertexShaderConstantID("uMaterialShininess"); | 		MaterialShininessID = services->getVertexShaderConstantID("uMaterialShininess"); | ||||||
| 		FogEnableID = services->getVertexShaderConstantID("uFogEnable"); | 		FogEnableID = services->getVertexShaderConstantID("uFogEnable"); | ||||||
| 		FogTypeID = services->getVertexShaderConstantID("uFogType"); | 		FogTypeID = services->getVertexShaderConstantID("uFogType"); | ||||||
| 		FogColorID = services->getVertexShaderConstantID("uFogColor"); | 		FogColorID = services->getVertexShaderConstantID("uFogColor"); | ||||||
| 		FogStartID = services->getVertexShaderConstantID("uFogStart"); | 		FogStartID = services->getVertexShaderConstantID("uFogStart"); | ||||||
| 		FogEndID = services->getVertexShaderConstantID("uFogEnd"); | 		FogEndID = services->getVertexShaderConstantID("uFogEnd"); | ||||||
| 		FogDensityID = services->getVertexShaderConstantID("uFogDensity"); | 		FogDensityID = services->getVertexShaderConstantID("uFogDensity"); | ||||||
| 		ThicknessID = services->getVertexShaderConstantID("uThickness"); | 		ThicknessID = services->getVertexShaderConstantID("uThickness"); | ||||||
|  |  | ||||||
| 		FirstUpdateBase = false; | 		FirstUpdateBase = false; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	const core::matrix4 W = driver->getTransform(ETS_WORLD); | 	const core::matrix4 W = driver->getTransform(ETS_WORLD); | ||||||
| 	const core::matrix4 V = driver->getTransform(ETS_VIEW); | 	const core::matrix4 V = driver->getTransform(ETS_VIEW); | ||||||
| 	const core::matrix4 P = driver->getTransform(ETS_PROJECTION); | 	const core::matrix4 P = driver->getTransform(ETS_PROJECTION); | ||||||
|  |  | ||||||
| 	core::matrix4 Matrix = P * V * W; | 	core::matrix4 Matrix = P * V * W; | ||||||
| 	services->setPixelShaderConstant(WVPMatrixID, Matrix.pointer(), 16); | 	services->setPixelShaderConstant(WVPMatrixID, Matrix.pointer(), 16); | ||||||
|  |  | ||||||
| 	Matrix = V * W; | 	Matrix = V * W; | ||||||
| 	services->setPixelShaderConstant(WVMatrixID, Matrix.pointer(), 16); | 	services->setPixelShaderConstant(WVMatrixID, Matrix.pointer(), 16); | ||||||
|  |  | ||||||
| 	Matrix.makeInverse(); | 	Matrix.makeInverse(); | ||||||
| 	services->setPixelShaderConstant(NMatrixID, Matrix.getTransposed().pointer(), 16); | 	services->setPixelShaderConstant(NMatrixID, Matrix.getTransposed().pointer(), 16); | ||||||
|  |  | ||||||
| 	services->setPixelShaderConstant(FogEnableID, &FogEnable, 1); | 	services->setPixelShaderConstant(FogEnableID, &FogEnable, 1); | ||||||
|  |  | ||||||
| 	if (FogEnable) | 	if (FogEnable) | ||||||
| 	{ | 	{ | ||||||
| 		SColor TempColor(0); | 		SColor TempColor(0); | ||||||
| 		E_FOG_TYPE TempType = EFT_FOG_LINEAR; | 		E_FOG_TYPE TempType = EFT_FOG_LINEAR; | ||||||
| 		bool TempPerFragment = false; | 		bool TempPerFragment = false; | ||||||
| 		bool TempRange = false; | 		bool TempRange = false; | ||||||
|  |  | ||||||
| 		driver->getFog(TempColor, TempType, FogStart, FogEnd, FogDensity, TempPerFragment, TempRange); | 		driver->getFog(TempColor, TempType, FogStart, FogEnd, FogDensity, TempPerFragment, TempRange); | ||||||
|  |  | ||||||
| 		FogType = (s32)TempType; | 		FogType = (s32)TempType; | ||||||
| 		FogColor = SColorf(TempColor); | 		FogColor = SColorf(TempColor); | ||||||
|  |  | ||||||
| 		services->setPixelShaderConstant(FogTypeID, &FogType, 1); | 		services->setPixelShaderConstant(FogTypeID, &FogType, 1); | ||||||
| 		services->setPixelShaderConstant(FogColorID, reinterpret_cast<f32*>(&FogColor), 4); | 		services->setPixelShaderConstant(FogColorID, reinterpret_cast<f32*>(&FogColor), 4); | ||||||
| 		services->setPixelShaderConstant(FogStartID, &FogStart, 1); | 		services->setPixelShaderConstant(FogStartID, &FogStart, 1); | ||||||
| 		services->setPixelShaderConstant(FogEndID, &FogEnd, 1); | 		services->setPixelShaderConstant(FogEndID, &FogEnd, 1); | ||||||
| 		services->setPixelShaderConstant(FogDensityID, &FogDensity, 1); | 		services->setPixelShaderConstant(FogDensityID, &FogDensity, 1); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	services->setPixelShaderConstant(ThicknessID, &Thickness, 1); | 	services->setPixelShaderConstant(ThicknessID, &Thickness, 1); | ||||||
| } | } | ||||||
|  |  | ||||||
| // EMT_SOLID + EMT_TRANSPARENT_ADD_COLOR + EMT_TRANSPARENT_ALPHA_CHANNEL + EMT_TRANSPARENT_VERTEX_ALPHA | // EMT_SOLID + EMT_TRANSPARENT_ADD_COLOR + EMT_TRANSPARENT_ALPHA_CHANNEL + EMT_TRANSPARENT_VERTEX_ALPHA | ||||||
|  |  | ||||||
| COpenGL3MaterialSolidCB::COpenGL3MaterialSolidCB() : | COpenGL3MaterialSolidCB::COpenGL3MaterialSolidCB() : | ||||||
| 	FirstUpdate(true), TMatrix0ID(-1), AlphaRefID(-1), TextureUsage0ID(-1), TextureUnit0ID(-1), AlphaRef(0.5f), TextureUsage0(0), TextureUnit0(0) | 	FirstUpdate(true), TMatrix0ID(-1), AlphaRefID(-1), TextureUsage0ID(-1), TextureUnit0ID(-1), AlphaRef(0.5f), TextureUsage0(0), TextureUnit0(0) | ||||||
| { | { | ||||||
| } | } | ||||||
|  |  | ||||||
| void COpenGL3MaterialSolidCB::OnSetMaterial(const SMaterial& material) | void COpenGL3MaterialSolidCB::OnSetMaterial(const SMaterial& material) | ||||||
| { | { | ||||||
| 	COpenGL3MaterialBaseCB::OnSetMaterial(material); | 	COpenGL3MaterialBaseCB::OnSetMaterial(material); | ||||||
|  |  | ||||||
| 	AlphaRef = material.MaterialTypeParam; | 	AlphaRef = material.MaterialTypeParam; | ||||||
| 	TextureUsage0 = (material.TextureLayer[0].Texture) ? 1 : 0; | 	TextureUsage0 = (material.TextureLayer[0].Texture) ? 1 : 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| void COpenGL3MaterialSolidCB::OnSetConstants(IMaterialRendererServices* services, s32 userData) | void COpenGL3MaterialSolidCB::OnSetConstants(IMaterialRendererServices* services, s32 userData) | ||||||
| { | { | ||||||
| 	COpenGL3MaterialBaseCB::OnSetConstants(services, userData); | 	COpenGL3MaterialBaseCB::OnSetConstants(services, userData); | ||||||
|  |  | ||||||
| 	IVideoDriver* driver = services->getVideoDriver(); | 	IVideoDriver* driver = services->getVideoDriver(); | ||||||
|  |  | ||||||
| 	if (FirstUpdate) | 	if (FirstUpdate) | ||||||
| 	{ | 	{ | ||||||
| 		TMatrix0ID = services->getVertexShaderConstantID("uTMatrix0"); | 		TMatrix0ID = services->getVertexShaderConstantID("uTMatrix0"); | ||||||
| 		AlphaRefID = services->getVertexShaderConstantID("uAlphaRef"); | 		AlphaRefID = services->getVertexShaderConstantID("uAlphaRef"); | ||||||
| 		TextureUsage0ID = services->getVertexShaderConstantID("uTextureUsage0"); | 		TextureUsage0ID = services->getVertexShaderConstantID("uTextureUsage0"); | ||||||
| 		TextureUnit0ID = services->getVertexShaderConstantID("uTextureUnit0"); | 		TextureUnit0ID = services->getVertexShaderConstantID("uTextureUnit0"); | ||||||
|  |  | ||||||
| 		FirstUpdate = false; | 		FirstUpdate = false; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	core::matrix4 Matrix = driver->getTransform(ETS_TEXTURE_0); | 	core::matrix4 Matrix = driver->getTransform(ETS_TEXTURE_0); | ||||||
| 	services->setPixelShaderConstant(TMatrix0ID, Matrix.pointer(), 16); | 	services->setPixelShaderConstant(TMatrix0ID, Matrix.pointer(), 16); | ||||||
|  |  | ||||||
| 	services->setPixelShaderConstant(AlphaRefID, &AlphaRef, 1); | 	services->setPixelShaderConstant(AlphaRefID, &AlphaRef, 1); | ||||||
| 	services->setPixelShaderConstant(TextureUsage0ID, &TextureUsage0, 1); | 	services->setPixelShaderConstant(TextureUsage0ID, &TextureUsage0, 1); | ||||||
| 	services->setPixelShaderConstant(TextureUnit0ID, &TextureUnit0, 1); | 	services->setPixelShaderConstant(TextureUnit0ID, &TextureUnit0, 1); | ||||||
| } | } | ||||||
|  |  | ||||||
| // EMT_SOLID_2_LAYER + EMT_DETAIL_MAP | // EMT_SOLID_2_LAYER + EMT_DETAIL_MAP | ||||||
|  |  | ||||||
| COpenGL3MaterialSolid2CB::COpenGL3MaterialSolid2CB() : | COpenGL3MaterialSolid2CB::COpenGL3MaterialSolid2CB() : | ||||||
| 	FirstUpdate(true), TMatrix0ID(-1), TMatrix1ID(-1), TextureUsage0ID(-1), TextureUsage1ID(-1), TextureUnit0ID(-1), TextureUnit1ID(-1), | 	FirstUpdate(true), TMatrix0ID(-1), TMatrix1ID(-1), TextureUsage0ID(-1), TextureUsage1ID(-1), TextureUnit0ID(-1), TextureUnit1ID(-1), | ||||||
| 	TextureUsage0(0), TextureUsage1(0), TextureUnit0(0), TextureUnit1(1) | 	TextureUsage0(0), TextureUsage1(0), TextureUnit0(0), TextureUnit1(1) | ||||||
| { | { | ||||||
| } | } | ||||||
|  |  | ||||||
| void COpenGL3MaterialSolid2CB::OnSetMaterial(const SMaterial& material) | void COpenGL3MaterialSolid2CB::OnSetMaterial(const SMaterial& material) | ||||||
| { | { | ||||||
| 	COpenGL3MaterialBaseCB::OnSetMaterial(material); | 	COpenGL3MaterialBaseCB::OnSetMaterial(material); | ||||||
|  |  | ||||||
| 	TextureUsage0 = (material.TextureLayer[0].Texture) ? 1 : 0; | 	TextureUsage0 = (material.TextureLayer[0].Texture) ? 1 : 0; | ||||||
| 	TextureUsage1 = (material.TextureLayer[1].Texture) ? 1 : 0; | 	TextureUsage1 = (material.TextureLayer[1].Texture) ? 1 : 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| void COpenGL3MaterialSolid2CB::OnSetConstants(IMaterialRendererServices* services, s32 userData) | void COpenGL3MaterialSolid2CB::OnSetConstants(IMaterialRendererServices* services, s32 userData) | ||||||
| { | { | ||||||
| 	COpenGL3MaterialBaseCB::OnSetConstants(services, userData); | 	COpenGL3MaterialBaseCB::OnSetConstants(services, userData); | ||||||
|  |  | ||||||
| 	IVideoDriver* driver = services->getVideoDriver(); | 	IVideoDriver* driver = services->getVideoDriver(); | ||||||
|  |  | ||||||
| 	if (FirstUpdate) | 	if (FirstUpdate) | ||||||
| 	{ | 	{ | ||||||
| 		TMatrix0ID = services->getVertexShaderConstantID("uTMatrix0"); | 		TMatrix0ID = services->getVertexShaderConstantID("uTMatrix0"); | ||||||
| 		TMatrix1ID = services->getVertexShaderConstantID("uTMatrix1"); | 		TMatrix1ID = services->getVertexShaderConstantID("uTMatrix1"); | ||||||
| 		TextureUsage0ID = services->getVertexShaderConstantID("uTextureUsage0"); | 		TextureUsage0ID = services->getVertexShaderConstantID("uTextureUsage0"); | ||||||
| 		TextureUsage1ID = services->getVertexShaderConstantID("uTextureUsage1"); | 		TextureUsage1ID = services->getVertexShaderConstantID("uTextureUsage1"); | ||||||
| 		TextureUnit0ID = services->getVertexShaderConstantID("uTextureUnit0"); | 		TextureUnit0ID = services->getVertexShaderConstantID("uTextureUnit0"); | ||||||
| 		TextureUnit1ID = services->getVertexShaderConstantID("uTextureUnit1"); | 		TextureUnit1ID = services->getVertexShaderConstantID("uTextureUnit1"); | ||||||
|  |  | ||||||
| 		FirstUpdate = false; | 		FirstUpdate = false; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	core::matrix4 Matrix = driver->getTransform(ETS_TEXTURE_0); | 	core::matrix4 Matrix = driver->getTransform(ETS_TEXTURE_0); | ||||||
| 	services->setPixelShaderConstant(TMatrix0ID, Matrix.pointer(), 16); | 	services->setPixelShaderConstant(TMatrix0ID, Matrix.pointer(), 16); | ||||||
|  |  | ||||||
| 	Matrix = driver->getTransform(E_TRANSFORMATION_STATE(ETS_TEXTURE_0 + 1)); | 	Matrix = driver->getTransform(E_TRANSFORMATION_STATE(ETS_TEXTURE_0 + 1)); | ||||||
| 	services->setPixelShaderConstant(TMatrix1ID, Matrix.pointer(), 16); | 	services->setPixelShaderConstant(TMatrix1ID, Matrix.pointer(), 16); | ||||||
|  |  | ||||||
| 	services->setPixelShaderConstant(TextureUsage0ID, &TextureUsage0, 1); | 	services->setPixelShaderConstant(TextureUsage0ID, &TextureUsage0, 1); | ||||||
| 	services->setPixelShaderConstant(TextureUsage1ID, &TextureUsage1, 1); | 	services->setPixelShaderConstant(TextureUsage1ID, &TextureUsage1, 1); | ||||||
| 	services->setPixelShaderConstant(TextureUnit0ID, &TextureUnit0, 1); | 	services->setPixelShaderConstant(TextureUnit0ID, &TextureUnit0, 1); | ||||||
| 	services->setPixelShaderConstant(TextureUnit1ID, &TextureUnit1, 1); | 	services->setPixelShaderConstant(TextureUnit1ID, &TextureUnit1, 1); | ||||||
| } | } | ||||||
|  |  | ||||||
| // EMT_LIGHTMAP + EMT_LIGHTMAP_ADD + EMT_LIGHTMAP_M2 + EMT_LIGHTMAP_M4 | // EMT_LIGHTMAP + EMT_LIGHTMAP_ADD + EMT_LIGHTMAP_M2 + EMT_LIGHTMAP_M4 | ||||||
|  |  | ||||||
| COpenGL3MaterialLightmapCB::COpenGL3MaterialLightmapCB(float modulate) : | COpenGL3MaterialLightmapCB::COpenGL3MaterialLightmapCB(float modulate) : | ||||||
| 	FirstUpdate(true), TMatrix0ID(-1), TMatrix1ID(-1), ModulateID(-1), TextureUsage0ID(-1), TextureUsage1ID(-1), TextureUnit0ID(-1), TextureUnit1ID(-1), | 	FirstUpdate(true), TMatrix0ID(-1), TMatrix1ID(-1), ModulateID(-1), TextureUsage0ID(-1), TextureUsage1ID(-1), TextureUnit0ID(-1), TextureUnit1ID(-1), | ||||||
| 	Modulate(modulate), TextureUsage0(0), TextureUsage1(0), TextureUnit0(0), TextureUnit1(1) | 	Modulate(modulate), TextureUsage0(0), TextureUsage1(0), TextureUnit0(0), TextureUnit1(1) | ||||||
| { | { | ||||||
| } | } | ||||||
|  |  | ||||||
| void COpenGL3MaterialLightmapCB::OnSetMaterial(const SMaterial& material) | void COpenGL3MaterialLightmapCB::OnSetMaterial(const SMaterial& material) | ||||||
| { | { | ||||||
| 	COpenGL3MaterialBaseCB::OnSetMaterial(material); | 	COpenGL3MaterialBaseCB::OnSetMaterial(material); | ||||||
|  |  | ||||||
| 	TextureUsage0 = (material.TextureLayer[0].Texture) ? 1 : 0; | 	TextureUsage0 = (material.TextureLayer[0].Texture) ? 1 : 0; | ||||||
| 	TextureUsage1 = (material.TextureLayer[1].Texture) ? 1 : 0; | 	TextureUsage1 = (material.TextureLayer[1].Texture) ? 1 : 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| void COpenGL3MaterialLightmapCB::OnSetConstants(IMaterialRendererServices* services, s32 userData) | void COpenGL3MaterialLightmapCB::OnSetConstants(IMaterialRendererServices* services, s32 userData) | ||||||
| { | { | ||||||
| 	COpenGL3MaterialBaseCB::OnSetConstants(services, userData); | 	COpenGL3MaterialBaseCB::OnSetConstants(services, userData); | ||||||
|  |  | ||||||
| 	IVideoDriver* driver = services->getVideoDriver(); | 	IVideoDriver* driver = services->getVideoDriver(); | ||||||
|  |  | ||||||
| 	if (FirstUpdate) | 	if (FirstUpdate) | ||||||
| 	{ | 	{ | ||||||
| 		TMatrix0ID = services->getVertexShaderConstantID("uTMatrix0"); | 		TMatrix0ID = services->getVertexShaderConstantID("uTMatrix0"); | ||||||
| 		TMatrix1ID = services->getVertexShaderConstantID("uTMatrix1"); | 		TMatrix1ID = services->getVertexShaderConstantID("uTMatrix1"); | ||||||
| 		ModulateID = services->getVertexShaderConstantID("uModulate"); | 		ModulateID = services->getVertexShaderConstantID("uModulate"); | ||||||
| 		TextureUsage0ID = services->getVertexShaderConstantID("uTextureUsage0"); | 		TextureUsage0ID = services->getVertexShaderConstantID("uTextureUsage0"); | ||||||
| 		TextureUsage1ID = services->getVertexShaderConstantID("uTextureUsage1"); | 		TextureUsage1ID = services->getVertexShaderConstantID("uTextureUsage1"); | ||||||
| 		TextureUnit0ID = services->getVertexShaderConstantID("uTextureUnit0"); | 		TextureUnit0ID = services->getVertexShaderConstantID("uTextureUnit0"); | ||||||
| 		TextureUnit1ID = services->getVertexShaderConstantID("uTextureUnit1"); | 		TextureUnit1ID = services->getVertexShaderConstantID("uTextureUnit1"); | ||||||
|  |  | ||||||
| 		FirstUpdate = false; | 		FirstUpdate = false; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	core::matrix4 Matrix = driver->getTransform(ETS_TEXTURE_0); | 	core::matrix4 Matrix = driver->getTransform(ETS_TEXTURE_0); | ||||||
| 	services->setPixelShaderConstant(TMatrix0ID, Matrix.pointer(), 16); | 	services->setPixelShaderConstant(TMatrix0ID, Matrix.pointer(), 16); | ||||||
|  |  | ||||||
| 	Matrix = driver->getTransform(E_TRANSFORMATION_STATE(ETS_TEXTURE_0 + 1)); | 	Matrix = driver->getTransform(E_TRANSFORMATION_STATE(ETS_TEXTURE_0 + 1)); | ||||||
| 	services->setPixelShaderConstant(TMatrix1ID, Matrix.pointer(), 16); | 	services->setPixelShaderConstant(TMatrix1ID, Matrix.pointer(), 16); | ||||||
|  |  | ||||||
| 	services->setPixelShaderConstant(ModulateID, &Modulate, 1); | 	services->setPixelShaderConstant(ModulateID, &Modulate, 1); | ||||||
| 	services->setPixelShaderConstant(TextureUsage0ID, &TextureUsage0, 1); | 	services->setPixelShaderConstant(TextureUsage0ID, &TextureUsage0, 1); | ||||||
| 	services->setPixelShaderConstant(TextureUsage1ID, &TextureUsage1, 1); | 	services->setPixelShaderConstant(TextureUsage1ID, &TextureUsage1, 1); | ||||||
| 	services->setPixelShaderConstant(TextureUnit0ID, &TextureUnit0, 1); | 	services->setPixelShaderConstant(TextureUnit0ID, &TextureUnit0, 1); | ||||||
| 	services->setPixelShaderConstant(TextureUnit1ID, &TextureUnit1, 1); | 	services->setPixelShaderConstant(TextureUnit1ID, &TextureUnit1, 1); | ||||||
| } | } | ||||||
|  |  | ||||||
| // EMT_SPHERE_MAP + EMT_REFLECTION_2_LAYER + EMT_TRANSPARENT_REFLECTION_2_LAYER | // EMT_SPHERE_MAP + EMT_REFLECTION_2_LAYER + EMT_TRANSPARENT_REFLECTION_2_LAYER | ||||||
|  |  | ||||||
| COpenGL3MaterialReflectionCB::COpenGL3MaterialReflectionCB() : | COpenGL3MaterialReflectionCB::COpenGL3MaterialReflectionCB() : | ||||||
| 	FirstUpdate(true), TMatrix0ID(-1), TextureUsage0ID(-1), TextureUsage1ID(-1), TextureUnit0ID(-1), TextureUnit1ID(-1), | 	FirstUpdate(true), TMatrix0ID(-1), TextureUsage0ID(-1), TextureUsage1ID(-1), TextureUnit0ID(-1), TextureUnit1ID(-1), | ||||||
| 	TextureUsage0(0), TextureUsage1(0), TextureUnit0(0), TextureUnit1(1) | 	TextureUsage0(0), TextureUsage1(0), TextureUnit0(0), TextureUnit1(1) | ||||||
| { | { | ||||||
| } | } | ||||||
|  |  | ||||||
| void COpenGL3MaterialReflectionCB::OnSetMaterial(const SMaterial& material) | void COpenGL3MaterialReflectionCB::OnSetMaterial(const SMaterial& material) | ||||||
| { | { | ||||||
| 	COpenGL3MaterialBaseCB::OnSetMaterial(material); | 	COpenGL3MaterialBaseCB::OnSetMaterial(material); | ||||||
|  |  | ||||||
| 	TextureUsage0 = (material.TextureLayer[0].Texture) ? 1 : 0; | 	TextureUsage0 = (material.TextureLayer[0].Texture) ? 1 : 0; | ||||||
| 	TextureUsage1 = (material.TextureLayer[1].Texture) ? 1 : 0; | 	TextureUsage1 = (material.TextureLayer[1].Texture) ? 1 : 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| void COpenGL3MaterialReflectionCB::OnSetConstants(IMaterialRendererServices* services, s32 userData) | void COpenGL3MaterialReflectionCB::OnSetConstants(IMaterialRendererServices* services, s32 userData) | ||||||
| { | { | ||||||
| 	COpenGL3MaterialBaseCB::OnSetConstants(services, userData); | 	COpenGL3MaterialBaseCB::OnSetConstants(services, userData); | ||||||
|  |  | ||||||
| 	IVideoDriver* driver = services->getVideoDriver(); | 	IVideoDriver* driver = services->getVideoDriver(); | ||||||
|  |  | ||||||
| 	if (FirstUpdate) | 	if (FirstUpdate) | ||||||
| 	{ | 	{ | ||||||
| 		TMatrix0ID = services->getVertexShaderConstantID("uTMatrix0"); | 		TMatrix0ID = services->getVertexShaderConstantID("uTMatrix0"); | ||||||
| 		TextureUsage0ID = services->getVertexShaderConstantID("uTextureUsage0"); | 		TextureUsage0ID = services->getVertexShaderConstantID("uTextureUsage0"); | ||||||
| 		TextureUsage1ID = services->getVertexShaderConstantID("uTextureUsage1"); | 		TextureUsage1ID = services->getVertexShaderConstantID("uTextureUsage1"); | ||||||
| 		TextureUnit0ID = services->getVertexShaderConstantID("uTextureUnit0"); | 		TextureUnit0ID = services->getVertexShaderConstantID("uTextureUnit0"); | ||||||
| 		TextureUnit1ID = services->getVertexShaderConstantID("uTextureUnit1"); | 		TextureUnit1ID = services->getVertexShaderConstantID("uTextureUnit1"); | ||||||
|  |  | ||||||
| 		FirstUpdate = false; | 		FirstUpdate = false; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	core::matrix4 Matrix = driver->getTransform(ETS_TEXTURE_0); | 	core::matrix4 Matrix = driver->getTransform(ETS_TEXTURE_0); | ||||||
| 	services->setPixelShaderConstant(TMatrix0ID, Matrix.pointer(), 16); | 	services->setPixelShaderConstant(TMatrix0ID, Matrix.pointer(), 16); | ||||||
|  |  | ||||||
| 	services->setPixelShaderConstant(TextureUsage0ID, &TextureUsage0, 1); | 	services->setPixelShaderConstant(TextureUsage0ID, &TextureUsage0, 1); | ||||||
| 	services->setPixelShaderConstant(TextureUsage1ID, &TextureUsage1, 1); | 	services->setPixelShaderConstant(TextureUsage1ID, &TextureUsage1, 1); | ||||||
| 	services->setPixelShaderConstant(TextureUnit0ID, &TextureUnit0, 1); | 	services->setPixelShaderConstant(TextureUnit0ID, &TextureUnit0, 1); | ||||||
| 	services->setPixelShaderConstant(TextureUnit1ID, &TextureUnit1, 1); | 	services->setPixelShaderConstant(TextureUnit1ID, &TextureUnit1, 1); | ||||||
| } | } | ||||||
|  |  | ||||||
| // EMT_ONETEXTURE_BLEND | // EMT_ONETEXTURE_BLEND | ||||||
|  |  | ||||||
| COpenGL3MaterialOneTextureBlendCB::COpenGL3MaterialOneTextureBlendCB() : | COpenGL3MaterialOneTextureBlendCB::COpenGL3MaterialOneTextureBlendCB() : | ||||||
| 	FirstUpdate(true), TMatrix0ID(-1), BlendTypeID(-1), TextureUsage0ID(-1), TextureUnit0ID(-1), BlendType(0), TextureUsage0(0), TextureUnit0(0) | 	FirstUpdate(true), TMatrix0ID(-1), BlendTypeID(-1), TextureUsage0ID(-1), TextureUnit0ID(-1), BlendType(0), TextureUsage0(0), TextureUnit0(0) | ||||||
| { | { | ||||||
| } | } | ||||||
|  |  | ||||||
| void COpenGL3MaterialOneTextureBlendCB::OnSetMaterial(const SMaterial& material) | void COpenGL3MaterialOneTextureBlendCB::OnSetMaterial(const SMaterial& material) | ||||||
| { | { | ||||||
| 	COpenGL3MaterialBaseCB::OnSetMaterial(material); | 	COpenGL3MaterialBaseCB::OnSetMaterial(material); | ||||||
|  |  | ||||||
| 	BlendType = 0; | 	BlendType = 0; | ||||||
|  |  | ||||||
| 	E_BLEND_FACTOR srcRGBFact,dstRGBFact,srcAlphaFact,dstAlphaFact; | 	E_BLEND_FACTOR srcRGBFact,dstRGBFact,srcAlphaFact,dstAlphaFact; | ||||||
| 	E_MODULATE_FUNC modulate; | 	E_MODULATE_FUNC modulate; | ||||||
| 	u32 alphaSource; | 	u32 alphaSource; | ||||||
| 	unpack_textureBlendFuncSeparate(srcRGBFact, dstRGBFact, srcAlphaFact, dstAlphaFact, modulate, alphaSource, material.MaterialTypeParam); | 	unpack_textureBlendFuncSeparate(srcRGBFact, dstRGBFact, srcAlphaFact, dstAlphaFact, modulate, alphaSource, material.MaterialTypeParam); | ||||||
|  |  | ||||||
| 	if (textureBlendFunc_hasAlpha(srcRGBFact) || textureBlendFunc_hasAlpha(dstRGBFact) || textureBlendFunc_hasAlpha(srcAlphaFact) || textureBlendFunc_hasAlpha(dstAlphaFact)) | 	if (textureBlendFunc_hasAlpha(srcRGBFact) || textureBlendFunc_hasAlpha(dstRGBFact) || textureBlendFunc_hasAlpha(srcAlphaFact) || textureBlendFunc_hasAlpha(dstAlphaFact)) | ||||||
| 	{ | 	{ | ||||||
| 		if (alphaSource == EAS_VERTEX_COLOR) | 		if (alphaSource == EAS_VERTEX_COLOR) | ||||||
| 		{ | 		{ | ||||||
| 			BlendType = 1; | 			BlendType = 1; | ||||||
| 		} | 		} | ||||||
| 		else if (alphaSource == EAS_TEXTURE) | 		else if (alphaSource == EAS_TEXTURE) | ||||||
| 		{ | 		{ | ||||||
| 			BlendType = 2; | 			BlendType = 2; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	TextureUsage0 = (material.TextureLayer[0].Texture) ? 1 : 0; | 	TextureUsage0 = (material.TextureLayer[0].Texture) ? 1 : 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| void COpenGL3MaterialOneTextureBlendCB::OnSetConstants(IMaterialRendererServices* services, s32 userData) | void COpenGL3MaterialOneTextureBlendCB::OnSetConstants(IMaterialRendererServices* services, s32 userData) | ||||||
| { | { | ||||||
| 	COpenGL3MaterialBaseCB::OnSetConstants(services, userData); | 	COpenGL3MaterialBaseCB::OnSetConstants(services, userData); | ||||||
|  |  | ||||||
| 	IVideoDriver* driver = services->getVideoDriver(); | 	IVideoDriver* driver = services->getVideoDriver(); | ||||||
|  |  | ||||||
| 	if (FirstUpdate) | 	if (FirstUpdate) | ||||||
| 	{ | 	{ | ||||||
| 		TMatrix0ID = services->getVertexShaderConstantID("uTMatrix0"); | 		TMatrix0ID = services->getVertexShaderConstantID("uTMatrix0"); | ||||||
| 		BlendTypeID = services->getVertexShaderConstantID("uBlendType"); | 		BlendTypeID = services->getVertexShaderConstantID("uBlendType"); | ||||||
| 		TextureUsage0ID = services->getVertexShaderConstantID("uTextureUsage0"); | 		TextureUsage0ID = services->getVertexShaderConstantID("uTextureUsage0"); | ||||||
| 		TextureUnit0ID = services->getVertexShaderConstantID("uTextureUnit0"); | 		TextureUnit0ID = services->getVertexShaderConstantID("uTextureUnit0"); | ||||||
|  |  | ||||||
| 		FirstUpdate = false; | 		FirstUpdate = false; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	core::matrix4 Matrix = driver->getTransform(ETS_TEXTURE_0); | 	core::matrix4 Matrix = driver->getTransform(ETS_TEXTURE_0); | ||||||
| 	services->setPixelShaderConstant(TMatrix0ID, Matrix.pointer(), 16); | 	services->setPixelShaderConstant(TMatrix0ID, Matrix.pointer(), 16); | ||||||
|  |  | ||||||
| 	services->setPixelShaderConstant(BlendTypeID, &BlendType, 1); | 	services->setPixelShaderConstant(BlendTypeID, &BlendType, 1); | ||||||
| 	services->setPixelShaderConstant(TextureUsage0ID, &TextureUsage0, 1); | 	services->setPixelShaderConstant(TextureUsage0ID, &TextureUsage0, 1); | ||||||
| 	services->setPixelShaderConstant(TextureUnit0ID, &TextureUnit0, 1); | 	services->setPixelShaderConstant(TextureUnit0ID, &TextureUnit0, 1); | ||||||
| } | } | ||||||
|  |  | ||||||
| } | } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,180 +1,180 @@ | |||||||
| // Copyright (C) 2014 Patryk Nadrowski | // Copyright (C) 2014 Patryk Nadrowski | ||||||
| // This file is part of the "Irrlicht Engine". | // This file is part of the "Irrlicht Engine". | ||||||
| // For conditions of distribution and use, see copyright notice in Irrlicht.h | // For conditions of distribution and use, see copyright notice in Irrlicht.h | ||||||
|  |  | ||||||
| #pragma once | #pragma once | ||||||
|  |  | ||||||
| #include "IShaderConstantSetCallBack.h" | #include "IShaderConstantSetCallBack.h" | ||||||
| #include "IMaterialRendererServices.h" | #include "IMaterialRendererServices.h" | ||||||
|  |  | ||||||
| namespace irr | namespace irr | ||||||
| { | { | ||||||
| namespace video | namespace video | ||||||
| { | { | ||||||
|  |  | ||||||
| class COpenGL3MaterialBaseCB : public IShaderConstantSetCallBack | class COpenGL3MaterialBaseCB : public IShaderConstantSetCallBack | ||||||
| { | { | ||||||
| public: | public: | ||||||
| 	COpenGL3MaterialBaseCB(); | 	COpenGL3MaterialBaseCB(); | ||||||
|  |  | ||||||
| 	virtual void OnSetMaterial(const SMaterial& material); | 	virtual void OnSetMaterial(const SMaterial& material); | ||||||
| 	virtual void OnSetConstants(IMaterialRendererServices* services, s32 userData); | 	virtual void OnSetConstants(IMaterialRendererServices* services, s32 userData); | ||||||
|  |  | ||||||
| protected: | protected: | ||||||
| 	bool FirstUpdateBase; | 	bool FirstUpdateBase; | ||||||
|  |  | ||||||
| 	s32 WVPMatrixID; | 	s32 WVPMatrixID; | ||||||
| 	s32 WVMatrixID; | 	s32 WVMatrixID; | ||||||
| 	s32 NMatrixID; | 	s32 NMatrixID; | ||||||
|  |  | ||||||
| 	s32 GlobalAmbientID; | 	s32 GlobalAmbientID; | ||||||
| 	s32 MaterialAmbientID; | 	s32 MaterialAmbientID; | ||||||
| 	s32 MaterialDiffuseID; | 	s32 MaterialDiffuseID; | ||||||
| 	s32 MaterialEmissiveID; | 	s32 MaterialEmissiveID; | ||||||
| 	s32 MaterialSpecularID; | 	s32 MaterialSpecularID; | ||||||
| 	s32 MaterialShininessID; | 	s32 MaterialShininessID; | ||||||
|  |  | ||||||
| 	s32 FogEnableID; | 	s32 FogEnableID; | ||||||
| 	s32 FogTypeID; | 	s32 FogTypeID; | ||||||
| 	s32 FogColorID; | 	s32 FogColorID; | ||||||
| 	s32 FogStartID; | 	s32 FogStartID; | ||||||
| 	s32 FogEndID; | 	s32 FogEndID; | ||||||
| 	s32 FogDensityID; | 	s32 FogDensityID; | ||||||
|  |  | ||||||
| 	s32 ThicknessID; | 	s32 ThicknessID; | ||||||
|  |  | ||||||
| 	bool LightEnable; | 	bool LightEnable; | ||||||
| 	SColorf GlobalAmbient; | 	SColorf GlobalAmbient; | ||||||
| 	SColorf MaterialAmbient; | 	SColorf MaterialAmbient; | ||||||
| 	SColorf MaterialDiffuse; | 	SColorf MaterialDiffuse; | ||||||
| 	SColorf MaterialEmissive; | 	SColorf MaterialEmissive; | ||||||
| 	SColorf MaterialSpecular; | 	SColorf MaterialSpecular; | ||||||
| 	f32 MaterialShininess; | 	f32 MaterialShininess; | ||||||
|  |  | ||||||
| 	s32 FogEnable; | 	s32 FogEnable; | ||||||
| 	s32 FogType; | 	s32 FogType; | ||||||
| 	SColorf FogColor; | 	SColorf FogColor; | ||||||
| 	f32 FogStart; | 	f32 FogStart; | ||||||
| 	f32 FogEnd; | 	f32 FogEnd; | ||||||
| 	f32 FogDensity; | 	f32 FogDensity; | ||||||
|  |  | ||||||
| 	f32 Thickness; | 	f32 Thickness; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| class COpenGL3MaterialSolidCB : public COpenGL3MaterialBaseCB | class COpenGL3MaterialSolidCB : public COpenGL3MaterialBaseCB | ||||||
| { | { | ||||||
| public: | public: | ||||||
| 	COpenGL3MaterialSolidCB(); | 	COpenGL3MaterialSolidCB(); | ||||||
|  |  | ||||||
| 	virtual void OnSetMaterial(const SMaterial& material); | 	virtual void OnSetMaterial(const SMaterial& material); | ||||||
| 	virtual void OnSetConstants(IMaterialRendererServices* services, s32 userData); | 	virtual void OnSetConstants(IMaterialRendererServices* services, s32 userData); | ||||||
|  |  | ||||||
| protected: | protected: | ||||||
| 	bool FirstUpdate; | 	bool FirstUpdate; | ||||||
|  |  | ||||||
| 	s32 TMatrix0ID; | 	s32 TMatrix0ID; | ||||||
| 	s32 AlphaRefID; | 	s32 AlphaRefID; | ||||||
| 	s32 TextureUsage0ID; | 	s32 TextureUsage0ID; | ||||||
| 	s32 TextureUnit0ID; | 	s32 TextureUnit0ID; | ||||||
|  |  | ||||||
| 	f32 AlphaRef; | 	f32 AlphaRef; | ||||||
| 	s32 TextureUsage0; | 	s32 TextureUsage0; | ||||||
| 	s32 TextureUnit0; | 	s32 TextureUnit0; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| class COpenGL3MaterialSolid2CB : public COpenGL3MaterialBaseCB | class COpenGL3MaterialSolid2CB : public COpenGL3MaterialBaseCB | ||||||
| { | { | ||||||
| public: | public: | ||||||
| 	COpenGL3MaterialSolid2CB(); | 	COpenGL3MaterialSolid2CB(); | ||||||
|  |  | ||||||
| 	virtual void OnSetMaterial(const SMaterial& material); | 	virtual void OnSetMaterial(const SMaterial& material); | ||||||
| 	virtual void OnSetConstants(IMaterialRendererServices* services, s32 userData); | 	virtual void OnSetConstants(IMaterialRendererServices* services, s32 userData); | ||||||
|  |  | ||||||
| protected: | protected: | ||||||
| 	bool FirstUpdate; | 	bool FirstUpdate; | ||||||
|  |  | ||||||
| 	s32 TMatrix0ID; | 	s32 TMatrix0ID; | ||||||
| 	s32 TMatrix1ID; | 	s32 TMatrix1ID; | ||||||
| 	s32 TextureUsage0ID; | 	s32 TextureUsage0ID; | ||||||
| 	s32 TextureUsage1ID; | 	s32 TextureUsage1ID; | ||||||
| 	s32 TextureUnit0ID; | 	s32 TextureUnit0ID; | ||||||
| 	s32 TextureUnit1ID; | 	s32 TextureUnit1ID; | ||||||
|  |  | ||||||
| 	s32 TextureUsage0; | 	s32 TextureUsage0; | ||||||
| 	s32 TextureUsage1; | 	s32 TextureUsage1; | ||||||
| 	s32 TextureUnit0; | 	s32 TextureUnit0; | ||||||
| 	s32 TextureUnit1; | 	s32 TextureUnit1; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| class COpenGL3MaterialLightmapCB : public COpenGL3MaterialBaseCB | class COpenGL3MaterialLightmapCB : public COpenGL3MaterialBaseCB | ||||||
| { | { | ||||||
| public: | public: | ||||||
| 	COpenGL3MaterialLightmapCB(float modulate); | 	COpenGL3MaterialLightmapCB(float modulate); | ||||||
|  |  | ||||||
| 	virtual void OnSetMaterial(const SMaterial& material); | 	virtual void OnSetMaterial(const SMaterial& material); | ||||||
| 	virtual void OnSetConstants(IMaterialRendererServices* services, s32 userData); | 	virtual void OnSetConstants(IMaterialRendererServices* services, s32 userData); | ||||||
|  |  | ||||||
| protected: | protected: | ||||||
| 	bool FirstUpdate; | 	bool FirstUpdate; | ||||||
|  |  | ||||||
| 	s32 TMatrix0ID; | 	s32 TMatrix0ID; | ||||||
| 	s32 TMatrix1ID; | 	s32 TMatrix1ID; | ||||||
| 	s32 ModulateID; | 	s32 ModulateID; | ||||||
| 	s32 TextureUsage0ID; | 	s32 TextureUsage0ID; | ||||||
| 	s32 TextureUsage1ID; | 	s32 TextureUsage1ID; | ||||||
| 	s32 TextureUnit0ID; | 	s32 TextureUnit0ID; | ||||||
| 	s32 TextureUnit1ID; | 	s32 TextureUnit1ID; | ||||||
|  |  | ||||||
| 	f32 Modulate; | 	f32 Modulate; | ||||||
| 	s32 TextureUsage0; | 	s32 TextureUsage0; | ||||||
| 	s32 TextureUsage1; | 	s32 TextureUsage1; | ||||||
| 	s32 TextureUnit0; | 	s32 TextureUnit0; | ||||||
| 	s32 TextureUnit1; | 	s32 TextureUnit1; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| class COpenGL3MaterialReflectionCB : public COpenGL3MaterialBaseCB | class COpenGL3MaterialReflectionCB : public COpenGL3MaterialBaseCB | ||||||
| { | { | ||||||
| public: | public: | ||||||
| 	COpenGL3MaterialReflectionCB(); | 	COpenGL3MaterialReflectionCB(); | ||||||
|  |  | ||||||
| 	virtual void OnSetMaterial(const SMaterial& material); | 	virtual void OnSetMaterial(const SMaterial& material); | ||||||
| 	virtual void OnSetConstants(IMaterialRendererServices* services, s32 userData); | 	virtual void OnSetConstants(IMaterialRendererServices* services, s32 userData); | ||||||
|  |  | ||||||
| protected: | protected: | ||||||
| 	bool FirstUpdate; | 	bool FirstUpdate; | ||||||
|  |  | ||||||
| 	s32 TMatrix0ID; | 	s32 TMatrix0ID; | ||||||
| 	s32 TextureUsage0ID; | 	s32 TextureUsage0ID; | ||||||
| 	s32 TextureUsage1ID; | 	s32 TextureUsage1ID; | ||||||
| 	s32 TextureUnit0ID; | 	s32 TextureUnit0ID; | ||||||
| 	s32 TextureUnit1ID; | 	s32 TextureUnit1ID; | ||||||
|  |  | ||||||
| 	s32 TextureUsage0; | 	s32 TextureUsage0; | ||||||
| 	s32 TextureUsage1; | 	s32 TextureUsage1; | ||||||
| 	s32 TextureUnit0; | 	s32 TextureUnit0; | ||||||
| 	s32 TextureUnit1; | 	s32 TextureUnit1; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| class COpenGL3MaterialOneTextureBlendCB : public COpenGL3MaterialBaseCB | class COpenGL3MaterialOneTextureBlendCB : public COpenGL3MaterialBaseCB | ||||||
| { | { | ||||||
| public: | public: | ||||||
| 	COpenGL3MaterialOneTextureBlendCB(); | 	COpenGL3MaterialOneTextureBlendCB(); | ||||||
|  |  | ||||||
| 	virtual void OnSetMaterial(const SMaterial& material); | 	virtual void OnSetMaterial(const SMaterial& material); | ||||||
| 	virtual void OnSetConstants(IMaterialRendererServices* services, s32 userData); | 	virtual void OnSetConstants(IMaterialRendererServices* services, s32 userData); | ||||||
|  |  | ||||||
| protected: | protected: | ||||||
| 	bool FirstUpdate; | 	bool FirstUpdate; | ||||||
|  |  | ||||||
| 	s32 TMatrix0ID; | 	s32 TMatrix0ID; | ||||||
| 	s32 BlendTypeID; | 	s32 BlendTypeID; | ||||||
| 	s32 TextureUsage0ID; | 	s32 TextureUsage0ID; | ||||||
| 	s32 TextureUnit0ID; | 	s32 TextureUnit0ID; | ||||||
|  |  | ||||||
| 	s32 BlendType; | 	s32 BlendType; | ||||||
| 	s32 TextureUsage0; | 	s32 TextureUsage0; | ||||||
| 	s32 TextureUnit0; | 	s32 TextureUnit0; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| } | } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,481 +1,481 @@ | |||||||
| // Copyright (C) 2014 Patryk Nadrowski | // Copyright (C) 2014 Patryk Nadrowski | ||||||
| // This file is part of the "Irrlicht Engine". | // This file is part of the "Irrlicht Engine". | ||||||
| // For conditions of distribution and use, see copyright notice in irrlicht.h | // For conditions of distribution and use, see copyright notice in irrlicht.h | ||||||
|  |  | ||||||
| #include "MaterialRenderer.h" | #include "MaterialRenderer.h" | ||||||
|  |  | ||||||
| #include "EVertexAttributes.h" | #include "EVertexAttributes.h" | ||||||
| #include "IGPUProgrammingServices.h" | #include "IGPUProgrammingServices.h" | ||||||
| #include "IShaderConstantSetCallBack.h" | #include "IShaderConstantSetCallBack.h" | ||||||
| #include "IVideoDriver.h" | #include "IVideoDriver.h" | ||||||
| #include "os.h" | #include "os.h" | ||||||
|  |  | ||||||
| #include "Driver.h" | #include "Driver.h" | ||||||
|  |  | ||||||
| #include "COpenGLCoreTexture.h" | #include "COpenGLCoreTexture.h" | ||||||
| #include "COpenGLCoreCacheHandler.h" | #include "COpenGLCoreCacheHandler.h" | ||||||
|  |  | ||||||
| namespace irr | namespace irr | ||||||
| { | { | ||||||
| namespace video | namespace video | ||||||
| { | { | ||||||
|  |  | ||||||
|  |  | ||||||
| COpenGL3MaterialRenderer::COpenGL3MaterialRenderer(COpenGL3DriverBase* driver, | COpenGL3MaterialRenderer::COpenGL3MaterialRenderer(COpenGL3DriverBase* driver, | ||||||
| 		s32& outMaterialTypeNr, | 		s32& outMaterialTypeNr, | ||||||
| 		const c8* vertexShaderProgram, | 		const c8* vertexShaderProgram, | ||||||
| 		const c8* pixelShaderProgram, | 		const c8* pixelShaderProgram, | ||||||
| 		IShaderConstantSetCallBack* callback, | 		IShaderConstantSetCallBack* callback, | ||||||
| 		E_MATERIAL_TYPE baseMaterial, | 		E_MATERIAL_TYPE baseMaterial, | ||||||
| 		s32 userData) | 		s32 userData) | ||||||
| 	: Driver(driver), CallBack(callback), Alpha(false), Blending(false), FixedBlending(false), Program(0), UserData(userData) | 	: Driver(driver), CallBack(callback), Alpha(false), Blending(false), FixedBlending(false), Program(0), UserData(userData) | ||||||
| { | { | ||||||
| #ifdef _DEBUG | #ifdef _DEBUG | ||||||
| 	setDebugName("MaterialRenderer"); | 	setDebugName("MaterialRenderer"); | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| 	switch (baseMaterial) | 	switch (baseMaterial) | ||||||
| 	{ | 	{ | ||||||
| 	case EMT_TRANSPARENT_VERTEX_ALPHA: | 	case EMT_TRANSPARENT_VERTEX_ALPHA: | ||||||
| 	case EMT_TRANSPARENT_ALPHA_CHANNEL: | 	case EMT_TRANSPARENT_ALPHA_CHANNEL: | ||||||
| 		Alpha = true; | 		Alpha = true; | ||||||
| 		break; | 		break; | ||||||
| 	case EMT_TRANSPARENT_ADD_COLOR: | 	case EMT_TRANSPARENT_ADD_COLOR: | ||||||
| 		FixedBlending = true; | 		FixedBlending = true; | ||||||
| 		break; | 		break; | ||||||
| 	case EMT_ONETEXTURE_BLEND: | 	case EMT_ONETEXTURE_BLEND: | ||||||
| 		Blending = true; | 		Blending = true; | ||||||
| 		break; | 		break; | ||||||
| 	default: | 	default: | ||||||
| 		break; | 		break; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if (CallBack) | 	if (CallBack) | ||||||
| 		CallBack->grab(); | 		CallBack->grab(); | ||||||
|  |  | ||||||
| 	init(outMaterialTypeNr, vertexShaderProgram, pixelShaderProgram); | 	init(outMaterialTypeNr, vertexShaderProgram, pixelShaderProgram); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| COpenGL3MaterialRenderer::COpenGL3MaterialRenderer(COpenGL3DriverBase* driver, | COpenGL3MaterialRenderer::COpenGL3MaterialRenderer(COpenGL3DriverBase* driver, | ||||||
| 					IShaderConstantSetCallBack* callback, | 					IShaderConstantSetCallBack* callback, | ||||||
| 					E_MATERIAL_TYPE baseMaterial, s32 userData) | 					E_MATERIAL_TYPE baseMaterial, s32 userData) | ||||||
| : Driver(driver), CallBack(callback), Alpha(false), Blending(false), FixedBlending(false), Program(0), UserData(userData) | : Driver(driver), CallBack(callback), Alpha(false), Blending(false), FixedBlending(false), Program(0), UserData(userData) | ||||||
| { | { | ||||||
| 	switch (baseMaterial) | 	switch (baseMaterial) | ||||||
| 	{ | 	{ | ||||||
| 	case EMT_TRANSPARENT_VERTEX_ALPHA: | 	case EMT_TRANSPARENT_VERTEX_ALPHA: | ||||||
| 	case EMT_TRANSPARENT_ALPHA_CHANNEL: | 	case EMT_TRANSPARENT_ALPHA_CHANNEL: | ||||||
| 		Alpha = true; | 		Alpha = true; | ||||||
| 		break; | 		break; | ||||||
| 	case EMT_TRANSPARENT_ADD_COLOR: | 	case EMT_TRANSPARENT_ADD_COLOR: | ||||||
| 		FixedBlending = true; | 		FixedBlending = true; | ||||||
| 		break; | 		break; | ||||||
| 	case EMT_ONETEXTURE_BLEND: | 	case EMT_ONETEXTURE_BLEND: | ||||||
| 		Blending = true; | 		Blending = true; | ||||||
| 		break; | 		break; | ||||||
| 	default: | 	default: | ||||||
| 		break; | 		break; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if (CallBack) | 	if (CallBack) | ||||||
| 		CallBack->grab(); | 		CallBack->grab(); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| COpenGL3MaterialRenderer::~COpenGL3MaterialRenderer() | COpenGL3MaterialRenderer::~COpenGL3MaterialRenderer() | ||||||
| { | { | ||||||
| 	if (CallBack) | 	if (CallBack) | ||||||
| 		CallBack->drop(); | 		CallBack->drop(); | ||||||
|  |  | ||||||
| 	if (Program) | 	if (Program) | ||||||
| 	{ | 	{ | ||||||
| 		GLuint shaders[8]; | 		GLuint shaders[8]; | ||||||
| 		GLint count; | 		GLint count; | ||||||
| 		glGetAttachedShaders(Program, 8, &count, shaders); | 		glGetAttachedShaders(Program, 8, &count, shaders); | ||||||
|  |  | ||||||
| 		count=core::min_(count,8); | 		count=core::min_(count,8); | ||||||
| 		for (GLint i=0; i<count; ++i) | 		for (GLint i=0; i<count; ++i) | ||||||
| 			glDeleteShader(shaders[i]); | 			glDeleteShader(shaders[i]); | ||||||
| 		glDeleteProgram(Program); | 		glDeleteProgram(Program); | ||||||
| 		Program = 0; | 		Program = 0; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	UniformInfo.clear(); | 	UniformInfo.clear(); | ||||||
| } | } | ||||||
|  |  | ||||||
| GLuint COpenGL3MaterialRenderer::getProgram() const | GLuint COpenGL3MaterialRenderer::getProgram() const | ||||||
| { | { | ||||||
| 	return Program; | 	return Program; | ||||||
| } | } | ||||||
|  |  | ||||||
| void COpenGL3MaterialRenderer::init(s32& outMaterialTypeNr, | void COpenGL3MaterialRenderer::init(s32& outMaterialTypeNr, | ||||||
| 		const c8* vertexShaderProgram, | 		const c8* vertexShaderProgram, | ||||||
| 		const c8* pixelShaderProgram, | 		const c8* pixelShaderProgram, | ||||||
| 		bool addMaterial) | 		bool addMaterial) | ||||||
| { | { | ||||||
| 	outMaterialTypeNr = -1; | 	outMaterialTypeNr = -1; | ||||||
|  |  | ||||||
| 	Program = glCreateProgram(); | 	Program = glCreateProgram(); | ||||||
|  |  | ||||||
| 	if (!Program) | 	if (!Program) | ||||||
| 		return; | 		return; | ||||||
|  |  | ||||||
| 	if (vertexShaderProgram) | 	if (vertexShaderProgram) | ||||||
| 		if (!createShader(GL_VERTEX_SHADER, vertexShaderProgram)) | 		if (!createShader(GL_VERTEX_SHADER, vertexShaderProgram)) | ||||||
| 			return; | 			return; | ||||||
|  |  | ||||||
| 	if (pixelShaderProgram) | 	if (pixelShaderProgram) | ||||||
| 		if (!createShader(GL_FRAGMENT_SHADER, pixelShaderProgram)) | 		if (!createShader(GL_FRAGMENT_SHADER, pixelShaderProgram)) | ||||||
| 			return; | 			return; | ||||||
|  |  | ||||||
| 	for ( size_t i = 0; i < EVA_COUNT; ++i ) | 	for ( size_t i = 0; i < EVA_COUNT; ++i ) | ||||||
| 			glBindAttribLocation( Program, i, sBuiltInVertexAttributeNames[i]); | 			glBindAttribLocation( Program, i, sBuiltInVertexAttributeNames[i]); | ||||||
|  |  | ||||||
| 	if (!linkProgram()) | 	if (!linkProgram()) | ||||||
| 		return; | 		return; | ||||||
|  |  | ||||||
| 	if (addMaterial) | 	if (addMaterial) | ||||||
| 		outMaterialTypeNr = Driver->addMaterialRenderer(this); | 		outMaterialTypeNr = Driver->addMaterialRenderer(this); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| bool COpenGL3MaterialRenderer::OnRender(IMaterialRendererServices* service, E_VERTEX_TYPE vtxtype) | bool COpenGL3MaterialRenderer::OnRender(IMaterialRendererServices* service, E_VERTEX_TYPE vtxtype) | ||||||
| { | { | ||||||
| 	if (CallBack && Program) | 	if (CallBack && Program) | ||||||
| 		CallBack->OnSetConstants(this, UserData); | 		CallBack->OnSetConstants(this, UserData); | ||||||
|  |  | ||||||
| 	return true; | 	return true; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| void COpenGL3MaterialRenderer::OnSetMaterial(const video::SMaterial& material, | void COpenGL3MaterialRenderer::OnSetMaterial(const video::SMaterial& material, | ||||||
| 				const video::SMaterial& lastMaterial, | 				const video::SMaterial& lastMaterial, | ||||||
| 				bool resetAllRenderstates, | 				bool resetAllRenderstates, | ||||||
| 				video::IMaterialRendererServices* services) | 				video::IMaterialRendererServices* services) | ||||||
| { | { | ||||||
| 	COpenGL3CacheHandler* cacheHandler = Driver->getCacheHandler(); | 	COpenGL3CacheHandler* cacheHandler = Driver->getCacheHandler(); | ||||||
|  |  | ||||||
| 	cacheHandler->setProgram(Program); | 	cacheHandler->setProgram(Program); | ||||||
|  |  | ||||||
| 	Driver->setBasicRenderStates(material, lastMaterial, resetAllRenderstates); | 	Driver->setBasicRenderStates(material, lastMaterial, resetAllRenderstates); | ||||||
|  |  | ||||||
| 	if (Alpha) | 	if (Alpha) | ||||||
| 	{ | 	{ | ||||||
| 		cacheHandler->setBlend(true); | 		cacheHandler->setBlend(true); | ||||||
| 		cacheHandler->setBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); | 		cacheHandler->setBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); | ||||||
| 	} | 	} | ||||||
| 	else if (FixedBlending) | 	else if (FixedBlending) | ||||||
| 	{ | 	{ | ||||||
| 		cacheHandler->setBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_COLOR); | 		cacheHandler->setBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_COLOR); | ||||||
| 		cacheHandler->setBlend(true); | 		cacheHandler->setBlend(true); | ||||||
| 	} | 	} | ||||||
| 	else if (Blending) | 	else if (Blending) | ||||||
| 	{ | 	{ | ||||||
| 		E_BLEND_FACTOR srcRGBFact,dstRGBFact,srcAlphaFact,dstAlphaFact; | 		E_BLEND_FACTOR srcRGBFact,dstRGBFact,srcAlphaFact,dstAlphaFact; | ||||||
| 		E_MODULATE_FUNC modulate; | 		E_MODULATE_FUNC modulate; | ||||||
| 		u32 alphaSource; | 		u32 alphaSource; | ||||||
| 		unpack_textureBlendFuncSeparate(srcRGBFact, dstRGBFact, srcAlphaFact, dstAlphaFact, modulate, alphaSource, material.MaterialTypeParam); | 		unpack_textureBlendFuncSeparate(srcRGBFact, dstRGBFact, srcAlphaFact, dstAlphaFact, modulate, alphaSource, material.MaterialTypeParam); | ||||||
|  |  | ||||||
| 		cacheHandler->setBlendFuncSeparate(Driver->getGLBlend(srcRGBFact), Driver->getGLBlend(dstRGBFact), | 		cacheHandler->setBlendFuncSeparate(Driver->getGLBlend(srcRGBFact), Driver->getGLBlend(dstRGBFact), | ||||||
| 			Driver->getGLBlend(srcAlphaFact), Driver->getGLBlend(dstAlphaFact)); | 			Driver->getGLBlend(srcAlphaFact), Driver->getGLBlend(dstAlphaFact)); | ||||||
|  |  | ||||||
| 		cacheHandler->setBlend(true); | 		cacheHandler->setBlend(true); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if (CallBack) | 	if (CallBack) | ||||||
| 		CallBack->OnSetMaterial(material); | 		CallBack->OnSetMaterial(material); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| void COpenGL3MaterialRenderer::OnUnsetMaterial() | void COpenGL3MaterialRenderer::OnUnsetMaterial() | ||||||
| { | { | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| bool COpenGL3MaterialRenderer::isTransparent() const | bool COpenGL3MaterialRenderer::isTransparent() const | ||||||
| { | { | ||||||
| 	return (Alpha || Blending || FixedBlending); | 	return (Alpha || Blending || FixedBlending); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| s32 COpenGL3MaterialRenderer::getRenderCapability() const | s32 COpenGL3MaterialRenderer::getRenderCapability() const | ||||||
| { | { | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| bool COpenGL3MaterialRenderer::createShader(GLenum shaderType, const char* shader) | bool COpenGL3MaterialRenderer::createShader(GLenum shaderType, const char* shader) | ||||||
| { | { | ||||||
| 	if (Program) | 	if (Program) | ||||||
| 	{ | 	{ | ||||||
| 		GLuint shaderHandle = glCreateShader(shaderType); | 		GLuint shaderHandle = glCreateShader(shaderType); | ||||||
| 		glShaderSource(shaderHandle, 1, &shader, NULL); | 		glShaderSource(shaderHandle, 1, &shader, NULL); | ||||||
| 		glCompileShader(shaderHandle); | 		glCompileShader(shaderHandle); | ||||||
|  |  | ||||||
| 		GLint status = 0; | 		GLint status = 0; | ||||||
|  |  | ||||||
| 		glGetShaderiv(shaderHandle, GL_COMPILE_STATUS, &status); | 		glGetShaderiv(shaderHandle, GL_COMPILE_STATUS, &status); | ||||||
|  |  | ||||||
| 		if (status != GL_TRUE) | 		if (status != GL_TRUE) | ||||||
| 		{ | 		{ | ||||||
| 			os::Printer::log("GLSL shader failed to compile", ELL_ERROR); | 			os::Printer::log("GLSL shader failed to compile", ELL_ERROR); | ||||||
|  |  | ||||||
| 			GLint maxLength=0; | 			GLint maxLength=0; | ||||||
| 			GLint length; | 			GLint length; | ||||||
|  |  | ||||||
| 			glGetShaderiv(shaderHandle, GL_INFO_LOG_LENGTH, | 			glGetShaderiv(shaderHandle, GL_INFO_LOG_LENGTH, | ||||||
| 					&maxLength); | 					&maxLength); | ||||||
|  |  | ||||||
| 			if (maxLength) | 			if (maxLength) | ||||||
| 			{ | 			{ | ||||||
| 				GLchar *infoLog = new GLchar[maxLength]; | 				GLchar *infoLog = new GLchar[maxLength]; | ||||||
| 				glGetShaderInfoLog(shaderHandle, maxLength, &length, infoLog); | 				glGetShaderInfoLog(shaderHandle, maxLength, &length, infoLog); | ||||||
| 				os::Printer::log(reinterpret_cast<const c8*>(infoLog), ELL_ERROR); | 				os::Printer::log(reinterpret_cast<const c8*>(infoLog), ELL_ERROR); | ||||||
| 				delete [] infoLog; | 				delete [] infoLog; | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
| 			return false; | 			return false; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		glAttachShader(Program, shaderHandle); | 		glAttachShader(Program, shaderHandle); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return true; | 	return true; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| bool COpenGL3MaterialRenderer::linkProgram() | bool COpenGL3MaterialRenderer::linkProgram() | ||||||
| { | { | ||||||
| 	if (Program) | 	if (Program) | ||||||
| 	{ | 	{ | ||||||
| 		glLinkProgram(Program); | 		glLinkProgram(Program); | ||||||
|  |  | ||||||
| 		GLint status = 0; | 		GLint status = 0; | ||||||
|  |  | ||||||
| 		glGetProgramiv(Program, GL_LINK_STATUS, &status); | 		glGetProgramiv(Program, GL_LINK_STATUS, &status); | ||||||
|  |  | ||||||
| 		if (!status) | 		if (!status) | ||||||
| 		{ | 		{ | ||||||
| 			os::Printer::log("GLSL shader program failed to link", ELL_ERROR); | 			os::Printer::log("GLSL shader program failed to link", ELL_ERROR); | ||||||
|  |  | ||||||
| 			GLint maxLength=0; | 			GLint maxLength=0; | ||||||
| 			GLsizei length; | 			GLsizei length; | ||||||
|  |  | ||||||
| 			glGetProgramiv(Program, GL_INFO_LOG_LENGTH, &maxLength); | 			glGetProgramiv(Program, GL_INFO_LOG_LENGTH, &maxLength); | ||||||
|  |  | ||||||
| 			if (maxLength) | 			if (maxLength) | ||||||
| 			{ | 			{ | ||||||
| 				GLchar *infoLog = new GLchar[maxLength]; | 				GLchar *infoLog = new GLchar[maxLength]; | ||||||
| 				glGetProgramInfoLog(Program, maxLength, &length, infoLog); | 				glGetProgramInfoLog(Program, maxLength, &length, infoLog); | ||||||
| 				os::Printer::log(reinterpret_cast<const c8*>(infoLog), ELL_ERROR); | 				os::Printer::log(reinterpret_cast<const c8*>(infoLog), ELL_ERROR); | ||||||
| 				delete [] infoLog; | 				delete [] infoLog; | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
| 			return false; | 			return false; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		GLint num = 0; | 		GLint num = 0; | ||||||
|  |  | ||||||
| 		glGetProgramiv(Program, GL_ACTIVE_UNIFORMS, &num); | 		glGetProgramiv(Program, GL_ACTIVE_UNIFORMS, &num); | ||||||
|  |  | ||||||
| 		if (num == 0) | 		if (num == 0) | ||||||
| 			return true; | 			return true; | ||||||
|  |  | ||||||
| 		GLint maxlen = 0; | 		GLint maxlen = 0; | ||||||
|  |  | ||||||
| 		glGetProgramiv(Program, GL_ACTIVE_UNIFORM_MAX_LENGTH, &maxlen); | 		glGetProgramiv(Program, GL_ACTIVE_UNIFORM_MAX_LENGTH, &maxlen); | ||||||
|  |  | ||||||
| 		if (maxlen == 0) | 		if (maxlen == 0) | ||||||
| 		{ | 		{ | ||||||
| 			os::Printer::log("GLSL: failed to retrieve uniform information", ELL_ERROR); | 			os::Printer::log("GLSL: failed to retrieve uniform information", ELL_ERROR); | ||||||
| 			return false; | 			return false; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		// seems that some implementations use an extra null terminator. | 		// seems that some implementations use an extra null terminator. | ||||||
| 		++maxlen; | 		++maxlen; | ||||||
| 		c8 *buf = new c8[maxlen]; | 		c8 *buf = new c8[maxlen]; | ||||||
|  |  | ||||||
| 		UniformInfo.clear(); | 		UniformInfo.clear(); | ||||||
| 		UniformInfo.reallocate(num); | 		UniformInfo.reallocate(num); | ||||||
|  |  | ||||||
| 		for (GLint i=0; i < num; ++i) | 		for (GLint i=0; i < num; ++i) | ||||||
| 		{ | 		{ | ||||||
| 			SUniformInfo ui; | 			SUniformInfo ui; | ||||||
| 			memset(buf, 0, maxlen); | 			memset(buf, 0, maxlen); | ||||||
|  |  | ||||||
| 			GLint size; | 			GLint size; | ||||||
| 			glGetActiveUniform(Program, i, maxlen, 0, &size, &ui.type, reinterpret_cast<GLchar*>(buf)); | 			glGetActiveUniform(Program, i, maxlen, 0, &size, &ui.type, reinterpret_cast<GLchar*>(buf)); | ||||||
|  |  | ||||||
|             core::stringc name = ""; |             core::stringc name = ""; | ||||||
|  |  | ||||||
| 			// array support, workaround for some bugged drivers. | 			// array support, workaround for some bugged drivers. | ||||||
| 			for (s32 i = 0; i < maxlen; ++i) | 			for (s32 i = 0; i < maxlen; ++i) | ||||||
| 			{ | 			{ | ||||||
| 				if (buf[i] == '[' || buf[i] == '\0') | 				if (buf[i] == '[' || buf[i] == '\0') | ||||||
| 					break; | 					break; | ||||||
|  |  | ||||||
|                 name += buf[i]; |                 name += buf[i]; | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
| 			ui.name = name; | 			ui.name = name; | ||||||
| 			ui.location = glGetUniformLocation(Program, buf); | 			ui.location = glGetUniformLocation(Program, buf); | ||||||
|  |  | ||||||
| 			UniformInfo.push_back(ui); | 			UniformInfo.push_back(ui); | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		delete [] buf; | 		delete [] buf; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return true; | 	return true; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| void COpenGL3MaterialRenderer::setBasicRenderStates(const SMaterial& material, | void COpenGL3MaterialRenderer::setBasicRenderStates(const SMaterial& material, | ||||||
| 						const SMaterial& lastMaterial, | 						const SMaterial& lastMaterial, | ||||||
| 						bool resetAllRenderstates) | 						bool resetAllRenderstates) | ||||||
| { | { | ||||||
| 	Driver->setBasicRenderStates(material, lastMaterial, resetAllRenderstates); | 	Driver->setBasicRenderStates(material, lastMaterial, resetAllRenderstates); | ||||||
| } | } | ||||||
|  |  | ||||||
| s32 COpenGL3MaterialRenderer::getVertexShaderConstantID(const c8* name) | s32 COpenGL3MaterialRenderer::getVertexShaderConstantID(const c8* name) | ||||||
| { | { | ||||||
| 	return getPixelShaderConstantID(name); | 	return getPixelShaderConstantID(name); | ||||||
| } | } | ||||||
|  |  | ||||||
| s32 COpenGL3MaterialRenderer::getPixelShaderConstantID(const c8* name) | s32 COpenGL3MaterialRenderer::getPixelShaderConstantID(const c8* name) | ||||||
| { | { | ||||||
| 	for (u32 i = 0; i < UniformInfo.size(); ++i) | 	for (u32 i = 0; i < UniformInfo.size(); ++i) | ||||||
| 	{ | 	{ | ||||||
| 		if (UniformInfo[i].name == name) | 		if (UniformInfo[i].name == name) | ||||||
| 			return i; | 			return i; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return -1; | 	return -1; | ||||||
| } | } | ||||||
|  |  | ||||||
| void COpenGL3MaterialRenderer::setVertexShaderConstant(const f32* data, s32 startRegister, s32 constantAmount) | void COpenGL3MaterialRenderer::setVertexShaderConstant(const f32* data, s32 startRegister, s32 constantAmount) | ||||||
| { | { | ||||||
| 	os::Printer::log("Cannot set constant, please use high level shader call instead.", ELL_WARNING); | 	os::Printer::log("Cannot set constant, please use high level shader call instead.", ELL_WARNING); | ||||||
| } | } | ||||||
|  |  | ||||||
| void COpenGL3MaterialRenderer::setPixelShaderConstant(const f32* data, s32 startRegister, s32 constantAmount) | void COpenGL3MaterialRenderer::setPixelShaderConstant(const f32* data, s32 startRegister, s32 constantAmount) | ||||||
| { | { | ||||||
| 	os::Printer::log("Cannot set constant, use high level shader call.", ELL_WARNING); | 	os::Printer::log("Cannot set constant, use high level shader call.", ELL_WARNING); | ||||||
| } | } | ||||||
|  |  | ||||||
| bool COpenGL3MaterialRenderer::setVertexShaderConstant(s32 index, const f32* floats, int count) | bool COpenGL3MaterialRenderer::setVertexShaderConstant(s32 index, const f32* floats, int count) | ||||||
| { | { | ||||||
| 	return setPixelShaderConstant(index, floats, count); | 	return setPixelShaderConstant(index, floats, count); | ||||||
| } | } | ||||||
|  |  | ||||||
| bool COpenGL3MaterialRenderer::setVertexShaderConstant(s32 index, const s32* ints, int count) | bool COpenGL3MaterialRenderer::setVertexShaderConstant(s32 index, const s32* ints, int count) | ||||||
| { | { | ||||||
| 	return setPixelShaderConstant(index, ints, count); | 	return setPixelShaderConstant(index, ints, count); | ||||||
| } | } | ||||||
|  |  | ||||||
| bool COpenGL3MaterialRenderer::setVertexShaderConstant(s32 index, const u32* ints, int count) | bool COpenGL3MaterialRenderer::setVertexShaderConstant(s32 index, const u32* ints, int count) | ||||||
| { | { | ||||||
| 	return setPixelShaderConstant(index, ints, count); | 	return setPixelShaderConstant(index, ints, count); | ||||||
| } | } | ||||||
|  |  | ||||||
| bool COpenGL3MaterialRenderer::setPixelShaderConstant(s32 index, const f32* floats, int count) | bool COpenGL3MaterialRenderer::setPixelShaderConstant(s32 index, const f32* floats, int count) | ||||||
| { | { | ||||||
| 	if(index < 0 || UniformInfo[index].location < 0) | 	if(index < 0 || UniformInfo[index].location < 0) | ||||||
| 		return false; | 		return false; | ||||||
|  |  | ||||||
| 	bool status = true; | 	bool status = true; | ||||||
|  |  | ||||||
| 	switch (UniformInfo[index].type) | 	switch (UniformInfo[index].type) | ||||||
| 	{ | 	{ | ||||||
| 		case GL_FLOAT: | 		case GL_FLOAT: | ||||||
| 			glUniform1fv(UniformInfo[index].location, count, floats); | 			glUniform1fv(UniformInfo[index].location, count, floats); | ||||||
| 			break; | 			break; | ||||||
| 		case GL_FLOAT_VEC2: | 		case GL_FLOAT_VEC2: | ||||||
| 			glUniform2fv(UniformInfo[index].location, count/2, floats); | 			glUniform2fv(UniformInfo[index].location, count/2, floats); | ||||||
| 			break; | 			break; | ||||||
| 		case GL_FLOAT_VEC3: | 		case GL_FLOAT_VEC3: | ||||||
| 			glUniform3fv(UniformInfo[index].location, count/3, floats); | 			glUniform3fv(UniformInfo[index].location, count/3, floats); | ||||||
| 			break; | 			break; | ||||||
| 		case GL_FLOAT_VEC4: | 		case GL_FLOAT_VEC4: | ||||||
| 			glUniform4fv(UniformInfo[index].location, count/4, floats); | 			glUniform4fv(UniformInfo[index].location, count/4, floats); | ||||||
| 			break; | 			break; | ||||||
| 		case GL_FLOAT_MAT2: | 		case GL_FLOAT_MAT2: | ||||||
| 			glUniformMatrix2fv(UniformInfo[index].location, count/4, false, floats); | 			glUniformMatrix2fv(UniformInfo[index].location, count/4, false, floats); | ||||||
| 			break; | 			break; | ||||||
| 		case GL_FLOAT_MAT3: | 		case GL_FLOAT_MAT3: | ||||||
| 			glUniformMatrix3fv(UniformInfo[index].location, count/9, false, floats); | 			glUniformMatrix3fv(UniformInfo[index].location, count/9, false, floats); | ||||||
| 			break; | 			break; | ||||||
| 		case GL_FLOAT_MAT4: | 		case GL_FLOAT_MAT4: | ||||||
| 			glUniformMatrix4fv(UniformInfo[index].location, count/16, false, floats); | 			glUniformMatrix4fv(UniformInfo[index].location, count/16, false, floats); | ||||||
| 			break; | 			break; | ||||||
| 		case GL_SAMPLER_2D: | 		case GL_SAMPLER_2D: | ||||||
| 		case GL_SAMPLER_CUBE: | 		case GL_SAMPLER_CUBE: | ||||||
| 			{ | 			{ | ||||||
| 				if(floats) | 				if(floats) | ||||||
| 				{ | 				{ | ||||||
| 					const GLint id = (GLint)(*floats); | 					const GLint id = (GLint)(*floats); | ||||||
| 					glUniform1iv(UniformInfo[index].location, 1, &id); | 					glUniform1iv(UniformInfo[index].location, 1, &id); | ||||||
| 				} | 				} | ||||||
| 				else | 				else | ||||||
| 					status = false; | 					status = false; | ||||||
| 			} | 			} | ||||||
| 			break; | 			break; | ||||||
| 		default: | 		default: | ||||||
| 			status = false; | 			status = false; | ||||||
| 			break; | 			break; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return status; | 	return status; | ||||||
| } | } | ||||||
|  |  | ||||||
| bool COpenGL3MaterialRenderer::setPixelShaderConstant(s32 index, const s32* ints, int count) | bool COpenGL3MaterialRenderer::setPixelShaderConstant(s32 index, const s32* ints, int count) | ||||||
| { | { | ||||||
| 	if(index < 0 || UniformInfo[index].location < 0) | 	if(index < 0 || UniformInfo[index].location < 0) | ||||||
| 		return false; | 		return false; | ||||||
|  |  | ||||||
| 	bool status = true; | 	bool status = true; | ||||||
|  |  | ||||||
| 	switch (UniformInfo[index].type) | 	switch (UniformInfo[index].type) | ||||||
| 	{ | 	{ | ||||||
| 		case GL_INT: | 		case GL_INT: | ||||||
| 		case GL_BOOL: | 		case GL_BOOL: | ||||||
| 			glUniform1iv(UniformInfo[index].location, count, ints); | 			glUniform1iv(UniformInfo[index].location, count, ints); | ||||||
| 			break; | 			break; | ||||||
| 		case GL_INT_VEC2: | 		case GL_INT_VEC2: | ||||||
| 		case GL_BOOL_VEC2: | 		case GL_BOOL_VEC2: | ||||||
| 			glUniform2iv(UniformInfo[index].location, count/2, ints); | 			glUniform2iv(UniformInfo[index].location, count/2, ints); | ||||||
| 			break; | 			break; | ||||||
| 		case GL_INT_VEC3: | 		case GL_INT_VEC3: | ||||||
| 		case GL_BOOL_VEC3: | 		case GL_BOOL_VEC3: | ||||||
| 			glUniform3iv(UniformInfo[index].location, count/3, ints); | 			glUniform3iv(UniformInfo[index].location, count/3, ints); | ||||||
| 			break; | 			break; | ||||||
| 		case GL_INT_VEC4: | 		case GL_INT_VEC4: | ||||||
| 		case GL_BOOL_VEC4: | 		case GL_BOOL_VEC4: | ||||||
| 			glUniform4iv(UniformInfo[index].location, count/4, ints); | 			glUniform4iv(UniformInfo[index].location, count/4, ints); | ||||||
| 			break; | 			break; | ||||||
| 		case GL_SAMPLER_2D: | 		case GL_SAMPLER_2D: | ||||||
| 		case GL_SAMPLER_CUBE: | 		case GL_SAMPLER_CUBE: | ||||||
| 			glUniform1iv(UniformInfo[index].location, 1, ints); | 			glUniform1iv(UniformInfo[index].location, 1, ints); | ||||||
| 			break; | 			break; | ||||||
| 		default: | 		default: | ||||||
| 			status = false; | 			status = false; | ||||||
| 			break; | 			break; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return status; | 	return status; | ||||||
| } | } | ||||||
|  |  | ||||||
| bool COpenGL3MaterialRenderer::setPixelShaderConstant(s32 index, const u32* ints, int count) | bool COpenGL3MaterialRenderer::setPixelShaderConstant(s32 index, const u32* ints, int count) | ||||||
| { | { | ||||||
| 	os::Printer::log("Unsigned int support needs at least GLES 3.0", ELL_WARNING); | 	os::Printer::log("Unsigned int support needs at least GLES 3.0", ELL_WARNING); | ||||||
| 	return false; | 	return false; | ||||||
| } | } | ||||||
|  |  | ||||||
| IVideoDriver* COpenGL3MaterialRenderer::getVideoDriver() | IVideoDriver* COpenGL3MaterialRenderer::getVideoDriver() | ||||||
| { | { | ||||||
| 	return Driver; | 	return Driver; | ||||||
| } | } | ||||||
|  |  | ||||||
| } | } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,99 +1,99 @@ | |||||||
| // Copyright (C) 2014 Patryk Nadrowski | // Copyright (C) 2014 Patryk Nadrowski | ||||||
| // This file is part of the "Irrlicht Engine". | // This file is part of the "Irrlicht Engine". | ||||||
| // For conditions of distribution and use, see copyright notice in irrlicht.h | // For conditions of distribution and use, see copyright notice in irrlicht.h | ||||||
|  |  | ||||||
| #pragma once | #pragma once | ||||||
|  |  | ||||||
| #include "EMaterialTypes.h" | #include "EMaterialTypes.h" | ||||||
| #include "IMaterialRenderer.h" | #include "IMaterialRenderer.h" | ||||||
| #include "IMaterialRendererServices.h" | #include "IMaterialRendererServices.h" | ||||||
| #include "IGPUProgrammingServices.h" | #include "IGPUProgrammingServices.h" | ||||||
| #include "irrArray.h" | #include "irrArray.h" | ||||||
| #include "irrString.h" | #include "irrString.h" | ||||||
|  |  | ||||||
| #include "Common.h" | #include "Common.h" | ||||||
|  |  | ||||||
| namespace irr | namespace irr | ||||||
| { | { | ||||||
| namespace video | namespace video | ||||||
| { | { | ||||||
|  |  | ||||||
| class COpenGL3DriverBase; | class COpenGL3DriverBase; | ||||||
|  |  | ||||||
| class COpenGL3MaterialRenderer : public IMaterialRenderer, public IMaterialRendererServices | class COpenGL3MaterialRenderer : public IMaterialRenderer, public IMaterialRendererServices | ||||||
| { | { | ||||||
| public: | public: | ||||||
|  |  | ||||||
| 	COpenGL3MaterialRenderer( | 	COpenGL3MaterialRenderer( | ||||||
| 		COpenGL3DriverBase* driver, | 		COpenGL3DriverBase* driver, | ||||||
| 		s32& outMaterialTypeNr, | 		s32& outMaterialTypeNr, | ||||||
| 		const c8* vertexShaderProgram = 0, | 		const c8* vertexShaderProgram = 0, | ||||||
| 		const c8* pixelShaderProgram = 0, | 		const c8* pixelShaderProgram = 0, | ||||||
| 		IShaderConstantSetCallBack* callback = 0, | 		IShaderConstantSetCallBack* callback = 0, | ||||||
| 		E_MATERIAL_TYPE baseMaterial = EMT_SOLID, | 		E_MATERIAL_TYPE baseMaterial = EMT_SOLID, | ||||||
| 		s32 userData = 0); | 		s32 userData = 0); | ||||||
|  |  | ||||||
| 	virtual ~COpenGL3MaterialRenderer(); | 	virtual ~COpenGL3MaterialRenderer(); | ||||||
|  |  | ||||||
| 	GLuint getProgram() const; | 	GLuint getProgram() const; | ||||||
|  |  | ||||||
| 	virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial, | 	virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial, | ||||||
| 		bool resetAllRenderstates, IMaterialRendererServices* services); | 		bool resetAllRenderstates, IMaterialRendererServices* services); | ||||||
|  |  | ||||||
| 	virtual bool OnRender(IMaterialRendererServices* service, E_VERTEX_TYPE vtxtype); | 	virtual bool OnRender(IMaterialRendererServices* service, E_VERTEX_TYPE vtxtype); | ||||||
|  |  | ||||||
| 	virtual void OnUnsetMaterial(); | 	virtual void OnUnsetMaterial(); | ||||||
|  |  | ||||||
| 	virtual bool isTransparent() const; | 	virtual bool isTransparent() const; | ||||||
|  |  | ||||||
| 	virtual s32 getRenderCapability() const; | 	virtual s32 getRenderCapability() const; | ||||||
|  |  | ||||||
| 	void setBasicRenderStates(const SMaterial& material, const SMaterial& lastMaterial, bool resetAllRenderstates) override; | 	void setBasicRenderStates(const SMaterial& material, const SMaterial& lastMaterial, bool resetAllRenderstates) override; | ||||||
|  |  | ||||||
| 	s32 getVertexShaderConstantID(const c8* name) override; | 	s32 getVertexShaderConstantID(const c8* name) override; | ||||||
| 	s32 getPixelShaderConstantID(const c8* name) override; | 	s32 getPixelShaderConstantID(const c8* name) override; | ||||||
| 	void setVertexShaderConstant(const f32* data, s32 startRegister, s32 constantAmount=1) override; | 	void setVertexShaderConstant(const f32* data, s32 startRegister, s32 constantAmount=1) override; | ||||||
| 	void setPixelShaderConstant(const f32* data, s32 startRegister, s32 constantAmount=1) override; | 	void setPixelShaderConstant(const f32* data, s32 startRegister, s32 constantAmount=1) override; | ||||||
| 	bool setVertexShaderConstant(s32 index, const f32* floats, int count) override; | 	bool setVertexShaderConstant(s32 index, const f32* floats, int count) override; | ||||||
| 	bool setVertexShaderConstant(s32 index, const s32* ints, int count) override; | 	bool setVertexShaderConstant(s32 index, const s32* ints, int count) override; | ||||||
| 	bool setVertexShaderConstant(s32 index, const u32* ints, int count) override; | 	bool setVertexShaderConstant(s32 index, const u32* ints, int count) override; | ||||||
| 	bool setPixelShaderConstant(s32 index, const f32* floats, int count) override; | 	bool setPixelShaderConstant(s32 index, const f32* floats, int count) override; | ||||||
| 	bool setPixelShaderConstant(s32 index, const s32* ints, int count) override; | 	bool setPixelShaderConstant(s32 index, const s32* ints, int count) override; | ||||||
| 	bool setPixelShaderConstant(s32 index, const u32* ints, int count) override; | 	bool setPixelShaderConstant(s32 index, const u32* ints, int count) override; | ||||||
|  |  | ||||||
| 	IVideoDriver* getVideoDriver() override; | 	IVideoDriver* getVideoDriver() override; | ||||||
|  |  | ||||||
| protected: | protected: | ||||||
|  |  | ||||||
| 	COpenGL3MaterialRenderer(COpenGL3DriverBase* driver, | 	COpenGL3MaterialRenderer(COpenGL3DriverBase* driver, | ||||||
| 					IShaderConstantSetCallBack* callback = 0, | 					IShaderConstantSetCallBack* callback = 0, | ||||||
| 					E_MATERIAL_TYPE baseMaterial = EMT_SOLID, | 					E_MATERIAL_TYPE baseMaterial = EMT_SOLID, | ||||||
| 					s32 userData = 0); | 					s32 userData = 0); | ||||||
|  |  | ||||||
| 	void init(s32& outMaterialTypeNr, const c8* vertexShaderProgram, const c8* pixelShaderProgram, bool addMaterial = true); | 	void init(s32& outMaterialTypeNr, const c8* vertexShaderProgram, const c8* pixelShaderProgram, bool addMaterial = true); | ||||||
|  |  | ||||||
| 	bool createShader(GLenum shaderType, const char* shader); | 	bool createShader(GLenum shaderType, const char* shader); | ||||||
| 	bool linkProgram(); | 	bool linkProgram(); | ||||||
|  |  | ||||||
| 	COpenGL3DriverBase* Driver; | 	COpenGL3DriverBase* Driver; | ||||||
| 	IShaderConstantSetCallBack* CallBack; | 	IShaderConstantSetCallBack* CallBack; | ||||||
|  |  | ||||||
| 	bool Alpha; | 	bool Alpha; | ||||||
| 	bool Blending; | 	bool Blending; | ||||||
| 	bool FixedBlending; | 	bool FixedBlending; | ||||||
|  |  | ||||||
| 	struct SUniformInfo | 	struct SUniformInfo | ||||||
| 	{ | 	{ | ||||||
| 		core::stringc name; | 		core::stringc name; | ||||||
| 		GLenum type; | 		GLenum type; | ||||||
| 		GLint location; | 		GLint location; | ||||||
| 	}; | 	}; | ||||||
|  |  | ||||||
| 	GLuint Program; | 	GLuint Program; | ||||||
| 	core::array<SUniformInfo> UniformInfo; | 	core::array<SUniformInfo> UniformInfo; | ||||||
| 	s32 UserData; | 	s32 UserData; | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  |  | ||||||
| } | } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,83 +1,83 @@ | |||||||
| // Copyright (C) 2014 Patryk Nadrowski | // Copyright (C) 2014 Patryk Nadrowski | ||||||
| // This file is part of the "Irrlicht Engine". | // This file is part of the "Irrlicht Engine". | ||||||
| // For conditions of distribution and use, see copyright notice in Irrlicht.h | // For conditions of distribution and use, see copyright notice in Irrlicht.h | ||||||
|  |  | ||||||
| #include "Renderer2D.h" | #include "Renderer2D.h" | ||||||
|  |  | ||||||
| #include "IGPUProgrammingServices.h" | #include "IGPUProgrammingServices.h" | ||||||
| #include "os.h" | #include "os.h" | ||||||
|  |  | ||||||
| #include "Driver.h" | #include "Driver.h" | ||||||
|  |  | ||||||
| #include "COpenGLCoreFeature.h" | #include "COpenGLCoreFeature.h" | ||||||
| #include "COpenGLCoreTexture.h" | #include "COpenGLCoreTexture.h" | ||||||
| #include "COpenGLCoreCacheHandler.h" | #include "COpenGLCoreCacheHandler.h" | ||||||
|  |  | ||||||
| namespace irr | namespace irr | ||||||
| { | { | ||||||
| namespace video | namespace video | ||||||
| { | { | ||||||
|  |  | ||||||
| COpenGL3Renderer2D::COpenGL3Renderer2D(const c8* vertexShaderProgram, const c8* pixelShaderProgram, COpenGL3DriverBase* driver, bool withTexture) : | COpenGL3Renderer2D::COpenGL3Renderer2D(const c8* vertexShaderProgram, const c8* pixelShaderProgram, COpenGL3DriverBase* driver, bool withTexture) : | ||||||
| 	COpenGL3MaterialRenderer(driver, 0, EMT_SOLID), | 	COpenGL3MaterialRenderer(driver, 0, EMT_SOLID), | ||||||
| 	WithTexture(withTexture) | 	WithTexture(withTexture) | ||||||
| { | { | ||||||
| #ifdef _DEBUG | #ifdef _DEBUG | ||||||
| 	setDebugName("Renderer2D"); | 	setDebugName("Renderer2D"); | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| 	int Temp = 0; | 	int Temp = 0; | ||||||
|  |  | ||||||
| 	init(Temp, vertexShaderProgram, pixelShaderProgram, false); | 	init(Temp, vertexShaderProgram, pixelShaderProgram, false); | ||||||
|  |  | ||||||
| 	COpenGL3CacheHandler* cacheHandler = Driver->getCacheHandler(); | 	COpenGL3CacheHandler* cacheHandler = Driver->getCacheHandler(); | ||||||
|  |  | ||||||
| 	cacheHandler->setProgram(Program); | 	cacheHandler->setProgram(Program); | ||||||
|  |  | ||||||
| 	// These states don't change later. | 	// These states don't change later. | ||||||
|  |  | ||||||
| 	ThicknessID = getPixelShaderConstantID("uThickness"); | 	ThicknessID = getPixelShaderConstantID("uThickness"); | ||||||
| 	if ( WithTexture ) | 	if ( WithTexture ) | ||||||
| 	{ | 	{ | ||||||
| 		TextureUsageID = getPixelShaderConstantID("uTextureUsage"); | 		TextureUsageID = getPixelShaderConstantID("uTextureUsage"); | ||||||
| 		s32 TextureUnitID = getPixelShaderConstantID("uTextureUnit"); | 		s32 TextureUnitID = getPixelShaderConstantID("uTextureUnit"); | ||||||
|  |  | ||||||
| 		s32 TextureUnit = 0; | 		s32 TextureUnit = 0; | ||||||
| 		setPixelShaderConstant(TextureUnitID, &TextureUnit, 1); | 		setPixelShaderConstant(TextureUnitID, &TextureUnit, 1); | ||||||
|  |  | ||||||
| 		s32 TextureUsage = 0; | 		s32 TextureUsage = 0; | ||||||
| 		setPixelShaderConstant(TextureUsageID, &TextureUsage, 1); | 		setPixelShaderConstant(TextureUsageID, &TextureUsage, 1); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	cacheHandler->setProgram(0); | 	cacheHandler->setProgram(0); | ||||||
| } | } | ||||||
|  |  | ||||||
| COpenGL3Renderer2D::~COpenGL3Renderer2D() | COpenGL3Renderer2D::~COpenGL3Renderer2D() | ||||||
| { | { | ||||||
| } | } | ||||||
|  |  | ||||||
| void COpenGL3Renderer2D::OnSetMaterial(const video::SMaterial& material, | void COpenGL3Renderer2D::OnSetMaterial(const video::SMaterial& material, | ||||||
| 				const video::SMaterial& lastMaterial, | 				const video::SMaterial& lastMaterial, | ||||||
| 				bool resetAllRenderstates, | 				bool resetAllRenderstates, | ||||||
| 				video::IMaterialRendererServices* services) | 				video::IMaterialRendererServices* services) | ||||||
| { | { | ||||||
| 	Driver->getCacheHandler()->setProgram(Program); | 	Driver->getCacheHandler()->setProgram(Program); | ||||||
| 	Driver->setBasicRenderStates(material, lastMaterial, resetAllRenderstates); | 	Driver->setBasicRenderStates(material, lastMaterial, resetAllRenderstates); | ||||||
|  |  | ||||||
| 	f32 Thickness = (material.Thickness > 0.f) ? material.Thickness : 1.f; | 	f32 Thickness = (material.Thickness > 0.f) ? material.Thickness : 1.f; | ||||||
| 	setPixelShaderConstant(ThicknessID, &Thickness, 1); | 	setPixelShaderConstant(ThicknessID, &Thickness, 1); | ||||||
|  |  | ||||||
| 	if ( WithTexture ) | 	if ( WithTexture ) | ||||||
| 	{ | 	{ | ||||||
| 		s32 TextureUsage = material.TextureLayer[0].Texture ? 1 : 0; | 		s32 TextureUsage = material.TextureLayer[0].Texture ? 1 : 0; | ||||||
| 		setPixelShaderConstant(TextureUsageID, &TextureUsage, 1); | 		setPixelShaderConstant(TextureUsageID, &TextureUsage, 1); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| bool COpenGL3Renderer2D::OnRender(IMaterialRendererServices* service, E_VERTEX_TYPE vtxtype) | bool COpenGL3Renderer2D::OnRender(IMaterialRendererServices* service, E_VERTEX_TYPE vtxtype) | ||||||
| { | { | ||||||
| 	return true; | 	return true; | ||||||
| } | } | ||||||
|  |  | ||||||
| } | } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,33 +1,33 @@ | |||||||
| // Copyright (C) 2014 Patryk Nadrowski | // Copyright (C) 2014 Patryk Nadrowski | ||||||
| // This file is part of the "Irrlicht Engine". | // This file is part of the "Irrlicht Engine". | ||||||
| // For conditions of distribution and use, see copyright notice in Irrlicht.h | // For conditions of distribution and use, see copyright notice in Irrlicht.h | ||||||
|  |  | ||||||
| #pragma once | #pragma once | ||||||
|  |  | ||||||
| #include "MaterialRenderer.h" | #include "MaterialRenderer.h" | ||||||
|  |  | ||||||
| namespace irr | namespace irr | ||||||
| { | { | ||||||
| namespace video | namespace video | ||||||
| { | { | ||||||
|  |  | ||||||
| class COpenGL3Renderer2D : public COpenGL3MaterialRenderer | class COpenGL3Renderer2D : public COpenGL3MaterialRenderer | ||||||
| { | { | ||||||
| public: | public: | ||||||
| 	COpenGL3Renderer2D(const c8* vertexShaderProgram, const c8* pixelShaderProgram, COpenGL3DriverBase* driver, bool withTexture); | 	COpenGL3Renderer2D(const c8* vertexShaderProgram, const c8* pixelShaderProgram, COpenGL3DriverBase* driver, bool withTexture); | ||||||
| 	~COpenGL3Renderer2D(); | 	~COpenGL3Renderer2D(); | ||||||
|  |  | ||||||
| 	virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial, | 	virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial, | ||||||
| 		bool resetAllRenderstates, IMaterialRendererServices* services); | 		bool resetAllRenderstates, IMaterialRendererServices* services); | ||||||
|  |  | ||||||
| 	virtual bool OnRender(IMaterialRendererServices* service, E_VERTEX_TYPE vtxtype); | 	virtual bool OnRender(IMaterialRendererServices* service, E_VERTEX_TYPE vtxtype); | ||||||
|  |  | ||||||
| protected: | protected: | ||||||
| 	bool WithTexture; | 	bool WithTexture; | ||||||
| 	s32 ThicknessID; | 	s32 ThicknessID; | ||||||
| 	s32 TextureUsageID; | 	s32 TextureUsageID; | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  |  | ||||||
| } | } | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user