int EditorScreen::GetHoveredSegement(sf::Vector2<int> mousePos, int layer) { int hoveredSegment = -1; for (int i = 0; i < map->mapSeg.size(); i++) { if (map->mapSeg[i]->layer == layer) { sf::Rect<float> dRect( (map->mapSeg[i]->position.x - (scroll.x * map->layers[layer]->scale)), (map->mapSeg[i]->position.y - (scroll.y * map->layers[layer]->scale)), (map->segDef[map->mapSeg[i]->segmentIndex]->width * map->mapSeg[i]->scale.x), (map->segDef[map->mapSeg[i]->segmentIndex]->height * map->mapSeg[i]->scale.y)); float c = cos(-map->mapSeg[i]->rotation * M_PI / 180); float s = sin(-map->mapSeg[i]->rotation * M_PI / 180); float rotatedX = dRect.left + c * (mousePos.x - dRect.left) - s * (mousePos.y - dRect.top); float rotatedY = dRect.top + s * (mousePos.x - dRect.left) + c * (mousePos.y - dRect.top); float leftX = dRect.left - dRect.width / 2; float rightX = dRect.left + dRect.width / 2; float topY = dRect.top - dRect.height / 2; float bottomY = dRect.top + dRect.height / 2; if (leftX <= rotatedX && rotatedX <= rightX && topY <= rotatedY && rotatedY <= bottomY) { hoveredSegment = i; } } } return hoveredSegment; }
//--------------------------------------------------------------------- void TerrainLayerBlendMap::blit(const PixelBox &src, const Box &dstBox) { const PixelBox* srcBox = &src; if (srcBox->getWidth() != dstBox.getWidth() || srcBox->getHeight() != dstBox.getHeight()) { // we need to rescale src to dst size first (also confvert format) void* tmpData = OGRE_MALLOC(dstBox.getWidth() * dstBox.getHeight(), MEMCATEGORY_GENERAL); srcBox = OGRE_NEW PixelBox(dstBox.getWidth(), dstBox.getHeight(), 1, PF_L8, tmpData); Image::scale(src, *srcBox); } // pixel conversion PixelBox dstMemBox(dstBox, PF_L8, mData); PixelUtil::bulkPixelConversion(*srcBox, dstMemBox); if (srcBox != &src) { // free temp OGRE_FREE(srcBox->data, MEMCATEGORY_GENERAL); OGRE_DELETE srcBox; srcBox = 0; } Rect dRect(dstBox.left, dstBox.top, dstBox.right, dstBox.bottom); dirtyRect(dRect); }
void QDirectFbBlitter::drawPixmapOpacity(const QRectF &rect, const QPixmap &pixmap, const QRectF &subrect, QPainter::CompositionMode cmode, qreal opacity) { QRect sQRect = subrect.toRect(); QRect dQRect = rect.toRect(); DFBRectangle sRect(sQRect.x(), sQRect.y(), sQRect.width(), sQRect.height()); DFBRectangle dRect(dQRect.x(), dQRect.y(), dQRect.width(), dQRect.height()); DFBResult result; // skip if dst too small if ((dRect.w <= 0) || (dRect.h <= 0)) return; // correct roundings if needed if (sRect.w <= 0) sRect.w = 1; if (sRect.h <= 0) sRect.h = 1; QDirectFbBlitterPlatformPixmap *blitPm = static_cast<QDirectFbBlitterPlatformPixmap *>(pixmap.handle()); QDirectFbBlitter *dfbBlitter = static_cast<QDirectFbBlitter *>(blitPm->blittable()); dfbBlitter->unlock(); IDirectFBSurface *s = dfbBlitter->m_surface.data(); DFBSurfaceBlittingFlags blittingFlags = DFBSurfaceBlittingFlags(DSBLIT_BLEND_ALPHACHANNEL); DFBSurfacePorterDuffRule porterDuff = (cmode == QPainter::CompositionMode_SourceOver) ? DSPD_SRC_OVER : DSPD_SRC; if (opacity != 1.0) { blittingFlags = DFBSurfaceBlittingFlags(blittingFlags | DSBLIT_BLEND_COLORALPHA | (m_premult ? DSBLIT_SRC_PREMULTCOLOR : 0)); m_surface->SetColor(m_surface.data(), 0xff, 0xff, 0xff, (u8) (opacity * 255.0)); } m_surface->SetBlittingFlags(m_surface.data(), DFBSurfaceBlittingFlags(blittingFlags)); m_surface->SetPorterDuff(m_surface.data(), porterDuff); if (cmode == QPainter::CompositionMode_SourceOver) m_surface->SetDstBlendFunction(m_surface.data(), DSBF_INVSRCALPHA); if ((sRect.w == dRect.w) && (sRect.h == dRect.h)) { result = m_surface->Blit(m_surface.data(), s, &sRect, dRect.x, dRect.y); if (result != DFB_OK) DirectFBError("QDirectFBBlitter::drawPixmapOpacity()", result); if (m_debugPaint) drawDebugRect(QRect(dRect.x, dRect.y, sRect.w, sRect.h), QColor(Qt::green)); } else { result = m_surface->StretchBlit(m_surface.data(), s, &sRect, &dRect); if (result != DFB_OK) DirectFBError("QDirectFBBlitter::drawPixmapOpacity()", result); if (m_debugPaint) drawDebugRect(QRect(dRect.x, dRect.y, dRect.w, dRect.h), QColor(Qt::red)); } }
void GSDevice11::DoShadeBoost(GSTexture* sTex, GSTexture* dTex) { GSVector2i s = dTex->GetSize(); GSVector4 sRect(0, 0, 1, 1); GSVector4 dRect(0, 0, s.x, s.y); ShadeBoostConstantBuffer cb; cb.rcpFrame = GSVector4(1.0f / s.x, 1.0f / s.y, 0.0f, 0.0f); cb.rcpFrameOpt = GSVector4::zero(); m_ctx->UpdateSubresource(m_shadeboost.cb, 0, NULL, &cb, 0, 0); StretchRect(sTex, sRect, dTex, dRect, m_shadeboost.ps, m_shadeboost.cb, true); }
void GSDevice11::DoInterlace(GSTexture* sTex, GSTexture* dTex, int shader, bool linear, float yoffset) { GSVector4 s = GSVector4(dTex->GetSize()); GSVector4 sRect(0, 0, 1, 1); GSVector4 dRect(0.0f, yoffset, s.x, s.y + yoffset); InterlaceConstantBuffer cb; cb.ZrH = GSVector2(0, 1.0f / s.y); cb.hH = s.y / 2; m_ctx->UpdateSubresource(m_interlace.cb, 0, NULL, &cb, 0, 0); StretchRect(sTex, sRect, dTex, dRect, m_interlace.ps[shader], m_interlace.cb, linear); }
void Renderer::renderTileMap(novus::world::TileMap* tileMap) { sf::Texture* sfTexture = renderUtils->getTileset(tileMap->tileset); sf::IntRect viewport = renderUtils->getRenderWindow()->getViewport(renderUtils->getRenderWindow()->getView()); sf::IntRect dRect (0, 0, 32, 32); for (int y = 0; y < tileMap->height; y++) { for (int x = 0; x < tileMap->width; x++) { dRect.left = x * 32; dRect.top = y * 32; if (viewport.intersects(dRect)) { novus::world::Tile* tile = &tileMap->tiles[y * tileMap->width + x]; if (tile->texture < 0) { continue; } sf::IntRect sRect = sf::IntRect(tile->texture % 8 * 32, tile->texture / 8 * 32, 32, 32); renderTexture(sfTexture, dRect, sRect); } } } }
void GSDevice::ShadeBoost() { GSVector2i s = m_current->GetSize(); if(m_shadeboost == NULL || m_shadeboost->GetSize() != s) { delete m_shadeboost; m_shadeboost = CreateRenderTarget(s.x, s.y, false); } if(m_shadeboost != NULL) { GSVector4 sRect(0, 0, 1, 1); GSVector4 dRect(0, 0, s.x, s.y); StretchRect(m_current, sRect, m_shadeboost, dRect, 0, false); DoShadeBoost(m_shadeboost, m_current); } }
void GSDevice::FXAA() { GSVector2i s = m_current->GetSize(); if(m_fxaa == NULL || m_fxaa->GetSize() != s) { delete m_fxaa; m_fxaa = CreateRenderTarget(s.x, s.y, false); } if(m_fxaa != NULL) { GSVector4 sRect(0, 0, 1, 1); GSVector4 dRect(0, 0, s.x, s.y); StretchRect(m_current, sRect, m_fxaa, dRect, 7, false); DoFXAA(m_fxaa, m_current); } }
void GSDevice::ExternalFX() { GSVector2i s = m_current->GetSize(); if (m_shaderfx == NULL || m_shaderfx->GetSize() != s) { delete m_shaderfx; m_shaderfx = CreateRenderTarget(s.x, s.y, false); } if (m_shaderfx != NULL) { GSVector4 sRect(0, 0, 1, 1); GSVector4 dRect(0, 0, s.x, s.y); StretchRect(m_current, sRect, m_shaderfx, dRect, 7, false); DoExternalFX(m_shaderfx, m_current); } }
void GSDevice11::DoExternalFX(GSTexture* sTex, GSTexture* dTex) { GSVector2i s = dTex->GetSize(); GSVector4 sRect(0, 0, 1, 1); GSVector4 dRect(0, 0, s.x, s.y); ExternalFXConstantBuffer cb; InitExternalFX(); cb.xyFrame = GSVector2((float)s.x, (float)s.y); cb.rcpFrame = GSVector4(1.0f / (float)s.x, 1.0f / (float)s.y, 0.0f, 0.0f); cb.rcpFrameOpt = GSVector4::zero(); m_ctx->UpdateSubresource(m_shaderfx.cb, 0, NULL, &cb, 0, 0); StretchRect(sTex, sRect, dTex, dRect, m_shaderfx.ps, m_shaderfx.cb, true); }
void GSDevice11::DoFXAA(GSTexture* sTex, GSTexture* dTex) { GSVector2i s = dTex->GetSize(); GSVector4 sRect(0, 0, 1, 1); GSVector4 dRect(0, 0, s.x, s.y); FXAAConstantBuffer cb; InitFXAA(); cb.rcpFrame = GSVector4(1.0f / s.x, 1.0f / s.y, 0.0f, 0.0f); cb.rcpFrameOpt = GSVector4::zero(); m_ctx->UpdateSubresource(m_fxaa.cb, 0, NULL, &cb, 0, 0); StretchRect(sTex, sRect, dTex, dRect, m_fxaa.ps, m_fxaa.cb, true); //sTex->Save("c:\\temp1\\1.bmp"); //dTex->Save("c:\\temp1\\2.bmp"); }
GSTexture* GSDevice11::CopyOffscreen(GSTexture* src, const GSVector4& sRect, int w, int h, int format, int ps_shader) { GSTexture* dst = NULL; if(format == 0) { format = DXGI_FORMAT_R8G8B8A8_UNORM; } if(format != DXGI_FORMAT_R8G8B8A8_UNORM && format != DXGI_FORMAT_R16_UINT) { ASSERT(0); return false; } if(GSTexture* rt = CreateRenderTarget(w, h, false, format)) { GSVector4 dRect(0, 0, w, h); if(GSTexture* src2 = src->IsMSAA() ? Resolve(src) : src) { StretchRect(src2, sRect, rt, dRect, m_convert.ps[format == DXGI_FORMAT_R16_UINT ? 1 : 0], NULL); if(src2 != src) Recycle(src2); } dst = CreateOffscreen(w, h, format); if(dst) { m_ctx->CopyResource(*(GSTexture11*)dst, *(GSTexture11*)rt); } Recycle(rt); } return dst; }