/************************************************************************************//*!
\file ECS.hxx
\author Tng Kah Wei, kahwei.tng, 390009620
\par email: kahwei.tng\@digipen.edu
\date Oct 28, 2021
\brief Contains the definitions of the GameObject managed class which define an
abstraction for working with Entities in managed code.
Note: This file is written in C++17/CLI.
Copyright (C) 2021 DigiPen Institute of Technology.
Reproduction or disclosure of this file or its contents without the prior written consent
of DigiPen Institute of Technology is prohibited.
*//*************************************************************************************/
#pragma once
// External Dependencies
#include "Engine/ECS_Base/System/SHComponentManager.h"
// Project Includes
#include "Components/Component.hxx"
namespace SHADE
{
///
/// Static class which contains functions that map Pls::ECS's Component manipulation
/// functions to managed generic functions.
///
private ref class ECS abstract sealed
{
public:
/*-----------------------------------------------------------------------------*/
/* Component Manipulation Functions */
/*-----------------------------------------------------------------------------*/
///
/// Adds a Component to the specified Entity.
///
/// Type of the Component to add.
///
/// Entity object that should have the specified Component added to.
///
/// Reference to the Component that was added.
generic where T : BaseComponent
static T AddComponent(EntityID entity);
///
/// Gets a Component from the specified Entity.
///
/// Type of the Component to get.
/// Entity object to get the Component from.
///
/// Reference to the Component or null if the Entity does not have the
/// specified Component.
///
generic where T : BaseComponent
static T GetComponent(EntityID entity);
///
/// Retrieves the first Component from the specified GameObjectt's children that
/// matches the specified type.
///
/// Type of the Component to get.
/// Entity object to get the Component from.
///
/// Reference to the Component or null if the Entity does not have the
/// specified Component.
///
generic where T : BaseComponent
static T GetComponentInChildren(EntityID entity);
///
/// Ensures a Component on the specified Entity.
///
/// Type of the Component to ensure.
/// Entity object to ensure the Component on.
/// Reference to the Component.
generic where T : BaseComponent
static T EnsureComponent(EntityID entity);
///
/// Checks if the specified Entity has the specified Component.
///
/// Type of the Component to check for.
/// Entity object to check for the Component.
///
/// True if the specified Entity has the specified Component. False otherwise.
///
generic where T : BaseComponent
static bool HasComponent(EntityID entity);
///
/// Removes a Component from the specified Entity.
///
/// Type of the Component to remove.
///
/// Entity object that should have the specified Component removed from/
///
generic where T : BaseComponent
static void RemoveComponent(EntityID entity);
internal:
/*-----------------------------------------------------------------------------*/
/* Type Definitions */
/*-----------------------------------------------------------------------------*/
///
/// Pointer to a function for Component manipulation operations.
///
using ComponentFunc = void(*)(const EntityID&);
using ComponentHasFunc = bool(*)(const EntityID&);
///
/// Contains a set of Component related data used for resolving operations for
/// each Component.
///
value struct ComponentSet
{
public:
System::Type^ Type;
ComponentFunc AddFunction;
ComponentHasFunc HasFunction;
ComponentFunc RemoveFunction;
};
/*-----------------------------------------------------------------------------*/
/* Static Functions */
/*-----------------------------------------------------------------------------*/
///
/// Retrieves a pointer to the native unmanaged component of the specified
/// Entity.
///
///
/// Pointer to the native component. Will be nullptr if it does not exist.
///
///
/// Thrown if the Entity specified is invalid.
///
///
/// Thrown if an attempt to retrieve the native component fails.
///
template
static NativeComponent* GetNativeComponent(Entity entity);
private:
/*-----------------------------------------------------------------------------*/
/* Constructors */
/*-----------------------------------------------------------------------------*/
///
/// Static constructor to initialize static data
///
static ECS();
/*-----------------------------------------------------------------------------*/
/* Static Data Members */
/*-----------------------------------------------------------------------------*/
static System::Collections::Generic::List componentMap;
/*-----------------------------------------------------------------------------*/
/* Helper Functions */
/*-----------------------------------------------------------------------------*/
///
/// Creates a ComponentSet for a pair of Native and Managed Components.
///
/// Type of the Native Component.
/// Type of the Managed Component.
/// ComponentSet for the parameters specified.
template
static ComponentSet createComponentSet();
///
/// Creates an instance of the Managed representation of a Component with a
/// native Entity.
///
/// Type of Component to create.
/// Native Entity that this Component is tied to.
/// The created Managed representation of the Component.
generic where T : BaseComponent
static T createManagedComponent(EntityID entity);
};
}
#include "ECS.h++"