﻿/*
---------------------------------------------------------------------------
Open Asset Import Library (assimp)
---------------------------------------------------------------------------

Copyright (c) 2006-2017, assimp team


All rights reserved.

Redistribution and use of this software in source and binary forms,
with or without modification, are permitted provided that the following
conditions are met:

* Redistributions of source code must retain the above
copyright notice, this list of conditions and the
following disclaimer.

* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the
following disclaimer in the documentation and/or other
materials provided with the distribution.

* Neither the name of the assimp team, nor the names of its
contributors may be used to endorse or promote products
derived from this software without specific prior
written permission of the assimp team.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
---------------------------------------------------------------------------
*/

/// \file AMFImporter_Node.hpp
/// \brief Elements of scene graph.
/// \date 2016
/// \author smal.root@gmail.com

#pragma once
#ifndef INCLUDED_AI_AMF_IMPORTER_NODE_H
#define INCLUDED_AI_AMF_IMPORTER_NODE_H

// Header files, stdlib.
#include <list>
#include <string>
#include <vector>

// Header files, Assimp.
#include "assimp/types.h"
#include "assimp/scene.h"

/// \class CAMFImporter_NodeElement
/// Base class for elements of nodes.
class CAMFImporter_NodeElement {

public:
	/// Define what data type contain node element.
	enum EType {
		ENET_Color,        ///< Color element: <color>.
		ENET_Constellation,///< Grouping element: <constellation>.
		ENET_Coordinates,  ///< Coordinates element: <coordinates>.
		ENET_Edge,         ///< Edge element: <edge>.
		ENET_Instance,     ///< Grouping element: <constellation>.
		ENET_Material,     ///< Material element: <material>.
		ENET_Metadata,     ///< Metadata element: <metadata>.
		ENET_Mesh,         ///< Metadata element: <mesh>.
		ENET_Object,       ///< Element which hold object: <object>.
		ENET_Root,         ///< Root element: <amf>.
		ENET_Triangle,     ///< Triangle element: <triangle>.
		ENET_TexMap,       ///< Texture coordinates element: <texmap> or <map>.
		ENET_Texture,      ///< Texture element: <texture>.
		ENET_Vertex,       ///< Vertex element: <vertex>.
		ENET_Vertices,     ///< Vertex element: <vertices>.
		ENET_Volume,       ///< Volume element: <volume>.

		ENET_Invalid       ///< Element has invalid type and possible contain invalid data.
	};

	const EType Type;///< Type of element.
	std::string ID;///< ID of element.
	CAMFImporter_NodeElement* Parent;///< Parent element. If nullptr then this node is root.
	std::list<CAMFImporter_NodeElement*> Child;///< Child elements.

public:                                               /// Destructor, virtual..
    virtual ~CAMFImporter_NodeElement() {
        // empty
    }

private:
	/// Disabled copy constructor.
	CAMFImporter_NodeElement(const CAMFImporter_NodeElement& pNodeElement);

	/// Disabled assign operator.
	CAMFImporter_NodeElement& operator=(const CAMFImporter_NodeElement& pNodeElement);

	/// Disabled default constructor.
	CAMFImporter_NodeElement();

protected:
	/// In constructor inheritor must set element type.
	/// \param [in] pType - element type.
	/// \param [in] pParent - parent element.
	CAMFImporter_NodeElement(const EType pType, CAMFImporter_NodeElement* pParent)
	: Type(pType)
    , ID()
    , Parent(pParent)
    , Child() {
        // empty
    }
};// class IAMFImporter_NodeElement

/// \struct CAMFImporter_NodeElement_Constellation
/// A collection of objects or constellations with specific relative locations.
struct CAMFImporter_NodeElement_Constellation : public CAMFImporter_NodeElement
{
	/// \fn CAMFImporter_NodeElement_Constellation(CAMFImporter_NodeElement* pParent)
	/// Constructor.
	/// \param [in] pParent - pointer to parent node.
	CAMFImporter_NodeElement_Constellation(CAMFImporter_NodeElement* pParent)
		: CAMFImporter_NodeElement(ENET_Constellation, pParent)
	{}

};// struct CAMFImporter_NodeElement_Constellation

