Updated Linux makefile. added <errno.h>, <sys/stat.h>, and <dirent.h> to AssetCache.cpp. Asset system works on Linux now. I also did A Bad Thing and replaced MAX_PATH with 1024. Also, VS allows for some majorly bad template code to be accepted.
parent
bc831f05b0
commit
c5f013d693
|
@ -14,7 +14,7 @@ CXXFLAGS+=$(DEBUG) -Wall `sdl2-config --cflags` -c
|
|||
LDFLAGS+= -Wall -L../../../sdl/$(LIB_DIR) -Wl,-rpath=$(LIB_DIR)/ -lSDL2 -lpthread -Wl,--no-undefined -lm -ldl -pthread -lrt -Wl,-Bstatic -lGLEW -Wl,-Bdynamic -lGL
|
||||
VPATH=../../src
|
||||
BINARY=RtB$(BITS)
|
||||
OBJ=main.o Asset.o AssetManager.o Core.o fio.o checksum.o Log.o Quat.o Mat4.o Vec.o Mesh.o Program.o RenderScene.o RenderSet.o RenderObject.o RenderCamera.o RenderView.o
|
||||
OBJ=main.o Asset.o AssetCache.o AssetManager.o Core.o fio.o checksum.o Log.o Quat.o Mat4.o Vec.o Mesh.o Program.o RenderScene.o RenderSet.o RenderObject.o RenderCamera.o RenderView.o
|
||||
OBJ_DIR=obj
|
||||
|
||||
$(BINARY): $(patsubst %,$(OBJ_DIR)/%,$(OBJ))
|
||||
|
|
|
@ -3,9 +3,13 @@
|
|||
#include "checksum.hpp"
|
||||
#include "fio.hpp"
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
#if _WIN32
|
||||
#include <Windows.h>
|
||||
#include <Strsafe.h>
|
||||
#else
|
||||
#include <sys/stat.h>
|
||||
#include <dirent.h>
|
||||
#endif
|
||||
|
||||
/* ======== Construction and Destruction ======== */
|
||||
|
@ -50,7 +54,7 @@ int AssetCache::fromFile(const char *cache_file) {
|
|||
asset->data_checksum = fsum;
|
||||
asset->data_length = fsize;
|
||||
assets->set(fpath, asset);
|
||||
LOG(LOG_DEBUG) << "opened " << fpath << " " << fsum;
|
||||
LOG(LOG_DEBUG) << "opened " << fpath << " " << fsum << " " << fsize;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -59,11 +63,11 @@ This function will first attempt to load the .CACHE file contained in the given
|
|||
If not, the function will traverse the full hierarchy of the given directory and populate the cache accordingly.
|
||||
*/
|
||||
int AssetCache::fromDir(const char *dir) {
|
||||
char cachepath[MAX_PATH];
|
||||
char cachepath[1024];
|
||||
#ifndef _WIN32
|
||||
sprintf(cachepath, "%s/.CACHE", dir);
|
||||
#else
|
||||
sprintf_s(cachepath, MAX_PATH, "%s/.CACHE", dir);
|
||||
sprintf_s(cachepath, 1024, "%s/.CACHE", dir);
|
||||
#endif
|
||||
if (fromFile(cachepath) != 0) {
|
||||
LOG(LOG_INFO) << FUNC_NAME << ": " << cachepath << " does not exist";
|
||||
|
@ -89,10 +93,10 @@ int AssetCache::traverseDir_r(const char *dir) {
|
|||
#if _WIN32
|
||||
WIN32_FIND_DATA ffd;
|
||||
HANDLE h_find = INVALID_HANDLE_VALUE;
|
||||
char wdir[MAX_PATH];
|
||||
char wdir[1024];
|
||||
|
||||
StringCbCopyN(wdir, MAX_PATH, dir, dir_len);
|
||||
StringCbCatN(wdir, MAX_PATH, "/*", 2);
|
||||
StringCbCopyN(wdir, 1024, dir, dir_len);
|
||||
StringCbCatN(wdir, 1024, "/*", 2);
|
||||
|
||||
if ((h_find = FindFirstFile(wdir, &ffd)) == INVALID_HANDLE_VALUE) {
|
||||
LOG(LOG_ERROR) << FUNC_NAME << " " << wdir << " FindFirstFile error " << GetLastError();
|
||||
|
@ -100,10 +104,10 @@ int AssetCache::traverseDir_r(const char *dir) {
|
|||
}
|
||||
do {
|
||||
if (strcmp(ffd.cFileName, "..") == 0 || strcmp(ffd.cFileName, ".") == 0 || strcmp(ffd.cFileName, ".CACHE") == 0) continue;
|
||||
char fpath[MAX_PATH];
|
||||
StringCbCopyN(fpath, MAX_PATH, dir, dir_len);
|
||||
StringCbCatN(fpath, MAX_PATH, "/", 2);
|
||||
StringCbCatN(fpath, MAX_PATH, ffd.cFileName, strlen(ffd.cFileName)+1);
|
||||
char fpath[1024];
|
||||
StringCbCopyN(fpath, 1024, dir, dir_len);
|
||||
StringCbCatN(fpath, 1024, "/", 2);
|
||||
StringCbCatN(fpath, 1024, ffd.cFileName, strlen(ffd.cFileName)+1);
|
||||
if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
|
||||
traverseDir_r(fpath);
|
||||
} else {
|
||||
|
@ -130,28 +134,38 @@ int AssetCache::traverseDir_r(const char *dir) {
|
|||
struct dirent **files;
|
||||
struct stat file_stat;
|
||||
int n, i;
|
||||
char udir[MAX_PATH];
|
||||
char filepath[MAX_PATH];
|
||||
char udir[1024];
|
||||
char fpath[1024];
|
||||
Asset *asset;
|
||||
n = scandir(dir, &files, NULL, alphasort);
|
||||
if (n < 0) {
|
||||
LOG(LOG_INFO) << FUNC_NAME << ": No files in dir " << dir;
|
||||
return 2;
|
||||
}
|
||||
for (i = 0; i < n; i++) {
|
||||
snprintf(filepath, "%s/%s", dir, files[i]->dname);
|
||||
stat(filepath, &file_stat);
|
||||
snprintf(fpath, 1024, "%s/%s", dir, files[i]->d_name);
|
||||
stat(fpath, &file_stat);
|
||||
switch(file_stat.st_mode & S_IFMT) {
|
||||
case S_IFDIR:
|
||||
traverseDir_r(filepath);
|
||||
if (strcmp(files[i]->d_name, "..") == 0 || strcmp(files[i]->d_name, ".") == 0) continue;
|
||||
traverseDir_r(fpath);
|
||||
break;
|
||||
case S_IFREG:
|
||||
Asset *asset = assets->get(fpath);
|
||||
if (asset == NULL) {
|
||||
if (strcmp(files[i]->d_name, ".CACHE") == 0) continue;
|
||||
asset = assets->get(fpath);
|
||||
if (asset != NULL) {
|
||||
if (file_stat.st_size != asset->data_length) {
|
||||
LOG(LOG_DEBUG) << " file " << fpath << " changed from " << asset->data_length << " to " << file_stat.st_size;
|
||||
asset->data_length = file_stat.st_size;
|
||||
// TODO: recalculate checksum?
|
||||
}
|
||||
} else {
|
||||
asset = new Asset();
|
||||
asset->filename.assign(fpath);
|
||||
asset->data_length = files[i]->d_off;
|
||||
assets->set(fpath, asset);
|
||||
}
|
||||
asset->flags &= ~Asset::IS_NULL;
|
||||
assets->set(fpath, asset);
|
||||
break;
|
||||
case S_IFLNK:
|
||||
// TODO: travelDir_r if dir?
|
||||
|
@ -233,4 +247,4 @@ This function attempts to create a new Asset using some provided data
|
|||
*/
|
||||
Asset* AssetCache::createAsset(const char *filename, const char *data, size_t data_len) {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -17,6 +17,7 @@ Following this, the USER AssetCache is loaded, and are:
|
|||
#include "Log.hpp"
|
||||
#include "fio.hpp"
|
||||
#include "checksum.hpp"
|
||||
#include <stdexcept> // for std::out_of_range
|
||||
|
||||
AssetManager::AssetManager() {
|
||||
null_asset.filename = "NULL";
|
||||
|
@ -66,4 +67,4 @@ Asset* AssetManager::loadFile(const char *filename) {
|
|||
int AssetManager::addCache(AssetCache *cache) {
|
||||
caches.push_back(cache);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -53,7 +53,7 @@ template<class T> class HashTable {
|
|||
// resize should _only_ be called when the HashTable has _no_ data!
|
||||
void resize(int hash_size) {
|
||||
size = hash_size;
|
||||
table = (HashEntry**)realloc(table, sizeof(HashEntry*)*size);
|
||||
table = (HashEntry<T>**)realloc(table, sizeof(HashEntry<T>*)*size);
|
||||
for (int i = 0; i < size; i++) {
|
||||
table[i] = NULL;
|
||||
}
|
||||
|
@ -159,7 +159,7 @@ template<class T> class HashTable {
|
|||
}
|
||||
return iter->data;
|
||||
}*/
|
||||
template <class T> T operator[](char* key) {
|
||||
T operator[](char* key) {
|
||||
int key_hash = 0;
|
||||
int key_len = strlen(key);
|
||||
// get our key hash
|
||||
|
@ -169,7 +169,7 @@ template<class T> class HashTable {
|
|||
// limit it to our HashTable's size
|
||||
key_hash = key_hash % size;
|
||||
// find our hash if it exists
|
||||
HashEntry *entry = table[key_hash];
|
||||
HashEntry<T> *entry = table[key_hash];
|
||||
while (entry != NULL) {
|
||||
if (strcmp(entry->key, key) == 0) {
|
||||
return entry->data;
|
||||
|
@ -179,7 +179,7 @@ template<class T> class HashTable {
|
|||
// doesn't exist, return the user's null value
|
||||
return null;
|
||||
}
|
||||
template <class T> T& operator[](char *key) const {
|
||||
T& operator[](char *key) const {
|
||||
int key_hash = 0;
|
||||
int key_len = strlen(key);
|
||||
// get our key hash
|
||||
|
@ -189,9 +189,9 @@ template<class T> class HashTable {
|
|||
// limit it to our HashTable's size
|
||||
key_hash = key_hash % size;
|
||||
// find our hash if it exists
|
||||
HashEntry *last_entry, *entry = table[key_hash];
|
||||
HashEntry<T> *last_entry, *entry = table[key_hash];
|
||||
if (entry == NULL) {
|
||||
table[key_hash] = new HashEntry(key, null);
|
||||
table[key_hash] = new HashEntry<T>(key, null);
|
||||
return entry->data;
|
||||
}
|
||||
while (entry->next != NULL) {
|
||||
|
@ -201,7 +201,7 @@ template<class T> class HashTable {
|
|||
last_entry = entry;
|
||||
entry = entry->next;
|
||||
}
|
||||
entry->next = new HashEntry(key, null);
|
||||
entry->next = new HashEntry<T>(key, null);
|
||||
return entry->next;
|
||||
}
|
||||
HashEntry<T> *iterate() {
|
||||
|
@ -230,4 +230,4 @@ template<class T> class HashTable {
|
|||
HashEntry<T> *iter;
|
||||
HashEntry<T> *last_iter;
|
||||
};
|
||||
#endif
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue