Browse Source

Events in scripting

[email protected] 11 năm trước cách đây
mục cha
commit
9d57c3ea99

+ 1 - 1
include/anki/Event.h

@@ -10,7 +10,7 @@
 
 #include "anki/event/SceneAmbientColorEvent.h"
 #include "anki/event/LightEvent.h"
-#include "anki/event/MoveEvent.h"
+#include "anki/event/JitterMoveEvent.h"
 #include "anki/event/AnimationEvent.h"
 
 #endif

+ 6 - 12
include/anki/event/MoveEvent.h → include/anki/event/JitterMoveEvent.h

@@ -3,8 +3,8 @@
 // Code licensed under the BSD License.
 // http://www.anki3d.org/LICENSE
 
-#ifndef ANKI_EVENT_MOVE_EVENT_H
-#define ANKI_EVENT_MOVE_EVENT_H
+#ifndef ANKI_JITTER_EVENT_MOVE_EVENT_H
+#define ANKI_JITTER_EVENT_MOVE_EVENT_H
 
 #include "anki/event/Event.h"
 #include "anki/Math.h"
@@ -14,27 +14,21 @@ namespace anki {
 /// @addtogroup event
 /// @{
 
-/// Helper class
-class MoveEventData
-{
-public:
-	Vec4 m_posMin;
-	Vec4 m_posMax;
-};
-
 /// An event for simple movable animations
-class MoveEvent: public Event, private MoveEventData
+class JitterMoveEvent: public Event
 {
 public:
 	/// Constructor
 	ANKI_USE_RESULT Error create(
 		EventManager* manager, F32 startTime, F32 duration,
-		SceneNode* movableSceneNode, const MoveEventData& data);
+		SceneNode* movableSceneNode);
 	/// @}
 
 	/// Implements Event::update
 	ANKI_USE_RESULT Error update(F32 prevUpdateTime, F32 crntTime);
 
+	void setPositionLimits(const Vec4& posMin, const Vec4& posMax);
+
 private:
 	Vec4 m_originalPos;
 	Vec4 m_newPos;

+ 1 - 1
src/CMakeLists.txt

@@ -35,7 +35,7 @@ endif()
 
 add_library(anki Dummy.cpp "${_SYS_SRC}")
 
-target_link_libraries(anki ankicore ankiscript ankirenderer ankiscene ankievent ankiinput ankiphysics ankiresource ankimisc ankigl ankicollision ankimath ankiutil ankitinyxml2 ankilua ankibullet ankiz ${LIB_SDL} ${ANKI_GPERFTOOLS_LIBS} ${_SYS})
+target_link_libraries(anki ankicore ankiscript ankirenderer ankiscene ankievent ankiinput ankiphysics ankiresource ankimisc ankigl ankicollision ankimath ankiutil ankitinyxml2 ankilua ankiz ${LIB_SDL} ${ANKI_GPERFTOOLS_LIBS} ${_SYS})
 
 set_target_properties(anki PROPERTIES LINKER_LANGUAGE CXX)
 

+ 12 - 10
src/event/MoveEvent.cpp → src/event/JitterMoveEvent.cpp

@@ -3,7 +3,7 @@
 // Code licensed under the BSD License.
 // http://www.anki3d.org/LICENSE
 
-#include "anki/event/MoveEvent.h"
+#include "anki/event/JitterMoveEvent.h"
 #include "anki/scene/SceneNode.h"
 #include "anki/scene/MoveComponent.h"
 #include "anki/util/Functions.h"
@@ -11,32 +11,34 @@
 namespace anki {
 
 //==============================================================================
-Error MoveEvent::create(EventManager* manager, F32 startTime, F32 duration,
-	SceneNode* node, const MoveEventData& data)
+Error JitterMoveEvent::create(EventManager* manager, F32 startTime, 
+	F32 duration, SceneNode* node)
 {
 	ANKI_ASSERT(node);
 	Error err = Event::create(manager, startTime, duration, node);
 	if(err) return err;
 
-	*static_cast<MoveEventData*>(this) = data;
-
 	const MoveComponent& move = node->getComponent<MoveComponent>();
 
 	m_originalPos = move.getLocalTransform().getOrigin();
 
+	return err;
+}
+
+//==============================================================================
+void JitterMoveEvent::setPositionLimits(const Vec4& posMin, const Vec4& posMax)
+{
 	for(U i = 0; i < 3; i++)
 	{
-		m_newPos[i] = randRange(m_posMin[i], m_posMax[i]);
+		m_newPos[i] = randRange(posMin[i], posMax[i]);
 	}
 
 	m_newPos[3] = 0.0;
-	m_newPos += move.getLocalTransform().getOrigin();
-
-	return err;
+	m_newPos += m_originalPos;
 }
 
 //==============================================================================
-Error MoveEvent::update(F32 prevUpdateTime, F32 crntTime)
+Error JitterMoveEvent::update(F32 prevUpdateTime, F32 crntTime)
 {
 	SceneNode* node = getSceneNode();
 	ANKI_ASSERT(node);

+ 206 - 0
src/script/Event.cpp

@@ -0,0 +1,206 @@
+// Copyright (C) 2014, Panagiotis Christopoulos Charitos.
+// All rights reserved.
+// Code licensed under the BSD License.
+// http://www.anki3d.org/LICENSE
+
+// WARNING: The file is auto generated.
+
+#include "anki/script/LuaBinder.h"
+#include "anki/script/ScriptManager.h"
+#include "anki/scene/SceneGraph.h"
+#include "anki/Event.h"
+
+namespace anki {
+
+//==============================================================================
+template<typename T, typename... TArgs>
+static T* newEvent(EventManager* events, TArgs... args)
+{
+	T* ptr;
+	Error err = events->template newEvent<T>(ptr, args...);
+
+	if(!err)
+	{
+		return ptr;
+	}
+	else
+	{
+		return nullptr;
+	}
+}
+
+//==============================================================================
+static EventManager* getEventManager(lua_State* l)
+{
+	LuaBinder* binder = reinterpret_cast<LuaBinder*>(lua_getuserdata(l));
+
+	ScriptManager* scriptManager = 
+		reinterpret_cast<ScriptManager*>(binder->getParent());
+
+	return &scriptManager->_getSceneGraph().getEventManager();
+}
+
+//==============================================================================
+// SceneAmbientColorEvent                                                      =
+//==============================================================================
+
+//==============================================================================
+static const char* classnameSceneAmbientColorEvent = "SceneAmbientColorEvent";
+
+template<>
+I64 LuaBinder::getWrappedTypeSignature<SceneAmbientColorEvent>()
+{
+	return 671577193;
+}
+
+template<>
+const char* LuaBinder::getWrappedTypeName<SceneAmbientColorEvent>()
+{
+	return classnameSceneAmbientColorEvent;
+}
+
+//==============================================================================
+/// Wrap class SceneAmbientColorEvent.
+static inline void wrapSceneAmbientColorEvent(lua_State* l)
+{
+	LuaBinder::createClass(l, classnameSceneAmbientColorEvent);
+	lua_settop(l, 0);
+}
+
+//==============================================================================
+// EventManager                                                                =
+//==============================================================================
+
+//==============================================================================
+static const char* classnameEventManager = "EventManager";
+
+template<>
+I64 LuaBinder::getWrappedTypeSignature<EventManager>()
+{
+	return -1078526863;
+}
+
+template<>
+const char* LuaBinder::getWrappedTypeName<EventManager>()
+{
+	return classnameEventManager;
+}
+
+//==============================================================================
+/// Pre-wrap method EventManager::newSceneAmbientColorEvent.
+static inline int pwrapEventManagernewSceneAmbientColorEvent(lua_State* l)
+{
+	UserData* ud;
+	(void)ud;
+	void* voidp;
+	(void)voidp;
+	
+	LuaBinder::checkArgsCount(l, 4);
+	
+	// Get "this" as "self"
+	if(LuaBinder::checkUserData(l, 1, classnameEventManager, -1078526863, ud)) return -1;
+	EventManager* self = reinterpret_cast<EventManager*>(ud->m_data);
+	ANKI_ASSERT(self != nullptr);
+	
+	// Pop arguments
+	F32 arg0;
+	if(LuaBinder::checkNumber(l, 2, arg0)) return -1;
+	
+	F32 arg1;
+	if(LuaBinder::checkNumber(l, 3, arg1)) return -1;
+	
+	if(LuaBinder::checkUserData(l, 4, "Vec4", 1033927922, ud)) return -1;
+	Vec4* iarg2 = reinterpret_cast<Vec4*>(ud->m_data);
+	const Vec4& arg2(*iarg2);
+	
+	// Call the method
+	SceneAmbientColorEvent* ret = newEvent<SceneAmbientColorEvent>(self, arg0, arg1, arg2);
+	
+	// Push return value
+	if(ANKI_UNLIKELY(ret == nullptr))
+	{
+		lua_pushstring(l, "Glue code returned nullptr");
+		return -1;
+	}
+	
+	voidp = lua_newuserdata(l, sizeof(UserData));
+	ud = reinterpret_cast<UserData*>(voidp);
+	luaL_setmetatable(l, "SceneAmbientColorEvent");
+	ud->m_data = reinterpret_cast<void*>(ret);
+	ud->m_gc = false;
+	ud->m_sig = 671577193;
+	
+	return 1;
+}
+
+//==============================================================================
+/// Wrap method EventManager::newSceneAmbientColorEvent.
+static int wrapEventManagernewSceneAmbientColorEvent(lua_State* l)
+{
+	int res = pwrapEventManagernewSceneAmbientColorEvent(l);
+	if(res >= 0) return res;
+	lua_error(l);
+	return 0;
+}
+
+//==============================================================================
+/// Wrap class EventManager.
+static inline void wrapEventManager(lua_State* l)
+{
+	LuaBinder::createClass(l, classnameEventManager);
+	LuaBinder::pushLuaCFuncMethod(l, "newSceneAmbientColorEvent", wrapEventManagernewSceneAmbientColorEvent);
+	lua_settop(l, 0);
+}
+
+//==============================================================================
+/// Pre-wrap function getEventManager.
+static inline int pwrapgetEventManager(lua_State* l)
+{
+	UserData* ud;
+	(void)ud;
+	void* voidp;
+	(void)voidp;
+	
+	LuaBinder::checkArgsCount(l, 0);
+	
+	// Call the function
+	EventManager* ret = getEventManager(l);
+	
+	// Push return value
+	if(ANKI_UNLIKELY(ret == nullptr))
+	{
+		lua_pushstring(l, "Glue code returned nullptr");
+		return -1;
+	}
+	
+	voidp = lua_newuserdata(l, sizeof(UserData));
+	ud = reinterpret_cast<UserData*>(voidp);
+	luaL_setmetatable(l, "EventManager");
+	ud->m_data = reinterpret_cast<void*>(ret);
+	ud->m_gc = false;
+	ud->m_sig = -1078526863;
+	
+	return 1;
+}
+
+//==============================================================================
+/// Wrap function getEventManager.
+static int wrapgetEventManager(lua_State* l)
+{
+	int res = pwrapgetEventManager(l);
+	if(res >= 0) return res;
+	lua_error(l);
+	return 0;
+}
+
+//==============================================================================
+/// Wrap the module.
+void wrapModuleEvent(lua_State* l)
+{
+	wrapSceneAmbientColorEvent(l);
+	wrapEventManager(l);
+	LuaBinder::pushLuaCFunc(l, "getEventManager", wrapgetEventManager);
+}
+
+} // end namespace anki
+

+ 74 - 0
src/script/Event.xml

@@ -0,0 +1,74 @@
+<glue>
+	<head><![CDATA[// Copyright (C) 2014, Panagiotis Christopoulos Charitos.
+// All rights reserved.
+// Code licensed under the BSD License.
+// http://www.anki3d.org/LICENSE
+
+// WARNING: The file is auto generated.
+
+#include "anki/script/LuaBinder.h"
+#include "anki/script/ScriptManager.h"
+#include "anki/scene/SceneGraph.h"
+#include "anki/Event.h"
+
+namespace anki {
+
+//==============================================================================
+template<typename T, typename... TArgs>
+static T* newEvent(EventManager* events, TArgs... args)
+{
+	T* ptr;
+	Error err = events->template newEvent<T>(ptr, args...);
+
+	if(!err)
+	{
+		return ptr;
+	}
+	else
+	{
+		return nullptr;
+	}
+}
+
+//==============================================================================
+static EventManager* getEventManager(lua_State* l)
+{
+	LuaBinder* binder = reinterpret_cast<LuaBinder*>(lua_getuserdata(l));
+
+	ScriptManager* scriptManager = 
+		reinterpret_cast<ScriptManager*>(binder->getParent());
+
+	return &scriptManager->_getSceneGraph().getEventManager();
+}]]></head>
+
+	<classes>
+		<class name="SceneAmbientColorEvent">
+		</class>
+		<class name="EventManager">
+			<methods>
+				<method name="newSceneAmbientColorEvent">
+					<overrideCall><![CDATA[SceneAmbientColorEvent* ret = newEvent<SceneAmbientColorEvent>(self, arg0, arg1, arg2);]]></overrideCall>
+					<args>
+						<arg>F32</arg>
+						<arg>F32</arg>
+						<arg>const Vec4&amp;</arg>
+					</args>
+					<return>SceneAmbientColorEvent*</return>
+				</method>
+			</methods>
+		</class>
+	</classes>
+
+	<functions>
+		<function name="getEventManager">
+			<overrideCall>EventManager* ret = getEventManager(l);</overrideCall>
+			<return>EventManager*</return>
+		</function>
+	</functions>
+
+	<tail><![CDATA[} // end namespace anki]]></tail>
+</glue>
+
+
+
+

+ 5 - 6
testapp/Main.cpp

@@ -26,7 +26,7 @@
 #include "anki/Scene.h"
 #include "anki/event/LightEvent.h"
 #include "anki/event/AnimationEvent.h"
-#include "anki/event/MoveEvent.h"
+#include "anki/event/JitterMoveEvent.h"
 #include "anki/core/Counters.h"
 #include "anki/core/Config.h"
 
@@ -161,11 +161,10 @@ Error init()
 		event->setSpecularIntensityMultiplier(Vec4(0.1, 0.1, 0.0, 0.0));
 		event->setReanimate(true);
 
-		MoveEventData moveData;
-		moveData.m_posMin = Vec4(-0.5, 0.0, -0.5, 0);
-		moveData.m_posMax = Vec4(0.5, 0.0, 0.5, 0);
-		MoveEvent* mevent;
-		scene.getEventManager().newEvent(mevent, 0.0, 2.0, point, moveData);
+		JitterMoveEvent* mevent;
+		scene.getEventManager().newEvent(mevent, 0.0, 2.0, point);
+		mevent->setPositionLimits(
+			Vec4(-0.5, 0.0, -0.5, 0), Vec4(0.5, 0.0, 0.5, 0));
 		mevent->setReanimate(true);
 
 		ParticleEmitter* pe;