Browse Source

Fixed BillboardSet not restoring its index buffer on OpenGL.

Lasse Öörni 13 years ago
parent
commit
7618da35b5
1 changed files with 16 additions and 18 deletions
  1. 16 18
      Engine/Graphics/BillboardSet.cpp

+ 16 - 18
Engine/Graphics/BillboardSet.cpp

@@ -66,6 +66,11 @@ BillboardSet::BillboardSet(Context* context) :
 {
     drawableFlags_ = DRAWABLE_GEOMETRY;
     
+    vertexBuffer_ = new VertexBuffer(context_);
+    indexBuffer_ = new IndexBuffer(context_);
+    geometry_->SetVertexBuffer(0, vertexBuffer_, MASK_POSITION | MASK_COLOR | MASK_TEXCOORD1 | MASK_TEXCOORD2);
+    geometry_->SetIndexBuffer(indexBuffer_);
+    
     batches_.Resize(1);
     batches_[0].geometry_ = geometry_;
     batches_[0].geometryType_ = GEOM_BILLBOARD;
@@ -131,16 +136,16 @@ void BillboardSet::UpdateBatches(const FrameInfo& frame)
 
 void BillboardSet::UpdateGeometry(const FrameInfo& frame)
 {
-    if (bufferSizeDirty_)
+    if (vertexBuffer_->IsDataLost() || indexBuffer_->IsDataLost())
     {
-        UpdateBufferSize();
-        forceUpdate_ = true;
+        vertexBuffer_->ClearDataLost();
+        indexBuffer_->ClearDataLost();
+        bufferSizeDirty_ = true;
     }
     
-    if (vertexBuffer_->IsDataLost())
+    if (bufferSizeDirty_)
     {
-        vertexBuffer_->ClearDataLost();
-        bufferDirty_ = true;
+        UpdateBufferSize();
         forceUpdate_ = true;
     }
     
@@ -150,7 +155,7 @@ void BillboardSet::UpdateGeometry(const FrameInfo& frame)
 
 UpdateGeometryType BillboardSet::GetUpdateGeometryType()
 {
-    if (bufferDirty_ || bufferSizeDirty_ || (vertexBuffer_ && vertexBuffer_->IsDataLost()))
+    if (bufferDirty_ || bufferSizeDirty_ || vertexBuffer_->IsDataLost() || indexBuffer_->IsDataLost())
         return UPDATE_MAIN_THREAD;
     else
         return UPDATE_NONE;
@@ -333,19 +338,12 @@ void BillboardSet::OnWorldBoundingBoxUpdate()
 
 void BillboardSet::UpdateBufferSize()
 {
-    if (!vertexBuffer_ || !indexBuffer_)
-    {
-        vertexBuffer_ = new VertexBuffer(context_);
-        indexBuffer_ = new IndexBuffer(context_);
-        
-        batches_[0].geometry_->SetVertexBuffer(0, vertexBuffer_, MASK_POSITION | MASK_COLOR | MASK_TEXCOORD1 | MASK_TEXCOORD2);
-        batches_[0].geometry_->SetIndexBuffer(indexBuffer_);
-    }
-    
     unsigned numBillboards = billboards_.Size();
     
-    vertexBuffer_->SetSize(numBillboards * 4, MASK_POSITION | MASK_COLOR | MASK_TEXCOORD1 | MASK_TEXCOORD2, true);
-    indexBuffer_->SetSize(numBillboards * 6, false);
+    if (vertexBuffer_->GetVertexCount() != numBillboards * 4)
+        vertexBuffer_->SetSize(numBillboards * 4, MASK_POSITION | MASK_COLOR | MASK_TEXCOORD1 | MASK_TEXCOORD2, true);
+    if (indexBuffer_->GetIndexCount() != numBillboards * 6)
+        indexBuffer_->SetSize(numBillboards * 6, false);
     
     bufferSizeDirty_ = false;
     bufferDirty_ = true;