فهرست منبع

Merge pull request #260 from seanpaultaylor/next

Initial but incomplete Linux and CMake support
Sean Paul Taylor 13 سال پیش
والد
کامیت
6e045b48dc
7فایلهای تغییر یافته به همراه1490 افزوده شده و 31 حذف شده
  1. 17 0
      CMakeLists.txt
  2. 8 0
      build/README.md
  3. 594 0
      gameplay/CMakeLists.txt
  4. 12 1
      gameplay/src/Base.h
  5. 30 30
      gameplay/src/Curve.cpp
  6. 809 0
      gameplay/src/PlatformLinux.cpp
  7. 20 0
      gameplay/src/gameplay-main-linux.cpp

+ 17 - 0
CMakeLists.txt

@@ -0,0 +1,17 @@
+cmake_minimum_required(VERSION 2.6)
+
+project(GamePlay)
+
+set(GAMEPLAY_VERSION 1.4.0)
+
+# gameplay library
+add_subdirectory(gameplay)
+
+# gameplay samples
+add_subdirectory(gameplay-samples/sample00-mesh)
+#add_subdirectory(gameplay-samples/sample01-longboard)
+#add_subdirectory(gameplay-samples/sample02-spaceship)
+#add_subdirectory(gameplay-samples/sample03-character)
+#add_subdirectory(gameplay-samples/sample04-particles)
+#add_subdirectory(gameplay-samples/sample05-lua)
+

+ 8 - 0
build/README.md

@@ -0,0 +1,8 @@
+## Building with CMake
+- Run the following command lines from this directory:
+> cmake ..
+> make
+
+
+
+

+ 594 - 0
gameplay/CMakeLists.txt

