// Copyright (C) 2021 Jérôme "Lynix" Leclercq (lynix680@gmail.com) // This file is part of the "Nazara Engine - OpenGL renderer" // For conditions of distribution and use, see copyright notice in Config.hpp #include #include #include #include #include namespace Nz::GL { template ContextObject::ContextObject(const Context& context, CreateArgs... args) { ErrorFlags errFlags(ErrorMode::ThrowException); Create(context, args...); } template ContextObject::~ContextObject() { Destroy(); } template bool ContextObject::Create(const Context& context, CreateArgs... args) { Destroy(); m_context = &context; EnsureContext(); m_objectId = C::CreateHelper(*m_context, args...); if (m_objectId == InvalidObject) { NazaraError("Failed to create OpenGL object"); //< TODO: Handle error message return false; } return true; } template void ContextObject::Destroy() { if (IsValid()) { EnsureContext(); C::DestroyHelper(*m_context, m_objectId); m_objectId = InvalidObject; } } template const Context& ContextObject::EnsureContext() const { const Context* activeContext = Context::GetCurrentContext(); if (activeContext != m_context.Get()) { if (!Context::SetCurrentContext(m_context.Get())) throw std::runtime_error("failed to activate context"); } return *m_context; } template bool ContextObject::IsValid() const { return m_objectId != InvalidObject; } template const Context* ContextObject::GetContext() const { return m_context.Get(); } template GLuint ContextObject::GetObjectId() const { return m_objectId; } template void ContextObject::SetDebugName(const std::string_view& name) { EnsureContext(); if (m_context->glObjectLabel) m_context->glObjectLabel(ObjectType, m_objectId, name.size(), name.data()); } } #include