/// \struct CAMFImporter_NodeElement_Instance
/// Part of constellation.
struct CAMFImporter_NodeElement_Instance : public CAMFImporter_NodeElement
{
	/****************** Variables ******************/

	std::string ObjectID;///< ID of object for instantiation.
	/// \var Delta - The distance of translation in the x, y, or z direction, respectively, in the referenced object's coordinate system, to
	/// create an instance of the object in the current constellation.
	aiVector3D Delta;

	/// \var Rotation - The rotation, in degrees, to rotate the referenced object about its x, y, and z axes, respectively, to create an
	/// instance of the object in the current constellation. Rotations shall be executed in order of x first, then y, then z.
	aiVector3D Rotation;

	/****************** Functions ******************/

	/// \fn CAMFImporter_NodeElement_Instance(CAMFImporter_NodeElement* pParent)
	/// Constructor.
	/// \param [in] pParent - pointer to parent node.
	CAMFImporter_NodeElement_Instance(CAMFImporter_NodeElement* pParent)
		: CAMFImporter_NodeElement(ENET_Instance, pParent)
	{}

};// struct CAMFImporter_NodeElement_Instance

/// \struct CAMFImporter_NodeElement_Metadata
/// Structure that define metadata node.
struct CAMFImporter_NodeElement_Metadata : public CAMFImporter_NodeElement
{
	/****************** Variables ******************/

	std::string Type;///< Type of "Value".
	std::string Value;///< Value.

	/****************** Functions ******************/

	/// \fn CAMFImporter_NodeElement_Metadata(CAMFImporter_NodeElement* pParent)
	/// Constructor.
	/// \param [in] pParent - pointer to parent node.
	CAMFImporter_NodeElement_Metadata(CAMFImporter_NodeElement* pParent)
		: CAMFImporter_NodeElement(ENET_Metadata, pParent)
	{}

};// struct CAMFImporter_NodeElement_Metadata

/// \struct CAMFImporter_NodeElement_Root
/// Structure that define root node.
struct CAMFImporter_NodeElement_Root : public CAMFImporter_NodeElement
{
	/****************** Variables ******************/

	std::string Unit;///< The units to be used. May be "inch", "millimeter", "meter", "feet", or "micron".
	std::string Version;///< Version of format.

	/****************** Functions ******************/

	/// \fn CAMFImporter_NodeElement_Root(CAMFImporter_NodeElement* pParent)
	/// Constructor.
	/// \param [in] pParent - pointer to parent node.
	CAMFImporter_NodeElement_Root(CAMFImporter_NodeElement* pParent)
		: CAMFImporter_NodeElement(ENET_Root, pParent)
	{}

};// struct CAMFImporter_NodeElement_Root

/// \struct CAMFImporter_NodeElement_Color
/// Structure that define object node.
struct CAMFImporter_NodeElement_Color : public CAMFImporter_NodeElement
{
	/****************** Variables ******************/

	bool Composed;///< Type of color stored: if true then look for formula in \ref Color_Composed[4], else - in \ref Color.
	std::string Color_Composed[4];///< By components formulas of composed color. [0..3] => RGBA.
	aiColor4D Color;///< Constant color.
	std::string Profile;///< The ICC color space used to interpret the three color channels <r>, <g> and <b>..

	/****************** Functions ******************/

	/// \fn CAMFImporter_NodeElement_Color(CAMFImporter_NodeElement* pParent)
	/// Constructor.
	/// \param [in] pParent - pointer to parent node.
	CAMFImporter_NodeElement_Color(CAMFImporter_NodeElement* pParent)
		: CAMFImporter_NodeElement(ENET_Color, pParent)
	{}

};// struct CAMFImporter_NodeElement_Color

