@@ -1351,65 +1351,49 @@ struct RendererRectC : RendererBase {
1351
1351
mutable ImVec2 UV;
1352
1352
};
1353
1353
1354
- template <typename TGetter1, typename TGetter2, typename TTransformer>
1355
- struct ShadedClipRenderer {
1356
- ShadedClipRenderer (const TGetter1& getter1, const TGetter2& getter2, const TTransformer& transformer, ImU32 col) :
1357
- Getter1 (getter1),
1358
- Getter2 (getter2),
1359
- Transformer (transformer),
1360
- Prims (ImMin(Getter1.Count, Getter2.Count) - 1 ),
1361
- Col (col)
1362
- {
1363
- P11 = Transformer (Getter1 (0 ));
1364
- P12 = Transformer (Getter2 (0 ));
1365
- }
1366
-
1367
- inline bool operator ()(ImDrawList& DrawList, const ImRect& /* cull_rect*/ , const ImVec2& uv, int prim) const {
1368
- // TODO: Culling
1369
- ImVec2 P21 = Transformer (Getter1 (prim+1 ));
1370
- ImVec2 P22 = Transformer (Getter2 (prim+1 ));
1354
+ template <typename _Getter>
1355
+ struct RendererShadedClip : RendererShaded {
1356
+ IMPLOT_INLINE bool Render (ImDrawList& draw_list, const ImRect& cull_rect, int prim) const {
1357
+ ImVec2 P21 = this ->Transformer (Getter1 (prim+1 ));
1358
+ ImVec2 P22 = this ->Transformer (Getter2 (prim+1 ));
1359
+ ImRect rect (ImMin (ImMin (ImMin (P11,P12),P21),P22), ImMax (ImMax (ImMax (P11,P12),P21),P22));
1360
+ if (!cull_rect.Overlaps (rect)) {
1361
+ P11 = P21;
1362
+ P12 = P22;
1363
+ return false ;
1364
+ }
1371
1365
const int intersect = (P11.y > P12.y && P22.y > P21.y ) || (P12.y > P11.y && P21.y > P22.y );
1372
1366
ImVec2 intersection = Intersection (P11,P21,P12,P22);
1373
- DrawList ._VtxWritePtr [0 ].pos = P11;
1374
- DrawList ._VtxWritePtr [0 ].uv = uv ;
1375
- DrawList ._VtxWritePtr [0 ].col = Col;
1376
- DrawList ._VtxWritePtr [1 ].pos = P21;
1377
- DrawList ._VtxWritePtr [1 ].uv = uv ;
1378
- DrawList ._VtxWritePtr [1 ].col = Col;
1379
- DrawList ._VtxWritePtr [2 ].pos = intersection;
1380
- DrawList ._VtxWritePtr [2 ].uv = uv ;
1381
- DrawList ._VtxWritePtr [2 ].col = Col;
1382
- DrawList ._VtxWritePtr [3 ].pos = P12;
1383
- DrawList ._VtxWritePtr [3 ].uv = uv ;
1384
- DrawList ._VtxWritePtr [3 ].col = Col;
1385
- DrawList ._VtxWritePtr [4 ].pos = P22;
1386
- DrawList ._VtxWritePtr [4 ].uv = uv ;
1387
- DrawList ._VtxWritePtr [4 ].col = Col;
1388
- DrawList ._VtxWritePtr += 5 ;
1389
- DrawList ._IdxWritePtr [0 ] = (ImDrawIdx)(DrawList ._VtxCurrentIdx );
1390
- DrawList ._IdxWritePtr [1 ] = (ImDrawIdx)(DrawList ._VtxCurrentIdx + 1 + intersect);
1391
- DrawList ._IdxWritePtr [2 ] = (ImDrawIdx)(DrawList ._VtxCurrentIdx + 0 + 3 * (P11.y >= P12.y ) );
1392
- DrawList ._IdxWritePtr [3 ] = (ImDrawIdx)(DrawList ._VtxCurrentIdx + 1 );
1393
- DrawList ._IdxWritePtr [4 ] = (ImDrawIdx)(DrawList ._VtxCurrentIdx + 3 - intersect);
1394
- DrawList ._IdxWritePtr [5 ] = (ImDrawIdx)(DrawList ._VtxCurrentIdx + 1 + 3 * (P21.y >= P22.y ) );
1395
- DrawList ._IdxWritePtr += 6 ;
1396
- DrawList ._VtxCurrentIdx += 5 ;
1367
+ draw_list ._VtxWritePtr [0 ].pos = P11;
1368
+ draw_list ._VtxWritePtr [0 ].uv = UV ;
1369
+ draw_list ._VtxWritePtr [0 ].col = Col;
1370
+ draw_list ._VtxWritePtr [1 ].pos = P21;
1371
+ draw_list ._VtxWritePtr [1 ].uv = UV ;
1372
+ draw_list ._VtxWritePtr [1 ].col = Col;
1373
+ draw_list ._VtxWritePtr [2 ].pos = intersection;
1374
+ draw_list ._VtxWritePtr [2 ].uv = UV ;
1375
+ draw_list ._VtxWritePtr [2 ].col = Col;
1376
+ draw_list ._VtxWritePtr [3 ].pos = P12;
1377
+ draw_list ._VtxWritePtr [3 ].uv = UV ;
1378
+ draw_list ._VtxWritePtr [3 ].col = Col;
1379
+ draw_list ._VtxWritePtr [4 ].pos = P22;
1380
+ draw_list ._VtxWritePtr [4 ].uv = UV ;
1381
+ draw_list ._VtxWritePtr [4 ].col = Col;
1382
+ draw_list ._VtxWritePtr += 5 ;
1383
+ draw_list ._IdxWritePtr [0 ] = (ImDrawIdx)(draw_list ._VtxCurrentIdx );
1384
+ draw_list ._IdxWritePtr [1 ] = (ImDrawIdx)(draw_list ._VtxCurrentIdx + 1 + intersect);
1385
+ draw_list ._IdxWritePtr [2 ] = (ImDrawIdx)(draw_list ._VtxCurrentIdx + 0 + 3 * (P11.y >= P12.y ) );
1386
+ draw_list ._IdxWritePtr [3 ] = (ImDrawIdx)(draw_list ._VtxCurrentIdx + 1 );
1387
+ draw_list ._IdxWritePtr [4 ] = (ImDrawIdx)(draw_list ._VtxCurrentIdx + 3 - intersect);
1388
+ draw_list ._IdxWritePtr [5 ] = (ImDrawIdx)(draw_list ._VtxCurrentIdx + 1 + 3 * (P21.y >= P22.y ) );
1389
+ draw_list ._IdxWritePtr += 6 ;
1390
+ draw_list ._VtxCurrentIdx += 5 ;
1397
1391
P11 = P21;
1398
1392
P12 = P22;
1399
1393
return true ;
1400
1394
}
1401
- const TGetter1& Getter1;
1402
- const TGetter2& Getter2;
1403
- const TTransformer& Transformer;
1404
- const int Prims;
1405
- const ImU32 Col;
1406
- mutable ImVec2 P11;
1407
- mutable ImVec2 P12;
1408
- static const int IdxConsumed = 6 ;
1409
- static const int VtxConsumed = 5 ;
1410
1395
};
1411
1396
1412
-
1413
1397
// -----------------------------------------------------------------------------
1414
1398
// [SECTION] RenderPrimitives
1415
1399
// -----------------------------------------------------------------------------
@@ -1850,6 +1834,7 @@ void PlotShaded(const char* label_id, const T* xs, const T* ys1, const T* ys2, i
1850
1834
CALL_INSTANTIATE_FOR_NUMERIC_TYPES ()
1851
1835
#undef INSTANTIATE_MACRO
1852
1836
1837
+ // custom
1853
1838
void PlotShadedG (const char * label_id, ImPlotGetter getter_func1, void * data1, ImPlotGetter getter_func2, void * data2, int count, ImPlotShadedFlags flags) {
1854
1839
GetterFuncPtr getter1 (getter_func1, data1, count);
1855
1840
GetterFuncPtr getter2 (getter_func2, data2, count);
@@ -1860,55 +1845,61 @@ void PlotShadedG(const char* label_id, ImPlotGetter getter_func1, void* data1, I
1860
1845
// [SECTION] PlotShadedClip
1861
1846
// -----------------------------------------------------------------------------
1862
1847
1848
+ // NEW
1863
1849
template <typename Getter1, typename Getter2>
1864
- inline void PlotShadedClipEx (const char * label_id, const Getter1& getter1, const Getter2& getter2) {
1865
- if (BeginItem (label_id, ImPlotCol_Fill)) {
1866
- if (FitThisFrame ()) {
1867
- for (int i = 0 ; i < ImMin (getter1.Count , getter2.Count ); ++i) {
1868
- ImPlotPoint p1 = getter1 (i);
1869
- ImPlotPoint p2 = getter2 (i);
1870
- FitPoint (p1);
1871
- FitPoint (p2);
1872
- }
1873
- }
1850
+ void PlotShadedClipEx (const char * label_id, const Getter1& getter1, const Getter2& getter2, ImPlotShadedFlags flags) {
1851
+ if (BeginItemEx (label_id, Fitter2<Getter1,Getter2>(getter1,getter2), flags, ImPlotCol_Fill)) {
1874
1852
const ImPlotNextItemData& s = GetItemData ();
1875
- ImDrawList & DrawList = *GetPlotDrawList ();
1876
1853
if (s.RenderFill ) {
1877
- ImU32 col = ImGui::GetColorU32 (s.Colors [ImPlotCol_Fill]);
1878
- switch (GetCurrentScale ()) {
1879
- case ImPlotScale_LinLin: RenderPrimitives (ShadedClipRenderer<Getter1,Getter2,TransformerLinLin>(getter1,getter2,TransformerLinLin (), col), DrawList, GImPlot->CurrentPlot ->PlotRect ); break ;
1880
- case ImPlotScale_LogLin: RenderPrimitives (ShadedClipRenderer<Getter1,Getter2,TransformerLogLin>(getter1,getter2,TransformerLogLin (), col), DrawList, GImPlot->CurrentPlot ->PlotRect ); break ;
1881
- case ImPlotScale_LinLog: RenderPrimitives (ShadedClipRenderer<Getter1,Getter2,TransformerLinLog>(getter1,getter2,TransformerLinLog (), col), DrawList, GImPlot->CurrentPlot ->PlotRect ); break ;
1882
- case ImPlotScale_LogLog: RenderPrimitives (ShadedClipRenderer<Getter1,Getter2,TransformerLogLog>(getter1,getter2,TransformerLogLog (), col), DrawList, GImPlot->CurrentPlot ->PlotRect ); break ;
1883
- }
1854
+ const ImU32 col = ImGui::GetColorU32 (s.Colors [ImPlotCol_Fill]);
1855
+ RenderPrimitives2<RendererShadedClip>(getter1,getter2,col);
1884
1856
}
1885
1857
EndItem ();
1886
1858
}
1887
1859
}
1888
1860
1889
1861
template <typename T>
1890
- void PlotShadedClip (const char * label_id, const T* xs, const T* ys1, const T* ys2, int count, int offset, int stride) {
1891
- GetterXsYs<T> getter1 (xs, ys1, count, offset, stride);
1892
- GetterXsYs<T> getter2 (xs, ys2, count, offset, stride);
1893
- PlotShadedClipEx (label_id, getter1, getter2);
1894
- }
1895
-
1896
- template IMPLOT_API void PlotShadedClip<ImS8>(const char * label_id, const ImS8* xs, const ImS8* ys1, const ImS8* ys2, int count, int offset, int stride);
1897
- template IMPLOT_API void PlotShadedClip<ImU8>(const char * label_id, const ImU8* xs, const ImU8* ys1, const ImU8* ys2, int count, int offset, int stride);
1898
- template IMPLOT_API void PlotShadedClip<ImS16>(const char * label_id, const ImS16* xs, const ImS16* ys1, const ImS16* ys2, int count, int offset, int stride);
1899
- template IMPLOT_API void PlotShadedClip<ImU16>(const char * label_id, const ImU16* xs, const ImU16* ys1, const ImU16* ys2, int count, int offset, int stride);
1900
- template IMPLOT_API void PlotShadedClip<ImS32>(const char * label_id, const ImS32* xs, const ImS32* ys1, const ImS32* ys2, int count, int offset, int stride);
1901
- template IMPLOT_API void PlotShadedClip<ImU32>(const char * label_id, const ImU32* xs, const ImU32* ys1, const ImU32* ys2, int count, int offset, int stride);
1902
- template IMPLOT_API void PlotShadedClip<ImS64>(const char * label_id, const ImS64* xs, const ImS64* ys1, const ImS64* ys2, int count, int offset, int stride);
1903
- template IMPLOT_API void PlotShadedClip<ImU64>(const char * label_id, const ImU64* xs, const ImU64* ys1, const ImU64* ys2, int count, int offset, int stride);
1904
- template IMPLOT_API void PlotShadedClip<float >(const char * label_id, const float * xs, const float * ys1, const float * ys2, int count, int offset, int stride);
1905
- template IMPLOT_API void PlotShadedClip<double >(const char * label_id, const double * xs, const double * ys1, const double * ys2, int count, int offset, int stride);
1862
+ void PlotShadedClip (const char * label_id, const T* values, int count, double y_ref, double xscale, double x0, ImPlotShadedFlags flags, int offset, int stride) {
1863
+ if (!(y_ref > -DBL_MAX))
1864
+ y_ref = GetPlotLimits (IMPLOT_AUTO,IMPLOT_AUTO).Y .Min ;
1865
+ if (!(y_ref < DBL_MAX))
1866
+ y_ref = GetPlotLimits (IMPLOT_AUTO,IMPLOT_AUTO).Y .Max ;
1867
+ GetterXY<IndexerLin,IndexerIdx<T>> getter1 (IndexerLin (xscale,x0),IndexerIdx<T>(values,count,offset,stride),count);
1868
+ GetterXY<IndexerLin,IndexerConst> getter2 (IndexerLin (xscale,x0),IndexerConst (y_ref),count);
1869
+ PlotShadedClipEx (label_id, getter1, getter2, flags);
1870
+ }
1871
+
1872
+ template <typename T>
1873
+ void PlotShadedClip (const char * label_id, const T* xs, const T* ys, int count, double y_ref, ImPlotShadedFlags flags, int offset, int stride) {
1874
+ if (y_ref == -HUGE_VAL)
1875
+ y_ref = GetPlotLimits (IMPLOT_AUTO,IMPLOT_AUTO).Y .Min ;
1876
+ if (y_ref == HUGE_VAL)
1877
+ y_ref = GetPlotLimits (IMPLOT_AUTO,IMPLOT_AUTO).Y .Max ;
1878
+ GetterXY<IndexerIdx<T>,IndexerIdx<T>> getter1 (IndexerIdx<T>(xs,count,offset,stride),IndexerIdx<T>(ys,count,offset,stride),count);
1879
+ GetterXY<IndexerIdx<T>,IndexerConst> getter2 (IndexerIdx<T>(xs,count,offset,stride),IndexerConst (y_ref),count);
1880
+ PlotShadedClipEx (label_id, getter1, getter2, flags);
1881
+ }
1882
+
1883
+
1884
+ template <typename T>
1885
+ void PlotShadedClip (const char * label_id, const T* xs, const T* ys1, const T* ys2, int count, ImPlotShadedFlags flags, int offset, int stride) {
1886
+ GetterXY<IndexerIdx<T>,IndexerIdx<T>> getter1 (IndexerIdx<T>(xs,count,offset,stride),IndexerIdx<T>(ys1,count,offset,stride),count);
1887
+ GetterXY<IndexerIdx<T>,IndexerIdx<T>> getter2 (IndexerIdx<T>(xs,count,offset,stride),IndexerIdx<T>(ys2,count,offset,stride),count);
1888
+ PlotShadedClipEx (label_id, getter1, getter2, flags);
1889
+ }
1890
+
1891
+ #define INSTANTIATE_MACRO (T ) \
1892
+ template IMPLOT_API void PlotShadedClip<T>(const char * label_id, const T* values, int count, double y_ref, double xscale, double x0, ImPlotShadedFlags flags, int offset, int stride); \
1893
+ template IMPLOT_API void PlotShadedClip<T>(const char * label_id, const T* xs, const T* ys, int count, double y_ref, ImPlotShadedFlags flags, int offset, int stride); \
1894
+ template IMPLOT_API void PlotShadedClip<T>(const char * label_id, const T* xs, const T* ys1, const T* ys2, int count, ImPlotShadedFlags flags, int offset, int stride);
1895
+ CALL_INSTANTIATE_FOR_NUMERIC_TYPES ()
1896
+ #undef INSTANTIATE_MACRO
1906
1897
1907
1898
// custom
1908
- void PlotShadedClipG (const char * label_id, ImPlotPoint (*g1)( void * data, int idx), void* data1, ImPlotPoint (*g2)( void * data, int idx), void* data2, int count, int offset ) {
1909
- GetterFuncPtr getter1 (g1 , data1, count, offset );
1910
- GetterFuncPtr getter2 (g2 , data2, count, offset );
1911
- PlotShadedClipEx (label_id, getter1, getter2);
1899
+ void PlotShadedClipG (const char * label_id, ImPlotGetter getter_func1, void * data1, ImPlotGetter getter_func2, void * data2, int count, ImPlotShadedFlags flags ) {
1900
+ GetterFuncPtr getter1 (getter_func1 , data1, count);
1901
+ GetterFuncPtr getter2 (getter_func2 , data2, count);
1902
+ PlotShadedClipEx (label_id, getter1, getter2, flags );
1912
1903
}
1913
1904
1914
1905
// -----------------------------------------------------------------------------
0 commit comments