- Timestamp:
- 03/25/09 12:17:21 (4 years ago)
- Files:
-
- 1 modified
Legend:
- Unmodified
- Added
- Removed
-
OpenSceneGraph/trunk/src/osgTerrain/GeometryTechnique.cpp
r9388 r9969 417 417 // bool optimizeOrientations = elevations!=0; 418 418 bool swapOrientation = !(masterLocator->orientationOpenGL()); 419 420 osg::ref_ptr<osg::DrawElementsUInt> elements = new osg::DrawElementsUInt(GL_TRIANGLES); 421 elements->reserve((numRows-1) * (numColumns-1) * 6); 419 420 bool smallTile = numVertices <= 16384; 421 422 // osg::notify(osg::NOTICE)<<"smallTile = "<<smallTile<<std::endl; 423 424 osg::ref_ptr<osg::DrawElements> elements = smallTile ? 425 static_cast<osg::DrawElements*>(new osg::DrawElementsUShort(GL_TRIANGLES)) : 426 static_cast<osg::DrawElements*>(new osg::DrawElementsUInt(GL_TRIANGLES)); 427 428 elements->reserveElements((numRows-1) * (numColumns-1) * 6); 422 429 423 430 geometry->addPrimitiveSet(elements.get()); … … 464 471 if (fabsf(e00-e11)<fabsf(e01-e10)) 465 472 { 466 elements-> push_back(i01);467 elements-> push_back(i00);468 elements-> push_back(i11);469 470 elements-> push_back(i00);471 elements-> push_back(i10);472 elements-> push_back(i11);473 elements->addElement(i01); 474 elements->addElement(i00); 475 elements->addElement(i11); 476 477 elements->addElement(i00); 478 elements->addElement(i10); 479 elements->addElement(i11); 473 480 } 474 481 else 475 482 { 476 elements-> push_back(i01);477 elements-> push_back(i00);478 elements-> push_back(i10);479 480 elements-> push_back(i01);481 elements-> push_back(i10);482 elements-> push_back(i11);483 elements->addElement(i01); 484 elements->addElement(i00); 485 elements->addElement(i10); 486 487 elements->addElement(i01); 488 elements->addElement(i10); 489 elements->addElement(i11); 483 490 } 484 491 } 485 492 else if (numValid==3) 486 493 { 487 if (i00>=0) elements-> push_back(i00);488 if (i01>=0) elements-> push_back(i01);489 if (i11>=0) elements-> push_back(i11);490 if (i10>=0) elements-> push_back(i10);494 if (i00>=0) elements->addElement(i00); 495 if (i01>=0) elements->addElement(i01); 496 if (i11>=0) elements->addElement(i11); 497 if (i10>=0) elements->addElement(i10); 491 498 } 492 499 … … 507 514 if (createSkirt) 508 515 { 509 osg::ref_ptr<osg::DrawElementsUShort> skirtDrawElements = new osg::DrawElementsUShort(GL_QUAD_STRIP); 516 osg::ref_ptr<osg::DrawElements> skirtDrawElements = smallTile ? 517 static_cast<osg::DrawElements*>(new osg::DrawElementsUShort(GL_QUAD_STRIP)) : 518 static_cast<osg::DrawElements*>(new osg::DrawElementsUInt(GL_QUAD_STRIP)); 510 519 511 520 // create bottom skirt vertices … … 529 538 } 530 539 531 skirtDrawElements-> push_back(orig_i);532 skirtDrawElements-> push_back(new_i);540 skirtDrawElements->addElement(orig_i); 541 skirtDrawElements->addElement(new_i); 533 542 } 534 543 else 535 544 { 536 if ( !skirtDrawElements->empty())545 if (skirtDrawElements->getNumIndices()!=0) 537 546 { 538 547 geometry->addPrimitiveSet(skirtDrawElements.get()); 539 skirtDrawElements = new osg::DrawElementsUShort(GL_QUAD_STRIP); 548 skirtDrawElements = smallTile ? 549 static_cast<osg::DrawElements*>(new osg::DrawElementsUShort(GL_QUAD_STRIP)) : 550 static_cast<osg::DrawElements*>(new osg::DrawElementsUInt(GL_QUAD_STRIP)); 540 551 } 541 552 … … 543 554 } 544 555 545 if ( !skirtDrawElements->empty())556 if (skirtDrawElements->getNumIndices()!=0) 546 557 { 547 558 geometry->addPrimitiveSet(skirtDrawElements.get()); 548 skirtDrawElements = new osg::DrawElementsUShort(GL_QUAD_STRIP); 559 skirtDrawElements = smallTile ? 560 static_cast<osg::DrawElements*>(new osg::DrawElementsUShort(GL_QUAD_STRIP)) : 561 static_cast<osg::DrawElements*>(new osg::DrawElementsUInt(GL_QUAD_STRIP)); 549 562 } 550 563 … … 567 580 } 568 581 569 skirtDrawElements-> push_back(orig_i);570 skirtDrawElements-> push_back(new_i);582 skirtDrawElements->addElement(orig_i); 583 skirtDrawElements->addElement(new_i); 571 584 } 572 585 else 573 586 { 574 if ( !skirtDrawElements->empty())587 if (skirtDrawElements->getNumIndices()!=0) 575 588 { 576 589 geometry->addPrimitiveSet(skirtDrawElements.get()); 577 skirtDrawElements = new osg::DrawElementsUShort(GL_QUAD_STRIP); 590 skirtDrawElements = smallTile ? 591 static_cast<osg::DrawElements*>(new osg::DrawElementsUShort(GL_QUAD_STRIP)) : 592 static_cast<osg::DrawElements*>(new osg::DrawElementsUInt(GL_QUAD_STRIP)); 578 593 } 579 594 … … 581 596 } 582 597 583 if ( !skirtDrawElements->empty())598 if (skirtDrawElements->getNumIndices()!=0) 584 599 { 585 600 geometry->addPrimitiveSet(skirtDrawElements.get()); 586 skirtDrawElements = new osg::DrawElementsUShort(GL_QUAD_STRIP); 601 skirtDrawElements = smallTile ? 602 static_cast<osg::DrawElements*>(new osg::DrawElementsUShort(GL_QUAD_STRIP)) : 603 static_cast<osg::DrawElements*>(new osg::DrawElementsUInt(GL_QUAD_STRIP)); 587 604 } 588 605 … … 605 622 } 606 623 607 skirtDrawElements-> push_back(orig_i);608 skirtDrawElements-> push_back(new_i);624 skirtDrawElements->addElement(orig_i); 625 skirtDrawElements->addElement(new_i); 609 626 } 610 627 else 611 628 { 612 if ( !skirtDrawElements->empty())629 if (skirtDrawElements->getNumIndices()!=0) 613 630 { 614 631 geometry->addPrimitiveSet(skirtDrawElements.get()); 615 skirtDrawElements = new osg::DrawElementsUShort(GL_QUAD_STRIP); 632 skirtDrawElements = smallTile ? 633 static_cast<osg::DrawElements*>(new osg::DrawElementsUShort(GL_QUAD_STRIP)) : 634 static_cast<osg::DrawElements*>(new osg::DrawElementsUInt(GL_QUAD_STRIP)); 616 635 } 617 636 … … 619 638 } 620 639 621 if ( !skirtDrawElements->empty())640 if (skirtDrawElements->getNumIndices()!=0) 622 641 { 623 642 geometry->addPrimitiveSet(skirtDrawElements.get()); 624 skirtDrawElements = new osg::DrawElementsUShort(GL_QUAD_STRIP); 643 skirtDrawElements = smallTile ? 644 static_cast<osg::DrawElements*>(new osg::DrawElementsUShort(GL_QUAD_STRIP)) : 645 static_cast<osg::DrawElements*>(new osg::DrawElementsUInt(GL_QUAD_STRIP)); 625 646 } 626 647 … … 643 664 } 644 665 645 skirtDrawElements-> push_back(orig_i);646 skirtDrawElements-> push_back(new_i);666 skirtDrawElements->addElement(orig_i); 667 skirtDrawElements->addElement(new_i); 647 668 } 648 669 else 649 670 { 650 if ( !skirtDrawElements->empty())671 if (skirtDrawElements->getNumIndices()!=0) 651 672 { 652 673 geometry->addPrimitiveSet(skirtDrawElements.get()); … … 657 678 } 658 679 659 if ( !skirtDrawElements->empty())680 if (skirtDrawElements->getNumIndices()!=0) 660 681 { 661 682 geometry->addPrimitiveSet(skirtDrawElements.get()); 662 skirtDrawElements = new osg::DrawElementsUShort(GL_QUAD_STRIP); 683 smallTile ? 684 static_cast<osg::DrawElements*>(new osg::DrawElementsUShort(GL_QUAD_STRIP)) : 685 static_cast<osg::DrawElements*>(new osg::DrawElementsUInt(GL_QUAD_STRIP)); 663 686 } 664 687 }
