blob: a2af47e85298387f14a3e234ec1b990dca1cfe35 [file]
#include "common_hello.h"
#include <fstream>
#include <sstream>
#include <sys/types.h>
#include <sys/stat.h>
#include <thread>
#include <map>
#include <shared_mutex>
#include "os_generic.h"
#include "hmd_opencv_sandbox.h"
#if defined( WINDOWS ) || defined( WIN32 )
#include <windows.h>
#else
#include <unistd.h>
#endif
#ifndef WIN32
#define statstruct stat
#define _stat stat
#else
#define statstruct _stat64i32
#endif
Matrix4 gCurrentViewProjection;
//-----------------------------------------------------------------------------
// Purpose: Converts a SteamVR matrix to our local matrix class
//-----------------------------------------------------------------------------
Matrix4 ConvertSteamVRMatrixToMatrix4( const vr::HmdMatrix34_t &matPose )
{
Matrix4 matrixObj(
matPose.m[0][0], matPose.m[1][0], matPose.m[2][0], 0.0,
matPose.m[0][1], matPose.m[1][1], matPose.m[2][1], 0.0,
matPose.m[0][2], matPose.m[1][2], matPose.m[2][2], 0.0,
matPose.m[0][3], matPose.m[1][3], matPose.m[2][3], 1.0f
);
return matrixObj;
}
//-----------------------------------------------------------------------------
// Purpose: Outputs a set of optional arguments to debugging output, using
// the printf format setting specified in fmt*.
//-----------------------------------------------------------------------------
void dprintf( int stream, const char *fmt, ... )
{
va_list args;
char buffer[2048];
va_start( args, fmt );
vsprintf_s( buffer, fmt, args );
va_end( args );
if ( stream == 0 )
{
printf( "%s", buffer );
if( APP ) APP->m_trmErrors.Append( buffer );
}
else
{
if ( APP ) APP->m_trmProfile.Append( buffer );
}
OutputDebugStringA( buffer );
}
static void CacheMapThread();
//Cache check area
std::thread * g_thdCacheChecker;
bool g_bCreatedThreadCheck;
std::map< std::string, double > g_mFileTimeCacheMap;
std::map< std::string, bool > g_mCheckFileSet;
std::mutex g_mFileTimeCacheMapMutex;
og_sema_t g_mFileTimeRequestMutex;
static void CacheMapThread()
{
do
{
//Alow time between refreshes.
OGUSleep( 10000 );
OGLockSema( g_mFileTimeRequestMutex );
std::string currentfile = "";
do
{
{
std::unique_lock<std::mutex> ulm( g_mFileTimeCacheMapMutex );
std::map< std::string, bool >::iterator it;
if ( currentfile.length() == 0 )
it = g_mCheckFileSet.begin();
else
{
it = g_mCheckFileSet.find( currentfile );
it++;
}
if ( it == g_mCheckFileSet.end() ) break;
currentfile = it->first;
it->second = false;
}
double dTime = -1;
struct statstruct result;
if ( _stat( currentfile.c_str(), &result ) == 0 )
dTime = (double)result.st_mtime;
{
std::unique_lock<std::mutex> ulm( g_mFileTimeCacheMapMutex );
g_mFileTimeCacheMap[currentfile] = dTime;
}
} while ( 1 );
} while ( 1 );
}
double FileTimeCached( const char * fn )
{
if ( !g_bCreatedThreadCheck )
{
g_bCreatedThreadCheck = 1;
g_thdCacheChecker = new std::thread( CacheMapThread );
}
std::unique_lock<std::mutex> ulm( g_mFileTimeCacheMapMutex );
g_mCheckFileSet[fn] = true;
OGUnlockSema( g_mFileTimeRequestMutex );
double dTime = g_mFileTimeCacheMap[fn];
return dTime;
}
std::string FileToString( const char * fn )
{
std::ifstream t( fn );
std::stringstream buffer;
buffer << t.rdbuf();
return buffer.str();
}