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