/// \struct CAMFImporter_NodeElement_Material
/// Structure that define material node.
struct CAMFImporter_NodeElement_Material : public CAMFImporter_NodeElement
{
	/// \fn CAMFImporter_NodeElement_Material(CAMFImporter_NodeElement* pParent)
	/// Constructor.
	/// \param [in] pParent - pointer to parent node.
	CAMFImporter_NodeElement_Material(CAMFImporter_NodeElement* pParent)
		: CAMFImporter_NodeElement(ENET_Material, pParent)
	{}

};// struct CAMFImporter_NodeElement_Material

/// \struct CAMFImporter_NodeElement_Object
/// Structure that define object node.
struct CAMFImporter_NodeElement_Object : public CAMFImporter_NodeElement
{
	/// \fn CAMFImporter_NodeElement_Object(CAMFImporter_NodeElement* pParent)
	/// Constructor.
	/// \param [in] pParent - pointer to parent node.
	CAMFImporter_NodeElement_Object(CAMFImporter_NodeElement* pParent)
		: CAMFImporter_NodeElement(ENET_Object, pParent)
	{}

};// struct CAMFImporter_NodeElement_Object

/// \struct CAMFImporter_NodeElement_Mesh
/// Structure that define mesh node.
struct CAMFImporter_NodeElement_Mesh : public CAMFImporter_NodeElement
{
	/// \fn CAMFImporter_NodeElement_Mesh(CAMFImporter_NodeElement* pParent)
	/// Constructor.
	/// \param [in] pParent - pointer to parent node.
	CAMFImporter_NodeElement_Mesh(CAMFImporter_NodeElement* pParent)
		: CAMFImporter_NodeElement(ENET_Mesh, pParent)
	{}

};// struct CAMFImporter_NodeElement_Mesh

/// \struct CAMFImporter_NodeElement_Vertex
/// Structure that define vertex node.
struct CAMFImporter_NodeElement_Vertex : public CAMFImporter_NodeElement
{
	/// \fn CAMFImporter_NodeElement_Vertex(CAMFImporter_NodeElement* pParent)
	/// Constructor.
	/// \param [in] pParent - pointer to parent node.
	CAMFImporter_NodeElement_Vertex(CAMFImporter_NodeElement* pParent)
		: CAMFImporter_NodeElement(ENET_Vertex, pParent)
	{}

};// struct CAMFImporter_NodeElement_Vertex

/// \struct CAMFImporter_NodeElement_Edge
/// Structure that define edge node.
struct CAMFImporter_NodeElement_Edge : public CAMFImporter_NodeElement
{
	/// \fn CAMFImporter_NodeElement_Edge(CAMFImporter_NodeElement* pParent)
	/// Constructor.
	/// \param [in] pParent - pointer to parent node.
	CAMFImporter_NodeElement_Edge(CAMFImporter_NodeElement* pParent)
		: CAMFImporter_NodeElement(ENET_Edge, pParent)
	{}

};// struct CAMFImporter_NodeElement_Vertex

/// \struct CAMFImporter_NodeElement_Vertices
/// Structure that define vertices node.
struct CAMFImporter_NodeElement_Vertices : public CAMFImporter_NodeElement
{
	/// \fn CAMFImporter_NodeElement_Vertices(CAMFImporter_NodeElement* pParent)
	/// Constructor.
	/// \param [in] pParent - pointer to parent node.
	CAMFImporter_NodeElement_Vertices(CAMFImporter_NodeElement* pParent)
		: CAMFImporter_NodeElement(ENET_Vertices, pParent)
	{}

};// struct CAMFImporter_NodeElement_Vertices

/// \struct CAMFImporter_NodeElement_Volume
/// Structure that define volume node.
struct CAMFImporter_NodeElement_Volume : public CAMFImporter_NodeElement
{
	/****************** Variables ******************/

