diff options
author | Jacek Antonelli | 2009-04-30 13:04:20 -0500 |
---|---|---|
committer | Jacek Antonelli | 2009-04-30 13:07:16 -0500 |
commit | ca8149ca6d157eb4b5fc8ba0e5ba3a6e56f72e7e (patch) | |
tree | 8348301d0ac44a524f1819b777686bf086907d76 /linden/indra/newview/llspatialpartition.cpp | |
parent | Second Life viewer sources 1.22.11 (diff) | |
download | meta-impy-ca8149ca6d157eb4b5fc8ba0e5ba3a6e56f72e7e.zip meta-impy-ca8149ca6d157eb4b5fc8ba0e5ba3a6e56f72e7e.tar.gz meta-impy-ca8149ca6d157eb4b5fc8ba0e5ba3a6e56f72e7e.tar.bz2 meta-impy-ca8149ca6d157eb4b5fc8ba0e5ba3a6e56f72e7e.tar.xz |
Second Life viewer sources 1.23.0-RC
Diffstat (limited to 'linden/indra/newview/llspatialpartition.cpp')
-rw-r--r-- | linden/indra/newview/llspatialpartition.cpp | 400 |
1 files changed, 335 insertions, 65 deletions
diff --git a/linden/indra/newview/llspatialpartition.cpp b/linden/indra/newview/llspatialpartition.cpp index 127fca2..f8b8247 100644 --- a/linden/indra/newview/llspatialpartition.cpp +++ b/linden/indra/newview/llspatialpartition.cpp | |||
@@ -17,7 +17,8 @@ | |||
17 | * There are special exceptions to the terms and conditions of the GPL as | 17 | * There are special exceptions to the terms and conditions of the GPL as |
18 | * it is applied to this Source Code. View the full text of the exception | 18 | * it is applied to this Source Code. View the full text of the exception |
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | 19 | * in the file doc/FLOSS-exception.txt in this software distribution, or |
20 | * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception | 20 | * online at |
21 | * http://secondlifegrid.net/programs/open_source/licensing/flossexception | ||
21 | * | 22 | * |
22 | * By copying, modifying or distributing this software, you acknowledge | 23 | * By copying, modifying or distributing this software, you acknowledge |
23 | * that you have read and understood your obligations described above, | 24 | * that you have read and understood your obligations described above, |
@@ -48,7 +49,7 @@ | |||
48 | #include "lloctree.h" | 49 | #include "lloctree.h" |
49 | #include "llvoavatar.h" | 50 | #include "llvoavatar.h" |
50 | 51 | ||
51 | const F32 SG_OCCLUSION_FUDGE = 1.01f; | 52 | const F32 SG_OCCLUSION_FUDGE = 0.25f; |
52 | #define SG_DISCARD_TOLERANCE 0.01f | 53 | #define SG_DISCARD_TOLERANCE 0.01f |
53 | 54 | ||
54 | #if LL_OCTREE_PARANOIA_CHECK | 55 | #if LL_OCTREE_PARANOIA_CHECK |
@@ -190,7 +191,7 @@ static U8 sOcclusionIndices[] = | |||
190 | b000, b110, b100, b101, b001, b011, b010, b110, | 191 | b000, b110, b100, b101, b001, b011, b010, b110, |
191 | }; | 192 | }; |
192 | 193 | ||
193 | U8* get_occlusion_indices(LLCamera* camera, const LLVector3& center) | 194 | U8* get_box_fan_indices(LLCamera* camera, const LLVector3& center) |
194 | { | 195 | { |
195 | LLVector3 d = center - camera->getOrigin(); | 196 | LLVector3 d = center - camera->getOrigin(); |
196 | 197 | ||
@@ -218,7 +219,7 @@ void LLSpatialGroup::buildOcclusion() | |||
218 | mOcclusionVerts = new F32[8*3]; | 219 | mOcclusionVerts = new F32[8*3]; |
219 | } | 220 | } |
220 | 221 | ||
221 | LLVector3 r = mBounds[1]*SG_OCCLUSION_FUDGE + LLVector3(0.1f,0.1f,0.1f); | 222 | LLVector3 r = mBounds[1] + LLVector3(SG_OCCLUSION_FUDGE, SG_OCCLUSION_FUDGE, SG_OCCLUSION_FUDGE); |
222 | 223 | ||
223 | for (U32 k = 0; k < 3; k++) | 224 | for (U32 k = 0; k < 3; k++) |
224 | { | 225 | { |
@@ -561,8 +562,21 @@ void LLSpatialGroup::rebuildGeom() | |||
561 | } | 562 | } |
562 | } | 563 | } |
563 | 564 | ||
565 | void LLSpatialGroup::rebuildMesh() | ||
566 | { | ||
567 | if (!isDead()) | ||
568 | { | ||
569 | mSpatialPartition->rebuildMesh(this); | ||
570 | } | ||
571 | } | ||
572 | |||
564 | void LLSpatialPartition::rebuildGeom(LLSpatialGroup* group) | 573 | void LLSpatialPartition::rebuildGeom(LLSpatialGroup* group) |
565 | { | 574 | { |
575 | if (!gPipeline.hasRenderType(mDrawableType)) | ||
576 | { | ||
577 | return; | ||
578 | } | ||
579 | |||
566 | if (group->changeLOD()) | 580 | if (group->changeLOD()) |
567 | { | 581 | { |
568 | group->mLastUpdateDistance = group->mDistance; | 582 | group->mLastUpdateDistance = group->mDistance; |
@@ -611,6 +625,11 @@ void LLSpatialPartition::rebuildGeom(LLSpatialGroup* group) | |||
611 | group->clearState(LLSpatialGroup::GEOM_DIRTY); | 625 | group->clearState(LLSpatialGroup::GEOM_DIRTY); |
612 | } | 626 | } |
613 | 627 | ||
628 | void LLSpatialPartition::rebuildMesh(LLSpatialGroup* group) | ||
629 | { | ||
630 | |||
631 | } | ||
632 | |||
614 | BOOL LLSpatialGroup::boundObjects(BOOL empty, LLVector3& minOut, LLVector3& maxOut) | 633 | BOOL LLSpatialGroup::boundObjects(BOOL empty, LLVector3& minOut, LLVector3& maxOut) |
615 | { | 634 | { |
616 | const OctreeNode* node = mOctreeNode; | 635 | const OctreeNode* node = mOctreeNode; |
@@ -777,7 +796,7 @@ void LLSpatialGroup::shift(const LLVector3 &offset) | |||
777 | mObjectExtents[0] += offset; | 796 | mObjectExtents[0] += offset; |
778 | mObjectExtents[1] += offset; | 797 | mObjectExtents[1] += offset; |
779 | 798 | ||
780 | if (!mSpatialPartition->mRenderByGroup) | 799 | //if (!mSpatialPartition->mRenderByGroup) |
781 | { | 800 | { |
782 | setState(GEOM_DIRTY); | 801 | setState(GEOM_DIRTY); |
783 | } | 802 | } |
@@ -1270,8 +1289,8 @@ void LLSpatialGroup::checkOcclusion() | |||
1270 | 1289 | ||
1271 | clearState(QUERY_PENDING | DISCARD_QUERY); | 1290 | clearState(QUERY_PENDING | DISCARD_QUERY); |
1272 | } | 1291 | } |
1273 | else if (mSpatialPartition->mOcclusionEnabled) | 1292 | else if (mSpatialPartition->isOcclusionEnabled() && isState(LLSpatialGroup::OCCLUDED)) |
1274 | { | 1293 | { //check occlusion has been issued for occluded node that has not had a query issued |
1275 | assert_states_valid(this); | 1294 | assert_states_valid(this); |
1276 | clearState(LLSpatialGroup::OCCLUDED, LLSpatialGroup::STATE_MODE_DIFF); | 1295 | clearState(LLSpatialGroup::OCCLUDED, LLSpatialGroup::STATE_MODE_DIFF); |
1277 | assert_states_valid(this); | 1296 | assert_states_valid(this); |
@@ -1281,7 +1300,7 @@ void LLSpatialGroup::checkOcclusion() | |||
1281 | 1300 | ||
1282 | void LLSpatialGroup::doOcclusion(LLCamera* camera) | 1301 | void LLSpatialGroup::doOcclusion(LLCamera* camera) |
1283 | { | 1302 | { |
1284 | if (mSpatialPartition->mOcclusionEnabled && LLPipeline::sUseOcclusion > 1) | 1303 | if (mSpatialPartition->isOcclusionEnabled() && LLPipeline::sUseOcclusion > 1) |
1285 | { | 1304 | { |
1286 | if (earlyFail(camera, this)) | 1305 | if (earlyFail(camera, this)) |
1287 | { | 1306 | { |
@@ -1308,7 +1327,7 @@ void LLSpatialGroup::doOcclusion(LLCamera* camera) | |||
1308 | glBeginQueryARB(GL_SAMPLES_PASSED_ARB, mOcclusionQuery); | 1327 | glBeginQueryARB(GL_SAMPLES_PASSED_ARB, mOcclusionQuery); |
1309 | glVertexPointer(3, GL_FLOAT, 0, mOcclusionVerts); | 1328 | glVertexPointer(3, GL_FLOAT, 0, mOcclusionVerts); |
1310 | glDrawRangeElements(GL_TRIANGLE_FAN, 0, 7, 8, | 1329 | glDrawRangeElements(GL_TRIANGLE_FAN, 0, 7, 8, |
1311 | GL_UNSIGNED_BYTE, get_occlusion_indices(camera, mBounds[0])); | 1330 | GL_UNSIGNED_BYTE, get_box_fan_indices(camera, mBounds[0])); |
1312 | glEndQueryARB(GL_SAMPLES_PASSED_ARB); | 1331 | glEndQueryARB(GL_SAMPLES_PASSED_ARB); |
1313 | } | 1332 | } |
1314 | 1333 | ||
@@ -1469,7 +1488,7 @@ public: | |||
1469 | group->checkOcclusion(); | 1488 | group->checkOcclusion(); |
1470 | 1489 | ||
1471 | if (group->mOctreeNode->getParent() && //never occlusion cull the root node | 1490 | if (group->mOctreeNode->getParent() && //never occlusion cull the root node |
1472 | LLPipeline::sUseOcclusion && //ignore occlusion if disabled | 1491 | LLPipeline::sUseOcclusion && //ignore occlusion if disabled |
1473 | group->isState(LLSpatialGroup::OCCLUDED)) | 1492 | group->isState(LLSpatialGroup::OCCLUDED)) |
1474 | { | 1493 | { |
1475 | gPipeline.markOccluder(group); | 1494 | gPipeline.markOccluder(group); |
@@ -1593,6 +1612,86 @@ public: | |||
1593 | } | 1612 | } |
1594 | }; | 1613 | }; |
1595 | 1614 | ||
1615 | class LLOctreeCullShadow : public LLOctreeCull | ||
1616 | { | ||
1617 | public: | ||
1618 | LLOctreeCullShadow(LLCamera* camera) | ||
1619 | : LLOctreeCull(camera) { } | ||
1620 | |||
1621 | virtual S32 frustumCheck(const LLSpatialGroup* group) | ||
1622 | { | ||
1623 | return mCamera->AABBInFrustum(group->mBounds[0], group->mBounds[1]); | ||
1624 | } | ||
1625 | |||
1626 | virtual S32 frustumCheckObjects(const LLSpatialGroup* group) | ||
1627 | { | ||
1628 | return mCamera->AABBInFrustum(group->mObjectBounds[0], group->mObjectBounds[1]); | ||
1629 | } | ||
1630 | }; | ||
1631 | |||
1632 | class LLOctreeCullVisExtents: public LLOctreeCullShadow | ||
1633 | { | ||
1634 | public: | ||
1635 | LLOctreeCullVisExtents(LLCamera* camera, LLVector3& min, LLVector3& max) | ||
1636 | : LLOctreeCullShadow(camera), mMin(min), mMax(max), mEmpty(TRUE) { } | ||
1637 | |||
1638 | virtual bool earlyFail(LLSpatialGroup* group) | ||
1639 | { | ||
1640 | if (group->mOctreeNode->getParent() && //never occlusion cull the root node | ||
1641 | LLPipeline::sUseOcclusion && //ignore occlusion if disabled | ||
1642 | group->isState(LLSpatialGroup::OCCLUDED)) | ||
1643 | { | ||
1644 | return true; | ||
1645 | } | ||
1646 | |||
1647 | return false; | ||
1648 | } | ||
1649 | |||
1650 | virtual void processGroup(LLSpatialGroup* group) | ||
1651 | { | ||
1652 | if (group->mObjectBounds[1].magVecSquared() < 256.f * 256.f) | ||
1653 | { //megaprims and water edge patches be damned! | ||
1654 | mEmpty = FALSE; | ||
1655 | update_min_max(mMin, mMax, group->mObjectExtents[0]); | ||
1656 | update_min_max(mMin, mMax, group->mObjectExtents[1]); | ||
1657 | } | ||
1658 | } | ||
1659 | |||
1660 | BOOL mEmpty; | ||
1661 | LLVector3& mMin; | ||
1662 | LLVector3& mMax; | ||
1663 | }; | ||
1664 | |||
1665 | class LLOctreeCullDetectVisible: public LLOctreeCullShadow | ||
1666 | { | ||
1667 | public: | ||
1668 | LLOctreeCullDetectVisible(LLCamera* camera) | ||
1669 | : LLOctreeCullShadow(camera), mResult(FALSE) { } | ||
1670 | |||
1671 | virtual bool earlyFail(LLSpatialGroup* group) | ||
1672 | { | ||
1673 | if (mResult || //already found a node, don't check any more | ||
1674 | group->mOctreeNode->getParent() && //never occlusion cull the root node | ||
1675 | LLPipeline::sUseOcclusion && //ignore occlusion if disabled | ||
1676 | group->isState(LLSpatialGroup::OCCLUDED)) | ||
1677 | { | ||
1678 | return true; | ||
1679 | } | ||
1680 | |||
1681 | return false; | ||
1682 | } | ||
1683 | |||
1684 | virtual void processGroup(LLSpatialGroup* group) | ||
1685 | { | ||
1686 | if (group->isVisible()) | ||
1687 | { | ||
1688 | mResult = TRUE; | ||
1689 | } | ||
1690 | } | ||
1691 | |||
1692 | BOOL mResult; | ||
1693 | }; | ||
1694 | |||
1596 | class LLOctreeSelect : public LLOctreeCull | 1695 | class LLOctreeSelect : public LLOctreeCull |
1597 | { | 1696 | { |
1598 | public: | 1697 | public: |
@@ -1746,6 +1845,25 @@ void LLSpatialPartition::resetVertexBuffers() | |||
1746 | dirty.traverse(mOctree); | 1845 | dirty.traverse(mOctree); |
1747 | } | 1846 | } |
1748 | 1847 | ||
1848 | BOOL LLSpatialPartition::isOcclusionEnabled() | ||
1849 | { | ||
1850 | return mOcclusionEnabled || LLPipeline::sUseOcclusion > 2; | ||
1851 | } | ||
1852 | |||
1853 | BOOL LLSpatialPartition::getVisibleExtents(LLCamera& camera, LLVector3& visMin, LLVector3& visMax) | ||
1854 | { | ||
1855 | LLOctreeCullVisExtents vis(&camera, visMin, visMax); | ||
1856 | vis.traverse(mOctree); | ||
1857 | return vis.mEmpty; | ||
1858 | } | ||
1859 | |||
1860 | BOOL LLSpatialPartition::visibleObjectsInFrustum(LLCamera& camera) | ||
1861 | { | ||
1862 | LLOctreeCullDetectVisible vis(&camera); | ||
1863 | vis.traverse(mOctree); | ||
1864 | return vis.mResult; | ||
1865 | } | ||
1866 | |||
1749 | S32 LLSpatialPartition::cull(LLCamera &camera, std::vector<LLDrawable *>* results, BOOL for_select) | 1867 | S32 LLSpatialPartition::cull(LLCamera &camera, std::vector<LLDrawable *>* results, BOOL for_select) |
1750 | { | 1868 | { |
1751 | LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION); | 1869 | LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION); |
@@ -1771,6 +1889,12 @@ S32 LLSpatialPartition::cull(LLCamera &camera, std::vector<LLDrawable *>* result | |||
1771 | LLOctreeSelect selecter(&camera, results); | 1889 | LLOctreeSelect selecter(&camera, results); |
1772 | selecter.traverse(mOctree); | 1890 | selecter.traverse(mOctree); |
1773 | } | 1891 | } |
1892 | else if (LLPipeline::sShadowRender) | ||
1893 | { | ||
1894 | LLFastTimer ftm(LLFastTimer::FTM_FRUSTUM_CULL); | ||
1895 | LLOctreeCullShadow culler(&camera); | ||
1896 | culler.traverse(mOctree); | ||
1897 | } | ||
1774 | else if (mInfiniteFarClip || !LLPipeline::sUseFarClip) | 1898 | else if (mInfiniteFarClip || !LLPipeline::sUseFarClip) |
1775 | { | 1899 | { |
1776 | LLFastTimer ftm(LLFastTimer::FTM_FRUSTUM_CULL); | 1900 | LLFastTimer ftm(LLFastTimer::FTM_FRUSTUM_CULL); |
@@ -1789,14 +1913,14 @@ S32 LLSpatialPartition::cull(LLCamera &camera, std::vector<LLDrawable *>* result | |||
1789 | 1913 | ||
1790 | BOOL earlyFail(LLCamera* camera, LLSpatialGroup* group) | 1914 | BOOL earlyFail(LLCamera* camera, LLSpatialGroup* group) |
1791 | { | 1915 | { |
1792 | const F32 vel = (LLViewerCamera::getInstance()->getVelocityStat()->getCurrent()+0.2f); | 1916 | const F32 vel = SG_OCCLUSION_FUDGE*2.f; |
1793 | LLVector3 c = group->mBounds[0]; | 1917 | LLVector3 c = group->mBounds[0]; |
1794 | LLVector3 r = group->mBounds[1]*SG_OCCLUSION_FUDGE + LLVector3(vel,vel,vel); | 1918 | LLVector3 r = group->mBounds[1] + LLVector3(vel,vel,vel); |
1795 | 1919 | ||
1796 | if (r.magVecSquared() > 1024.0*1024.0) | 1920 | /*if (r.magVecSquared() > 1024.0*1024.0) |
1797 | { | 1921 | { |
1798 | return TRUE; | 1922 | return TRUE; |
1799 | } | 1923 | }*/ |
1800 | 1924 | ||
1801 | LLVector3 e = camera->getOrigin(); | 1925 | LLVector3 e = camera->getOrigin(); |
1802 | 1926 | ||
@@ -1864,21 +1988,31 @@ void pushBufferVerts(LLVertexBuffer* buffer, U32 mask) | |||
1864 | 1988 | ||
1865 | void pushBufferVerts(LLSpatialGroup* group, U32 mask) | 1989 | void pushBufferVerts(LLSpatialGroup* group, U32 mask) |
1866 | { | 1990 | { |
1867 | if (!group->mDrawMap.empty()) | 1991 | if (group->mSpatialPartition->mRenderByGroup) |
1868 | { | 1992 | { |
1869 | LLDrawInfo* params = *(group->mDrawMap.begin()->second.begin()); | 1993 | if (!group->mDrawMap.empty()) |
1870 | LLRenderPass::applyModelMatrix(*params); | ||
1871 | |||
1872 | pushBufferVerts(group->mVertexBuffer, mask); | ||
1873 | |||
1874 | for (LLSpatialGroup::buffer_map_t::iterator i = group->mBufferMap.begin(); i != group->mBufferMap.end(); ++i) | ||
1875 | { | 1994 | { |
1876 | for (LLSpatialGroup::buffer_list_t::iterator j = i->second.begin(); j != i->second.end(); ++j) | 1995 | LLDrawInfo* params = *(group->mDrawMap.begin()->second.begin()); |
1996 | LLRenderPass::applyModelMatrix(*params); | ||
1997 | |||
1998 | pushBufferVerts(group->mVertexBuffer, mask); | ||
1999 | |||
2000 | for (LLSpatialGroup::buffer_map_t::iterator i = group->mBufferMap.begin(); i != group->mBufferMap.end(); ++i) | ||
1877 | { | 2001 | { |
1878 | pushBufferVerts(*j, mask); | 2002 | for (LLSpatialGroup::buffer_texture_map_t::iterator j = i->second.begin(); j != i->second.end(); ++j) |
2003 | { | ||
2004 | for (LLSpatialGroup::buffer_list_t::iterator k = j->second.begin(); k != j->second.end(); ++k) | ||
2005 | { | ||
2006 | pushBufferVerts(*k, mask); | ||
2007 | } | ||
2008 | } | ||
1879 | } | 2009 | } |
1880 | } | 2010 | } |
1881 | } | 2011 | } |
2012 | else | ||
2013 | { | ||
2014 | drawBox(group->mBounds[0], group->mBounds[1]); | ||
2015 | } | ||
1882 | } | 2016 | } |
1883 | 2017 | ||
1884 | void pushVertsColorCoded(LLSpatialGroup* group, U32 mask) | 2018 | void pushVertsColorCoded(LLSpatialGroup* group, U32 mask) |
@@ -1895,7 +2029,7 @@ void pushVertsColorCoded(LLSpatialGroup* group, U32 mask) | |||
1895 | LLColor4::green6 | 2029 | LLColor4::green6 |
1896 | }; | 2030 | }; |
1897 | 2031 | ||
1898 | static const U32 col_count = sizeof(colors)/sizeof(LLColor4); | 2032 | static const U32 col_count = LL_ARRAY_SIZE(colors); |
1899 | 2033 | ||
1900 | U32 col = 0; | 2034 | U32 col = 0; |
1901 | 2035 | ||
@@ -2025,6 +2159,23 @@ void renderOctree(LLSpatialGroup* group) | |||
2025 | } | 2159 | } |
2026 | 2160 | ||
2027 | drawBoxOutline(group->mBounds[0],group->mBounds[1]); | 2161 | drawBoxOutline(group->mBounds[0],group->mBounds[1]); |
2162 | |||
2163 | |||
2164 | //draw bounding box for draw info | ||
2165 | if (group->mSpatialPartition->mRenderByGroup) | ||
2166 | { | ||
2167 | gGL.color4f(1.0f, 0.75f, 0.25f, 0.6f); | ||
2168 | for (LLSpatialGroup::draw_map_t::iterator i = group->mDrawMap.begin(); i != group->mDrawMap.end(); ++i) | ||
2169 | { | ||
2170 | for (LLSpatialGroup::drawmap_elem_t::iterator j = i->second.begin(); j != i->second.end(); ++j) | ||
2171 | { | ||
2172 | LLDrawInfo* draw_info = *j; | ||
2173 | LLVector3 center = (draw_info->mExtents[1] + draw_info->mExtents[0])*0.5f; | ||
2174 | LLVector3 size = (draw_info->mExtents[1] - draw_info->mExtents[0])*0.5f; | ||
2175 | drawBoxOutline(center, size); | ||
2176 | } | ||
2177 | } | ||
2178 | } | ||
2028 | } | 2179 | } |
2029 | 2180 | ||
2030 | // LLSpatialGroup::OctreeNode* node = group->mOctreeNode; | 2181 | // LLSpatialGroup::OctreeNode* node = group->mOctreeNode; |
@@ -2045,6 +2196,7 @@ void renderVisibility(LLSpatialGroup* group, LLCamera* camera) | |||
2045 | { | 2196 | { |
2046 | LLGLDepthTest depth_under(GL_TRUE, GL_FALSE, GL_GREATER); | 2197 | LLGLDepthTest depth_under(GL_TRUE, GL_FALSE, GL_GREATER); |
2047 | glColor4f(0, 0.5f, 0, 0.5f); | 2198 | glColor4f(0, 0.5f, 0, 0.5f); |
2199 | gGL.color4f(0, 0.5f, 0, 0.5f); | ||
2048 | pushBufferVerts(group, LLVertexBuffer::MAP_VERTEX); | 2200 | pushBufferVerts(group, LLVertexBuffer::MAP_VERTEX); |
2049 | } | 2201 | } |
2050 | 2202 | ||
@@ -2054,6 +2206,7 @@ void renderVisibility(LLSpatialGroup* group, LLCamera* camera) | |||
2054 | if (render_objects) | 2206 | if (render_objects) |
2055 | { | 2207 | { |
2056 | glColor4f(0.f, 0.5f, 0.f,1.f); | 2208 | glColor4f(0.f, 0.5f, 0.f,1.f); |
2209 | gGL.color4f(0.f, 0.5f, 0.f, 1.f); | ||
2057 | pushBufferVerts(group, LLVertexBuffer::MAP_VERTEX); | 2210 | pushBufferVerts(group, LLVertexBuffer::MAP_VERTEX); |
2058 | } | 2211 | } |
2059 | 2212 | ||
@@ -2062,6 +2215,7 @@ void renderVisibility(LLSpatialGroup* group, LLCamera* camera) | |||
2062 | if (render_objects) | 2215 | if (render_objects) |
2063 | { | 2216 | { |
2064 | glColor4f(0.f, 0.75f, 0.f,0.5f); | 2217 | glColor4f(0.f, 0.75f, 0.f,0.5f); |
2218 | gGL.color4f(0.f, 0.75f, 0.f, 0.5f); | ||
2065 | pushBufferVerts(group, LLVertexBuffer::MAP_VERTEX); | 2219 | pushBufferVerts(group, LLVertexBuffer::MAP_VERTEX); |
2066 | } | 2220 | } |
2067 | else if (camera && group->mOcclusionVerts) | 2221 | else if (camera && group->mOcclusionVerts) |
@@ -2070,60 +2224,79 @@ void renderVisibility(LLSpatialGroup* group, LLCamera* camera) | |||
2070 | glVertexPointer(3, GL_FLOAT, 0, group->mOcclusionVerts); | 2224 | glVertexPointer(3, GL_FLOAT, 0, group->mOcclusionVerts); |
2071 | 2225 | ||
2072 | glColor4f(1.0f, 0.f, 0.f, 0.5f); | 2226 | glColor4f(1.0f, 0.f, 0.f, 0.5f); |
2073 | glDrawRangeElements(GL_TRIANGLE_FAN, 0, 7, 8, GL_UNSIGNED_BYTE, get_occlusion_indices(camera, group->mBounds[0])); | 2227 | glDrawRangeElements(GL_TRIANGLE_FAN, 0, 7, 8, GL_UNSIGNED_BYTE, get_box_fan_indices(camera, group->mBounds[0])); |
2074 | glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); | 2228 | glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); |
2075 | 2229 | ||
2076 | glColor4f(1.0f, 1.f, 1.f, 1.0f); | 2230 | glColor4f(1.0f, 1.f, 1.f, 1.0f); |
2077 | glDrawRangeElements(GL_TRIANGLE_FAN, 0, 7, 8, GL_UNSIGNED_BYTE, get_occlusion_indices(camera, group->mBounds[0])); | 2231 | glDrawRangeElements(GL_TRIANGLE_FAN, 0, 7, 8, GL_UNSIGNED_BYTE, get_box_fan_indices(camera, group->mBounds[0])); |
2078 | glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); | 2232 | glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); |
2079 | } | 2233 | } |
2080 | } | 2234 | } |
2081 | } | 2235 | } |
2082 | 2236 | ||
2083 | void renderBoundingBox(LLDrawable* drawable) | 2237 | void renderCrossHairs(LLVector3 position, F32 size, LLColor4 color) |
2084 | { | 2238 | { |
2085 | if (drawable->isSpatialBridge()) | 2239 | gGL.color4fv(color.mV); |
2240 | gGL.begin(LLRender::LINES); | ||
2086 | { | 2241 | { |
2087 | gGL.color4f(1,0.5f,0,1); | 2242 | gGL.vertex3fv((position - LLVector3(size, 0.f, 0.f)).mV); |
2243 | gGL.vertex3fv((position + LLVector3(size, 0.f, 0.f)).mV); | ||
2244 | gGL.vertex3fv((position - LLVector3(0.f, size, 0.f)).mV); | ||
2245 | gGL.vertex3fv((position + LLVector3(0.f, size, 0.f)).mV); | ||
2246 | gGL.vertex3fv((position - LLVector3(0.f, 0.f, size)).mV); | ||
2247 | gGL.vertex3fv((position + LLVector3(0.f, 0.f, size)).mV); | ||
2088 | } | 2248 | } |
2089 | else if (drawable->getVOVolume()) | 2249 | gGL.end(); |
2250 | } | ||
2251 | |||
2252 | |||
2253 | void renderBoundingBox(LLDrawable* drawable, BOOL set_color = TRUE) | ||
2254 | { | ||
2255 | if (set_color) | ||
2090 | { | 2256 | { |
2091 | if (drawable->isRoot()) | 2257 | if (drawable->isSpatialBridge()) |
2092 | { | 2258 | { |
2093 | gGL.color4f(1,1,0,1); | 2259 | gGL.color4f(1,0.5f,0,1); |
2094 | } | 2260 | } |
2095 | else | 2261 | else if (drawable->getVOVolume()) |
2096 | { | 2262 | { |
2097 | gGL.color4f(0,1,0,1); | 2263 | if (drawable->isRoot()) |
2264 | { | ||
2265 | gGL.color4f(1,1,0,1); | ||
2266 | } | ||
2267 | else | ||
2268 | { | ||
2269 | gGL.color4f(0,1,0,1); | ||
2270 | } | ||
2098 | } | 2271 | } |
2099 | } | 2272 | else if (drawable->getVObj()) |
2100 | else if (drawable->getVObj()) | ||
2101 | { | ||
2102 | switch (drawable->getVObj()->getPCode()) | ||
2103 | { | 2273 | { |
2104 | case LLViewerObject::LL_VO_SURFACE_PATCH: | 2274 | switch (drawable->getVObj()->getPCode()) |
2105 | gGL.color4f(0,1,1,1); | 2275 | { |
2106 | break; | 2276 | case LLViewerObject::LL_VO_SURFACE_PATCH: |
2107 | case LLViewerObject::LL_VO_CLOUDS: | 2277 | gGL.color4f(0,1,1,1); |
2108 | gGL.color4f(0.5f,0.5f,0.5f,1.0f); | 2278 | break; |
2109 | break; | 2279 | case LLViewerObject::LL_VO_CLOUDS: |
2110 | case LLViewerObject::LL_VO_PART_GROUP: | 2280 | gGL.color4f(0.5f,0.5f,0.5f,1.0f); |
2281 | break; | ||
2282 | case LLViewerObject::LL_VO_PART_GROUP: | ||
2111 | case LLViewerObject::LL_VO_HUD_PART_GROUP: | 2283 | case LLViewerObject::LL_VO_HUD_PART_GROUP: |
2112 | gGL.color4f(0,0,1,1); | 2284 | gGL.color4f(0,0,1,1); |
2113 | break; | 2285 | break; |
2114 | case LLViewerObject::LL_VO_WATER: | 2286 | case LLViewerObject::LL_VO_WATER: |
2115 | gGL.color4f(0,0.5f,1,1); | 2287 | gGL.color4f(0,0.5f,1,1); |
2116 | break; | 2288 | break; |
2117 | case LL_PCODE_LEGACY_TREE: | 2289 | case LL_PCODE_LEGACY_TREE: |
2118 | gGL.color4f(0,0.5f,0,1); | 2290 | gGL.color4f(0,0.5f,0,1); |
2119 | default: | 2291 | default: |
2120 | gGL.color4f(1,0,1,1); | 2292 | gGL.color4f(1,0,1,1); |
2121 | break; | 2293 | break; |
2294 | } | ||
2295 | } | ||
2296 | else | ||
2297 | { | ||
2298 | gGL.color4f(1,0,0,1); | ||
2122 | } | 2299 | } |
2123 | } | ||
2124 | else | ||
2125 | { | ||
2126 | gGL.color4f(1,0,0,1); | ||
2127 | } | 2300 | } |
2128 | 2301 | ||
2129 | const LLVector3* ext; | 2302 | const LLVector3* ext; |
@@ -2155,7 +2328,8 @@ void renderBoundingBox(LLDrawable* drawable) | |||
2155 | if (vobj && vobj->onActiveList()) | 2328 | if (vobj && vobj->onActiveList()) |
2156 | { | 2329 | { |
2157 | gGL.flush(); | 2330 | gGL.flush(); |
2158 | glLineWidth(4.f*(sinf(gFrameTimeSeconds*2.f)*0.25f+0.75f)); | 2331 | glLineWidth(llmax(4.f*sinf(gFrameTimeSeconds*2.f)+1.f, 1.f)); |
2332 | //glLineWidth(4.f*(sinf(gFrameTimeSeconds*2.f)*0.25f+0.75f)); | ||
2159 | stop_glerror(); | 2333 | stop_glerror(); |
2160 | drawBoxOutline(pos,size); | 2334 | drawBoxOutline(pos,size); |
2161 | gGL.flush(); | 2335 | gGL.flush(); |
@@ -2247,7 +2421,7 @@ void renderTextureAnim(LLDrawInfo* params) | |||
2247 | } | 2421 | } |
2248 | 2422 | ||
2249 | LLGLEnable blend(GL_BLEND); | 2423 | LLGLEnable blend(GL_BLEND); |
2250 | gGL.color4f(1,1,0,0.5f); | 2424 | glColor4f(1,1,0,0.5f); |
2251 | pushVerts(params, LLVertexBuffer::MAP_VERTEX); | 2425 | pushVerts(params, LLVertexBuffer::MAP_VERTEX); |
2252 | } | 2426 | } |
2253 | 2427 | ||
@@ -2349,6 +2523,25 @@ void renderRaycast(LLDrawable* drawablep) | |||
2349 | } | 2523 | } |
2350 | } | 2524 | } |
2351 | 2525 | ||
2526 | |||
2527 | void renderAvatarCollisionVolumes(LLVOAvatar* avatar) | ||
2528 | { | ||
2529 | avatar->renderCollisionVolumes(); | ||
2530 | } | ||
2531 | |||
2532 | void renderAgentTarget(LLVOAvatar* avatar) | ||
2533 | { | ||
2534 | // render these for self only (why, i don't know) | ||
2535 | if (avatar->isSelf()) | ||
2536 | { | ||
2537 | renderCrossHairs(avatar->getPositionAgent(), 0.2f, LLColor4(1, 0, 0, 0.8f)); | ||
2538 | renderCrossHairs(avatar->mDrawable->getPositionAgent(), 0.2f, LLColor4(1, 0, 0, 0.8f)); | ||
2539 | renderCrossHairs(avatar->mRoot.getWorldPosition(), 0.2f, LLColor4(1, 1, 1, 0.8f)); | ||
2540 | renderCrossHairs(avatar->mPelvisp->getWorldPosition(), 0.2f, LLColor4(0, 0, 1, 0.8f)); | ||
2541 | } | ||
2542 | } | ||
2543 | |||
2544 | |||
2352 | class LLOctreeRenderNonOccluded : public LLOctreeTraveler<LLDrawable> | 2545 | class LLOctreeRenderNonOccluded : public LLOctreeTraveler<LLDrawable> |
2353 | { | 2546 | { |
2354 | public: | 2547 | public: |
@@ -2378,8 +2571,7 @@ public: | |||
2378 | } | 2571 | } |
2379 | 2572 | ||
2380 | //render visibility wireframe | 2573 | //render visibility wireframe |
2381 | if (group->mSpatialPartition->mRenderByGroup && | 2574 | if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_OCCLUSION)) |
2382 | gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_OCCLUSION)) | ||
2383 | { | 2575 | { |
2384 | gGL.flush(); | 2576 | gGL.flush(); |
2385 | glPushMatrix(); | 2577 | glPushMatrix(); |
@@ -2434,6 +2626,19 @@ public: | |||
2434 | { | 2626 | { |
2435 | renderRaycast(drawable); | 2627 | renderRaycast(drawable); |
2436 | } | 2628 | } |
2629 | |||
2630 | LLVOAvatar* avatar = dynamic_cast<LLVOAvatar*>(drawable->getVObj().get()); | ||
2631 | |||
2632 | if (avatar && gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_AVATAR_VOLUME)) | ||
2633 | { | ||
2634 | renderAvatarCollisionVolumes(avatar); | ||
2635 | } | ||
2636 | |||
2637 | if (avatar && gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_AGENT_TARGET)) | ||
2638 | { | ||
2639 | renderAgentTarget(avatar); | ||
2640 | } | ||
2641 | |||
2437 | } | 2642 | } |
2438 | 2643 | ||
2439 | for (LLSpatialGroup::draw_map_t::iterator i = group->mDrawMap.begin(); i != group->mDrawMap.end(); ++i) | 2644 | for (LLSpatialGroup::draw_map_t::iterator i = group->mDrawMap.begin(); i != group->mDrawMap.end(); ++i) |
@@ -2455,6 +2660,51 @@ public: | |||
2455 | } | 2660 | } |
2456 | }; | 2661 | }; |
2457 | 2662 | ||
2663 | class LLOctreePushBBoxVerts : public LLOctreeTraveler<LLDrawable> | ||
2664 | { | ||
2665 | public: | ||
2666 | LLCamera* mCamera; | ||
2667 | LLOctreePushBBoxVerts(LLCamera* camera): mCamera(camera) {} | ||
2668 | |||
2669 | virtual void traverse(const LLSpatialGroup::OctreeNode* node) | ||
2670 | { | ||
2671 | LLSpatialGroup* group = (LLSpatialGroup*) node->getListener(0); | ||
2672 | |||
2673 | if (!mCamera || mCamera->AABBInFrustum(group->mBounds[0], group->mBounds[1])) | ||
2674 | { | ||
2675 | node->accept(this); | ||
2676 | |||
2677 | for (U32 i = 0; i < node->getChildCount(); i++) | ||
2678 | { | ||
2679 | traverse(node->getChild(i)); | ||
2680 | } | ||
2681 | } | ||
2682 | } | ||
2683 | |||
2684 | virtual void visit(const LLSpatialGroup::OctreeNode* branch) | ||
2685 | { | ||
2686 | LLSpatialGroup* group = (LLSpatialGroup*) branch->getListener(0); | ||
2687 | |||
2688 | if (group->isState(LLSpatialGroup::GEOM_DIRTY) || (mCamera && !mCamera->AABBInFrustumNoFarClip(group->mBounds[0], group->mBounds[1]))) | ||
2689 | { | ||
2690 | return; | ||
2691 | } | ||
2692 | |||
2693 | for (LLSpatialGroup::OctreeNode::const_element_iter i = branch->getData().begin(); i != branch->getData().end(); ++i) | ||
2694 | { | ||
2695 | LLDrawable* drawable = *i; | ||
2696 | |||
2697 | renderBoundingBox(drawable, FALSE); | ||
2698 | } | ||
2699 | } | ||
2700 | }; | ||
2701 | |||
2702 | void LLSpatialPartition::renderIntersectingBBoxes(LLCamera* camera) | ||
2703 | { | ||
2704 | LLOctreePushBBoxVerts pusher(camera); | ||
2705 | pusher.traverse(mOctree); | ||
2706 | } | ||
2707 | |||
2458 | void LLSpatialPartition::renderDebug() | 2708 | void LLSpatialPartition::renderDebug() |
2459 | { | 2709 | { |
2460 | if (!gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_OCTREE | | 2710 | if (!gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_OCTREE | |
@@ -2465,7 +2715,9 @@ void LLSpatialPartition::renderDebug() | |||
2465 | LLPipeline::RENDER_DEBUG_POINTS | | 2715 | LLPipeline::RENDER_DEBUG_POINTS | |
2466 | LLPipeline::RENDER_DEBUG_TEXTURE_PRIORITY | | 2716 | LLPipeline::RENDER_DEBUG_TEXTURE_PRIORITY | |
2467 | LLPipeline::RENDER_DEBUG_TEXTURE_ANIM | | 2717 | LLPipeline::RENDER_DEBUG_TEXTURE_ANIM | |
2468 | LLPipeline::RENDER_DEBUG_RAYCAST)) | 2718 | LLPipeline::RENDER_DEBUG_RAYCAST | |
2719 | LLPipeline::RENDER_DEBUG_AVATAR_VOLUME | | ||
2720 | LLPipeline::RENDER_DEBUG_AGENT_TARGET)) | ||
2469 | { | 2721 | { |
2470 | return; | 2722 | return; |
2471 | } | 2723 | } |
@@ -2660,9 +2912,22 @@ LLDrawInfo::LLDrawInfo(U16 start, U16 end, U32 count, U32 offset, | |||
2660 | mParticle(particle), | 2912 | mParticle(particle), |
2661 | mPartSize(part_size), | 2913 | mPartSize(part_size), |
2662 | mVSize(0.f), | 2914 | mVSize(0.f), |
2663 | mGroup(NULL) | 2915 | mGroup(NULL), |
2916 | mFace(NULL), | ||
2917 | mDistance(0.f) | ||
2664 | { | 2918 | { |
2665 | mDebugColor = (rand() << 16) + rand(); | 2919 | mDebugColor = (rand() << 16) + rand(); |
2920 | if (mStart >= mVertexBuffer->getRequestedVerts() || | ||
2921 | mEnd >= mVertexBuffer->getRequestedVerts()) | ||
2922 | { | ||
2923 | llerrs << "Invalid draw info vertex range." << llendl; | ||
2924 | } | ||
2925 | |||
2926 | if (mOffset >= (U32) mVertexBuffer->getRequestedIndices() || | ||
2927 | mOffset + mCount > (U32) mVertexBuffer->getRequestedIndices()) | ||
2928 | { | ||
2929 | llerrs << "Invalid draw info index range." << llendl; | ||
2930 | } | ||
2666 | } | 2931 | } |
2667 | 2932 | ||
2668 | LLDrawInfo::~LLDrawInfo() | 2933 | LLDrawInfo::~LLDrawInfo() |
@@ -2671,6 +2936,11 @@ LLDrawInfo::~LLDrawInfo() | |||
2671 | { | 2936 | { |
2672 | llerrs << "LLDrawInfo deleted illegally!" << llendl; | 2937 | llerrs << "LLDrawInfo deleted illegally!" << llendl; |
2673 | } | 2938 | } |
2939 | |||
2940 | if (mFace) | ||
2941 | { | ||
2942 | mFace->setDrawInfo(NULL); | ||
2943 | } | ||
2674 | } | 2944 | } |
2675 | 2945 | ||
2676 | LLVertexBuffer* LLGeometryManager::createVertexBuffer(U32 type_mask, U32 usage) | 2946 | LLVertexBuffer* LLGeometryManager::createVertexBuffer(U32 type_mask, U32 usage) |