note
	description: "[
							Represent the direction that an effect come from (an not where
							it goes, be carefull). Direction is encoded by two rotation
							(the azimuth and inclination). Cardinal directions
							of the haptic device are relative to the positioning of the device. 
							North is considered to be away from the user, south is toward the user, 
							east is right, and west is left of the user:
		
							               .--.
							               |__| .-------.
							               |=.| |.-----.|
							               |--| ||     ||
							               |  | |'-----'|
							               |__|~')_____('
							                [ COMPUTER ]
							
							
							                 North (27000)
							                      ^
							                      |
							                      |
							(18000) West <----[ HAPTIC ]----> East (0)
							                      |
							                      |
							                      v
							                 South (9000)
							
							
							                 [ USER ]
							                   \|||/
							                   (o o)
							             ---ooO-(_)-Ooo---
	]"
	author: "Louis Marchand"
	date: "Tue, 03 Mar 2015 15:22:37 +0000"
	revision: "2.0"

class interface
	GAME_HAPTIC_SPHERICAL_DIRECTION

create {GAME_HAPTIC_EFFECT}
	make_from_other (a_other: GAME_HAPTIC_DIRECTION)
			-- Initalization of Current using a_other as source
		require
			other_exists: a_other.exists
			other_cartesian: a_other.is_cartesian
		ensure
			exists: exists
			type_is_valid: type = {GAME_SDL_EXTERNAL}.sdl_haptic_cartesian
			is_equal_other: is_values_equal (a_other)


create 
	make
			-- Initialization of Current
		require -- from  MEMORY_STRUCTURE
			True
		ensure -- from MEMORY_STRUCTURE
			not_shared: not shared
		ensure then
			exists: exists
			type_is_valid: type = {GAME_SDL_EXTERNAL}.sdl_haptic_spherical
			azimuth_valid: azimuth = 0
			inclination_valid: inclination = 0

	make_with_azimuth (a_azimuth: INTEGER_32)
			-- Initialization of Current using a_azimuth as azimuth
		ensure
			exists: exists
			type_is_valid: type = {GAME_SDL_EXTERNAL}.sdl_haptic_spherical
			azimuth_valid: azimuth = a_azimuth
			inclination_valid: inclination = 0

	make_with_azimuth_and_inclination (a_azimuth, a_inclination: INTEGER_32)
			-- Initialization of Current using a_azimuth as azimuth and
			-- a_inclination as inclination
		ensure
			exists: exists
			type_is_valid: type = {GAME_SDL_EXTERNAL}.sdl_haptic_spherical
			azimuth_valid: azimuth = a_azimuth
			inclination_valid: inclination = 0

feature -- Initialization

	make
			-- Initialization of Current
		require -- from  MEMORY_STRUCTURE
			True
		ensure -- from MEMORY_STRUCTURE
			not_shared: not shared
		ensure then
			exists: exists
			type_is_valid: type = {GAME_SDL_EXTERNAL}.sdl_haptic_spherical
			azimuth_valid: azimuth = 0
			inclination_valid: inclination = 0

	make_by_pointer (a_ptr: POINTER)
			-- Initialize current with a_ptr.
			-- (from MEMORY_STRUCTURE)
		require -- from MEMORY_STRUCTURE
			a_ptr_not_null: a_ptr /= default_pointer
		ensure -- from MEMORY_STRUCTURE
			shared: shared
	
