| @@ -152,6 +152,10 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Demos", "Demos", "{E5C5E320 | |||||
| EndProject | EndProject | ||||
| Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Lol.js", "Lol.js", "{F7D4A671-612F-4FF4-883F-2097697694B7}" | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Lol.js", "Lol.js", "{F7D4A671-612F-4FF4-883F-2097697694B7}" | ||||
| EndProject | EndProject | ||||
| Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "07_input", "..\..\demos\tutorial\07_input.vcxproj", "{572E5B9C-7E19-489C-BD8A-E8401CFBBC47}" | |||||
| EndProject | |||||
| Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "06_sprite", "..\..\demos\tutorial\06_sprite.vcxproj", "{E05E23A5-67DE-42B5-98A3-E63CCE0CC0AF}" | |||||
| EndProject | |||||
| Global | Global | ||||
| GlobalSection(SolutionConfigurationPlatforms) = preSolution | GlobalSection(SolutionConfigurationPlatforms) = preSolution | ||||
| Debug|Any CPU = Debug|Any CPU | Debug|Any CPU = Debug|Any CPU | ||||
| @@ -941,6 +945,46 @@ Global | |||||
| {AA376B9B-484B-4DC4-982F-6CFA645E441E}.Release|Xbox 360.ActiveCfg = Release|Xbox 360 | {AA376B9B-484B-4DC4-982F-6CFA645E441E}.Release|Xbox 360.ActiveCfg = Release|Xbox 360 | ||||
| {AA376B9B-484B-4DC4-982F-6CFA645E441E}.Release|Xbox 360.Build.0 = Release|Xbox 360 | {AA376B9B-484B-4DC4-982F-6CFA645E441E}.Release|Xbox 360.Build.0 = Release|Xbox 360 | ||||
| {AA376B9B-484B-4DC4-982F-6CFA645E441E}.Release|Xbox 360.Deploy.0 = Release|Xbox 360 | {AA376B9B-484B-4DC4-982F-6CFA645E441E}.Release|Xbox 360.Deploy.0 = Release|Xbox 360 | ||||
| {572E5B9C-7E19-489C-BD8A-E8401CFBBC47}.Debug|Any CPU.ActiveCfg = Debug|x64 | |||||
| {572E5B9C-7E19-489C-BD8A-E8401CFBBC47}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 | |||||
| {572E5B9C-7E19-489C-BD8A-E8401CFBBC47}.Debug|Mixed Platforms.Build.0 = Debug|Win32 | |||||
| {572E5B9C-7E19-489C-BD8A-E8401CFBBC47}.Debug|ORBIS.ActiveCfg = Debug|x64 | |||||
| {572E5B9C-7E19-489C-BD8A-E8401CFBBC47}.Debug|PS3.ActiveCfg = Debug|x64 | |||||
| {572E5B9C-7E19-489C-BD8A-E8401CFBBC47}.Debug|Win32.ActiveCfg = Debug|Win32 | |||||
| {572E5B9C-7E19-489C-BD8A-E8401CFBBC47}.Debug|Win32.Build.0 = Debug|Win32 | |||||
| {572E5B9C-7E19-489C-BD8A-E8401CFBBC47}.Debug|x64.ActiveCfg = Debug|x64 | |||||
| {572E5B9C-7E19-489C-BD8A-E8401CFBBC47}.Debug|x64.Build.0 = Debug|x64 | |||||
| {572E5B9C-7E19-489C-BD8A-E8401CFBBC47}.Debug|Xbox 360.ActiveCfg = Debug|x64 | |||||
| {572E5B9C-7E19-489C-BD8A-E8401CFBBC47}.Release|Any CPU.ActiveCfg = Release|x64 | |||||
| {572E5B9C-7E19-489C-BD8A-E8401CFBBC47}.Release|Mixed Platforms.ActiveCfg = Release|Win32 | |||||
| {572E5B9C-7E19-489C-BD8A-E8401CFBBC47}.Release|Mixed Platforms.Build.0 = Release|Win32 | |||||
| {572E5B9C-7E19-489C-BD8A-E8401CFBBC47}.Release|ORBIS.ActiveCfg = Release|x64 | |||||
| {572E5B9C-7E19-489C-BD8A-E8401CFBBC47}.Release|PS3.ActiveCfg = Release|x64 | |||||
| {572E5B9C-7E19-489C-BD8A-E8401CFBBC47}.Release|Win32.ActiveCfg = Release|Win32 | |||||
| {572E5B9C-7E19-489C-BD8A-E8401CFBBC47}.Release|Win32.Build.0 = Release|Win32 | |||||
| {572E5B9C-7E19-489C-BD8A-E8401CFBBC47}.Release|x64.ActiveCfg = Release|x64 | |||||
| {572E5B9C-7E19-489C-BD8A-E8401CFBBC47}.Release|x64.Build.0 = Release|x64 | |||||
| {572E5B9C-7E19-489C-BD8A-E8401CFBBC47}.Release|Xbox 360.ActiveCfg = Release|x64 | |||||
| {E05E23A5-67DE-42B5-98A3-E63CCE0CC0AF}.Debug|Any CPU.ActiveCfg = Debug|x64 | |||||
| {E05E23A5-67DE-42B5-98A3-E63CCE0CC0AF}.Debug|Mixed Platforms.ActiveCfg = Debug|x64 | |||||
| {E05E23A5-67DE-42B5-98A3-E63CCE0CC0AF}.Debug|Mixed Platforms.Build.0 = Debug|x64 | |||||
| {E05E23A5-67DE-42B5-98A3-E63CCE0CC0AF}.Debug|ORBIS.ActiveCfg = Debug|x64 | |||||
| {E05E23A5-67DE-42B5-98A3-E63CCE0CC0AF}.Debug|PS3.ActiveCfg = Debug|x64 | |||||
| {E05E23A5-67DE-42B5-98A3-E63CCE0CC0AF}.Debug|Win32.ActiveCfg = Debug|Win32 | |||||
| {E05E23A5-67DE-42B5-98A3-E63CCE0CC0AF}.Debug|Win32.Build.0 = Debug|Win32 | |||||
| {E05E23A5-67DE-42B5-98A3-E63CCE0CC0AF}.Debug|x64.ActiveCfg = Debug|x64 | |||||
| {E05E23A5-67DE-42B5-98A3-E63CCE0CC0AF}.Debug|x64.Build.0 = Debug|x64 | |||||
| {E05E23A5-67DE-42B5-98A3-E63CCE0CC0AF}.Debug|Xbox 360.ActiveCfg = Debug|x64 | |||||
| {E05E23A5-67DE-42B5-98A3-E63CCE0CC0AF}.Release|Any CPU.ActiveCfg = Release|x64 | |||||
| {E05E23A5-67DE-42B5-98A3-E63CCE0CC0AF}.Release|Mixed Platforms.ActiveCfg = Release|x64 | |||||
| {E05E23A5-67DE-42B5-98A3-E63CCE0CC0AF}.Release|Mixed Platforms.Build.0 = Release|x64 | |||||
| {E05E23A5-67DE-42B5-98A3-E63CCE0CC0AF}.Release|ORBIS.ActiveCfg = Release|x64 | |||||
| {E05E23A5-67DE-42B5-98A3-E63CCE0CC0AF}.Release|PS3.ActiveCfg = Release|x64 | |||||
| {E05E23A5-67DE-42B5-98A3-E63CCE0CC0AF}.Release|Win32.ActiveCfg = Release|Win32 | |||||
| {E05E23A5-67DE-42B5-98A3-E63CCE0CC0AF}.Release|Win32.Build.0 = Release|Win32 | |||||
| {E05E23A5-67DE-42B5-98A3-E63CCE0CC0AF}.Release|x64.ActiveCfg = Release|x64 | |||||
| {E05E23A5-67DE-42B5-98A3-E63CCE0CC0AF}.Release|x64.Build.0 = Release|x64 | |||||
| {E05E23A5-67DE-42B5-98A3-E63CCE0CC0AF}.Release|Xbox 360.ActiveCfg = Release|x64 | |||||
| EndGlobalSection | EndGlobalSection | ||||
| GlobalSection(SolutionProperties) = preSolution | GlobalSection(SolutionProperties) = preSolution | ||||
| HideSolutionNode = FALSE | HideSolutionNode = FALSE | ||||
| @@ -965,7 +1009,8 @@ Global | |||||
| {80F81C11-8DA2-4990-91CB-9807783BA46E} = {E0491194-35E3-4513-9D31-608EA3165ECF} | {80F81C11-8DA2-4990-91CB-9807783BA46E} = {E0491194-35E3-4513-9D31-608EA3165ECF} | ||||
| {EE203B88-44CF-4859-9D42-7A1F43FECB52} = {E0491194-35E3-4513-9D31-608EA3165ECF} | {EE203B88-44CF-4859-9D42-7A1F43FECB52} = {E0491194-35E3-4513-9D31-608EA3165ECF} | ||||
| {7CE9FE12-E4AB-4A22-90D4-2C15F0C30D4E} = {E0491194-35E3-4513-9D31-608EA3165ECF} | {7CE9FE12-E4AB-4A22-90D4-2C15F0C30D4E} = {E0491194-35E3-4513-9D31-608EA3165ECF} | ||||
| {B92ABADC-45BE-4CC5-B724-9426053123A1} = {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04} | |||||
| {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04} = {E5C5E320-C077-4362-9A3F-3920C6447601} | |||||
| {F7D4A671-612F-4FF4-883F-2097697694B7} = {E5C5E320-C077-4362-9A3F-3920C6447601} | |||||
| {7B083DA2-FE08-4F6D-BFDD-195D5C2783EB} = {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04} | {7B083DA2-FE08-4F6D-BFDD-195D5C2783EB} = {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04} | ||||
| {1C5B8702-290C-42DA-AA9E-671348F5B747} = {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04} | {1C5B8702-290C-42DA-AA9E-671348F5B747} = {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04} | ||||
| {6BF81B39-EDC2-4227-9992-C2D8ABEA95AF} = {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04} | {6BF81B39-EDC2-4227-9992-C2D8ABEA95AF} = {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04} | ||||
| @@ -973,6 +1018,9 @@ Global | |||||
| {B0A53D75-CBB4-4FDF-93AC-2D12A79ADA0E} = {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04} | {B0A53D75-CBB4-4FDF-93AC-2D12A79ADA0E} = {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04} | ||||
| {834852DB-EDB6-4FD0-BCF9-45CD01126962} = {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04} | {834852DB-EDB6-4FD0-BCF9-45CD01126962} = {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04} | ||||
| {6BF81B39-EDC2-4227-9982-C2D8ABEA95AF} = {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04} | {6BF81B39-EDC2-4227-9982-C2D8ABEA95AF} = {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04} | ||||
| {B92ABADC-45BE-4CC5-B724-9426053123A1} = {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04} | |||||
| {572E5B9C-7E19-489C-BD8A-E8401CFBBC47} = {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04} | |||||
| {E05E23A5-67DE-42B5-98A3-E63CCE0CC0AF} = {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04} | |||||
| {32F3F8CF-D22E-45E4-BEB8-AD909E8C5515} = {33704AA4-F2B5-4138-A40D-E3E77F89ED46} | {32F3F8CF-D22E-45E4-BEB8-AD909E8C5515} = {33704AA4-F2B5-4138-A40D-E3E77F89ED46} | ||||
| {EE203B88-44CF-4859-9D42-7A5F40FECB52} = {8C77EAA8-1077-4EF7-AE53-97C6C60A3601} | {EE203B88-44CF-4859-9D42-7A5F40FECB52} = {8C77EAA8-1077-4EF7-AE53-97C6C60A3601} | ||||
| {B357514A-7881-422D-8358-161B689E7620} = {3D341D8A-E400-4B1D-BC05-B5C35487D9B5} | {B357514A-7881-422D-8358-161B689E7620} = {3D341D8A-E400-4B1D-BC05-B5C35487D9B5} | ||||
| @@ -986,8 +1034,6 @@ Global | |||||
| {C2E01551-B636-4324-8461-71811DF6FBB5} = {E27FDF36-50C4-4ED2-8CF5-A20FED016910} | {C2E01551-B636-4324-8461-71811DF6FBB5} = {E27FDF36-50C4-4ED2-8CF5-A20FED016910} | ||||
| {58922993-9830-4A40-B462-0326342F69ED} = {9CC50C06-DF5E-41A7-AD90-04F05386E081} | {58922993-9830-4A40-B462-0326342F69ED} = {9CC50C06-DF5E-41A7-AD90-04F05386E081} | ||||
| {FAF82AD2-D9F4-4694-9A01-103BC5B771B4} = {B583BBFF-BE97-4F4E-BA1E-1F978A31EAB0} | {FAF82AD2-D9F4-4694-9A01-103BC5B771B4} = {B583BBFF-BE97-4F4E-BA1E-1F978A31EAB0} | ||||
| {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04} = {E5C5E320-C077-4362-9A3F-3920C6447601} | |||||
| {F7D4A671-612F-4FF4-883F-2097697694B7} = {E5C5E320-C077-4362-9A3F-3920C6447601} | |||||
| {AA376B9B-484B-4DC4-982F-6CFA645E441E} = {F7D4A671-612F-4FF4-883F-2097697694B7} | {AA376B9B-484B-4DC4-982F-6CFA645E441E} = {F7D4A671-612F-4FF4-883F-2097697694B7} | ||||
| EndGlobalSection | EndGlobalSection | ||||
| EndGlobal | EndGlobal | ||||
| @@ -1,71 +1,71 @@ | |||||
| <?xml version="1.0" encoding="utf-8"?> | |||||
| <Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | |||||
| <ItemGroup Label="ProjectConfigurations"> | |||||
| <ProjectConfiguration Include="Debug|PS3"> | |||||
| <Configuration>Debug</Configuration> | |||||
| <Platform>PS3</Platform> | |||||
| </ProjectConfiguration> | |||||
| <ProjectConfiguration Include="Debug|Win32"> | |||||
| <Configuration>Debug</Configuration> | |||||
| <Platform>Win32</Platform> | |||||
| </ProjectConfiguration> | |||||
| <ProjectConfiguration Include="Debug|x64"> | |||||
| <Configuration>Debug</Configuration> | |||||
| <Platform>x64</Platform> | |||||
| </ProjectConfiguration> | |||||
| <ProjectConfiguration Include="Debug|Xbox 360"> | |||||
| <Configuration>Debug</Configuration> | |||||
| <Platform>Xbox 360</Platform> | |||||
| </ProjectConfiguration> | |||||
| <ProjectConfiguration Include="Release|PS3"> | |||||
| <Configuration>Release</Configuration> | |||||
| <Platform>PS3</Platform> | |||||
| </ProjectConfiguration> | |||||
| <ProjectConfiguration Include="Release|Win32"> | |||||
| <Configuration>Release</Configuration> | |||||
| <Platform>Win32</Platform> | |||||
| </ProjectConfiguration> | |||||
| <ProjectConfiguration Include="Release|x64"> | |||||
| <Configuration>Release</Configuration> | |||||
| <Platform>x64</Platform> | |||||
| </ProjectConfiguration> | |||||
| <ProjectConfiguration Include="Release|Xbox 360"> | |||||
| <Configuration>Release</Configuration> | |||||
| <Platform>Xbox 360</Platform> | |||||
| </ProjectConfiguration> | |||||
| </ItemGroup> | |||||
| <ItemGroup> | |||||
| <ClCompile Include="06_sprite.cpp" /> | |||||
| </ItemGroup> | |||||
| <ItemGroup> | |||||
| <ProjectReference Include="$(SolutionDir)\..\..\src\lolcore.vcxproj"> | |||||
| <Project>{9e62f2fe-3408-4eae-8238-fd84238ceeda}</Project> | |||||
| </ProjectReference> | |||||
| <ProjectReference Include="$(SolutionDir)\..\..\src\bullet\lolbullet.vcxproj"> | |||||
| <Project>{83d3b207-c601-4025-8f41-01dedc354661}</Project> | |||||
| </ProjectReference> | |||||
| <ProjectReference Include="$(SolutionDir)\..\..\src\lua\lollua.vcxproj"> | |||||
| <Project>{d84021ca-b233-4e0f-8a52-071b83bbccc4}</Project> | |||||
| </ProjectReference> | |||||
| </ItemGroup> | |||||
| <PropertyGroup Label="Globals"> | |||||
| <ProjectGuid>{1c5b8702-290c-42da-aa9e-671348f5b747}</ProjectGuid> | |||||
| <ConfigurationType>Application</ConfigurationType> | |||||
| <Keyword>Win32Proj</Keyword> | |||||
| </PropertyGroup> | |||||
| <Import Project="$(SolutionDir)\Lol.Core.Config.props" /> | |||||
| <ImportGroup Label="ExtensionSettings"> | |||||
| <Import Project="$(SolutionDir)\Lol.Fx.props" /> | |||||
| </ImportGroup> | |||||
| <ImportGroup Label="PropertySheets"> | |||||
| <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> | |||||
| <Import Project="$(SolutionDir)\Lol.Core.Vars.props" /> | |||||
| </ImportGroup> | |||||
| <PropertyGroup Label="UserMacros" /> | |||||
| <Import Project="$(SolutionDir)\Lol.Core.Rules.props" /> | |||||
| <ItemDefinitionGroup /> | |||||
| <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> | |||||
| <ImportGroup Label="ExtensionTargets"> | |||||
| <Import Project="$(SolutionDir)\Lol.Fx.targets" /> | |||||
| </ImportGroup> | |||||
| </Project> | |||||
| <?xml version="1.0" encoding="utf-8"?> | |||||
| <Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | |||||
| <ItemGroup Label="ProjectConfigurations"> | |||||
| <ProjectConfiguration Include="Debug|PS3"> | |||||
| <Configuration>Debug</Configuration> | |||||
| <Platform>PS3</Platform> | |||||
| </ProjectConfiguration> | |||||
| <ProjectConfiguration Include="Debug|Win32"> | |||||
| <Configuration>Debug</Configuration> | |||||
| <Platform>Win32</Platform> | |||||
| </ProjectConfiguration> | |||||
| <ProjectConfiguration Include="Debug|x64"> | |||||
| <Configuration>Debug</Configuration> | |||||
| <Platform>x64</Platform> | |||||
| </ProjectConfiguration> | |||||
| <ProjectConfiguration Include="Debug|Xbox 360"> | |||||
| <Configuration>Debug</Configuration> | |||||
| <Platform>Xbox 360</Platform> | |||||
| </ProjectConfiguration> | |||||
| <ProjectConfiguration Include="Release|PS3"> | |||||
| <Configuration>Release</Configuration> | |||||
| <Platform>PS3</Platform> | |||||
| </ProjectConfiguration> | |||||
| <ProjectConfiguration Include="Release|Win32"> | |||||
| <Configuration>Release</Configuration> | |||||
| <Platform>Win32</Platform> | |||||
| </ProjectConfiguration> | |||||
| <ProjectConfiguration Include="Release|x64"> | |||||
| <Configuration>Release</Configuration> | |||||
| <Platform>x64</Platform> | |||||
| </ProjectConfiguration> | |||||
| <ProjectConfiguration Include="Release|Xbox 360"> | |||||
| <Configuration>Release</Configuration> | |||||
| <Platform>Xbox 360</Platform> | |||||
| </ProjectConfiguration> | |||||
| </ItemGroup> | |||||
| <ItemGroup> | |||||
| <ClCompile Include="06_sprite.cpp" /> | |||||
| </ItemGroup> | |||||
| <ItemGroup> | |||||
| <ProjectReference Include="$(SolutionDir)\..\..\src\lolcore.vcxproj"> | |||||
| <Project>{9e62f2fe-3408-4eae-8238-fd84238ceeda}</Project> | |||||
| </ProjectReference> | |||||
| <ProjectReference Include="$(SolutionDir)\..\..\src\bullet\lolbullet.vcxproj"> | |||||
| <Project>{83d3b207-c601-4025-8f41-01dedc354661}</Project> | |||||
| </ProjectReference> | |||||
| <ProjectReference Include="$(SolutionDir)\..\..\src\lua\lollua.vcxproj"> | |||||
| <Project>{d84021ca-b233-4e0f-8a52-071b83bbccc4}</Project> | |||||
| </ProjectReference> | |||||
| </ItemGroup> | |||||
| <PropertyGroup Label="Globals"> | |||||
| <ProjectGuid>{E05E23A5-67DE-42B5-98A3-E63CCE0CC0AF}</ProjectGuid> | |||||
| <ConfigurationType>Application</ConfigurationType> | |||||
| <Keyword>Win32Proj</Keyword> | |||||
| </PropertyGroup> | |||||
| <Import Project="$(SolutionDir)\Lol.Core.Config.props" /> | |||||
| <ImportGroup Label="ExtensionSettings"> | |||||
| <Import Project="$(SolutionDir)\Lol.Fx.props" /> | |||||
| </ImportGroup> | |||||
| <ImportGroup Label="PropertySheets"> | |||||
| <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> | |||||
| <Import Project="$(SolutionDir)\Lol.Core.Vars.props" /> | |||||
| </ImportGroup> | |||||
| <PropertyGroup Label="UserMacros" /> | |||||
| <Import Project="$(SolutionDir)\Lol.Core.Rules.props" /> | |||||
| <ItemDefinitionGroup /> | |||||
| <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> | |||||
| <ImportGroup Label="ExtensionTargets"> | |||||
| <Import Project="$(SolutionDir)\Lol.Fx.targets" /> | |||||
| </ImportGroup> | |||||
| </Project> | |||||
| @@ -0,0 +1,230 @@ | |||||
| // | |||||
| // Lol Engine - Cube tutorial | |||||
| // | |||||
| // Copyright: (c) 2011-2013 Sam Hocevar <sam@hocevar.net> | |||||
| // This program is free software; you can redistribute it and/or | |||||
| // modify it under the terms of the Do What The Fuck You Want To | |||||
| // Public License, Version 2, as published by Sam Hocevar. See | |||||
| // http://www.wtfpl.net/ for more details. | |||||
| // | |||||
| #define LOL_INPUT_V2 | |||||
| #if defined HAVE_CONFIG_H | |||||
| # include "config.h" | |||||
| #endif | |||||
| #include "core.h" | |||||
| #include "loldebug.h" | |||||
| using namespace std; | |||||
| using namespace lol; | |||||
| LOLFX_RESOURCE_DECLARE(07_input); | |||||
| enum | |||||
| { | |||||
| KEY_MANUAL_ROTATION, | |||||
| KEY_DRAG_MESH, | |||||
| KEY_MAX | |||||
| }; | |||||
| enum | |||||
| { | |||||
| AXIS_DRAG_PITCH, | |||||
| AXIS_DRAG_YAW, | |||||
| AXIS_PITCH, | |||||
| AXIS_YAW, | |||||
| AXIS_MAX | |||||
| }; | |||||
| Controller* controller; | |||||
| class Cube : public WorldEntity | |||||
| { | |||||
| public: | |||||
| Cube() | |||||
| { | |||||
| m_pitch_angle = 0; | |||||
| m_yaw_angle = 0; | |||||
| m_autorot = true; | |||||
| /* Front vertices/colors */ | |||||
| m_mesh.Push(vec3(-1.0, -1.0, 1.0), vec3(1.0, 0.0, 1.0)); | |||||
| m_mesh.Push(vec3( 1.0, -1.0, 1.0), vec3(0.0, 1.0, 0.0)); | |||||
| m_mesh.Push(vec3( 1.0, 1.0, 1.0), vec3(1.0, 0.5, 0.0)); | |||||
| m_mesh.Push(vec3(-1.0, 1.0, 1.0), vec3(1.0, 1.0, 0.0)); | |||||
| /* Back */ | |||||
| m_mesh.Push(vec3(-1.0, -1.0, -1.0), vec3(1.0, 0.0, 0.0)); | |||||
| m_mesh.Push(vec3( 1.0, -1.0, -1.0), vec3(0.0, 0.5, 0.0)); | |||||
| m_mesh.Push(vec3( 1.0, 1.0, -1.0), vec3(0.0, 0.5, 1.0)); | |||||
| m_mesh.Push(vec3(-1.0, 1.0, -1.0), vec3(0.0, 0.0, 1.0)); | |||||
| m_faces_indices << 0 << 1 << 2 << 2 << 3 << 0; | |||||
| m_faces_indices << 1 << 5 << 6 << 6 << 2 << 1; | |||||
| m_faces_indices << 7 << 6 << 5 << 5 << 4 << 7; | |||||
| m_faces_indices << 4 << 0 << 3 << 3 << 7 << 4; | |||||
| m_faces_indices << 4 << 5 << 1 << 1 << 0 << 4; | |||||
| m_faces_indices << 3 << 2 << 6 << 6 << 7 << 3; | |||||
| m_lines_indices << 0 << 1 << 1 << 2 << 2 << 3 << 3 << 0; | |||||
| m_lines_indices << 4 << 5 << 5 << 6 << 6 << 7 << 7 << 4; | |||||
| m_lines_indices << 0 << 4 << 1 << 5 << 2 << 6 << 3 << 7; | |||||
| m_text = new Text(NULL, "data/font/ascii.png"); | |||||
| m_text->SetPos(ivec3(5, 5, 1)); | |||||
| Ticker::Ref(m_text); | |||||
| m_ready = false; | |||||
| } | |||||
| ~Cube() | |||||
| { | |||||
| Ticker::Unref(m_text); | |||||
| } | |||||
| virtual void TickGame(float seconds) | |||||
| { | |||||
| WorldEntity::TickGame(seconds); | |||||
| if (controller->GetKey(KEY_MANUAL_ROTATION).IsPressed()) | |||||
| m_autorot = !m_autorot; | |||||
| if (controller->GetKey(KEY_DRAG_MESH).IsDown()) | |||||
| { | |||||
| InputDevice::CaptureMouse(true); | |||||
| m_pitch_angle -= controller->GetAxis(AXIS_DRAG_PITCH).GetValue() * seconds * 100; | |||||
| m_yaw_angle += controller->GetAxis(AXIS_DRAG_YAW).GetValue() * seconds * 100; | |||||
| } | |||||
| else | |||||
| { | |||||
| InputDevice::CaptureMouse(false); | |||||
| if (m_autorot) | |||||
| m_yaw_angle += seconds * 20; | |||||
| } | |||||
| if (lol::abs(controller->GetAxis(AXIS_PITCH).GetValue()) > 0.2f) | |||||
| m_pitch_angle -= controller->GetAxis(AXIS_PITCH).GetValue() * seconds * 100; | |||||
| if (lol::abs(controller->GetAxis(AXIS_YAW).GetValue()) > 1.0f) | |||||
| m_yaw_angle += controller->GetAxis(AXIS_YAW).GetValue() * seconds * 100; | |||||
| InputDevice* mouse = InputDevice::Get("Mouse"); | |||||
| if (mouse) | |||||
| { | |||||
| char buf[128]; | |||||
| std::sprintf(buf, "cursor: (%0.3f, %0.3f) - pixel (%d, %d)", | |||||
| mouse->GetCursor(0).x, mouse->GetCursor(0).y, | |||||
| mouse->GetCursorPixel(0).x, mouse->GetCursorPixel(0).y); | |||||
| m_text->SetText(buf); | |||||
| } | |||||
| else | |||||
| { | |||||
| m_text->SetText("no mouse detected"); | |||||
| } | |||||
| mat4 anim = mat4::rotate(m_yaw_angle, vec3(0, 1, 0)) * mat4::rotate(m_pitch_angle, vec3(1, 0, 0)); | |||||
| mat4 model = mat4::translate(vec3(0, 0, -4.5)); | |||||
| mat4 view = mat4::lookat(vec3(0, 2, 0), vec3(0, 0, -4), vec3(0, 1, 0)); | |||||
| mat4 proj = mat4::perspective(45.0f, 640.0f, 480.0f, 0.1f, 10.0f); | |||||
| m_matrix = proj * view * model * anim; | |||||
| } | |||||
| virtual void TickDraw(float seconds) | |||||
| { | |||||
| WorldEntity::TickDraw(seconds); | |||||
| if (!m_ready) | |||||
| { | |||||
| m_shader = Shader::Create(LOLFX_RESOURCE_NAME(07_input)); | |||||
| m_mvp = m_shader->GetUniformLocation("in_Matrix"); | |||||
| m_coord = m_shader->GetAttribLocation("in_Vertex", | |||||
| VertexUsage::Position, 0); | |||||
| m_color = m_shader->GetAttribLocation("in_Color", | |||||
| VertexUsage::Color, 0); | |||||
| m_vdecl = | |||||
| new VertexDeclaration(VertexStream<vec3,vec3>(VertexUsage::Position, | |||||
| VertexUsage::Color)); | |||||
| m_vbo = new VertexBuffer(m_mesh.Bytes()); | |||||
| void *mesh = m_vbo->Lock(0, 0); | |||||
| memcpy(mesh, &m_mesh[0], m_mesh.Bytes()); | |||||
| m_vbo->Unlock(); | |||||
| m_lines_ibo = new IndexBuffer(m_lines_indices.Bytes()); | |||||
| void *indices = m_lines_ibo->Lock(0, 0); | |||||
| memcpy(indices, &m_lines_indices[0], m_lines_indices.Bytes()); | |||||
| m_lines_ibo->Unlock(); | |||||
| m_faces_ibo = new IndexBuffer(m_faces_indices.Bytes()); | |||||
| indices = m_faces_ibo->Lock(0, 0); | |||||
| memcpy(indices, &m_faces_indices[0], m_faces_indices.Bytes()); | |||||
| m_faces_ibo->Unlock(); | |||||
| /* FIXME: this object never cleans up */ | |||||
| m_ready = true; | |||||
| } | |||||
| g_renderer->SetClearColor(vec4(0.0f, 0.0f, 0.0f, 1.0f)); | |||||
| m_shader->Bind(); | |||||
| m_vdecl->SetStream(m_vbo, m_coord, m_color); | |||||
| m_vdecl->Bind(); | |||||
| m_shader->SetUniform(m_mvp, m_matrix); | |||||
| m_lines_ibo->Bind(); | |||||
| m_vdecl->DrawIndexedElements(MeshPrimitive::Lines, 0, 0, | |||||
| m_mesh.Count(), 0, m_lines_indices.Count()); | |||||
| m_lines_ibo->Unbind(); | |||||
| m_shader->SetUniform(m_mvp, m_matrix * mat4::scale(0.5f)); | |||||
| m_faces_ibo->Bind(); | |||||
| m_vdecl->DrawIndexedElements(MeshPrimitive::Triangles, 0, 0, | |||||
| m_mesh.Count(), 0, m_faces_indices.Count()); | |||||
| m_faces_ibo->Unbind(); | |||||
| m_vdecl->Unbind(); | |||||
| } | |||||
| private: | |||||
| bool m_autorot; | |||||
| float m_pitch_angle; | |||||
| float m_yaw_angle; | |||||
| mat4 m_matrix; | |||||
| Array<vec3,vec3> m_mesh; | |||||
| Array<uint16_t> m_lines_indices, m_faces_indices; | |||||
| Shader *m_shader; | |||||
| ShaderAttrib m_coord, m_color; | |||||
| ShaderUniform m_mvp; | |||||
| VertexDeclaration *m_vdecl; | |||||
| VertexBuffer *m_vbo; | |||||
| IndexBuffer *m_lines_ibo, *m_faces_ibo; | |||||
| Text *m_text; | |||||
| bool m_ready; | |||||
| }; | |||||
| int main(int argc, char **argv) | |||||
| { | |||||
| System::Init(argc, argv); | |||||
| Application app("Tutorial 7: Input", ivec2(640, 480), 60.0f); | |||||
| new DebugFps(5, 5); | |||||
| new Cube(); | |||||
| controller = new Controller(KEY_MAX, AXIS_MAX); | |||||
| controller->GetKey(KEY_MANUAL_ROTATION).Bind("Keyboard", "Space"); | |||||
| controller->GetKey(KEY_DRAG_MESH).Bind("Mouse", "ButtonLeft"); | |||||
| controller->GetAxis(AXIS_DRAG_PITCH).Bind("Mouse", "Y"); | |||||
| controller->GetAxis(AXIS_DRAG_YAW).Bind("Mouse", "X"); | |||||
| controller->GetAxis(AXIS_PITCH).Bind("Joystick1", "Axis2"); | |||||
| controller->GetAxis(AXIS_YAW).Bind("Joystick1", "Axis1"); | |||||
| app.Run(); | |||||
| return EXIT_SUCCESS; | |||||
| } | |||||
| @@ -0,0 +1,50 @@ | |||||
| [vert.glsl] | |||||
| #version 120 | |||||
| attribute vec3 in_Vertex; | |||||
| attribute vec3 in_Color; | |||||
| uniform mat4 in_Matrix; | |||||
| varying vec3 pass_Color; | |||||
| void main(void) | |||||
| { | |||||
| gl_Position = in_Matrix * vec4(in_Vertex, 1.0); | |||||
| pass_Color = in_Color; | |||||
| } | |||||
| [frag.glsl] | |||||
| #version 120 | |||||
| #if defined GL_ES | |||||
| precision highp float; | |||||
| #endif | |||||
| varying vec3 pass_Color; | |||||
| void main(void) | |||||
| { | |||||
| gl_FragColor = vec4(pass_Color, 1.0); | |||||
| } | |||||
| [vert.hlsl] | |||||
| void main(float3 in_Vertex : POSITION, | |||||
| float3 in_Color : COLOR, | |||||
| uniform float4x4 in_Matrix, | |||||
| out float4 out_Position : POSITION, | |||||
| out float3 pass_Color : COLOR) | |||||
| { | |||||
| pass_Color = in_Color; | |||||
| out_Position = mul(in_Matrix, float4(in_Vertex, 1.0)); | |||||
| } | |||||
| [frag.hlsl] | |||||
| void main(float3 pass_Color : COLOR, | |||||
| out float4 out_FragColor : COLOR) | |||||
| { | |||||
| out_FragColor = float4(pass_Color, 1.0); | |||||
| } | |||||
| @@ -0,0 +1,82 @@ | |||||
| <?xml version="1.0" encoding="utf-8"?> | |||||
| <Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | |||||
| <ItemGroup Label="ProjectConfigurations"> | |||||
| <ProjectConfiguration Include="Debug|ORBIS"> | |||||
| <Configuration>Debug</Configuration> | |||||
| <Platform>ORBIS</Platform> | |||||
| </ProjectConfiguration> | |||||
| <ProjectConfiguration Include="Debug|PS3"> | |||||
| <Configuration>Debug</Configuration> | |||||
| <Platform>PS3</Platform> | |||||
| </ProjectConfiguration> | |||||
| <ProjectConfiguration Include="Debug|Win32"> | |||||
| <Configuration>Debug</Configuration> | |||||
| <Platform>Win32</Platform> | |||||
| </ProjectConfiguration> | |||||
| <ProjectConfiguration Include="Debug|x64"> | |||||
| <Configuration>Debug</Configuration> | |||||
| <Platform>x64</Platform> | |||||
| </ProjectConfiguration> | |||||
| <ProjectConfiguration Include="Debug|Xbox 360"> | |||||
| <Configuration>Debug</Configuration> | |||||
| <Platform>Xbox 360</Platform> | |||||
| </ProjectConfiguration> | |||||
| <ProjectConfiguration Include="Release|ORBIS"> | |||||
| <Configuration>Release</Configuration> | |||||
| <Platform>ORBIS</Platform> | |||||
| </ProjectConfiguration> | |||||
| <ProjectConfiguration Include="Release|PS3"> | |||||
| <Configuration>Release</Configuration> | |||||
| <Platform>PS3</Platform> | |||||
| </ProjectConfiguration> | |||||
| <ProjectConfiguration Include="Release|Win32"> | |||||
| <Configuration>Release</Configuration> | |||||
| <Platform>Win32</Platform> | |||||
| </ProjectConfiguration> | |||||
| <ProjectConfiguration Include="Release|x64"> | |||||
| <Configuration>Release</Configuration> | |||||
| <Platform>x64</Platform> | |||||
| </ProjectConfiguration> | |||||
| <ProjectConfiguration Include="Release|Xbox 360"> | |||||
| <Configuration>Release</Configuration> | |||||
| <Platform>Xbox 360</Platform> | |||||
| </ProjectConfiguration> | |||||
| </ItemGroup> | |||||
| <ItemGroup> | |||||
| <ClCompile Include="07_input.cpp" /> | |||||
| </ItemGroup> | |||||
| <ItemGroup> | |||||
| <LolFxCompile Include="07_input.lolfx" /> | |||||
| </ItemGroup> | |||||
| <ItemGroup> | |||||
| <ProjectReference Include="$(SolutionDir)\..\..\src\lolcore.vcxproj"> | |||||
| <Project>{9e62f2fe-3408-4eae-8238-fd84238ceeda}</Project> | |||||
| </ProjectReference> | |||||
| <ProjectReference Include="$(SolutionDir)\..\..\src\bullet\lolbullet.vcxproj"> | |||||
| <Project>{83d3b207-c601-4025-8f41-01dedc354661}</Project> | |||||
| </ProjectReference> | |||||
| <ProjectReference Include="$(SolutionDir)\..\..\src\lua\lollua.vcxproj"> | |||||
| <Project>{d84021ca-b233-4e0f-8a52-071b83bbccc4}</Project> | |||||
| </ProjectReference> | |||||
| </ItemGroup> | |||||
| <PropertyGroup Label="Globals"> | |||||
| <ProjectGuid>{572E5B9C-7E19-489C-BD8A-E8401CFBBC47}</ProjectGuid> | |||||
| <ConfigurationType>Application</ConfigurationType> | |||||
| <Keyword>Win32Proj</Keyword> | |||||
| </PropertyGroup> | |||||
| <Import Project="$(SolutionDir)\Lol.Core.Config.props" /> | |||||
| <ImportGroup Label="ExtensionSettings"> | |||||
| <Import Project="$(SolutionDir)\Lol.Fx.props" /> | |||||
| </ImportGroup> | |||||
| <ImportGroup Label="PropertySheets"> | |||||
| <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> | |||||
| <Import Project="$(SolutionDir)\Lol.Core.Vars.props" /> | |||||
| </ImportGroup> | |||||
| <PropertyGroup Label="UserMacros" /> | |||||
| <Import Project="$(SolutionDir)\Lol.Core.Rules.props" /> | |||||
| <ItemDefinitionGroup /> | |||||
| <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> | |||||
| <ImportGroup Label="ExtensionTargets"> | |||||
| <Import Project="$(SolutionDir)\Lol.Fx.targets" /> | |||||
| </ImportGroup> | |||||
| </Project> | |||||
| @@ -120,7 +120,7 @@ public: | |||||
| m_position = ivec3(0, 0, 0); | m_position = ivec3(0, 0, 0); | ||||
| m_bbox[0] = m_position; | m_bbox[0] = m_position; | ||||
| m_bbox[1] = ivec3(m_window_size, 0); | m_bbox[1] = ivec3(m_window_size, 0); | ||||
| Input::TrackMouse(this); | |||||
| //Input::TrackMouse(this); | |||||
| #if LOL_FEATURE_THREADS | #if LOL_FEATURE_THREADS | ||||
| /* Spawn worker threads and wait for their readiness. */ | /* Spawn worker threads and wait for their readiness. */ | ||||
| @@ -142,7 +142,7 @@ public: | |||||
| m_donequeue.Pop(); | m_donequeue.Pop(); | ||||
| #endif | #endif | ||||
| Input::UntrackMouse(this); | |||||
| //Input::UntrackMouse(this); | |||||
| #if !defined __native_client__ | #if !defined __native_client__ | ||||
| Ticker::Unref(m_centertext); | Ticker::Unref(m_centertext); | ||||
| Ticker::Unref(m_mousetext); | Ticker::Unref(m_mousetext); | ||||
| @@ -175,7 +175,8 @@ public: | |||||
| rcmplx worldmouse = m_center + rcmplx(ScreenToWorldOffset(m_mousepos)); | rcmplx worldmouse = m_center + rcmplx(ScreenToWorldOffset(m_mousepos)); | ||||
| uint32_t buttons = Input::GetMouseButtons(); | |||||
| uint32_t buttons = 0; | |||||
| //uint32_t buttons = Input::GetMouseButtons(); | |||||
| #if !defined __CELLOS_LV2__ && !defined _XBOX | #if !defined __CELLOS_LV2__ && !defined _XBOX | ||||
| if (buttons & 0x2) | if (buttons & 0x2) | ||||
| { | { | ||||
| @@ -33,6 +33,10 @@ if USE_EMSCRIPTEN | |||||
| 06_sprite_LDFLAGS += --preload-file 06_sprite.png | 06_sprite_LDFLAGS += --preload-file 06_sprite.png | ||||
| endif | endif | ||||
| 07_input_SOURCES = 07_input.cpp 07_input.lolfx | |||||
| 07_input_CPPFLAGS = $(AM_CPPFLAGS) | |||||
| 07_input_DEPENDENCIES = @LOL_DEPS@ | |||||
| 08_fbo_SOURCES = 08_fbo.cpp 08_fbo.lolfx | 08_fbo_SOURCES = 08_fbo.cpp 08_fbo.lolfx | ||||
| 08_fbo_CPPFLAGS = $(AM_CPPFLAGS) | 08_fbo_CPPFLAGS = $(AM_CPPFLAGS) | ||||
| 08_fbo_DEPENDENCIES = @LOL_DEPS@ | 08_fbo_DEPENDENCIES = @LOL_DEPS@ | ||||
| @@ -129,6 +129,11 @@ static inline int isnan(float f) | |||||
| #include "input/stick.h" | #include "input/stick.h" | ||||
| #include "profiler.h" | #include "profiler.h" | ||||
| // Input (v2) | |||||
| #include "input/input.h" | |||||
| #include "input/inputdevice.h" | |||||
| #include "input/controller.h" | |||||
| // Entities | // Entities | ||||
| #include "entity.h" | #include "entity.h" | ||||
| #include "worldentity.h" | #include "worldentity.h" | ||||
| @@ -0,0 +1,147 @@ | |||||
| // | |||||
| // Lol Engine | |||||
| // | |||||
| // Copyright: (c) 2010-2013 Benjamin Litzelmann | |||||
| // This program is free software; you can redistribute it and/or | |||||
| // modify it under the terms of the Do What The Fuck You Want To | |||||
| // Public License, Version 2, as published by Sam Hocevar. See | |||||
| // http://www.wtfpl.net/ for more details. | |||||
| // | |||||
| #ifdef LOL_INPUT_V2 | |||||
| #if defined HAVE_CONFIG_H | |||||
| # include "config.h" | |||||
| #endif | |||||
| #include "core.h" | |||||
| namespace lol | |||||
| { | |||||
| /////////////////////////////////////////////////////////////////////////////// | |||||
| // KeyBinding | |||||
| void KeyBinding::Bind(const char* device_name, const char* key_name) | |||||
| { | |||||
| m_device = InputDevice::Get(device_name); | |||||
| if (!m_device) | |||||
| { | |||||
| Log::Warn("Trying to bind controller to device %s which doesn't exist", device_name); | |||||
| return; | |||||
| } | |||||
| m_keyindex = m_device->GetKeyIndex(key_name); | |||||
| if (m_keyindex < 0) | |||||
| { | |||||
| Log::Warn("Trying to bind controller to key %s.%s which doesn't exist", device_name, key_name); | |||||
| } | |||||
| } | |||||
| /////////////////////////////////////////////////////////////////////////////// | |||||
| // AxisBinding | |||||
| void AxisBinding::Bind(const char* device_name, const char* axis_name) | |||||
| { | |||||
| m_device = InputDevice::Get(device_name); | |||||
| if (!m_device) | |||||
| { | |||||
| Log::Warn("Trying to bind controller to device %s which doesn't exist", device_name); | |||||
| return; | |||||
| } | |||||
| m_axisindex = m_device->GetAxisIndex(axis_name); | |||||
| if (m_axisindex < 0) | |||||
| { | |||||
| Log::Warn("Trying to bind controller to axis %s.%s which doesn't exist", device_name, axis_name); | |||||
| } | |||||
| } | |||||
| /////////////////////////////////////////////////////////////////////////////// | |||||
| // Controller | |||||
| Array<Controller*> Controller::controllers; | |||||
| Controller::Controller(int nb_keys, int nb_axis) | |||||
| { | |||||
| m_gamegroup = GAMEGROUP_BEFORE; | |||||
| m_nb_keys = nb_keys; | |||||
| m_nb_axis = nb_axis; | |||||
| m_keys = new KeyBinding[m_nb_keys]; | |||||
| m_axis = new AxisBinding[m_nb_axis]; | |||||
| m_activate_nextframe = false; | |||||
| m_deactivate_nextframe = false; | |||||
| m_active = false; | |||||
| controllers.Push(this); | |||||
| } | |||||
| Controller::~Controller() | |||||
| { | |||||
| for (int i = 0; i < controllers.Count(); ++i) | |||||
| { | |||||
| if (controllers[i] == this) | |||||
| { | |||||
| controllers.Remove(i); | |||||
| break; | |||||
| } | |||||
| } | |||||
| } | |||||
| void Controller::TickGame(float seconds) | |||||
| { | |||||
| Entity::TickGame(seconds); | |||||
| for (int i = 0; i < m_nb_keys; ++i) | |||||
| { | |||||
| m_keys[i].Update(); | |||||
| } | |||||
| for (int i = 0; i < m_nb_axis; ++i) | |||||
| { | |||||
| m_axis[i].Update(); | |||||
| } | |||||
| if (m_activate_nextframe) | |||||
| m_active = true; | |||||
| if (m_deactivate_nextframe) | |||||
| m_active = false; | |||||
| m_activate_nextframe = false; | |||||
| m_deactivate_nextframe = false; | |||||
| } | |||||
| void Controller::Activate() | |||||
| { | |||||
| m_activate_nextframe = true; | |||||
| m_deactivate_nextframe = false; | |||||
| } | |||||
| void Controller::Deactivate() | |||||
| { | |||||
| m_deactivate_nextframe = true; | |||||
| m_activate_nextframe = false; | |||||
| } | |||||
| Array<Controller*> Controller::DeactivateAll() | |||||
| { | |||||
| Array<Controller*> result; | |||||
| for (int i = 0; i < controllers.Count(); ++i) | |||||
| { | |||||
| if (controllers[i]->m_active || controllers[i]->m_activate_nextframe) | |||||
| { | |||||
| result.Push(controllers[i]); | |||||
| controllers[i]->Deactivate(); | |||||
| } | |||||
| } | |||||
| return result; | |||||
| } | |||||
| } /* namespace lol */ | |||||
| #endif // LOL_INPUT_V2 | |||||
| @@ -0,0 +1,102 @@ | |||||
| // | |||||
| // Lol Engine | |||||
| // | |||||
| // Copyright: (c) 2010-2013 Benjamin Litzelmann | |||||
| // This program is free software; you can redistribute it and/or | |||||
| // modify it under the terms of the Do What The Fuck You Want To | |||||
| // Public License, Version 2, as published by Sam Hocevar. See | |||||
| // http://www.wtfpl.net/ for more details. | |||||
| // | |||||
| #if !defined __LOL_INPUT_CONTROLLER_H__ | |||||
| #define __LOL_INPUT_CONTROLLER_H__ | |||||
| #if defined LOL_INPUT_V2 | |||||
| #include "core.h" | |||||
| namespace lol | |||||
| { | |||||
| class KeyBinding | |||||
| { | |||||
| public: | |||||
| KeyBinding() : m_current(false), m_previous(false), m_device(nullptr) {} | |||||
| bool IsDown() const { return m_current; } | |||||
| bool IsUp() const { return !m_current; } | |||||
| bool IsPressed() const { return m_current && !m_previous; } | |||||
| bool IsReleased() const { return !m_current && m_previous; } | |||||
| void Bind(const char* device_name, const char* key_name); | |||||
| protected: | |||||
| void Update() { m_previous = m_current; m_current = m_device ? m_device->GetKey(m_keyindex) : false; } | |||||
| const InputDevice* m_device; | |||||
| int m_keyindex; | |||||
| bool m_current; | |||||
| bool m_previous; | |||||
| friend class Controller; | |||||
| }; | |||||
| class AxisBinding | |||||
| { | |||||
| public: | |||||
| AxisBinding() : m_current(0.0f), m_previous(0.0f), m_device(nullptr) {} | |||||
| float GetValue() const { return m_current; } | |||||
| float GetDelta() const { return m_current - m_previous; } | |||||
| void Bind(const char* device_name, const char* axis_name); | |||||
| protected: | |||||
| void Update() { m_previous = m_current; m_current = m_device ? m_device->GetAxis(m_axisindex) : 0.0f; } | |||||
| const InputDevice* m_device; | |||||
| int m_axisindex; | |||||
| float m_current; | |||||
| float m_previous; | |||||
| friend class Controller; | |||||
| }; | |||||
| class Controller : Entity | |||||
| { | |||||
| public: | |||||
| Controller(int nb_keys, int nb_axis); | |||||
| ~Controller(); | |||||
| virtual void TickGame(float seconds); | |||||
| /** Activate the controller on next frame */ | |||||
| void Activate(); | |||||
| /** Deactivate the controller on next frame */ | |||||
| void Deactivate(); | |||||
| /** Deactivate every active controller on next frame and return an array of deactivated (previously active) controllers */ | |||||
| static Array<Controller*> DeactivateAll(); | |||||
| KeyBinding& GetKey(int index) { ASSERT(index >= 0 && index < m_nb_keys); return m_keys[index]; } | |||||
| AxisBinding& GetAxis(int index) { ASSERT(index >= 0 && index < m_nb_axis); return m_axis[index]; } | |||||
| protected: | |||||
| KeyBinding* m_keys; | |||||
| AxisBinding* m_axis; | |||||
| int m_nb_keys; | |||||
| int m_nb_axis; | |||||
| private: | |||||
| static Array<Controller*> controllers; | |||||
| bool m_activate_nextframe; | |||||
| bool m_deactivate_nextframe; | |||||
| bool m_active; | |||||
| }; | |||||
| } /* namespace lol */ | |||||
| #endif // LOL_INPUT_V2 | |||||
| #endif // __LOL_INPUT_CONTROLLER_H__ | |||||
| @@ -8,6 +8,8 @@ | |||||
| // http://www.wtfpl.net/ for more details. | // http://www.wtfpl.net/ for more details. | ||||
| // | // | ||||
| #ifndef LOL_INPUT_V2 | |||||
| #if defined HAVE_CONFIG_H | #if defined HAVE_CONFIG_H | ||||
| # include "config.h" | # include "config.h" | ||||
| #endif | #endif | ||||
| @@ -478,3 +480,4 @@ void Input::UntrackStick(Stick *stick) | |||||
| } /* namespace lol */ | } /* namespace lol */ | ||||
| #endif // !LOL_INPUT_V2 | |||||
| @@ -16,6 +16,8 @@ | |||||
| #if !defined __LOL_INPUT_INPUT_H__ | #if !defined __LOL_INPUT_INPUT_H__ | ||||
| #define __LOL_INPUT_INPUT_H__ | #define __LOL_INPUT_INPUT_H__ | ||||
| #ifndef LOL_INPUT_V2 | |||||
| #include <cstring> | #include <cstring> | ||||
| #include <string.h> | #include <string.h> | ||||
| @@ -456,5 +458,7 @@ public: | |||||
| } /* namespace lol */ | } /* namespace lol */ | ||||
| #endif // !LOL_INPUT_V2 | |||||
| #endif // __LOL_INPUT_INPUT_H__ | #endif // __LOL_INPUT_INPUT_H__ | ||||
| @@ -0,0 +1,72 @@ | |||||
| // | |||||
| // Lol Engine | |||||
| // | |||||
| // Copyright: (c) 2010-2013 Benjamin Litzelmann | |||||
| // This program is free software; you can redistribute it and/or | |||||
| // modify it under the terms of the Do What The Fuck You Want To | |||||
| // Public License, Version 2, as published by Sam Hocevar. See | |||||
| // http://www.wtfpl.net/ for more details. | |||||
| // | |||||
| #ifdef LOL_INPUT_V2 | |||||
| #if defined HAVE_CONFIG_H | |||||
| # include "config.h" | |||||
| #endif | |||||
| #include "core.h" | |||||
| #include "input/inputdevice_internal.h" | |||||
| namespace lol | |||||
| { | |||||
| Array<InputDevice*> InputDevice::devices; | |||||
| bool InputDevice::m_capturemouse; | |||||
| void InputDeviceInternal::AddKey(const char* name) | |||||
| { | |||||
| m_keynames.Push(name); | |||||
| m_keys.Push(false); | |||||
| } | |||||
| void InputDeviceInternal::AddAxis(const char* name, float sensitivity) | |||||
| { | |||||
| m_axisnames.Push(name); | |||||
| m_axis.Push(0.0f, sensitivity); | |||||
| } | |||||
| void InputDeviceInternal::AddCursor(const char* name) | |||||
| { | |||||
| m_cursornames.Push(name); | |||||
| m_cursors.Push(vec2(0.0), ivec2(0)); | |||||
| } | |||||
| InputDeviceInternal* InputDeviceInternal::CreateStandardKeyboard() | |||||
| { | |||||
| InputDeviceInternal* keyboard = new InputDeviceInternal("Keyboard"); | |||||
| # define KEY_FUNC(key, value) keyboard->AddKey(#key); | |||||
| # include "input/keys.h" | |||||
| # undef KEY_FUNC | |||||
| return keyboard; | |||||
| } | |||||
| InputDeviceInternal* InputDeviceInternal::CreateStandardMouse() | |||||
| { | |||||
| InputDeviceInternal* mouse = new InputDeviceInternal("Mouse"); | |||||
| mouse->AddKey("ButtonLeft"); | |||||
| mouse->AddKey("ButtonMiddle"); | |||||
| mouse->AddKey("ButtonRight"); | |||||
| mouse->AddAxis("X"); | |||||
| mouse->AddAxis("Y"); | |||||
| mouse->AddCursor("Cursor"); | |||||
| // TODO: extended button, and wheel (as axis or as buttons? or both?) | |||||
| return mouse; | |||||
| } | |||||
| } /* namespace lol */ | |||||
| #endif // LOL_INPUT_V2 | |||||
| @@ -0,0 +1,126 @@ | |||||
| // | |||||
| // Lol Engine | |||||
| // | |||||
| // Copyright: (c) 2010-2013 Benjamin Litzelmann | |||||
| // This program is free software; you can redistribute it and/or | |||||
| // modify it under the terms of the Do What The Fuck You Want To | |||||
| // Public License, Version 2, as published by Sam Hocevar. See | |||||
| // http://www.wtfpl.net/ for more details. | |||||
| // | |||||
| #if !defined __LOL_INPUT_DEVICE_H__ | |||||
| #define __LOL_INPUT_DEVICE_H__ | |||||
| #if defined LOL_INPUT_V2 | |||||
| #include "core.h" | |||||
| namespace lol | |||||
| { | |||||
| class InputDevice | |||||
| { | |||||
| public: | |||||
| /** Get the name of this input device */ | |||||
| const String& GetName(); | |||||
| /** Get the index of the corresponding key, needed to call GetKey */ | |||||
| int GetKeyIndex(const char* name) const { return GetItemIndex(name, m_keynames); } | |||||
| /** Get the index of the corresponding axis, needed to call GetAxis */ | |||||
| int GetAxisIndex(const char* name) const { return GetItemIndex(name, m_axisnames); } | |||||
| /** Get the index of the corresponding cursor, needed to call GetCursor */ | |||||
| int GetCursorIndex(const char* name) const { return GetItemIndex(name, m_cursornames); } | |||||
| /** Get the current state of the given key, true being pressed and false being released */ | |||||
| bool GetKey(int index) const { return m_keys[index]; } | |||||
| /** Get the current value of the given axis. Devices should cap this value between -1 and 1 as much as possible, through it is not guaranteed */ | |||||
| float GetAxis(int index) const { return m_axis[index].m1 * m_axis[index].m2; } | |||||
| /** Get the current value of the given cursor, 0,0 being the bottom-left corner and 1,1 being the top-right corner */ | |||||
| vec2 GetCursor(int index) const { return m_cursors[index].m1; } | |||||
| /** Get the coordinate of the pixel the cursor is currently over, 0,0 being the bottom-left corner. */ | |||||
| ivec2 GetCursorPixel(int index) const { return m_cursors[index].m2; } | |||||
| /** Set a per-device-axis sensitivity factor. The value returned by the operating system will be multiplied by this value before being returned by GetAxis */ | |||||
| void SetAxisSensitivity(int index, float sensitivity) { m_axis[index].m2 = sensitivity; } | |||||
| /** Get the per-device-axis sensitivity factor. The value returned by the operating system will be multiplied by this value before being returned by GetAxis */ | |||||
| float GetAxisSensitivity(int index) const { return m_axis[index].m2; } | |||||
| /** Get a list of the name of all available keys in this device */ | |||||
| const Array<String>& GetAllKeys() const { return m_keynames; } | |||||
| /** Get a list of the name of all available axis in this device */ | |||||
| const Array<String>& GetAllAxis() const { return m_axisnames; } | |||||
| /** Get a list of the name of all available cursors in this device */ | |||||
| const Array<String>& GetAllCursors() const { return m_cursornames; } | |||||
| /** Get an input device by its name */ | |||||
| static InputDevice* Get(const char* name) { return GetDevice(name); } | |||||
| /** Set whether the mouse cursor should be captured. */ | |||||
| static void CaptureMouse(bool activated) { m_capturemouse = activated; } | |||||
| protected: | |||||
| // TODO: hide all of this in a InputDeviceData? | |||||
| String m_name; | |||||
| Array<String> m_keynames; | |||||
| Array<String> m_axisnames; | |||||
| Array<String> m_cursornames; | |||||
| /** key states (pressed/released) */ | |||||
| Array<bool> m_keys; | |||||
| /** axis states (value and sensitivity) */ | |||||
| Array<float, float> m_axis; | |||||
| /** cursor position */ | |||||
| Array<vec2, ivec2> m_cursors; | |||||
| static bool m_capturemouse; | |||||
| InputDevice(const char* name) : m_name(name) | |||||
| { | |||||
| devices.Push(this); | |||||
| } | |||||
| ~InputDevice() | |||||
| { | |||||
| for (int i = 0; i < devices.Count(); ++i) | |||||
| { | |||||
| if (devices[i] == this) | |||||
| { | |||||
| devices.Remove(i); | |||||
| return; | |||||
| } | |||||
| } | |||||
| } | |||||
| private: | |||||
| static Array<InputDevice*> devices; | |||||
| template <typename T> | |||||
| int GetItemIndex(const char* name, const Array<String, T>& Array) const | |||||
| { | |||||
| for (int i = 0; i < Array.Count(); ++i) | |||||
| { | |||||
| if (Array[i] == name) | |||||
| return i; | |||||
| } | |||||
| return -1; | |||||
| } | |||||
| static InputDevice* GetDevice(const char* name) | |||||
| { | |||||
| for (int i = 0; i < devices.Count(); ++i) | |||||
| { | |||||
| if (devices[i]->m_name == name) | |||||
| return devices[i]; | |||||
| } | |||||
| return nullptr; | |||||
| } | |||||
| }; | |||||
| } /* namespace lol */ | |||||
| #endif // LOL_INPUT_V2 | |||||
| #endif // __LOL_INPUT_DEVICE_H__ | |||||
| @@ -0,0 +1,46 @@ | |||||
| // | |||||
| // Lol Engine | |||||
| // | |||||
| // Copyright: (c) 2010-2013 Benjamin Litzelmann | |||||
| // This program is free software; you can redistribute it and/or | |||||
| // modify it under the terms of the Do What The Fuck You Want To | |||||
| // Public License, Version 2, as published by Sam Hocevar. See | |||||
| // http://www.wtfpl.net/ for more details. | |||||
| // | |||||
| #if !defined __LOL_INPUT_DEVICE_INTERNAL_H__ | |||||
| #define __LOL_INPUT_DEVICE_H__ | |||||
| #if defined LOL_INPUT_V2 | |||||
| #include "core.h" | |||||
| namespace lol | |||||
| { | |||||
| /** Internal class (not public) that allows to construct an InputDevice dynamically, when the keys, axis and cursors are not known at compile time */ | |||||
| class InputDeviceInternal : InputDevice | |||||
| { | |||||
| public: | |||||
| InputDeviceInternal(const char* name) : InputDevice(name) { } | |||||
| void AddKey(const char* name); | |||||
| void AddAxis(const char* name, float sensitivity = 1.0f); | |||||
| void AddCursor(const char* name); | |||||
| void SetKey(int index, bool state) { m_keys[index] = state; } | |||||
| void SetAxis(int index, float value) { m_axis[index].m1 = value; } | |||||
| void SetCursor(int index, const vec2& position, const ivec2& pixel) { m_cursors[index].m1 = position; m_cursors[index].m2 = pixel; } | |||||
| static bool GetMouseCapture() { return m_capturemouse; } | |||||
| static InputDeviceInternal* CreateStandardKeyboard(); | |||||
| static InputDeviceInternal* CreateStandardMouse(); | |||||
| }; | |||||
| } /* namespace lol */ | |||||
| #endif // LOL_INPUT_V2 | |||||
| #endif // __LOL_INPUT_DEVICE_INTERNAL_H__ | |||||
| @@ -8,6 +8,8 @@ | |||||
| // http://www.wtfpl.net/ for more details. | // http://www.wtfpl.net/ for more details. | ||||
| // | // | ||||
| #ifndef LOL_INPUT_V2 | |||||
| #if defined HAVE_CONFIG_H | #if defined HAVE_CONFIG_H | ||||
| # include "config.h" | # include "config.h" | ||||
| #endif | #endif | ||||
| @@ -66,3 +68,4 @@ uint32_t Keyboard::PopChar() | |||||
| } /* namespace lol */ | } /* namespace lol */ | ||||
| #endif // !LOL_INPUT_V2 | |||||
| @@ -16,6 +16,8 @@ | |||||
| #if !defined __LOL_INPUT_KEYBOARD_H__ | #if !defined __LOL_INPUT_KEYBOARD_H__ | ||||
| #define __LOL_INPUT_KEYBOARD_H__ | #define __LOL_INPUT_KEYBOARD_H__ | ||||
| #ifndef LOL_INPUT_V2 | |||||
| #include "entity.h" | #include "entity.h" | ||||
| namespace lol | namespace lol | ||||
| @@ -39,5 +41,7 @@ private: | |||||
| } /* namespace lol */ | } /* namespace lol */ | ||||
| #endif // !LOL_INPUT_V2 | |||||
| #endif // __LOL_INPUT_KEYBOARD_H__ | #endif // __LOL_INPUT_KEYBOARD_H__ | ||||
| @@ -0,0 +1,266 @@ | |||||
| // | |||||
| // Lol Engine | |||||
| // | |||||
| // Copyright: (c) 2010-2013 Benjamin Litzelmann | |||||
| // This program is free software; you can redistribute it and/or | |||||
| // modify it under the terms of the Do What The Fuck You Want To | |||||
| // Public License) Version 2) as published by Sam Hocevar. See | |||||
| // http://www.wtfpl.net/ for more details. | |||||
| // | |||||
| #if defined KEY_FUNC | |||||
| /* ASCII mapped keys */ | |||||
| KEY_FUNC(Unknown, 0) | |||||
| KEY_FUNC(First, 0) | |||||
| KEY_FUNC(Backspace, 8) | |||||
| KEY_FUNC(Tab, (int)'\t') | |||||
| KEY_FUNC(Clear, 12) | |||||
| KEY_FUNC(Return, 13) | |||||
| KEY_FUNC(Pause, 19) | |||||
| KEY_FUNC(Escape, 27) | |||||
| KEY_FUNC(Space, (int)' ') | |||||
| KEY_FUNC(Exclaim, (int)'!') | |||||
| KEY_FUNC(DoubleQuote, (int)'"') | |||||
| KEY_FUNC(Hash, (int)'#') | |||||
| KEY_FUNC(Dollar, (int)'$') | |||||
| KEY_FUNC(Ampersand, (int)'&') | |||||
| KEY_FUNC(Quote, (int)'\'') | |||||
| KEY_FUNC(LeftParen, (int)'(') | |||||
| KEY_FUNC(RightParen, (int)')') | |||||
| KEY_FUNC(Asterisk, (int)'*') | |||||
| KEY_FUNC(Plus, (int)'+') | |||||
| KEY_FUNC(Comma, (int)')') | |||||
| KEY_FUNC(Minus, (int)'-') | |||||
| KEY_FUNC(Period, (int)'.') | |||||
| KEY_FUNC(Slash, (int)'/') | |||||
| KEY_FUNC(K0, (int)'0') | |||||
| KEY_FUNC(K1, (int)'1') | |||||
| KEY_FUNC(K2, (int)'2') | |||||
| KEY_FUNC(K3, (int)'3') | |||||
| KEY_FUNC(K4, (int)'4') | |||||
| KEY_FUNC(K5, (int)'5') | |||||
| KEY_FUNC(K6, (int)'6') | |||||
| KEY_FUNC(K7, (int)'7') | |||||
| KEY_FUNC(K8, (int)'8') | |||||
| KEY_FUNC(K9, (int)'9') | |||||
| KEY_FUNC(Colon, (int)':') | |||||
| KEY_FUNC(Semicolon, (int)';') | |||||
| KEY_FUNC(Less, (int)'<') | |||||
| KEY_FUNC(Equals, (int)'=') | |||||
| KEY_FUNC(Greater, (int)'>') | |||||
| KEY_FUNC(Question, (int)'?') | |||||
| KEY_FUNC(At, (int)'@') | |||||
| /* XXX: SDL decides to skip uppercase characters */ | |||||
| KEY_FUNC(LeftBracket, (int)'[') | |||||
| KEY_FUNC(BackSlash, (int)'\\') | |||||
| KEY_FUNC(RightBracket, (int)']') | |||||
| KEY_FUNC(Caret, (int)'^') | |||||
| KEY_FUNC(Underscore, (int)'_') | |||||
| KEY_FUNC(Backquote, (int)'`') | |||||
| KEY_FUNC(A, (int)'a') | |||||
| KEY_FUNC(B, (int)'b') | |||||
| KEY_FUNC(C, (int)'c') | |||||
| KEY_FUNC(D, (int)'d') | |||||
| KEY_FUNC(E, (int)'e') | |||||
| KEY_FUNC(F, (int)'f') | |||||
| KEY_FUNC(G, (int)'g') | |||||
| KEY_FUNC(H, (int)'h') | |||||
| KEY_FUNC(I, (int)'i') | |||||
| KEY_FUNC(J, (int)'j') | |||||
| KEY_FUNC(K, (int)'k') | |||||
| KEY_FUNC(L, (int)'l') | |||||
| KEY_FUNC(M, (int)'m') | |||||
| KEY_FUNC(N, (int)'n') | |||||
| KEY_FUNC(O, (int)'o') | |||||
| KEY_FUNC(P, (int)'p') | |||||
| KEY_FUNC(Q, (int)'q') | |||||
| KEY_FUNC(R, (int)'r') | |||||
| KEY_FUNC(S, (int)'s') | |||||
| KEY_FUNC(T, (int)'t') | |||||
| KEY_FUNC(U, (int)'u') | |||||
| KEY_FUNC(V, (int)'v') | |||||
| KEY_FUNC(W, (int)'w') | |||||
| KEY_FUNC(X, (int)'x') | |||||
| KEY_FUNC(Y, (int)'y') | |||||
| KEY_FUNC(Z, (int)'z') | |||||
| KEY_FUNC(Delete, 127) | |||||
| /* International keyboard syms */ | |||||
| #ifndef KEY_DISABLE_WORLD | |||||
| KEY_FUNC(World0, 160) /* 0xA0 */ | |||||
| KEY_FUNC(World1, 161) | |||||
| KEY_FUNC(World2, 162) | |||||
| KEY_FUNC(World3, 163) | |||||
| KEY_FUNC(World4, 164) | |||||
| KEY_FUNC(World5, 165) | |||||
| KEY_FUNC(World6, 166) | |||||
| KEY_FUNC(World7, 167) | |||||
| KEY_FUNC(World8, 168) | |||||
| KEY_FUNC(World9, 169) | |||||
| KEY_FUNC(World10, 170) | |||||
| KEY_FUNC(World11, 171) | |||||
| KEY_FUNC(World12, 172) | |||||
| KEY_FUNC(World13, 173) | |||||
| KEY_FUNC(World14, 174) | |||||
| KEY_FUNC(World15, 175) | |||||
| KEY_FUNC(World16, 176) | |||||
| KEY_FUNC(World17, 177) | |||||
| KEY_FUNC(World18, 178) | |||||
| KEY_FUNC(World19, 179) | |||||
| KEY_FUNC(World20, 180) | |||||
| KEY_FUNC(World21, 181) | |||||
| KEY_FUNC(World22, 182) | |||||
| KEY_FUNC(World23, 183) | |||||
| KEY_FUNC(World24, 184) | |||||
| KEY_FUNC(World25, 185) | |||||
| KEY_FUNC(World26, 186) | |||||
| KEY_FUNC(World27, 187) | |||||
| KEY_FUNC(World28, 188) | |||||
| KEY_FUNC(World29, 189) | |||||
| KEY_FUNC(World30, 190) | |||||
| KEY_FUNC(World31, 191) | |||||
| KEY_FUNC(World32, 192) | |||||
| KEY_FUNC(World33, 193) | |||||
| KEY_FUNC(World34, 194) | |||||
| KEY_FUNC(World35, 195) | |||||
| KEY_FUNC(World36, 196) | |||||
| KEY_FUNC(World37, 197) | |||||
| KEY_FUNC(World38, 198) | |||||
| KEY_FUNC(World39, 199) | |||||
| KEY_FUNC(World40, 200) | |||||
| KEY_FUNC(World41, 201) | |||||
| KEY_FUNC(World42, 202) | |||||
| KEY_FUNC(World43, 203) | |||||
| KEY_FUNC(World44, 204) | |||||
| KEY_FUNC(World45, 205) | |||||
| KEY_FUNC(World46, 206) | |||||
| KEY_FUNC(World47, 207) | |||||
| KEY_FUNC(World48, 208) | |||||
| KEY_FUNC(World49, 209) | |||||
| KEY_FUNC(World50, 210) | |||||
| KEY_FUNC(World51, 211) | |||||
| KEY_FUNC(World52, 212) | |||||
| KEY_FUNC(World53, 213) | |||||
| KEY_FUNC(World54, 214) | |||||
| KEY_FUNC(World55, 215) | |||||
| KEY_FUNC(World56, 216) | |||||
| KEY_FUNC(World57, 217) | |||||
| KEY_FUNC(World58, 218) | |||||
| KEY_FUNC(World59, 219) | |||||
| KEY_FUNC(World60, 220) | |||||
| KEY_FUNC(World61, 221) | |||||
| KEY_FUNC(World62, 222) | |||||
| KEY_FUNC(World63, 223) | |||||
| KEY_FUNC(World64, 224) | |||||
| KEY_FUNC(World65, 225) | |||||
| KEY_FUNC(World66, 226) | |||||
| KEY_FUNC(World67, 227) | |||||
| KEY_FUNC(World68, 228) | |||||
| KEY_FUNC(World69, 229) | |||||
| KEY_FUNC(World70, 230) | |||||
| KEY_FUNC(World71, 231) | |||||
| KEY_FUNC(World72, 232) | |||||
| KEY_FUNC(World73, 233) | |||||
| KEY_FUNC(World74, 234) | |||||
| KEY_FUNC(World75, 235) | |||||
| KEY_FUNC(World76, 236) | |||||
| KEY_FUNC(World77, 237) | |||||
| KEY_FUNC(World78, 238) | |||||
| KEY_FUNC(World79, 239) | |||||
| KEY_FUNC(World80, 240) | |||||
| KEY_FUNC(World81, 241) | |||||
| KEY_FUNC(World82, 242) | |||||
| KEY_FUNC(World83, 243) | |||||
| KEY_FUNC(World84, 244) | |||||
| KEY_FUNC(World85, 245) | |||||
| KEY_FUNC(World86, 246) | |||||
| KEY_FUNC(World87, 247) | |||||
| KEY_FUNC(World88, 248) | |||||
| KEY_FUNC(World89, 249) | |||||
| KEY_FUNC(World90, 250) | |||||
| KEY_FUNC(World91, 251) | |||||
| KEY_FUNC(World92, 252) | |||||
| KEY_FUNC(World93, 253) | |||||
| KEY_FUNC(World94, 254) | |||||
| KEY_FUNC(World95, 255) /* 0xFF */ | |||||
| #endif // !KEY_DISABLE_WORLD | |||||
| /* Numeric keypad */ | |||||
| KEY_FUNC(KP0, 256) | |||||
| KEY_FUNC(KP1, 257) | |||||
| KEY_FUNC(KP2, 258) | |||||
| KEY_FUNC(KP3, 259) | |||||
| KEY_FUNC(KP4, 260) | |||||
| KEY_FUNC(KP5, 261) | |||||
| KEY_FUNC(KP6, 262) | |||||
| KEY_FUNC(KP7, 263) | |||||
| KEY_FUNC(KP8, 264) | |||||
| KEY_FUNC(KP9, 265) | |||||
| KEY_FUNC(KPPeriod, 266) | |||||
| KEY_FUNC(KPDivide, 267) | |||||
| KEY_FUNC(KPMultiply, 268) | |||||
| KEY_FUNC(KPMinus, 269) | |||||
| KEY_FUNC(KPPlus, 270) | |||||
| KEY_FUNC(KPEnter, 271) | |||||
| KEY_FUNC(KPEquals, 272) | |||||
| /* Arrows + Home/End pad */ | |||||
| KEY_FUNC(Up, 273) | |||||
| KEY_FUNC(Down, 274) | |||||
| KEY_FUNC(Right, 275) | |||||
| KEY_FUNC(Left, 276) | |||||
| KEY_FUNC(Insert, 277) | |||||
| KEY_FUNC(Home, 278) | |||||
| KEY_FUNC(End, 279) | |||||
| KEY_FUNC(PageUp, 280) | |||||
| KEY_FUNC(PageDown, 281) | |||||
| /* Function keys */ | |||||
| KEY_FUNC(F1, 282) | |||||
| KEY_FUNC(F2, 283) | |||||
| KEY_FUNC(F3, 284) | |||||
| KEY_FUNC(F4, 285) | |||||
| KEY_FUNC(F5, 286) | |||||
| KEY_FUNC(F6, 287) | |||||
| KEY_FUNC(F7, 288) | |||||
| KEY_FUNC(F8, 289) | |||||
| KEY_FUNC(F9, 290) | |||||
| KEY_FUNC(F10, 291) | |||||
| KEY_FUNC(F11, 292) | |||||
| KEY_FUNC(F12, 293) | |||||
| KEY_FUNC(F13, 294) | |||||
| KEY_FUNC(F14, 295) | |||||
| KEY_FUNC(F15, 296) | |||||
| /* Modifier keys */ | |||||
| KEY_FUNC(NumLock, 300) | |||||
| KEY_FUNC(CapsLock, 301) | |||||
| KEY_FUNC(ScrollLock, 302) | |||||
| KEY_FUNC(RightShift, 303) | |||||
| KEY_FUNC(LeftShift, 304) | |||||
| KEY_FUNC(RightCtrl, 305) | |||||
| KEY_FUNC(LeftCtrl, 306) | |||||
| KEY_FUNC(RightAlt, 307) | |||||
| KEY_FUNC(LeftAlt, 308) | |||||
| KEY_FUNC(RightMeta, 309) | |||||
| KEY_FUNC(LeftMeta, 310) | |||||
| KEY_FUNC(LeftSuper, 311) /* Left "Windows" key */ | |||||
| KEY_FUNC(RightSuper, 312) /* Right "Windows" key */ | |||||
| KEY_FUNC(Mode, 313) /* "Alt Gr" key */ | |||||
| KEY_FUNC(Compose, 314) /* Multi-key compose key */ | |||||
| /* Miscellaneous function keys */ | |||||
| KEY_FUNC(Help, 315) | |||||
| KEY_FUNC(Print, 316) | |||||
| KEY_FUNC(SysReq, 317) | |||||
| KEY_FUNC(Break, 318) | |||||
| KEY_FUNC(Menu, 319) | |||||
| KEY_FUNC(Power, 320) /* Power Macintosh power key */ | |||||
| KEY_FUNC(Euro, 321) /* Some european keyboards */ | |||||
| KEY_FUNC(Undo, 322) /* Atari keyboard has Undo */ | |||||
| /* Add any other keys here, but ensure Last value matches the last + 1 */ | |||||
| KEY_FUNC(Last, 323) | |||||
| #endif // KEY_FUNC | |||||
| @@ -8,6 +8,8 @@ | |||||
| // http://www.wtfpl.net/ for more details. | // http://www.wtfpl.net/ for more details. | ||||
| // | // | ||||
| #ifndef LOL_INPUT_V2 | |||||
| #if defined HAVE_CONFIG_H | #if defined HAVE_CONFIG_H | ||||
| # include "config.h" | # include "config.h" | ||||
| #endif | #endif | ||||
| @@ -107,3 +109,4 @@ int Stick::GetButton(int n) | |||||
| } /* namespace lol */ | } /* namespace lol */ | ||||
| #endif // !LOL_INPUT_V2 | |||||
| @@ -16,6 +16,8 @@ | |||||
| #if !defined __LOL_INPUT_STICK_H__ | #if !defined __LOL_INPUT_STICK_H__ | ||||
| #define __LOL_INPUT_STICK_H__ | #define __LOL_INPUT_STICK_H__ | ||||
| #ifndef LOL_INPUT_V2 | |||||
| #include "entity.h" | #include "entity.h" | ||||
| namespace lol | namespace lol | ||||
| @@ -48,5 +50,7 @@ private: | |||||
| } /* namespace lol */ | } /* namespace lol */ | ||||
| #endif // !LOL_INPUT_V2 | |||||
| #endif // __LOL_INPUT_STICK_H__ | #endif // __LOL_INPUT_STICK_H__ | ||||
| @@ -144,7 +144,9 @@ | |||||
| <ClCompile Include="image\codec\sdl-image.cpp" /> | <ClCompile Include="image\codec\sdl-image.cpp" /> | ||||
| <ClCompile Include="image\color\cie1931.cpp" /> | <ClCompile Include="image\color\cie1931.cpp" /> | ||||
| <ClCompile Include="image\image.cpp" /> | <ClCompile Include="image\image.cpp" /> | ||||
| <ClCompile Include="input\controller.cpp" /> | |||||
| <ClCompile Include="input\input.cpp" /> | <ClCompile Include="input\input.cpp" /> | ||||
| <ClCompile Include="input\inputdevice.cpp" /> | |||||
| <ClCompile Include="input\keyboard.cpp" /> | <ClCompile Include="input\keyboard.cpp" /> | ||||
| <ClCompile Include="input\stick.cpp" /> | <ClCompile Include="input\stick.cpp" /> | ||||
| <ClCompile Include="layer.cpp" /> | <ClCompile Include="layer.cpp" /> | ||||
| @@ -205,8 +207,12 @@ | |||||
| <ClInclude Include="gpu\lolfx-compiler.h" /> | <ClInclude Include="gpu\lolfx-compiler.h" /> | ||||
| <ClInclude Include="gradient.h" /> | <ClInclude Include="gradient.h" /> | ||||
| <ClInclude Include="image\image-private.h" /> | <ClInclude Include="image\image-private.h" /> | ||||
| <ClInclude Include="input\controller.h" /> | |||||
| <ClInclude Include="input\input.h" /> | <ClInclude Include="input\input.h" /> | ||||
| <ClInclude Include="input\inputdevice.h" /> | |||||
| <ClInclude Include="input\inputdevice_internal.h" /> | |||||
| <ClInclude Include="input\keyboard.h" /> | <ClInclude Include="input\keyboard.h" /> | ||||
| <ClInclude Include="input\keys.h" /> | |||||
| <ClInclude Include="input\stick.h" /> | <ClInclude Include="input\stick.h" /> | ||||
| <ClInclude Include="layer.h" /> | <ClInclude Include="layer.h" /> | ||||
| <ClInclude Include="light.h" /> | <ClInclude Include="light.h" /> | ||||
| @@ -312,6 +312,12 @@ | |||||
| <ClCompile Include="debug\lines.cpp"> | <ClCompile Include="debug\lines.cpp"> | ||||
| <Filter>debug</Filter> | <Filter>debug</Filter> | ||||
| </ClCompile> | </ClCompile> | ||||
| <ClCompile Include="input\controller.cpp"> | |||||
| <Filter>input</Filter> | |||||
| </ClCompile> | |||||
| <ClCompile Include="input\inputdevice.cpp"> | |||||
| <Filter>input</Filter> | |||||
| </ClCompile> | |||||
| </ItemGroup> | </ItemGroup> | ||||
| <ItemGroup> | <ItemGroup> | ||||
| <ClInclude Include="debug\fps.h"> | <ClInclude Include="debug\fps.h"> | ||||
| @@ -608,6 +614,18 @@ | |||||
| <ClInclude Include="lol\image\image.h"> | <ClInclude Include="lol\image\image.h"> | ||||
| <Filter>lol\image</Filter> | <Filter>lol\image</Filter> | ||||
| </ClInclude> | </ClInclude> | ||||
| <ClInclude Include="input\inputdevice.h"> | |||||
| <Filter>input</Filter> | |||||
| </ClInclude> | |||||
| <ClInclude Include="input\keys.h"> | |||||
| <Filter>input</Filter> | |||||
| </ClInclude> | |||||
| <ClInclude Include="input\inputdevice_internal.h"> | |||||
| <Filter>input</Filter> | |||||
| </ClInclude> | |||||
| <ClInclude Include="input\controller.h"> | |||||
| <Filter>input</Filter> | |||||
| </ClInclude> | |||||
| </ItemGroup> | </ItemGroup> | ||||
| <ItemGroup> | <ItemGroup> | ||||
| <LolFxCompile Include="gpu\emptymaterial.lolfx"> | <LolFxCompile Include="gpu\emptymaterial.lolfx"> | ||||
| @@ -20,6 +20,10 @@ | |||||
| #include "core.h" | #include "core.h" | ||||
| #include "d3d9input.h" | #include "d3d9input.h" | ||||
| #ifdef LOL_INPUT_V2 | |||||
| #include "input/inputdevice_internal.h" | |||||
| #endif // LOL_INPUT_V2 | |||||
| namespace lol | namespace lol | ||||
| { | { | ||||
| @@ -33,8 +37,12 @@ class D3d9InputData | |||||
| private: | private: | ||||
| #if defined USE_XINPUT | #if defined USE_XINPUT | ||||
| #if defined LOL_INPUT_V2 | |||||
| Array<int, InputDeviceInternal*> m_joysticks; | |||||
| #else | |||||
| Array<int, Stick *> m_joysticks; | Array<int, Stick *> m_joysticks; | ||||
| #endif | |||||
| #endif // LOL_INPUT_V2 | |||||
| #endif // USE_XINPUT | |||||
| }; | }; | ||||
| /* | /* | ||||
| @@ -50,11 +58,21 @@ D3d9Input::D3d9Input() | |||||
| XINPUT_STATE state; | XINPUT_STATE state; | ||||
| if (XInputGetState(i, &state) != ERROR_SUCCESS) | if (XInputGetState(i, &state) != ERROR_SUCCESS) | ||||
| continue; | continue; | ||||
| #if defined LOL_INPUT_V2 | |||||
| // TODO: we can put more friendly name here, such as LeftAxisX, ButtonX... | |||||
| InputDeviceInternal* stick = new InputDeviceInternal(String::Printf("Joystick%d", i+1).C()); | |||||
| for (int j = 0; j < 4; ++j) | |||||
| stick->AddAxis(String::Printf("Axis%d", j+1).C()); | |||||
| for (int j = 0; j < 16; ++j) | |||||
| stick->AddKey(String::Printf("Button%d", j+1).C()); | |||||
| m_data->m_joysticks.Push(i, stick); | |||||
| #else | |||||
| Stick *stick = Input::CreateStick(); | Stick *stick = Input::CreateStick(); | ||||
| stick->SetAxisCount(4); | stick->SetAxisCount(4); | ||||
| stick->SetButtonCount(16); | stick->SetButtonCount(16); | ||||
| m_data->m_joysticks.Push(i, stick); | m_data->m_joysticks.Push(i, stick); | ||||
| #endif // LOL_INPUT_V2 | |||||
| } | } | ||||
| #endif | #endif | ||||
| @@ -67,8 +85,12 @@ D3d9Input::~D3d9Input() | |||||
| /* Unregister all the joysticks we added */ | /* Unregister all the joysticks we added */ | ||||
| while (m_data->m_joysticks.Count()) | while (m_data->m_joysticks.Count()) | ||||
| { | { | ||||
| Input::DestroyStick(m_data->m_joysticks[0].m2); | |||||
| m_data->m_joysticks.Remove(0); | |||||
| #if defined LOL_INPUT_V2 | |||||
| delete m_data->m_joysticks[0].m2; | |||||
| #else | |||||
| Input::DestroyStick(m_data->m_joysticks[0].m2); | |||||
| #endif // LOL_INPUT_V2 | |||||
| m_data->m_joysticks.Remove(0); | |||||
| } | } | ||||
| #endif | #endif | ||||
| delete m_data; | delete m_data; | ||||
| @@ -96,8 +118,12 @@ void D3d9Input::TickDraw(float seconds) | |||||
| m_data->m_joysticks[i].m2->SetAxis(3, -(float)state.Gamepad.sThumbRY / 32768.f); | m_data->m_joysticks[i].m2->SetAxis(3, -(float)state.Gamepad.sThumbRY / 32768.f); | ||||
| for (int b = 0; b < 16; b++) | for (int b = 0; b < 16; b++) | ||||
| m_data->m_joysticks[i].m2->SetButton(b, ((uint16_t)(state.Gamepad.wButtons) >> b) & 1); | |||||
| } | |||||
| #if defined LOL_INPUT_V2 | |||||
| m_data->m_joysticks[i].m2->SetKey(b, ((uint16_t)(state.Gamepad.wButtons) >> b) & 1); | |||||
| #else | |||||
| m_data->m_joysticks[i].m2->SetButton(b, ((uint16_t)(state.Gamepad.wButtons) >> b) & 1); | |||||
| #endif // LOL_INPUT_V2 | |||||
| } | |||||
| #endif | #endif | ||||
| } | } | ||||
| @@ -66,6 +66,12 @@ SdlApp::SdlApp(char const *title, ivec2 res, float fps) : | |||||
| exit(EXIT_FAILURE); | exit(EXIT_FAILURE); | ||||
| } | } | ||||
| # ifdef LOL_INPUT_V2 | |||||
| const SDL_VideoInfo* vidinfo = SDL_GetVideoInfo(); | |||||
| int screen_w = vidinfo->current_w; | |||||
| int screen_h = vidinfo->current_h; | |||||
| # endif | |||||
| # if defined USE_D3D9 | # if defined USE_D3D9 | ||||
| SDL_Surface *video = SDL_SetVideoMode(res.x, res.y, 16, 0); | SDL_Surface *video = SDL_SetVideoMode(res.x, res.y, 16, 0); | ||||
| SDL_SysWMinfo wminfo; | SDL_SysWMinfo wminfo; | ||||
| @@ -77,6 +83,9 @@ SdlApp::SdlApp(char const *title, ivec2 res, float fps) : | |||||
| # else | # else | ||||
| SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); | SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); | ||||
| SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16); | SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16); | ||||
| # ifdef LOL_INPUT_V2 | |||||
| // TODO: when implementing fullscreen, be sure to overwrite screen_w and screen_h with the value of vidinfo after the call to SDL_SetVideoMode | |||||
| # endif | |||||
| SDL_Surface *video = SDL_SetVideoMode(res.x, res.y, 0, SDL_OPENGL); | SDL_Surface *video = SDL_SetVideoMode(res.x, res.y, 0, SDL_OPENGL); | ||||
| # endif | # endif | ||||
| if (!video) | if (!video) | ||||
| @@ -100,7 +109,11 @@ SdlApp::SdlApp(char const *title, ivec2 res, float fps) : | |||||
| new D3d9Input(); | new D3d9Input(); | ||||
| # endif | # endif | ||||
| new SdlInput(); | |||||
| # ifdef LOL_INPUT_V2 | |||||
| new SdlInput(video->w, video->h, screen_w, screen_h); | |||||
| # else | |||||
| new SdlInput(); | |||||
| # endif | |||||
| #endif | #endif | ||||
| } | } | ||||
| @@ -23,6 +23,10 @@ | |||||
| #include "core.h" | #include "core.h" | ||||
| #include "sdlinput.h" | #include "sdlinput.h" | ||||
| #ifdef LOL_INPUT_V2 | |||||
| #include "input/inputdevice_internal.h" | |||||
| #endif // LOL_INPUT_V2 | |||||
| /* We force joystick polling because no events are received when | /* We force joystick polling because no events are received when | ||||
| * there is no SDL display (eg. on the Raspberry Pi). */ | * there is no SDL display (eg. on the Raspberry Pi). */ | ||||
| #define SDL_FORCE_POLL_JOYSTICK 1 | #define SDL_FORCE_POLL_JOYSTICK 1 | ||||
| @@ -42,17 +46,44 @@ private: | |||||
| void Tick(float seconds); | void Tick(float seconds); | ||||
| static ivec2 GetMousePos(); | static ivec2 GetMousePos(); | ||||
| static void SetMousePos(ivec2 position); | |||||
| #if USE_SDL | #if USE_SDL | ||||
| # ifdef LOL_INPUT_V2 | |||||
| SdlInputData(int app_w, int app_h, int screen_w, int screen_h) : | |||||
| m_prevmouse(ivec2(0)), | |||||
| m_app_w((float)app_w), | |||||
| m_app_h((float)app_h), | |||||
| m_screen_w((float)screen_w), | |||||
| m_screen_h((float)screen_h) | |||||
| { } | |||||
| Array<SDL_Joystick*, InputDeviceInternal*> m_joysticks; | |||||
| InputDeviceInternal* m_mouse; | |||||
| InputDeviceInternal* m_keyboard; | |||||
| ivec2 m_prevmouse; | |||||
| float m_app_w; | |||||
| float m_app_h; | |||||
| float m_screen_w; | |||||
| float m_screen_h; | |||||
| bool m_mousecapture; | |||||
| # else | |||||
| Array<SDL_Joystick *, Stick *> m_joysticks; | Array<SDL_Joystick *, Stick *> m_joysticks; | ||||
| #endif | |||||
| # endif // LOL_INPUT_V2 | |||||
| #endif // USE_SDL | |||||
| }; | }; | ||||
| /* | /* | ||||
| * Public SdlInput class | * Public SdlInput class | ||||
| */ | */ | ||||
| #ifdef LOL_INPUT_V2 | |||||
| SdlInput::SdlInput(int app_w, int app_h, int screen_w, int screen_h) | |||||
| : m_data(new SdlInputData(app_w, app_h, screen_w, screen_h)) | |||||
| #else | |||||
| SdlInput::SdlInput() | SdlInput::SdlInput() | ||||
| : m_data(new SdlInputData()) | : m_data(new SdlInputData()) | ||||
| #endif | |||||
| { | { | ||||
| #if USE_SDL | #if USE_SDL | ||||
| /* Enable Unicode translation of keyboard events */ | /* Enable Unicode translation of keyboard events */ | ||||
| @@ -67,6 +98,11 @@ SdlInput::SdlInput() | |||||
| SDL_JoystickEventState(SDL_ENABLE); | SDL_JoystickEventState(SDL_ENABLE); | ||||
| # endif | # endif | ||||
| #ifdef LOL_INPUT_V2 | |||||
| m_data->m_keyboard = InputDeviceInternal::CreateStandardKeyboard(); | |||||
| m_data->m_mouse = InputDeviceInternal::CreateStandardMouse(); | |||||
| #endif | |||||
| /* Register all the joysticks we can find, and let the input | /* Register all the joysticks we can find, and let the input | ||||
| * system decide what it wants to track. */ | * system decide what it wants to track. */ | ||||
| for (int i = 0; i < SDL_NumJoysticks(); i++) | for (int i = 0; i < SDL_NumJoysticks(); i++) | ||||
| @@ -88,6 +124,15 @@ SdlInput::SdlInput() | |||||
| continue; | continue; | ||||
| } | } | ||||
| # ifdef LOL_INPUT_V2 | |||||
| InputDeviceInternal* stick = new InputDeviceInternal(String::Printf("Joystick%d", i+1).C()); | |||||
| for (int i = 0; i < SDL_JoystickNumAxes(sdlstick); ++i) | |||||
| stick->AddAxis(String::Printf("Axis%d", i+1).C()); | |||||
| for (int i = 0; i < SDL_JoystickNumButtons(sdlstick); ++i) | |||||
| stick->AddKey(String::Printf("Button%d", i+1).C()); | |||||
| m_data->m_joysticks.Push(sdlstick, stick); | |||||
| # else // !LOL_INPUT_V2 | |||||
| Stick *stick = Input::CreateStick(); | Stick *stick = Input::CreateStick(); | ||||
| stick->SetAxisCount(SDL_JoystickNumAxes(sdlstick)); | stick->SetAxisCount(SDL_JoystickNumAxes(sdlstick)); | ||||
| stick->SetButtonCount(SDL_JoystickNumButtons(sdlstick)); | stick->SetButtonCount(SDL_JoystickNumButtons(sdlstick)); | ||||
| @@ -97,6 +142,7 @@ SdlInput::SdlInput() | |||||
| //stick->RemapAxis(2, 4); | //stick->RemapAxis(2, 4); | ||||
| m_data->m_joysticks.Push(sdlstick, stick); | m_data->m_joysticks.Push(sdlstick, stick); | ||||
| # endif | |||||
| } | } | ||||
| # endif | # endif | ||||
| #endif | #endif | ||||
| @@ -111,7 +157,11 @@ SdlInput::~SdlInput() | |||||
| while (m_data->m_joysticks.Count()) | while (m_data->m_joysticks.Count()) | ||||
| { | { | ||||
| SDL_JoystickClose(m_data->m_joysticks[0].m1); | SDL_JoystickClose(m_data->m_joysticks[0].m1); | ||||
| # ifdef LOL_INPUT_V2 | |||||
| delete m_data->m_joysticks[0].m2; | |||||
| # else | |||||
| Input::DestroyStick(m_data->m_joysticks[0].m2); | Input::DestroyStick(m_data->m_joysticks[0].m2); | ||||
| # endif | |||||
| m_data->m_joysticks.Remove(0); | m_data->m_joysticks.Remove(0); | ||||
| } | } | ||||
| #endif | #endif | ||||
| @@ -139,19 +189,23 @@ void SdlInput::TickDraw(float seconds) | |||||
| void SdlInputData::Tick(float seconds) | void SdlInputData::Tick(float seconds) | ||||
| { | { | ||||
| #if USE_SDL | #if USE_SDL | ||||
| /* Handle mouse input */ | |||||
| ivec2 mouse = SdlInputData::GetMousePos();; | |||||
| Input::SetMousePos(mouse); | |||||
| /* Pump all joystick events because no event is coming to us. */ | /* Pump all joystick events because no event is coming to us. */ | ||||
| # if SDL_FORCE_POLL_JOYSTICK && !EMSCRIPTEN | # if SDL_FORCE_POLL_JOYSTICK && !EMSCRIPTEN | ||||
| SDL_JoystickUpdate(); | SDL_JoystickUpdate(); | ||||
| for (int j = 0; j < m_joysticks.Count(); j++) | for (int j = 0; j < m_joysticks.Count(); j++) | ||||
| { | { | ||||
| # ifdef LOL_INPUT_V2 | |||||
| for (int i = 0; i < SDL_JoystickNumButtons(m_joysticks[j].m1); i++) | |||||
| m_joysticks[j].m2->SetKey(i, SDL_JoystickGetButton(m_joysticks[j].m1, i) != 0); | |||||
| for (int i = 0; i < SDL_JoystickNumAxes(m_joysticks[j].m1); i++) | |||||
| m_joysticks[j].m2->SetAxis(i, (float)SDL_JoystickGetAxis(m_joysticks[j].m1, i) / 32768.f); | |||||
| # else // !LOL_INPUT_V2 | |||||
| for (int i = 0; i < SDL_JoystickNumButtons(m_joysticks[j].m1); i++) | for (int i = 0; i < SDL_JoystickNumButtons(m_joysticks[j].m1); i++) | ||||
| m_joysticks[j].m2->SetButton(i, SDL_JoystickGetButton(m_joysticks[j].m1, i)); | m_joysticks[j].m2->SetButton(i, SDL_JoystickGetButton(m_joysticks[j].m1, i)); | ||||
| for (int i = 0; i < SDL_JoystickNumAxes(m_joysticks[j].m1); i++) | for (int i = 0; i < SDL_JoystickNumAxes(m_joysticks[j].m1); i++) | ||||
| m_joysticks[j].m2->SetAxis(i, (float)SDL_JoystickGetAxis(m_joysticks[j].m1, i) / 32768.f); | m_joysticks[j].m2->SetAxis(i, (float)SDL_JoystickGetAxis(m_joysticks[j].m1, i) / 32768.f); | ||||
| # endif | |||||
| } | } | ||||
| # endif | # endif | ||||
| @@ -173,17 +227,28 @@ void SdlInputData::Tick(float seconds) | |||||
| case SDL_MOUSEBUTTONDOWN: | case SDL_MOUSEBUTTONDOWN: | ||||
| case SDL_MOUSEBUTTONUP: | case SDL_MOUSEBUTTONUP: | ||||
| { | { | ||||
| ivec2 newmouse = SdlInputData::GetMousePos(); | |||||
| if (newmouse != mouse) | |||||
| Input::SetMousePos(mouse = newmouse); | |||||
| #ifdef LOL_INPUT_V2 | |||||
| m_mouse->SetKey(event.button.button - 1, event.type == SDL_MOUSEBUTTONDOWN); | |||||
| #else // !LOL_INPUT_V2 | |||||
| if (event.type == SDL_MOUSEBUTTONDOWN) | if (event.type == SDL_MOUSEBUTTONDOWN) | ||||
| Input::SetMouseButton(event.button.button - 1); | Input::SetMouseButton(event.button.button - 1); | ||||
| else | else | ||||
| Input::UnsetMouseButton(event.button.button - 1); | Input::UnsetMouseButton(event.button.button - 1); | ||||
| #endif // LOL_INPUT_V2 | |||||
| break; | break; | ||||
| } | } | ||||
| # if !SDL_FORCE_POLL_JOYSTICK | # if !SDL_FORCE_POLL_JOYSTICK | ||||
| # ifdef LOL_INPUT_V2 | |||||
| case SDL_JOYAXISMOTION: | |||||
| m_joysticks[event.jaxis.which].m2->SetAxis(event.jaxis.axis, (float)event.jaxis.value / 32768.f); | |||||
| break; | |||||
| case SDL_JOYBUTTONUP: | |||||
| case SDL_JOYBUTTONDOWN: | |||||
| m_joysticks[event.jbutton.which].m2->SetKey(event.jbutton.button, event.jbutton.state); | |||||
| break; | |||||
| # else // !LOL_INPUT_V2 | |||||
| case SDL_JOYAXISMOTION: | case SDL_JOYAXISMOTION: | ||||
| m_joysticks[event.jaxis.which].m2->SetAxis(event.jaxis.axis, (float)event.jaxis.value / 32768.f); | m_joysticks[event.jaxis.which].m2->SetAxis(event.jaxis.axis, (float)event.jaxis.value / 32768.f); | ||||
| break; | break; | ||||
| @@ -192,12 +257,40 @@ void SdlInputData::Tick(float seconds) | |||||
| case SDL_JOYBUTTONDOWN: | case SDL_JOYBUTTONDOWN: | ||||
| m_joysticks[event.jbutton.which].m2->SetButton(event.jbutton.button, event.jbutton.state); | m_joysticks[event.jbutton.which].m2->SetButton(event.jbutton.button, event.jbutton.state); | ||||
| break; | break; | ||||
| # endif // LOL_INPUT_V2 | |||||
| # endif | # endif | ||||
| } | } | ||||
| } | } | ||||
| /* Send the whole keyboard state to the input system */ | |||||
| Array<uint8_t> &lolstate = Input::GetKeyboardState(); | |||||
| /* Handle mouse input */ | |||||
| ivec2 mouse = SdlInputData::GetMousePos(); | |||||
| # ifdef LOL_INPUT_V2 | |||||
| if (InputDeviceInternal::GetMouseCapture() != m_mousecapture) | |||||
| { | |||||
| m_mousecapture = InputDeviceInternal::GetMouseCapture(); | |||||
| SDL_WM_GrabInput(m_mousecapture ? SDL_GRAB_ON : SDL_GRAB_OFF); | |||||
| //SDL_ShowCursor(m_mousecapture ? SDL_DISABLE : SDL_ENABLE); | |||||
| } | |||||
| if (mouse.x >= 0 && mouse.x < m_app_w && mouse.y >= 0 && mouse.y < m_app_h) | |||||
| { | |||||
| m_mouse->SetCursor(0, vec2((float)(mouse.x) / m_app_w, (float)(mouse.y) / m_app_h), mouse); | |||||
| // Note: 100.0f is an arbitrary value that makes it feel about the same than an xbox controller joystick | |||||
| m_mouse->SetAxis(0, (float)(mouse.x - m_prevmouse.x) * 100.0f / m_screen_w); | |||||
| m_mouse->SetAxis(1, (float)(mouse.y - m_prevmouse.y) * 100.0f / m_screen_h); | |||||
| } | |||||
| if (m_mousecapture) | |||||
| { | |||||
| mouse = ivec2((int)m_app_w / 2, (int)m_app_h / 2); | |||||
| SdlInputData::SetMousePos(mouse); | |||||
| } | |||||
| m_prevmouse = mouse; | |||||
| # else // !LOL_INPUT_V2 | |||||
| Input::SetMousePos(mouse); | |||||
| # endif // LOL_INPUT_V2 | |||||
| # if SDL_VERSION_ATLEAST(1,3,0) | # if SDL_VERSION_ATLEAST(1,3,0) | ||||
| Uint8 *sdlstate = SDL_GetKeyboardState(nullptr); | Uint8 *sdlstate = SDL_GetKeyboardState(nullptr); | ||||
| @@ -205,6 +298,19 @@ void SdlInputData::Tick(float seconds) | |||||
| Uint8 *sdlstate = SDL_GetKeyState(nullptr); | Uint8 *sdlstate = SDL_GetKeyState(nullptr); | ||||
| # endif | # endif | ||||
| int keyindex = 0; | |||||
| # ifdef LOL_INPUT_V2 | |||||
| # define KEY_FUNC(name, index) m_keyboard->SetKey(keyindex++, sdlstate[index] != 0); | |||||
| # if !defined SDLK_WORLD_0 | |||||
| # define KEY_DISABLE_WORLD | |||||
| # endif // !SDLK_WORLD_0 | |||||
| # include "input/keys.h" | |||||
| # undef KEY_FUNC | |||||
| # else // !LOL_INPUT_V2 | |||||
| /* Send the whole keyboard state to the input system */ | |||||
| Array<uint8_t> &lolstate = Input::GetKeyboardState(); | |||||
| lolstate[Key::Unknown] = sdlstate[SDLK_UNKNOWN]; | lolstate[Key::Unknown] = sdlstate[SDLK_UNKNOWN]; | ||||
| lolstate[Key::Backspace] = sdlstate[SDLK_BACKSPACE]; | lolstate[Key::Backspace] = sdlstate[SDLK_BACKSPACE]; | ||||
| lolstate[Key::Tab] = sdlstate[SDLK_TAB]; | lolstate[Key::Tab] = sdlstate[SDLK_TAB]; | ||||
| @@ -376,7 +482,7 @@ void SdlInputData::Tick(float seconds) | |||||
| lolstate[Key::World93] = sdlstate[SDLK_WORLD_93]; | lolstate[Key::World93] = sdlstate[SDLK_WORLD_93]; | ||||
| lolstate[Key::World94] = sdlstate[SDLK_WORLD_94]; | lolstate[Key::World94] = sdlstate[SDLK_WORLD_94]; | ||||
| lolstate[Key::World95] = sdlstate[SDLK_WORLD_95]; | lolstate[Key::World95] = sdlstate[SDLK_WORLD_95]; | ||||
| #endif | |||||
| #endif // SDLK_WORLD_0 | |||||
| lolstate[Key::KP0] = sdlstate[SDLK_KP0]; | lolstate[Key::KP0] = sdlstate[SDLK_KP0]; | ||||
| lolstate[Key::KP1] = sdlstate[SDLK_KP1]; | lolstate[Key::KP1] = sdlstate[SDLK_KP1]; | ||||
| @@ -448,7 +554,9 @@ void SdlInputData::Tick(float seconds) | |||||
| lolstate[Key::Undo] = sdlstate[SDLK_UNDO]; | lolstate[Key::Undo] = sdlstate[SDLK_UNDO]; | ||||
| UNUSED(seconds); | UNUSED(seconds); | ||||
| #endif | |||||
| # endif // LOL_INPUT_V2 | |||||
| #endif // USE_SDL | |||||
| } | } | ||||
| ivec2 SdlInputData::GetMousePos() | ivec2 SdlInputData::GetMousePos() | ||||
| @@ -467,5 +575,10 @@ ivec2 SdlInputData::GetMousePos() | |||||
| return ret; | return ret; | ||||
| } | } | ||||
| void SdlInputData::SetMousePos(ivec2 position) | |||||
| { | |||||
| SDL_WarpMouse((uint16_t)position.x, (uint16_t)position.y); | |||||
| } | |||||
| } /* namespace lol */ | } /* namespace lol */ | ||||
| @@ -26,8 +26,14 @@ class SdlInputData; | |||||
| class SdlInput : public Entity | class SdlInput : public Entity | ||||
| { | { | ||||
| public: | public: | ||||
| #ifdef LOL_INPUT_V2 | |||||
| /** passing the screen resolution (note: not the windowed app resolution!) allows to make the mouse axis resolution-independent */ | |||||
| SdlInput(int app_w, int app_h, int screen_w, int screen_h); | |||||
| #else | |||||
| SdlInput(); | SdlInput(); | ||||
| #endif | |||||
| virtual ~SdlInput(); | virtual ~SdlInput(); | ||||
| void SetScreenResolution(); | |||||
| protected: | protected: | ||||
| virtual void TickGame(float seconds); | virtual void TickGame(float seconds); | ||||