A serious refactor. Moved the entire window management process to another thread. Made a plotting interface with DLL exports. Refactored camera and changed transformation approach based on Jordan's suggestions
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
# Visual Studio Version 17
|
# Visual Studio Version 17
|
||||||
VisualStudioVersion = 17.12.35707.178 d17.12
|
VisualStudioVersion = 17.12.35707.178
|
||||||
MinimumVisualStudioVersion = 10.0.40219.1
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "LivePlotter", "LivePlotter.vcxproj", "{74C0F84F-216F-4A12-9F91-6AFC83CF9257}"
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "LivePlotter", "LivePlotter.vcxproj", "{74C0F84F-216F-4A12-9F91-6AFC83CF9257}"
|
||||||
EndProject
|
EndProject
|
||||||
@@ -9,6 +9,8 @@ Global
|
|||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|x64 = Debug|x64
|
Debug|x64 = Debug|x64
|
||||||
Debug|x86 = Debug|x86
|
Debug|x86 = Debug|x86
|
||||||
|
DLLDebug|x64 = DLLDebug|x64
|
||||||
|
DLLDebug|x86 = DLLDebug|x86
|
||||||
Release|x64 = Release|x64
|
Release|x64 = Release|x64
|
||||||
Release|x86 = Release|x86
|
Release|x86 = Release|x86
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
@@ -17,6 +19,10 @@ Global
|
|||||||
{74C0F84F-216F-4A12-9F91-6AFC83CF9257}.Debug|x64.Build.0 = Debug|x64
|
{74C0F84F-216F-4A12-9F91-6AFC83CF9257}.Debug|x64.Build.0 = Debug|x64
|
||||||
{74C0F84F-216F-4A12-9F91-6AFC83CF9257}.Debug|x86.ActiveCfg = Debug|Win32
|
{74C0F84F-216F-4A12-9F91-6AFC83CF9257}.Debug|x86.ActiveCfg = Debug|Win32
|
||||||
{74C0F84F-216F-4A12-9F91-6AFC83CF9257}.Debug|x86.Build.0 = Debug|Win32
|
{74C0F84F-216F-4A12-9F91-6AFC83CF9257}.Debug|x86.Build.0 = Debug|Win32
|
||||||
|
{74C0F84F-216F-4A12-9F91-6AFC83CF9257}.DLLDebug|x64.ActiveCfg = DebugDLL|x64
|
||||||
|
{74C0F84F-216F-4A12-9F91-6AFC83CF9257}.DLLDebug|x64.Build.0 = DebugDLL|x64
|
||||||
|
{74C0F84F-216F-4A12-9F91-6AFC83CF9257}.DLLDebug|x86.ActiveCfg = DebugDLL|Win32
|
||||||
|
{74C0F84F-216F-4A12-9F91-6AFC83CF9257}.DLLDebug|x86.Build.0 = DebugDLL|Win32
|
||||||
{74C0F84F-216F-4A12-9F91-6AFC83CF9257}.Release|x64.ActiveCfg = Release|x64
|
{74C0F84F-216F-4A12-9F91-6AFC83CF9257}.Release|x64.ActiveCfg = Release|x64
|
||||||
{74C0F84F-216F-4A12-9F91-6AFC83CF9257}.Release|x64.Build.0 = Release|x64
|
{74C0F84F-216F-4A12-9F91-6AFC83CF9257}.Release|x64.Build.0 = Release|x64
|
||||||
{74C0F84F-216F-4A12-9F91-6AFC83CF9257}.Release|x86.ActiveCfg = Release|Win32
|
{74C0F84F-216F-4A12-9F91-6AFC83CF9257}.Release|x86.ActiveCfg = Release|Win32
|
||||||
@@ -25,4 +31,7 @@ Global
|
|||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
|
SolutionGuid = {C971CF76-7BA3-45CC-A602-A49CCD685470}
|
||||||
|
EndGlobalSection
|
||||||
EndGlobal
|
EndGlobal
|
||||||
|
|||||||
@@ -1,6 +1,14 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
<ItemGroup Label="ProjectConfigurations">
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
|
<ProjectConfiguration Include="DebugDLL|Win32">
|
||||||
|
<Configuration>DebugDLL</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="DebugDLL|x64">
|
||||||
|
<Configuration>DebugDLL</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
<ProjectConfiguration Include="Debug|Win32">
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
<Configuration>Debug</Configuration>
|
<Configuration>Debug</Configuration>
|
||||||
<Platform>Win32</Platform>
|
<Platform>Win32</Platform>
|
||||||
@@ -32,6 +40,12 @@
|
|||||||
<PlatformToolset>v143</PlatformToolset>
|
<PlatformToolset>v143</PlatformToolset>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugDLL|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v143</PlatformToolset>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
<UseDebugLibraries>false</UseDebugLibraries>
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
@@ -45,6 +59,12 @@
|
|||||||
<PlatformToolset>v143</PlatformToolset>
|
<PlatformToolset>v143</PlatformToolset>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugDLL|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v143</PlatformToolset>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
<UseDebugLibraries>false</UseDebugLibraries>
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
@@ -60,12 +80,18 @@
|
|||||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
</ImportGroup>
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugDLL|Win32'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
</ImportGroup>
|
</ImportGroup>
|
||||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
</ImportGroup>
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugDLL|x64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
</ImportGroup>
|
</ImportGroup>
|
||||||
@@ -77,6 +103,13 @@
|
|||||||
<IntDir>$(SolutionDir)obj\$(Platform)\$(Configuration)\</IntDir>
|
<IntDir>$(SolutionDir)obj\$(Platform)\$(Configuration)\</IntDir>
|
||||||
<SourcePath>$(SolutionDir)src;$(SourcePath)</SourcePath>
|
<SourcePath>$(SolutionDir)src;$(SourcePath)</SourcePath>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugDLL|x64'">
|
||||||
|
<LibraryPath>$(SolutionDir)lib;$(SolutionDir)ext\pthreads4w-code\build\Debug;$(SolutionDir)ext\glfw\build\src\Debug;$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64)</LibraryPath>
|
||||||
|
<IncludePath>$(SolutionDir)ext\pthreads4w-code;$(SolutionDir)ext\glm;$(SolutionDir)ext\glfw\include;$(SolutionDir)inc;$(IncludePath)</IncludePath>
|
||||||
|
<OutDir>$(SolutionDir)bin\$(Platform)\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)obj\$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
<SourcePath>$(SolutionDir)src;$(SourcePath)</SourcePath>
|
||||||
|
</PropertyGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
<ClCompile>
|
<ClCompile>
|
||||||
<WarningLevel>Level3</WarningLevel>
|
<WarningLevel>Level3</WarningLevel>
|
||||||
@@ -89,6 +122,18 @@
|
|||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugDLL|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
<ClCompile>
|
<ClCompile>
|
||||||
<WarningLevel>Level3</WarningLevel>
|
<WarningLevel>Level3</WarningLevel>
|
||||||
@@ -122,6 +167,23 @@
|
|||||||
<Command>xcopy /y "$(SolutionDir)poses.csv" "$(OutDir)" && xcopy /y "$(SolutionDir)ext\pthreads4w-code\build\Debug\pthreadVC3d.dll" "$(OutDir)"</Command>
|
<Command>xcopy /y "$(SolutionDir)poses.csv" "$(OutDir)" && xcopy /y "$(SolutionDir)ext\pthreads4w-code\build\Debug\pthreadVC3d.dll" "$(OutDir)"</Command>
|
||||||
</PostBuildEvent>
|
</PostBuildEvent>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugDLL|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
<LanguageStandard>stdcpp20</LanguageStandard>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<AdditionalDependencies>ext\pthreads4w-code\build\Debug\pthreadVC3d.lib;glfw3.lib;opengl32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
</Link>
|
||||||
|
<PostBuildEvent>
|
||||||
|
<Command>xcopy /y "$(SolutionDir)poses.csv" "$(OutDir)" && xcopy /y "$(SolutionDir)ext\pthreads4w-code\build\Debug\pthreadVC3d.dll" "$(OutDir)"</Command>
|
||||||
|
</PostBuildEvent>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
<ClCompile>
|
<ClCompile>
|
||||||
<WarningLevel>Level3</WarningLevel>
|
<WarningLevel>Level3</WarningLevel>
|
||||||
@@ -140,8 +202,10 @@
|
|||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="src\body.cpp" />
|
<ClCompile Include="src\body.cpp" />
|
||||||
|
<ClCompile Include="src\camera.cpp" />
|
||||||
<ClCompile Include="src\camera_poses.cpp" />
|
<ClCompile Include="src\camera_poses.cpp" />
|
||||||
<ClCompile Include="src\glad.c" />
|
<ClCompile Include="src\glad.c" />
|
||||||
|
<ClCompile Include="src\live_plotter.cpp" />
|
||||||
<ClCompile Include="src\main.cpp" />
|
<ClCompile Include="src\main.cpp" />
|
||||||
<ClCompile Include="src\shaders.cpp" />
|
<ClCompile Include="src\shaders.cpp" />
|
||||||
<ClCompile Include="src\util.cpp" />
|
<ClCompile Include="src\util.cpp" />
|
||||||
|
|||||||
@@ -33,5 +33,11 @@
|
|||||||
<ClCompile Include="src\camera_poses.cpp">
|
<ClCompile Include="src\camera_poses.cpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="src\camera.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="src\live_plotter.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
@@ -3,4 +3,7 @@
|
|||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
|
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugDLL|x64'">
|
||||||
|
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
|
||||||
|
</PropertyGroup>
|
||||||
</Project>
|
</Project>
|
||||||
@@ -1,37 +1,49 @@
|
|||||||
[
|
[
|
||||||
{
|
{
|
||||||
"directory": "C:/Users/sethh/Documents/repos/LivePlotter/",
|
"directory": "C:/Users/seth/Documents/repos/LivePlotter/",
|
||||||
"command": "\"C:/Users/sethh/AppData/Roaming/ClangPowerTools/LLVM_Lite/Bin/clang++.exe\" -x c++ \"C:/Users/sethh/Documents/repos/LivePlotter/src/shaders.cpp\" -std=c++20 -Wall -fms-compatibility-version=19.10 -Wmicrosoft -Wno-invalid-token-paste -Wno-unknown-pragmas -Wno-unused-value -fsyntax-only \"-DUNICODE\" \"-D_UNICODE\" \"-D_MT\" \"-D_DLL\" \"-D_DEBUG\" \"-D_CONSOLE\" \"-D_DEBUG_FUNCTIONAL_MACHINERY\" -isystem\"C:/Program Files/Microsoft Visual Studio/2022/Community/VC/include\" -isystem\"C:/Program Files/Microsoft Visual Studio/2022/Community/VC/atlmfc/include\" -isystem\"C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Auxiliary/VS/include\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.22621.0/ucrt\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.22621.0/um\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.22621.0/shared\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.22621.0/winrt\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.22621.0/cppwinrt\" -isystem\"C:/Users/sethh/Documents/repos/LivePlotter/ext/pthreads4w-code\" -isystem\"C:/Users/sethh/Documents/repos/LivePlotter/ext/glm\" -isystem\"C:/Users/sethh/Documents/repos/LivePlotter/ext/glfw/include\" -isystem\"C:/Users/sethh/Documents/repos/LivePlotter/inc\"",
|
"command": "\"C:/Users/seth/AppData/Roaming/ClangPowerTools/LLVM_Lite/Bin/clang++.exe\" -x c++ \"C:/Users/seth/Documents/repos/LivePlotter/src/util.cpp\" -std=c++20 -Wall -fms-compatibility-version=19.10 -Wmicrosoft -Wno-invalid-token-paste -Wno-unknown-pragmas -Wno-unused-value -fsyntax-only \"-DUNICODE\" \"-D_UNICODE\" \"-D_MT\" \"-D_DLL\" \"-D_DEBUG\" \"-D_CONSOLE\" \"-D_DEBUG_FUNCTIONAL_MACHINERY\" -isystem\"C:/Program Files (x86)/Microsoft Visual Studio/2022/BuildTools/VC/include\" -isystem\"C:/Program Files (x86)/Microsoft Visual Studio/2022/BuildTools/VC/atlmfc/include\" -isystem\"C:/Program Files (x86)/Microsoft Visual Studio/2022/BuildTools/VC/Auxiliary/VS/include\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.26100.0/ucrt\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.26100.0/um\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.26100.0/shared\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.26100.0/winrt\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.26100.0/cppwinrt\" -isystem\"C:/Users/seth/Documents/repos/LivePlotter/ext/pthreads4w-code\" -isystem\"C:/Users/seth/Documents/repos/LivePlotter/ext/glm\" -isystem\"C:/Users/seth/Documents/repos/LivePlotter/ext/glfw/include\" -isystem\"C:/Users/seth/Documents/repos/LivePlotter/inc\"",
|
||||||
"file": "C:/Users/sethh/Documents/repos/LivePlotter/src/shaders.cpp"
|
"file": "C:/Users/seth/Documents/repos/LivePlotter/src/util.cpp"
|
||||||
}
|
}
|
||||||
,
|
,
|
||||||
{
|
{
|
||||||
"directory": "C:/Users/sethh/Documents/repos/LivePlotter/",
|
"directory": "C:/Users/seth/Documents/repos/LivePlotter/",
|
||||||
"command": "\"C:/Users/sethh/AppData/Roaming/ClangPowerTools/LLVM_Lite/Bin/clang++.exe\" -x c++ \"C:/Users/sethh/Documents/repos/LivePlotter/src/main.cpp\" -std=c++20 -Wall -fms-compatibility-version=19.10 -Wmicrosoft -Wno-invalid-token-paste -Wno-unknown-pragmas -Wno-unused-value -fsyntax-only \"-DUNICODE\" \"-D_UNICODE\" \"-D_MT\" \"-D_DLL\" \"-D_DEBUG\" \"-D_CONSOLE\" \"-D_DEBUG_FUNCTIONAL_MACHINERY\" -isystem\"C:/Program Files/Microsoft Visual Studio/2022/Community/VC/include\" -isystem\"C:/Program Files/Microsoft Visual Studio/2022/Community/VC/atlmfc/include\" -isystem\"C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Auxiliary/VS/include\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.22621.0/ucrt\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.22621.0/um\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.22621.0/shared\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.22621.0/winrt\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.22621.0/cppwinrt\" -isystem\"C:/Users/sethh/Documents/repos/LivePlotter/ext/pthreads4w-code\" -isystem\"C:/Users/sethh/Documents/repos/LivePlotter/ext/glm\" -isystem\"C:/Users/sethh/Documents/repos/LivePlotter/ext/glfw/include\" -isystem\"C:/Users/sethh/Documents/repos/LivePlotter/inc\"",
|
"command": "\"C:/Users/seth/AppData/Roaming/ClangPowerTools/LLVM_Lite/Bin/clang++.exe\" -x c++ \"C:/Users/seth/Documents/repos/LivePlotter/src/camera_poses.cpp\" -std=c++20 -Wall -fms-compatibility-version=19.10 -Wmicrosoft -Wno-invalid-token-paste -Wno-unknown-pragmas -Wno-unused-value -fsyntax-only \"-DUNICODE\" \"-D_UNICODE\" \"-D_MT\" \"-D_DLL\" \"-D_DEBUG\" \"-D_CONSOLE\" \"-D_DEBUG_FUNCTIONAL_MACHINERY\" -isystem\"C:/Program Files (x86)/Microsoft Visual Studio/2022/BuildTools/VC/include\" -isystem\"C:/Program Files (x86)/Microsoft Visual Studio/2022/BuildTools/VC/atlmfc/include\" -isystem\"C:/Program Files (x86)/Microsoft Visual Studio/2022/BuildTools/VC/Auxiliary/VS/include\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.26100.0/ucrt\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.26100.0/um\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.26100.0/shared\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.26100.0/winrt\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.26100.0/cppwinrt\" -isystem\"C:/Users/seth/Documents/repos/LivePlotter/ext/pthreads4w-code\" -isystem\"C:/Users/seth/Documents/repos/LivePlotter/ext/glm\" -isystem\"C:/Users/seth/Documents/repos/LivePlotter/ext/glfw/include\" -isystem\"C:/Users/seth/Documents/repos/LivePlotter/inc\"",
|
||||||
"file": "C:/Users/sethh/Documents/repos/LivePlotter/src/main.cpp"
|
"file": "C:/Users/seth/Documents/repos/LivePlotter/src/camera_poses.cpp"
|
||||||
}
|
}
|
||||||
,
|
,
|
||||||
{
|
{
|
||||||
"directory": "C:/Users/sethh/Documents/repos/LivePlotter/",
|
"directory": "C:/Users/seth/Documents/repos/LivePlotter/",
|
||||||
"command": "\"C:/Users/sethh/AppData/Roaming/ClangPowerTools/LLVM_Lite/Bin/clang++.exe\" -x c++ \"C:/Users/sethh/Documents/repos/LivePlotter/src/util.cpp\" -std=c++20 -Wall -fms-compatibility-version=19.10 -Wmicrosoft -Wno-invalid-token-paste -Wno-unknown-pragmas -Wno-unused-value -fsyntax-only \"-DUNICODE\" \"-D_UNICODE\" \"-D_MT\" \"-D_DLL\" \"-D_DEBUG\" \"-D_CONSOLE\" \"-D_DEBUG_FUNCTIONAL_MACHINERY\" -isystem\"C:/Program Files/Microsoft Visual Studio/2022/Community/VC/include\" -isystem\"C:/Program Files/Microsoft Visual Studio/2022/Community/VC/atlmfc/include\" -isystem\"C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Auxiliary/VS/include\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.22621.0/ucrt\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.22621.0/um\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.22621.0/shared\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.22621.0/winrt\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.22621.0/cppwinrt\" -isystem\"C:/Users/sethh/Documents/repos/LivePlotter/ext/pthreads4w-code\" -isystem\"C:/Users/sethh/Documents/repos/LivePlotter/ext/glm\" -isystem\"C:/Users/sethh/Documents/repos/LivePlotter/ext/glfw/include\" -isystem\"C:/Users/sethh/Documents/repos/LivePlotter/inc\"",
|
"command": "\"C:/Users/seth/AppData/Roaming/ClangPowerTools/LLVM_Lite/Bin/clang++.exe\" -x c++ \"C:/Users/seth/Documents/repos/LivePlotter/src/shaders.cpp\" -std=c++20 -Wall -fms-compatibility-version=19.10 -Wmicrosoft -Wno-invalid-token-paste -Wno-unknown-pragmas -Wno-unused-value -fsyntax-only \"-DUNICODE\" \"-D_UNICODE\" \"-D_MT\" \"-D_DLL\" \"-D_DEBUG\" \"-D_CONSOLE\" \"-D_DEBUG_FUNCTIONAL_MACHINERY\" -isystem\"C:/Program Files (x86)/Microsoft Visual Studio/2022/BuildTools/VC/include\" -isystem\"C:/Program Files (x86)/Microsoft Visual Studio/2022/BuildTools/VC/atlmfc/include\" -isystem\"C:/Program Files (x86)/Microsoft Visual Studio/2022/BuildTools/VC/Auxiliary/VS/include\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.26100.0/ucrt\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.26100.0/um\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.26100.0/shared\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.26100.0/winrt\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.26100.0/cppwinrt\" -isystem\"C:/Users/seth/Documents/repos/LivePlotter/ext/pthreads4w-code\" -isystem\"C:/Users/seth/Documents/repos/LivePlotter/ext/glm\" -isystem\"C:/Users/seth/Documents/repos/LivePlotter/ext/glfw/include\" -isystem\"C:/Users/seth/Documents/repos/LivePlotter/inc\"",
|
||||||
"file": "C:/Users/sethh/Documents/repos/LivePlotter/src/util.cpp"
|
"file": "C:/Users/seth/Documents/repos/LivePlotter/src/shaders.cpp"
|
||||||
}
|
}
|
||||||
,
|
,
|
||||||
{
|
{
|
||||||
"directory": "C:/Users/sethh/Documents/repos/LivePlotter/",
|
"directory": "C:/Users/seth/Documents/repos/LivePlotter/",
|
||||||
"command": "\"C:/Users/sethh/AppData/Roaming/ClangPowerTools/LLVM_Lite/Bin/clang++.exe\" -x c++ \"C:/Users/sethh/Documents/repos/LivePlotter/src/tcp_server.cpp\" -std=c++20 -Wall -fms-compatibility-version=19.10 -Wmicrosoft -Wno-invalid-token-paste -Wno-unknown-pragmas -Wno-unused-value -fsyntax-only \"-DUNICODE\" \"-D_UNICODE\" \"-D_MT\" \"-D_DLL\" \"-D_DEBUG\" \"-D_CONSOLE\" \"-D_DEBUG_FUNCTIONAL_MACHINERY\" -isystem\"C:/Program Files/Microsoft Visual Studio/2022/Community/VC/include\" -isystem\"C:/Program Files/Microsoft Visual Studio/2022/Community/VC/atlmfc/include\" -isystem\"C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Auxiliary/VS/include\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.22621.0/ucrt\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.22621.0/um\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.22621.0/shared\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.22621.0/winrt\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.22621.0/cppwinrt\" -isystem\"C:/Users/sethh/Documents/repos/LivePlotter/ext/pthreads4w-code\" -isystem\"C:/Users/sethh/Documents/repos/LivePlotter/ext/glm\" -isystem\"C:/Users/sethh/Documents/repos/LivePlotter/ext/glfw/include\" -isystem\"C:/Users/sethh/Documents/repos/LivePlotter/inc\"",
|
"command": "\"C:/Users/seth/AppData/Roaming/ClangPowerTools/LLVM_Lite/Bin/clang++.exe\" -x c++ \"C:/Users/seth/Documents/repos/LivePlotter/src/body.cpp\" -std=c++20 -Wall -fms-compatibility-version=19.10 -Wmicrosoft -Wno-invalid-token-paste -Wno-unknown-pragmas -Wno-unused-value -fsyntax-only \"-DUNICODE\" \"-D_UNICODE\" \"-D_MT\" \"-D_DLL\" \"-D_DEBUG\" \"-D_CONSOLE\" \"-D_DEBUG_FUNCTIONAL_MACHINERY\" -isystem\"C:/Program Files (x86)/Microsoft Visual Studio/2022/BuildTools/VC/include\" -isystem\"C:/Program Files (x86)/Microsoft Visual Studio/2022/BuildTools/VC/atlmfc/include\" -isystem\"C:/Program Files (x86)/Microsoft Visual Studio/2022/BuildTools/VC/Auxiliary/VS/include\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.26100.0/ucrt\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.26100.0/um\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.26100.0/shared\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.26100.0/winrt\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.26100.0/cppwinrt\" -isystem\"C:/Users/seth/Documents/repos/LivePlotter/ext/pthreads4w-code\" -isystem\"C:/Users/seth/Documents/repos/LivePlotter/ext/glm\" -isystem\"C:/Users/seth/Documents/repos/LivePlotter/ext/glfw/include\" -isystem\"C:/Users/seth/Documents/repos/LivePlotter/inc\"",
|
||||||
"file": "C:/Users/sethh/Documents/repos/LivePlotter/src/tcp_server.cpp"
|
"file": "C:/Users/seth/Documents/repos/LivePlotter/src/body.cpp"
|
||||||
}
|
}
|
||||||
,
|
,
|
||||||
{
|
{
|
||||||
"directory": "C:/Users/sethh/Documents/repos/LivePlotter/",
|
"directory": "C:/Users/seth/Documents/repos/LivePlotter/",
|
||||||
"command": "\"C:/Users/sethh/AppData/Roaming/ClangPowerTools/LLVM_Lite/Bin/clang++.exe\" -x c \"C:/Users/sethh/Documents/repos/LivePlotter/src/glad.c\" -Wall -fms-compatibility-version=19.10 -Wmicrosoft -Wno-invalid-token-paste -Wno-unknown-pragmas -Wno-unused-value -fsyntax-only \"-DUNICODE\" \"-D_UNICODE\" \"-D_MT\" \"-D_DLL\" \"-D_DEBUG\" \"-D_CONSOLE\" \"-D_DEBUG_FUNCTIONAL_MACHINERY\" -isystem\"C:/Program Files/Microsoft Visual Studio/2022/Community/VC/include\" -isystem\"C:/Program Files/Microsoft Visual Studio/2022/Community/VC/atlmfc/include\" -isystem\"C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Auxiliary/VS/include\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.22621.0/ucrt\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.22621.0/um\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.22621.0/shared\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.22621.0/winrt\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.22621.0/cppwinrt\" -isystem\"C:/Users/sethh/Documents/repos/LivePlotter/ext/pthreads4w-code\" -isystem\"C:/Users/sethh/Documents/repos/LivePlotter/ext/glm\" -isystem\"C:/Users/sethh/Documents/repos/LivePlotter/ext/glfw/include\" -isystem\"C:/Users/sethh/Documents/repos/LivePlotter/inc\"",
|
"command": "\"C:/Users/seth/AppData/Roaming/ClangPowerTools/LLVM_Lite/Bin/clang++.exe\" -x c++ \"C:/Users/seth/Documents/repos/LivePlotter/src/live_plotter.cpp\" -std=c++20 -Wall -fms-compatibility-version=19.10 -Wmicrosoft -Wno-invalid-token-paste -Wno-unknown-pragmas -Wno-unused-value -fsyntax-only \"-DUNICODE\" \"-D_UNICODE\" \"-D_MT\" \"-D_DLL\" \"-D_DEBUG\" \"-D_CONSOLE\" \"-D_DEBUG_FUNCTIONAL_MACHINERY\" -isystem\"C:/Program Files (x86)/Microsoft Visual Studio/2022/BuildTools/VC/include\" -isystem\"C:/Program Files (x86)/Microsoft Visual Studio/2022/BuildTools/VC/atlmfc/include\" -isystem\"C:/Program Files (x86)/Microsoft Visual Studio/2022/BuildTools/VC/Auxiliary/VS/include\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.26100.0/ucrt\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.26100.0/um\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.26100.0/shared\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.26100.0/winrt\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.26100.0/cppwinrt\" -isystem\"C:/Users/seth/Documents/repos/LivePlotter/ext/pthreads4w-code\" -isystem\"C:/Users/seth/Documents/repos/LivePlotter/ext/glm\" -isystem\"C:/Users/seth/Documents/repos/LivePlotter/ext/glfw/include\" -isystem\"C:/Users/seth/Documents/repos/LivePlotter/inc\"",
|
||||||
"file": "C:/Users/sethh/Documents/repos/LivePlotter/src/glad.c"
|
"file": "C:/Users/seth/Documents/repos/LivePlotter/src/live_plotter.cpp"
|
||||||
}
|
}
|
||||||
,
|
,
|
||||||
{
|
{
|
||||||
"directory": "C:/Users/sethh/Documents/repos/LivePlotter/",
|
"directory": "C:/Users/seth/Documents/repos/LivePlotter/",
|
||||||
"command": "\"C:/Users/sethh/AppData/Roaming/ClangPowerTools/LLVM_Lite/Bin/clang++.exe\" -x c++ \"C:/Users/sethh/Documents/repos/LivePlotter/src/body.cpp\" -std=c++20 -Wall -fms-compatibility-version=19.10 -Wmicrosoft -Wno-invalid-token-paste -Wno-unknown-pragmas -Wno-unused-value -fsyntax-only \"-DUNICODE\" \"-D_UNICODE\" \"-D_MT\" \"-D_DLL\" \"-D_DEBUG\" \"-D_CONSOLE\" \"-D_DEBUG_FUNCTIONAL_MACHINERY\" -isystem\"C:/Program Files/Microsoft Visual Studio/2022/Community/VC/include\" -isystem\"C:/Program Files/Microsoft Visual Studio/2022/Community/VC/atlmfc/include\" -isystem\"C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Auxiliary/VS/include\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.22621.0/ucrt\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.22621.0/um\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.22621.0/shared\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.22621.0/winrt\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.22621.0/cppwinrt\" -isystem\"C:/Users/sethh/Documents/repos/LivePlotter/ext/pthreads4w-code\" -isystem\"C:/Users/sethh/Documents/repos/LivePlotter/ext/glm\" -isystem\"C:/Users/sethh/Documents/repos/LivePlotter/ext/glfw/include\" -isystem\"C:/Users/sethh/Documents/repos/LivePlotter/inc\"",
|
"command": "\"C:/Users/seth/AppData/Roaming/ClangPowerTools/LLVM_Lite/Bin/clang++.exe\" -x c++ \"C:/Users/seth/Documents/repos/LivePlotter/src/main.cpp\" -std=c++20 -Wall -fms-compatibility-version=19.10 -Wmicrosoft -Wno-invalid-token-paste -Wno-unknown-pragmas -Wno-unused-value -fsyntax-only \"-DUNICODE\" \"-D_UNICODE\" \"-D_MT\" \"-D_DLL\" \"-D_DEBUG\" \"-D_CONSOLE\" \"-D_DEBUG_FUNCTIONAL_MACHINERY\" -isystem\"C:/Program Files (x86)/Microsoft Visual Studio/2022/BuildTools/VC/include\" -isystem\"C:/Program Files (x86)/Microsoft Visual Studio/2022/BuildTools/VC/atlmfc/include\" -isystem\"C:/Program Files (x86)/Microsoft Visual Studio/2022/BuildTools/VC/Auxiliary/VS/include\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.26100.0/ucrt\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.26100.0/um\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.26100.0/shared\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.26100.0/winrt\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.26100.0/cppwinrt\" -isystem\"C:/Users/seth/Documents/repos/LivePlotter/ext/pthreads4w-code\" -isystem\"C:/Users/seth/Documents/repos/LivePlotter/ext/glm\" -isystem\"C:/Users/seth/Documents/repos/LivePlotter/ext/glfw/include\" -isystem\"C:/Users/seth/Documents/repos/LivePlotter/inc\"",
|
||||||
"file": "C:/Users/sethh/Documents/repos/LivePlotter/src/body.cpp"
|
"file": "C:/Users/seth/Documents/repos/LivePlotter/src/main.cpp"
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{
|
||||||
|
"directory": "C:/Users/seth/Documents/repos/LivePlotter/",
|
||||||
|
"command": "\"C:/Users/seth/AppData/Roaming/ClangPowerTools/LLVM_Lite/Bin/clang++.exe\" -x c \"C:/Users/seth/Documents/repos/LivePlotter/src/glad.c\" -Wall -fms-compatibility-version=19.10 -Wmicrosoft -Wno-invalid-token-paste -Wno-unknown-pragmas -Wno-unused-value -fsyntax-only \"-DUNICODE\" \"-D_UNICODE\" \"-D_MT\" \"-D_DLL\" \"-D_DEBUG\" \"-D_CONSOLE\" \"-D_DEBUG_FUNCTIONAL_MACHINERY\" -isystem\"C:/Program Files (x86)/Microsoft Visual Studio/2022/BuildTools/VC/include\" -isystem\"C:/Program Files (x86)/Microsoft Visual Studio/2022/BuildTools/VC/atlmfc/include\" -isystem\"C:/Program Files (x86)/Microsoft Visual Studio/2022/BuildTools/VC/Auxiliary/VS/include\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.26100.0/ucrt\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.26100.0/um\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.26100.0/shared\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.26100.0/winrt\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.26100.0/cppwinrt\" -isystem\"C:/Users/seth/Documents/repos/LivePlotter/ext/pthreads4w-code\" -isystem\"C:/Users/seth/Documents/repos/LivePlotter/ext/glm\" -isystem\"C:/Users/seth/Documents/repos/LivePlotter/ext/glfw/include\" -isystem\"C:/Users/seth/Documents/repos/LivePlotter/inc\"",
|
||||||
|
"file": "C:/Users/seth/Documents/repos/LivePlotter/src/glad.c"
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{
|
||||||
|
"directory": "C:/Users/seth/Documents/repos/LivePlotter/",
|
||||||
|
"command": "\"C:/Users/seth/AppData/Roaming/ClangPowerTools/LLVM_Lite/Bin/clang++.exe\" -x c++ \"C:/Users/seth/Documents/repos/LivePlotter/src/camera.cpp\" -std=c++20 -Wall -fms-compatibility-version=19.10 -Wmicrosoft -Wno-invalid-token-paste -Wno-unknown-pragmas -Wno-unused-value -fsyntax-only \"-DUNICODE\" \"-D_UNICODE\" \"-D_MT\" \"-D_DLL\" \"-D_DEBUG\" \"-D_CONSOLE\" \"-D_DEBUG_FUNCTIONAL_MACHINERY\" -isystem\"C:/Program Files (x86)/Microsoft Visual Studio/2022/BuildTools/VC/include\" -isystem\"C:/Program Files (x86)/Microsoft Visual Studio/2022/BuildTools/VC/atlmfc/include\" -isystem\"C:/Program Files (x86)/Microsoft Visual Studio/2022/BuildTools/VC/Auxiliary/VS/include\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.26100.0/ucrt\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.26100.0/um\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.26100.0/shared\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.26100.0/winrt\" -isystem\"C:/Program Files (x86)/Windows Kits/10/Include/10.0.26100.0/cppwinrt\" -isystem\"C:/Users/seth/Documents/repos/LivePlotter/ext/pthreads4w-code\" -isystem\"C:/Users/seth/Documents/repos/LivePlotter/ext/glm\" -isystem\"C:/Users/seth/Documents/repos/LivePlotter/ext/glfw/include\" -isystem\"C:/Users/seth/Documents/repos/LivePlotter/inc\"",
|
||||||
|
"file": "C:/Users/seth/Documents/repos/LivePlotter/src/camera.cpp"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
24
inc/camera.hpp
Normal file
24
inc/camera.hpp
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <glm/matrix.hpp>
|
||||||
|
|
||||||
|
struct Viewport {
|
||||||
|
float fov_degrees;
|
||||||
|
float width;
|
||||||
|
float height;
|
||||||
|
};
|
||||||
|
|
||||||
|
Viewport make_viewport(float win_w, float win_h, float fov_degrees);
|
||||||
|
glm::mat4 camera_to_projection(Viewport& v);
|
||||||
|
|
||||||
|
struct Camera {
|
||||||
|
glm::vec3 focus;
|
||||||
|
float theta, phi, distance;
|
||||||
|
};
|
||||||
|
|
||||||
|
Camera make_camera(glm::vec3 focus, float distance);
|
||||||
|
void pan_camera(Camera &c, glm::vec2 dxdy);
|
||||||
|
void rotate_camera(Camera &c, glm::vec2 dxdy);
|
||||||
|
void zoom_camera(Camera &c, float dz);
|
||||||
|
glm::mat4 world_to_camera(Camera& c);
|
||||||
|
glm::mat4 camera_to_world(Camera& c);
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "util.hpp"
|
#include "util.hpp"
|
||||||
#include "body.hpp"
|
|
||||||
|
|
||||||
bool parse_poses(Array<Body> *bodies_out, const char* filepath);
|
bool parse_poses(Array<glm::mat2x3>* locs_out, const char* filepath);
|
||||||
|
|||||||
12
inc/live_plotter.hpp
Normal file
12
inc/live_plotter.hpp
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
typedef unsigned long long pointid;
|
||||||
|
|
||||||
|
DllExport bool __cdecl start(int win_w, int win_h);
|
||||||
|
DllExport bool __cdecl stop();
|
||||||
|
DllExport pointid __cdecl create_point(float x, float y, float z);
|
||||||
|
DllExport void __cdecl set_color(pointid id, float r, float g, float b);
|
||||||
|
DllExport void __cdecl set_scale(pointid id, float scale);
|
||||||
|
DllExport void __cdecl update_point(pointid id, float x, float y, float z);
|
||||||
|
DllExport void __cdecl set_lifetime(pointid id, float new_lifetime_s);
|
||||||
|
DllExport void __cdecl clear_point(pointid id);
|
||||||
11
inc/util.hpp
11
inc/util.hpp
@@ -1,10 +1,12 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
#include <glm/ext/matrix_float4x4.hpp>
|
#include <glm/ext/matrix_float4x4.hpp>
|
||||||
#include <glm/ext/quaternion_float.hpp>
|
#include <glm/ext/quaternion_float.hpp>
|
||||||
#include <glm/ext/vector_float4.hpp>
|
#include <glm/ext/vector_float4.hpp>
|
||||||
#include <stdio.h>
|
|
||||||
|
#define DllExport __declspec( dllexport )
|
||||||
|
|
||||||
typedef unsigned int uint;
|
typedef unsigned int uint;
|
||||||
|
|
||||||
@@ -23,4 +25,9 @@ bool read_file(Array<char>* out, const char* filepath);
|
|||||||
Array<char*> split_str(const char* s, char delimiter);
|
Array<char*> split_str(const char* s, char delimiter);
|
||||||
Array<char*> split_str(const char* s);
|
Array<char*> split_str(const char* s);
|
||||||
|
|
||||||
glm::mat4 quat_to_mat4(glm::quat q);
|
glm::mat4 quat_to_mat4(glm::quat q);
|
||||||
|
|
||||||
|
template<class T> T lerp(T start, T end, float t) { return t * end + (1 - t) * start; }
|
||||||
|
template<class T> float ilerp(T start, T end, T pos) { return (pos - start) / (end - start); }
|
||||||
|
|
||||||
|
float randf(); // returns a float between 0 and 1
|
||||||
|
|||||||
17
src/body.cpp
17
src/body.cpp
@@ -100,16 +100,13 @@ bool load_body(Body* out_body, const char* obj_filepath) {
|
|||||||
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
|
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
|
||||||
glEnableVertexAttribArray(0);
|
glEnableVertexAttribArray(0);
|
||||||
|
|
||||||
*out_body = { .pose = glm::mat4(1),
|
out_body->pose = glm::mat4(1);
|
||||||
.scale = 1.0f,
|
out_body->ebo = ebo;
|
||||||
.ebo = ebo,
|
out_body->vao = vao;
|
||||||
.vao = vao,
|
out_body->vbo = vbo;
|
||||||
.vbo = vbo,
|
out_body->shader = 0;
|
||||||
.shader = 0,
|
out_body->verts = verts;
|
||||||
.verts = verts,
|
out_body->faces = faces;
|
||||||
.faces = faces,
|
|
||||||
.color = glm::vec4(0.5, 0.5, 0.5, 1)
|
|
||||||
};
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
48
src/camera.cpp
Normal file
48
src/camera.cpp
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
#include "camera.hpp"
|
||||||
|
|
||||||
|
#include <glm/ext/matrix_clip_space.hpp>
|
||||||
|
#include <glm/ext/matrix_transform.hpp>
|
||||||
|
#include <glm/geometric.hpp>
|
||||||
|
#include <glm/trigonometric.hpp>
|
||||||
|
|
||||||
|
const float zoom_speed_scale = 30.0f;
|
||||||
|
|
||||||
|
Viewport make_viewport(float win_w, float win_h, float fov_degrees = 45.0f) {
|
||||||
|
return { .fov_degrees = fov_degrees, .width = win_w, .height = win_h };
|
||||||
|
}
|
||||||
|
|
||||||
|
glm::mat4 camera_to_projection(Viewport &v) {
|
||||||
|
return glm::infinitePerspective(glm::radians(v.fov_degrees), v.width / v.height, 0.1f);
|
||||||
|
}
|
||||||
|
|
||||||
|
Camera make_camera(glm::vec3 focus = glm::vec3(0, 0, 0), float distance = 1.0f) {
|
||||||
|
return {
|
||||||
|
.focus = focus,
|
||||||
|
.theta = 0,
|
||||||
|
.phi = 0,
|
||||||
|
.distance = distance
|
||||||
|
};
|
||||||
|
}
|
||||||
|
void pan_camera(Camera& c, glm::vec2 dxdy) {
|
||||||
|
dxdy.y *= -1;
|
||||||
|
c.focus += camera_to_world(c) * glm::vec4(dxdy, 0, 0) * c.distance / 1000.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
void rotate_camera(Camera& c, glm::vec2 dxdy) {
|
||||||
|
c.theta += dxdy.x / 100.0f;
|
||||||
|
c.phi += dxdy.y / 100.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
void zoom_camera(Camera& c, float dz) {
|
||||||
|
c.distance = std::max(0.0f, c.distance - (dz * zoom_speed_scale));
|
||||||
|
}
|
||||||
|
|
||||||
|
glm::mat4 world_to_camera(Camera& c) {
|
||||||
|
glm::mat4 world_to_focus = glm::translate(glm::mat4(1), c.focus);
|
||||||
|
glm::mat4 rotation_theta = glm::rotate(glm::mat4(1), c.theta, {0, 1, 0});
|
||||||
|
glm::mat4 rotation_phi = glm::rotate(glm::mat4(1), c.phi, {1, 0, 0});
|
||||||
|
glm::mat4 rotated_focus_to_camera = glm::translate(glm::mat4(1), { 0, 0, -c.distance });
|
||||||
|
return rotated_focus_to_camera * rotation_phi * rotation_theta * world_to_focus;
|
||||||
|
}
|
||||||
|
|
||||||
|
glm::mat4 camera_to_world(Camera& c) { return glm::inverse(world_to_camera(c)); }
|
||||||
@@ -14,11 +14,7 @@
|
|||||||
#define NUM_SPHERES_PER_AXE 25
|
#define NUM_SPHERES_PER_AXE 25
|
||||||
#define SPACE_PER_SPHERE 10.0f
|
#define SPACE_PER_SPHERE 10.0f
|
||||||
|
|
||||||
glm::vec4 red_color = glm::vec4(1, 0, 0, 1);
|
bool parse_poses(Array<glm::mat2x3>* locs_out, const char* filepath) {
|
||||||
glm::vec4 green_color = glm::vec4(0, 1, 0, 1);
|
|
||||||
glm::vec4 blue_color = glm::vec4(0, 0, 1, 1);
|
|
||||||
|
|
||||||
bool parse_poses(Array<Body>* bodies_out, const char* filepath) {
|
|
||||||
FILE* fp;
|
FILE* fp;
|
||||||
if (fopen_s(&fp, filepath, "rb")) {
|
if (fopen_s(&fp, filepath, "rb")) {
|
||||||
printf("Error parsing %s\n", filepath);
|
printf("Error parsing %s\n", filepath);
|
||||||
@@ -28,8 +24,8 @@ bool parse_poses(Array<Body>* bodies_out, const char* filepath) {
|
|||||||
char delim = ',';
|
char delim = ',';
|
||||||
char line[LINE_BUF_SIZE];
|
char line[LINE_BUF_SIZE];
|
||||||
// because clang refuses to cooperate with my append implementation and generate the function code...
|
// because clang refuses to cooperate with my append implementation and generate the function code...
|
||||||
*bodies_out
|
*locs_out = { (glm::mat2x3*)malloc(sizeof(glm::mat2x3) * 3 * NUM_SPHERES_PER_AXE * 14),
|
||||||
= { (Body*)malloc(sizeof(Body) * 3 * NUM_SPHERES_PER_AXE * 14), 3 * NUM_SPHERES_PER_AXE * 14 };
|
3 * NUM_SPHERES_PER_AXE * 14 };
|
||||||
|
|
||||||
// read in header
|
// read in header
|
||||||
fgets(line, LINE_BUF_SIZE, fp);
|
fgets(line, LINE_BUF_SIZE, fp);
|
||||||
@@ -37,7 +33,6 @@ bool parse_poses(Array<Body>* bodies_out, const char* filepath) {
|
|||||||
fgets(line, LINE_BUF_SIZE, fp);
|
fgets(line, LINE_BUF_SIZE, fp);
|
||||||
|
|
||||||
for (int camera_i = 0; !feof(fp); camera_i++) {
|
for (int camera_i = 0; !feof(fp); camera_i++) {
|
||||||
|
|
||||||
Array<char*> words = split_str(line, delim);
|
Array<char*> words = split_str(line, delim);
|
||||||
float x = atof(words[0]);
|
float x = atof(words[0]);
|
||||||
float y = atof(words[1]);
|
float y = atof(words[1]);
|
||||||
@@ -47,23 +42,18 @@ bool parse_poses(Array<Body>* bodies_out, const char* filepath) {
|
|||||||
float j = atof(words[5]);
|
float j = atof(words[5]);
|
||||||
float k = atof(words[6]);
|
float k = atof(words[6]);
|
||||||
|
|
||||||
glm::mat4 pose = glm::translate(quat_to_mat4(glm::quat(w, i, j, k)), glm::vec3(x, y, z));
|
glm::mat4 pose = quat_to_mat4(glm::quat(w, i, j, k));
|
||||||
|
pose[3] = glm::vec4(x, y, z, 1);
|
||||||
// Generate axis spheres
|
// Generate axis spheres
|
||||||
for (int i = 0; i < 3; i++) {
|
for (int m = 0; m < 3; m++) {
|
||||||
for (int j = 0; j < NUM_SPHERES_PER_AXE; j++) {
|
for (int n = 0; n < NUM_SPHERES_PER_AXE; n++) {
|
||||||
Body b;
|
glm::mat2x3 loc_color = glm::mat2x3(0.0);
|
||||||
create_new_sphere(&b);
|
loc_color[0][m] = n * SPACE_PER_SPHERE;
|
||||||
|
loc_color[0] = pose * glm::vec4(loc_color[0], 1);
|
||||||
|
|
||||||
// How far along the axis is this ball
|
loc_color[1] = glm::vec3(0);
|
||||||
glm::vec3 trans = glm::vec3(0, 0, 0);
|
loc_color[1][m] = 1.0f;
|
||||||
trans[i] = (float)j * SPACE_PER_SPHERE;
|
locs_out->data[camera_i*3*NUM_SPHERES_PER_AXE + m*NUM_SPHERES_PER_AXE + n] = loc_color;
|
||||||
|
|
||||||
// Now move the translated pose via the camera's pose
|
|
||||||
b.pose = pose * glm::translate(b.pose, trans);
|
|
||||||
b.color = glm::vec4(i == 0 ? 1 : 0, i == 1 ? 1 : 0, i == 2 ? 1 : 0, 1);
|
|
||||||
b.scale = 3;
|
|
||||||
bodies_out->data[camera_i*3*NUM_SPHERES_PER_AXE + i*NUM_SPHERES_PER_AXE + j] = b;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fgets(line, LINE_BUF_SIZE, fp);
|
fgets(line, LINE_BUF_SIZE, fp);
|
||||||
|
|||||||
288
src/live_plotter.cpp
Normal file
288
src/live_plotter.cpp
Normal file
@@ -0,0 +1,288 @@
|
|||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
#include <cstring>
|
||||||
|
#include <glm/ext/vector_float2.hpp>
|
||||||
|
#include <glm/ext/vector_float4.hpp>
|
||||||
|
#include <profileapi.h>
|
||||||
|
#include <synchapi.h>
|
||||||
|
#include <vector>
|
||||||
|
#include <map>
|
||||||
|
#include <set>
|
||||||
|
#include <glad/glad.h>
|
||||||
|
#include <GLFW/glfw3.h>
|
||||||
|
#include <glm/ext/matrix_clip_space.hpp>
|
||||||
|
#include <glm/ext/matrix_transform.hpp>
|
||||||
|
#include <glm/ext/vector_float3.hpp>
|
||||||
|
#include <glm/matrix.hpp>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <pthread.h>
|
||||||
|
#include <string>
|
||||||
|
#include <winnt.h>
|
||||||
|
|
||||||
|
#include "util.hpp"
|
||||||
|
#include "shaders.hpp"
|
||||||
|
#include "body.hpp"
|
||||||
|
#include "camera.hpp"
|
||||||
|
#include "live_plotter.hpp"
|
||||||
|
|
||||||
|
#define LERP_MOVE_PERIOD_S 0.05
|
||||||
|
#define STOP_WAIT_TIME_MS 500
|
||||||
|
|
||||||
|
struct Point {
|
||||||
|
bool initialized;
|
||||||
|
glm::vec3 startloc;
|
||||||
|
glm::vec3 targetloc;
|
||||||
|
Body b;
|
||||||
|
double lifetime_s;
|
||||||
|
double start_s;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Globals
|
||||||
|
static GLFWwindow* win;
|
||||||
|
static double prev_cursor_x, prev_cursor_y;
|
||||||
|
static bool mouse_pressed, scroll_pressed, stop_flag, running;
|
||||||
|
static Camera camera;
|
||||||
|
static Viewport viewport;
|
||||||
|
static uint shader;
|
||||||
|
static CRITICAL_SECTION cs;
|
||||||
|
static HANDLE win_thread_h;
|
||||||
|
static DWORD win_thread_id;
|
||||||
|
static LARGE_INTEGER fr;
|
||||||
|
static pointid next_id = 0;
|
||||||
|
static std::map<uint, Point*> id_to_point; // Use a pool allocator possibly later
|
||||||
|
static std::map<Point*, uint> point_to_id;
|
||||||
|
|
||||||
|
// Constants
|
||||||
|
const char* vertex_filepath = "src/shaders/vertex.glsl";
|
||||||
|
const char* fragment_filepath = "src/shaders/fragment.glsl";
|
||||||
|
|
||||||
|
// Private foward decls
|
||||||
|
void _resize_cb(GLFWwindow* win, int w, int h);
|
||||||
|
void _cursor_pos_cb(GLFWwindow* win, double xpos, double ypos);
|
||||||
|
void _mouse_button_cb(GLFWwindow* win, int button, int action, int mods);
|
||||||
|
void _scroll_cb(GLFWwindow* win, double xoffset, double yoffset);
|
||||||
|
DWORD WINAPI _win_thread(LPVOID);
|
||||||
|
bool _glfw_setup();
|
||||||
|
void _refresh_win();
|
||||||
|
double _time();
|
||||||
|
|
||||||
|
DllExport bool __cdecl start(int win_w, int win_h) {
|
||||||
|
if (!InitializeCriticalSectionAndSpinCount(&cs, 0x00000400))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (running) {
|
||||||
|
printf("Already running! Call stop before calling stop again\n");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!QueryPerformanceFrequency(&fr)) {
|
||||||
|
printf("Failed to get the performance counter frequency.\n");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
glm::vec2* winsize = (glm::vec2*)malloc(sizeof(glm::vec2));
|
||||||
|
*winsize = glm::vec2(win_w, win_h);
|
||||||
|
stop_flag = false;
|
||||||
|
win_thread_h = CreateThread(NULL, 0, _win_thread, winsize, 0, &win_thread_id);
|
||||||
|
|
||||||
|
running = win_thread_h != NULL;
|
||||||
|
if (!running)
|
||||||
|
printf("Error while creating the live plotter window thread.\n");
|
||||||
|
return running;
|
||||||
|
}
|
||||||
|
|
||||||
|
DllExport bool __cdecl stop() {
|
||||||
|
stop_flag = true;
|
||||||
|
DWORD res = WaitForSingleObject(win_thread_h, STOP_WAIT_TIME_MS);
|
||||||
|
bool success = res == WAIT_OBJECT_0;
|
||||||
|
running = !success; // Consider the app still running if we didn't shut down properly...?
|
||||||
|
|
||||||
|
// TODO: Please wrap away win api synch stuff. thank you
|
||||||
|
if (!running) DeleteCriticalSection(&cs);
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
|
||||||
|
DllExport pointid __cdecl create_point(float x, float y, float z) {
|
||||||
|
EnterCriticalSection(&cs);
|
||||||
|
|
||||||
|
Point* p = (Point*)malloc(sizeof(Point));
|
||||||
|
*p = {
|
||||||
|
.initialized = false,
|
||||||
|
.startloc = glm::vec3(x, y, z),
|
||||||
|
.targetloc = glm::vec3(x, y, z),
|
||||||
|
.lifetime_s = INFINITY,
|
||||||
|
.start_s = _time()
|
||||||
|
};
|
||||||
|
p->b.scale = 1.0f;
|
||||||
|
p->b.color = glm::vec4(randf() + 0.1, randf() + 0.1, randf() + 0.1, 1);
|
||||||
|
|
||||||
|
pointid id = next_id++;
|
||||||
|
id_to_point[id] = p;
|
||||||
|
point_to_id[p] = id;
|
||||||
|
LeaveCriticalSection(&cs);
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
DllExport void __cdecl set_color(pointid id, float r, float g, float b) {
|
||||||
|
EnterCriticalSection(&cs);
|
||||||
|
Point* p = id_to_point[id];
|
||||||
|
p->b.color = { r, g, b, p->b.color[3] };
|
||||||
|
LeaveCriticalSection(&cs);
|
||||||
|
}
|
||||||
|
|
||||||
|
DllExport void __cdecl set_scale(pointid id, float scale) {
|
||||||
|
EnterCriticalSection(&cs);
|
||||||
|
Point* p = id_to_point[id];
|
||||||
|
p->b.scale = scale;
|
||||||
|
LeaveCriticalSection(&cs);
|
||||||
|
}
|
||||||
|
|
||||||
|
DllExport void __cdecl update_point(pointid id, float x, float y, float z) {
|
||||||
|
EnterCriticalSection(&cs);
|
||||||
|
Point* p = id_to_point[id];
|
||||||
|
p->targetloc = { x, y, z };
|
||||||
|
p->startloc = p->b.pose[3];
|
||||||
|
LeaveCriticalSection(&cs);
|
||||||
|
}
|
||||||
|
|
||||||
|
DllExport void __cdecl set_lifetime(pointid id, float new_lifetime_s) {
|
||||||
|
EnterCriticalSection(&cs);
|
||||||
|
Point* p = id_to_point[id];
|
||||||
|
p->start_s = _time();
|
||||||
|
p->lifetime_s = new_lifetime_s;
|
||||||
|
LeaveCriticalSection(&cs);
|
||||||
|
}
|
||||||
|
|
||||||
|
DllExport void __cdecl clear_point(pointid id) {
|
||||||
|
EnterCriticalSection(&cs);
|
||||||
|
Point* p = id_to_point[id];
|
||||||
|
id_to_point.erase(id);
|
||||||
|
point_to_id.erase(p);
|
||||||
|
free(p);
|
||||||
|
LeaveCriticalSection(&cs);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _resize_cb(GLFWwindow* win, int w, int h) {
|
||||||
|
viewport.width = w;
|
||||||
|
viewport.height = h;
|
||||||
|
glViewport(0, 0, w, h);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _cursor_pos_cb(GLFWwindow* win, double xpos, double ypos) {
|
||||||
|
glm::vec2 dxdy = glm::vec2((xpos - prev_cursor_x), (ypos - prev_cursor_y));
|
||||||
|
prev_cursor_x = xpos;
|
||||||
|
prev_cursor_y = ypos;
|
||||||
|
if (mouse_pressed)
|
||||||
|
rotate_camera(camera, dxdy);
|
||||||
|
if (scroll_pressed)
|
||||||
|
pan_camera(camera, dxdy);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _mouse_button_cb(GLFWwindow* win, int button, int action, int mods) {
|
||||||
|
if (button == GLFW_MOUSE_BUTTON_RIGHT)
|
||||||
|
mouse_pressed = action == GLFW_PRESS;
|
||||||
|
if (button == GLFW_MOUSE_BUTTON_MIDDLE)
|
||||||
|
scroll_pressed = action == GLFW_PRESS;
|
||||||
|
// glfwGetCursorPos(window, &prev_cursor_x, &prev_cursor_y); Don't think this is necessary
|
||||||
|
}
|
||||||
|
|
||||||
|
void _scroll_cb(GLFWwindow* win, double xoffset, double yoffset) { zoom_camera(camera, yoffset); }
|
||||||
|
|
||||||
|
DWORD _win_thread(LPVOID args) {
|
||||||
|
glm::vec2* winsize = (glm::vec2*)args;
|
||||||
|
camera = make_camera({ 0, 0, 0 }, 3000);
|
||||||
|
camera.theta = glm::radians(90.0f);
|
||||||
|
camera.phi = glm::radians(30.0f);
|
||||||
|
viewport = make_viewport(winsize->x, winsize->y, 45.0f);
|
||||||
|
if (!_glfw_setup()) {
|
||||||
|
printf("Failed to initialize glfw window\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {
|
||||||
|
printf("Failed to initialize GLAD\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!load_shader(&shader, vertex_filepath, fragment_filepath)) {
|
||||||
|
printf("Failed to compile shaders\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// This swapping bit is probably unnecessary now that I clear in the loop.
|
||||||
|
// I was getting a flashing issue during the tutorial...
|
||||||
|
glClearColor(0, 0, 0, 0);
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT); // Write to back buffer
|
||||||
|
glfwSwapBuffers(win); // front buffer is now back
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT); // Write to back buffer again (former front buf)
|
||||||
|
glDisable(GL_CULL_FACE);
|
||||||
|
glEnable(GL_DEPTH_TEST);
|
||||||
|
|
||||||
|
while (!(glfwWindowShouldClose(win) || stop_flag))
|
||||||
|
_refresh_win();
|
||||||
|
glfwTerminate();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool _glfw_setup() {
|
||||||
|
glfwInit();
|
||||||
|
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
|
||||||
|
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
|
||||||
|
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
|
||||||
|
win = glfwCreateWindow(viewport.width, viewport.height, "LivePlotter", NULL, NULL);
|
||||||
|
if (win == NULL) {
|
||||||
|
printf("Failed to create GLFW window\n");
|
||||||
|
glfwTerminate();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
glfwMakeContextCurrent(win);
|
||||||
|
glfwSetFramebufferSizeCallback(win, _resize_cb);
|
||||||
|
glfwSetCursorPosCallback(win, _cursor_pos_cb);
|
||||||
|
glfwSetMouseButtonCallback(win, _mouse_button_cb);
|
||||||
|
glfwSetScrollCallback(win, _scroll_cb);
|
||||||
|
|
||||||
|
_cursor_pos_cb(win, 0, 0);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void _refresh_win() {
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
|
set_uniform(shader, "camera_t", world_to_camera(camera));
|
||||||
|
set_uniform(shader, "projection_t", camera_to_projection(viewport));
|
||||||
|
|
||||||
|
if (TryEnterCriticalSection(&cs)) {
|
||||||
|
for (const auto& [id, p] : id_to_point) {
|
||||||
|
// Initialize if not done so yet
|
||||||
|
if (!p->initialized) {
|
||||||
|
create_new_sphere(&p->b, p->b.scale);
|
||||||
|
p->b.shader = shader;
|
||||||
|
p->b.pose = glm::translate(glm::mat4(1), p->startloc);
|
||||||
|
p->initialized = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Perform fade
|
||||||
|
double elapsed_time_s = _time() - p->start_s;
|
||||||
|
float t = elapsed_time_s / p->lifetime_s;
|
||||||
|
p->b.color[3] = lerp(1.0, 0.0, t);
|
||||||
|
|
||||||
|
// Lerp position
|
||||||
|
t = elapsed_time_s / LERP_MOVE_PERIOD_S;
|
||||||
|
p->b.pose[3] = glm::vec4(lerp(p->startloc, p->targetloc, t), 1);
|
||||||
|
draw_body(p->b);
|
||||||
|
}
|
||||||
|
LeaveCriticalSection(&cs);
|
||||||
|
}
|
||||||
|
glfwSwapBuffers(win);
|
||||||
|
glfwPollEvents();
|
||||||
|
}
|
||||||
|
|
||||||
|
double _time() {
|
||||||
|
LARGE_INTEGER timeticks;
|
||||||
|
if (!QueryPerformanceCounter(&timeticks)) {
|
||||||
|
printf("Failed to query performance counter;\n");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return (double)timeticks.QuadPart / (double)fr.QuadPart;
|
||||||
|
}
|
||||||
|
|
||||||
283
src/main.cpp
283
src/main.cpp
@@ -1,249 +1,60 @@
|
|||||||
#include <cstring>
|
|
||||||
#include <glad/glad.h>
|
|
||||||
#include <GLFW/glfw3.h>
|
|
||||||
#include <glm/ext/matrix_clip_space.hpp>
|
|
||||||
#include <glm/ext/matrix_transform.hpp>
|
|
||||||
#include <glm/ext/vector_float3.hpp>
|
|
||||||
#include <glm/matrix.hpp>
|
|
||||||
#include <iostream>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <pthread.h>
|
|
||||||
#include <string>
|
|
||||||
#include <tuple>
|
|
||||||
|
|
||||||
#include "util.hpp"
|
|
||||||
#include "shaders.hpp"
|
|
||||||
#include "body.hpp"
|
|
||||||
#include "camera_poses.hpp"
|
#include "camera_poses.hpp"
|
||||||
|
#include "live_plotter.hpp"
|
||||||
|
|
||||||
static GLFWwindow* window;
|
//void* process_cin(void* args) {
|
||||||
static float width, height;
|
// std::string line;
|
||||||
static glm::mat4 projection_t;
|
// while (true) {
|
||||||
|
// std::getline(std::cin, line);
|
||||||
|
// Array<char*> words = split_str(line.c_str());
|
||||||
|
// if (!words.len == 4)
|
||||||
|
// return NULL;
|
||||||
|
// printf("Received: %s, %s, %s, %s\n", words[0], words[1], words[2], words[3]); // echo for debugging
|
||||||
|
// float x = atof(words[1]);
|
||||||
|
// float y = atof(words[2]);
|
||||||
|
// float z = atof(words[3]);
|
||||||
|
// glm::vec3 new_loc = glm::vec3(x, y, z);
|
||||||
|
// bool found_match = false;
|
||||||
|
// for (int i = 0; i < camera_bodies.size(); i++) {
|
||||||
|
// if (strcmp(words[0], camera_bodies[i].name) == 0 && camera_bodies[i].b) {
|
||||||
|
// Body& b = *camera_bodies[i].b;
|
||||||
|
// glm::vec4& transl = b.pose[3];
|
||||||
|
// transl = (0.8f * transl) + (0.2f * glm::vec4(new_loc, 1)); // lp filter
|
||||||
|
// int color_i = i + 1;
|
||||||
|
// b.color = glm::vec4(color_i & 0x4, color_i & 0x2, color_i & 0x1, 1); // reset alpha to 1
|
||||||
|
// camera_bodies[i].hp = max_hp;
|
||||||
|
// found_match = true;
|
||||||
|
// } else if (camera_bodies[i].b) {
|
||||||
|
// float& cur_hp = camera_bodies[i].hp;
|
||||||
|
// if (cur_hp > 0)
|
||||||
|
// cur_hp -= 1;
|
||||||
|
// camera_bodies[i].b->color = glm::vec4(i & 0x4, i & 0x2, i & 0x1, cur_hp / max_hp);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// if (!found_match) {
|
||||||
|
// auto read = BarcodeRead { words[0], (Body*)NULL, max_hp };
|
||||||
|
// camera_bodies.push_back(read);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
|
||||||
void framebuffer_size_callback(GLFWwindow* window, int w, int h) {
|
|
||||||
width = w;
|
|
||||||
height = h;
|
|
||||||
glViewport(0, 0, width, height);
|
|
||||||
projection_t = glm::infinitePerspective(glm::radians(45.0f), (float)width / (float)height, 0.1f);
|
|
||||||
}
|
|
||||||
|
|
||||||
void process_input() {
|
|
||||||
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
|
|
||||||
glfwSetWindowShouldClose(window, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool stop = false;
|
|
||||||
static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
|
|
||||||
const float max_hp
|
|
||||||
= 10; // Number of scans (without a particular barcode) for which the sphere will still be visible
|
|
||||||
|
|
||||||
struct BarcodeRead {
|
|
||||||
char* name;
|
|
||||||
Body* b;
|
|
||||||
float hp;
|
|
||||||
};
|
|
||||||
static std::vector<BarcodeRead> camera_bodies; // I would use my array here, but was getting a linking error
|
|
||||||
|
|
||||||
void* process_cin(void* args) {
|
|
||||||
std::string line;
|
|
||||||
while (true) {
|
|
||||||
std::getline(std::cin, line);
|
|
||||||
Array<char*> words = split_str(line.c_str());
|
|
||||||
if (!words.len == 4) return NULL;
|
|
||||||
printf("Received: %s, %s, %s, %s\n", words[0], words[1], words[2], words[3]); // echo for debugging
|
|
||||||
float x = atof(words[1]);
|
|
||||||
float y = atof(words[2]);
|
|
||||||
float z = atof(words[3]);
|
|
||||||
glm::vec3 new_loc = glm::vec3(x, y, z);
|
|
||||||
bool found_match = false;
|
|
||||||
pthread_mutex_lock(&lock);
|
|
||||||
for (int i = 0; i < camera_bodies.size(); i++) {
|
|
||||||
if (strcmp(words[0], camera_bodies[i].name) == 0 && camera_bodies[i].b) {
|
|
||||||
Body& b = *camera_bodies[i].b;
|
|
||||||
glm::vec4& transl = b.pose[3];
|
|
||||||
transl = (0.8f * transl) + (0.2f * glm::vec4(new_loc, 1)); // lp filter
|
|
||||||
int color_i = i + 1;
|
|
||||||
b.color = glm::vec4(color_i & 0x4, color_i & 0x2, color_i & 0x1, 1); // reset alpha to 1
|
|
||||||
camera_bodies[i].hp = max_hp;
|
|
||||||
found_match = true;
|
|
||||||
} else if (camera_bodies[i].b) {
|
|
||||||
float& cur_hp = camera_bodies[i].hp;
|
|
||||||
if (cur_hp > 0)
|
|
||||||
cur_hp -= 1;
|
|
||||||
camera_bodies[i].b->color = glm::vec4(i & 0x4, i & 0x2, i & 0x1, cur_hp / max_hp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!found_match) {
|
|
||||||
auto read = BarcodeRead { words[0], (Body*)NULL, max_hp };
|
|
||||||
camera_bodies.push_back(read);
|
|
||||||
}
|
|
||||||
pthread_mutex_unlock(&lock);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool mouse_pressed = false;
|
|
||||||
static bool scroll_pressed = false;
|
|
||||||
static double prev_cursor_x, prev_cursor_y;
|
|
||||||
|
|
||||||
static double theta = 0.0; // angle of camera trans vect wrt x-z plane
|
|
||||||
static double phi = glm::radians(270.0); // angle of camera trans vect wrt x-axis
|
|
||||||
|
|
||||||
static glm::vec3 focal_point = glm::vec3(0, 0, 500);
|
|
||||||
static glm::vec3 camera_loc = glm::vec3(0, 4000, 0);
|
|
||||||
static glm::vec3 up = glm::vec3(0, 1, 0);
|
|
||||||
static glm::mat4 world_to_camera = glm::lookAt(camera_loc, focal_point, up);
|
|
||||||
|
|
||||||
static void cursor_position_callback(GLFWwindow* window, double xpos, double ypos) {
|
|
||||||
float dx = (xpos - prev_cursor_x);
|
|
||||||
float dy = (ypos - prev_cursor_y);
|
|
||||||
|
|
||||||
glm::mat4 camera_to_world = glm::inverse(world_to_camera);
|
|
||||||
// These could be acquired via some cross products. Don't know if that's more efficient.
|
|
||||||
glm::vec4 strafe_x = camera_to_world[0];
|
|
||||||
glm::vec4 strafe_y = camera_to_world[1];
|
|
||||||
prev_cursor_x = xpos;
|
|
||||||
prev_cursor_y = ypos;
|
|
||||||
|
|
||||||
double len = glm::length(camera_loc - focal_point);
|
|
||||||
|
|
||||||
if (mouse_pressed) {
|
|
||||||
phi += glm::radians(dx * (360 / width)); // * glm::radians(360.0);
|
|
||||||
theta += glm::radians(dy * (360 / height)); // * glm::radians(360.0);
|
|
||||||
camera_loc.x = focal_point.x + (len * glm::cos(theta) * glm::cos(-phi));
|
|
||||||
camera_loc.y = focal_point.y + (len * glm::sin(theta));
|
|
||||||
camera_loc.z = focal_point.z + (-len * glm::cos(theta) * glm::sin(-phi));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (scroll_pressed) {
|
|
||||||
glm::vec4 move_vec = glm::max((float)len, 20.0f) * (- strafe_x * (dx / 500) + strafe_y * (dy / 500));
|
|
||||||
focal_point += move_vec;
|
|
||||||
camera_loc += move_vec;
|
|
||||||
}
|
|
||||||
|
|
||||||
world_to_camera = glm::lookAt(camera_loc, focal_point, up);
|
|
||||||
}
|
|
||||||
|
|
||||||
void mouse_button_callback(GLFWwindow* window, int button, int action, int mods) {
|
|
||||||
if (button == GLFW_MOUSE_BUTTON_RIGHT) {
|
|
||||||
mouse_pressed = action == GLFW_PRESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (button == GLFW_MOUSE_BUTTON_MIDDLE) {
|
|
||||||
scroll_pressed = action == GLFW_PRESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
glfwGetCursorPos(window, &prev_cursor_x, &prev_cursor_y);
|
|
||||||
}
|
|
||||||
|
|
||||||
void scroll_callback(GLFWwindow* window, double xoffset, double yoffset) {
|
|
||||||
glm::vec3 k = camera_loc - focal_point;
|
|
||||||
camera_loc -= k * (float)yoffset / 10.0f;
|
|
||||||
world_to_camera = glm::lookAt(camera_loc, focal_point, up);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool glfw_setup() {
|
|
||||||
glfwInit();
|
|
||||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
|
|
||||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
|
|
||||||
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
|
|
||||||
// glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
|
|
||||||
window = glfwCreateWindow(800, 800, "LivePlotter", NULL, NULL);
|
|
||||||
if (window == NULL) {
|
|
||||||
printf("Failed to create GLFW window\n");
|
|
||||||
glfwTerminate();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
glfwMakeContextCurrent(window);
|
|
||||||
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
|
|
||||||
glfwSetCursorPosCallback(window, cursor_position_callback);
|
|
||||||
glfwSetMouseButtonCallback(window, mouse_button_callback);
|
|
||||||
glfwSetScrollCallback(window, scroll_callback);
|
|
||||||
|
|
||||||
cursor_position_callback(window, 0, 0);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
if (!glfw_setup())
|
Array<glm::mat2x3> camera_pose_axes = { NULL, 0 };
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {
|
|
||||||
printf("Failed to initialize GLAD\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
glViewport(0, 0, 800, 800);
|
|
||||||
width = 800;
|
|
||||||
height = 800;
|
|
||||||
|
|
||||||
const char* vertex_filepath = "src/shaders/vertex.glsl";
|
|
||||||
const char* fragment_filepath = "src/shaders/fragment.glsl";
|
|
||||||
uint shader;
|
|
||||||
if (!load_shader(&shader, vertex_filepath, fragment_filepath))
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
//glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
|
|
||||||
glClearColor(0, 0, 0, 0);
|
|
||||||
glClear(GL_COLOR_BUFFER_BIT); // Write to back buffer
|
|
||||||
|
|
||||||
glfwSwapBuffers(window); // front buffer is now back
|
|
||||||
glClear(GL_COLOR_BUFFER_BIT); // Write to back buffer again (former front buf)
|
|
||||||
|
|
||||||
// glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
|
|
||||||
// set_uniform(shader, "color", glm::vec4 { sin(time), sin(time + glm::radians(45.0f)), sin(time +
|
|
||||||
// glm::radians(90.0f)), 1.0 } / 2.0f); time = glfwGetTime();
|
|
||||||
|
|
||||||
glDisable(GL_CULL_FACE);
|
|
||||||
glEnable(GL_DEPTH_TEST);
|
|
||||||
|
|
||||||
projection_t = glm::infinitePerspective(glm::radians(45.0f), (float)width / (float)height, 0.1f);
|
|
||||||
pthread_t thread_id;
|
|
||||||
pthread_create(&thread_id, NULL, process_cin, NULL);
|
|
||||||
|
|
||||||
Array<Body> camera_pose_axes = { NULL, 0 };
|
|
||||||
if (!parse_poses(&camera_pose_axes, "poses.csv")) {
|
if (!parse_poses(&camera_pose_axes, "poses.csv")) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
start(800, 800);
|
||||||
|
|
||||||
for (int i = 0; i < camera_pose_axes.len; i++) {
|
for (int i = 0; i < camera_pose_axes.len; i++) {
|
||||||
camera_pose_axes[i].shader = shader;
|
glm::vec3 p = camera_pose_axes[i][0];
|
||||||
|
glm::vec3 color = camera_pose_axes[i][1];
|
||||||
|
pointid id = create_point(p.x, p.y, p.z);
|
||||||
|
set_color(id, color.x, color.y, color.z);
|
||||||
|
set_scale(id, 10);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*Body b;
|
while (true)
|
||||||
create_new_sphere(&b);
|
;
|
||||||
b.pose = glm::mat4(1);
|
|
||||||
b.color = glm::vec4(1, 1, 1, 1);
|
|
||||||
b.shader = shader;*/
|
|
||||||
|
|
||||||
while (!glfwWindowShouldClose(window)) {
|
|
||||||
process_input();
|
|
||||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
|
||||||
set_uniform(shader, "camera_t", world_to_camera);
|
|
||||||
set_uniform(shader, "projection_t", projection_t);
|
|
||||||
|
|
||||||
//draw_body(b);
|
|
||||||
|
|
||||||
for (int i = 0; i < camera_pose_axes.len; i++) {
|
|
||||||
draw_body(camera_pose_axes[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pthread_mutex_trylock(&lock) == 0) {
|
|
||||||
for (int i = 0; i < camera_bodies.size(); i++) {
|
|
||||||
if (!camera_bodies[i].b) {
|
|
||||||
Body* b = (Body*)malloc(sizeof(Body));
|
|
||||||
create_new_sphere(b);
|
|
||||||
b->color = glm::vec4((i+1) & 0x4, (i+1) & 0x2, (i+1) & 0x1, max_hp);
|
|
||||||
b->scale = 25;
|
|
||||||
b->shader = shader;
|
|
||||||
camera_bodies[i].b = b;
|
|
||||||
}
|
|
||||||
draw_body(*camera_bodies[i].b);
|
|
||||||
}
|
|
||||||
pthread_mutex_unlock(&lock);
|
|
||||||
}
|
|
||||||
|
|
||||||
glfwSwapBuffers(window);
|
|
||||||
glfwPollEvents();
|
|
||||||
}
|
|
||||||
glfwTerminate();
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -93,7 +93,6 @@ Array<char*> _split_str_inner(const char* s, char delim, bool just_check_ws) {
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// https://songho.ca/opengl/gl_quaternion.html
|
// https://songho.ca/opengl/gl_quaternion.html
|
||||||
glm::mat4 quat_to_mat4(glm::quat q) {
|
glm::mat4 quat_to_mat4(glm::quat q) {
|
||||||
glm::vec4 col0 = glm::vec4(
|
glm::vec4 col0 = glm::vec4(
|
||||||
@@ -109,3 +108,7 @@ glm::mat4 quat_to_mat4(glm::quat q) {
|
|||||||
|
|
||||||
return glm::mat4(col0, col1, col2, col3);
|
return glm::mat4(col0, col1, col2, col3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float randf() {
|
||||||
|
return (float)rand() / (float)RAND_MAX;
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user