Added NativeAsset, Material and Mesh representations along with a stub for Renderable
This commit is contained in:
parent
7e5c819813
commit
9617ed3838
|
@ -0,0 +1,119 @@
|
|||
/************************************************************************************//*!
|
||||
\file Material.cxx
|
||||
\author Tng Kah Wei, kahwei.tng, 390009620
|
||||
\par email: kahwei.tng\@digipen.edu
|
||||
\date Oct 28, 2022
|
||||
\brief Contains the implementation of the functions of the managed Material
|
||||
class.
|
||||
|
||||
Note: This file is written in C++17/CLI.
|
||||
|
||||
Copyright (C) 2022 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.
|
||||
*//*************************************************************************************/
|
||||
// Precompiled Headers
|
||||
#include "SHpch.h"
|
||||
// Primary Header
|
||||
#include "Material.hxx"
|
||||
// Standard Library
|
||||
#include <stdexcept>
|
||||
// Project Includes
|
||||
#include "Utility/Convert.hxx"
|
||||
|
||||
namespace SHADE
|
||||
{
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
/* Macro Definitions */
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
#define SET_PROP(NATIVE_TYPE, MANAGED_TYPE) \
|
||||
(T::typeid == MANAGED_TYPE::typeid) \
|
||||
{ \
|
||||
const NATIVE_TYPE VAL = safe_cast<NATIVE_TYPE>(System::Convert::ChangeType(value, MANAGED_TYPE::typeid)); \
|
||||
NativeObject->SetProperty<NATIVE_TYPE>(PROP_NAME, VAL); \
|
||||
} \
|
||||
|
||||
#define SET_PROP_CONVERT(NATIVE_TYPE, MANAGED_TYPE) \
|
||||
(T::typeid == MANAGED_TYPE::typeid) \
|
||||
{ \
|
||||
const NATIVE_TYPE VAL = Convert::ToNative(safe_cast<MANAGED_TYPE>(System::Convert::ChangeType(value, MANAGED_TYPE::typeid))); \
|
||||
NativeObject->SetProperty<NATIVE_TYPE>(PROP_NAME, VAL); \
|
||||
} \
|
||||
|
||||
#define GET_PROP(NATIVE_TYPE, MANAGED_TYPE) \
|
||||
(T::typeid == MANAGED_TYPE::typeid) \
|
||||
{ \
|
||||
return safe_cast<T>(NativeObject->GetProperty<NATIVE_TYPE>(PROP_NAME)); \
|
||||
} \
|
||||
|
||||
#define GET_PROP_CONVERT(NATIVE_TYPE, MANAGED_TYPE) \
|
||||
(T::typeid == MANAGED_TYPE::typeid) \
|
||||
{ \
|
||||
return safe_cast<T>(Convert::ToCLI(NativeObject->GetProperty<NATIVE_TYPE>(PROP_NAME))); \
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
/* Explicit Template Instantiation */
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
template ref class NativeAsset<SHMaterialInstance>;
|
||||
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
/* Constructors/Destructor */
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
Material::Material(Handle<SHMaterialInstance> material)
|
||||
: NativeAsset<SHMaterialInstance>{ material }
|
||||
{}
|
||||
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
/* Material Properties Functions */
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
generic<typename T>
|
||||
void Material::SetProperty(System::String^ name, T value)
|
||||
{
|
||||
if (!NativeObject)
|
||||
throw gcnew System::InvalidOperationException("Attempted to set property on an invalid material!");
|
||||
|
||||
// Call the correct one based on type
|
||||
const std::string PROP_NAME = Convert::ToNative(name);
|
||||
try
|
||||
{
|
||||
if SET_PROP (int, System::Int32)
|
||||
else if SET_PROP (int, System::Int64)
|
||||
else if SET_PROP (float, float)
|
||||
else if SET_PROP (double, double)
|
||||
else if SET_PROP_CONVERT(SHVec2, Vector2)
|
||||
else if SET_PROP_CONVERT(SHVec3, Vector3)
|
||||
// TODO: Vector4
|
||||
}
|
||||
catch (const std::invalid_argument&)
|
||||
{
|
||||
throw gcnew System::ArgumentException("Attempted to modify an invalid property on a material.");
|
||||
}
|
||||
}
|
||||
|
||||
generic<typename T>
|
||||
T Material::GetProperty(System::String^ name)
|
||||
{
|
||||
if (!NativeObject)
|
||||
throw gcnew System::InvalidOperationException("[Material] Attempted to get property of an invalid material!");
|
||||
|
||||
// Call the correct one based on type
|
||||
const std::string PROP_NAME = Convert::ToNative(name);
|
||||
try
|
||||
{
|
||||
if GET_PROP (int, System::Int32)
|
||||
else if GET_PROP (int, System::Int64)
|
||||
else if GET_PROP (float, float)
|
||||
else if GET_PROP (double, double)
|
||||
else if GET_PROP_CONVERT(SHVec2, Vector2)
|
||||
else if GET_PROP_CONVERT(SHVec3, Vector3)
|
||||
// TODO: Vector4
|
||||
}
|
||||
catch (const std::invalid_argument&)
|
||||
{
|
||||
throw gcnew System::ArgumentException("Attempted to retrieve a property on a material with an invalid type.");
|
||||
}
|
||||
|
||||
throw gcnew System::ArgumentException("Attempted to retrieve an invalid property on a material.");
|
||||
}
|
||||
}
|
|
@ -0,0 +1,81 @@
|
|||
/************************************************************************************//*!
|
||||
\file Material.hxx
|
||||
\author Tng Kah Wei, kahwei.tng, 390009620
|
||||
\par email: kahwei.tng\@digipen.edu
|
||||
\date Oct 28, 2022
|
||||
\brief Contains the definition of the managed Mesh class.
|
||||
|
||||
Note: This file is written in C++17/CLI.
|
||||
|
||||
Copyright (C) 2022 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 "Resource/SHHandle.h"
|
||||
#include "Graphics/MiddleEnd/Interface/SHMaterialInstance.h"
|
||||
// Project Includes
|
||||
#include "NativeAsset.hxx"
|
||||
#include "Engine/GenericHandle.hxx"
|
||||
|
||||
namespace SHADE
|
||||
{
|
||||
/// <summary>
|
||||
/// Managed counterpart of the native MaterialInstance object containing material
|
||||
/// data that can be fed to Renderables for rendering.
|
||||
/// </summary>
|
||||
public ref class Material : public NativeAsset<SHMaterialInstance>
|
||||
{
|
||||
internal:
|
||||
/*-----------------------------------------------------------------------------*/
|
||||
/* Constructors/Destructor */
|
||||
/*-----------------------------------------------------------------------------*/
|
||||
/// <summary>
|
||||
/// Constructor for the Material
|
||||
/// </summary>
|
||||
/// <param name="material">Handle to the native material object.</param>
|
||||
Material(Handle<SHMaterialInstance> material);
|
||||
|
||||
public:
|
||||
/*-----------------------------------------------------------------------------*/
|
||||
/* Properties */
|
||||
/*-----------------------------------------------------------------------------*/
|
||||
// TODO: Change Shader
|
||||
|
||||
/*-----------------------------------------------------------------------------*/
|
||||
/* Material Properties Functions */
|
||||
/*-----------------------------------------------------------------------------*/
|
||||
/// <summary>
|
||||
/// Set the value of a specific property.
|
||||
/// </summary>
|
||||
/// <typeparam name="T">Type of property to set.</typeparam>
|
||||
/// <param name="name">Name of the property to set.</param>
|
||||
/// <param name="value">Value to set te property to.</param>
|
||||
/// <exception cref="System.InvalidOperationException">
|
||||
/// If this Material object is invalid.
|
||||
/// </exception>
|
||||
/// <exception cref="System.ArgumentException">
|
||||
/// If the name or type was specified that does not match the material's shader's
|
||||
/// defined properties.
|
||||
/// </exception>
|
||||
generic<typename T>
|
||||
void SetProperty(System::String^ name, T value);
|
||||
/// <summary>
|
||||
/// Retrieves the value of a specified property on the material.
|
||||
/// </summary>
|
||||
/// <typeparam name="T">Type of property to get.</typeparam>
|
||||
/// <param name="name">Name of the property to get.</param>
|
||||
/// <returns>Value of that property on the material.</returns>
|
||||
/// <exception cref="System.InvalidOperationException">
|
||||
/// If this Material object is invalid.
|
||||
/// </exception>
|
||||
/// <exception cref="System.ArgumentException">
|
||||
/// If the name or type was specified that does not match the material's shader's
|
||||
/// defined properties.
|
||||
/// </exception>
|
||||
generic<typename T>
|
||||
T GetProperty(System::String^ name);
|
||||
};
|
||||
}
|
|
@ -0,0 +1,34 @@
|
|||
/************************************************************************************//*!
|
||||
\file Mesh.cxx
|
||||
\author Tng Kah Wei, kahwei.tng, 390009620
|
||||
\par email: kahwei.tng\@digipen.edu
|
||||
\date Oct 28, 2022
|
||||
\brief Contains the implementation of the functions of the managed Mesh class.
|
||||
|
||||
Note: This file is written in C++17/CLI.
|
||||
|
||||
Copyright (C) 2022 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.
|
||||
*//*************************************************************************************/
|
||||
// Precompiled Headers
|
||||
#include "SHpch.h"
|
||||
// Primary Header
|
||||
#include "Mesh.hxx"
|
||||
// Project Headers
|
||||
#include "Utility/Convert.hxx"
|
||||
|
||||
namespace SHADE
|
||||
{
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
/* Explicit Template Instantiation */
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
template ref class NativeAsset<SHMesh>;
|
||||
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
/* Constructors/Destructor */
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
Mesh::Mesh(Handle<SHMesh> mesh)
|
||||
: NativeAsset<SHMesh> { mesh }
|
||||
{}
|
||||
}
|
|
@ -0,0 +1,41 @@
|
|||
/************************************************************************************//*!
|
||||
\file Mesh.hxx
|
||||
\author Tng Kah Wei, kahwei.tng, 390009620
|
||||
\par email: kahwei.tng\@digipen.edu
|
||||
\date Oct 28, 2022
|
||||
\brief Contains the definition of the managed Mesh class.
|
||||
|
||||
Note: This file is written in C++17/CLI.
|
||||
|
||||
Copyright (C) 2022 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 "Resource/SHHandle.h"
|
||||
#include "Graphics/MiddleEnd/Interface/SHMeshLibrary.h"
|
||||
// Project Includes
|
||||
#include "NativeAsset.hxx"
|
||||
#include "Engine/GenericHandle.hxx"
|
||||
|
||||
namespace SHADE
|
||||
{
|
||||
/// <summary>
|
||||
/// Managed counterpart of the native Mesh object containing vertex data that can
|
||||
/// be fed to Renderables for rendering.
|
||||
/// </summary>
|
||||
public ref class Mesh : public NativeAsset<SHMesh>
|
||||
{
|
||||
internal:
|
||||
/*-----------------------------------------------------------------------------*/
|
||||
/* Constructors/Destructor */
|
||||
/*-----------------------------------------------------------------------------*/
|
||||
/// <summary>
|
||||
/// Constructor for the Mesh
|
||||
/// </summary>
|
||||
/// <param name="mesh">Handle to the mesh object.</param>
|
||||
Mesh(Handle<SHMesh> mesh);
|
||||
};
|
||||
}
|
|
@ -0,0 +1,26 @@
|
|||
/************************************************************************************//*!
|
||||
\file NativeAsset.cxx
|
||||
\author Tng Kah Wei, kahwei.tng, 390009620
|
||||
\par email: kahwei.tng\@digipen.edu
|
||||
\date Oct 28, 2022
|
||||
\brief Contains the explicit template instantiation for some types of the
|
||||
templated managed NativeAsset class.
|
||||
|
||||
Note: This file is written in C++17/CLI.
|
||||
|
||||
Copyright (C) 2022 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.
|
||||
*//*************************************************************************************/
|
||||
#include "SHpch.h"
|
||||
// Primary Include
|
||||
#include "NativeAsset.hxx"
|
||||
// Project Includes
|
||||
#include "Engine/GenericHandle.hxx"
|
||||
|
||||
namespace SHADE
|
||||
{
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
/* Explicit Tempalte Instantiations */
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
}
|
|
@ -0,0 +1,49 @@
|
|||
/************************************************************************************//*!
|
||||
\file NativeAsset.h++
|
||||
\author Tng Kah Wei, kahwei.tng, 390009620
|
||||
\par email: kahwei.tng\@digipen.edu
|
||||
\date Oct 28, 2022
|
||||
\brief Contains the definition of templated functions for the managed
|
||||
NativeAsset classes.
|
||||
|
||||
Note: This file is written in C++17/CLI.
|
||||
|
||||
Copyright (C) 2022 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
|
||||
|
||||
// Primary Include
|
||||
#include "NativeAsset.hxx"
|
||||
|
||||
namespace SHADE
|
||||
{
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
/* Properties */
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
template <typename NativeAssetType>
|
||||
GenericHandle NativeAsset<NativeAssetType>::NativeObjectHandle::get()
|
||||
{
|
||||
return nativeObjHandle;
|
||||
}
|
||||
template <typename NativeAssetType>
|
||||
Handle<NativeAssetType> NativeAsset<NativeAssetType>::NativeObject::get()
|
||||
try
|
||||
{
|
||||
return Handle<NativeAssetType>(Convert::ToNative(nativeObjHandle));
|
||||
}
|
||||
catch (const BadHandleCastException&)
|
||||
{
|
||||
return Handle<NativeAssetType>(); // Null handle
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
/* Constructors */
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
template <typename NativeAssetType>
|
||||
NativeAsset<NativeAssetType>::NativeAsset(Handle<NativeAssetType> nativeObj)
|
||||
: nativeObjHandle{ Convert::ToCLI(Handle<void>(nativeObj)) }
|
||||
{}
|
||||
|
||||
}
|
|
@ -0,0 +1,66 @@
|
|||
/************************************************************************************//*!
|
||||
\file NativeAsset.hxx
|
||||
\author Tng Kah Wei, kahwei.tng, 390009620
|
||||
\par email: kahwei.tng\@digipen.edu
|
||||
\date Oct 28, 2022
|
||||
\brief Contains the template definition of the managed class that represents
|
||||
native assets with a pointer to the corresponding native object.
|
||||
|
||||
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
|
||||
|
||||
#include "Engine/GenericHandle.hxx"
|
||||
|
||||
namespace SHADE
|
||||
{
|
||||
/// <summary>
|
||||
/// Generalised template class for a managed representation of a native asset
|
||||
/// </summary>
|
||||
/// <typeparam name="NativeAssetType">
|
||||
/// The type of the asset's native representation.
|
||||
/// </typeparam>
|
||||
template<typename NativeAssetType>
|
||||
public ref class NativeAsset
|
||||
{
|
||||
internal:
|
||||
/*-----------------------------------------------------------------------------*/
|
||||
/* Properties */
|
||||
/*-----------------------------------------------------------------------------*/
|
||||
/// <summary>
|
||||
/// Generic handle for the native object
|
||||
/// </summary>
|
||||
property GenericHandle NativeObjectHandle
|
||||
{
|
||||
GenericHandle get();
|
||||
}
|
||||
/// <summary>
|
||||
/// Copy of the Handle to the native object.
|
||||
/// </summary>
|
||||
property Handle<NativeAssetType> NativeObject
|
||||
{
|
||||
Handle<NativeAssetType> get();
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------------------------------*/
|
||||
/* Constructors/Destructor */
|
||||
/*-----------------------------------------------------------------------------*/
|
||||
/// <summary>
|
||||
/// Constructor for the native asset
|
||||
/// </summary>
|
||||
/// <param name="ptr">Native asset object.</param>
|
||||
NativeAsset(Handle<NativeAssetType> ptr);
|
||||
|
||||
protected:
|
||||
/*-----------------------------------------------------------------------------*/
|
||||
/* Data Members */
|
||||
/*-----------------------------------------------------------------------------*/
|
||||
GenericHandle nativeObjHandle;
|
||||
};
|
||||
}
|
||||
|
||||
#include "NativeAsset.h++"
|
|
@ -0,0 +1,37 @@
|
|||
/************************************************************************************//*!
|
||||
\file Renderable.cxx
|
||||
\author Tng Kah Wei, kahwei.tng, 390009620
|
||||
\par email: kahwei.tng\@digipen.edu
|
||||
\date Oct 28, 2022
|
||||
\brief Contains the definition of the functions of the managed Renderable class.
|
||||
|
||||
Note: This file is written in C++17/CLI.
|
||||
|
||||
Copyright (C) 2022 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.
|
||||
*//*************************************************************************************/
|
||||
// Precompiled Headers
|
||||
#include "SHpch.h"
|
||||
// Primary Header
|
||||
#include "Renderable.hxx"
|
||||
#include "Assets/NativeAsset.hxx"
|
||||
|
||||
namespace SHADE
|
||||
{
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
/* Properties */
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
/* Constructors */
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
Renderable::Renderable(Entity entity)
|
||||
: Component(entity)
|
||||
{}
|
||||
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
/* Usage Functions */
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
|
||||
}
|
|
@ -0,0 +1,53 @@
|
|||
/************************************************************************************//*!
|
||||
\file Renderable.hxx
|
||||
\author Tng Kah Wei, kahwei.tng, 390009620
|
||||
\par email: kahwei.tng\@digipen.edu
|
||||
\date Oct 28, 2022
|
||||
\brief Contains the definition of the managed Renderable class with the
|
||||
declaration of functions for working with it.
|
||||
|
||||
Note: This file is written in C++17/CLI.
|
||||
|
||||
Copyright (C) 2022 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
|
||||
|
||||
// Project Includes
|
||||
#include "Components/Component.hxx"
|
||||
#include "Math/Vector3.hxx"
|
||||
#include "Math/Quaternion.hxx"
|
||||
// External Dependencies
|
||||
#include "Graphics/MiddleEnd/Interface/SHRenderable.h"
|
||||
|
||||
namespace SHADE
|
||||
{
|
||||
/// <summary>
|
||||
/// CLR version of the SHADE Engine's SHRenderableComponent.
|
||||
/// </summary>
|
||||
public ref class Renderable : public Component<SHRenderable>
|
||||
{
|
||||
internal:
|
||||
/*-----------------------------------------------------------------------------*/
|
||||
/* Constructors */
|
||||
/*-----------------------------------------------------------------------------*/
|
||||
/// <summary>
|
||||
/// Constructs a Renderable Component that represents a native Renderable
|
||||
/// component tied to the specified Entity.
|
||||
/// </summary>
|
||||
/// <param name="entity">Entity that this Component will be tied to.</param>
|
||||
Renderable(Entity entity);
|
||||
|
||||
public:
|
||||
/*-----------------------------------------------------------------------------*/
|
||||
/* Properties */
|
||||
/*-----------------------------------------------------------------------------*/
|
||||
|
||||
/*-----------------------------------------------------------------------------*/
|
||||
/* Usage Functions */
|
||||
/*-----------------------------------------------------------------------------*/
|
||||
|
||||
};
|
||||
}
|
||||
|
Loading…
Reference in New Issue