return code;\r
}\r
\r
-\r
-/*!\r
- Cohen Sutherland clipping\r
- @return: 1 if valid\r
-*/\r
-\r
-static int ClipLine(const AbsRectangle &clipping,\r
- core::position2d<s32> &p0,\r
- core::position2d<s32> &p1,\r
- const core::position2d<s32>& p0_in,\r
- const core::position2d<s32>& p1_in)\r
-{\r
- u32 code0;\r
- u32 code1;\r
- u32 code;\r
-\r
- p0 = p0_in;\r
- p1 = p1_in;\r
-\r
- code0 = GetClipCode( clipping, p0 );\r
- code1 = GetClipCode( clipping, p1 );\r
-\r
- // trivial accepted\r
- while ( code0 | code1 )\r
- {\r
- s32 x=0;\r
- s32 y=0;\r
-\r
- // trivial reject\r
- if ( code0 & code1 )\r
- return 0;\r
-\r
- if ( code0 )\r
- {\r
- // clip first point\r
- code = code0;\r
- }\r
- else\r
- {\r
- // clip last point\r
- code = code1;\r
- }\r
-\r
- if ( (code & CLIPCODE_BOTTOM) == CLIPCODE_BOTTOM )\r
- {\r
- // clip bottom viewport\r
- y = clipping.y1;\r
- x = p0.X + ( p1.X - p0.X ) * ( y - p0.Y ) / ( p1.Y - p0.Y );\r
- }\r
- else\r
- if ( (code & CLIPCODE_TOP) == CLIPCODE_TOP )\r
- {\r
- // clip to viewport\r
- y = clipping.y0;\r
- x = p0.X + ( p1.X - p0.X ) * ( y - p0.Y ) / ( p1.Y - p0.Y );\r
- }\r
- else\r
- if ( (code & CLIPCODE_RIGHT) == CLIPCODE_RIGHT )\r
- {\r
- // clip right viewport\r
- x = clipping.x1;\r
- y = p0.Y + ( p1.Y - p0.Y ) * ( x - p0.X ) / ( p1.X - p0.X );\r
- }\r
- else\r
- if ( (code & CLIPCODE_LEFT) == CLIPCODE_LEFT )\r
- {\r
- // clip left viewport\r
- x = clipping.x0;\r
- y = p0.Y + ( p1.Y - p0.Y ) * ( x - p0.X ) / ( p1.X - p0.X );\r
- }\r
-\r
- if ( code == code0 )\r
- {\r
- // modify first point\r
- p0.X = x;\r
- p0.Y = y;\r
- code0 = GetClipCode( clipping, p0 );\r
- }\r
- else\r
- {\r
- // modify second point\r
- p1.X = x;\r
- p1.Y = y;\r
- code1 = GetClipCode( clipping, p1 );\r
- }\r
- }\r
-\r
- return 1;\r
-}\r
-\r
/*\r
*/\r
inline void GetClip(AbsRectangle &clipping, video::IImage * t)\r
}\r
\r
\r
-/*\r
-*/\r
-static void RenderLine32_Decal(video::IImage *t,\r
- const core::position2d<s32> &p0,\r
- const core::position2d<s32> &p1,\r
- u32 argb )\r
-{\r
- s32 dx = p1.X - p0.X;\r
- s32 dy = p1.Y - p0.Y;\r
-\r
- s32 c;\r
- s32 m;\r
- s32 d = 0;\r
- s32 run;\r
-\r
- s32 xInc = 4;\r
- s32 yInc = (s32) t->getPitch();\r
-\r
- if ( dx < 0 )\r
- {\r
- xInc = -xInc;\r
- dx = -dx;\r
- }\r
-\r
- if ( dy < 0 )\r
- {\r
- yInc = -yInc;\r
- dy = -dy;\r
- }\r
-\r
- u32 *dst;\r
- dst = (u32*) ( (u8*) t->getData() + ( p0.Y * t->getPitch() ) + ( p0.X * 4 ) );\r
-\r
- if ( dy > dx )\r
- {\r
- s32 tmp;\r
- tmp = dx;\r
- dx = dy;\r
- dy = tmp;\r
- tmp = xInc;\r
- xInc = yInc;\r
- yInc = tmp;\r
- }\r
-\r
- c = dx << 1;\r
- m = dy << 1;\r
-\r
- run = dx;\r
- do\r
- {\r
- *dst = argb;\r
-\r
- dst = (u32*) ( (u8*) dst + xInc ); // x += xInc\r
- d += m;\r
- if ( d > dx )\r
- {\r
- dst = (u32*) ( (u8*) dst + yInc ); // y += yInc\r
- d -= c;\r
- }\r
- run -= 1;\r
- } while (run>=0);\r
-}\r
-\r
-\r
-/*\r
-*/\r
-static void RenderLine32_Blend(video::IImage *t,\r
- const core::position2d<s32> &p0,\r
- const core::position2d<s32> &p1,\r
- u32 argb, u32 alpha)\r
-{\r
- s32 dx = p1.X - p0.X;\r
- s32 dy = p1.Y - p0.Y;\r
-\r
- s32 c;\r
- s32 m;\r
- s32 d = 0;\r
- s32 run;\r
-\r
- s32 xInc = 4;\r
- s32 yInc = (s32) t->getPitch();\r
-\r
- if ( dx < 0 )\r
- {\r
- xInc = -xInc;\r
- dx = -dx;\r
- }\r
-\r
- if ( dy < 0 )\r
- {\r
- yInc = -yInc;\r
- dy = -dy;\r
- }\r
-\r
- u32 *dst;\r
- dst = (u32*) ( (u8*) t->getData() + ( p0.Y * t->getPitch() ) + ( p0.X * 4 ) );\r
-\r
- if ( dy > dx )\r
- {\r
- s32 tmp;\r
- tmp = dx;\r
- dx = dy;\r
- dy = tmp;\r
- tmp = xInc;\r
- xInc = yInc;\r
- yInc = tmp;\r
- }\r
-\r
- c = dx << 1;\r
- m = dy << 1;\r
-\r
- run = dx;\r
- const u32 packA = packAlpha ( alpha );\r
- do\r
- {\r
- *dst = packA | PixelBlend32( *dst, argb, alpha );\r
-\r
- dst = (u32*) ( (u8*) dst + xInc ); // x += xInc\r
- d += m;\r
- if ( d > dx )\r
- {\r
- dst = (u32*) ( (u8*) dst + yInc ); // y += yInc\r
- d -= c;\r
- }\r
- run -= 1;\r
- } while (run>=0);\r
-}\r
-\r
-/*\r
-*/\r
-static void RenderLine16_Decal(video::IImage *t,\r
- const core::position2d<s32> &p0,\r
- const core::position2d<s32> &p1,\r
- u32 argb )\r
-{\r
- s32 dx = p1.X - p0.X;\r
- s32 dy = p1.Y - p0.Y;\r
-\r
- s32 c;\r
- s32 m;\r
- s32 d = 0;\r
- s32 run;\r
-\r
- s32 xInc = 2;\r
- s32 yInc = (s32) t->getPitch();\r
-\r
- if ( dx < 0 )\r
- {\r
- xInc = -xInc;\r
- dx = -dx;\r
- }\r
-\r
- if ( dy < 0 )\r
- {\r
- yInc = -yInc;\r
- dy = -dy;\r
- }\r
-\r
- u16 *dst;\r
- dst = (u16*) ( (u8*) t->getData() + ( p0.Y * t->getPitch() ) + ( p0.X * 2 ) );\r
-\r
- if ( dy > dx )\r
- {\r
- s32 tmp;\r
- tmp = dx;\r
- dx = dy;\r
- dy = tmp;\r
- tmp = xInc;\r
- xInc = yInc;\r
- yInc = tmp;\r
- }\r
-\r
- c = dx << 1;\r
- m = dy << 1;\r
-\r
- run = dx;\r
- do\r
- {\r
- *dst = (u16)argb;\r
-\r
- dst = (u16*) ( (u8*) dst + xInc ); // x += xInc\r
- d += m;\r
- if ( d > dx )\r
- {\r
- dst = (u16*) ( (u8*) dst + yInc ); // y += yInc\r
- d -= c;\r
- }\r
- run -= 1;\r
- } while (run>=0);\r
-}\r
-\r
-/*\r
-*/\r
-static void RenderLine16_Blend(video::IImage *t,\r
- const core::position2d<s32> &p0,\r
- const core::position2d<s32> &p1,\r
- u16 argb,\r
- u16 alpha)\r
-{\r
- s32 dx = p1.X - p0.X;\r
- s32 dy = p1.Y - p0.Y;\r
-\r
- s32 c;\r
- s32 m;\r
- s32 d = 0;\r
- s32 run;\r
-\r
- s32 xInc = 2;\r
- s32 yInc = (s32) t->getPitch();\r
-\r
- if ( dx < 0 )\r
- {\r
- xInc = -xInc;\r
- dx = -dx;\r
- }\r
-\r
- if ( dy < 0 )\r
- {\r
- yInc = -yInc;\r
- dy = -dy;\r
- }\r
-\r
- u16 *dst;\r
- dst = (u16*) ( (u8*) t->getData() + ( p0.Y * t->getPitch() ) + ( p0.X * 2 ) );\r
-\r
- if ( dy > dx )\r
- {\r
- s32 tmp;\r
- tmp = dx;\r
- dx = dy;\r
- dy = tmp;\r
- tmp = xInc;\r
- xInc = yInc;\r
- yInc = tmp;\r
- }\r
-\r
- c = dx << 1;\r
- m = dy << 1;\r
-\r
- run = dx;\r
- const u16 packA = alpha ? 0x8000 : 0;\r
- do\r
- {\r
- *dst = packA | PixelBlend16( *dst, argb, alpha );\r
-\r
- dst = (u16*) ( (u8*) dst + xInc ); // x += xInc\r
- d += m;\r
- if ( d > dx )\r
- {\r
- dst = (u16*) ( (u8*) dst + yInc ); // y += yInc\r
- d -= c;\r
- }\r
- run -= 1;\r
- } while (run>=0);\r
-}\r
-\r
-\r
/*!\r
*/\r
static void executeBlit_TextureCopy_x_to_x( const SBlitJob * job )\r
}\r
#endif\r
\r
-// Methods for Software drivers\r
-//! draws a rectangle\r
-static void drawRectangle(video::IImage* img, const core::rect<s32>& rect, const video::SColor &color)\r
-{\r
- Blit(color.getAlpha() == 0xFF ? BLITTER_COLOR : BLITTER_COLOR_ALPHA,\r
- img, 0, &rect.UpperLeftCorner, 0, &rect, color.color);\r
-}\r
-\r
-\r
-//! draws a line from to with color\r
-static void drawLine(video::IImage* img, const core::position2d<s32>& from,\r
- const core::position2d<s32>& to, const video::SColor &color)\r
-{\r
- AbsRectangle clip;\r
- GetClip(clip, img);\r
-\r
- core::position2d<s32> p[2];\r
- if (ClipLine( clip, p[0], p[1], from, to))\r
- {\r
- u32 alpha = extractAlpha(color.color);\r
-\r
- switch(img->getColorFormat())\r
- {\r
- case video::ECF_A1R5G5B5:\r
- if (alpha == 256)\r
- {\r
- RenderLine16_Decal(img, p[0], p[1], video::A8R8G8B8toA1R5G5B5(color.color));\r
- }\r
- else\r
- {\r
- RenderLine16_Blend(img, p[0], p[1], video::A8R8G8B8toA1R5G5B5(color.color), alpha >> 3);\r
- }\r
- break;\r
- case video::ECF_A8R8G8B8:\r
- if (alpha == 256)\r
- {\r
- RenderLine32_Decal(img, p[0], p[1], color.color);\r
- }\r
- else\r
- {\r
- RenderLine32_Blend(img, p[0], p[1], color.color, alpha);\r
- }\r
- break;\r
- default:\r
- break;\r
- }\r
- }\r
-}\r
-\r
-\r
}\r
\r
#endif\r
COpenGLDriver::COpenGLDriver(const SIrrlichtCreationParameters& params, io::IFileSystem* io, IContextManager* contextManager)\r
: CNullDriver(io, params.WindowSize), COpenGLExtensionHandler(), CacheHandler(0), CurrentRenderMode(ERM_NONE), ResetRenderStates(true),\r
Transformation3DChanged(true), AntiAlias(params.AntiAlias), ColorFormat(ECF_R8G8B8), FixedPipelineState(EOFPS_ENABLE), Params(params),\r
- ContextManager(contextManager),\r
-#if defined(_IRR_COMPILE_WITH_WINDOWS_DEVICE_)\r
- DeviceType(EIDT_WIN32)\r
-#elif defined(_IRR_COMPILE_WITH_X11_DEVICE_)\r
- DeviceType(EIDT_X11)\r
-#else\r
- DeviceType(EIDT_OSX)\r
-#endif\r
+ ContextManager(contextManager)\r
{\r
#ifdef _DEBUG\r
setDebugName("COpenGLDriver");\r
: CNullDriver(io, params.WindowSize), COpenGLExtensionHandler(), CacheHandler(0),\r
CurrentRenderMode(ERM_NONE), ResetRenderStates(true), Transformation3DChanged(true),\r
AntiAlias(params.AntiAlias), ColorFormat(ECF_R8G8B8), FixedPipelineState(EOFPS_ENABLE),\r
- Params(params), SDLDevice(device), ContextManager(0), DeviceType(EIDT_SDL)\r
+ Params(params), SDLDevice(device), ContextManager(0)\r
{\r
#ifdef _DEBUG\r
setDebugName("COpenGLDriver");\r