	std::string MaterialID;///< Which material to use.
	std::string Type;///< What this volume describes can be “region” or “support”. If none specified, “object” is assumed.

	/****************** Functions ******************/

	/// \fn CAMFImporter_NodeElement_Volume(CAMFImporter_NodeElement* pParent)
	/// Constructor.
	/// \param [in] pParent - pointer to parent node.
	CAMFImporter_NodeElement_Volume(CAMFImporter_NodeElement* pParent)
		: CAMFImporter_NodeElement(ENET_Volume, pParent)
	{}

};// struct CAMFImporter_NodeElement_Volume

/// \struct CAMFImporter_NodeElement_Coordinates
/// Structure that define coordinates node.
struct CAMFImporter_NodeElement_Coordinates : public CAMFImporter_NodeElement
{
	/****************** Variables ******************/

	aiVector3D Coordinate;///< Coordinate.

	/****************** Functions ******************/

	/// \fn CAMFImporter_NodeElement_Coordinates(CAMFImporter_NodeElement* pParent)
	/// Constructor.
	/// \param [in] pParent - pointer to parent node.
	CAMFImporter_NodeElement_Coordinates(CAMFImporter_NodeElement* pParent)
		: CAMFImporter_NodeElement(ENET_Coordinates, pParent)
	{}

};// struct CAMFImporter_NodeElement_Coordinates

/// \struct CAMFImporter_NodeElement_TexMap
/// Structure that define texture coordinates node.
struct CAMFImporter_NodeElement_TexMap : public CAMFImporter_NodeElement
{
	/****************** Variables ******************/

	aiVector3D TextureCoordinate[3];///< Texture coordinates.
	std::string TextureID_R;///< Texture ID for red color component.
	std::string TextureID_G;///< Texture ID for green color component.
	std::string TextureID_B;///< Texture ID for blue color component.
	std::string TextureID_A;///< Texture ID for alpha color component.

	/****************** Functions ******************/

	/// \fn CAMFImporter_NodeElement_TexMap(CAMFImporter_NodeElement* pParent)
	/// Constructor.
	/// \param [in] pParent - pointer to parent node.
	CAMFImporter_NodeElement_TexMap(CAMFImporter_NodeElement* pParent)
		: CAMFImporter_NodeElement(ENET_TexMap, pParent)
	{}

};// struct CAMFImporter_NodeElement_TexMap

/// \struct CAMFImporter_NodeElement_Triangle
/// Structure that define triangle node.
struct CAMFImporter_NodeElement_Triangle : public CAMFImporter_NodeElement
{
	/****************** Variables ******************/

	size_t V[3];///< Triangle vertices.

	/****************** Functions ******************/

	/// \fn CAMFImporter_NodeElement_Triangle(CAMFImporter_NodeElement* pParent)
	/// Constructor.
	/// \param [in] pParent - pointer to parent node.
	CAMFImporter_NodeElement_Triangle(CAMFImporter_NodeElement* pParent)
		: CAMFImporter_NodeElement(ENET_Triangle, pParent)
	{}

};// struct CAMFImporter_NodeElement_Triangle

/// Structure that define texture node.
struct CAMFImporter_NodeElement_Texture : public CAMFImporter_NodeElement {
	size_t Width, Height, Depth;///< Size of the texture.
	std::vector<uint8_t> Data;///< Data of the texture.
	bool Tiled;

	/// Constructor.
	/// \param [in] pParent - pointer to parent node.
	CAMFImporter_NodeElement_Texture(CAMFImporter_NodeElement* pParent)
	: CAMFImporter_NodeElement(ENET_Texture, pParent)
    , Width( 0 )
    , Height( 0 )
    , Depth( 0 )
    , Data()
    , Tiled( false ){
        // empty
    }
};// struct CAMFImporter_NodeElement_Texture

#endif // INCLUDED_AI_AMF_IMPORTER_NODE_H