@@ -0,0 +1,594 @@
+set(GAMEPLAY_SRC
+    src/AbsoluteLayout.cpp
+    src/AbsoluteLayout.h
+    src/AIAgent.cpp
+    src/AIAgent.h
+    src/AIController.cpp
+    src/AIController.h
+    src/AIMessage.cpp
+    src/AIMessage.h
+    src/AIState.cpp
+    src/AIState.h
+    src/AIStateMachine.cpp
+    src/AIStateMachine.h
+    src/Animation.cpp
+    src/Animation.h
+    src/AnimationClip.cpp
+    src/AnimationClip.h
+    src/AnimationController.cpp
+    src/AnimationController.h
+    src/AnimationTarget.cpp
+    src/AnimationTarget.h
+    src/AnimationValue.cpp
+    src/AnimationValue.h
+    src/AudioBuffer.cpp
+    src/AudioBuffer.h
+    src/AudioController.cpp
+    src/AudioController.h
+    src/AudioListener.cpp
+    src/AudioListener.h
+    src/AudioSource.cpp
+    src/AudioSource.h
+    src/Base.h
+    src/BoundingBox.cpp
+    src/BoundingBox.h
+    src/BoundingBox.inl
+    src/BoundingSphere.cpp
+    src/BoundingSphere.h
+    src/BoundingSphere.inl
+    src/Bundle.cpp
+    src/Bundle.h
+    src/Button.cpp
+    src/Button.h
+    src/Camera.cpp
+    src/Camera.h
+    src/CheckBox.cpp
+    src/CheckBox.h
+    src/Container.cpp
+    src/Container.h
+    src/Control.cpp
+    src/Control.h
+    src/Curve.cpp
+    src/Curve.h
+    src/DebugNew.cpp
+    src/DebugNew.h
+    src/DepthStencilTarget.cpp
+    src/DepthStencilTarget.h
+    src/Effect.cpp
+    src/Effect.h
+    src/FileSystem.cpp
+    src/FileSystem.h
+    src/FlowLayout.cpp
+    src/FlowLayout.h
+    src/Font.cpp
+    src/Font.h
+    src/Form.cpp
+    src/Form.h
+    src/FrameBuffer.cpp
+    src/FrameBuffer.h
+    src/Frustum.cpp
+    src/Frustum.h
+    src/Game.cpp
+    src/Game.h
+    src/Game.inl
+    src/Gamepad.cpp
+    src/Gamepad.h
+    src/gameplay-main-android.cpp
+    src/gameplay-main-linux.cpp
+    src/gameplay-main-qnx.cpp
+    src/gameplay-main-win32.cpp
+    src/Image.cpp
+    src/Image.h
+    src/Image.inl
+    src/Joint.cpp
+    src/Joint.h
+    src/Joystick.cpp
+    src/Joystick.h
+    src/Joystick.inl
+    src/Label.cpp
+    src/Label.h
+    src/Layout.cpp
+    src/Layout.h
+    src/Light.cpp
+    src/Light.h
+    src/Material.cpp
+    src/Material.h
+    src/MaterialParameter.cpp
+    src/MaterialParameter.h
+    src/MathUtil.h
+    src/MathUtil.inl
+    src/MathUtilNeon.inl
+    src/Matrix.cpp
+    src/Matrix.h
+    src/Matrix.inl
+    src/Mesh.cpp
+    src/Mesh.h
+    src/MeshBatch.cpp
+    src/MeshBatch.h
+    src/MeshBatch.inl
+    src/MeshPart.cpp
+    src/MeshPart.h
+    src/MeshSkin.cpp
+    src/MeshSkin.h
+    src/Model.cpp
+    src/Model.h
+    src/Node.cpp
+    src/Node.h
+    src/ParticleEmitter.cpp
+    src/ParticleEmitter.h
+    src/Pass.cpp
+    src/Pass.h
+    src/PhysicsCharacter.cpp
+    src/PhysicsCharacter.h
+    src/PhysicsCollisionObject.cpp
+    src/PhysicsCollisionObject.h
+    src/PhysicsCollisionShape.cpp
+    src/PhysicsCollisionShape.h
+    src/PhysicsConstraint.cpp
+    src/PhysicsConstraint.h
+    src/PhysicsController.cpp
+    src/PhysicsController.h
+    src/PhysicsFixedConstraint.cpp
+    src/PhysicsFixedConstraint.h
+    src/PhysicsGenericConstraint.cpp
+    src/PhysicsGenericConstraint.h
+    src/PhysicsGhostObject.cpp
+    src/PhysicsGhostObject.h
+    src/PhysicsHingeConstraint.cpp
+    src/PhysicsHingeConstraint.h
+    src/PhysicsRigidBody.cpp
+    src/PhysicsRigidBody.h
+    src/PhysicsSocketConstraint.cpp
+    src/PhysicsSocketConstraint.h
+    src/PhysicsSpringConstraint.cpp
+    src/PhysicsSpringConstraint.h
+    src/Plane.cpp
+    src/Plane.h
+    src/Plane.inl
+    src/Platform.h
+    src/PlatformAndroid.cpp
+    src/PlatformLinux.cpp
+    src/PlatformQNX.cpp
+    src/PlatformWin32.cpp
+    src/Properties.cpp
+    src/Properties.h
+    src/Quaternion.cpp
+    src/Quaternion.h
+    src/Quaternion.inl
+    src/RadioButton.cpp
+    src/RadioButton.h
+    src/Ray.cpp
+    src/Ray.h
+    src/Ray.inl
+    src/Rectangle.cpp
+    src/Rectangle.h
+    src/Ref.cpp
+    src/Ref.h
+    src/RenderState.cpp
+    src/RenderState.h
+    src/RenderTarget.cpp
+    src/RenderTarget.h
+    src/Scene.cpp
+    src/Scene.h
+    src/SceneLoader.cpp
+    src/SceneLoader.h
+    src/ScreenDisplayer.cpp
+    src/ScreenDisplayer.h
+    src/ScriptController.cpp
+    src/ScriptController.h
+    src/ScriptController.inl
+    src/ScriptTarget.cpp
+    src/ScriptTarget.h
+    src/Slider.cpp
+    src/Slider.h
+    src/SpriteBatch.cpp
+    src/SpriteBatch.h
+    src/Technique.cpp
+    src/Technique.h
+    src/TextBox.cpp
+    src/TextBox.h
+    src/Texture.cpp
+    src/Texture.h
+    src/Theme.cpp
+    src/Theme.h
+    src/ThemeStyle.cpp
+    src/ThemeStyle.h
+    src/Transform.cpp
+    src/Transform.h
+    src/Vector2.cpp
+    src/Vector2.h
+    src/Vector2.inl
+    src/Vector3.cpp
+    src/Vector3.h
+    src/Vector3.inl
+    src/Vector4.cpp
+    src/Vector4.h
+    src/Vector4.inl
+    src/VertexAttributeBinding.cpp
+    src/VertexAttributeBinding.h
+    src/VertexFormat.cpp
+    src/VertexFormat.h
+    src/VerticalLayout.cpp
+    src/VerticalLayout.h
+)
+
+set(GAMEPLAY_LUA
+    src/lua/lua_all_bindings.cpp
+    src/lua/lua_all_bindings.h
+    src/lua/lua_AbsoluteLayout.cpp
+    src/lua/lua_AbsoluteLayout.h
+    src/lua/lua_AIAgent.cpp
+    src/lua/lua_AIAgent.h
+    src/lua/lua_AIAgentListener.cpp
+    src/lua/lua_AIAgentListener.h
+    src/lua/lua_AIController.cpp
+    src/lua/lua_AIController.h
+    src/lua/lua_AIMessage.cpp
+    src/lua/lua_AIMessage.h
+    src/lua/lua_AIMessageParameterType.cpp
+    src/lua/lua_AIMessageParameterType.h
+    src/lua/lua_AIState.cpp
+    src/lua/lua_AIState.h
+    src/lua/lua_AIStateListener.cpp
+    src/lua/lua_AIStateListener.h
+    src/lua/lua_AIStateMachine.cpp
+    src/lua/lua_AIStateMachine.h
+    src/lua/lua_Animation.cpp
+    src/lua/lua_Animation.h
+    src/lua/lua_AnimationClip.cpp
+    src/lua/lua_AnimationClip.h
+    src/lua/lua_AnimationClipListener.cpp
+    src/lua/lua_AnimationClipListener.h
+    src/lua/lua_AnimationClipListenerEventType.cpp
+    src/lua/lua_AnimationClipListenerEventType.h
+    src/lua/lua_AnimationController.cpp
+    src/lua/lua_AnimationController.h
+    src/lua/lua_AnimationTarget.cpp
+    src/lua/lua_AnimationTarget.h
+    src/lua/lua_AnimationValue.cpp
+    src/lua/lua_AnimationValue.h
+    src/lua/lua_AudioBuffer.cpp
+    src/lua/lua_AudioBuffer.h
+    src/lua/lua_AudioController.cpp
+    src/lua/lua_AudioController.h
+    src/lua/lua_AudioListener.cpp
+    src/lua/lua_AudioListener.h
+    src/lua/lua_AudioSource.cpp
+    src/lua/lua_AudioSource.h
+    src/lua/lua_AudioSourceState.cpp
+    src/lua/lua_AudioSourceState.h
+    src/lua/lua_BoundingBox.cpp
+    src/lua/lua_BoundingBox.h
+    src/lua/lua_BoundingSphere.cpp
+    src/lua/lua_BoundingSphere.h
+    src/lua/lua_Bundle.cpp
+    src/lua/lua_Bundle.h
+    src/lua/lua_Button.cpp
+    src/lua/lua_Button.h
+    src/lua/lua_Camera.cpp
+    src/lua/lua_Camera.h
+    src/lua/lua_CameraType.cpp
+    src/lua/lua_CameraType.h
+    src/lua/lua_CheckBox.cpp
+    src/lua/lua_CheckBox.h
+    src/lua/lua_Container.cpp
+    src/lua/lua_Container.h
+    src/lua/lua_ContainerScroll.cpp
+    src/lua/lua_ContainerScroll.h
+    src/lua/lua_Control.cpp
+    src/lua/lua_Control.h
+    src/lua/lua_ControlAlignment.cpp
+    src/lua/lua_ControlAlignment.h
+    src/lua/lua_ControlListener.cpp
+    src/lua/lua_ControlListener.h
+    src/lua/lua_ControlListenerEventType.cpp
+    src/lua/lua_ControlListenerEventType.h
+    src/lua/lua_ControlState.cpp
+    src/lua/lua_ControlState.h
+    src/lua/lua_Curve.cpp
+    src/lua/lua_Curve.h
+    src/lua/lua_CurveInterpolationType.cpp
+    src/lua/lua_CurveInterpolationType.h
+    src/lua/lua_DepthStencilTarget.cpp
+    src/lua/lua_DepthStencilTarget.h
+    src/lua/lua_DepthStencilTargetFormat.cpp
+    src/lua/lua_DepthStencilTargetFormat.h
+    src/lua/lua_Effect.cpp
+    src/lua/lua_Effect.h
+    src/lua/lua_FileSystem.cpp
+    src/lua/lua_FileSystem.h
+    src/lua/lua_FlowLayout.cpp
+    src/lua/lua_FlowLayout.h
+    src/lua/lua_Font.cpp
+    src/lua/lua_Font.h
+    src/lua/lua_FontJustify.cpp
+    src/lua/lua_FontJustify.h
+    src/lua/lua_FontStyle.cpp
+    src/lua/lua_FontStyle.h
+    src/lua/lua_FontText.cpp
+    src/lua/lua_FontText.h
+    src/lua/lua_Form.cpp
+    src/lua/lua_Form.h
+    src/lua/lua_FrameBuffer.cpp
+    src/lua/lua_FrameBuffer.h
+    src/lua/lua_Frustum.cpp
+    src/lua/lua_Frustum.h
+    src/lua/lua_Game.cpp
+    src/lua/lua_Game.h
+    src/lua/lua_GameClearFlags.cpp
+    src/lua/lua_GameClearFlags.h
+    src/lua/lua_Gamepad.cpp
+    src/lua/lua_Gamepad.h
+    src/lua/lua_GamepadButtonState.cpp
+    src/lua/lua_GamepadButtonState.h
+    src/lua/lua_GamepadGamepadEvent.cpp
+    src/lua/lua_GamepadGamepadEvent.h
+    src/lua/lua_GameState.cpp
+    src/lua/lua_GameState.h
+    src/lua/lua_Global.cpp
+    src/lua/lua_Global.h
+    src/lua/lua_Image.cpp
+    src/lua/lua_Image.h
+    src/lua/lua_ImageFormat.cpp
+    src/lua/lua_ImageFormat.h
+    src/lua/lua_Joint.cpp
+    src/lua/lua_Joint.h
+    src/lua/lua_Joystick.cpp
+    src/lua/lua_Joystick.h
+    src/lua/lua_Keyboard.cpp
+    src/lua/lua_Keyboard.h
+    src/lua/lua_KeyboardKey.cpp
+    src/lua/lua_KeyboardKey.h
+    src/lua/lua_KeyboardKeyEvent.cpp
+    src/lua/lua_KeyboardKeyEvent.h
+    src/lua/lua_Label.cpp
+    src/lua/lua_Label.h
+    src/lua/lua_Layout.cpp
+    src/lua/lua_Layout.h
+    src/lua/lua_LayoutType.cpp
+    src/lua/lua_LayoutType.h
+    src/lua/lua_Light.cpp
+    src/lua/lua_Light.h
+    src/lua/lua_LightType.cpp
+    src/lua/lua_LightType.h
+    src/lua/lua_Material.cpp
+    src/lua/lua_Material.h
+    src/lua/lua_MaterialParameter.cpp
+    src/lua/lua_MaterialParameter.h
+    src/lua/lua_MathUtil.cpp
+    src/lua/lua_MathUtil.h
+    src/lua/lua_Matrix.cpp
+    src/lua/lua_Matrix.h
+    src/lua/lua_Mesh.cpp
+    src/lua/lua_Mesh.h
+    src/lua/lua_MeshBatch.cpp
+    src/lua/lua_MeshBatch.h
+    src/lua/lua_MeshIndexFormat.cpp
+    src/lua/lua_MeshIndexFormat.h
+    src/lua/lua_MeshPart.cpp
+    src/lua/lua_MeshPart.h
+    src/lua/lua_MeshPrimitiveType.cpp
+    src/lua/lua_MeshPrimitiveType.h
+    src/lua/lua_MeshSkin.cpp
+    src/lua/lua_MeshSkin.h
+    src/lua/lua_Model.cpp
+    src/lua/lua_Model.h
+    src/lua/lua_Mouse.cpp
+    src/lua/lua_Mouse.h
+    src/lua/lua_MouseMouseEvent.cpp
+    src/lua/lua_MouseMouseEvent.h
+    src/lua/lua_Node.cpp
+    src/lua/lua_Node.h
+    src/lua/lua_NodeCloneContext.cpp
+    src/lua/lua_NodeCloneContext.h
+    src/lua/lua_NodeType.cpp
+    src/lua/lua_NodeType.h
+    src/lua/lua_ParticleEmitter.cpp
+    src/lua/lua_ParticleEmitter.h
+    src/lua/lua_ParticleEmitterTextureBlending.cpp
+    src/lua/lua_ParticleEmitterTextureBlending.h
+    src/lua/lua_Pass.cpp
+    src/lua/lua_Pass.h
+    src/lua/lua_PhysicsCharacter.cpp
+    src/lua/lua_PhysicsCharacter.h
+    src/lua/lua_PhysicsCollisionObject.cpp
+    src/lua/lua_PhysicsCollisionObject.h
+    src/lua/lua_PhysicsCollisionObjectCollisionListener.cpp
+    src/lua/lua_PhysicsCollisionObjectCollisionListener.h
+    src/lua/lua_PhysicsCollisionObjectCollisionListenerEventType.cpp
+    src/lua/lua_PhysicsCollisionObjectCollisionListenerEventType.h
+    src/lua/lua_PhysicsCollisionObjectCollisionPair.cpp
+    src/lua/lua_PhysicsCollisionObjectCollisionPair.h
+    src/lua/lua_PhysicsCollisionObjectType.cpp
+    src/lua/lua_PhysicsCollisionObjectType.h
+    src/lua/lua_PhysicsCollisionShape.cpp
+    src/lua/lua_PhysicsCollisionShape.h
+    src/lua/lua_PhysicsCollisionShapeDefinition.cpp
+    src/lua/lua_PhysicsCollisionShapeDefinition.h
+    src/lua/lua_PhysicsCollisionShapeType.cpp
+    src/lua/lua_PhysicsCollisionShapeType.h
+    src/lua/lua_PhysicsConstraint.cpp
+    src/lua/lua_PhysicsConstraint.h
+    src/lua/lua_PhysicsController.cpp
+    src/lua/lua_PhysicsController.h
+    src/lua/lua_PhysicsControllerHitFilter.cpp
+    src/lua/lua_PhysicsControllerHitFilter.h
+    src/lua/lua_PhysicsControllerHitResult.cpp
+    src/lua/lua_PhysicsControllerHitResult.h
+    src/lua/lua_PhysicsControllerListener.cpp
+    src/lua/lua_PhysicsControllerListener.h
+    src/lua/lua_PhysicsControllerListenerEventType.cpp
+    src/lua/lua_PhysicsControllerListenerEventType.h
+    src/lua/lua_PhysicsFixedConstraint.cpp
+    src/lua/lua_PhysicsFixedConstraint.h
+    src/lua/lua_PhysicsGenericConstraint.cpp
+    src/lua/lua_PhysicsGenericConstraint.h
+    src/lua/lua_PhysicsGhostObject.cpp
+    src/lua/lua_PhysicsGhostObject.h
+    src/lua/lua_PhysicsHingeConstraint.cpp
+    src/lua/lua_PhysicsHingeConstraint.h
+    src/lua/lua_PhysicsRigidBody.cpp
+    src/lua/lua_PhysicsRigidBody.h
+    src/lua/lua_PhysicsRigidBodyParameters.cpp
+    src/lua/lua_PhysicsRigidBodyParameters.h
+    src/lua/lua_PhysicsSocketConstraint.cpp
+    src/lua/lua_PhysicsSocketConstraint.h
+    src/lua/lua_PhysicsSpringConstraint.cpp
+    src/lua/lua_PhysicsSpringConstraint.h
+    src/lua/lua_Plane.cpp
+    src/lua/lua_Plane.h
+    src/lua/lua_Platform.cpp
+    src/lua/lua_Platform.h
+    src/lua/lua_Properties.cpp
+    src/lua/lua_Properties.h
+    src/lua/lua_PropertiesType.cpp
+    src/lua/lua_PropertiesType.h
+    src/lua/lua_Quaternion.cpp
+    src/lua/lua_Quaternion.h
+    src/lua/lua_RadioButton.cpp
+    src/lua/lua_RadioButton.h
+    src/lua/lua_Ray.cpp
+    src/lua/lua_Ray.h
+    src/lua/lua_Rectangle.cpp
+    src/lua/lua_Rectangle.h
+    src/lua/lua_Ref.cpp
+    src/lua/lua_Ref.h
+    src/lua/lua_RenderState.cpp
+    src/lua/lua_RenderState.h
+    src/lua/lua_RenderStateAutoBinding.cpp
+    src/lua/lua_RenderStateAutoBinding.h
+    src/lua/lua_RenderStateBlend.cpp
+    src/lua/lua_RenderStateBlend.h
+    src/lua/lua_RenderStateStateBlock.cpp
+    src/lua/lua_RenderStateStateBlock.h
+    src/lua/lua_RenderTarget.cpp
+    src/lua/lua_RenderTarget.h
+    src/lua/lua_Scene.cpp
+    src/lua/lua_Scene.h
+    src/lua/lua_SceneDebugFlags.cpp
+    src/lua/lua_SceneDebugFlags.h
+    src/lua/lua_ScreenDisplayer.cpp
+    src/lua/lua_ScreenDisplayer.h
+    src/lua/lua_ScriptController.cpp
+    src/lua/lua_ScriptController.h
+    src/lua/lua_ScriptTarget.cpp
+    src/lua/lua_ScriptTarget.h
+    src/lua/lua_Slider.cpp
+    src/lua/lua_Slider.h
+    src/lua/lua_SpriteBatch.cpp
+    src/lua/lua_SpriteBatch.h
+    src/lua/lua_Technique.cpp
+    src/lua/lua_Technique.h
+    src/lua/lua_TextBox.cpp
+    src/lua/lua_TextBox.h
+    src/lua/lua_Texture.cpp
+    src/lua/lua_Texture.h
+    src/lua/lua_TextureFilter.cpp
+    src/lua/lua_TextureFilter.h
+    src/lua/lua_TextureFormat.cpp
+    src/lua/lua_TextureFormat.h
+    src/lua/lua_TextureSampler.cpp
+    src/lua/lua_TextureSampler.h
+    src/lua/lua_TextureWrap.cpp
+    src/lua/lua_TextureWrap.h
+    src/lua/lua_Theme.cpp
+    src/lua/lua_Theme.h
+    src/lua/lua_ThemeSideRegions.cpp
+    src/lua/lua_ThemeSideRegions.h
+    src/lua/lua_ThemeStyle.cpp
+    src/lua/lua_ThemeStyle.h
+    src/lua/lua_ThemeThemeImage.cpp
+    src/lua/lua_ThemeThemeImage.h
+    src/lua/lua_ThemeUVs.cpp
+    src/lua/lua_ThemeUVs.h
+    src/lua/lua_Touch.cpp
+    src/lua/lua_Touch.h
+    src/lua/lua_TouchTouchEvent.cpp
+    src/lua/lua_TouchTouchEvent.h
+    src/lua/lua_Transform.cpp
+    src/lua/lua_Transform.h
+    src/lua/lua_TransformListener.cpp
+    src/lua/lua_TransformListener.h
+    src/lua/lua_Uniform.cpp
+    src/lua/lua_Uniform.h
+    src/lua/lua_Vector2.cpp
+    src/lua/lua_Vector2.h
+    src/lua/lua_Vector3.cpp
+    src/lua/lua_Vector3.h
+    src/lua/lua_Vector4.cpp
+    src/lua/lua_Vector4.h
+    src/lua/lua_VertexAttributeBinding.cpp
+    src/lua/lua_VertexAttributeBinding.h
+    src/lua/lua_VertexFormat.cpp
+    src/lua/lua_VertexFormat.h
+    src/lua/lua_VertexFormatElement.cpp
+    src/lua/lua_VertexFormatElement.h
+    src/lua/lua_VertexFormatUsage.cpp
+    src/lua/lua_VertexFormatUsage.h
+    src/lua/lua_VerticalLayout.cpp
+    src/lua/lua_VerticalLayout.h
+)
+
+set(GAMEPLAY_RES
+    res/logo_black.png
+    res/logo_powered_black.png
+    res/logo_powered_white.png
+    res/logo_white.png
+)
+
+set(GAMEPLAY_RES_SHADERS
+    res/shaders/colored-unlit.frag
+    res/shaders/colored-unlit.vert
+    res/shaders/colored.frag
+    res/shaders/colored.vert
+    res/shaders/textured-bumped.frag
+    res/shaders/textured-bumped.vert
+    res/shaders/textured-unlit.frag
+    res/shaders/textured-unlit.vert
+    res/shaders/textured.frag
+    res/shaders/textured.vert
+)
+
+set(GAMEPLAY_RES_SHADERS_LIB
+    res/shaders/lib/attributes-skinning.vert
+    res/shaders/lib/attributes.vert
+    res/shaders/lib/lighting-directional.frag
+    res/shaders/lib/lighting-directional.vert
+    res/shaders/lib/lighting-point.frag
+    res/shaders/lib/lighting-point.vert
+    res/shaders/lib/lighting-spot.frag
+    res/shaders/lib/lighting-spot.vert
+    res/shaders/lib/lighting.frag
+)
+
+include_directories( 
+    src
+    ../external-deps/lua/include
+    ../external-deps/bullet/include
+    ../external-deps/libpng/include
+    ../external-deps/zlib/include
+    ../external-deps/oggvorbis/include
+    ../external-deps/openal/include
+    ../external-deps/glew/include
+)
+
+add_definitions(-D__linux__)
+add_definitions(-lstdc++)
+
+add_library(gameplay STATIC
+    ${GAMEPLAY_SRC}
+    ${GAMEPLAY_LUA}
+)
+
+set_target_properties(gameplay PROPERTIES
+    OUTPUT_NAME "gameplay"
+    CLEAN_DIRECT_OUTPUT 1
+    VERSION ${GAMEPLAY_VERSION}
+)
+
+source_group(lua FILES ${GAMEPLAY_LUA})
+source_group(res FILES ${GAMEPLAY_RES} ${GAMEPLAY_RES} ${GAMEPLAY_RES_SHADERS} ${GAMEPLAY_RES_SHADERS_LIB})
+source_group(src FILES ${GAMEPLAY_SRC})
+
+
+

