aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/linden/indra/newview/llspatialpartition.cpp
diff options
context:
space:
mode:
authorJacek Antonelli2009-04-30 13:04:20 -0500
committerJacek Antonelli2009-04-30 13:07:16 -0500
commitca8149ca6d157eb4b5fc8ba0e5ba3a6e56f72e7e (patch)
tree8348301d0ac44a524f1819b777686bf086907d76 /linden/indra/newview/llspatialpartition.cpp
parentSecond Life viewer sources 1.22.11 (diff)
downloadmeta-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.cpp400
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
51const F32 SG_OCCLUSION_FUDGE = 1.01f; 52const 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
193U8* get_occlusion_indices(LLCamera* camera, const LLVector3& center) 194U8* 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
565void LLSpatialGroup::rebuildMesh()
566{
567 if (!isDead())
568 {
569 mSpatialPartition->rebuildMesh(this);
570 }
571}
572
564void LLSpatialPartition::rebuildGeom(LLSpatialGroup* group) 573void 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
628void LLSpatialPartition::rebuildMesh(LLSpatialGroup* group)
629{
630
631}
632
614BOOL LLSpatialGroup::boundObjects(BOOL empty, LLVector3& minOut, LLVector3& maxOut) 633BOOL 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
1282void LLSpatialGroup::doOcclusion(LLCamera* camera) 1301void 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
1615class LLOctreeCullShadow : public LLOctreeCull
1616{
1617public:
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
1632class LLOctreeCullVisExtents: public LLOctreeCullShadow
1633{
1634public:
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
1665class LLOctreeCullDetectVisible: public LLOctreeCullShadow
1666{
1667public:
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
1596class LLOctreeSelect : public LLOctreeCull 1695class LLOctreeSelect : public LLOctreeCull
1597{ 1696{
1598public: 1697public:
@@ -1746,6 +1845,25 @@ void LLSpatialPartition::resetVertexBuffers()
1746 dirty.traverse(mOctree); 1845 dirty.traverse(mOctree);
1747} 1846}
1748 1847
1848BOOL LLSpatialPartition::isOcclusionEnabled()
1849{
1850 return mOcclusionEnabled || LLPipeline::sUseOcclusion > 2;
1851}
1852
1853BOOL 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
1860BOOL LLSpatialPartition::visibleObjectsInFrustum(LLCamera& camera)
1861{
1862 LLOctreeCullDetectVisible vis(&camera);
1863 vis.traverse(mOctree);
1864 return vis.mResult;
1865}
1866
1749S32 LLSpatialPartition::cull(LLCamera &camera, std::vector<LLDrawable *>* results, BOOL for_select) 1867S32 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
1790BOOL earlyFail(LLCamera* camera, LLSpatialGroup* group) 1914BOOL 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
1865void pushBufferVerts(LLSpatialGroup* group, U32 mask) 1989void 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
1884void pushVertsColorCoded(LLSpatialGroup* group, U32 mask) 2018void 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
2083void renderBoundingBox(LLDrawable* drawable) 2237void 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
2253void 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
2527void renderAvatarCollisionVolumes(LLVOAvatar* avatar)
2528{
2529 avatar->renderCollisionVolumes();
2530}
2531
2532void 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
2352class LLOctreeRenderNonOccluded : public LLOctreeTraveler<LLDrawable> 2545class LLOctreeRenderNonOccluded : public LLOctreeTraveler<LLDrawable>
2353{ 2546{
2354public: 2547public:
@@ -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
2663class LLOctreePushBBoxVerts : public LLOctreeTraveler<LLDrawable>
2664{
2665public:
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
2702void LLSpatialPartition::renderIntersectingBBoxes(LLCamera* camera)
2703{
2704 LLOctreePushBBoxVerts pusher(camera);
2705 pusher.traverse(mOctree);
2706}
2707
2458void LLSpatialPartition::renderDebug() 2708void 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
2668LLDrawInfo::~LLDrawInfo() 2933LLDrawInfo::~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
2676LLVertexBuffer* LLGeometryManager::createVertexBuffer(U32 type_mask, U32 usage) 2946LLVertexBuffer* LLGeometryManager::createVertexBuffer(U32 type_mask, U32 usage)