Daniele Bartolini před 8 roky
rodič
revize
aa0244f7d2

+ 3 - 3
src/resource/state_machine_resource.cpp

@@ -454,7 +454,7 @@ namespace state_machine
 		return (State*)((char*)smr + t->state_offset);
 		return (State*)((char*)smr + t->state_offset);
 	}
 	}
 
 
-	const State* trigger(const StateMachineResource* smr, const State* s, StringId32 event, u32* transition_mode)
+	const State* trigger(const StateMachineResource* smr, const State* s, StringId32 event, const Transition** transition_out)
 	{
 	{
 		const TransitionArray* ta = state_transitions(s);
 		const TransitionArray* ta = state_transitions(s);
 
 
@@ -464,12 +464,12 @@ namespace state_machine
 
 
 			if (transition_i->event == event)
 			if (transition_i->event == event)
 			{
 			{
-				*transition_mode = transition_i->mode;
+				*transition_out = transition_i;
 				return state(smr, transition_i);
 				return state(smr, transition_i);
 			}
 			}
 		}
 		}
 
 
-		*transition_mode = TransitionMode::IMMEDIATE;
+		*transition_out = NULL;
 		return s;
 		return s;
 	}
 	}
 
 

+ 1 - 1
src/resource/state_machine_resource.h

@@ -88,7 +88,7 @@ namespace state_machine
 
 
 	/// Triggers the transition *event* in the state *s* and returns the resulting state.
 	/// Triggers the transition *event* in the state *s* and returns the resulting state.
 	/// If no transition with *event* is found it returns the state *s*.
 	/// If no transition with *event* is found it returns the state *s*.
-	const State* trigger(const StateMachineResource* smr, const State* s, StringId32 event, u32* transition_mode);
+	const State* trigger(const StateMachineResource* smr, const State* s, StringId32 event, const Transition** transition_out);
 
 
 	/// Returns the transitions for the state @a s.
 	/// Returns the transitions for the state @a s.
 	const TransitionArray* state_transitions(const State* s);
 	const TransitionArray* state_transitions(const State* s);

+ 18 - 6
src/world/animation_state_machine.cpp

@@ -113,11 +113,19 @@ void AnimationStateMachine::trigger(UnitId unit, StringId32 event)
 {
 {
 	const u32 i = hash_map::get(_map, unit, UINT32_MAX);
 	const u32 i = hash_map::get(_map, unit, UINT32_MAX);
 
 
-	u32 transition_mode;
-	const State* s = state_machine::trigger(_animations[i].state_machine, _animations[i].state, event, &transition_mode);
-	if (transition_mode == TransitionMode::IMMEDIATE)
+	const Transition* transition;
+	const State* s = state_machine::trigger(_animations[i].state_machine
+		, _animations[i].state
+		, event
+		, &transition
+		);
+
+	if (!transition)
+		return;
+
+	if (transition->mode == TransitionMode::IMMEDIATE)
 		_animations[i].state = s;
 		_animations[i].state = s;
-	else if (transition_mode == TransitionMode::WAIT_UNTIL_END)
+	else if (transition->mode == TransitionMode::WAIT_UNTIL_END)
 		_animations[i].state_next = s;
 		_animations[i].state_next = s;
 	else
 	else
 		CE_FATAL("Unknown transition mode");
 		CE_FATAL("Unknown transition mode");
@@ -197,8 +205,12 @@ void AnimationStateMachine::update(float dt)
 				}
 				}
 				else
 				else
 				{
 				{
-					u32 transition_mode;
-					const State* s = state_machine::trigger(anim_i.state_machine, anim_i.state, StringId32("animation_end"), &transition_mode);
+					const Transition* dummy;
+					const State* s = state_machine::trigger(anim_i.state_machine
+						, anim_i.state
+						, StringId32("animation_end")
+						, &dummy
+						);
 					anim_i.time = anim_i.state != s ? 0.0f : anim_i.time_total;
 					anim_i.time = anim_i.state != s ? 0.0f : anim_i.time_total;
 					anim_i.state = s;
 					anim_i.state = s;
 				}
 				}