+ 12 - 1
gameplay/src/Base.h

@@ -15,6 +15,7 @@
 #include <ctime>
 #include <iostream>
 #include <string>
+#include <cstring>
 #include <vector>
 #include <list>
 #include <set>
@@ -152,7 +153,13 @@ extern void printError(const char* format, ...);
 #endif
 
 // Audio (OpenAL/Vorbis)
-#if defined (__QNX__) || defined(__ANDROID__)
+#ifdef __QNX__
+#include <AL/al.h>
+#include <AL/alc.h>
+#elif __ANDROID__
+#include <AL/al.h>
+#include <AL/alc.h>
+#elif __linux__
 #include <AL/al.h>
 #include <AL/alc.h>
 #elif WIN32
@@ -205,6 +212,10 @@ using std::va_list;
     #define GLEW_STATIC
     #include <GL/glew.h>
     #define USE_VAO
+#elif __linux__
+        #define GLEW_STATIC
+        #include <GL/glew.h>
+        #define USE_VAO
 #elif __APPLE__
     #include "TargetConditionals.h"
     #if TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR

+ 30 - 30
gameplay/src/Curve.cpp

@@ -1,8 +1,8 @@
-// Purposely not including Base.h here, or any other gameplay dependencies
-// so this class can be reused between gameplay and gameplay-encoder.
+// Purposely not including Base.h here, or any other gameplay dependencies, so it can be reused between gameplay and gameplay-encoder.
 #include "Curve.h"
 #include "Quaternion.h"
 #include <cassert>
