text: // Copyright 1998-2015 Epic Games, Inc. All Rights Reserved.
  #pragma once
  #include "GameFramework/Character.h"
  #include "Engine/PostProcessVolume.h"
  #include "FinalProjectCharacter.generated.h"
  
  class UInputComponent;
  
  UCLASS(config=Game)
  class AFinalProjectCharacter : public ACharacter
  {
  	GENERATED_BODY()
  
  	/** Pawn mesh: 1st person view (arms; seen only by self) */
  	UPROPERTY(VisibleDefaultsOnly, Category=Mesh)
  	class USkeletalMeshComponent* Mesh1P;
  
  	/** Gun mesh: 1st person view (seen only by self) */
  	UPROPERTY(VisibleDefaultsOnly, Category = Mesh)
  	class USkeletalMeshComponent* FP_Gun;
  
  	/** First person camera */
  	UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Camera, meta = (AllowPrivateAccess = "true"))
  	class UCameraComponent* FirstPersonCameraComponent;
  public:
  	AFinalProjectCharacter();
  
  	/** Base turn rate, in deg/sec. Other scaling may affect final turn rate. */
  	UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category=Camera)
  	float BaseTurnRate;
  
  	/** Base look up/down rate, in deg/sec. Other scaling may affect final rate. */
  	UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category=Camera)
  	float BaseLookUpRate;
  
  	/** Gun muzzle's offset from the characters location */
  	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=Gameplay)
  	FVector GunOffset;
  
  	/** Projectile class to spawn */
  	UPROPERTY(EditDefaultsOnly, Category=Projectile)
  	TSubclassOf<class AFinalProjectProjectile> ProjectileClass;
  
  	/** Sound to play each time we fire */
  	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=Gameplay)
  	class USoundBase* FireSound;
  
  	/** AnimMontage to play each time we fire */
  	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Gameplay)
  	class UAnimMontage* FireAnimation;
  
  	class APostProcessVolume* PostProcess;
  
  protected:
  	
  	/** Fires a projectile. */
  	void OnFire();
  
  	/** Handles moving forward/backward */
  	void MoveForward(float Val);
  
  	/** Handles strafing movement, left and right */
  	void MoveRight(float Val);
  
  	void TogglePostProcess();
  
  	/**
  	 * Called via input to turn at a given rate.
  	 * @param Rate	This is a normalized rate, i.e. 1.0 means 100% of desired turn rate
  	 */
  	void TurnAtRate(float Rate);
  
  	/**
  	 * Called via input to turn look up/down at a given rate.
  	 * @param Rate	This is a normalized rate, i.e. 1.0 means 100% of desired turn rate
  	 */
  	void LookUpAtRate(float Rate);
  
  	struct TouchData
  	{
  		TouchData() { bIsPressed = false;Location=FVector::ZeroVector;}
  		bool bIsPressed;
  		ETouchIndex::Type FingerIndex;
  		FVector Location;
  		bool bMoved;
  	};
  	void BeginTouch(const ETouchIndex::Type FingerIndex, const FVector Location);
  	void EndTouch(const ETouchIndex::Type FingerIndex, const FVector Location);
  	void TouchUpdate(const ETouchIndex::Type FingerIndex, const FVector Location);
  	TouchData	TouchItem;
  	
  protected:
  	// APawn interface
  	virtual void SetupPlayerInputComponent(UInputComponent* InputComponent) override;
  	// End of APawn interface
  
      virtual void BeginPlay() override;
  
  	/* 
  	 * Configures input for touchscreen devices if there is a valid touch interface for doing so 
  	 *
  	 * @param	InputComponent	The input component pointer to bind controls to
  	 * @returns true if touch controls were enabled.
  	 */
  	bool EnableTouchscreenMovement(UInputComponent* InputComponent);
  
  public:
  	/** Returns Mesh1P subobject **/
  	FORCEINLINE class USkeletalMeshComponent* GetMesh1P() const { return Mesh1P; }
  	/** Returns FirstPersonCameraComponent subobject **/
  	FORCEINLINE class UCameraComponent* GetFirstPersonCameraComponent() const { return FirstPersonCameraComponent; }
  
  };
  
  