#pragma once

#include "point3d.h"
#include "vector2d.h"
#include "resource.h"
#include "notation.h"

class Entity;
//##########################################################################
//#####################    Reticle::ModelResource    #######################
//##########################################################################

struct Reticle__ModelResource
{
	Vector2DOf<float> reticlePosition;
};
//##########################################################################
//###########################    Class  Reticle    #########################
//##########################################################################

class Reticle SIGNATURED
{
public:
	enum ReticleState
	{
		ReticleOff,			// Reticle is invisible
		ReticleOn,			// Reticle is visible (may be more than one "on" state added later)
	};

	enum ReticleElements		// these are bits that turn parts of the reticle on and off
	{
		FrontFiringWeaponsOn	=	0x00000001,			// Display Front firing weapons
		RearFiringWeaponsOn	=	0x00000002,       // Display rear firing weapons
		LeftFiringWeaponsOn	=	0x00000004,       //	Display left firing weapons
		RightFiringWeaponsOn	=	0x00000008,      	// Display right firing weapons
		WeaponsControlGroup	=	0x0000000F,       // Mask defining the weapons group
		TargetDesignatorOn	=	0x00000010,			// Display target designator box and direction arrows
		PrimaryHudOn			=	0x00000020,			// if set, you get the full hud, if not just a simple x
		AllEnabledGroup		=	0xFFFFFFFF,       // All bits on
	};

	Vector2DOf<float>	reticlePosition;     // screen position -1.0 -> +1.0
	ReticleState		reticleState;			// current state of reticle, graphic to display
	Logical				pickPointingOn;		// Pick point intersection testing on/off
	Point3D				rayIntersection;		// Current pickpoint intersection in 3d world
	Entity				*targetEntity;			//	entity being targeted
	int					targetDamageZone;		// damage zone on the entity
  ReticleElements	reticleElementMask;	// controls what parts of the reticle are displayed

  Reticle();

	Logical
		TestInstance() const;
	typedef Reticle__ModelResource ModelResource;

	static ResourceDescription::ResourceID
		CreateModelResource(
			ResourceFile *resource_file,
			const char* model_name,
			NotationFile *map_file,
			const ResourceDirectories *directories,
        ModelResource *model = NULL
		);
};