Files
marohook/Andromeda-CS2-Base/Andromeda-CS2-Base/AndromedaClient/Render/CRenderStackSystem.cpp
T
2025-10-20 14:00:35 +03:00

196 lines
6.2 KiB
C++

#include "CRenderStackSystem.hpp"
#include "CRender.hpp"
static CRenderStackSystem g_CRenderStackSystem{};
auto CRenderObjectDrawLine::OnRender() -> void
{
GetRender()->DrawLine( m_Start , m_End , m_Color , m_Thickness );
}
auto CRenderObjectDrawBox::OnRender() -> void
{
GetRender()->DrawBox( m_Min , m_Max , m_Color );
}
auto CRenderObjectDrawOutlineBox::OnRender() -> void
{
GetRender()->DrawOutlineBox( m_Min , m_Max , m_Color );
}
auto CRenderObjectDrawCoalBox::OnRender() -> void
{
GetRender()->DrawCoalBox( m_Min , m_Max , m_Color );
}
auto CRenderObjectDrawOutlineCoalBox::OnRender() -> void
{
GetRender()->DrawOutlineCoalBox( m_Min , m_Max , m_Color );
}
auto CRenderObjectDrawFillBox::OnRender() -> void
{
GetRender()->DrawFillBox( m_Min , m_Max , m_Color );
}
auto CRenderObjectDrawRectFilledMultiColor::OnRender() -> void
{
GetRender()->DrawRectFilledMultiColor( m_Min , m_Max , m_Col_upr_left , m_Col_upr_right , m_Col_bot_right , m_Col_bot_left );
}
auto CRenderObjectDrawCircle::OnRender() -> void
{
GetRender()->DrawCircle( m_Center , m_flRadius , m_Color );
}
auto CRenderObjectDrawCircleFilled::OnRender() -> void
{
GetRender()->DrawCircleFilled( m_Center , m_flRadius , m_Color );
}
auto CRenderObjectDrawCircle3D::OnRender() -> void
{
GetRender()->DrawCircle3D( m_Center , m_flRadius , m_Color );
}
auto CRenderObjectDrawTriangleFilled::OnRender() -> void
{
GetRender()->DrawTriangleFilled( m_Center , m_pos1 , m_pos2 , m_Color );
}
auto CRenderObjectDrawString::OnRender() -> void
{
m_pFont->DrawString( m_x , m_y , m_Color , m_Flags , "%s" , m_Text.c_str() );
}
auto CRenderStackSystem::DrawLine( const ImVec2& Start , const ImVec2& End , const ImColor& Color , const float thickness ) -> void
{
std::scoped_lock lock( m_Lock );
m_vecUpdateBuffer.emplace_back( std::make_shared<CRenderObjectDrawLine>( Start , End , Color , thickness ) );
}
auto CRenderStackSystem::DrawBox( const ImVec2& Min , const ImVec2& Max , const ImColor& Color ) -> void
{
std::scoped_lock lock( m_Lock );
m_vecUpdateBuffer.emplace_back( std::make_shared<CRenderObjectDrawBox>( Min , Max , Color ) );
}
auto CRenderStackSystem::DrawOutlineBox( const ImVec2& Min , const ImVec2& Max , const ImColor& Color ) -> void
{
std::scoped_lock lock( m_Lock );
m_vecUpdateBuffer.emplace_back( std::make_shared<CRenderObjectDrawOutlineBox>( Min , Max , Color ) );
}
auto CRenderStackSystem::DrawCoalBox( const ImVec2& Min , const ImVec2& Max , const ImColor& Color ) -> void
{
std::scoped_lock lock( m_Lock );
m_vecUpdateBuffer.push_back( std::make_shared<CRenderObjectDrawCoalBox>( Min , Max , Color ) );
}
auto CRenderStackSystem::DrawOutlineCoalBox( const ImVec2& Min , const ImVec2& Max , const ImColor& Color ) -> void
{
std::scoped_lock lock( m_Lock );
m_vecUpdateBuffer.emplace_back( std::make_shared<CRenderObjectDrawOutlineCoalBox>( Min , Max , Color ) );
}
auto CRenderStackSystem::DrawFillBox( const ImVec2& Min , const ImVec2& Max , const ImColor& Color ) -> void
{
std::scoped_lock lock( m_Lock );
m_vecUpdateBuffer.emplace_back( std::make_shared<CRenderObjectDrawFillBox>( Min , Max , Color ) );
}
auto CRenderStackSystem::DrawRectFilledMultiColor( const ImVec2& Min , const ImVec2& Max , const ImU32 col_upr_left , const ImU32 col_upr_right , const ImU32 col_bot_right , const ImU32 col_bot_left ) -> void
{
std::scoped_lock lock( m_Lock );
m_vecUpdateBuffer.emplace_back( std::make_shared<CRenderObjectDrawRectFilledMultiColor>( Min , Max , col_upr_left , col_upr_right , col_bot_right , col_bot_left ) );
}
auto CRenderStackSystem::DrawCircle( const ImVec2& Center , float radius , const ImColor& Color ) -> void
{
std::scoped_lock lock( m_Lock );
m_vecUpdateBuffer.emplace_back( std::make_shared<CRenderObjectDrawCircle>( Center , radius , Color ) );
}
auto CRenderStackSystem::DrawCircleFilled( const ImVec2& Center , const float radius , const ImColor& Color ) -> void
{
std::scoped_lock lock( m_Lock );
m_vecUpdateBuffer.emplace_back( std::make_shared<CRenderObjectDrawCircleFilled>( Center , radius , Color ) );
}
auto CRenderStackSystem::DrawCircle3D( const Vector3& Center , float radius , const ImColor& Color ) -> void
{
std::scoped_lock lock( m_Lock );
m_vecUpdateBuffer.emplace_back( std::make_shared<CRenderObjectDrawCircle3D>( Center , radius , Color ) );
}
auto CRenderStackSystem::DrawTriangleFilled( const ImVec2& Center , const ImVec2& pos1 , const ImVec2& pos2 , const ImColor& Color ) -> void
{
std::scoped_lock lock( m_Lock );
m_vecUpdateBuffer.emplace_back( std::make_shared<CRenderObjectDrawTriangleFilled>( Center , pos1 , pos2 , Color ) );
}
// TODO: SURIK std::format - kruto, ETO HUETA EBANAYA
auto CRenderStackSystem::DrawString( CFont* pFont , const int X , const int Y , const int Flags , const ImColor& Color , const char* fmt , ... ) -> void
{
char Buffer[g_BufferSize] = { 0 };
va_list va_alist;
va_start( va_alist , fmt );
vsnprintf( Buffer , sizeof( Buffer ) , fmt , va_alist );
va_end( va_alist );
std::scoped_lock lock( m_Lock );
m_vecUpdateBuffer.emplace_back( std::make_shared<CRenderObjectDrawString>( pFont , X , Y , Flags , Color , Buffer ) );
}
auto CRenderStackSystem::DrawString( CFont* pFont , const ImVec2& Pos , const int Flags , const ImColor& Color , const char* fmt , ... ) -> void
{
char Buffer[g_BufferSize] = { 0 };
va_list va_alist;
va_start( va_alist , fmt );
vsnprintf( Buffer , sizeof( Buffer ) , fmt , va_alist );
va_end( va_alist );
DrawString( pFont , static_cast<int>( Pos.x ) , static_cast<int>( Pos.y ) , Flags , Color , Buffer );
}
auto CRenderStackSystem::OnClientOutput() -> void
{
std::scoped_lock lock( m_Lock );
if ( m_vecUpdateBuffer.empty() )
{
// Nothing has been drawn on this frame
m_pSharedBuffer = std::make_shared<RenderObjectsVec_t>();
m_bSharedBufferReady = true;
return;
}
m_pSharedBuffer = std::make_shared<RenderObjectsVec_t>( std::move( m_vecUpdateBuffer ) );
m_bSharedBufferReady = true;
}
auto CRenderStackSystem::OnRenderStack() -> void
{
if ( m_bSharedBufferReady.exchange( false ) )
{
m_pRenderBuffer = std::move( m_pSharedBuffer.load() );
}
if ( m_pRenderBuffer )
{
auto& bufferCopy = *m_pRenderBuffer;
for ( auto& order : bufferCopy )
{
order->OnRender();
}
}
}
auto GetRenderStackSystem() -> CRenderStackSystem*
{
return &g_CRenderStackSystem;
}