diff options
-rw-r--r-- | linden/indra/newview/llglsandbox.cpp | 10 | ||||
-rw-r--r-- | linden/indra/newview/llselectmgr.cpp | 35 | ||||
-rw-r--r-- | linden/indra/newview/llviewercamera.cpp | 4 | ||||
-rw-r--r-- | linden/indra/newview/llvograss.cpp | 91 | ||||
-rw-r--r-- | linden/indra/newview/llvograss.h | 9 | ||||
-rw-r--r-- | linden/indra/newview/llvotree.cpp | 125 | ||||
-rw-r--r-- | linden/indra/newview/llvotree.h | 14 |
7 files changed, 279 insertions, 9 deletions
diff --git a/linden/indra/newview/llglsandbox.cpp b/linden/indra/newview/llglsandbox.cpp index a487150..98c4d06 100644 --- a/linden/indra/newview/llglsandbox.cpp +++ b/linden/indra/newview/llglsandbox.cpp | |||
@@ -275,7 +275,11 @@ void LLToolSelectRect::handleRectangleSelection(S32 x, S32 y, MASK mask) | |||
275 | virtual bool apply(LLViewerObject* vobjp) | 275 | virtual bool apply(LLViewerObject* vobjp) |
276 | { | 276 | { |
277 | LLDrawable* drawable = vobjp->mDrawable; | 277 | LLDrawable* drawable = vobjp->mDrawable; |
278 | if (!drawable || vobjp->getPCode() != LL_PCODE_VOLUME || vobjp->isAttachment()) | 278 | if (!drawable || |
279 | ((vobjp->getPCode() != LL_PCODE_VOLUME) && | ||
280 | (vobjp->getPCode() != LL_PCODE_LEGACY_TREE) && | ||
281 | (vobjp->getPCode() != LL_PCODE_LEGACY_GRASS) )|| | ||
282 | vobjp->isAttachment()) | ||
279 | { | 283 | { |
280 | return true; | 284 | return true; |
281 | } | 285 | } |
@@ -326,7 +330,9 @@ void LLToolSelectRect::handleRectangleSelection(S32 x, S32 y, MASK mask) | |||
326 | LLViewerObject* vobjp = drawable->getVObj(); | 330 | LLViewerObject* vobjp = drawable->getVObj(); |
327 | 331 | ||
328 | if (!drawable || !vobjp || | 332 | if (!drawable || !vobjp || |
329 | vobjp->getPCode() != LL_PCODE_VOLUME || | 333 | ((vobjp->getPCode() != LL_PCODE_VOLUME) && |
334 | (vobjp->getPCode() != LL_PCODE_LEGACY_TREE) && | ||
335 | (vobjp->getPCode() != LL_PCODE_LEGACY_GRASS) )|| | ||
330 | vobjp->isAttachment() || | 336 | vobjp->isAttachment() || |
331 | (deselect && !vobjp->isSelected())) | 337 | (deselect && !vobjp->isSelected())) |
332 | { | 338 | { |
diff --git a/linden/indra/newview/llselectmgr.cpp b/linden/indra/newview/llselectmgr.cpp index 0d53e82..b0a6834 100644 --- a/linden/indra/newview/llselectmgr.cpp +++ b/linden/indra/newview/llselectmgr.cpp | |||
@@ -85,6 +85,8 @@ | |||
85 | #include "llviewerregion.h" | 85 | #include "llviewerregion.h" |
86 | #include "llviewerstats.h" | 86 | #include "llviewerstats.h" |
87 | #include "llvoavatar.h" | 87 | #include "llvoavatar.h" |
88 | #include "llvograss.h" | ||
89 | #include "llvotree.h" | ||
88 | #include "llvovolume.h" | 90 | #include "llvovolume.h" |
89 | #include "pipeline.h" | 91 | #include "pipeline.h" |
90 | 92 | ||
@@ -832,7 +834,10 @@ void LLSelectMgr::highlightObjectOnly(LLViewerObject* objectp) | |||
832 | return; | 834 | return; |
833 | } | 835 | } |
834 | 836 | ||
835 | if (objectp->getPCode() != LL_PCODE_VOLUME) | 837 | if ((objectp->getPCode() != LL_PCODE_VOLUME) && |
838 | (objectp->getPCode() != LL_PCODE_LEGACY_TREE) && | ||
839 | (objectp->getPCode() != LL_PCODE_LEGACY_GRASS)) | ||
840 | |||
836 | { | 841 | { |
837 | return; | 842 | return; |
838 | } | 843 | } |
@@ -880,7 +885,10 @@ void LLSelectMgr::highlightObjectAndFamily(const std::vector<LLViewerObject*>& o | |||
880 | { | 885 | { |
881 | continue; | 886 | continue; |
882 | } | 887 | } |
883 | if (object->getPCode() != LL_PCODE_VOLUME) | 888 | |
889 | if ((object->getPCode() != LL_PCODE_VOLUME) && | ||
890 | (object->getPCode() != LL_PCODE_LEGACY_TREE) && | ||
891 | (object->getPCode() != LL_PCODE_LEGACY_GRASS)) | ||
884 | { | 892 | { |
885 | continue; | 893 | continue; |
886 | } | 894 | } |
@@ -900,7 +908,14 @@ void LLSelectMgr::highlightObjectAndFamily(const std::vector<LLViewerObject*>& o | |||
900 | 908 | ||
901 | void LLSelectMgr::unhighlightObjectOnly(LLViewerObject* objectp) | 909 | void LLSelectMgr::unhighlightObjectOnly(LLViewerObject* objectp) |
902 | { | 910 | { |
903 | if (!objectp || (objectp->getPCode() != LL_PCODE_VOLUME)) | 911 | if (!objectp) |
912 | { | ||
913 | return; | ||
914 | } | ||
915 | |||
916 | if ((objectp->getPCode() != LL_PCODE_VOLUME) && | ||
917 | (objectp->getPCode() != LL_PCODE_LEGACY_TREE) && | ||
918 | (objectp->getPCode() != LL_PCODE_LEGACY_GRASS)) | ||
904 | { | 919 | { |
905 | return; | 920 | return; |
906 | } | 921 | } |
@@ -5020,6 +5035,14 @@ void LLSelectMgr::generateSilhouette(LLSelectNode* nodep, const LLVector3& view_ | |||
5020 | { | 5035 | { |
5021 | ((LLVOVolume*)objectp)->generateSilhouette(nodep, view_point); | 5036 | ((LLVOVolume*)objectp)->generateSilhouette(nodep, view_point); |
5022 | } | 5037 | } |
5038 | else if (objectp && objectp->getPCode() == LL_PCODE_LEGACY_GRASS) | ||
5039 | { | ||
5040 | ((LLVOGrass*)objectp)->generateSilhouette(nodep, view_point); | ||
5041 | } | ||
5042 | else if (objectp && objectp->getPCode() == LL_PCODE_LEGACY_TREE) | ||
5043 | { | ||
5044 | ((LLVOTree*)objectp)->generateSilhouette(nodep, view_point); | ||
5045 | } | ||
5023 | } | 5046 | } |
5024 | 5047 | ||
5025 | // | 5048 | // |
@@ -5355,8 +5378,10 @@ void LLSelectNode::renderOneSilhouette(const LLColor4 &color) | |||
5355 | glMultMatrixf((F32*) objectp->getRenderMatrix().mMatrix); | 5378 | glMultMatrixf((F32*) objectp->getRenderMatrix().mMatrix); |
5356 | } | 5379 | } |
5357 | 5380 | ||
5358 | LLVolume *volume = objectp->getVolume(); | 5381 | //LLVolume *volume = objectp->getVolume(); |
5359 | if (volume) | 5382 | //if (volume) |
5383 | // we used to only call this for volumes. but let's render silhouettes for any node that has them. | ||
5384 | if (1) | ||
5360 | { | 5385 | { |
5361 | F32 silhouette_thickness; | 5386 | F32 silhouette_thickness; |
5362 | if (is_hud_object && gAgent.getAvatarObject()) | 5387 | if (is_hud_object && gAgent.getAvatarObject()) |
diff --git a/linden/indra/newview/llviewercamera.cpp b/linden/indra/newview/llviewercamera.cpp index dade65f..16f6e57 100644 --- a/linden/indra/newview/llviewercamera.cpp +++ b/linden/indra/newview/llviewercamera.cpp | |||
@@ -743,7 +743,9 @@ BOOL LLViewerCamera::areVertsVisible(LLViewerObject* volumep, BOOL all_verts) | |||
743 | LLVolume* volume = volumep->getVolume(); | 743 | LLVolume* volume = volumep->getVolume(); |
744 | if (!volume) | 744 | if (!volume) |
745 | { | 745 | { |
746 | return FALSE; | 746 | BOOL inside = pointInFrustum(volumep->getRenderPosition()); |
747 | |||
748 | return (inside > 0); | ||
747 | } | 749 | } |
748 | 750 | ||
749 | LLVOVolume* vo_volume = (LLVOVolume*) volumep; | 751 | LLVOVolume* vo_volume = (LLVOVolume*) volumep; |
diff --git a/linden/indra/newview/llvograss.cpp b/linden/indra/newview/llvograss.cpp index f738872..913ec33 100644 --- a/linden/indra/newview/llvograss.cpp +++ b/linden/indra/newview/llvograss.cpp | |||
@@ -48,6 +48,7 @@ | |||
48 | #include "llviewercamera.h" | 48 | #include "llviewercamera.h" |
49 | #include "llviewerimagelist.h" | 49 | #include "llviewerimagelist.h" |
50 | #include "llviewerregion.h" | 50 | #include "llviewerregion.h" |
51 | #include "llselectmgr.h" | ||
51 | #include "pipeline.h" | 52 | #include "pipeline.h" |
52 | #include "llspatialpartition.h" | 53 | #include "llspatialpartition.h" |
53 | #include "llworld.h" | 54 | #include "llworld.h" |
@@ -721,3 +722,93 @@ BOOL LLVOGrass::lineSegmentIntersect(const LLVector3& start, const LLVector3& en | |||
721 | return ret; | 722 | return ret; |
722 | } | 723 | } |
723 | 724 | ||
725 | void LLVOGrass::generateSilhouetteVertices(std::vector<LLVector3> &vertices, | ||
726 | std::vector<LLVector3> &normals, | ||
727 | std::vector<S32> &segments, | ||
728 | const LLVector3& obj_cam_vec, | ||
729 | const LLMatrix4& mat, | ||
730 | const LLMatrix3& norm_mat) | ||
731 | { | ||
732 | vertices.clear(); | ||
733 | normals.clear(); | ||
734 | segments.clear(); | ||
735 | |||
736 | F32 width = sSpeciesTable[mSpecies]->mBladeSizeX; | ||
737 | F32 height = sSpeciesTable[mSpecies]->mBladeSizeY; | ||
738 | |||
739 | for (S32 i = 0; i < mNumBlades; i++) | ||
740 | { | ||
741 | F32 x = exp_x[i] * mScale.mV[VX]; | ||
742 | F32 y = exp_y[i] * mScale.mV[VY]; | ||
743 | F32 xf = rot_x[i] * GRASS_BLADE_BASE * width * w_mod[i]; | ||
744 | F32 yf = rot_y[i] * GRASS_BLADE_BASE * width * w_mod[i]; | ||
745 | F32 dzx = dz_x [i]; | ||
746 | F32 dzy = dz_y [i]; | ||
747 | |||
748 | F32 blade_height= GRASS_BLADE_HEIGHT * height * w_mod[i]; | ||
749 | |||
750 | LLVector3 position1; | ||
751 | |||
752 | position1.mV[0] = mPosition.mV[VX] + x + xf; | ||
753 | position1.mV[1] = mPosition.mV[VY] + y + yf; | ||
754 | position1.mV[2] = mRegionp->getLand().resolveHeightRegion(position1); | ||
755 | |||
756 | LLVector3 position2 = position1; | ||
757 | |||
758 | position2.mV[0] += dzx; | ||
759 | position2.mV[1] += dzy; | ||
760 | position2.mV[2] += blade_height; | ||
761 | |||
762 | LLVector3 position3; | ||
763 | |||
764 | position3.mV[0] = mPosition.mV[VX] + x - xf; | ||
765 | position3.mV[1] = mPosition.mV[VY] + y - xf; | ||
766 | position3.mV[2] = mRegionp->getLand().resolveHeightRegion(position3); | ||
767 | |||
768 | LLVector3 position4 = position3; | ||
769 | |||
770 | position4.mV[0] += dzx; | ||
771 | position4.mV[1] += dzy; | ||
772 | position4.mV[2] += blade_height; | ||
773 | |||
774 | |||
775 | LLVector3 normal = (position1-position2) % (position2 - position3); | ||
776 | normal.normalize(); | ||
777 | |||
778 | vertices.push_back(position1 + mRegionp->getOriginAgent()); | ||
779 | normals.push_back(normal); | ||
780 | vertices.push_back(position2 + mRegionp->getOriginAgent()); | ||
781 | normals.push_back(normal); | ||
782 | segments.push_back(vertices.size()); | ||
783 | |||
784 | vertices.push_back(position2 + mRegionp->getOriginAgent()); | ||
785 | normals.push_back(normal); | ||
786 | vertices.push_back(position4 + mRegionp->getOriginAgent()); | ||
787 | normals.push_back(normal); | ||
788 | segments.push_back(vertices.size()); | ||
789 | |||
790 | vertices.push_back(position4 + mRegionp->getOriginAgent()); | ||
791 | normals.push_back(normal); | ||
792 | vertices.push_back(position3 + mRegionp->getOriginAgent()); | ||
793 | normals.push_back(normal); | ||
794 | segments.push_back(vertices.size()); | ||
795 | |||
796 | vertices.push_back(position3 + mRegionp->getOriginAgent()); | ||
797 | normals.push_back(normal); | ||
798 | vertices.push_back(position1 + mRegionp->getOriginAgent()); | ||
799 | normals.push_back(normal); | ||
800 | segments.push_back(vertices.size()); | ||
801 | } | ||
802 | } | ||
803 | |||
804 | |||
805 | |||
806 | void LLVOGrass::generateSilhouette(LLSelectNode* nodep, const LLVector3& view_point) | ||
807 | { | ||
808 | generateSilhouetteVertices(nodep->mSilhouetteVertices, nodep->mSilhouetteNormals, | ||
809 | nodep->mSilhouetteSegments, | ||
810 | LLVector3(0,0,0), LLMatrix4(), LLMatrix3()); | ||
811 | |||
812 | nodep->mSilhouetteExists = TRUE; | ||
813 | |||
814 | } | ||
diff --git a/linden/indra/newview/llvograss.h b/linden/indra/newview/llvograss.h index 25fa04c..c76ab93 100644 --- a/linden/indra/newview/llvograss.h +++ b/linden/indra/newview/llvograss.h | |||
@@ -37,6 +37,7 @@ | |||
37 | #include "lldarray.h" | 37 | #include "lldarray.h" |
38 | #include <map> | 38 | #include <map> |
39 | 39 | ||
40 | class LLSelectNode; | ||
40 | class LLSurfacePatch; | 41 | class LLSurfacePatch; |
41 | class LLViewerImage; | 42 | class LLViewerImage; |
42 | 43 | ||
@@ -76,6 +77,8 @@ public: | |||
76 | /*virtual*/ BOOL updateLOD(); | 77 | /*virtual*/ BOOL updateLOD(); |
77 | /*virtual*/ void setPixelAreaAndAngle(LLAgent &agent); // generate accurate apparent angle and area | 78 | /*virtual*/ void setPixelAreaAndAngle(LLAgent &agent); // generate accurate apparent angle and area |
78 | 79 | ||
80 | void generateSilhouette(LLSelectNode* nodep, const LLVector3& view_point); | ||
81 | |||
79 | void plantBlades(); | 82 | void plantBlades(); |
80 | 83 | ||
81 | /*virtual*/ BOOL isActive() const; // Whether this object needs to do an idleUpdate. | 84 | /*virtual*/ BOOL isActive() const; // Whether this object needs to do an idleUpdate. |
@@ -125,6 +128,12 @@ protected: | |||
125 | ~LLVOGrass(); | 128 | ~LLVOGrass(); |
126 | 129 | ||
127 | private: | 130 | private: |
131 | void generateSilhouetteVertices(std::vector<LLVector3> &vertices, | ||
132 | std::vector<LLVector3> &normals, | ||
133 | std::vector<S32> &segments, | ||
134 | const LLVector3& view_vec, | ||
135 | const LLMatrix4& mat, | ||
136 | const LLMatrix3& norm_mat); | ||
128 | void updateSpecies(); | 137 | void updateSpecies(); |
129 | F32 mLastHeight; // For cheap update hack | 138 | F32 mLastHeight; // For cheap update hack |
130 | S32 mNumBlades; | 139 | S32 mNumBlades; |
diff --git a/linden/indra/newview/llvotree.cpp b/linden/indra/newview/llvotree.cpp index 6a59253..8c6abdc 100644 --- a/linden/indra/newview/llvotree.cpp +++ b/linden/indra/newview/llvotree.cpp | |||
@@ -47,6 +47,7 @@ | |||
47 | #include "llagent.h" | 47 | #include "llagent.h" |
48 | #include "lldrawable.h" | 48 | #include "lldrawable.h" |
49 | #include "llface.h" | 49 | #include "llface.h" |
50 | #include "llselectmgr.h" | ||
50 | #include "llviewercamera.h" | 51 | #include "llviewercamera.h" |
51 | #include "llviewerimagelist.h" | 52 | #include "llviewerimagelist.h" |
52 | #include "llviewerobjectlist.h" | 53 | #include "llviewerobjectlist.h" |
@@ -1327,3 +1328,127 @@ LLTreePartition::LLTreePartition() | |||
1327 | mLODPeriod = 1; | 1328 | mLODPeriod = 1; |
1328 | } | 1329 | } |
1329 | 1330 | ||
1331 | |||
1332 | |||
1333 | void LLVOTree::generateSilhouetteVertices(std::vector<LLVector3> &vertices, | ||
1334 | std::vector<LLVector3> &normals, | ||
1335 | std::vector<S32> &segments, | ||
1336 | const LLVector3& obj_cam_vec, | ||
1337 | const LLMatrix4& local_matrix, | ||
1338 | const LLMatrix3& normal_matrix) | ||
1339 | { | ||
1340 | vertices.clear(); | ||
1341 | normals.clear(); | ||
1342 | segments.clear(); | ||
1343 | |||
1344 | F32 height = mBillboardScale; // *mBillboardRatio * 0.5; | ||
1345 | F32 width = height * mTrunkAspect; | ||
1346 | |||
1347 | LLVector3 position1 = LLVector3(-width * 0.5,0,0) * local_matrix; | ||
1348 | LLVector3 position2 = LLVector3(-width * 0.5,0,height) * local_matrix; | ||
1349 | LLVector3 position3 = LLVector3(+width * 0.5,0,height) * local_matrix; | ||
1350 | LLVector3 position4 = LLVector3(+width * 0.5,0,0) * local_matrix; | ||
1351 | |||
1352 | LLVector3 position5 = LLVector3(0,-width * 0.5,0) * local_matrix; | ||
1353 | LLVector3 position6 = LLVector3(0,-width * 0.5,height) * local_matrix; | ||
1354 | LLVector3 position7 = LLVector3(0,+width * 0.5,height) * local_matrix; | ||
1355 | LLVector3 position8 = LLVector3(0,+width * 0.5,0) * local_matrix; | ||
1356 | |||
1357 | |||
1358 | LLVector3 normal = (position1-position2) % (position2-position3); | ||
1359 | normal.normalize(); | ||
1360 | |||
1361 | vertices.push_back(position1); | ||
1362 | normals.push_back(normal); | ||
1363 | vertices.push_back(position2); | ||
1364 | normals.push_back(normal); | ||
1365 | segments.push_back(vertices.size()); | ||
1366 | |||
1367 | vertices.push_back(position2); | ||
1368 | normals.push_back(normal); | ||
1369 | vertices.push_back(position3); | ||
1370 | normals.push_back(normal); | ||
1371 | segments.push_back(vertices.size()); | ||
1372 | |||
1373 | vertices.push_back(position3); | ||
1374 | normals.push_back(normal); | ||
1375 | vertices.push_back(position4); | ||
1376 | normals.push_back(normal); | ||
1377 | segments.push_back(vertices.size()); | ||
1378 | |||
1379 | vertices.push_back(position4); | ||
1380 | normals.push_back(normal); | ||
1381 | vertices.push_back(position1); | ||
1382 | normals.push_back(normal); | ||
1383 | segments.push_back(vertices.size()); | ||
1384 | |||
1385 | normal = (position5-position6) % (position6-position7); | ||
1386 | normal.normalize(); | ||
1387 | |||
1388 | vertices.push_back(position5); | ||
1389 | normals.push_back(normal); | ||
1390 | vertices.push_back(position6); | ||
1391 | normals.push_back(normal); | ||
1392 | segments.push_back(vertices.size()); | ||
1393 | |||
1394 | vertices.push_back(position6); | ||
1395 | normals.push_back(normal); | ||
1396 | vertices.push_back(position7); | ||
1397 | normals.push_back(normal); | ||
1398 | segments.push_back(vertices.size()); | ||
1399 | |||
1400 | vertices.push_back(position7); | ||
1401 | normals.push_back(normal); | ||
1402 | vertices.push_back(position8); | ||
1403 | normals.push_back(normal); | ||
1404 | segments.push_back(vertices.size()); | ||
1405 | |||
1406 | vertices.push_back(position8); | ||
1407 | normals.push_back(normal); | ||
1408 | vertices.push_back(position5); | ||
1409 | normals.push_back(normal); | ||
1410 | segments.push_back(vertices.size()); | ||
1411 | |||
1412 | } | ||
1413 | |||
1414 | |||
1415 | void LLVOTree::generateSilhouette(LLSelectNode* nodep, const LLVector3& view_point) | ||
1416 | { | ||
1417 | LLVector3 position; | ||
1418 | LLQuaternion rotation; | ||
1419 | |||
1420 | if (mDrawable->isActive()) | ||
1421 | { | ||
1422 | if (mDrawable->isSpatialRoot()) | ||
1423 | { | ||
1424 | position = LLVector3(); | ||
1425 | rotation = LLQuaternion(); | ||
1426 | } | ||
1427 | else | ||
1428 | { | ||
1429 | position = mDrawable->getPosition(); | ||
1430 | rotation = mDrawable->getRotation(); | ||
1431 | } | ||
1432 | } | ||
1433 | else | ||
1434 | { | ||
1435 | position = getPosition() + getRegion()->getOriginAgent();; | ||
1436 | rotation = getRotation(); | ||
1437 | } | ||
1438 | |||
1439 | // trees have bizzare scaling rules... because it's cool to make needless exceptions | ||
1440 | // PS: the trees are the last remaining tidbit of Philip's code. take a look sometime. | ||
1441 | F32 radius = getScale().length() * 0.05f; | ||
1442 | LLVector3 scale = LLVector3(1,1,1) * radius; | ||
1443 | |||
1444 | // compose final matrix | ||
1445 | LLMatrix4 local_matrix; | ||
1446 | local_matrix.initAll(scale, rotation, position); | ||
1447 | |||
1448 | |||
1449 | generateSilhouetteVertices(nodep->mSilhouetteVertices, nodep->mSilhouetteNormals, | ||
1450 | nodep->mSilhouetteSegments, | ||
1451 | LLVector3(0,0,0), local_matrix, LLMatrix3()); | ||
1452 | |||
1453 | nodep->mSilhouetteExists = TRUE; | ||
1454 | } | ||
diff --git a/linden/indra/newview/llvotree.h b/linden/indra/newview/llvotree.h index 855c612..57116cc 100644 --- a/linden/indra/newview/llvotree.h +++ b/linden/indra/newview/llvotree.h | |||
@@ -39,7 +39,7 @@ | |||
39 | 39 | ||
40 | class LLFace; | 40 | class LLFace; |
41 | class LLDrawPool; | 41 | class LLDrawPool; |
42 | 42 | class LLSelectNode; | |
43 | 43 | ||
44 | class LLVOTree : public LLViewerObject | 44 | class LLVOTree : public LLViewerObject |
45 | { | 45 | { |
@@ -124,6 +124,9 @@ public: | |||
124 | LLVector3* bi_normal = NULL // return the surface bi-normal at the intersection point | 124 | LLVector3* bi_normal = NULL // return the surface bi-normal at the intersection point |
125 | ); | 125 | ); |
126 | 126 | ||
127 | void generateSilhouette(LLSelectNode* nodep, const LLVector3& view_point); | ||
128 | |||
129 | |||
127 | static S32 sMaxTreeSpecies; | 130 | static S32 sMaxTreeSpecies; |
128 | 131 | ||
129 | struct TreeSpeciesData | 132 | struct TreeSpeciesData |
@@ -200,6 +203,15 @@ protected: | |||
200 | static S32 sLODVertexCount[4]; | 203 | static S32 sLODVertexCount[4]; |
201 | static S32 sLODSlices[4]; | 204 | static S32 sLODSlices[4]; |
202 | static F32 sLODAngles[4]; | 205 | static F32 sLODAngles[4]; |
206 | |||
207 | private: | ||
208 | void generateSilhouetteVertices(std::vector<LLVector3> &vertices, | ||
209 | std::vector<LLVector3> &normals, | ||
210 | std::vector<S32> &segments, | ||
211 | const LLVector3& view_vec, | ||
212 | const LLMatrix4& mat, | ||
213 | const LLMatrix3& norm_mat); | ||
214 | |||
203 | }; | 215 | }; |
204 | 216 | ||
205 | #endif | 217 | #endif |