feature -- Access

	azimuth: INTEGER_32 assign set_azimuth
			-- The azimuth angle in spherical coordinate (encoded by hundredths of a degree
			-- starting east and rotating toward South).
		require
			exists: exists

	generating_type: TYPE [detachable GAME_HAPTIC_SPHERICAL_DIRECTION]
			-- Type of current object
			-- (type of which it is a direct instance)
			-- (from ANY)
		ensure -- from ANY
			generating_type_not_void: Result /= Void

	generator: STRING_8
			-- Name of current object's generating class
			-- (base class of the type of which it is a direct instance)
			-- (from ANY)
		ensure -- from ANY
			generator_not_void: Result /= Void
			generator_not_empty: not Result.is_empty

	inclination: INTEGER_32 assign set_inclination
			-- The inclination angle in spherical coordinate (encoded by hundredths of a degree
			-- rotating toward the bottom of the haptic).
			-- To use this angle, you need a 3 axis haptic
			-- (See: GAME_HAPTIC.axes_count)
		require
			exists: exists

	is_cartesian: BOOLEAN
			-- Is Current is represented with cartesian coordinate
			-- (from GAME_HAPTIC_DIRECTION)
		require -- from GAME_HAPTIC_DIRECTION
			exists: exists

	is_equal (a_other: GAME_HAPTIC_SPHERICAL_DIRECTION): BOOLEAN
			-- Is other attached to an object considered
			-- equal to current object?
			-- (from GAME_HAPTIC_DIRECTION)
		require -- from ANY
			other_not_void: a_other /= Void
		ensure -- from ANY
			symmetric: Result implies a_other ~ Current
			consistent: standard_is_equal (a_other) implies Result

	is_polar: BOOLEAN
			-- Is Current is represented with polar coordinate
			-- (from GAME_HAPTIC_DIRECTION)
		require -- from GAME_HAPTIC_DIRECTION
			exists: exists

	is_spherical: BOOLEAN
			-- Is Current is represented with spherical coordinate
			-- (from GAME_HAPTIC_DIRECTION)
		require -- from GAME_HAPTIC_DIRECTION
			exists: exists

	is_values_equal (a_other: GAME_HAPTIC_DIRECTION): BOOLEAN
			-- Are the important values inside Current are equvalent

	item: POINTER
			-- Access to memory area.
			-- (from MEMORY_STRUCTURE)

	set_azimuth (a_azimuth: INTEGER_32)
			-- Assign azimuth with the value of a_azimuth
		require
			exists: exists
		ensure
			is_assign: azimuth = a_azimuth

	set_inclination (a_inclination: INTEGER_32)
			-- Assign inclination with the value of a_inclination
		require
			exists: exists
		ensure
			is_assign: inclination = a_inclination

	shared: BOOLEAN
			-- Is current memory area shared with others?
			-- (from MEMORY_STRUCTURE)
	
