started work on discovery
This commit is contained in:
parent
19f7e29215
commit
361436ee46
@ -58,6 +58,11 @@ enum {
|
|||||||
* VY_INSUFFICIENT_BUFFER if the provided output buffer is too small */
|
* VY_INSUFFICIENT_BUFFER if the provided output buffer is too small */
|
||||||
VY_DLLEXPORT vy_result vyUTF8ToWStr(const char *utf8, wchar_t *wstr, size_t len);
|
VY_DLLEXPORT vy_result vyUTF8ToWStr(const char *utf8, wchar_t *wstr, size_t len);
|
||||||
|
|
||||||
|
/* Returns VY_SUCCESS if the string was successfully converted,
|
||||||
|
* VY_INVALID_UNICODE if invalid unicode characters were encountered or
|
||||||
|
* VY_INSUFFICIENT_BUFFER if the provided output buffer is too small */
|
||||||
|
VY_DLLEXPORT vy_result vyWStrToUTF8(const wchar_t *wstr, char *utf8, size_t len);
|
||||||
|
|
||||||
/* Relative pointer */
|
/* Relative pointer */
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int32_t off;
|
int32_t off;
|
||||||
|
@ -35,4 +35,24 @@ VY_DLLEXPORT vy_result vyUTF8ToWStr(const char *utf8, wchar_t *wstr, size_t len)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
VY_DLLEXPORT vy_result vyWStrToUTF8(const wchar_t *wstr, char *utf8, size_t len) {
|
||||||
|
#ifdef _WIN32
|
||||||
|
int res = WideCharToMultiByte(CP_UTF8, WC_COMPOSITECHECK, wstr, -1, utf8, (int)len, NULL, NULL);
|
||||||
|
if (res > 0) {
|
||||||
|
return VY_SUCCESS;
|
||||||
|
} else {
|
||||||
|
DWORD err = GetLastError();
|
||||||
|
if (err == ERROR_INSUFFICIENT_BUFFER)
|
||||||
|
return VY_INSUFFICIENT_BUFFER;
|
||||||
|
else if (err == ERROR_NO_UNICODE_TRANSLATION)
|
||||||
|
return VY_INVALID_UNICODE;
|
||||||
|
else {
|
||||||
|
vyReportError("CORE", "Unexpected error in vyWStrToUTF8(): %u", err);
|
||||||
|
return VY_UNKNOWN_ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
@ -25,6 +25,8 @@ extern vy_result vyProcessShaderFile(vy_file_id file,
|
|||||||
uint32_t flags,
|
uint32_t flags,
|
||||||
vy_processor_output *output);
|
vy_processor_output *output);
|
||||||
|
|
||||||
|
extern void vyDiscoverAssets(void);
|
||||||
|
|
||||||
vy_assetc_options g_assetc_options = {
|
vy_assetc_options g_assetc_options = {
|
||||||
.root_directory = ".",
|
.root_directory = ".",
|
||||||
.optimization = VY_ASSET_OPTIMIZATION_NONE,
|
.optimization = VY_ASSET_OPTIMIZATION_NONE,
|
||||||
@ -121,12 +123,11 @@ int main(int argc, char **argv) {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
vyAddFileToProcessingQueue(vyAddFile("shader\\cell.pipeline"), 0);
|
vyDiscoverAssets();
|
||||||
|
|
||||||
vyWaitUntilProcessingIsFinished();
|
vyWaitUntilProcessingIsFinished();
|
||||||
|
|
||||||
vyStopProcessing();
|
vyStopProcessing();
|
||||||
|
|
||||||
vySaveAssetMeta();
|
vySaveAssetMeta();
|
||||||
|
|
||||||
vyShutdownBufferManager();
|
vyShutdownBufferManager();
|
||||||
|
@ -1,5 +1,78 @@
|
|||||||
|
#include "utils.h"
|
||||||
|
#include "assetmeta.h"
|
||||||
|
#include "processing.h"
|
||||||
|
|
||||||
void DiscoverAssets(void) {
|
#include <string.h>
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char path_scratch[1024];
|
||||||
|
unsigned int path_end;
|
||||||
|
} vy_discovery_data;
|
||||||
|
|
||||||
|
static vy_result DirectoryHandler(const char *name, vyIterateDirElementType type, void *user) {
|
||||||
|
vy_discovery_data *data = user;
|
||||||
|
|
||||||
|
size_t name_len = strlen(name);
|
||||||
|
|
||||||
|
if (type == VY_DIR_ELEMENT_TYPE_FILE) {
|
||||||
|
/* Don't parse .as files */
|
||||||
|
if (name_len >= 3) {
|
||||||
|
if (memcmp(&name[name_len - 3], ".as", 3) == 0) {
|
||||||
|
/* Skip */
|
||||||
|
return VY_SUCCESS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check if we know that file */
|
||||||
|
data->path_scratch[data->path_end] = '/';
|
||||||
|
memcpy(data->path_scratch + data->path_end + 1, name, name_len);
|
||||||
|
data->path_scratch[data->path_end + 1 + name_len] = '\0';
|
||||||
|
|
||||||
|
vy_file_id fid = vyAddFile(data->path_scratch);
|
||||||
|
if (vyLookupUID(fid) != VY_INVALID_UID) {
|
||||||
|
vy_assetmeta meta;
|
||||||
|
if (!vyGetAssetMeta(fid, &meta) || (meta.last_changed >= meta.compiled_ts)) {
|
||||||
|
/* The file (may have) changed */
|
||||||
|
vy_result res = vyAddFileToProcessingQueue(fid, 0);
|
||||||
|
if (res != VY_SUCCESS)
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* The file is unchanged, we just need to add it to the output again. */
|
||||||
|
vyLog("ASSETC", "File %s is unchanged.", data->path_scratch);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/* Process it */
|
||||||
|
vy_result res = vyAddFileToProcessingQueue(fid, 0);
|
||||||
|
if (res != VY_SUCCESS)
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
} else if (type == VY_DIR_ELEMENT_TYPE_DIRECTORY) {
|
||||||
|
if (strcmp(name, ".") == 0)
|
||||||
|
return VY_SUCCESS;
|
||||||
|
if (strcmp(name, "..") == 0)
|
||||||
|
return VY_SUCCESS;
|
||||||
|
|
||||||
|
unsigned int path_end_before = data->path_end;
|
||||||
|
data->path_scratch[data->path_end++] = '/';
|
||||||
|
memcpy(data->path_scratch + data->path_end, name, name_len);
|
||||||
|
data->path_scratch[data->path_end + name_len] = '\0';
|
||||||
|
data->path_end += name_len;
|
||||||
|
|
||||||
|
vy_result res = vyIterateDirectory(data->path_scratch, user, DirectoryHandler);
|
||||||
|
if (res != VY_SUCCESS)
|
||||||
|
return res;
|
||||||
|
|
||||||
|
data->path_end = path_end_before;
|
||||||
|
}
|
||||||
|
return VY_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
void vyDiscoverAssets(void) {
|
||||||
|
vy_discovery_data data;
|
||||||
|
data.path_scratch[0] = '.';
|
||||||
|
data.path_scratch[1] = '\0';
|
||||||
|
data.path_end = 1;
|
||||||
|
|
||||||
|
vyIterateDirectory(".", &data, DirectoryHandler);
|
||||||
}
|
}
|
@ -50,4 +50,40 @@ uint64_t vyGetFileModificationTimestamp(vy_file_id fid) {
|
|||||||
ts |= (uint64_t)attribs.ftLastWriteTime.dwHighDateTime << 32;
|
ts |= (uint64_t)attribs.ftLastWriteTime.dwHighDateTime << 32;
|
||||||
return ts;
|
return ts;
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
vy_result vyIterateDirectory(const char *path, void *user, vy_iterate_directory_cb_func iterate_cb) {
|
||||||
|
#ifdef _WIN32
|
||||||
|
vy_result res;
|
||||||
|
WCHAR wpath[MAX_PATH];
|
||||||
|
char wildcard_path[MAX_PATH];
|
||||||
|
strncpy(wildcard_path, path, MAX_PATH);
|
||||||
|
strncat(wildcard_path, "\\*", MAX_PATH - strlen(path));
|
||||||
|
|
||||||
|
res = vyUTF8ToWStr(wildcard_path, wpath, MAX_PATH);
|
||||||
|
if (res != VY_SUCCESS)
|
||||||
|
return res;
|
||||||
|
|
||||||
|
WIN32_FIND_DATAW find;
|
||||||
|
HANDLE h = FindFirstFileW(wpath, &find);
|
||||||
|
if (h == INVALID_HANDLE_VALUE)
|
||||||
|
return VY_UNKNOWN_ERROR;
|
||||||
|
do {
|
||||||
|
char utf8_file[MAX_PATH];
|
||||||
|
res = vyWStrToUTF8(find.cFileName, utf8_file, MAX_PATH);
|
||||||
|
if (res != VY_SUCCESS)
|
||||||
|
break;
|
||||||
|
vyIterateDirElementType type;
|
||||||
|
if (find.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
|
||||||
|
type = VY_DIR_ELEMENT_TYPE_DIRECTORY;
|
||||||
|
else
|
||||||
|
type = VY_DIR_ELEMENT_TYPE_FILE;
|
||||||
|
res = iterate_cb(utf8_file, type, user);
|
||||||
|
if (res != VY_SUCCESS)
|
||||||
|
break;
|
||||||
|
} while (FindNextFileW(h, &find) != 0);
|
||||||
|
|
||||||
|
FindClose(h);
|
||||||
|
return res;
|
||||||
|
#endif
|
||||||
}
|
}
|
@ -13,4 +13,13 @@ uint64_t vyGetCurrentTimestamp(void);
|
|||||||
|
|
||||||
uint64_t vyGetFileModificationTimestamp(vy_file_id fid);
|
uint64_t vyGetFileModificationTimestamp(vy_file_id fid);
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
VY_DIR_ELEMENT_TYPE_FILE,
|
||||||
|
VY_DIR_ELEMENT_TYPE_DIRECTORY,
|
||||||
|
} vyIterateDirElementType;
|
||||||
|
|
||||||
|
typedef vy_result vy_iterate_directory_cb_func(const char *name, vyIterateDirElementType type, void *user);
|
||||||
|
|
||||||
|
vy_result vyIterateDirectory(const char *path, void *user, vy_iterate_directory_cb_func iterate_cb);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user