| 363 | } |
| 364 | |
| 365 | void TileNode::render() { |
| 366 | if (_tileQuads.empty()) { |
| 367 | Node::render(); |
| 368 | return; |
| 369 | } |
| 370 | |
| 371 | if (_flags.isOn(TileNode::VertexPosDirty)) { |
| 372 | _flags.setOff(TileNode::VertexPosDirty); |
| 373 | for (auto& tileQuad : _tileQuads) { |
| 374 | tileQuad.vertexPosDirty = true; |
| 375 | } |
| 376 | } |
| 377 | |
| 378 | std::vector<TileQuad*> tileQuads; |
| 379 | tileQuads.reserve(_tileQuads.size()); |
| 380 | if (SharedDirector.isFrustumCulling()) { |
| 381 | for (auto& tileQuad : _tileQuads) { |
| 382 | float minX = tileQuad.positions[0].lb.x; |
| 383 | float minY = tileQuad.positions[0].lb.y; |
| 384 | float maxX = tileQuad.positions[0].rt.x; |
| 385 | float maxY = tileQuad.positions[0].rt.y; |
| 386 | for (size_t i = 1; i < tileQuad.positions.size(); i++) { |
| 387 | const SpriteQuad::Position& quadPos = tileQuad.positions[i]; |
| 388 | minX = std::min(minX, quadPos.lb.x); |
| 389 | minY = std::min(minY, quadPos.lb.y); |
| 390 | maxX = std::max(maxX, quadPos.rt.x); |
| 391 | maxY = std::max(maxY, quadPos.rt.y); |
| 392 | } |
| 393 | AABB aabb; |
| 394 | Matrix::mulAABB(aabb, getWorld(), { |
| 395 | {minX, minY, 0}, |
| 396 | {maxX, maxY, 0}, |
| 397 | }); |
| 398 | if (SharedDirector.isInFrustum(aabb)) { |
| 399 | tileQuads.push_back(&tileQuad); |
| 400 | } |
| 401 | } |
| 402 | } else { |
| 403 | for (auto& tileQuad : _tileQuads) { |
| 404 | tileQuads.push_back(&tileQuad); |
| 405 | } |
| 406 | } |
| 407 | |
| 408 | if (tileQuads.empty()) { |
| 409 | Node::render(); |
| 410 | return; |
| 411 | } |
| 412 | |
| 413 | Matrix transform; |
| 414 | bool transformInit = false; |
| 415 | for (auto tileQuad : tileQuads) { |
| 416 | if (tileQuad->vertexPosDirty) { |
| 417 | tileQuad->vertexPosDirty = false; |
| 418 | if (!transformInit) { |
| 419 | transformInit = true; |
| 420 | Matrix::mulMtx(transform, SharedDirector.getViewProjection(), getWorld()); |
| 421 | } |
| 422 | for (auto i = 0u; i < tileQuad->quads.size(); ++i) { |
nothing calls this directly
no test coverage detected