feature -- Comparison

	frozen deep_equal (a: detachable ANY; b: like arg #1): BOOLEAN
			-- Are a and b either both void
			-- or attached to isomorphic object structures?
			-- (from ANY)
		ensure -- from ANY
			instance_free: class
			shallow_implies_deep: standard_equal (a, b) implies Result
			both_or_none_void: (a = Void) implies (Result = (b = Void))
			same_type: (Result and (a /= Void)) implies (b /= Void and then a.same_type (b))
			symmetric: Result implies deep_equal (b, a)

	frozen equal (a: detachable ANY; b: like arg #1): BOOLEAN
			-- Are a and b either both void or attached
			-- to objects considered equal?
			-- (from ANY)
		ensure -- from ANY
			instance_free: class
			definition: Result = (a = Void and b = Void) or else ((a /= Void and b /= Void) and then a.is_equal (b))

	frozen is_deep_equal alias "≡≡≡" (other: GAME_HAPTIC_SPHERICAL_DIRECTION): BOOLEAN
			-- Are Current and other attached to isomorphic object structures?
			-- (from ANY)
		require -- from ANY
			other_not_void: other /= Void
		ensure -- from ANY
			shallow_implies_deep: standard_is_equal (other) implies Result
			same_type: Result implies same_type (other)
			symmetric: Result implies other.is_deep_equal (Current)

	frozen standard_equal (a: detachable ANY; b: like arg #1): BOOLEAN
			-- Are a and b either both void or attached to
			-- field-by-field identical objects of the same type?
			-- Always uses default object comparison criterion.
			-- (from ANY)
		ensure -- from ANY
			instance_free: class
			definition: Result = (a = Void and b = Void) or else ((a /= Void and b /= Void) and then a.standard_is_equal (b))

	frozen standard_is_equal alias "" (other: GAME_HAPTIC_SPHERICAL_DIRECTION): BOOLEAN
			-- Is other attached to an object of the same type
			-- as current object, and field-by-field identical to it?
			-- (from ANY)
		require -- from ANY
			other_not_void: other /= Void
		ensure -- from ANY
			same_type: Result implies same_type (other)
			symmetric: Result implies other.standard_is_equal (Current)
	
feature -- Status report

	conforms_to (other: ANY): BOOLEAN
			-- Does type of current object conform to type
			-- of other (as per Eiffel: The Language, chapter 13)?
			-- (from ANY)
		require -- from ANY
			other_not_void: other /= Void

	exists: BOOLEAN
			-- Is allocated memory still allocated?
			-- (from MEMORY_STRUCTURE)

	same_type (other: ANY): BOOLEAN
			-- Is type of current object identical to type of other?
			-- (from ANY)
		require -- from ANY
			other_not_void: other /= Void
		ensure -- from ANY
			definition: Result = (conforms_to (other) and other.conforms_to (Current))
	
feature -- Duplication

	copy_object (other: GAME_HAPTIC_SPHERICAL_DIRECTION)
			-- Update current object using fields of object attached
			-- to other, so as to yield equal objects.
			-- (from ANY)
		require -- from ANY
			other_not_void: other /= Void
			type_identity: same_type (other)
		ensure -- from ANY
			is_equal: Current ~ other

	frozen deep_copy (other: GAME_HAPTIC_SPHERICAL_DIRECTION)
			-- Effect equivalent to that of:
			--		copy (other . deep_twin)
			-- (from ANY)
		require -- from ANY
			other_not_void: other /= Void
		ensure -- from ANY
			deep_equal: deep_equal (Current, other)

	frozen deep_twin: GAME_HAPTIC_SPHERICAL_DIRECTION
			-- New object structure recursively duplicated from Current.
			-- (from ANY)
		ensure -- from ANY
			deep_twin_not_void: Result /= Void
			deep_equal: deep_equal (Current, Result)

	frozen standard_copy (other: GAME_HAPTIC_SPHERICAL_DIRECTION)
			-- Copy every field of other onto corresponding field
			-- of current object.
			-- (from ANY)
		require -- from ANY
			other_not_void: other /= Void
			type_identity: same_type (other)
		ensure -- from ANY
			is_standard_equal: standard_is_equal (other)

	frozen standard_twin: GAME_HAPTIC_SPHERICAL_DIRECTION
			-- New object field-by-field identical to other.
			-- Always uses default copying semantics.
			-- (from ANY)
		ensure -- from ANY
			standard_twin_not_void: Result /= Void
			equal: standard_equal (Result, Current)

	frozen twin: GAME_HAPTIC_SPHERICAL_DIRECTION
			-- New object equal to Current
			-- twin calls copy; to change copying/twinning semantics, redefine copy.
			-- (from ANY)
		ensure -- from ANY
			twin_not_void: Result /= Void
			is_equal: Result ~ Current
	
feature -- Basic operations

	frozen default: detachable GAME_HAPTIC_SPHERICAL_DIRECTION
			-- Default value of object's type
			-- (from ANY)

	frozen default_pointer: POINTER
			-- Default value of type POINTER
			-- (Avoid the need to write p.default for
			-- some p of type POINTER.)
			-- (from ANY)
		ensure -- from ANY
			instance_free: class

	default_rescue
			-- Process exception for routines with no Rescue clause.
			-- (Default: do nothing.)
			-- (from ANY)

	frozen do_nothing
			-- Execute a null action.
			-- (from ANY)
		ensure -- from ANY
			instance_free: class
	
feature -- Output

	Io: STD_FILES
			-- Handle to standard file setup
			-- (from ANY)
		ensure -- from ANY
			instance_free: class
			io_not_void: Result /= Void

	out: STRING_8
			-- New string containing terse printable representation
			-- of current object
			-- (from ANY)
		ensure -- from ANY
			out_not_void: Result /= Void

	print (o: detachable ANY)
			-- Write terse external representation of o
			-- on standard output.
			-- (from ANY)
		ensure -- from ANY
			instance_free: class

	frozen tagged_out: STRING_8
			-- New string containing terse printable representation
			-- of current object
			-- (from ANY)
		ensure -- from ANY
			tagged_out_not_void: Result /= Void
	
feature -- Platform

	Operating_environment: OPERATING_ENVIRONMENT
			-- Objects available from the operating system
			-- (from ANY)
		ensure -- from ANY
			instance_free: class
			operating_environment_not_void: Result /= Void
	
feature -- implementation

	structure_size: INTEGER_32
			-- Size to allocate (in bytes).
			-- (from GAME_HAPTIC_DIRECTION)
		ensure -- from MEMORY_STRUCTURE
			is_class: class
			positive_result: Result > 0
	
invariant
	type_valid: type = {GAME_SDL_EXTERNAL}.sdl_haptic_spherical

		-- from GAME_HAPTIC_DIRECTION
	type_valid: type = {GAME_SDL_EXTERNAL}.sdl_haptic_cartesian or type = {GAME_SDL_EXTERNAL}.sdl_haptic_polar or type = {GAME_SDL_EXTERNAL}.sdl_haptic_spherical

		-- from MEMORY_STRUCTURE
	managed_pointer_valid: not shared implies managed_pointer /= Void
	internal_item_valid: shared implies internal_item /= default_pointer

		-- from ANY
	reflexive_equality: standard_is_equal (Current)
	reflexive_conformance: conforms_to (Current)

end -- class GAME_HAPTIC_SPHERICAL_DIRECTION

Generated by ISE EiffelStudio