Showing the changes to libraries/render-utils/src/GeometryCache.cpp (1 of 3 files). Show all
Unified · Split
| @@ -22,17 +22,19 @@ · 21 unmodified lines | |||
| 22 | #include "TextureCache.h" | 22 | #include "TextureCache.h" |
| 23 | #include "RenderUtilsLogging.h" | 23 | #include "RenderUtilsLogging.h" |
| 24 | 24 | ||
| 25 | #include "standardTransformPNTC_vert.h" | ||
| 26 | #include "standardDrawTexture_frag.h" | ||
| 27 | |||
| 28 | #include "gpu/StandardShaderLib.h" | 25 | #include "gpu/StandardShaderLib.h" |
| 29 | 26 | ||
| 30 | #include "model/TextureMap.h" | 27 | #include "model/TextureMap.h" |
| 31 | 28 | ||
| 29 | #include "standardTransformPNTC_vert.h" | ||
| 30 | #include "standardDrawTexture_frag.h" | ||
| 31 | |||
| 32 | #include "simple_vert.h" | 32 | #include "simple_vert.h" |
| 33 | #include "simple_textured_frag.h" | 33 | #include "simple_textured_frag.h" |
| 34 | #include "simple_textured_emisive_frag.h" | 34 | #include "simple_textured_emisive_frag.h" |
| 35 | 35 | ||
| 36 | #include "grid_frag.h" | ||
| 37 | |||
| 36 | //#define WANT_DEBUG | 38 | //#define WANT_DEBUG |
| 37 | 39 | ||
| 38 | const int GeometryCache::UNKNOWN_ID = -1; | 40 | const int GeometryCache::UNKNOWN_ID = -1; |
| @@ -564,186 +566,42 @@ void GeometryCache::renderWireSphere(gpu::Batch& batch) { · 525 unmodified lines | |||
| 564 | renderWireShape(batch, Sphere); | 566 | renderWireShape(batch, Sphere); |
| 565 | } | 567 | } |
| 566 | 568 | ||
| 569 | void GeometryCache::renderGrid(gpu::Batch& batch, | ||
| 570 | const glm::vec2& minCorner, const glm::vec2& maxCorner, | ||
| 571 | int rows, int cols, const glm::vec4& color, float edge, int id) { | ||
| 572 | static const glm::vec2 minTexCoord(0.0f, 1.0f); | ||
| 573 | static const glm::vec2 maxTexCoord(1.0f, 0.0f); | ||
| 567 | 574 | ||
| 568 | void GeometryCache::renderGrid(gpu::Batch& batch, int xDivisions, int yDivisions, const glm::vec4& color) { | ||
| 569 | IntPair key(xDivisions, yDivisions); | ||
| 570 | Vec3Pair colorKey(glm::vec3(color.x, color.y, yDivisions), glm::vec3(color.z, color.y, xDivisions)); | ||
| 571 | |||
| 572 | int vertices = (xDivisions + 1 + yDivisions + 1) * 2; | ||
| 573 | if (!_gridBuffers.contains(key)) { | ||
| 574 | auto verticesBuffer = std::make_shared<gpu::Buffer>(); | ||
| 575 | |||
| 576 | float* vertexData = new float[vertices * 2]; | ||
| 577 | float* vertex = vertexData; | ||
| 578 | |||
| 579 | for (int i = 0; i <= xDivisions; i++) { | ||
| 580 | float x = (float)i / xDivisions; | ||
| 581 | |||
| 582 | *(vertex++) = x; | ||
| 583 | *(vertex++) = 0.0f; | ||
| 584 | |||
| 585 | *(vertex++) = x; | ||
| 586 | *(vertex++) = 1.0f; | ||
| 587 | } | ||
| 588 | for (int i = 0; i <= yDivisions; i++) { | ||
| 589 | float y = (float)i / yDivisions; | ||
| 590 | |||
| 591 | *(vertex++) = 0.0f; | ||
| 592 | *(vertex++) = y; | ||
| 593 | |||
| 594 | *(vertex++) = 1.0f; | ||
| 595 | *(vertex++) = y; | ||
| 596 | } | ||
| 597 | |||
| 598 | verticesBuffer->append(sizeof(float) * vertices * 2, (gpu::Byte*) vertexData); | ||
| 599 | delete[] vertexData; | ||
| 600 | |||
| 601 | _gridBuffers[key] = verticesBuffer; | ||
| 602 | } | ||
| 603 | |||
| 604 | if (!_gridColors.contains(colorKey)) { | ||
| 605 | auto colorBuffer = std::make_shared<gpu::Buffer>(); | ||
| 606 | _gridColors[colorKey] = colorBuffer; | ||
| 607 | |||
| 608 | int compactColor = ((int(color.x * 255.0f) & 0xFF)) | | ||
| 609 | ((int(color.y * 255.0f) & 0xFF) << 8) | | ||
| 610 | ((int(color.z * 255.0f) & 0xFF) << 16) | | ||
| 611 | ((int(color.w * 255.0f) & 0xFF) << 24); | ||
| 612 | |||
| 613 | int* colorData = new int[vertices]; | ||
| 614 | int* colorDataAt = colorData; | ||
| 615 | |||
| 616 | for(int v = 0; v < vertices; v++) { | ||
| 617 | *(colorDataAt++) = compactColor; | ||
| 618 | } | ||
| 619 | |||
| 620 | colorBuffer->append(sizeof(int) * vertices, (gpu::Byte*) colorData); | ||
| 621 | delete[] colorData; | ||
| 622 | } | ||
| 623 | gpu::BufferPointer verticesBuffer = _gridBuffers[key]; | ||
| 624 | gpu::BufferPointer colorBuffer = _gridColors[colorKey]; | ||
| 625 | |||
| 626 | const int VERTICES_SLOT = 0; | ||
| 627 | const int COLOR_SLOT = 1; | ||
| 628 | auto streamFormat = std::make_shared<gpu::Stream::Format>(); // 1 for everyone | ||
| 629 | |||
| 630 | streamFormat->setAttribute(gpu::Stream::POSITION, VERTICES_SLOT, gpu::Element(gpu::VEC2, gpu::FLOAT, gpu::XYZ), 0); | ||
| 631 | streamFormat->setAttribute(gpu::Stream::COLOR, COLOR_SLOT, gpu::Element(gpu::VEC4, gpu::NUINT8, gpu::RGBA)); | ||
| 632 | |||
| 633 | gpu::BufferView verticesView(verticesBuffer, 0, verticesBuffer->getSize(), streamFormat->getAttributes().at(gpu::Stream::POSITION)._element); | ||
| 634 | gpu::BufferView colorView(colorBuffer, streamFormat->getAttributes().at(gpu::Stream::COLOR)._element); | ||
| 635 | |||
| 636 | batch.setInputFormat(streamFormat); | ||
| 637 | batch.setInputBuffer(VERTICES_SLOT, verticesView); | ||
| 638 | batch.setInputBuffer(COLOR_SLOT, colorView); | ||
| 639 | batch.draw(gpu::LINES, vertices, 0); | ||
| 640 | } | ||
| 641 | |||
| 642 | // TODO: why do we seem to create extra BatchItemDetails when we resize the window?? what's that?? | ||
| 643 | void GeometryCache::renderGrid(gpu::Batch& batch, int x, int y, int width, int height, int rows, int cols, const glm::vec4& color, int id) { | ||
| 644 | #ifdef WANT_DEBUG | ||
| 645 | qCDebug(renderutils) << "GeometryCache::renderGrid(x["<<x<<"], " | ||
| 646 | "y["<<y<<"]," | ||
| 647 | "w["<<width<<"]," | ||
| 648 | "h["<<height<<"]," | ||
| 649 | "rows["<<rows<<"]," | ||
| 650 | "cols["<<cols<<"]," | ||
| 651 | " id:"<<id<<")..."; | ||
| 652 | #endif | ||
| 653 | |||
| 654 | bool registered = (id != UNKNOWN_ID); | 575 | bool registered = (id != UNKNOWN_ID); |
| 655 | Vec3Pair key(glm::vec3(x, y, width), glm::vec3(height, rows, cols)); | 576 | Vec2FloatPair key(glm::vec2(rows, cols), edge); |
| 656 | Vec3Pair colorKey(glm::vec3(color.x, color.y, rows), glm::vec3(color.z, color.y, cols)); | ||
| 657 | 577 | ||
| 658 | int vertices = (cols + 1 + rows + 1) * 2; | 578 | // Make the gridbuffer |
| 659 | if ((registered && (!_registeredAlternateGridBuffers.contains(id) || _lastRegisteredAlternateGridBuffers[id] != key)) | 579 | if ((registered && (!_registeredGridBuffers.contains(id) || _lastRegisteredGridBuffer[id] != key)) || |
| 660 | || (!registered && !_alternateGridBuffers.contains(key))) { | 580 | (!registered && !_gridBuffers.contains(key))) { |
| 581 | GridSchema gridSchema; | ||
| 582 | GridBuffer gridBuffer = std::make_shared<gpu::Buffer>(sizeof(GridSchema), (const gpu::Byte*) &gridSchema); | ||
| 661 | 583 | ||
| 662 | if (registered && _registeredAlternateGridBuffers.contains(id)) { | 584 | if (registered && _registeredGridBuffers.contains(id)) { |
| 663 | _registeredAlternateGridBuffers[id].reset(); | 585 | gridBuffer = _registeredGridBuffers[id]; |
| 664 | #ifdef WANT_DEBUG | ||
| 665 | qCDebug(renderutils) << "renderGrid()... RELEASING REGISTERED VERTICES BUFFER"; | ||
| 666 | #endif | ||
| 667 | } | 586 | } |
| 668 | 587 | ||
| 669 | auto verticesBuffer = std::make_shared<gpu::Buffer>(); | ||
| 670 | if (registered) { | 588 | if (registered) { |
| 671 | _registeredAlternateGridBuffers[id] = verticesBuffer; | 589 | _registeredGridBuffers[id] = gridBuffer; |
| 672 | _lastRegisteredAlternateGridBuffers[id] = key; | 590 | _lastRegisteredGridBuffer[id] = key; |
| 673 | } else { | 591 | } else { |
| 674 | _alternateGridBuffers[key] = verticesBuffer; | 592 | _gridBuffers[key] = gridBuffer; |
| 675 | } | ||
| 676 | |||
| 677 | float* vertexData = new float[vertices * 2]; | ||
| 678 | float* vertex = vertexData; | ||
| 679 | |||
| 680 | int dx = width / cols; | ||
| 681 | int dy = height / rows; | ||
| 682 | int tx = x; | ||
| 683 | int ty = y; | ||
| 684 | |||
| 685 | // Draw horizontal grid lines | ||
| 686 | for (int i = rows + 1; --i >= 0; ) { | ||
| 687 | *(vertex++) = x; | ||
| 688 | *(vertex++) = ty; | ||
| 689 | |||
| 690 | *(vertex++) = x + width; | ||
| 691 | *(vertex++) = ty; | ||
| 692 | |||
| 693 | ty += dy; | ||
| 694 | } | ||
| 695 | // Draw vertical grid lines | ||
| 696 | for (int i = cols + 1; --i >= 0; ) { | ||
| 697 | *(vertex++) = tx; | ||
| 698 | *(vertex++) = y; | ||
| 699 | |||
| 700 | *(vertex++) = tx; | ||
| 701 | *(vertex++) = y + height; | ||
| 702 | tx += dx; | ||
| 703 | } | ||
| 704 | |||
| 705 | verticesBuffer->append(sizeof(float) * vertices * 2, (gpu::Byte*) vertexData); | ||
| 706 | delete[] vertexData; | ||
| 707 | } | ||
| 708 | |||
| 709 | if (!_gridColors.contains(colorKey)) { | ||
| 710 | auto colorBuffer = std::make_shared<gpu::Buffer>(); | ||
| 711 | _gridColors[colorKey] = colorBuffer; | ||
| 712 | |||
| 713 | int compactColor = ((int(color.x * 255.0f) & 0xFF)) | | ||
| 714 | ((int(color.y * 255.0f) & 0xFF) << 8) | | ||
| 715 | ((int(color.z * 255.0f) & 0xFF) << 16) | | ||
| 716 | ((int(color.w * 255.0f) & 0xFF) << 24); | ||
| 717 | |||
| 718 | int* colorData = new int[vertices]; | ||
| 719 | int* colorDataAt = colorData; | ||
| 720 | |||
| 721 | |||
| 722 | for(int v = 0; v < vertices; v++) { | ||
| 723 | *(colorDataAt++) = compactColor; | ||
| 724 | } | 593 | } |
| 725 | 594 | ||
| 726 | colorBuffer->append(sizeof(int) * vertices, (gpu::Byte*) colorData); | 595 | gridBuffer.edit<GridSchema>().period = glm::vec2(cols, rows); |
| 727 | delete[] colorData; | 596 | gridBuffer.edit<GridSchema>().offset.x = -(edge / cols) / 2; |
| 597 | gridBuffer.edit<GridSchema>().offset.y = -(edge / rows) / 2; | ||
| 598 | gridBuffer.edit<GridSchema>().balance = glm::vec2(1 - edge); | ||
| 728 | } | 599 | } |
| 729 | gpu::BufferPointer verticesBuffer = registered ? _registeredAlternateGridBuffers[id] : _alternateGridBuffers[key]; | ||
| 730 | |||
| 731 | gpu::BufferPointer colorBuffer = _gridColors[colorKey]; | ||
| 732 | 600 | ||
| 733 | const int VERTICES_SLOT = 0; | 601 | // Set the grid pipeline |
| 734 | const int COLOR_SLOT = 1; | 602 | useGridPipeline(batch, registered ? _registeredGridBuffers[id] : _gridBuffers[key]); |
| 735 | auto streamFormat = std::make_shared<gpu::Stream::Format>(); // 1 for everyone | ||
| 736 | |||
| 737 | streamFormat->setAttribute(gpu::Stream::POSITION, VERTICES_SLOT, gpu::Element(gpu::VEC2, gpu::FLOAT, gpu::XYZ), 0); | ||
| 738 | streamFormat->setAttribute(gpu::Stream::COLOR, COLOR_SLOT, gpu::Element(gpu::VEC4, gpu::NUINT8, gpu::RGBA)); | ||
| 739 | 603 | ||
| 740 | gpu::BufferView verticesView(verticesBuffer, 0, verticesBuffer->getSize(), streamFormat->getAttributes().at(gpu::Stream::POSITION)._element); | 604 | renderQuad(batch, minCorner, maxCorner, minTexCoord, maxTexCoord, color, id); |
| 741 | gpu::BufferView colorView(colorBuffer, streamFormat->getAttributes().at(gpu::Stream::COLOR)._element); | ||
| 742 | |||
| 743 | batch.setInputFormat(streamFormat); | ||
| 744 | batch.setInputBuffer(VERTICES_SLOT, verticesView); | ||
| 745 | batch.setInputBuffer(COLOR_SLOT, colorView); | ||
| 746 | batch.draw(gpu::LINES, vertices, 0); | ||
| 747 | } | 605 | } |
| 748 | 606 | ||
| 749 | void GeometryCache::updateVertices(int id, const QVector<glm::vec2>& points, const glm::vec4& color) { | 607 | void GeometryCache::updateVertices(int id, const QVector<glm::vec2>& points, const glm::vec4& color) { |
| @@ -1772,7 +1630,6 @@ void GeometryCache::useSimpleDrawPipeline(gpu::Batch& batch, bool noBlend) { · 1022 unmodified lines | |||
| 1772 | 1630 | ||
| 1773 | auto state = std::make_shared<gpu::State>(); | 1631 | auto state = std::make_shared<gpu::State>(); |
| 1774 | 1632 | ||
| 1775 | |||
| 1776 | // enable decal blend | 1633 | // enable decal blend |
| 1777 | state->setBlendFunction(true, gpu::State::SRC_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::INV_SRC_ALPHA); | 1634 | state->setBlendFunction(true, gpu::State::SRC_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::INV_SRC_ALPHA); |
| 1778 | 1635 | ||
| @@ -1792,6 +1649,23 @@ void GeometryCache::useSimpleDrawPipeline(gpu::Batch& batch, bool noBlend) { · 13 unmodified lines | |||
| 1792 | } | 1649 | } |
| 1793 | } | 1650 | } |
| 1794 | 1651 | ||
| 1652 | void GeometryCache::useGridPipeline(gpu::Batch& batch, GridBuffer gridBuffer) { | ||
| 1653 | if (!_gridPipeline) { | ||
| 1654 | auto vs = gpu::Shader::createVertex(std::string(standardTransformPNTC_vert)); | ||
| 1655 | auto ps = gpu::Shader::createPixel(std::string(grid_frag)); | ||
| 1656 | auto program = gpu::Shader::createProgram(vs, ps); | ||
| 1657 | gpu::Shader::makeProgram((*program)); | ||
| 1658 | |||
| 1659 | auto state = std::make_shared<gpu::State>(); | ||
| 1660 | state->setBlendFunction(true, gpu::State::SRC_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::INV_SRC_ALPHA); | ||
| 1661 | |||
| 1662 | _gridPipeline = gpu::Pipeline::create(program, state); | ||
| 1663 | _gridSlot = program->getBuffers().findLocation("gridBuffer"); | ||
| 1664 | } | ||
| 1665 | batch.setPipeline(_gridPipeline); | ||
| 1666 | batch.setUniformBuffer(_gridSlot, gridBuffer); | ||
| 1667 | } | ||
| 1668 | |||
| 1795 | 1669 | ||
| 1796 | 1670 | ||
| 1797 | class SimpleProgramKey { | 1671 | class SimpleProgramKey { |