Shape.h

#pragma once


#include "Distinction.h"    // < BaseClass >
#include "ExpressionModel.h"


namespace Core
{
    ref class XFile;

    typedef array< Robotics::PositionVector^ > PositionVectors;


    /// 形状
    [ System::ComponentModel::TypeConverter( CustomProperty::DisplayNameTypeConverter::typeid ) ]   // プロパティ表示の変換
    public ref class Shape : public Distinction
    {
    // Construction --------------------------------------------------------
    public:
        Shape( Robotics::Size size, Robotics::PositionVector^ relativePosition );

        ~Shape() { Shape::!Shape(); }
        !Shape();

    private:
        explicit Shape( System::Xml::XmlElement^ element );


    // Operation -----------------------------------------------------------
    public:
        PositionVectors^ GetAbsolutePositionOfVertices( Robotics::Vector^ positionToSet, Robotics::RotationMatrix^ posture );

        virtual System::String^ ToString() override;

        void CreateFigure( Microsoft::DirectX::Direct3D::Device^ device );
        void RenderSimpleFigure( Microsoft::DirectX::Direct3D::Device^ device );
        void RenderRealFigure( Microsoft::DirectX::Direct3D::Device^ device );

        void SetExpressionMode( ExpressionModel expressionModel );


    // static
    public:
        static Shape^ Create( System::Xml::XmlElement^ element );


    // Attribute ===========================================================
    private:
        Robotics::Size m_size;                        ///< 大きさ[ m ]
        Robotics::PositionVector^ m_relativePosition; ///< 相対位置[ m ] (ローカル座標系)

        Microsoft::DirectX::Direct3D::Mesh^ m_simpleFigure;   ///< シンプルな形状
        XFile^ m_realFigure;                                  ///< リアルな形状


    // static
        literal int VertexSum = 8;   ///< 頂点数


    // Property ------------------------------------------------------------
    public:
        /// 大きさ[ m ]
        [ CustomProperty::DisplayName( "大きさ" ) ]
        property Robotics::Size Size
        {
            Robotics::Size get()
            {
                return m_size;
            }
        }


        /// 相対位置[ m ] (ローカル座標系)
        [ CustomProperty::DisplayName( "相対位置" ) ]
        property Robotics::PositionVector^ RelativePosition
        {
            Robotics::PositionVector^ get()
            {
                return m_relativePosition;
            }
        }

        /// 頂点の相対位置[ m ] (ローカル座標系)
        [ System::ComponentModel::Browsable( false ) ]  // 参照不可
        property PositionVectors^ RelativePositionOfVertices
        {
            PositionVectors^ get();
        }
    };
}