fix various warning
add b3ResourcePath utility, to locate resources relative to executable
This commit is contained in:
80
examples/Utils/b3ResourcePath.cpp
Normal file
80
examples/Utils/b3ResourcePath.cpp
Normal file
@@ -0,0 +1,80 @@
|
||||
#include "b3ResourcePath.h"
|
||||
#include "Bullet3Common/b3Logging.h"
|
||||
#ifdef __APPLE__
|
||||
#include <mach-o/dyld.h> /* _NSGetExecutablePath */
|
||||
#else
|
||||
#ifdef _WIN32
|
||||
#else
|
||||
//not Mac, not Windows, let's cross the fingers it is Linux :-)
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
#include "Bullet3Common/b3FileUtils.h"
|
||||
#define B3_MAX_EXE_PATH_LEN 4096
|
||||
|
||||
int b3ResourcePath::getExePath(char* path, int maxPathLenInBytes)
|
||||
{
|
||||
int numBytes = 0;
|
||||
|
||||
#if __APPLE__
|
||||
uint32_t bufsize = uint32_t(maxPathLenInBytes);
|
||||
|
||||
if (_NSGetExecutablePath(path, &bufsize)!=0)
|
||||
{
|
||||
b3Warning("Cannot find executable path\n");
|
||||
return false;
|
||||
} else
|
||||
{
|
||||
numBytes = strlen(path);
|
||||
}
|
||||
#else
|
||||
#ifdef _WIN32
|
||||
#error not yet
|
||||
#else
|
||||
numBytes = (int)readlink("/proc/self/exe", path, maxPathLenInBytes-1);
|
||||
if (numBytes > 0)
|
||||
{
|
||||
path[numBytes] = 0;
|
||||
} else
|
||||
{
|
||||
b3Warning("Cannot find executable path\n");
|
||||
}
|
||||
#endif //_WIN32
|
||||
#endif //__APPLE__
|
||||
|
||||
return numBytes;
|
||||
}
|
||||
|
||||
int b3ResourcePath::findResourcePath(const char* resourceName, char* resourcePath, int resourcePathMaxNumBytes)
|
||||
{
|
||||
//first find in a resource/<exeName> location, then in various folders within 'data' using b3FileUtils
|
||||
char exePath[B3_MAX_EXE_PATH_LEN];
|
||||
|
||||
int l = b3ResourcePath::getExePath(exePath, B3_MAX_EXE_PATH_LEN);
|
||||
if (l)
|
||||
{
|
||||
char pathToExe[B3_MAX_EXE_PATH_LEN];
|
||||
|
||||
int exeNamePos = b3FileUtils::extractPath(exePath,pathToExe,B3_MAX_EXE_PATH_LEN);
|
||||
if (exeNamePos)
|
||||
{
|
||||
sprintf(resourcePath,"%s../resources/%s/%s",pathToExe,&exePath[exeNamePos],resourceName);
|
||||
//printf("try resource at %s\n", resourcePath);
|
||||
if (b3FileUtils::findFile(resourcePath, resourcePath, resourcePathMaxNumBytes))
|
||||
{
|
||||
return strlen(resourcePath);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool res = b3FileUtils::findFile(resourceName, resourcePath, resourcePathMaxNumBytes);
|
||||
if (res)
|
||||
{
|
||||
return strlen(resourcePath);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user