+#include <cstring>
 #include <cmath>
 #include <memory>
 
@@ -50,34 +50,34 @@ using std::strcmp;
     }
 #endif
 
-static inline float bezier(float eq0, float eq1, float eq2, float eq3, float from, float out, float to, float in)
-{
-    return from * eq0 + out * eq1 + in * eq2 + to * eq3;
-}
-
-static inline float bspline(float eq0, float eq1, float eq2, float eq3, float c0, float c1, float c2, float c3)
-{
-    return c0 * eq0 + c1 * eq1 + c2 * eq2 + c3 * eq3;
-}
-
-static inline float hermite(float h00, float h01, float h10, float h11, float from, float out, float to, float in)
-{
-    return h00 * from + h01 * to + h10 * out + h11 * in;
-}
-
-static inline float hermiteFlat(float h00, float h01, float from, float to)
-{
-    return h00 * from + h01 * to;
-}
-
-static inline float hermiteSmooth(float h00, float h01, float h10, float h11, float from, float out, float to, float in)
-{
-    return h00 * from + h01 * to + h10 * out + h11 * in;
-}
-
-static inline float lerpInl(float s, float from, float to)
-{
-    return from + (to - from) * s;
+static inline float bezier(float eq0, float eq1, float eq2, float eq3, float from, float out, float to, float in)
+{
+    return from * eq0 + out * eq1 + in * eq2 + to * eq3;
+}
+
+static inline float bspline(float eq0, float eq1, float eq2, float eq3, float c0, float c1, float c2, float c3)
+{
+    return c0 * eq0 + c1 * eq1 + c2 * eq2 + c3 * eq3;
+}
+
+static inline float hermite(float h00, float h01, float h10, float h11, float from, float out, float to, float in)
+{
+    return h00 * from + h01 * to + h10 * out + h11 * in;
+}
+
+static inline float hermiteFlat(float h00, float h01, float from, float to)
+{
+    return h00 * from + h01 * to;
+}
+
+static inline float hermiteSmooth(float h00, float h01, float h10, float h11, float from, float out, float to, float in)
+{
+    return h00 * from + h01 * to + h10 * out + h11 * in;
+}
+
+static inline float lerpInl(float s, float from, float to)
+{
+    return from + (to - from) * s;
 }
 
 namespace gameplay

+ 809 - 0
gameplay/src/PlatformLinux.cpp

@@ -0,0 +1,809 @@
+#ifdef __linux__
+
+#include "Base.h"
+#include "Platform.h"
+#include "FileSystem.h"
+#include "Game.h"
+#include "Form.h"
+#include "ScriptController.h"
+
+#include <X11/X.h>
+#include <X11/Xlib.h>
+#include <X11/keysym.h>
+#include <sys/time.h>
+#include <GL/glxew.h>
+
+#define TOUCH_COUNT_MAX     4
+
+using namespace std;
+
+struct timespec __timespec;
+static double __timeStart;
+static double __timeAbsolute;
+static bool __vsync = WINDOW_VSYNC;
+static float __pitch;
+static float __roll;
+static bool __cursorVisible = true;
+static Display* __display;
+static Window   __window;
+static int __windowSize[2];
+static GLXContext __context;
+static Window __attachToWindow;
+
+namespace gameplay
+{
+
+// Gets the Keyboard::Key enumeration constant that corresponds to the given X11 key symbol.
+static Keyboard::Key getKey(KeySym sym)
+{
+    switch (sym)
+    {
+    case XK_Sys_Req:
+        return Keyboard::KEY_SYSREQ;
+    case XK_Break:
+        return Keyboard::KEY_BREAK;
+    case XK_Menu :
+        return Keyboard::KEY_MENU;
+    case XK_KP_Enter:
+        return Keyboard::KEY_KP_ENTER;
+    case XK_Pause:
+        return Keyboard::KEY_PAUSE;
+    case XK_Scroll_Lock:
+        return Keyboard::KEY_SCROLL_LOCK;
+    case XK_Print:
+        return Keyboard::KEY_PRINT;
+    case XK_Escape:
+        return Keyboard::KEY_ESCAPE;
+    case XK_BackSpace:
+        return Keyboard::KEY_BACKSPACE;
+    case XK_Tab:
+        return Keyboard::KEY_TAB;
+    case XK_Return:
+        return Keyboard::KEY_RETURN;
+    case XK_Caps_Lock:
+        return Keyboard::KEY_CAPS_LOCK;
+    case XK_Shift_L:
+    case XK_Shift_R:
+        return Keyboard::KEY_SHIFT;
+    case XK_Control_L:
+    case XK_Control_R:
+        return Keyboard::KEY_CTRL;
+    case XK_Alt_L:
+    case XK_Alt_R:
+        return Keyboard::KEY_ALT;
+    case XK_Hyper_L:
+    case XK_Hyper_R:
+        return Keyboard::KEY_HYPER;
+    case XK_Insert:
+        return Keyboard::KEY_INSERT;
+    case XK_Home:
+        return Keyboard::KEY_HOME;
+    case XK_Page_Up:
+        return Keyboard::KEY_PG_UP;
+    case XK_Delete:
+        return Keyboard::KEY_DELETE;
+    case XK_End:
+        return Keyboard::KEY_END;
+    case XK_Page_Down:
+        return Keyboard::KEY_PG_DOWN;
+    case XK_Left:
+        return Keyboard::KEY_LEFT_ARROW;
+    case XK_Right:
+        return Keyboard::KEY_RIGHT_ARROW;
+    case XK_Up:
+        return Keyboard::KEY_UP_ARROW;
+    case XK_Down:
+        return Keyboard::KEY_DOWN_ARROW;
+    case XK_Num_Lock:
+        return Keyboard::KEY_NUM_LOCK;
+    case XK_KP_Add:
+        return Keyboard::KEY_KP_PLUS;
+    case XK_KP_Subtract:
+        return Keyboard::KEY_KP_MINUS;
+    case XK_KP_Multiply:
+        return Keyboard::KEY_KP_MULTIPLY;
+    case XK_KP_Divide:
+        return Keyboard::KEY_KP_DIVIDE;
+    case XK_KP_Home:
+        return Keyboard::KEY_KP_HOME;
+    case XK_KP_Up:
+        return Keyboard::KEY_KP_UP;
+    case XK_KP_Page_Up:
+        return Keyboard::KEY_KP_PG_UP;
+    case XK_KP_Left:
+        return Keyboard::KEY_KP_LEFT;
+    case XK_KP_5:
+        return Keyboard::KEY_KP_FIVE;
+    case XK_KP_Right:
+        return Keyboard::KEY_KP_RIGHT;
+    case XK_KP_End:
+        return Keyboard::KEY_KP_END;
+    case XK_KP_Down:
+        return Keyboard::KEY_KP_DOWN;
+    case XK_KP_Page_Down:
+        return Keyboard::KEY_KP_PG_DOWN;
+    case XK_KP_Insert:
+        return Keyboard::KEY_KP_INSERT;
+    case XK_KP_Delete:
+        return Keyboard::KEY_KP_DELETE;
+    case XK_F1:
+        return Keyboard::KEY_F1;
+    case XK_F2:
+        return Keyboard::KEY_F2;
+    case XK_F3:
+        return Keyboard::KEY_F3;
+    case XK_F4:
+        return Keyboard::KEY_F4;
+    case XK_F5:
+        return Keyboard::KEY_F5;
+    case XK_F6:
+        return Keyboard::KEY_F6;
+    case XK_F7:
+        return Keyboard::KEY_F7;
+    case XK_F8:
+        return Keyboard::KEY_F8;
+    case XK_F9:
+        return Keyboard::KEY_F9;
+    case XK_F10:
+        return Keyboard::KEY_F10;
+    case XK_F11:
+        return Keyboard::KEY_F11;
+    case XK_F12:
+        return Keyboard::KEY_F12;
+    case XK_KP_Space:
+        return Keyboard::KEY_SPACE;
+    case XK_parenright:
+        return Keyboard::KEY_RIGHT_PARENTHESIS;
+    case XK_0:
+        return Keyboard::KEY_ZERO;
+    case XK_exclam:
+        return Keyboard::KEY_EXCLAM;
+    case XK_1:
+        return Keyboard::KEY_ONE;
+    case XK_at:
+        return Keyboard::KEY_AT;
+    case XK_2:
+        return Keyboard::KEY_TWO;
+    case XK_numbersign:
+        return Keyboard::KEY_NUMBER;
+    case XK_3:
+        return Keyboard::KEY_THREE;
+    case XK_dollar:
+        return Keyboard::KEY_DOLLAR;
+    case XK_4:
+        return Keyboard::KEY_FOUR;
+    case XK_percent:
+    case XK_asciicircum :
+        return Keyboard::KEY_CIRCUMFLEX;
+        return Keyboard::KEY_PERCENT;
+    case XK_5:
+        return Keyboard::KEY_FIVE;
+    case XK_6:
+        return Keyboard::KEY_SIX;
+    case XK_ampersand:
+        return Keyboard::KEY_AMPERSAND;
+    case XK_7:
+        return Keyboard::KEY_SEVEN;
+    case XK_asterisk:
+        return Keyboard::KEY_ASTERISK;
+    case XK_8:
+        return Keyboard::KEY_EIGHT;
+    case XK_parenleft:
+        return Keyboard::KEY_LEFT_PARENTHESIS;
+    case XK_9:
+        return Keyboard::KEY_NINE;
+    case XK_equal:
+        return Keyboard::KEY_EQUAL;
+    case XK_plus:
+        return Keyboard::KEY_PLUS;
+    case XK_less:
+        return Keyboard::KEY_LESS_THAN;
+    case XK_comma:
+        return Keyboard::KEY_COMMA;
+    case XK_underscore:
+        return Keyboard::KEY_UNDERSCORE;
+    case XK_minus:
+        return Keyboard::KEY_MINUS;
+    case XK_greater:
+        return Keyboard::KEY_GREATER_THAN;
+    case XK_period:
+        return Keyboard::KEY_PERIOD;
+    case XK_colon:
+        return Keyboard::KEY_COLON;
+    case XK_semicolon:
+        return Keyboard::KEY_SEMICOLON;
+    case XK_question:
+        return Keyboard::KEY_QUESTION;
+    case XK_slash:
+        return Keyboard::KEY_SLASH;
+    case XK_grave:
+        return Keyboard::KEY_GRAVE;
+    case XK_asciitilde:
+        return Keyboard::KEY_TILDE;
+    case XK_braceleft:
+        return Keyboard::KEY_LEFT_BRACE;
+    case XK_bracketleft:
+        return Keyboard::KEY_LEFT_BRACKET;
+    case XK_bar:
+        return Keyboard::KEY_BAR;
+    case XK_backslash:
+        return Keyboard::KEY_BACK_SLASH;
+    case XK_braceright:
+        return Keyboard::KEY_RIGHT_BRACE;
+    case XK_bracketright:
+        return Keyboard::KEY_RIGHT_BRACKET;
+    case XK_quotedbl:
+        return Keyboard::KEY_QUOTE;
+    case XK_apostrophe:
+        return Keyboard::KEY_APOSTROPHE;
+    case XK_EuroSign:
+        return Keyboard::KEY_EURO;
+    case XK_sterling:
+        return Keyboard::KEY_POUND;
+    case XK_yen:
+        return Keyboard::KEY_YEN;
+    case XK_periodcentered:
+        return Keyboard::KEY_MIDDLE_DOT;
+    case XK_A:
+        return Keyboard::KEY_CAPITAL_A;
+    case XK_a:
+        return Keyboard::KEY_A;
+    case XK_B:
+        return Keyboard::KEY_CAPITAL_B;
+    case XK_b:
+        return Keyboard::KEY_B;
+    case XK_C:
+        return Keyboard::KEY_CAPITAL_C;
+    case XK_c:
+        return Keyboard::KEY_C;
+    case XK_D:
+        return Keyboard::KEY_CAPITAL_D;
+    case XK_d:
+        return Keyboard::KEY_D;
+    case XK_E:
+        return Keyboard::KEY_CAPITAL_E;
+    case XK_e:
+        return Keyboard::KEY_E;
+    case XK_F:
+        return Keyboard::KEY_CAPITAL_F;
+    case XK_f:
+        return Keyboard::KEY_F;
+    case XK_G:
+        return Keyboard::KEY_CAPITAL_G;
+    case XK_g:
+        return Keyboard::KEY_G;
+    case XK_H:
+        return Keyboard::KEY_CAPITAL_H;
+    case XK_h:
+        return Keyboard::KEY_H;
+    case XK_I:
+        return Keyboard::KEY_CAPITAL_I;
+    case XK_i:
+        return Keyboard::KEY_I;
+    case XK_J:
+        return Keyboard::KEY_CAPITAL_J;
+    case XK_j:
+        return Keyboard::KEY_J;
+    case XK_K:
+        return Keyboard::KEY_CAPITAL_K;
+    case XK_k:
+        return Keyboard::KEY_K;
+    case XK_L:
+        return Keyboard::KEY_CAPITAL_L;
+    case XK_l:
+        return Keyboard::KEY_L;
+    case XK_M:
+        return Keyboard::KEY_CAPITAL_M;
+    case XK_m:
+        return Keyboard::KEY_M;
+    case XK_N:
+        return Keyboard::KEY_CAPITAL_N;
+    case XK_n:
+        return Keyboard::KEY_N;
+    case XK_O:
+        return Keyboard::KEY_CAPITAL_O;
+    case XK_o:
+        return Keyboard::KEY_O;
+    case XK_P:
+        return Keyboard::KEY_CAPITAL_P;
+    case XK_p:
+        return Keyboard::KEY_P;
+    case XK_Q:
+        return Keyboard::KEY_CAPITAL_Q;
+    case XK_q:
+        return Keyboard::KEY_Q;
+    case XK_R:
+        return Keyboard::KEY_CAPITAL_R;
+    case XK_r:
+        return Keyboard::KEY_R;
+    case XK_S:
+        return Keyboard::KEY_CAPITAL_S;
+    case XK_s:
+        return Keyboard::KEY_S;
+    case XK_T:
+        return Keyboard::KEY_CAPITAL_T;
+    case XK_t:
+        return Keyboard::KEY_T;
+    case XK_U:
+        return Keyboard::KEY_CAPITAL_U;
+    case XK_u:
+        return Keyboard::KEY_U;
+    case XK_V:
+        return Keyboard::KEY_CAPITAL_V;
+    case XK_v:
+        return Keyboard::KEY_V;
+    case XK_W:
+        return Keyboard::KEY_CAPITAL_W;
+    case XK_w:
+        return Keyboard::KEY_W;
+    case XK_X:
+        return Keyboard::KEY_CAPITAL_X;
+    case XK_x:
+        return Keyboard::KEY_X;
+    case XK_Y:
+        return Keyboard::KEY_CAPITAL_Y;
+    case XK_y:
+        return Keyboard::KEY_Y;
+    case XK_Z:
+        return Keyboard::KEY_CAPITAL_Z;
+    case XK_z:
+        return Keyboard::KEY_Z;
+    default:
+        return Keyboard::KEY_NONE;
+    }
+}
+
+extern void printError(const char* format, ...)
+{
+    GP_ASSERT(format);
+    va_list argptr;
+    va_start(argptr, format);
+    vfprintf(stderr, format, argptr);
+    va_end(argptr);
+}
+
+Platform::Platform(Game* game) : _game(game)
+{
+}
+
+Platform::~Platform()
+{
+}
+
+Platform* Platform::create(Game* game, void* attachToWindow)
+{
+
+    GP_ASSERT(game);
+    
+    __attachToWindow = (Window)attachToWindow;
+    FileSystem::setResourcePath("./");
+    Platform* platform = new Platform(game);
+
+    int configAttribs[] = 
+    { 
+        GLX_RENDER_TYPE,    GLX_RGBA_BIT,GLX_RGBA, 
+        GLX_DRAWABLE_TYPE,  GLX_WINDOW_BIT,
+        GLX_X_RENDERABLE,   True,
+        GLX_DEPTH_SIZE,     24, 
+        GLX_STENCIL_SIZE,   8,
+        GLX_RED_SIZE,       8,
+        GLX_BLUE_SIZE,      8,
+        GLX_GREEN_SIZE,     8,
+        GLX_DOUBLEBUFFER,   True,
+        0 
+    };
+
+    // Get the display and initialize.
+    __display = XOpenDisplay(NULL);
+    if (__display == NULL)
+    {
+        perror("XOpenDisplay");
+        return NULL;
+    }
+
+    // GLX version
+    GLint majorGLX, minorGLX = 0;
+    glXQueryVersion(__display, &majorGLX, &minorGLX);
+    if(majorGLX == 1 && minorGLX < 2)
+    {
+        perror("GLX 1.2 or greater is required.");
+        XCloseDisplay(__display);
+        return NULL;
+    }
+    else
+    {
+        printf( "GLX version: %d.%d\n", majorGLX , minorGLX);
+    }
+    
+    // Get the GLX Functions
+    glXCreateContextAttribsARB = (GLXContext(*)(Display* dpy, GLXFBConfig config, GLXContext share_context, Bool direct,  const int *attrib_list))glXGetProcAddressARB((GLubyte*)"glXCreateContextAttribsARB");
+    glXChooseFBConfig = (GLXFBConfig*(*)(Display *dpy, int screen, const int *attrib_list, int *nelements))glXGetProcAddressARB((GLubyte*)"glXChooseFBConfig");
+    glXGetVisualFromFBConfig = (XVisualInfo*(*)(Display *dpy, GLXFBConfig config))glXGetProcAddressARB((GLubyte*)"glXGetVisualFromFBConfig");
+    glXGetFBConfigAttrib = (int(*)(Display *dpy, GLXFBConfig config, int attribute, int *value))glXGetProcAddressARB((GLubyte*)"glXGetFBConfigAttrib");
+
+    // Get the configs
+    GLXFBConfig* configs;
+    int configCount = 0;
+    configs = glXChooseFBConfig(__display, DefaultScreen(__display), configAttribs, &configCount);
+    
+    // Create the windows
+    XVisualInfo* visualInfo;
+    visualInfo = glXGetVisualFromFBConfig(__display, configs[0]);
+    
+    XSetWindowAttributes winAttribs;
+    long eventMask;
+    eventMask = ExposureMask | VisibilityChangeMask | StructureNotifyMask |
+                KeyPressMask | KeyReleaseMask | PointerMotionMask | 
+                ButtonPressMask | ButtonReleaseMask | 
+                EnterWindowMask | LeaveWindowMask;
+    winAttribs.event_mask = eventMask;
+    winAttribs.border_pixel = 0;
+    winAttribs.bit_gravity = StaticGravity;
+    winAttribs.colormap = XCreateColormap(__display, RootWindow(__display, visualInfo->screen), visualInfo->visual, AllocNone);
+
+    GLint winMask;
+    winMask = CWBorderPixel | CWBitGravity | CWEventMask| CWColormap;
+   
+    __window = XCreateWindow(__display, DefaultRootWindow(__display), 0, 0, 1280, 720, 0, 
+                            visualInfo->depth, InputOutput, visualInfo->visual, winMask,
+                            &winAttribs); 
+   
+    XMapWindow(__display, __window);
+    XStoreName(__display, __window, "");
+
+    __context = glXCreateContext(__display, visualInfo, NULL, True);
+    glXMakeCurrent(__display, __window, __context);
+
+    // Use OpenGL 2.x with GLEW  (TODO: Currently crashing here...)
+    glewExperimental = GL_TRUE;
+    GLenum glewStatus = glewInit();
+    if(glewStatus != GLEW_OK)
+    {
+        perror("glewInit");
+        return NULL;
+    }
+
+    // GL Version
+    int versionGL[2] = {-1, -1};
+    glGetIntegerv(GL_MAJOR_VERSION, versionGL);
+    glGetIntegerv(GL_MINOR_VERSION, versionGL + 1);
+    printf("GL version: %d.%d\n", versionGL[0], versionGL[1]);
+
+    // TODO: Get this workings
+    //if (GLXEW_EXT_swap_control)
+    //    glXSwapIntervalEXT(__display, glXGetCurrentDrawable(), __vsync ? 1 : 0);
+ 
+    return platform;
+}
+
+void cleanupX11()
+{
+    if (__display)
+    {
+        glXMakeCurrent(__display, None, NULL);
+
+        if (__context)
+     	    glXDestroyContext(__display, __context);
+        if (__window)
+     	    XDestroyWindow(__display, __window);
+
+     	XCloseDisplay(__display);
+    }
+}
+
+double timespec2millis(struct timespec *a)
+{
+    GP_ASSERT(a);
+    return (1000.0 * a->tv_sec) + (0.000001 * a->tv_nsec);
+}
+
+int Platform::enterMessagePump()
+{
+    GP_ASSERT(_game);
+ 
+    static const float ACCELEROMETER_X_FACTOR = 90.0f / __windowSize[0];
+    static const float ACCELEROMETER_Y_FACTOR = 90.0f / __windowSize[1];
+    static int lx = 0;
+    static int ly = 0;
+    static bool suspended = false;
+    static bool shiftDown = false;
+    static bool capsOn = false;
+    static XEvent evt;
+
+    // Get the initial time.
+    clock_gettime(CLOCK_REALTIME, &__timespec);
+    __timeStart = timespec2millis(&__timespec);
+    __timeAbsolute = 0L;
+
+    // Run the game.
+    _game->run();
+  
+    // Message loop.
+    while (true)
+    {
+       XNextEvent(__display, &evt);
+    
+        switch (evt.type) 
+        {
+        case DestroyNotify :
+            {
+                cleanupX11();
+                exit(0);
+            }
+            break;
+
+        case Expose: 
+            {
+                XWindowAttributes windowAttrs;
+                XGetWindowAttributes(__display, __window, &windowAttrs);  
+                __windowSize[0] = windowAttrs.width;
+                __windowSize[1] = windowAttrs.height;
+                if (!suspended)
+                {
+                    _game->frame();
+                    glXSwapBuffers(__display, __window);
+                }
+            }
+            break;
+
+        case KeyPress:
+            {
+                KeySym sym = XLookupKeysym(&evt.xkey, 0);
+                Keyboard::Key key = getKey(sym);
+                gameplay::Platform::keyEventInternal(gameplay::Keyboard::KEY_PRESS, key);
+            }
+            break;
+
+        case KeyRelease:
+            {
+                KeySym sym = XLookupKeysym(&evt.xkey, 0);
+                Keyboard::Key key = getKey(sym);
+                gameplay::Platform::keyEventInternal(gameplay::Keyboard::KEY_PRESS, key);
+            }
+            break;
+
+        case ButtonPress:
+            {
+                gameplay::Mouse::MouseEvent mouseEvt;
+                switch(evt.xbutton.button)
+                {
+                    case 1:
+                        mouseEvt = gameplay::Mouse::MOUSE_PRESS_LEFT_BUTTON;
+                        break;
+                    case 2:
+                        mouseEvt = gameplay::Mouse::MOUSE_PRESS_MIDDLE_BUTTON;
+                        break;
+                    case 3:
+                        mouseEvt = gameplay::Mouse::MOUSE_PRESS_RIGHT_BUTTON;
+                        break;
+                    case 4:
+                    case 5:
+                        gameplay::Platform::mouseEventInternal(gameplay::Mouse::MOUSE_WHEEL, 
+                                                               evt.xbutton.x, evt.xbutton.y, 
+                                                               evt.xbutton.button == Button4 ? 1 : -1);
+                        break;
+                    default:
+                        break;
+                }
+                if (!gameplay::Platform::mouseEventInternal(mouseEvt, evt.xbutton.x, evt.xbutton.y, 0))
+                {
+                    gameplay::Platform::touchEventInternal(gameplay::Touch::TOUCH_PRESS, evt.xbutton.x, evt.xbutton.y, 0);
+                }
+            }
+            break;
+
+        case ButtonRelease:
+            {
+                gameplay::Mouse::MouseEvent mouseEvt;
+                switch(evt.xbutton.button)
+                {
+                    case 1:
+                        mouseEvt = gameplay::Mouse::MOUSE_RELEASE_LEFT_BUTTON;
+                        break;
+                    case 2:
+                        mouseEvt = gameplay::Mouse::MOUSE_RELEASE_MIDDLE_BUTTON;
+                        break;
+                    case 3:
+                        mouseEvt = gameplay::Mouse::MOUSE_RELEASE_RIGHT_BUTTON;
+                        break;
+                    default:
+                        break;
+                }
+                if (!gameplay::Platform::mouseEventInternal(mouseEvt, evt.xbutton.x, evt.xbutton.y, 0))
+                {
+                    gameplay::Platform::touchEventInternal(gameplay::Touch::TOUCH_RELEASE, evt.xbutton.x, evt.xbutton.y, 0);
+                }
+            }
+            break;
+    
+        case MotionNotify:
+            {
+                if (!gameplay::Platform::mouseEventInternal(gameplay::Mouse::MOUSE_MOVE, evt.xmotion.x, evt.xmotion.y, 0))
+                {
+                    if (evt.xbutton.button == 1)
+                    {
+                        gameplay::Platform::touchEventInternal(gameplay::Touch::TOUCH_MOVE, evt.xmotion.x, evt.xmotion.y, 0);
+                        return 0;
+                    }
+                    else if (evt.xbutton.button == 3)
+                    {
+                        // Update the pitch and roll by adding the scaled deltas.
+                        __roll += (float)(evt.xbutton.x - lx) * ACCELEROMETER_X_FACTOR;
+                        __pitch += -(float)(evt.xbutton.y - ly) * ACCELEROMETER_Y_FACTOR;
+
+                        // Clamp the values to the valid range.
+                        __roll = max(min(__roll, 90.0f), -90.0f);
+                        __pitch = max(min(__pitch, 90.0f), -90.0f);
+
+                        // Update the last X/Y values.
+                        lx = evt.xbutton.x;
+                        ly = evt.xbutton.y;
+                    }
+                }
+            }
+            break;
+        
+        default:
+            break;
+        }
+
+        sleep(1);
+    }
+
+    cleanupX11();
+
+    return 0;
+}
+    
+void Platform::signalShutdown() 
+{ 
+    // nothing to do  
+}
+    
+unsigned int Platform::getDisplayWidth()
+{
+    return __windowSize[0];
+}
+
+unsigned int Platform::getDisplayHeight()
+{
+    return __windowSize[1];
+}
+
+double Platform::getAbsoluteTime()
+{
+
+    clock_gettime(CLOCK_REALTIME, &__timespec);
+    double now = timespec2millis(&__timespec);
+    __timeAbsolute = now - __timeStart;
+
+    return __timeAbsolute;
+}
+
+void Platform::setAbsoluteTime(double time)
+{
+    __timeAbsolute = time;
+}
+
+bool Platform::isVsync()
+{
+    return __vsync;
+}
+
+void Platform::setVsync(bool enable)
+{
+    // TODO: Get this working
+    //if (GLXEW_EXT_swap_control)
+    //    glXSwapIntervalEXT(__display, glXGetCurrentDrawable(), __vsync ? 1 : 0);
+    __vsync = enable;
+}
+
+void Platform::setMultiTouch(bool enabled)
+{
+    // not supported
+}
+
+bool Platform::isMultiTouch()
+{
+    false;
+}
+
+void Platform::getAccelerometerValues(float* pitch, float* roll)
+{
+    GP_ASSERT(pitch);
+    GP_ASSERT(roll);
+
+    *pitch = __pitch;
+    *roll = __roll;
+}
+
+bool Platform::hasMouse()
+{
+    return true;
+}
+
+void Platform::setMouseCaptured(bool captured)
+{
+    // TODO
+}
+
+bool Platform::isMouseCaptured()
+{
+    // TODO
+    return false;
+}
+
+void Platform::setCursorVisible(bool visible)
+{
+    if (visible != __cursorVisible)
+    {
+        if (visible)
+        {
+            XDefineCursor(__display, __window, None);
+        }
+        else
+        {
+            XUndefineCursor(__display, __window);
+        }
+        XFlush(__display);
+        __cursorVisible = visible;
+    }
+}
+
+bool Platform::isCursorVisible()
+{
+    return __cursorVisible;
+}
+
+void Platform::swapBuffers()
+{
+    glXSwapBuffers(__display, __window);
+}
+
+void Platform::displayKeyboard(bool display)
+{
+    // not supported
+}
+
+void Platform::touchEventInternal(Touch::TouchEvent evt, int x, int y, unsigned int contactIndex)
+{
+    if (!Form::touchEventInternal(evt, x, y, contactIndex))
+    {
+        Game::getInstance()->touchEvent(evt, x, y, contactIndex);
+        Game::getInstance()->getScriptController()->touchEvent(evt, x, y, contactIndex);
+    }
+}
+
+void Platform::keyEventInternal(Keyboard::KeyEvent evt, int key)
+{
+    if (!Form::keyEventInternal(evt, key))
+    {
+        Game::getInstance()->keyEvent(evt, key);
+        Game::getInstance()->getScriptController()->keyEvent(evt, key);
+    }
+}
+
+bool Platform::mouseEventInternal(Mouse::MouseEvent evt, int x, int y, int wheelDelta)
+{
+    if (Form::mouseEventInternal(evt, x, y, wheelDelta))
+    {
+        return true;
+    }
+    else if (Game::getInstance()->mouseEvent(evt, x, y, wheelDelta))
+    {
+        return true;
+    }
+    else
+    {
+        return Game::getInstance()->getScriptController()->mouseEvent(evt, x, y, wheelDelta);
+    }
+}
+
+void Platform::sleep(long ms)
+{
+    usleep(ms * 1000);
+}
+
+}
+
+#endif

+ 20 - 0
gameplay/src/gameplay-main-linux.cpp

@@ -0,0 +1,20 @@
+#ifdef __linux__
+
+#include "gameplay.h"
+
+using namespace gameplay;
+
+/**
+ * Main entry point.
+ */
+int main(int argc, char** argv)
+{
+    Game* game = Game::getInstance();
+    Platform* platform = Platform::create(game);
+    GP_ASSERT(platform);
+    int result = platform->enterMessagePump();
+    delete platform;
+    return result;
+}
+
+#endif