| 368 | } |
| 369 | |
| 370 | void CRenderMap::ForceRenderQuads(CQuad *pQuads, int NumQuads, int RenderFlags, IEnvelopeEval *pEnvEval, float Alpha) |
| 371 | { |
| 372 | Graphics()->TrianglesBegin(); |
| 373 | float Conv = 1 / 255.0f; |
| 374 | for(int i = 0; i < NumQuads; i++) |
| 375 | { |
| 376 | CQuad *pQuad = &pQuads[i]; |
| 377 | |
| 378 | ColorRGBA Color = ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f); |
| 379 | pEnvEval->EnvelopeEval(pQuad->m_ColorEnvOffset, pQuad->m_ColorEnv, Color, 4); |
| 380 | |
| 381 | if(Color.a <= 0.0f) |
| 382 | continue; |
| 383 | |
| 384 | bool Opaque = false; |
| 385 | /* TODO: Analyze quadtexture |
| 386 | if(a < 0.01f || (q->m_aColors[0].a < 0.01f && q->m_aColors[1].a < 0.01f && q->m_aColors[2].a < 0.01f && q->m_aColors[3].a < 0.01f)) |
| 387 | Opaque = true; |
| 388 | */ |
| 389 | if(Opaque && !(RenderFlags & LAYERRENDERFLAG_OPAQUE)) |
| 390 | continue; |
| 391 | if(!Opaque && !(RenderFlags & LAYERRENDERFLAG_TRANSPARENT)) |
| 392 | continue; |
| 393 | |
| 394 | Graphics()->QuadsSetSubsetFree( |
| 395 | fx2f(pQuad->m_aTexcoords[0].x), fx2f(pQuad->m_aTexcoords[0].y), |
| 396 | fx2f(pQuad->m_aTexcoords[1].x), fx2f(pQuad->m_aTexcoords[1].y), |
| 397 | fx2f(pQuad->m_aTexcoords[2].x), fx2f(pQuad->m_aTexcoords[2].y), |
| 398 | fx2f(pQuad->m_aTexcoords[3].x), fx2f(pQuad->m_aTexcoords[3].y)); |
| 399 | |
| 400 | ColorRGBA Position = ColorRGBA(0.0f, 0.0f, 0.0f, 0.0f); |
| 401 | pEnvEval->EnvelopeEval(pQuad->m_PosEnvOffset, pQuad->m_PosEnv, Position, 3); |
| 402 | const vec2 Offset = vec2(Position.r, Position.g); |
| 403 | const float Rotation = Position.b / 180.0f * pi; |
| 404 | |
| 405 | IGraphics::CColorVertex Array[4] = { |
| 406 | IGraphics::CColorVertex(0, pQuad->m_aColors[0].r * Conv * Color.r, pQuad->m_aColors[0].g * Conv * Color.g, pQuad->m_aColors[0].b * Conv * Color.b, pQuad->m_aColors[0].a * Conv * Color.a * Alpha), |
| 407 | IGraphics::CColorVertex(1, pQuad->m_aColors[1].r * Conv * Color.r, pQuad->m_aColors[1].g * Conv * Color.g, pQuad->m_aColors[1].b * Conv * Color.b, pQuad->m_aColors[1].a * Conv * Color.a * Alpha), |
| 408 | IGraphics::CColorVertex(2, pQuad->m_aColors[2].r * Conv * Color.r, pQuad->m_aColors[2].g * Conv * Color.g, pQuad->m_aColors[2].b * Conv * Color.b, pQuad->m_aColors[2].a * Conv * Color.a * Alpha), |
| 409 | IGraphics::CColorVertex(3, pQuad->m_aColors[3].r * Conv * Color.r, pQuad->m_aColors[3].g * Conv * Color.g, pQuad->m_aColors[3].b * Conv * Color.b, pQuad->m_aColors[3].a * Conv * Color.a * Alpha)}; |
| 410 | Graphics()->SetColorVertex(Array, 4); |
| 411 | |
| 412 | CPoint *pPoints = pQuad->m_aPoints; |
| 413 | |
| 414 | CPoint aRotated[4]; |
| 415 | if(Rotation != 0.0f) |
| 416 | { |
| 417 | for(size_t p = 0; p < std::size(aRotated); ++p) |
| 418 | { |
| 419 | aRotated[p] = pQuad->m_aPoints[p]; |
| 420 | Rotate(&pQuad->m_aPoints[4], &aRotated[p], Rotation); |
| 421 | } |
| 422 | pPoints = aRotated; |
| 423 | } |
| 424 | |
| 425 | IGraphics::CFreeformItem Freeform( |
| 426 | fx2f(pPoints[0].x) + Offset.x, fx2f(pPoints[0].y) + Offset.y, |
| 427 | fx2f(pPoints[1].x) + Offset.x, fx2f(pPoints[1].y) + Offset.y, |
no test coverage detected