Merge branch 'master' into feat/gltf-loader
This commit is contained in:
		| @@ -75,18 +75,18 @@ namespace scene | ||||
| 		CVertexBuffer(video::E_VERTEX_TYPE vertexType) : Vertices(0), | ||||
| 				MappingHint(EHM_NEVER), ChangedID(1) | ||||
| 		{ | ||||
| 			setType(vertexType); | ||||
| 			CVertexBuffer::setType(vertexType); | ||||
| 		} | ||||
|  | ||||
| 		CVertexBuffer(const IVertexBuffer &VertexBufferCopy) : | ||||
| 				Vertices(0), MappingHint(EHM_NEVER), | ||||
| 				ChangedID(1) | ||||
| 		{ | ||||
| 			setType(VertexBufferCopy.getType()); | ||||
| 			reallocate(VertexBufferCopy.size()); | ||||
| 			CVertexBuffer::setType(VertexBufferCopy.getType()); | ||||
| 			CVertexBuffer::reallocate(VertexBufferCopy.size()); | ||||
|  | ||||
| 			for (u32 n=0;n<VertexBufferCopy.size();++n) | ||||
| 				push_back(VertexBufferCopy[n]); | ||||
| 				CVertexBuffer::push_back(VertexBufferCopy[n]); | ||||
| 		} | ||||
|  | ||||
| 		virtual ~CVertexBuffer() | ||||
| @@ -97,6 +97,9 @@ namespace scene | ||||
|  | ||||
| 		void setType(video::E_VERTEX_TYPE vertexType) override | ||||
| 		{ | ||||
| 			if ( Vertices && Vertices->getType() == vertexType ) | ||||
| 				return; | ||||
|  | ||||
| 			IVertexList *NewVertices=0; | ||||
|  | ||||
| 			switch (vertexType) | ||||
|   | ||||
| @@ -24,14 +24,10 @@ namespace irr | ||||
| 		//! A device native to Mac OSX | ||||
| 		/** This device uses Apple's Cocoa API and works in Mac OSX 10.2 and above. */ | ||||
| 		EIDT_OSX, | ||||
|          | ||||
|         //! A device native to the iOS | ||||
| 		/** This device should be used with the OpenGL-ES driver. */ | ||||
| 		EIDT_IOS, | ||||
|  | ||||
| 		//! A device which uses Simple DirectMedia Layer | ||||
| 		/** The SDL device works under all platforms supported by SDL but first must be compiled | ||||
| 		in by defining the _IRR_COMPILE_WITH_SDL_DEVICE_ macro in IrrCompileConfig.h */ | ||||
| 		in by setting the USE_SDL2 CMake option to ON */ | ||||
| 		EIDT_SDL, | ||||
|  | ||||
| 		//! This selection allows Irrlicht to choose the best device from the ones available. | ||||
|   | ||||
| @@ -20,31 +20,11 @@ namespace video | ||||
| 		render and display any graphics. */ | ||||
| 		EDT_NULL, | ||||
|  | ||||
| 		//! The Irrlicht Engine Software renderer. | ||||
| 		/** Runs on all platforms, with every hardware. It should only | ||||
| 		be used for 2d graphics, but it can also perform some primitive | ||||
| 		3d functions. These 3d drawing functions are quite fast, but | ||||
| 		very inaccurate, and don't even support clipping in 3D mode. */ | ||||
| 		// obsolete constants to make some code happy | ||||
| 		// TODO delete | ||||
| 		EDT_SOFTWARE, | ||||
|  | ||||
| 		//! The Burning's Software Renderer, an alternative software renderer | ||||
| 		/** Basically it can be described as the Irrlicht Software | ||||
| 		renderer on steroids. It rasterizes 3D geometry perfectly: It | ||||
| 		is able to perform correct 3d clipping, perspective correct | ||||
| 		texture mapping, perspective correct color mapping, and renders | ||||
| 		sub pixel correct, sub texel correct primitives. In addition, | ||||
| 		it does bilinear texel filtering and supports more materials | ||||
| 		than the EDT_SOFTWARE driver. This renderer has been written | ||||
| 		entirely by Thomas Alten, thanks a lot for this huge | ||||
| 		contribution. */ | ||||
| 		EDT_BURNINGSVIDEO, | ||||
|  | ||||
| 		//! Direct3D8 device is longer supported in Irrlicht. You have to go back to Irrlicht 1.8 if you still need that. | ||||
| 		DEPRECATED_EDT_DIRECT3D8_NO_LONGER_EXISTS, // keep enum to avoid breaking enumeration order (might be used in ini-files, serialization, etc) | ||||
|  | ||||
| 		//! Direct3D 9 device, only available on Win32 platforms. | ||||
| 		/** Performs hardware accelerated rendering of 3D and 2D | ||||
| 		primitives. */ | ||||
| 		DEPRECATED_EDT_DIRECT3D8_NO_LONGER_EXISTS, | ||||
| 		EDT_DIRECT3D9, | ||||
|  | ||||
| 		//! OpenGL device, available on most platforms. | ||||
| @@ -52,7 +32,7 @@ namespace video | ||||
| 		primitives. */ | ||||
| 		EDT_OPENGL, | ||||
|  | ||||
|         //! OpenGL-ES 1.x driver, for embedded and mobile systems | ||||
| 		//! OpenGL-ES 1.x driver, for embedded and mobile systems | ||||
| 		EDT_OGLES1, | ||||
|  | ||||
| 		//! OpenGL-ES 2.x driver, for embedded and mobile systems | ||||
| @@ -62,38 +42,12 @@ namespace video | ||||
| 		//! WebGL1 friendly subset of OpenGL-ES 2.x driver for Emscripten | ||||
| 		EDT_WEBGL1, | ||||
|  | ||||
| 		EDT_OPENGL3, | ||||
|  | ||||
| 		//! No driver, just for counting the elements | ||||
| 		EDT_COUNT | ||||
| 	}; | ||||
|  | ||||
| 	const c8* const DRIVER_TYPE_NAMES[] = | ||||
| 	{ | ||||
| 		"NullDriver", | ||||
| 		"Software Renderer", | ||||
| 		"Burning's Video", | ||||
| 		"Direct3D 8.1", | ||||
| 		"Direct3D 9.0c", | ||||
| 		"OpenGL 1.x/2.x/3.x", | ||||
| 		"OpenGL ES1", | ||||
| 		"OpenGL ES2", | ||||
| 		"WebGL 1", | ||||
| 		0 | ||||
| 	}; | ||||
|  | ||||
| 	const c8* const DRIVER_TYPE_NAMES_SHORT[] = | ||||
| 	{ | ||||
| 		"null", | ||||
| 		"software", | ||||
| 		"burning", | ||||
| 		"d3d8", | ||||
| 		"d3d9", | ||||
| 		"opengl", | ||||
| 		"ogles1", | ||||
| 		"ogles2", | ||||
| 		"webgl1", | ||||
| 		0 | ||||
| 	}; | ||||
|  | ||||
| } // end namespace video | ||||
| } // end namespace irr | ||||
|  | ||||
|   | ||||
| @@ -452,10 +452,10 @@ struct SEvent | ||||
| 	/** Unlike other events, joystick events represent the result of polling | ||||
| 	 * each connected joystick once per run() of the device. Joystick events will | ||||
| 	 * not be generated by default.  If joystick support is available for the | ||||
| 	 * active device, _IRR_COMPILE_WITH_JOYSTICK_EVENTS_ is defined, and | ||||
| 	 * @ref irr::IrrlichtDevice::activateJoysticks() has been called, an event of | ||||
| 	 * this type will be generated once per joystick per @ref IrrlichtDevice::run() | ||||
| 	 * regardless of whether the state of the joystick has actually changed. */ | ||||
| 	 * active device, and @ref irr::IrrlichtDevice::activateJoysticks() has been | ||||
| 	 * called, an event of this type will be generated once per joystick per | ||||
| 	 * @ref IrrlichtDevice::run() regardless of whether the state of the joystick | ||||
| 	 * has actually changed. */ | ||||
| 	struct SJoystickEvent | ||||
| 	{ | ||||
| 		enum | ||||
|   | ||||
| @@ -54,9 +54,9 @@ namespace gui | ||||
|  | ||||
| 		//! Sets text justification of the text area | ||||
| 		/** \param horizontal: EGUIA_UPPERLEFT for left justified (default), | ||||
| 		EGUIA_LOWEERRIGHT for right justified, or EGUIA_CENTER for centered text. | ||||
| 		EGUIA_LOWERRIGHT for right justified, or EGUIA_CENTER for centered text. | ||||
| 		\param vertical: EGUIA_UPPERLEFT to align with top edge, | ||||
| 		EGUIA_LOWEERRIGHT for bottom edge, or EGUIA_CENTER for centered text (default). */ | ||||
| 		EGUIA_LOWERRIGHT for bottom edge, or EGUIA_CENTER for centered text (default). */ | ||||
| 		virtual void setTextAlignment(EGUI_ALIGNMENT horizontal, EGUI_ALIGNMENT vertical) = 0; | ||||
|  | ||||
| 		//! Set the maximal number of rows for the selection listbox | ||||
|   | ||||
| @@ -433,7 +433,7 @@ public: | ||||
| 			if (el) | ||||
| 			{ | ||||
| 				// find the highest element number | ||||
| 				el->getNextElement(-1, true, IsTabGroup, first, closest, true); | ||||
| 				el->getNextElement(-1, true, IsTabGroup, first, closest, true, true); | ||||
| 				if (first) | ||||
| 				{ | ||||
| 					TabOrder = first->getTabOrder() + 1; | ||||
| @@ -706,7 +706,7 @@ public: | ||||
| 					} | ||||
| 				} | ||||
| 				// search within children | ||||
| 				if ((*it)->getNextElement(startOrder, reverse, group, first, closest)) | ||||
| 				if ((*it)->getNextElement(startOrder, reverse, group, first, closest, includeInvisible, includeDisabled)) | ||||
| 				{ | ||||
| 					return true; | ||||
| 				} | ||||
|   | ||||
| @@ -88,9 +88,9 @@ namespace gui | ||||
|  | ||||
| 		//! Sets text justification mode | ||||
| 		/** \param horizontal: EGUIA_UPPERLEFT for left justified (default), | ||||
| 		EGUIA_LOWEERRIGHT for right justified, or EGUIA_CENTER for centered text. | ||||
| 		EGUIA_LOWERRIGHT for right justified, or EGUIA_CENTER for centered text. | ||||
| 		\param vertical: EGUIA_UPPERLEFT to align with top edge (default), | ||||
| 		EGUIA_LOWEERRIGHT for bottom edge, or EGUIA_CENTER for centered text. */ | ||||
| 		EGUIA_LOWERRIGHT for bottom edge, or EGUIA_CENTER for centered text. */ | ||||
| 		virtual void setTextAlignment(EGUI_ALIGNMENT horizontal, EGUI_ALIGNMENT vertical) = 0; | ||||
|  | ||||
| 		//! Enables or disables word wrap for using the static text as multiline text control. | ||||
|   | ||||
| @@ -329,6 +329,12 @@ public: | ||||
| 	//! Sets a pixel | ||||
| 	virtual void setPixel(u32 x, u32 y, const SColor &color, bool blend = false ) = 0; | ||||
|  | ||||
| 	//! Copies this surface into another, if it has the exact same size and format. | ||||
| 	/**	NOTE: mipmaps are ignored | ||||
| 	\return True if it was copied, false otherwise. | ||||
| 	*/ | ||||
| 	virtual bool copyToNoScaling(void *target, u32 width, u32 height, ECOLOR_FORMAT format=ECF_A8R8G8B8, u32 pitch=0) const = 0; | ||||
|  | ||||
| 	//! Copies the image into the target, scaling the image to fit | ||||
| 	/**	NOTE: mipmaps are ignored */ | ||||
| 	virtual void copyToScaling(void* target, u32 width, u32 height, ECOLOR_FORMAT format=ECF_A8R8G8B8, u32 pitch=0) =0; | ||||
|   | ||||
| @@ -45,17 +45,6 @@ public: | ||||
| 	/** \param file File handle to check. | ||||
| 	\return Pointer to newly created image, or 0 upon error. */ | ||||
| 	virtual IImage* loadImage(io::IReadFile* file) const = 0; | ||||
|  | ||||
| 	//! Creates a multiple surfaces from the file eg. whole cube map. | ||||
| 	/** \param file File handle to check. | ||||
| 	\param type Pointer to E_TEXTURE_TYPE where a recommended type of the texture will be stored. | ||||
| 	\return Array of pointers to newly created images. */ | ||||
| 	virtual core::array<IImage*> loadImages(io::IReadFile* file, E_TEXTURE_TYPE* type) const | ||||
| 	{ | ||||
| 		core::array<IImage*> image; | ||||
|  | ||||
| 		return image; | ||||
| 	} | ||||
| }; | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -26,12 +26,23 @@ public: | ||||
| 	} | ||||
|  | ||||
| 	//! Copies text to the clipboard | ||||
| 	//! \param text: text in utf-8 | ||||
| 	virtual void copyToClipboard(const c8* text) const = 0; | ||||
|  | ||||
| 	//! Copies text to the primary selection | ||||
| 	//! This is a no-op on some platforms. | ||||
| 	//! \param text: text in utf-8 | ||||
| 	virtual void copyToPrimarySelection(const c8* text) const = 0; | ||||
|  | ||||
| 	//! Get text from the clipboard | ||||
| 	/** \return Returns 0 if no string is in there. */ | ||||
| 	//! \return Returns 0 if no string is in there, otherwise an utf-8 string. | ||||
| 	virtual const c8* getTextFromClipboard() const = 0; | ||||
|  | ||||
| 	//! Get text from the primary selection | ||||
| 	//! This is a no-op on some platforms. | ||||
| 	//! \return Returns 0 if no string is in there, otherwise an utf-8 string. | ||||
| 	virtual const c8* getTextFromPrimarySelection() const = 0; | ||||
|  | ||||
| 	//! Get the total and available system RAM | ||||
| 	/** \param totalBytes: will contain the total system memory in Kilobytes (1024 B) | ||||
| 	\param availableBytes: will contain the available memory in Kilobytes (1024 B) | ||||
|   | ||||
| @@ -318,20 +318,10 @@ namespace scene | ||||
| 		 * \endcode | ||||
| 		 * If you would like to implement and add your own file format loader to Irrlicht, | ||||
| 		 * see addExternalMeshLoader(). | ||||
| 		 * \param filename: Filename of the mesh to load. | ||||
| 		 * \param alternativeCacheName: In case you want to have the mesh under another name in the cache (to create real copies) | ||||
| 		 * \param file File handle of the mesh to load. | ||||
| 		 * \return Null if failed, otherwise pointer to the mesh. | ||||
| 		 * This pointer should not be dropped. See IReferenceCounted::drop() for more information. | ||||
| 		 **/ | ||||
| 		virtual IAnimatedMesh* getMesh(const io::path& filename, const io::path& alternativeCacheName=io::path("")) = 0; | ||||
|  | ||||
| 		//! Get pointer to an animateable mesh. Loads the file if not loaded already. | ||||
| 		/** Works just as getMesh(const char* filename). If you want to | ||||
| 		remove a loaded mesh from the cache again, use removeMesh(). | ||||
| 		\param file File handle of the mesh to load. | ||||
| 		\return NULL if failed and pointer to the mesh if successful. | ||||
| 		This pointer should not be dropped. See | ||||
| 		IReferenceCounted::drop() for more information. */ | ||||
| 		virtual IAnimatedMesh* getMesh(io::IReadFile* file) = 0; | ||||
|  | ||||
| 		//! Get interface to the mesh cache which is shared between all existing scene managers. | ||||
| @@ -345,16 +335,6 @@ namespace scene | ||||
| 		This pointer should not be dropped. See IReferenceCounted::drop() for more information. */ | ||||
| 		virtual video::IVideoDriver* getVideoDriver() = 0; | ||||
|  | ||||
| 		//! Get the active GUIEnvironment | ||||
| 		/** \return Pointer to the GUIEnvironment | ||||
| 		This pointer should not be dropped. See IReferenceCounted::drop() for more information. */ | ||||
| 		virtual gui::IGUIEnvironment* getGUIEnvironment() = 0; | ||||
|  | ||||
| 		//! Get the active FileSystem | ||||
| 		/** \return Pointer to the FileSystem | ||||
| 		This pointer should not be dropped. See IReferenceCounted::drop() for more information. */ | ||||
| 		virtual io::IFileSystem* getFileSystem() = 0; | ||||
|  | ||||
| 		//! Adds a scene node for rendering an animated mesh model. | ||||
| 		/** \param mesh: Pointer to the loaded animated mesh to be displayed. | ||||
| 		\param parent: Parent of the scene node. Can be NULL if no parent. | ||||
|   | ||||
| @@ -56,32 +56,11 @@ namespace video | ||||
| 		ETS_WORLD, | ||||
| 		//! Projection transformation | ||||
| 		ETS_PROJECTION, | ||||
| 		//! Texture transformation | ||||
| 		//! Texture 0 transformation | ||||
| 		//! Use E_TRANSFORMATION_STATE(ETS_TEXTURE_0 + texture_number) to access other texture transformations | ||||
| 		ETS_TEXTURE_0, | ||||
| 		//! Texture transformation | ||||
| 		ETS_TEXTURE_1, | ||||
| 		//! Texture transformation | ||||
| 		ETS_TEXTURE_2, | ||||
| 		//! Texture transformation | ||||
| 		ETS_TEXTURE_3, | ||||
| #if _IRR_MATERIAL_MAX_TEXTURES_>4 | ||||
| 		//! Texture transformation | ||||
| 		ETS_TEXTURE_4, | ||||
| #if _IRR_MATERIAL_MAX_TEXTURES_>5 | ||||
| 		//! Texture transformation | ||||
| 		ETS_TEXTURE_5, | ||||
| #if _IRR_MATERIAL_MAX_TEXTURES_>6 | ||||
| 		//! Texture transformation | ||||
| 		ETS_TEXTURE_6, | ||||
| #if _IRR_MATERIAL_MAX_TEXTURES_>7 | ||||
| 		//! Texture transformation | ||||
| 		ETS_TEXTURE_7, | ||||
| #endif | ||||
| #endif | ||||
| #endif | ||||
| #endif | ||||
| 		//! Only used internally | ||||
| 		ETS_COUNT = ETS_TEXTURE_0 + _IRR_MATERIAL_MAX_TEXTURES_ | ||||
| 		ETS_COUNT = ETS_TEXTURE_0 + MATERIAL_MAX_TEXTURES | ||||
| 	}; | ||||
|  | ||||
| 	//! Special render targets, which usually map to dedicated hardware | ||||
| @@ -738,23 +717,6 @@ namespace video | ||||
| 		virtual void draw3DLine(const core::vector3df& start, | ||||
| 			const core::vector3df& end, SColor color = SColor(255,255,255,255)) =0; | ||||
|  | ||||
| 		//! Draws a 3d triangle. | ||||
| 		/** This method calls drawVertexPrimitiveList for some triangles. | ||||
| 		This method works with all drivers because it simply calls | ||||
| 		drawVertexPrimitiveList, but it is hence not very fast. | ||||
| 		Note that the triangle is drawn using the current | ||||
| 		transformation matrix and material. So if you need to draw it | ||||
| 		independently of the current transformation, use | ||||
| 		\code | ||||
| 		driver->setMaterial(someMaterial); | ||||
| 		driver->setTransform(video::ETS_WORLD, core::IdentityMatrix); | ||||
| 		\endcode | ||||
| 		for some properly set up material before drawing the triangle. | ||||
| 		\param triangle The triangle to draw. | ||||
| 		\param color Color of the line. */ | ||||
| 		virtual void draw3DTriangle(const core::triangle3df& triangle, | ||||
| 			SColor color = SColor(255,255,255,255)) =0; | ||||
|  | ||||
| 		//! Draws a 3d axis aligned box. | ||||
| 		/** This method simply calls draw3DLine for the edges of the | ||||
| 		box. Note that the box is drawn using the current transformation | ||||
| @@ -785,7 +747,7 @@ namespace video | ||||
| 		\param texture Texture to be drawn. | ||||
| 		\param destPos Upper left 2d destination position where the | ||||
| 		image will be drawn. | ||||
| 		\param sourceRect Source rectangle in the image. | ||||
| 		\param sourceRect Source rectangle in the texture (based on it's OriginalSize) | ||||
| 		\param clipRect Pointer to rectangle on the screen where the | ||||
| 		image is clipped to. | ||||
| 		If this pointer is NULL the image is not clipped. | ||||
| @@ -799,35 +761,6 @@ namespace video | ||||
| 			const core::rect<s32>& sourceRect, const core::rect<s32>* clipRect =0, | ||||
| 			SColor color=SColor(255,255,255,255), bool useAlphaChannelOfTexture=false) =0; | ||||
|  | ||||
| 		//! Draws a set of 2d images, using a color and the alpha channel of the texture. | ||||
| 		/** The images are drawn beginning at pos and concatenated in | ||||
| 		one line. All drawings are clipped against clipRect (if != 0). | ||||
| 		The subtextures are defined by the array of sourceRects and are | ||||
| 		chosen by the indices given. | ||||
| 		\param texture Texture to be drawn. | ||||
| 		\param pos Upper left 2d destination position where the image | ||||
| 		will be drawn. | ||||
| 		\param sourceRects Source rectangles of the image. | ||||
| 		\param indices List of indices which choose the actual | ||||
| 		rectangle used each time. | ||||
| 		\param kerningWidth Offset to Position on X | ||||
| 		\param clipRect Pointer to rectangle on the screen where the | ||||
| 		image is clipped to. | ||||
| 		If this pointer is 0 then the image is not clipped. | ||||
| 		\param color Color with which the image is drawn. | ||||
| 		Note that the alpha component is used. If alpha is other than | ||||
| 		255, the image will be transparent. | ||||
| 		\param useAlphaChannelOfTexture: If true, the alpha channel of | ||||
| 		the texture is used to draw the image. */ | ||||
| 		virtual void draw2DImageBatch(const video::ITexture* texture, | ||||
| 				const core::position2d<s32>& pos, | ||||
| 				const core::array<core::rect<s32> >& sourceRects, | ||||
| 				const core::array<s32>& indices, | ||||
| 				s32 kerningWidth=0, | ||||
| 				const core::rect<s32>* clipRect=0, | ||||
| 				SColor color=SColor(255,255,255,255), | ||||
| 				bool useAlphaChannelOfTexture=false) =0; | ||||
|  | ||||
| 		//! Draws a set of 2d images, using a color and the alpha channel of the texture. | ||||
| 		/** All drawings are clipped against clipRect (if != 0). | ||||
| 		The subtextures are defined by the array of sourceRects and are | ||||
| @@ -835,7 +768,7 @@ namespace video | ||||
| 		\param texture Texture to be drawn. | ||||
| 		\param positions Array of upper left 2d destinations where the | ||||
| 		images will be drawn. | ||||
| 		\param sourceRects Source rectangles of the image. | ||||
| 		\param sourceRects Source rectangles of the texture (based on it's OriginalSize) | ||||
| 		\param clipRect Pointer to rectangle on the screen where the | ||||
| 		images are clipped to. | ||||
| 		If this pointer is 0 then the image is not clipped. | ||||
| @@ -855,7 +788,7 @@ namespace video | ||||
| 		/** Suggested and first implemented by zola. | ||||
| 		\param texture The texture to draw from | ||||
| 		\param destRect The rectangle to draw into | ||||
| 		\param sourceRect The rectangle denoting a part of the texture | ||||
| 		\param sourceRect The rectangle denoting a part of the texture (based on it's OriginalSize) | ||||
| 		\param clipRect Clips the destination rectangle (may be 0) | ||||
| 		\param colors Array of 4 colors denoting the color values of | ||||
| 		the corners of the destRect | ||||
| @@ -898,13 +831,6 @@ namespace video | ||||
| 				SColor colorLeftDown, SColor colorRightDown, | ||||
| 				const core::rect<s32>* clip =0) =0; | ||||
|  | ||||
| 		//! Draws the outline of a 2D rectangle. | ||||
| 		/** \param pos Position of the rectangle. | ||||
| 		\param color Color of the rectangle to draw. The alpha component | ||||
| 		specifies how transparent the rectangle outline will be. */ | ||||
| 		virtual void draw2DRectangleOutline(const core::recti& pos, | ||||
| 				SColor color=SColor(255,255,255,255)) =0; | ||||
|  | ||||
| 		//! Draws a 2d line. | ||||
| 		/** In theory both start and end will be included in coloring. | ||||
| 		BUG: Currently d3d ignores the last pixel | ||||
| @@ -918,72 +844,6 @@ namespace video | ||||
| 					const core::position2d<s32>& end, | ||||
| 					SColor color=SColor(255,255,255,255)) =0; | ||||
|  | ||||
| 		//! Draws a pixel. | ||||
| 		/** \param x The x-position of the pixel. | ||||
| 		\param y The y-position of the pixel. | ||||
| 		\param color Color of the pixel to draw. */ | ||||
| 		virtual void drawPixel(u32 x, u32 y, const SColor& color) =0; | ||||
|  | ||||
| 		//! Draws a non filled concyclic regular 2d polygon. | ||||
| 		/** This method can be used to draw circles, but also | ||||
| 		triangles, tetragons, pentagons, hexagons, heptagons, octagons, | ||||
| 		enneagons, decagons, hendecagons, dodecagon, triskaidecagons, | ||||
| 		etc. I think you'll got it now. And all this by simply | ||||
| 		specifying the vertex count. Welcome to the wonders of | ||||
| 		geometry. | ||||
| 		\param center Position of center of circle (pixels). | ||||
| 		\param radius Radius of circle in pixels. | ||||
| 		\param color Color of the circle. | ||||
| 		\param vertexCount Amount of vertices of the polygon. Specify 2 | ||||
| 		to draw a line, 3 to draw a triangle, 4 for tetragons and a lot | ||||
| 		(>10) for nearly a circle. */ | ||||
| 		virtual void draw2DPolygon(core::position2d<s32> center, | ||||
| 				f32 radius, | ||||
| 				video::SColor color=SColor(100,255,255,255), | ||||
| 				s32 vertexCount=10) =0; | ||||
|  | ||||
| 		//! Draws a shadow volume into the stencil buffer. | ||||
| 		/** To draw a stencil shadow, do this: First, draw all geometry. | ||||
| 		Then use this method, to draw the shadow volume. Then, use | ||||
| 		IVideoDriver::drawStencilShadow() to visualize the shadow. | ||||
| 		Please note that the code for the opengl version of the method | ||||
| 		is based on free code sent in by Philipp Dortmann, lots of | ||||
| 		thanks go to him! | ||||
| 		\param triangles Array of 3d vectors, specifying the shadow | ||||
| 		volume. | ||||
| 		\param zfail If set to true, zfail method is used, otherwise | ||||
| 		zpass. | ||||
| 		\param debugDataVisible The debug data that is enabled for this | ||||
| 		shadow node | ||||
| 		*/ | ||||
| 		virtual void drawStencilShadowVolume(const core::array<core::vector3df>& triangles, bool zfail=true, u32 debugDataVisible=0) =0; | ||||
|  | ||||
| 		//! Fills the stencil shadow with color. | ||||
| 		/** After the shadow volume has been drawn into the stencil | ||||
| 		buffer using IVideoDriver::drawStencilShadowVolume(), use this | ||||
| 		to draw the color of the shadow. | ||||
| 		Please note that the code for the opengl version of the method | ||||
| 		is based on free code sent in by Philipp Dortmann, lots of | ||||
| 		thanks go to him! | ||||
| 		\param clearStencilBuffer Set this to false, if you want to | ||||
| 		draw every shadow with the same color, and only want to call | ||||
| 		drawStencilShadow() once after all shadow volumes have been | ||||
| 		drawn. Set this to true, if you want to paint every shadow with | ||||
| 		its own color. | ||||
| 		\param leftUpEdge Color of the shadow in the upper left corner | ||||
| 		of screen. | ||||
| 		\param rightUpEdge Color of the shadow in the upper right | ||||
| 		corner of screen. | ||||
| 		\param leftDownEdge Color of the shadow in the lower left | ||||
| 		corner of screen. | ||||
| 		\param rightDownEdge Color of the shadow in the lower right | ||||
| 		corner of screen. */ | ||||
| 		virtual void drawStencilShadow(bool clearStencilBuffer=false, | ||||
| 			video::SColor leftUpEdge = video::SColor(255,0,0,0), | ||||
| 			video::SColor rightUpEdge = video::SColor(255,0,0,0), | ||||
| 			video::SColor leftDownEdge = video::SColor(255,0,0,0), | ||||
| 			video::SColor rightDownEdge = video::SColor(255,0,0,0)) =0; | ||||
|  | ||||
| 		//! Draws a mesh buffer | ||||
| 		/** \param mb Buffer to draw */ | ||||
| 		virtual void drawMeshBuffer(const scene::IMeshBuffer* mb) =0; | ||||
| @@ -1099,28 +959,6 @@ namespace video | ||||
| 		\return The current texture creation flag enabled mode. */ | ||||
| 		virtual bool getTextureCreationFlag(E_TEXTURE_CREATION_FLAG flag) const =0; | ||||
|  | ||||
| 		//! Creates a software images from a file. | ||||
| 		/** No hardware texture will be created for those images. This | ||||
| 		method is useful for example if you want to read a heightmap | ||||
| 		for a terrain renderer. | ||||
| 		\param filename Name of the file from which the images are created. | ||||
| 		\param type Pointer to E_TEXTURE_TYPE where a recommended type of the texture will be stored. | ||||
| 		\return The array of created images. | ||||
| 		If you no longer need those images, you should call IImage::drop() on each of them. | ||||
| 		See IReferenceCounted::drop() for more information. */ | ||||
| 		virtual core::array<IImage*> createImagesFromFile(const io::path& filename, E_TEXTURE_TYPE* type = 0) = 0; | ||||
|  | ||||
| 		//! Creates a software images from a file. | ||||
| 		/** No hardware texture will be created for those images. This | ||||
| 		method is useful for example if you want to read a heightmap | ||||
| 		for a terrain renderer. | ||||
| 		\param file File from which the image is created. | ||||
| 		\param type Pointer to E_TEXTURE_TYPE where a recommended type of the texture will be stored. | ||||
| 		\return The array of created images. | ||||
| 		If you no longer need those images, you should call IImage::drop() on each of them. | ||||
| 		See IReferenceCounted::drop() for more information. */ | ||||
| 		virtual core::array<IImage*> createImagesFromFile(io::IReadFile* file, E_TEXTURE_TYPE* type = 0) = 0; | ||||
|  | ||||
| 		//! Creates a software image from a file. | ||||
| 		/** No hardware texture will be created for this image. This | ||||
| 		method is useful for example if you want to read a heightmap | ||||
| @@ -1130,15 +968,7 @@ namespace video | ||||
| 		\return The created image. | ||||
| 		If you no longer need the image, you should call IImage::drop(). | ||||
| 		See IReferenceCounted::drop() for more information. */ | ||||
| 		IImage* createImageFromFile(const io::path& filename) | ||||
| 		{ | ||||
| 			core::array<IImage*> imageArray = createImagesFromFile(filename); | ||||
|  | ||||
| 			for (u32 i = 1; i < imageArray.size(); ++i) | ||||
| 				imageArray[i]->drop(); | ||||
|  | ||||
| 			return (imageArray.size() > 0) ? imageArray[0] : 0; | ||||
| 		} | ||||
| 		virtual IImage* createImageFromFile(const io::path& filename) = 0; | ||||
|  | ||||
| 		//! Creates a software image from a file. | ||||
| 		/** No hardware texture will be created for this image. This | ||||
| @@ -1148,15 +978,7 @@ namespace video | ||||
| 		\return The created image. | ||||
| 		If you no longer need the image, you should call IImage::drop(). | ||||
| 		See IReferenceCounted::drop() for more information. */ | ||||
| 		IImage* createImageFromFile(io::IReadFile* file) | ||||
| 		{ | ||||
| 			core::array<IImage*> imageArray = createImagesFromFile(file); | ||||
|  | ||||
| 			for (u32 i = 1; i < imageArray.size(); ++i) | ||||
| 				imageArray[i]->drop(); | ||||
|  | ||||
| 			return (imageArray.size() > 0) ? imageArray[0] : 0; | ||||
| 		} | ||||
| 		virtual IImage* createImageFromFile(io::IReadFile* file) = 0; | ||||
|  | ||||
| 		//! Writes the provided image to a file. | ||||
| 		/** Requires that there is a suitable image writer registered | ||||
| @@ -1300,7 +1122,7 @@ namespace video | ||||
| 		E_MATERIAL_TYPE enum or a value which was returned by | ||||
| 		addMaterialRenderer(). | ||||
| 		\param name: New name of the material renderer. */ | ||||
| 		virtual void setMaterialRendererName(s32 idx, const c8* name) =0; | ||||
| 		virtual void setMaterialRendererName(u32 idx, const c8* name) =0; | ||||
|  | ||||
| 		//! Swap the material renderers used for certain id's | ||||
| 		/** Swap the IMaterialRenderers responsible for rendering specific | ||||
|   | ||||
| @@ -6,8 +6,8 @@ | ||||
| #define __IRR_COMPILE_CONFIG_H_INCLUDED__ | ||||
|  | ||||
| //! Identifies the IrrlichtMt fork customized for the Minetest engine | ||||
| #define IRRLICHT_VERSION_MT_REVISION 9 | ||||
| #define IRRLICHT_VERSION_MT "mt9" | ||||
| #define IRRLICHT_VERSION_MT_REVISION 11 | ||||
| #define IRRLICHT_VERSION_MT "mt11" | ||||
|  | ||||
| //! Irrlicht SDK Version | ||||
| #define IRRLICHT_VERSION_MAJOR 1 | ||||
| @@ -20,460 +20,14 @@ | ||||
|  | ||||
| #include <stdio.h> // TODO: Although included elsewhere this is required at least for mingw | ||||
|  | ||||
| //! The defines for different operating system are: | ||||
| //! _IRR_WINDOWS_ for all irrlicht supported Windows versions | ||||
| //! _IRR_WINDOWS_API_ for Windows or XBox | ||||
| //! _IRR_LINUX_PLATFORM_ for Linux (it is defined here if no other os is defined) | ||||
| //! _IRR_SOLARIS_PLATFORM_ for Solaris | ||||
| //! _IRR_OSX_PLATFORM_ for Apple systems running OSX | ||||
| //! _IRR_IOS_PLATFORM_ for Apple devices running iOS | ||||
| //! _IRR_ANDROID_PLATFORM_ for devices running Android | ||||
| //! _IRR_POSIX_API_ for Posix compatible systems | ||||
| //! Note: PLATFORM defines the OS specific layer, API can group several platforms | ||||
|  | ||||
| //! DEVICE is the windowing system used, several PLATFORMs support more than one DEVICE | ||||
| //! Irrlicht can be compiled with more than one device | ||||
| //! _IRR_COMPILE_WITH_WINDOWS_DEVICE_ for Windows API based device | ||||
| //! _IRR_COMPILE_WITH_OSX_DEVICE_ for Cocoa native windowing on OSX | ||||
| //! _IRR_COMPILE_WITH_X11_DEVICE_ for Linux X11 based device | ||||
| //! _IRR_COMPILE_WITH_SDL_DEVICE_ for platform independent SDL framework | ||||
|  | ||||
| //! Passing defines to the compiler which have NO in front of the _IRR definename is an alternative | ||||
| //! way which can be used to disable defines (instead of outcommenting them in this header). | ||||
| //! So defines can be controlled from Makefiles or Projectfiles which allows building | ||||
| //! different library versions without having to change the sources. | ||||
| //! Example: NO_IRR_COMPILE_WITH_X11_ would disable X11 | ||||
|  | ||||
| //! Uncomment this line to compile with the SDL device | ||||
| //#define _IRR_COMPILE_WITH_SDL_DEVICE_ | ||||
| #ifdef NO_IRR_COMPILE_WITH_SDL_DEVICE_ | ||||
| #undef _IRR_COMPILE_WITH_SDL_DEVICE_ | ||||
| #endif | ||||
|  | ||||
| //! WIN32 for Windows32 | ||||
| //! WIN64 for Windows64 | ||||
| // The windows platform and API support SDL and WINDOW device | ||||
| #if defined(_WIN32) || defined(_WIN64) | ||||
| #define _IRR_WINDOWS_ | ||||
| #define _IRR_WINDOWS_API_ | ||||
| #ifndef _IRR_COMPILE_WITH_SDL_DEVICE_ | ||||
| #define _IRR_COMPILE_WITH_WINDOWS_DEVICE_ | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| #if defined(__APPLE__) | ||||
| #if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) || defined(__IPHONE_OS_VERSION_MIN_REQUIRED) | ||||
| #define _IRR_IOS_PLATFORM_ | ||||
| #define _IRR_COMPILE_WITH_IOS_DEVICE_ | ||||
| #define NO_IRR_COMPILE_WITH_OPENGL_ | ||||
| // The application state events and following methods: IrrlichtDevice::isWindowActive, IrrlichtDevice::isWindowFocused, | ||||
| // IrrlichtDevice::isWindowMinimized works out of box only if you'll use built-in CIrrDelegateiOS, | ||||
| // so _IRR_COMPILE_WITH_IOS_BUILTIN_MAIN_ must be enabled in this case. If you need a custom UIApplicationDelegate | ||||
| // you must disable _IRR_COMPILE_WITH_IOS_BUILTIN_MAIN_ definition and handle all application events yourself. | ||||
| #define _IRR_COMPILE_WITH_IOS_BUILTIN_MAIN_ | ||||
| #else | ||||
| #define _IRR_OSX_PLATFORM_ | ||||
| #ifndef _IRR_COMPILE_WITH_SDL_DEVICE_ | ||||
| #define _IRR_COMPILE_WITH_OSX_DEVICE_ | ||||
| #endif | ||||
| #define NO_IRR_COMPILE_WITH_OGLES1_ | ||||
| #define NO_IRR_COMPILE_WITH_OGLES2_ | ||||
| #define NO_IRR_COMPILE_WITH_WEBGL1_ | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| #if defined(__EMSCRIPTEN__) | ||||
| #define _IRR_EMSCRIPTEN_PLATFORM_ | ||||
| #define NO_IRR_COMPILE_WITH_JOYSTICK_EVENTS_ | ||||
| #define NO_IRR_COMPILE_WITH_OPENGL_ | ||||
| #define NO_IRR_COMPILE_WITH_OGLES1_ | ||||
| #define _IRR_COMPILE_WITH_OGLES2_ | ||||
| #define _IRR_COMPILE_WITH_WEBGL1_ | ||||
| #define _IRR_COMPILE_WITH_EGL_MANAGER_ | ||||
| #define _IRR_COMPILE_WITH_SDL_DEVICE_ | ||||
| #define NO_IRR_COMPILE_WITH_X11_DEVICE_ | ||||
| #define _IRR_LINUX_PLATFORM_	// emscripten basically working like a unix | ||||
| #endif // __EMSCRIPTEN__ | ||||
|  | ||||
| #if defined(__ANDROID__) | ||||
| #define _IRR_ANDROID_PLATFORM_ | ||||
| #define _IRR_COMPILE_WITH_ANDROID_DEVICE_ | ||||
| #define _IRR_COMPILE_ANDROID_ASSET_READER_ | ||||
| #define NO_IRR_COMPILE_WITH_OPENGL_ | ||||
| #endif | ||||
|  | ||||
| #if defined(__SVR4) && defined(__sun) | ||||
| #define _IRR_SOLARIS_PLATFORM_ | ||||
| #if defined(__sparc) | ||||
| 	#define __BIG_ENDIAN__ | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| #if !defined(_IRR_WINDOWS_API_) && !defined(_IRR_OSX_PLATFORM_) && !defined(_IRR_IOS_PLATFORM_) && !defined(_IRR_ANDROID_PLATFORM_) && !defined(_IRR_EMSCRIPTEN_PLATFORM_) | ||||
| #ifndef _IRR_SOLARIS_PLATFORM_ | ||||
| #define _IRR_LINUX_PLATFORM_ | ||||
| #endif | ||||
| #define _IRR_POSIX_API_ | ||||
| #ifndef _IRR_COMPILE_WITH_SDL_DEVICE_ | ||||
| #define _IRR_COMPILE_WITH_X11_DEVICE_ | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
|  | ||||
| //! Define _IRR_COMPILE_WITH_JOYSTICK_SUPPORT_ if you want joystick events. | ||||
| #if !(defined(__FreeBSD__) || defined(__OpenBSD__)) | ||||
| #define _IRR_COMPILE_WITH_JOYSTICK_EVENTS_ | ||||
| #endif | ||||
| #ifdef NO_IRR_COMPILE_WITH_JOYSTICK_EVENTS_ | ||||
| #undef _IRR_COMPILE_WITH_JOYSTICK_EVENTS_ | ||||
| #endif | ||||
|  | ||||
|  | ||||
| //! Maximum number of texture an SMaterial can have, up to 8 are supported by Irrlicht. | ||||
| #define _IRR_MATERIAL_MAX_TEXTURES_ 4 | ||||
|  | ||||
| //! Add a leak-hunter to Irrlicht which helps finding unreleased reference counted objects. | ||||
| //! NOTE: This is slow and should only be used for debugging | ||||
| //#define _IRR_COMPILE_WITH_LEAK_HUNTER_ | ||||
| #ifdef NO_IRR_COMPILE_WITH_LEAK_HUNTER_ | ||||
| #undef _IRR_COMPILE_WITH_LEAK_HUNTER_ | ||||
| #endif | ||||
|  | ||||
| //! Enable profiling information in the engine | ||||
| /** NOTE: The profiler itself always exists and can be used by applications. | ||||
| This define is about the engine creating profile data | ||||
| while it runs and enabling it will slow down the engine. */ | ||||
| //#define _IRR_COMPILE_WITH_PROFILING_ | ||||
| #ifdef NO_IRR_COMPILE_WITH_PROFILING_ | ||||
| #undef _IRR_COMPILE_WITH_PROFILING_ | ||||
| #endif | ||||
|  | ||||
| //! Define _IRR_COMPILE_WITH_DIRECT3D_9_ to compile the Irrlicht engine with DIRECT3D9. | ||||
| /** If you only want to use the software device or opengl you can disable those defines. | ||||
| This switch is mostly disabled because people do not get the g++ compiler compile | ||||
| directX header files, and directX is only available on Windows platforms. If you | ||||
| are using Dev-Cpp, and want to compile this using a DX dev pack, you can define | ||||
| _IRR_COMPILE_WITH_DX9_DEV_PACK_. So you simply need to add something like this | ||||
| to the compiler settings: -DIRR_COMPILE_WITH_DX9_DEV_PACK | ||||
| and this to the linker settings: -ld3dx9 | ||||
| */ | ||||
| #if defined(_IRR_WINDOWS_API_) && defined(IRR_COMPILE_WITH_DX9_DEV_PACK) | ||||
|  | ||||
| //! Define _IRR_COMPILE_WITH_DIRECTINPUT_JOYSTICK_ if you want to use DirectInput for joystick handling. | ||||
| /** This only applies to Windows devices, currently only supported under Win32 device. | ||||
| If not defined, Windows Multimedia library is used, which offers also broad support for joystick devices. */ | ||||
| #define _IRR_COMPILE_WITH_DIRECTINPUT_JOYSTICK_ | ||||
| #ifdef NO_IRR_COMPILE_WITH_DIRECTINPUT_JOYSTICK_ | ||||
| #undef _IRR_COMPILE_WITH_DIRECTINPUT_JOYSTICK_ | ||||
| #endif | ||||
|  | ||||
| #endif | ||||
|  | ||||
| //! Define _IRR_COMPILE_WITH_OPENGL_ to compile the Irrlicht engine with OpenGL. | ||||
| /** If you do not wish the engine to be compiled with OpenGL, comment this | ||||
| define out. */ | ||||
| #define _IRR_COMPILE_WITH_OPENGL_ | ||||
| #ifdef NO_IRR_COMPILE_WITH_OPENGL_ | ||||
| #undef _IRR_COMPILE_WITH_OPENGL_ | ||||
| #endif | ||||
|  | ||||
| //! Define required options for OpenGL drivers. | ||||
| #if defined(_IRR_COMPILE_WITH_OPENGL_) | ||||
| 	#if defined(_IRR_COMPILE_WITH_WINDOWS_DEVICE_) | ||||
| 		#define _IRR_OPENGL_USE_EXTPOINTER_ | ||||
| 		#define _IRR_COMPILE_WITH_WGL_MANAGER_ | ||||
| 	#elif defined(_IRR_COMPILE_WITH_X11_DEVICE_) | ||||
| 		#define _IRR_OPENGL_USE_EXTPOINTER_ | ||||
| 		#define _IRR_COMPILE_WITH_GLX_MANAGER_ | ||||
| 	#elif defined(_IRR_COMPILE_WITH_OSX_DEVICE_) | ||||
| 		#define _IRR_COMPILE_WITH_NSOGL_MANAGER_ | ||||
| 	#elif defined(_IRR_SOLARIS_PLATFORM_) | ||||
| 		#define _IRR_COMPILE_WITH_GLX_MANAGER_ | ||||
| 	#elif defined(_IRR_COMPILE_WITH_SDL_DEVICE_) | ||||
| 		#define _IRR_OPENGL_USE_EXTPOINTER_ | ||||
| 	#endif | ||||
| #endif | ||||
|  | ||||
| //! Define _IRR_COMPILE_WITH_OGLES1_ to compile the Irrlicht engine with OpenGL ES 1.1. | ||||
| /** If you do not wish the engine to be compiled with OpenGL ES 1.1, comment this | ||||
| define out. | ||||
| Depending on platform you may have to enable _IRR_OGLES1_USE_KHRONOS_API_HEADERS_ as well when using it. | ||||
| */ | ||||
| #if defined(_IRR_ANDROID_PLATFORM_) || defined(_IRR_IOS_PLATFORM_) | ||||
| #define _IRR_COMPILE_WITH_OGLES1_ | ||||
| #endif | ||||
| #ifdef NO_IRR_COMPILE_WITH_OGLES1_ | ||||
| #undef _IRR_COMPILE_WITH_OGLES1_ | ||||
| #endif | ||||
|  | ||||
| #ifdef _IRR_COMPILE_WITH_OGLES1_ | ||||
| //! Define _IRR_OGLES1_USE_KHRONOS_API_HEADERS_ to use the OpenGL ES headers from the Debian Khronos-api package | ||||
| //#define _IRR_OGLES1_USE_KHRONOS_API_HEADERS_ | ||||
| #endif | ||||
|  | ||||
| //! Define required options for OpenGL ES 1.1 drivers. | ||||
| #if defined(_IRR_COMPILE_WITH_OGLES1_) | ||||
| #if defined(_IRR_COMPILE_WITH_WINDOWS_DEVICE_) || defined(_IRR_COMPILE_WITH_X11_DEVICE_) || defined(_IRR_COMPILE_WITH_ANDROID_DEVICE_) | ||||
| #define _IRR_OGLES1_USE_EXTPOINTER_ | ||||
| #ifndef _IRR_COMPILE_WITH_EGL_MANAGER_ | ||||
| #define _IRR_COMPILE_WITH_EGL_MANAGER_ | ||||
| #endif | ||||
| #elif defined(_IRR_COMPILE_WITH_IOS_DEVICE_) | ||||
| #ifndef _IRR_COMPILE_WITH_EAGL_MANAGER_ | ||||
| #define _IRR_COMPILE_WITH_EAGL_MANAGER_ | ||||
| #endif | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| //! Define _IRR_COMPILE_WITH_OGLES2_ to compile the Irrlicht engine with OpenGL ES 2.0. | ||||
| /** If you do not wish the engine to be compiled with OpenGL ES 2.0, comment this | ||||
| define out. */ | ||||
| #if defined(_IRR_ANDROID_PLATFORM_) || defined(_IRR_IOS_PLATFORM_) | ||||
| #define _IRR_COMPILE_WITH_OGLES2_ | ||||
| #else | ||||
| //#define _IRR_COMPILE_WITH_OGLES2_ | ||||
| #endif | ||||
| #ifdef NO_IRR_COMPILE_WITH_OGLES2_ | ||||
| #undef _IRR_COMPILE_WITH_OGLES2_ | ||||
| #endif | ||||
|  | ||||
| //! Define _IRR_COMPILE_WITH_WEBGL1_ to compile Irrlicht engine with a WebGL friendly | ||||
| //! subset of the OpenGL ES 2.0 driver. | ||||
| //#define _IRR_COMPILE_WITH_WEBGL1_ | ||||
| #ifdef NO_IRR_COMPILE_WITH_WEBGL1_ | ||||
| #undef _IRR_COMPILE_WITH_WEBGL1_ | ||||
| #endif | ||||
| #ifdef _IRR_COMPILE_WITH_WEBGL1_ | ||||
| #define _IRR_COMPILE_WITH_OGLES2_ //  it's a subset of OGL ES2, so always needed when using WebGL | ||||
| #endif | ||||
|  | ||||
| //! Define required options for OpenGL ES 2.0 drivers. | ||||
| #if defined(_IRR_COMPILE_WITH_OGLES2_) | ||||
| #if defined(_IRR_COMPILE_WITH_WINDOWS_DEVICE_) || defined(_IRR_COMPILE_WITH_X11_DEVICE_) || defined(_IRR_COMPILE_WITH_ANDROID_DEVICE_) || defined(__EMSCRIPTEN__) | ||||
| #define _IRR_OGLES2_USE_EXTPOINTER_ | ||||
| #ifndef _IRR_COMPILE_WITH_EGL_MANAGER_ | ||||
| #define _IRR_COMPILE_WITH_EGL_MANAGER_ | ||||
| #endif | ||||
| #elif defined(_IRR_COMPILE_WITH_IOS_DEVICE_) | ||||
| #ifndef _IRR_COMPILE_WITH_EAGL_MANAGER_ | ||||
| #define _IRR_COMPILE_WITH_EAGL_MANAGER_ | ||||
| #endif | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
|  | ||||
|  | ||||
| //! Define _IRR_COMPILE_WITH_X11_ to compile the Irrlicht engine with X11 support. | ||||
| /** If you do not wish the engine to be compiled with X11, comment this | ||||
| define out. */ | ||||
| // Only used in LinuxDevice. | ||||
| #define _IRR_COMPILE_WITH_X11_ | ||||
| #ifdef NO_IRR_COMPILE_WITH_X11_ | ||||
| #undef _IRR_COMPILE_WITH_X11_ | ||||
| #endif | ||||
|  | ||||
| #if defined(_IRR_LINUX_PLATFORM_) && defined(_IRR_COMPILE_WITH_X11_) | ||||
| //! XInput2 (library called Xi) is currently only used to support touch-input. | ||||
| #define _IRR_LINUX_X11_XINPUT2_ | ||||
| #ifdef NO_IRR_LINUX_X11_XINPUT2_ | ||||
| #undef _IRR_LINUX_X11_XINPUT2_ | ||||
| #endif | ||||
|  | ||||
| //! X11 has by default only monochrome cursors, but using the Xcursor library we can also get color cursor support. | ||||
| //! If you have the need for custom color cursors on X11 then enable this and make sure you also link | ||||
| //! to the Xcursor library in your Makefile/Projectfile. | ||||
| //#define _IRR_LINUX_XCURSOR_ | ||||
| #ifdef NO_IRR_LINUX_XCURSOR_ | ||||
| #undef _IRR_LINUX_XCURSOR_ | ||||
| #endif | ||||
|  | ||||
| #endif | ||||
|  | ||||
| //! Define _IRR_COMPILE_WITH_GUI_ to compile the engine with the built-in GUI | ||||
| /** Disable this if you are using an external library to draw the GUI. If you disable this then | ||||
| you will not be able to use anything provided by the GUI Environment, including loading fonts. */ | ||||
| #define _IRR_COMPILE_WITH_GUI_ | ||||
| #ifdef NO_IRR_COMPILE_WITH_GUI_ | ||||
| #undef _IRR_COMPILE_WITH_GUI_ | ||||
| #endif | ||||
|  | ||||
| //! Define _IRR_COMPILE_WITH_LIBJPEG_ to enable compiling the engine using libjpeg. | ||||
| /** This enables the engine to read jpeg images. If you comment this out, | ||||
| the engine will no longer read .jpeg images. */ | ||||
| #define _IRR_COMPILE_WITH_LIBJPEG_ | ||||
| #ifdef NO_IRR_COMPILE_WITH_LIBJPEG_ | ||||
| #undef _IRR_COMPILE_WITH_LIBJPEG_ | ||||
| #endif | ||||
|  | ||||
| //! Define _IRR_COMPILE_WITH_LIBPNG_ to enable compiling the engine using libpng. | ||||
| /** This enables the engine to read png images. If you comment this out, | ||||
| the engine will no longer read .png images. */ | ||||
| #define _IRR_COMPILE_WITH_LIBPNG_ | ||||
| #ifdef NO_IRR_COMPILE_WITH_LIBPNG_ | ||||
| #undef _IRR_COMPILE_WITH_LIBPNG_ | ||||
| #endif | ||||
|  | ||||
| //! Uncomment the following line if you want to ignore the deprecated warnings | ||||
| //#define IGNORE_DEPRECATED_WARNING | ||||
|  | ||||
| //! Define _IRR_COMPILE_WITH_BILLBOARD_SCENENODE_ to support BillboardSceneNodes | ||||
| #define _IRR_COMPILE_WITH_BILLBOARD_SCENENODE_ | ||||
| #ifdef NO_IRR_COMPILE_WITH_BILLBOARD_SCENENODE_ | ||||
| #undef _IRR_COMPILE_WITH_BILLBOARD_SCENENODE_ | ||||
| #endif | ||||
|  | ||||
| //! Define _IRR_COMPILE_WITH_SKINNED_MESH_SUPPORT_ if you want to use bone based | ||||
| /** animated meshes. If you compile without this, you will be unable to load | ||||
| B3D, MS3D or X meshes */ | ||||
| #define _IRR_COMPILE_WITH_SKINNED_MESH_SUPPORT_ | ||||
| #ifdef NO_IRR_COMPILE_WITH_SKINNED_MESH_SUPPORT_ | ||||
| #undef _IRR_COMPILE_WITH_SKINNED_MESH_SUPPORT_ | ||||
| #endif | ||||
|  | ||||
| #ifdef _IRR_COMPILE_WITH_SKINNED_MESH_SUPPORT_ | ||||
| //! Define _IRR_COMPILE_WITH_B3D_LOADER_ if you want to use Blitz3D files | ||||
| #define _IRR_COMPILE_WITH_B3D_LOADER_ | ||||
| #ifdef NO_IRR_COMPILE_WITH_B3D_LOADER_ | ||||
| #undef _IRR_COMPILE_WITH_B3D_LOADER_ | ||||
| #endif | ||||
| //! Define _IRR_COMPILE_WITH_X_LOADER_ if you want to use Microsoft X files | ||||
| #define _IRR_COMPILE_WITH_X_LOADER_ | ||||
| #ifdef NO_IRR_COMPILE_WITH_X_LOADER_ | ||||
| #undef _IRR_COMPILE_WITH_X_LOADER_ | ||||
| #endif | ||||
| #endif // _IRR_COMPILE_WITH_SKINNED_MESH_SUPPORT_ | ||||
|  | ||||
| //! Define _IRR_COMPILE_WITH_OBJ_LOADER_ if you want to load Wavefront OBJ files | ||||
| #define _IRR_COMPILE_WITH_OBJ_LOADER_ | ||||
| #ifdef NO_IRR_COMPILE_WITH_OBJ_LOADER_ | ||||
| #undef _IRR_COMPILE_WITH_OBJ_LOADER_ | ||||
| #endif | ||||
|  | ||||
| //! Define _IRR_COMPILE_WITH_GLTF_LOADER_ if you want to load glTF files | ||||
| #define _IRR_COMPILE_WITH_GLTF_LOADER_ | ||||
| #ifdef NO_IRR_COMPILE_WITH_GLTF_LOADER_ | ||||
| #undef _IRR_COMPILE_WITH_GLTF_LOADER_ | ||||
| #endif | ||||
|  | ||||
| //! Define _IRR_COMPILE_WITH_BMP_LOADER_ if you want to load .bmp files | ||||
| //! Disabling this loader will also disable the built-in font | ||||
| #define _IRR_COMPILE_WITH_BMP_LOADER_ | ||||
| #ifdef NO_IRR_COMPILE_WITH_BMP_LOADER_ | ||||
| #undef _IRR_COMPILE_WITH_BMP_LOADER_ | ||||
| #endif | ||||
| //! Define _IRR_COMPILE_WITH_JPG_LOADER_ if you want to load .jpg files | ||||
| #define _IRR_COMPILE_WITH_JPG_LOADER_ | ||||
| #ifdef NO_IRR_COMPILE_WITH_JPG_LOADER_ | ||||
| #undef _IRR_COMPILE_WITH_JPG_LOADER_ | ||||
| #endif | ||||
| //! Define _IRR_COMPILE_WITH_PNG_LOADER_ if you want to load .png files | ||||
| #define _IRR_COMPILE_WITH_PNG_LOADER_ | ||||
| #ifdef NO_IRR_COMPILE_WITH_PNG_LOADER_ | ||||
| #undef _IRR_COMPILE_WITH_PNG_LOADER_ | ||||
| #endif | ||||
| //! Define _IRR_COMPILE_WITH_TGA_LOADER_ if you want to load .tga files | ||||
| #define _IRR_COMPILE_WITH_TGA_LOADER_ | ||||
| #ifdef NO_IRR_COMPILE_WITH_TGA_LOADER_ | ||||
| #undef _IRR_COMPILE_WITH_TGA_LOADER_ | ||||
| #endif | ||||
|  | ||||
| //! Define _IRR_COMPILE_WITH_JPG_WRITER_ if you want to write .jpg files | ||||
| #define _IRR_COMPILE_WITH_JPG_WRITER_ | ||||
| #ifdef NO_IRR_COMPILE_WITH_JPG_WRITER_ | ||||
| #undef _IRR_COMPILE_WITH_JPG_WRITER_ | ||||
| #endif | ||||
| //! Define _IRR_COMPILE_WITH_PNG_WRITER_ if you want to write .png files | ||||
| #define _IRR_COMPILE_WITH_PNG_WRITER_ | ||||
| #ifdef NO_IRR_COMPILE_WITH_PNG_WRITER_ | ||||
| #undef _IRR_COMPILE_WITH_PNG_WRITER_ | ||||
| #endif | ||||
|  | ||||
| //! Define __IRR_COMPILE_WITH_ZIP_ARCHIVE_LOADER_ if you want to open ZIP and GZIP archives | ||||
| /** ZIP reading has several more options below to configure. */ | ||||
| #define __IRR_COMPILE_WITH_ZIP_ARCHIVE_LOADER_ | ||||
| #ifdef NO__IRR_COMPILE_WITH_ZIP_ARCHIVE_LOADER_ | ||||
| #undef __IRR_COMPILE_WITH_ZIP_ARCHIVE_LOADER_ | ||||
| #endif | ||||
| #ifdef __IRR_COMPILE_WITH_ZIP_ARCHIVE_LOADER_ | ||||
| //! Define _IRR_COMPILE_WITH_ZLIB_ to enable compiling the engine using zlib. | ||||
| /** This enables the engine to read from compressed .zip archives. If you | ||||
| disable this feature, the engine can still read archives, but only uncompressed | ||||
| ones. */ | ||||
| #define _IRR_COMPILE_WITH_ZLIB_ | ||||
| #ifdef NO_IRR_COMPILE_WITH_ZLIB_ | ||||
| #undef _IRR_COMPILE_WITH_ZLIB_ | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| //! Define __IRR_COMPILE_WITH_MOUNT_ARCHIVE_LOADER_ if you want to mount folders as archives | ||||
| #define __IRR_COMPILE_WITH_MOUNT_ARCHIVE_LOADER_ | ||||
| #ifdef NO__IRR_COMPILE_WITH_MOUNT_ARCHIVE_LOADER_ | ||||
| #undef __IRR_COMPILE_WITH_MOUNT_ARCHIVE_LOADER_ | ||||
| #endif | ||||
|  | ||||
| // Some cleanup and standard stuff | ||||
|  | ||||
| #ifdef _IRR_WINDOWS_API_ | ||||
|  | ||||
| // To build Irrlicht as a static library, you must define _IRR_STATIC_LIB_ in both the | ||||
| // Irrlicht build, *and* in the user application, before #including <irrlicht.h> | ||||
| #ifndef _IRR_STATIC_LIB_ | ||||
| #ifdef IRRLICHT_EXPORTS | ||||
| #define IRRLICHT_API __declspec(dllexport) | ||||
| #else | ||||
| #define IRRLICHT_API __declspec(dllimport) | ||||
| #endif // IRRLICHT_EXPORT | ||||
| #else | ||||
| #define IRRLICHT_API | ||||
| #endif // _IRR_STATIC_LIB_ | ||||
|  | ||||
| // Declare the calling convention. | ||||
| #if defined(_STDCALL_SUPPORTED) | ||||
| #ifdef _WIN32 | ||||
| #define IRRCALLCONV __stdcall | ||||
| #else | ||||
| #define IRRCALLCONV __cdecl | ||||
| #endif // STDCALL_SUPPORTED | ||||
|  | ||||
| #else // _IRR_WINDOWS_API_ | ||||
|  | ||||
| // Force symbol export in shared libraries built with gcc. | ||||
| #if defined(__GNUC__) && !defined(_IRR_STATIC_LIB_) && defined(IRRLICHT_EXPORTS) | ||||
| #define IRRLICHT_API __attribute__ ((visibility("default"))) | ||||
| #else | ||||
| #define IRRLICHT_API | ||||
| #endif | ||||
|  | ||||
| #define IRRCALLCONV | ||||
|  | ||||
| #endif // _IRR_WINDOWS_API_ | ||||
|  | ||||
| #if defined(_IRR_SOLARIS_PLATFORM_) | ||||
| 	#undef _IRR_COMPILE_WITH_JOYSTICK_EVENTS_ | ||||
| #endif | ||||
|  | ||||
| //! Define __IRR_HAS_S64 if the irr::s64 type should be enable (needs long long, available on most platforms, but not part of ISO C++ 98) | ||||
| #define __IRR_HAS_S64 | ||||
| #ifdef NO__IRR_HAS_S64 | ||||
| #undef __IRR_HAS_S64 | ||||
| #endif | ||||
|  | ||||
| #ifndef __has_feature | ||||
|   #define __has_feature(x) 0  // Compatibility with non-clang compilers. | ||||
| #endif | ||||
|  | ||||
| #ifdef _DEBUG | ||||
| 	//! A few attributes are written in CSceneManager when _IRR_SCENEMANAGER_DEBUG is enabled | ||||
| 	// NOTE: Those attributes were used always until 1.8.0 and became a global define for 1.8.1 | ||||
| 	// which is only enabled in debug because it had a large (sometimes >5%) impact on speed. | ||||
| 	// A better solution in the long run is to break the interface and remove _all_ attribute | ||||
| 	// access in functions like CSceneManager::drawAll and instead put that information in some | ||||
| 	// own struct/class or in CSceneManager. | ||||
| 	// See http://irrlicht.sourceforge.net/forum/viewtopic.php?f=2&t=48211 for the discussion. | ||||
| 	#define _IRR_SCENEMANAGER_DEBUG | ||||
| 	#ifdef NO_IRR_SCENEMANAGER_DEBUG | ||||
| 		#undef _IRR_SCENEMANAGER_DEBUG | ||||
| 	#endif | ||||
| #ifndef IRRLICHT_API | ||||
| #define IRRLICHT_API | ||||
| #endif | ||||
|  | ||||
| #endif // __IRR_COMPILE_CONFIG_H_INCLUDED__ | ||||
|  | ||||
|   | ||||
| @@ -14,6 +14,7 @@ | ||||
| #include "ICursorControl.h" | ||||
| #include "ITimer.h" | ||||
| #include "IOSOperator.h" | ||||
| #include "IrrCompileConfig.h" | ||||
|  | ||||
| namespace irr | ||||
| { | ||||
| @@ -34,6 +35,7 @@ namespace irr | ||||
|  | ||||
| 	namespace video { | ||||
| 		class IContextManager; | ||||
| 		extern "C" IRRLICHT_API bool IRRCALLCONV isDriverSupported(E_DRIVER_TYPE driver); | ||||
| 	} // end namespace video | ||||
|  | ||||
| 	//! The Irrlicht device. You can create it with createDevice() or createDeviceEx(). | ||||
| @@ -130,6 +132,11 @@ namespace irr | ||||
| 		/** \param text: New text of the window caption. */ | ||||
| 		virtual void setWindowCaption(const wchar_t* text) = 0; | ||||
|  | ||||
| 		//! Sets the window icon. | ||||
| 		/** \param img The icon texture. | ||||
| 		\return False if no icon was set. */ | ||||
| 		virtual bool setWindowIcon(const video::IImage *img) = 0; | ||||
|  | ||||
| 		//! Returns if the window is active. | ||||
| 		/** If the window is inactive, | ||||
| 		nothing needs to be drawn. So if you don't want to draw anything | ||||
| @@ -156,6 +163,12 @@ namespace irr | ||||
| 		/** \return True if window is minimized. */ | ||||
| 		virtual bool isWindowMinimized() const = 0; | ||||
|  | ||||
| 		//! Checks if the Irrlicht window is maximized | ||||
| 		//! Only fully works on SDL. Returns false, or the last value set via | ||||
| 		//! maximizeWindow() and restoreWindow(), on other backends. | ||||
| 		/** \return True if window is maximized. */ | ||||
| 		virtual bool isWindowMaximized() const = 0; | ||||
|  | ||||
| 		//! Checks if the Irrlicht window is running in fullscreen mode | ||||
| 		/** \return True if window is fullscreen. */ | ||||
| 		virtual bool isFullscreen() const = 0; | ||||
| @@ -229,8 +242,8 @@ namespace irr | ||||
| 		as this would consume joystick info that 3rd party libraries might rely on. Call this method to | ||||
| 		activate joystick support in Irrlicht and to receive irr::SJoystickEvent events. | ||||
| 		\param joystickInfo On return, this will contain an array of each joystick that was found and activated. | ||||
| 		\return true if joysticks are supported on this device and _IRR_COMPILE_WITH_JOYSTICK_EVENTS_ | ||||
| 				is defined, false if joysticks are not supported or support is compiled out. | ||||
| 		\return true if joysticks are supported on this device, false if joysticks are not | ||||
| 		             supported or support is compiled out. | ||||
| 		*/ | ||||
| 		virtual bool activateJoysticks(core::array<SJoystickInfo>& joystickInfo) =0; | ||||
|  | ||||
| @@ -299,42 +312,16 @@ namespace irr | ||||
| 		used. */ | ||||
| 		virtual E_DEVICE_TYPE getType() const = 0; | ||||
|  | ||||
| 		//! Get the display density in dots per inch. | ||||
| 		//! Returns 0.0f on failure. | ||||
| 		virtual float getDisplayDensity() const = 0; | ||||
|  | ||||
| 		//! Check if a driver type is supported by the engine. | ||||
| 		/** Even if true is returned the driver may not be available | ||||
| 		for a configuration requested when creating the device. */ | ||||
| 		static bool isDriverSupported(video::E_DRIVER_TYPE driver) | ||||
| 		{ | ||||
| 			switch (driver) | ||||
| 			{ | ||||
| 				case video::EDT_NULL: | ||||
| 					return true; | ||||
| 				case video::EDT_OPENGL: | ||||
| #ifdef _IRR_COMPILE_WITH_OPENGL_ | ||||
| 					return true; | ||||
| #else | ||||
| 					return false; | ||||
| #endif | ||||
| 				case video::EDT_OGLES1: | ||||
| #ifdef _IRR_COMPILE_WITH_OGLES1_ | ||||
| 					return true; | ||||
| #else | ||||
| 					return false; | ||||
| #endif | ||||
| 				case video::EDT_OGLES2: | ||||
| #ifdef _IRR_COMPILE_WITH_OGLES2_ | ||||
| 					return true; | ||||
| #else | ||||
| 					return false; | ||||
| #endif | ||||
| 				case video::EDT_WEBGL1: | ||||
| #ifdef _IRR_COMPILE_WITH_WEBGL1_ | ||||
| 					return true; | ||||
| #else | ||||
| 					return false; | ||||
| #endif | ||||
| 				default: | ||||
| 					return false; | ||||
| 			} | ||||
| 			return video::isDriverSupported(driver); | ||||
| 		} | ||||
| 	}; | ||||
|  | ||||
|   | ||||
| @@ -25,7 +25,7 @@ enum E_VERTEX_TYPE | ||||
| 	EVT_2TCOORDS, | ||||
|  | ||||
| 	//! Vertex with a tangent and binormal vector, video::S3DVertexTangents. | ||||
| 	/** Usually used for tangent space normal mapping.  | ||||
| 	/** Usually used for tangent space normal mapping. | ||||
| 		Usually tangent and binormal get send to shaders as texture coordinate sets 1 and 2. | ||||
| 	*/ | ||||
| 	EVT_TANGENTS | ||||
| @@ -44,7 +44,7 @@ const char* const sBuiltInVertexTypeNames[] = | ||||
| struct S3DVertex | ||||
| { | ||||
| 	//! default constructor | ||||
| 	S3DVertex() {} | ||||
| 	S3DVertex() : Color(0xffffffff) {} | ||||
|  | ||||
| 	//! constructor | ||||
| 	S3DVertex(f32 x, f32 y, f32 z, f32 nx, f32 ny, f32 nz, SColor c, f32 tu, f32 tv) | ||||
| @@ -142,7 +142,7 @@ struct S3DVertex2TCoords : public S3DVertex | ||||
| 		: S3DVertex(pos, normal, color, tcoords), TCoords2(tcoords) {} | ||||
|  | ||||
| 	//! constructor from S3DVertex | ||||
| 	S3DVertex2TCoords(S3DVertex& o) : S3DVertex(o) {} | ||||
| 	S3DVertex2TCoords(const S3DVertex& o) : S3DVertex(o) {} | ||||
|  | ||||
| 	//! Second set of texture coordinates | ||||
| 	core::vector2d<f32> TCoords2; | ||||
| @@ -150,21 +150,21 @@ struct S3DVertex2TCoords : public S3DVertex | ||||
| 	//! Equality operator | ||||
| 	bool operator==(const S3DVertex2TCoords& other) const | ||||
| 	{ | ||||
| 		return ((static_cast<S3DVertex>(*this)==other) && | ||||
| 		return ((static_cast<S3DVertex>(*this)==static_cast<const S3DVertex&>(other)) && | ||||
| 			(TCoords2 == other.TCoords2)); | ||||
| 	} | ||||
|  | ||||
| 	//! Inequality operator | ||||
| 	bool operator!=(const S3DVertex2TCoords& other) const | ||||
| 	{ | ||||
| 		return ((static_cast<S3DVertex>(*this)!=other) || | ||||
| 		return ((static_cast<S3DVertex>(*this)!=static_cast<const S3DVertex&>(other)) || | ||||
| 			(TCoords2 != other.TCoords2)); | ||||
| 	} | ||||
|  | ||||
| 	bool operator<(const S3DVertex2TCoords& other) const | ||||
| 	{ | ||||
| 		return ((static_cast<S3DVertex>(*this) < other) || | ||||
| 				((static_cast<S3DVertex>(*this) == other) && (TCoords2 < other.TCoords2))); | ||||
| 				((static_cast<S3DVertex>(*this) == static_cast<const S3DVertex&>(other)) && (TCoords2 < other.TCoords2))); | ||||
| 	} | ||||
|  | ||||
| 	static E_VERTEX_TYPE getType() | ||||
| @@ -186,7 +186,7 @@ struct S3DVertex2TCoords : public S3DVertex | ||||
|  | ||||
|  | ||||
| //! Vertex with a tangent and binormal vector. | ||||
| /** Usually used for tangent space normal mapping.  | ||||
| /** Usually used for tangent space normal mapping. | ||||
| 	Usually tangent and binormal get send to shaders as texture coordinate sets 1 and 2. | ||||
| */ | ||||
| struct S3DVertexTangents : public S3DVertex | ||||
| @@ -214,6 +214,9 @@ struct S3DVertexTangents : public S3DVertex | ||||
| 		const core::vector3df& binormal=core::vector3df()) | ||||
| 		: S3DVertex(pos, normal, c, tcoords), Tangent(tangent), Binormal(binormal) { } | ||||
|  | ||||
| 	//! constructor from S3DVertex | ||||
| 	S3DVertexTangents(const S3DVertex& o) : S3DVertex(o) {} | ||||
|  | ||||
| 	//! Tangent vector along the x-axis of the texture | ||||
| 	core::vector3df Tangent; | ||||
|  | ||||
| @@ -222,14 +225,14 @@ struct S3DVertexTangents : public S3DVertex | ||||
|  | ||||
| 	bool operator==(const S3DVertexTangents& other) const | ||||
| 	{ | ||||
| 		return ((static_cast<S3DVertex>(*this)==other) && | ||||
| 		return ((static_cast<S3DVertex>(*this)==static_cast<const S3DVertex&>(other)) && | ||||
| 			(Tangent == other.Tangent) && | ||||
| 			(Binormal == other.Binormal)); | ||||
| 	} | ||||
|  | ||||
| 	bool operator!=(const S3DVertexTangents& other) const | ||||
| 	{ | ||||
| 		return ((static_cast<S3DVertex>(*this)!=other) || | ||||
| 		return ((static_cast<S3DVertex>(*this)!=static_cast<const S3DVertex&>(other)) || | ||||
| 			(Tangent != other.Tangent) || | ||||
| 			(Binormal != other.Binormal)); | ||||
| 	} | ||||
| @@ -237,8 +240,8 @@ struct S3DVertexTangents : public S3DVertex | ||||
| 	bool operator<(const S3DVertexTangents& other) const | ||||
| 	{ | ||||
| 		return ((static_cast<S3DVertex>(*this) < other) || | ||||
| 				((static_cast<S3DVertex>(*this) == other) && (Tangent < other.Tangent)) || | ||||
| 				((static_cast<S3DVertex>(*this) == other) && (Tangent == other.Tangent) && (Binormal < other.Binormal))); | ||||
| 				((static_cast<S3DVertex>(*this) == static_cast<const S3DVertex&>(other)) && (Tangent < other.Tangent)) || | ||||
| 				((static_cast<S3DVertex>(*this) == static_cast<const S3DVertex&>(other)) && (Tangent == other.Tangent) && (Binormal < other.Binormal))); | ||||
| 	} | ||||
|  | ||||
| 	static E_VERTEX_TYPE getType() | ||||
|   | ||||
| @@ -78,21 +78,6 @@ struct SExposedVideoData | ||||
| 		//! The EGLNativeWindowType object. | ||||
| 		void* Window;	 | ||||
| 	}; | ||||
| 	 | ||||
| 	struct SOpenGLiOS | ||||
| 	{ | ||||
| 		//! The EAGLContext object. | ||||
| 		void* Context; | ||||
| 			 | ||||
| 		//! The subview UIView object where the drawing happens. | ||||
| 		void* View; | ||||
| 		 | ||||
| 		//! The UIViewController object. | ||||
| 		void* ViewController; | ||||
| 		 | ||||
| 		//! The UIWindow object. | ||||
|         void* Window; | ||||
| 	}; | ||||
|  | ||||
| 	struct SOGLESAndroid | ||||
| 	{ | ||||
| @@ -107,7 +92,6 @@ struct SExposedVideoData | ||||
| 		SOpenGLLinux OpenGLLinux; | ||||
| 		SOpenGLOSX OpenGLOSX; | ||||
| 		SOpenGLFB OpenGLFB; | ||||
| 		SOpenGLiOS OpenGLiOS; | ||||
| 		SOGLESAndroid OGLESAndroid; | ||||
| 	}; | ||||
| }; | ||||
|   | ||||
| @@ -11,7 +11,7 @@ | ||||
| #include "ILogger.h" | ||||
| #include "position2d.h" | ||||
| #include "path.h" | ||||
| #include "IrrCompileConfig.h" | ||||
| #include "IrrCompileConfig.h" // for IRRLICHT_SDK_VERSION | ||||
|  | ||||
| namespace irr | ||||
| { | ||||
| @@ -24,12 +24,13 @@ namespace irr | ||||
| 		//! Constructs a SIrrlichtCreationParameters structure with default values. | ||||
| 		SIrrlichtCreationParameters() : | ||||
| 			DeviceType(EIDT_BEST), | ||||
| 			DriverType(video::EDT_BURNINGSVIDEO), | ||||
| 			DriverType(video::EDT_OPENGL), | ||||
| 			WindowSize(core::dimension2d<u32>(800, 600)), | ||||
| 			WindowPosition(core::position2di(-1,-1)), | ||||
| 			Bits(32), | ||||
| 			ZBufferBits(24), | ||||
| 			Fullscreen(false), | ||||
| 			WindowMaximized(false), | ||||
| 			WindowResizable(2), | ||||
| 			Stencilbuffer(true), | ||||
| 			Vsync(false), | ||||
| @@ -52,7 +53,7 @@ namespace irr | ||||
| 			UsePerformanceTimer(true), | ||||
| 			SDK_version_do_not_use(IRRLICHT_SDK_VERSION), | ||||
| 			PrivateData(0), | ||||
| #if defined(_IRR_COMPILE_WITH_IOS_DEVICE_) || defined(_IRR_ANDROID_PLATFORM_) || defined(_IRR_EMSCRIPTEN_PLATFORM_) | ||||
| #ifdef IRR_MOBILE_PATHS | ||||
| 			OGLES2ShaderPath("media/Shaders/") | ||||
| #else | ||||
| 			OGLES2ShaderPath("../../media/Shaders/") | ||||
| @@ -73,6 +74,7 @@ namespace irr | ||||
| 			Bits = other.Bits; | ||||
| 			ZBufferBits = other.ZBufferBits; | ||||
| 			Fullscreen = other.Fullscreen; | ||||
| 			WindowMaximized = other.WindowMaximized; | ||||
| 			WindowResizable = other.WindowResizable; | ||||
| 			Stencilbuffer = other.Stencilbuffer; | ||||
| 			Vsync = other.Vsync; | ||||
| @@ -127,6 +129,9 @@ namespace irr | ||||
| 		/** Otherwise the device runs in windowed mode. Default: false. */ | ||||
| 		bool Fullscreen; | ||||
|  | ||||
| 		//! Maximised window. (Only supported on SDL.) Default: false | ||||
| 		bool WindowMaximized; | ||||
|  | ||||
| 		//! Should a non-fullscreen window be resizable. | ||||
| 		/** Might not be supported by all devices. Ignored when Fullscreen is true. | ||||
| 		Values: 0 = not resizable, 1 = resizable, 2 = system decides default itself | ||||
| @@ -230,7 +235,6 @@ namespace irr | ||||
| 		/** If this is set to a value other than 0, the Irrlicht Engine | ||||
| 		will be created in an already existing window. | ||||
| 		For Windows, set this to the HWND of the window you want. | ||||
| 		For iOS, assign UIView to this variable. | ||||
| 		The windowSize and FullScreen options will be ignored when using | ||||
| 		the WindowId parameter. Default this is set to 0. | ||||
| 		To make Irrlicht run inside the custom window, you still will | ||||
|   | ||||
| @@ -12,6 +12,7 @@ | ||||
| #include "EMaterialTypes.h" | ||||
| #include "EMaterialFlags.h" | ||||
| #include "SMaterialLayer.h" | ||||
| #include "IrrCompileConfig.h" // for IRRLICHT_API | ||||
|  | ||||
| namespace irr | ||||
| { | ||||
| @@ -280,7 +281,7 @@ namespace video | ||||
| 	/** SMaterial might ignore some textures in most function, like assignment and comparison, | ||||
| 		when SIrrlichtCreationParameters::MaxTextureUnits is set to a lower number. | ||||
| 	*/ | ||||
| 	const u32 MATERIAL_MAX_TEXTURES = _IRR_MATERIAL_MAX_TEXTURES_; | ||||
| 	const u32 MATERIAL_MAX_TEXTURES = 4; | ||||
|  | ||||
| 	//! Struct for holding parameters for a material renderer | ||||
| 	// Note for implementors: Serialization is in CNullDriver | ||||
|   | ||||
| @@ -5,7 +5,6 @@ | ||||
| #ifndef __EXAMPLE_HELPER_H_INCLUDED__ | ||||
| #define __EXAMPLE_HELPER_H_INCLUDED__ | ||||
|  | ||||
| #include "IrrCompileConfig.h" | ||||
| #include "path.h" | ||||
|  | ||||
| namespace irr | ||||
| @@ -13,7 +12,7 @@ namespace irr | ||||
|  | ||||
| static io::path getExampleMediaPath() | ||||
| { | ||||
| #if defined (_IRR_IOS_PLATFORM_) || defined (_IRR_ANDROID_PLATFORM_) || defined (_IRR_OSX_PLATFORM_) || defined (_IRR_EMSCRIPTEN_PLATFORM_) | ||||
| #ifdef IRR_MOBILE_PATHS | ||||
| 	return io::path("media/"); | ||||
| #else | ||||
| 	return io::path("../../media/"); | ||||
|   | ||||
| @@ -5,7 +5,6 @@ | ||||
| #ifndef __IRR_MATH_H_INCLUDED__ | ||||
| #define __IRR_MATH_H_INCLUDED__ | ||||
|  | ||||
| #include "IrrCompileConfig.h" | ||||
| #include "irrTypes.h" | ||||
| #include <math.h> | ||||
| #include <float.h> | ||||
| @@ -21,9 +20,7 @@ namespace core | ||||
|  | ||||
| 	const s32 ROUNDING_ERROR_S32 = 0; | ||||
|  | ||||
| #ifdef __IRR_HAS_S64 | ||||
| 	const s64 ROUNDING_ERROR_S64 = 0; | ||||
| #endif | ||||
| 	const f32 ROUNDING_ERROR_f32 = 0.000001f; | ||||
| 	const f64 ROUNDING_ERROR_f64 = 0.00000001; | ||||
|  | ||||
| @@ -186,7 +183,6 @@ namespace core | ||||
| 		return ROUNDING_ERROR_S32; | ||||
| 	} | ||||
|  | ||||
| #ifdef __IRR_HAS_S64 | ||||
| 	template <> | ||||
| 	inline s64 roundingError() | ||||
| 	{ | ||||
| @@ -198,7 +194,6 @@ namespace core | ||||
| 	{ | ||||
| 		return ROUNDING_ERROR_S64; | ||||
| 	} | ||||
| #endif | ||||
|  | ||||
| 	template <class T> | ||||
| 	inline T relativeErrorFactor() | ||||
| @@ -310,13 +305,11 @@ namespace core | ||||
| 		return a <= tolerance; | ||||
| 	} | ||||
|  | ||||
| #ifdef __IRR_HAS_S64 | ||||
| 	//! returns if a equals zero, taking rounding errors into account | ||||
| 	inline bool iszero(const s64 a, const s64 tolerance = 0) | ||||
| 	{ | ||||
| 		return abs_(a) <= tolerance; | ||||
| 	} | ||||
| #endif | ||||
|  | ||||
| 	inline s32 s32_min(s32 a, s32 b) | ||||
| 	{ | ||||
| @@ -406,13 +399,11 @@ namespace core | ||||
| 		return static_cast<s32>(squareroot(static_cast<f32>(f))); | ||||
| 	} | ||||
|  | ||||
| #ifdef __IRR_HAS_S64 | ||||
| 	// calculate: sqrt ( x ) | ||||
| 	REALINLINE s64 squareroot(const s64 f) | ||||
| 	{ | ||||
| 		return static_cast<s64>(squareroot(static_cast<f64>(f))); | ||||
| 	} | ||||
| #endif | ||||
|  | ||||
| 	// calculate: 1 / sqrt ( x ) | ||||
| 	REALINLINE f64 reciprocal_squareroot(const f64 x) | ||||
|   | ||||
| @@ -5,7 +5,6 @@ | ||||
| #ifndef __IRR_TYPES_H_INCLUDED__ | ||||
| #define __IRR_TYPES_H_INCLUDED__ | ||||
|  | ||||
| #include "IrrCompileConfig.h" | ||||
| #include <stdint.h> | ||||
|  | ||||
| namespace irr | ||||
| @@ -38,13 +37,11 @@ typedef uint32_t 		u32; | ||||
| typedef int32_t			s32; | ||||
|  | ||||
|  | ||||
| #ifdef __IRR_HAS_S64 | ||||
| //! 64 bit unsigned variable. | ||||
| typedef uint64_t		u64; | ||||
|  | ||||
| //! 64 bit signed variable. | ||||
| typedef int64_t			s64; | ||||
| #endif	// __IRR_HAS_S64 | ||||
|  | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -174,7 +174,7 @@ inline core::array<u8> getUnicodeBOM(EUTF_ENCODE mode) | ||||
| 			COPY_ARRAY(BOM_ENCODE_UTF8, BOM_ENCODE_UTF8_LEN); | ||||
| 			break; | ||||
| 		case EUTFE_UTF16: | ||||
| 			#ifdef __BIG_ENDIAN__ | ||||
| 			#if __BYTE_ORDER == __BIG_ENDIAN | ||||
| 				COPY_ARRAY(BOM_ENCODE_UTF16_BE, BOM_ENCODE_UTF16_LEN); | ||||
| 			#else | ||||
| 				COPY_ARRAY(BOM_ENCODE_UTF16_LE, BOM_ENCODE_UTF16_LEN); | ||||
| @@ -187,7 +187,7 @@ inline core::array<u8> getUnicodeBOM(EUTF_ENCODE mode) | ||||
| 			COPY_ARRAY(BOM_ENCODE_UTF16_LE, BOM_ENCODE_UTF16_LEN); | ||||
| 			break; | ||||
| 		case EUTFE_UTF32: | ||||
| 			#ifdef __BIG_ENDIAN__ | ||||
| 			#if __BYTE_ORDER == __BIG_ENDIAN | ||||
| 				COPY_ARRAY(BOM_ENCODE_UTF32_BE, BOM_ENCODE_UTF32_LEN); | ||||
| 			#else | ||||
| 				COPY_ARRAY(BOM_ENCODE_UTF32_LE, BOM_ENCODE_UTF32_LEN); | ||||
| @@ -963,11 +963,11 @@ public: | ||||
| #endif | ||||
|  | ||||
| 		if (sizeof(wchar_t) == 4) | ||||
| 			append(reinterpret_cast<const uchar32_t* const>(c)); | ||||
| 			append(reinterpret_cast<const uchar32_t*>(c)); | ||||
| 		else if (sizeof(wchar_t) == 2) | ||||
| 			append(reinterpret_cast<const uchar16_t* const>(c)); | ||||
| 			append(reinterpret_cast<const uchar16_t*>(c)); | ||||
| 		else if (sizeof(wchar_t) == 1) | ||||
| 			append(reinterpret_cast<const uchar8_t* const>(c)); | ||||
| 			append(reinterpret_cast<const uchar8_t*>(c)); | ||||
| 	} | ||||
|  | ||||
|  | ||||
| @@ -982,11 +982,11 @@ public: | ||||
| #endif | ||||
|  | ||||
| 		if (sizeof(wchar_t) == 4) | ||||
| 			append(reinterpret_cast<const uchar32_t* const>(c), length); | ||||
| 			append(reinterpret_cast<const uchar32_t*>(c), length); | ||||
| 		else if (sizeof(wchar_t) == 2) | ||||
| 			append(reinterpret_cast<const uchar16_t* const>(c), length); | ||||
| 			append(reinterpret_cast<const uchar16_t*>(c), length); | ||||
| 		else if (sizeof(wchar_t) == 1) | ||||
| 			append(reinterpret_cast<const uchar8_t* const>(c), length); | ||||
| 			append(reinterpret_cast<const uchar8_t*>(c), length); | ||||
| 	} | ||||
|  | ||||
|  | ||||
| @@ -1116,11 +1116,11 @@ public: | ||||
| 	ustring16& operator=(const wchar_t* const c) | ||||
| 	{ | ||||
| 		if (sizeof(wchar_t) == 4) | ||||
| 			*this = reinterpret_cast<const uchar32_t* const>(c); | ||||
| 			*this = reinterpret_cast<const uchar32_t*>(c); | ||||
| 		else if (sizeof(wchar_t) == 2) | ||||
| 			*this = reinterpret_cast<const uchar16_t* const>(c); | ||||
| 			*this = reinterpret_cast<const uchar16_t*>(c); | ||||
| 		else if (sizeof(wchar_t) == 1) | ||||
| 			*this = reinterpret_cast<const uchar8_t* const>(c); | ||||
| 			*this = reinterpret_cast<const uchar8_t*>(c); | ||||
|  | ||||
| 		return *this; | ||||
| 	} | ||||
| @@ -1323,7 +1323,7 @@ public: | ||||
|  | ||||
| 		// Determine if the string is long enough for a BOM. | ||||
| 		u32 len = 0; | ||||
| 		const uchar8_t* p = other; | ||||
| 		const u8* p = reinterpret_cast<const u8*>(other); | ||||
| 		do | ||||
| 		{ | ||||
| 			++len; | ||||
| @@ -1338,10 +1338,10 @@ public: | ||||
| 		} | ||||
|  | ||||
| 		// If a BOM was found, don't include it in the string. | ||||
| 		const uchar8_t* c2 = other; | ||||
| 		const u8* c2 = reinterpret_cast<const u8*>(other); | ||||
| 		if (c_bom != unicode::EUTFE_NONE) | ||||
| 		{ | ||||
| 			c2 = other + unicode::BOM_UTF8_LEN; | ||||
| 			c2 += unicode::BOM_UTF8_LEN; | ||||
| 			length -= unicode::BOM_UTF8_LEN; | ||||
| 		} | ||||
|  | ||||
| @@ -3049,14 +3049,14 @@ public: | ||||
|  | ||||
| 	//! Gets the encoding of the Unicode string this class contains. | ||||
| 	//! \return An enum describing the current encoding of this string. | ||||
| 	const unicode::EUTF_ENCODE getEncoding() const | ||||
| 	unicode::EUTF_ENCODE getEncoding() const | ||||
| 	{ | ||||
| 		return encoding; | ||||
| 	} | ||||
|  | ||||
| 	//! Gets the endianness of the Unicode string this class contains. | ||||
| 	//! \return An enum describing the endianness of this string. | ||||
| 	const unicode::EUTF_ENDIAN getEndianness() const | ||||
| 	unicode::EUTF_ENDIAN getEndianness() const | ||||
| 	{ | ||||
| 		if (encoding == unicode::EUTFE_UTF16_LE || | ||||
| 			encoding == unicode::EUTFE_UTF32_LE) | ||||
| @@ -3612,33 +3612,5 @@ inline std::wostream& operator<<(std::wostream& out, const ustring16& in) | ||||
| 	return out; | ||||
| } | ||||
|  | ||||
| namespace unicode | ||||
| { | ||||
|  | ||||
| //! Hashing algorithm for hashing a ustring.  Used for things like unordered_maps. | ||||
| //! Algorithm taken from std::hash<std::string>. | ||||
| class hash : public std::unary_function<core::ustring, size_t> | ||||
| { | ||||
| 	public: | ||||
| 		size_t operator()(const core::ustring& s) const | ||||
| 		{ | ||||
| 			size_t ret = 2166136261U; | ||||
| 			size_t index = 0; | ||||
| 			size_t stride = 1 + s.size_raw() / 10; | ||||
|  | ||||
| 			core::ustring::const_iterator i = s.begin(); | ||||
| 			while (i != s.end()) | ||||
| 			{ | ||||
| 				// TODO: Don't force u32 on an x64 OS.  Make it agnostic. | ||||
| 				ret = 16777619U * ret ^ (size_t)s[(u32)index]; | ||||
| 				index += stride; | ||||
| 				i += stride; | ||||
| 			} | ||||
| 			return (ret); | ||||
| 		} | ||||
| }; | ||||
|  | ||||
| } // end namespace unicode | ||||
|  | ||||
| } // end namespace core | ||||
| } // end namespace irr | ||||
|   | ||||
| @@ -29,7 +29,6 @@ | ||||
| #ifndef __IRRLICHT_H_INCLUDED__ | ||||
| #define __IRRLICHT_H_INCLUDED__ | ||||
|  | ||||
| #include "IrrCompileConfig.h" | ||||
| #include "aabbox3d.h" | ||||
| #include "CIndexBuffer.h" | ||||
| #include "CMeshBuffer.h" | ||||
| @@ -135,6 +134,7 @@ | ||||
| #include "triangle3d.h" | ||||
| #include "vector2d.h" | ||||
| #include "vector3d.h" | ||||
| #include "IrrCompileConfig.h" // for IRRLICHT_API and IRRCALLCONV | ||||
|  | ||||
| /*! \mainpage Irrlicht Engine 1.9 API documentation | ||||
|  * | ||||
| @@ -271,7 +271,7 @@ namespace irr | ||||
| 	device could not be created. | ||||
| 	*/ | ||||
| 	extern "C" IRRLICHT_API IrrlichtDevice* IRRCALLCONV createDevice( | ||||
| 		video::E_DRIVER_TYPE driverType = video::EDT_SOFTWARE, | ||||
| 		video::E_DRIVER_TYPE driverType = video::EDT_OPENGL, | ||||
| 		// parentheses are necessary for some compilers | ||||
| 		const core::dimension2d<u32>& windowSize = (core::dimension2d<u32>(640,480)), | ||||
| 		u32 bits = 32, | ||||
|   | ||||
| @@ -12,6 +12,7 @@ | ||||
| #include "aabbox3d.h" | ||||
| #include "rect.h" | ||||
| #include "irrString.h" | ||||
| #include "IrrCompileConfig.h" // for IRRLICHT_API | ||||
|  | ||||
| // enable this to keep track of changes to the matrix | ||||
| // and make simpler identity check for seldom changing matrices | ||||
| @@ -142,7 +143,7 @@ namespace core | ||||
|  | ||||
| 			//! Set this matrix to the product of two matrices | ||||
| 			/** Calculate b*a, no optimization used, | ||||
| 			use it if you know you never have a identity matrix */ | ||||
| 			use it if you know you never have an identity matrix */ | ||||
| 			CMatrix4<T>& setbyproduct_nocheck(const CMatrix4<T>& other_a,const CMatrix4<T>& other_b ); | ||||
|  | ||||
| 			//! Multiply by another matrix. | ||||
| @@ -150,7 +151,8 @@ namespace core | ||||
| 			CMatrix4<T> operator*(const CMatrix4<T>& other) const; | ||||
|  | ||||
| 			//! Multiply by another matrix. | ||||
| 			/** Calculate and return other*this */ | ||||
| 			/** Like calling: (*this) = (*this) * other  | ||||
| 			*/ | ||||
| 			CMatrix4<T>& operator*=(const CMatrix4<T>& other); | ||||
|  | ||||
| 			//! Multiply by scalar. | ||||
| @@ -186,14 +188,25 @@ namespace core | ||||
| 			//! Make a rotation matrix from Euler angles. The 4th row and column are unmodified. | ||||
| 			CMatrix4<T>& setRotationDegrees( const vector3d<T>& rotation ); | ||||
|  | ||||
| 			//! Get the rotation, as set by setRotation() when you already know the scale. | ||||
| 			/** If you already know the scale then this function is faster than the other getRotationDegrees overload. | ||||
| 			NOTE: You will have the same end-rotation as used in setRotation, but it might not use the same axis values. | ||||
| 			//! Get the rotation, as set by setRotation() when you already know the scale used to create the matrix | ||||
| 			/** NOTE: The scale needs to be the correct one used to create this matrix. | ||||
| 				You can _not_ use the result of getScale(), but have to save your scale  | ||||
| 				variable in another place (like ISceneNode does). | ||||
| 			NOTE: No scale value can be 0 or the result is undefined. | ||||
| 			NOTE: It does not necessarily return the *same* Euler angles as those set by setRotationDegrees(),  | ||||
| 				but the rotation will be equivalent,  i.e. will have the same result when used to rotate a vector or node. | ||||
| 			NOTE: It will (usually) give wrong results when further transformations have been added in the matrix (like shear). | ||||
| 			WARNING: There have been troubles with this function over the years and we may still have missed some corner cases. | ||||
| 				It's generally safer to keep the rotation and scale you used to create the matrix around and work with those. | ||||
| 			*/ | ||||
| 			core::vector3d<T> getRotationDegrees(const vector3d<T>& scale) const; | ||||
|  | ||||
| 			//! Returns the rotation, as set by setRotation(). | ||||
| 			/** NOTE: You will have the same end-rotation as used in setRotation, but it might not use the same axis values. | ||||
| 				NOTE: This only works correct if no other matrix operations have been done on the inner 3x3 matrix besides  | ||||
| 					setting rotation (so no scale/shear). Thought it (probably) works as long as scale doesn't flip handedness. | ||||
| 				NOTE: It does not necessarily return the *same* Euler angles as those set by setRotationDegrees(),  | ||||
| 				but the rotation will be equivalent,  i.e. will have the same result when used to rotate a vector or node. | ||||
| 			*/ | ||||
| 			core::vector3d<T> getRotationDegrees() const; | ||||
|  | ||||
| @@ -827,11 +840,9 @@ namespace core | ||||
|  | ||||
| 	//! Returns the absolute values of the scales of the matrix. | ||||
| 	/** | ||||
| 	Note that this returns the absolute (positive) values unless only scale is set. | ||||
| 	Unfortunately it does not appear to be possible to extract any original negative | ||||
| 	values. The best that we could do would be to arbitrarily make one scale | ||||
| 	negative if one or three of them were negative. | ||||
| 	FIXME - return the original values. | ||||
| 	Note: You only get back original values if the matrix only set the scale. | ||||
| 	Otherwise the result is a scale you can use to normalize the matrix axes, | ||||
| 	but it's usually no longer what you did set with setScale. | ||||
| 	*/ | ||||
| 	template <class T> | ||||
| 	inline vector3d<T> CMatrix4<T>::getScale() const | ||||
| @@ -894,33 +905,16 @@ namespace core | ||||
| 	} | ||||
|  | ||||
|  | ||||
| 	//! Returns a rotation that is equivalent to that set by setRotationDegrees(). | ||||
| 	/** This code was sent in by Chev.  Note that it does not necessarily return | ||||
| 	the *same* Euler angles as those set by setRotationDegrees(), but the rotation will | ||||
| 	be equivalent, i.e. will have the same result when used to rotate a vector or node. | ||||
| 	This code was originally written by by Chev. | ||||
| 	//! Returns a rotation which (mostly) works in combination with the given scale | ||||
| 	/**  | ||||
| 	This code was originally written by by Chev (assuming no scaling back then,  | ||||
| 	we can be blamed for all problems added by regarding scale) | ||||
| 	*/ | ||||
| 	template <class T> | ||||
| 	inline core::vector3d<T> CMatrix4<T>::getRotationDegrees(const vector3d<T>& scale_) const | ||||
| 	{ | ||||
| 		const CMatrix4<T> &mat = *this; | ||||
| 		core::vector3d<T> scale(scale_); | ||||
| 		// we need to check for negative scale on to axes, which would bring up wrong results | ||||
| 		if (scale.Y<0 && scale.Z<0) | ||||
| 		{ | ||||
| 			scale.Y =-scale.Y; | ||||
| 			scale.Z =-scale.Z; | ||||
| 		} | ||||
| 		else if (scale.X<0 && scale.Z<0) | ||||
| 		{ | ||||
| 			scale.X =-scale.X; | ||||
| 			scale.Z =-scale.Z; | ||||
| 		} | ||||
| 		else if (scale.X<0 && scale.Y<0) | ||||
| 		{ | ||||
| 			scale.X =-scale.X; | ||||
| 			scale.Y =-scale.Y; | ||||
| 		} | ||||
| 		const core::vector3d<f64> scale(core::iszero(scale_.X) ? FLT_MAX : scale_.X , core::iszero(scale_.Y) ? FLT_MAX : scale_.Y, core::iszero(scale_.Z) ? FLT_MAX : scale_.Z); | ||||
| 		const core::vector3d<f64> invScale(core::reciprocal(scale.X),core::reciprocal(scale.Y),core::reciprocal(scale.Z)); | ||||
|  | ||||
| 		f64 Y = -asin(core::clamp(mat[2]*invScale.X, -1.0, 1.0)); | ||||
| @@ -929,7 +923,7 @@ namespace core | ||||
|  | ||||
| 		f64 rotx, roty, X, Z; | ||||
|  | ||||
| 		if (!core::iszero(C)) | ||||
| 		if (!core::iszero((T)C)) | ||||
| 		{ | ||||
| 			const f64 invC = core::reciprocal(C); | ||||
| 			rotx = mat[10] * invC * invScale.Z; | ||||
| @@ -956,14 +950,37 @@ namespace core | ||||
| 	} | ||||
|  | ||||
| 	//! Returns a rotation that is equivalent to that set by setRotationDegrees(). | ||||
| 	/** This code was sent in by Chev.  Note that it does not necessarily return | ||||
| 	the *same* Euler angles as those set by setRotationDegrees(), but the rotation will | ||||
| 	be equivalent, i.e. will have the same result when used to rotate a vector or node. | ||||
| 	This code was originally written by by Chev. */ | ||||
| 	template <class T> | ||||
| 	inline core::vector3d<T> CMatrix4<T>::getRotationDegrees() const | ||||
| 	{ | ||||
| 		return getRotationDegrees(getScale()); | ||||
| 		// Note: Using getScale() here make it look like it could do matrix decomposition.  | ||||
| 		// It can't! It works (or should work) as long as rotation doesn't flip the handedness  | ||||
| 		// aka scale swapping 1 or 3 axes. (I think we could catch that as well by comparing  | ||||
| 		// crossproduct of first 2 axes to direction of third axis, but TODO) | ||||
| 		// And maybe it should also offer the solution for the simple calculation  | ||||
| 		// without regarding scaling as Irrlicht did before 1.7 | ||||
| 		core::vector3d<T> scale(getScale()); | ||||
|  | ||||
| 		// We assume the matrix uses rotations instead of negative scaling 2 axes. | ||||
| 		// Otherwise it fails even for some simple cases, like rotating around  | ||||
| 		// 2 axes by 180<38> which getScale thinks is a negative scaling. | ||||
| 		if (scale.Y<0 && scale.Z<0) | ||||
| 		{ | ||||
| 			scale.Y =-scale.Y; | ||||
| 			scale.Z =-scale.Z; | ||||
| 		} | ||||
| 		else if (scale.X<0 && scale.Z<0) | ||||
| 		{ | ||||
| 			scale.X =-scale.X; | ||||
| 			scale.Z =-scale.Z; | ||||
| 		} | ||||
| 		else if (scale.X<0 && scale.Y<0) | ||||
| 		{ | ||||
| 			scale.X =-scale.X; | ||||
| 			scale.Y =-scale.Y; | ||||
| 		} | ||||
|  | ||||
| 		return getRotationDegrees(scale); | ||||
| 	} | ||||
|  | ||||
|  | ||||
| @@ -1155,10 +1172,10 @@ namespace core | ||||
| 	template <class T> | ||||
| 	inline void CMatrix4<T>::rotateVect( vector3df& vect ) const | ||||
| 	{ | ||||
| 		vector3df tmp = vect; | ||||
| 		vect.X = tmp.X*M[0] + tmp.Y*M[4] + tmp.Z*M[8]; | ||||
| 		vect.Y = tmp.X*M[1] + tmp.Y*M[5] + tmp.Z*M[9]; | ||||
| 		vect.Z = tmp.X*M[2] + tmp.Y*M[6] + tmp.Z*M[10]; | ||||
| 		vector3d<T> tmp(static_cast<T>(vect.X), static_cast<T>(vect.Y), static_cast<T>(vect.Z)); | ||||
| 		vect.X = static_cast<f32>(tmp.X*M[0] + tmp.Y*M[4] + tmp.Z*M[8]); | ||||
| 		vect.Y = static_cast<f32>(tmp.X*M[1] + tmp.Y*M[5] + tmp.Z*M[9]); | ||||
| 		vect.Z = static_cast<f32>(tmp.X*M[2] + tmp.Y*M[6] + tmp.Z*M[10]); | ||||
| 	} | ||||
|  | ||||
| 	//! An alternate transform vector method, writing into a second vector | ||||
| @@ -1182,24 +1199,24 @@ namespace core | ||||
| 	template <class T> | ||||
| 	inline void CMatrix4<T>::inverseRotateVect( vector3df& vect ) const | ||||
| 	{ | ||||
| 		vector3df tmp = vect; | ||||
| 		vect.X = tmp.X*M[0] + tmp.Y*M[1] + tmp.Z*M[2]; | ||||
| 		vect.Y = tmp.X*M[4] + tmp.Y*M[5] + tmp.Z*M[6]; | ||||
| 		vect.Z = tmp.X*M[8] + tmp.Y*M[9] + tmp.Z*M[10]; | ||||
| 		vector3d<T> tmp(static_cast<T>(vect.X), static_cast<T>(vect.Y), static_cast<T>(vect.Z)); | ||||
| 		vect.X = static_cast<f32>(tmp.X*M[0] + tmp.Y*M[1] + tmp.Z*M[2]); | ||||
| 		vect.Y = static_cast<f32>(tmp.X*M[4] + tmp.Y*M[5] + tmp.Z*M[6]); | ||||
| 		vect.Z = static_cast<f32>(tmp.X*M[8] + tmp.Y*M[9] + tmp.Z*M[10]); | ||||
| 	} | ||||
|  | ||||
| 	template <class T> | ||||
| 	inline void CMatrix4<T>::transformVect( vector3df& vect) const | ||||
| 	{ | ||||
| 		f32 vector[3]; | ||||
| 		T vector[3]; | ||||
|  | ||||
| 		vector[0] = vect.X*M[0] + vect.Y*M[4] + vect.Z*M[8] + M[12]; | ||||
| 		vector[1] = vect.X*M[1] + vect.Y*M[5] + vect.Z*M[9] + M[13]; | ||||
| 		vector[2] = vect.X*M[2] + vect.Y*M[6] + vect.Z*M[10] + M[14]; | ||||
|  | ||||
| 		vect.X = vector[0]; | ||||
| 		vect.Y = vector[1]; | ||||
| 		vect.Z = vector[2]; | ||||
| 		vect.X = static_cast<f32>(vector[0]); | ||||
| 		vect.Y = static_cast<f32>(vector[1]); | ||||
| 		vect.Z = static_cast<f32>(vector[2]); | ||||
| 	} | ||||
|  | ||||
| 	template <class T> | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
|  | ||||
| #include <string> | ||||
| #include <unordered_set> | ||||
| #include "IrrCompileConfig.h" | ||||
| #include "IrrCompileConfig.h" // for IRRLICHT_API | ||||
| #include "irrTypes.h" | ||||
| #include "IContextManager.h" | ||||
| #include <KHR/khrplatform.h> | ||||
|   | ||||
		Reference in New Issue
	
	Block a user