Advertisement
vivienneanthony

fix thins hmmm.

Mar 17th, 2016
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.18 KB | None | 0 0
  1.  
  2. void ImGuiInterface::RenderDrawLists(ImDrawData* data)
  3. {
  4.     ImDrawList** const cmd_lists = data->CmdLists;
  5.     int cmd_lists_count = data->CmdListsCount;
  6.  
  7.     // Engine does not render when window is closed or device is lost
  8.     assert(graphics_ && graphics_->IsInitialized() && !graphics_->IsDeviceLost());
  9.  
  10.     if (cmd_lists_count == 0)
  11.         return;
  12.  
  13.     Vector2 invScreenSize(1.0f / (float)graphics_->GetWidth(), 1.0f / (float)graphics_->GetHeight());
  14.     Vector2 scale(2.0f * invScreenSize.x_, -2.0f * invScreenSize.y_);
  15.     Vector2 offset(-1.0f, 1.0f);
  16.  
  17.     Matrix4 projection(Matrix4::IDENTITY);
  18.     projection.m00_ = scale.x_;
  19.     projection.m03_ = offset.x_;
  20.     projection.m11_ = scale.y_;
  21.     projection.m13_ = offset.y_;
  22.     projection.m22_ = 1.0f;
  23.     projection.m23_ = 0.0f;
  24.     projection.m33_ = 1.0f;
  25.  
  26.  
  27.     graphics_->ClearParameterSources();
  28.     graphics_->SetColorWrite(true);
  29.     graphics_->SetCullMode(CULL_NONE);
  30.     graphics_->SetDepthTest(CMP_ALWAYS);
  31.     graphics_->SetDepthWrite(false);
  32.     graphics_->SetFillMode(FILL_SOLID);
  33.     graphics_->SetStencilTest(false);
  34.     graphics_->ResetRenderTargets();
  35.     graphics_->SetBlendMode(BLEND_ALPHA);
  36.  
  37.  
  38.  
  39.     ShaderVariation* noTextureVS = graphics_->GetShader(VS, "IMGUI", "VERTEXCOLOR");
  40.     ShaderVariation* diffTextureVS = graphics_->GetShader(VS, "IMGUI", "DIFFMAP VERTEXCOLOR");
  41.     ShaderVariation* noTexturePS = graphics_->GetShader(PS, "IMGUI", "VERTEXCOLOR");
  42.     ShaderVariation* diffTexturePS = graphics_->GetShader(PS, "IMGUI", "DIFFMAP VERTEXCOLOR");
  43.     ShaderVariation* diffMaskTexturePS = graphics_->GetShader(PS, "IMGUI", "DIFFMAP ALPHAMASK VERTEXCOLOR");
  44.     ShaderVariation* alphaTexturePS = graphics_->GetShader(PS, "IMGUI", "ALPHAMAP VERTEXCOLOR");
  45.  
  46.     unsigned alphaFormat = Graphics::GetAlphaFormat();
  47.  
  48.     /// resize buffers
  49. #if defined(URHO3D_D3D11)
  50.     // TODO: for D3D11 : cannot set vertex/index buffer to dynamic. bug ? does it need to be dynamic ?
  51.     if ((int)vertexBuffer_->GetVertexCount() < data->TotalVtxCount || (int)vertexBuffer_->GetVertexCount() > data->TotalVtxCount * 2)
  52.         vertexBuffer_->SetSize(data->TotalVtxCount, MASK_POSITION | MASK_COLOR | MASK_TEXCOORD1, false);
  53.  
  54.     if ((int)indexBuffer_->GetIndexCount() < data->TotalIdxCount || (int)indexBuffer_->GetIndexCount() > data->TotalIdxCount * 2)
  55.         indexBuffer_->SetSize(data->TotalIdxCount, false, false);
  56. #else
  57.     if ((int)vertexBuffer_->GetVertexCount() < data->TotalVtxCount || (int)vertexBuffer_->GetVertexCount() > data->TotalVtxCount * 2)
  58.         vertexBuffer_->SetSize(data->TotalVtxCount, MASK_POSITION | MASK_COLOR | MASK_TEXCOORD1, true);
  59.  
  60.     if ((int)indexBuffer_->GetIndexCount() < data->TotalIdxCount || (int)indexBuffer_->GetIndexCount() > data->TotalIdxCount * 2)
  61.         indexBuffer_->SetSize(data->TotalIdxCount, false, true);
  62. #endif
  63.  
  64.     // Copy and convert all vertices into a single contiguous buffer
  65.  
  66.     //      int vtx_list_offset = 0;
  67.     //      int idx_list_offset = 0;
  68.     //      for (int n = 0; n < data->CmdListsCount; n++)
  69.     //      {
  70.     //          const ImDrawList* cmd_list = data->CmdLists[n];
  71.     //
  72.     //          vertexBuffer_->SetDataRange(&cmd_list->VtxBuffer[0], vtx_list_offset, cmd_list->VtxBuffer.size());
  73.     //          indexBuffer_->SetDataRange(&cmd_list->IdxBuffer[0], idx_list_offset, cmd_list->IdxBuffer.size());
  74.     //
  75.     //          vtx_list_offset += cmd_list->VtxBuffer.size();
  76.     //          idx_list_offset += cmd_list->IdxBuffer.size();
  77.     //      }
  78.  
  79. #ifndef GL_ES_VERSION_2_0
  80.     ImDrawVert* vtx_dst = (ImDrawVert*)vertexBuffer_->Lock(0, data->TotalVtxCount);
  81.     ImDrawIdx* idx_dst = (ImDrawIdx*)indexBuffer_->Lock(0, data->TotalIdxCount);
  82.     for (int n = 0; n < data->CmdListsCount; n++)
  83.     {
  84.         const ImDrawList* cmd_list = data->CmdLists[n];
  85.         memcpy(vtx_dst, &cmd_list->VtxBuffer[0], cmd_list->VtxBuffer.size() * sizeof(ImDrawVert));
  86.         memcpy(idx_dst, &cmd_list->IdxBuffer[0], cmd_list->IdxBuffer.size() * sizeof(ImDrawIdx));
  87.         vtx_dst += cmd_list->VtxBuffer.size();
  88.         idx_dst += cmd_list->IdxBuffer.size();
  89.     }
  90.     vertexBuffer_->Unlock();
  91.     indexBuffer_->Unlock();
  92. #endif
  93.  
  94.     graphics_->SetVertexBuffer(vertexBuffer_);
  95.     graphics_->SetIndexBuffer(indexBuffer_);
  96.  
  97.     // Render command lists
  98.     int vtx_offset = 0;
  99.     int idx_offset = 0;
  100.     for (int n = 0; n < data->CmdListsCount; n++)
  101.     {
  102.         const ImDrawList* cmd_list = data->CmdLists[n];
  103. #ifdef GL_ES_VERSION_2_0
  104.  
  105.         vertexBuffer_->SetDataRange(&cmd_list->VtxBuffer[0], 0, cmd_list->VtxBuffer.size());
  106.         indexBuffer_->SetDataRange(&cmd_list->IdxBuffer[0], 0, cmd_list->IdxBuffer.size());
  107.  
  108.         idx_offset = 0;
  109. #endif
  110.  
  111.         for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.size(); cmd_i++)
  112.         {
  113.             const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i];
  114.             if (pcmd->UserCallback)
  115.             {
  116.                 pcmd->UserCallback(cmd_list, pcmd);
  117.             }
  118.             else
  119.             {
  120.                 Texture* texture = (Urho3D::Texture*)(intptr_t)pcmd->TextureId;
  121.                 ShaderVariation* ps;
  122.                 ShaderVariation* vs;
  123.                 if (!texture)
  124.                 {
  125.                     ps = noTexturePS;
  126.                     vs = noTextureVS;
  127.                 }
  128.                 else
  129.                 {
  130.                     vs = diffTextureVS;
  131.                     // If texture contains only an alpha channel, use alpha shader (for fonts)
  132.                     if (texture->GetFormat() == alphaFormat)
  133.                         ps = alphaTexturePS;
  134.                     //                      else if (blendMode_ != BLEND_ALPHA && batch.blendMode_ != BLEND_ADDALPHA && batch.blendMode_ != BLEND_PREMULALPHA)
  135.                     //                                  ps = diffMaskTexturePS;
  136.                     else
  137.                         ps = diffTexturePS;
  138.                 }
  139.  
  140.                 graphics_->SetShaders(vs, ps);
  141.  
  142.                 if (graphics_->NeedParameterUpdate(SP_OBJECT, this))
  143.                     graphics_->SetShaderParameter(VSP_MODEL, Matrix3x4::IDENTITY);
  144.                 if (graphics_->NeedParameterUpdate(SP_CAMERA, this))
  145.                     graphics_->SetShaderParameter(VSP_VIEWPROJ, projection);
  146.                 if (graphics_->NeedParameterUpdate(SP_MATERIAL, this))
  147.                     graphics_->SetShaderParameter(PSP_MATDIFFCOLOR, Color(1.0f, 1.0f, 1.0f, 1.0f));
  148.  
  149.                 graphics_->SetScissorTest(true, IntRect((int)pcmd->ClipRect.x, (int)(pcmd->ClipRect.y),
  150.                                                         (int)(pcmd->ClipRect.z), (int)(pcmd->ClipRect.w)));
  151.  
  152.                 graphics_->SetTexture(0, texture);
  153.  
  154. #if defined(URHO3D_OPENGL)
  155.  
  156. #ifdef GL_ES_VERSION_2_0
  157.                 graphics_->Draw(TRIANGLE_LIST, idx_offset, pcmd->ElemCount, 0, cmd_list->VtxBuffer.size());
  158. #else
  159.                 graphics_->Draw(TRIANGLE_LIST, idx_offset, pcmd->ElemCount, vtx_offset, 0, cmd_list->VtxBuffer.size());
  160.  
  161. #endif
  162. #else
  163.                 graphics_->Draw(TRIANGLE_LIST, idx_offset, pcmd->ElemCount, vtx_offset, 0, cmd_list->VtxBuffer.size());
  164. #endif
  165.             }
  166.             idx_offset += pcmd->ElemCount;
  167.         }
  168.         vtx_offset += cmd_list->VtxBuffer.size();
  169.     }
  170.     ALPHAENGINE_LOGINFO("process");
  171.  
  172. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement