| 744 | /////////////////////////////////////////////////////////////////////////////// |
| 745 | |
| 746 | void Scb::Scene::updateLowLevelMaterial(NpMaterial** masterMaterial) |
| 747 | { |
| 748 | Ps::Mutex::ScopedLock lock(mSceneMaterialBufferLock); |
| 749 | |
| 750 | //sync all the material events |
| 751 | PxsMaterialManager& manager = mScene.getMaterialManager(); |
| 752 | for(PxU32 i=0; i< mSceneMaterialBuffer.size(); ++i) |
| 753 | { |
| 754 | const MaterialEvent& event = mSceneMaterialBuffer[i]; |
| 755 | const NpMaterial* masMat = masterMaterial[event.mHandle]; |
| 756 | switch(event.mType) |
| 757 | { |
| 758 | case MATERIAL_ADD: |
| 759 | if(masMat) |
| 760 | { |
| 761 | Sc::MaterialCore* materialCore = &masterMaterial[event.mHandle]->getScMaterial(); |
| 762 | manager.setMaterial(materialCore); |
| 763 | mScene.registerMaterialInNP(*materialCore); |
| 764 | } |
| 765 | break; |
| 766 | case MATERIAL_UPDATE: |
| 767 | if(masMat) |
| 768 | { |
| 769 | Sc::MaterialCore* materialCore = &masterMaterial[event.mHandle]->getScMaterial(); |
| 770 | manager.updateMaterial(materialCore); |
| 771 | mScene.updateMaterialInNP(*materialCore); |
| 772 | } |
| 773 | break; |
| 774 | case MATERIAL_REMOVE: |
| 775 | if (event.mHandle < manager.getMaxSize()) // materials might get added and then removed again immediately. However, the add does not get processed (see case MATERIAL_ADD above), |
| 776 | { // so the remove might end up reading out of bounds memory unless checked. |
| 777 | PxsMaterialCore* materialCore = manager.getMaterial(event.mHandle); |
| 778 | if (materialCore->getMaterialIndex() == event.mHandle) |
| 779 | { |
| 780 | mScene.unregisterMaterialInNP(*materialCore); |
| 781 | manager.removeMaterial(materialCore); |
| 782 | } |
| 783 | } |
| 784 | break; |
| 785 | }; |
| 786 | } |
| 787 | |
| 788 | mSceneMaterialBuffer.resize(0); |
| 789 | } |
| 790 | |
| 791 | //-------------------------------------------------------------- |
| 792 | // |
no test coverage detected