void draw2DImage(const video::ITexture* texture, const core::rect<s32>& destRect, const core::rect<s32>& sourceRect, const core::rect<s32>* clipRect, const video::SColor* const colors, bool useAlphaChannelOfTexture) { if (!irr_driver->isGLSL()) { irr_driver->getVideoDriver()->draw2DImage(texture, destRect, sourceRect, clipRect, colors, useAlphaChannelOfTexture); return; } float width, height, center_pos_x, center_pos_y, tex_width, tex_height, tex_center_pos_x, tex_center_pos_y; getSize(texture->getOriginalSize().Width, texture->getOriginalSize().Height, texture->isRenderTarget(), destRect, sourceRect, width, height, center_pos_x, center_pos_y, tex_width, tex_height, tex_center_pos_x, tex_center_pos_y); if (useAlphaChannelOfTexture) { glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); } else { glDisable(GL_BLEND); } if (clipRect) { if (!clipRect->isValid()) return; glEnable(GL_SCISSOR_TEST); const core::dimension2d<u32>& renderTargetSize = irr_driver->getVideoDriver()->getCurrentRenderTargetSize(); glScissor(clipRect->UpperLeftCorner.X, renderTargetSize.Height - clipRect->LowerRightCorner.Y, clipRect->getWidth(), clipRect->getHeight()); } if (colors) drawTexColoredQuad(texture, colors, width, height, center_pos_x, center_pos_y, tex_center_pos_x, tex_center_pos_y, tex_width, tex_height); else drawTexQuad(static_cast<const irr::video::COpenGLTexture*>(texture)->getOpenGLTextureName(), width, height, center_pos_x, center_pos_y, tex_center_pos_x, tex_center_pos_y, tex_width, tex_height); if (clipRect) glDisable(GL_SCISSOR_TEST); glUseProgram(0); glGetError(); }
// ---------------------------------------------------------------------------- void draw2DImage(const video::ITexture* texture, const core::rect<float>& destRect, const core::rect<s32>& sourceRect, const core::rect<s32>* clip_rect, const video::SColor* const colors, bool use_alpha_channel_of_texture, bool draw_translucently) { if (!CVS->isGLSL()) { core::rect<irr::s32> dest_rect (irr::s32(destRect.UpperLeftCorner.X), irr::s32(destRect.UpperLeftCorner.Y), irr::s32(destRect.LowerRightCorner.X), irr::s32(destRect.LowerRightCorner.Y)); irr_driver->getVideoDriver()->draw2DImage(texture, dest_rect, sourceRect, clip_rect, colors, use_alpha_channel_of_texture); return; } float width, height, center_pos_x, center_pos_y, tex_width, tex_height; float tex_center_pos_x, tex_center_pos_y; getSize(texture->getSize().Width, texture->getSize().Height, texture->isRenderTarget(), destRect, sourceRect, width, height, center_pos_x, center_pos_y, tex_width, tex_height, tex_center_pos_x, tex_center_pos_y); if (draw_translucently) { glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE); } else if (use_alpha_channel_of_texture) { glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); } else { glDisable(GL_BLEND); } if (clip_rect) { if (!clip_rect->isValid()) return; glEnable(GL_SCISSOR_TEST); const core::dimension2d<u32>& render_target_size = irr_driver->getActualScreenSize(); glScissor(clip_rect->UpperLeftCorner.X, render_target_size.Height - clip_rect->LowerRightCorner.Y, clip_rect->getWidth(), clip_rect->getHeight()); } if (colors) { drawTexColoredQuad(texture, colors, width, height, center_pos_x, center_pos_y, tex_center_pos_x, tex_center_pos_y, tex_width, tex_height); } else { drawTexQuad(texture->getOpenGLTextureName(), width, height, center_pos_x, center_pos_y, tex_center_pos_x, tex_center_pos_y, tex_width, tex_height); } if (clip_rect) glDisable(GL_SCISSOR_TEST); glUseProgram(0); glGetError(); } // draw2DImage
void draw2DImage(const video::ITexture* texture, const core::rect<s32>& destRect, const core::rect<s32>& sourceRect, const core::rect<s32>* clipRect, const video::SColor* const colors, bool useAlphaChannelOfTexture) { if (!irr_driver->isGLSL()) { irr_driver->getVideoDriver()->draw2DImage(texture, destRect, sourceRect, clipRect, colors, useAlphaChannelOfTexture); return; } core::dimension2d<u32> frame_size = irr_driver->getVideoDriver()->getCurrentRenderTargetSize(); const int screen_w = frame_size.Width; const int screen_h = frame_size.Height; float center_pos_x = destRect.UpperLeftCorner.X + destRect.LowerRightCorner.X; center_pos_x /= screen_w; center_pos_x -= 1.; float center_pos_y = destRect.UpperLeftCorner.Y + destRect.LowerRightCorner.Y; center_pos_y /= screen_h; center_pos_y = 1. - center_pos_y; float width = destRect.LowerRightCorner.X - destRect.UpperLeftCorner.X; width /= screen_w; float height = destRect.LowerRightCorner.Y - destRect.UpperLeftCorner.Y; height /= screen_h; const core::dimension2d<u32>& ss = texture->getOriginalSize(); float tex_center_pos_x = sourceRect.UpperLeftCorner.X + sourceRect.LowerRightCorner.X; tex_center_pos_x /= ss.Width * 2.; //tex_center_pos_x -= 1.; float tex_center_pos_y = sourceRect.UpperLeftCorner.Y + sourceRect.LowerRightCorner.Y; tex_center_pos_y /= ss.Height * 2.; //tex_center_pos_y -= 1.; float tex_width = sourceRect.LowerRightCorner.X - sourceRect.UpperLeftCorner.X; tex_width /= ss.Width * 2.; float tex_height = sourceRect.LowerRightCorner.Y - sourceRect.UpperLeftCorner.Y; tex_height /= ss.Height * 2.; if (texture->isRenderTarget()) { tex_height = - tex_height; } const f32 invW = 1.f / static_cast<f32>(ss.Width); const f32 invH = 1.f / static_cast<f32>(ss.Height); const core::rect<f32> tcoords( sourceRect.UpperLeftCorner.X * invW, sourceRect.UpperLeftCorner.Y * invH, sourceRect.LowerRightCorner.X * invW, sourceRect.LowerRightCorner.Y *invH); if (useAlphaChannelOfTexture) { glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); } else { glDisable(GL_BLEND); } if (colors) drawTexColoredQuad(texture, colors, width, height, center_pos_x, center_pos_y, tex_center_pos_x, tex_center_pos_y, tex_width, tex_height); else drawTexQuad(texture, width, height, center_pos_x, center_pos_y, tex_center_pos_x, tex_center_pos_y, tex_width, tex_height); glUseProgram(0); }