From 58cf983e5e36255f206bbf653a24f57f68cba193 Mon Sep 17 00:00:00 2001 From: John Alanbrook Date: Sat, 11 Jan 2025 21:07:48 -0600 Subject: [PATCH] fix texture color issue on macos --- scripts/std.js | 7 ++++ shaders/circle.frag.hlsl | 5 ++- source/jsffi.c | 81 ++++++++++++++++++++++------------------ 3 files changed, 55 insertions(+), 38 deletions(-) diff --git a/scripts/std.js b/scripts/std.js index c8f33da5..9220cd33 100644 --- a/scripts/std.js +++ b/scripts/std.js @@ -242,6 +242,13 @@ Cmdline.register_order( prosperon.max_dropped_files=1; prosperon.swap_interval = 1; prosperon.title = "Prosperon"; + prosperon.name = prosperon.title; + prosperon.version = "432r23a"; + prosperon.identifier = "world.pockle.prosperon"; + prosperon.creator = "Pockle World LLC" + prosperon.copyright = "Copyright Pockle World 2025" + prosperon.type = "application" + prosperon.url = "https://github.com/johnbrethauer/prosperon" if (io.exists("config.js")) global.mixin("config.js"); else console.warn("No config.js file found. Starting with default parameters."); diff --git a/shaders/circle.frag.hlsl b/shaders/circle.frag.hlsl index 16caf73c..c0452f75 100644 --- a/shaders/circle.frag.hlsl +++ b/shaders/circle.frag.hlsl @@ -5,6 +5,9 @@ float4 main(PSInput input) : SV_TARGET { float4 color = input.color; - color.a = abs(sdf.circle(input.uv, 1)) <= 0.05 ? 1:0 ; + float2 p = input.uv; + p -= 0.5; + p *= 2; + color.a = abs(sdf.circle(p, 1)) <= 0.005 ? 1:0 ; return color; } \ No newline at end of file diff --git a/source/jsffi.c b/source/jsffi.c index b820829c..0af30e02 100644 --- a/source/jsffi.c +++ b/source/jsffi.c @@ -2203,12 +2203,29 @@ static const JSCFunctionListEntry js_array_funcs[] = { PROTO_FUNC_DEF(array, lerp, 2) }; -JSC_SCALL(game_engine_start, - if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_CAMERA) < 0) - return JS_ThrowReferenceError(js, "Couldn't initialize SDL: %s\n", SDL_GetError()); +#define JS_SDL_PROP(JS, VAL, SDLPROP, PROP) \ +{ \ +JSValue v = JS_GetPropertyStr(JS,VAL,#PROP); \ +const char *str = JS_ToCString(JS, v); \ +SDL_SetAppMetadataProperty(SDLPROP, str); \ +JS_FreeCString(JS,str); \ +JS_FreeValue(js,v); \ +} \ - const char *title = JS_ToCString(js,js_getpropertystr(js,argv[0], "title")); - SDL_Window *new = SDL_CreateWindow(title, js2number(js, js_getproperty(js,argv[0], width_atom)), js2number(js,js_getproperty(js,argv[0], height_atom)), SDL_WINDOW_RESIZABLE); +JSC_SCALL(game_engine_start, + JSValue p = argv[0]; + JS_SDL_PROP(js, p, SDL_PROP_APP_METADATA_NAME_STRING, name) + JS_SDL_PROP(js, p, SDL_PROP_APP_METADATA_VERSION_STRING, version) + JS_SDL_PROP(js, p, SDL_PROP_APP_METADATA_IDENTIFIER_STRING, identifier) + JS_SDL_PROP(js, p, SDL_PROP_APP_METADATA_CREATOR_STRING, creator) + JS_SDL_PROP(js, p, SDL_PROP_APP_METADATA_COPYRIGHT_STRING, copyright) + JS_SDL_PROP(js, p, SDL_PROP_APP_METADATA_URL_STRING, url) + JS_SDL_PROP(js, p, SDL_PROP_APP_METADATA_TYPE_STRING, type) + + if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_CAMERA) < 0) + return JS_ThrowReferenceError(js, "Couldn't initialize SDL: %s\n", SDL_GetError()); + + SDL_Window *new = SDL_CreateWindow("prosperon", js2number(js, js_getproperty(js,argv[0], width_atom)), js2number(js,js_getproperty(js,argv[0], height_atom)), SDL_WINDOW_RESIZABLE); if (!new) return JS_ThrowReferenceError(js, "Couldn't open window: %s\n", SDL_GetError()); @@ -3433,15 +3450,10 @@ SDL_GPUTextureFormat chosen_format = SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM; switch (sfmt) { case SDL_PIXELFORMAT_RGBA32: - case SDL_PIXELFORMAT_ABGR32: - case SDL_PIXELFORMAT_ARGB32: - case SDL_PIXELFORMAT_BGRA32: case SDL_PIXELFORMAT_RGBX8888: case SDL_PIXELFORMAT_XRGB8888: - case SDL_PIXELFORMAT_BGRX8888: case SDL_PIXELFORMAT_XBGR8888: chosen_format = SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM; - break; case SDL_PIXELFORMAT_RGBA4444: case SDL_PIXELFORMAT_ABGR4444: @@ -3466,9 +3478,9 @@ switch (sfmt) { break; default: - surf = SDL_ConvertSurface(surf, SDL_PIXELFORMAT_RGBA8888); + surf = SDL_ConvertSurface(surf, SDL_PIXELFORMAT_RGBA32); dofree = 1; - sfmt = SDL_PIXELFORMAT_RGBA8888; + sfmt = SDL_PIXELFORMAT_RGBA32; pdetails = SDL_GetPixelFormatDetails(sfmt); chosen_format = SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM; has_alpha = true; @@ -3569,25 +3581,25 @@ if (compress) { upload_data = compressed_data; upload_size = blocks_count * block_size; -} else { + } else { // No compression, upload directly upload_data = (unsigned char*)pixel_data; upload_size = pixel_data_size; -} + } -SDL_GPUTransferBuffer *tex_buffer = SDL_CreateGPUTransferBuffer( + SDL_GPUTransferBuffer *tex_buffer = SDL_CreateGPUTransferBuffer( gpu, &(SDL_GPUTransferBufferCreateInfo) { .usage = SDL_GPU_TRANSFERBUFFERUSAGE_UPLOAD, .size = upload_size }); -void *tex_ptr = SDL_MapGPUTransferBuffer(gpu, tex_buffer, false); -memcpy(tex_ptr, upload_data, upload_size); -SDL_UnmapGPUTransferBuffer(gpu, tex_buffer); - -SDL_GPUCommandBuffer *uploadcmd = SDL_AcquireGPUCommandBuffer(gpu); -SDL_GPUCopyPass *copypass = SDL_BeginGPUCopyPass(uploadcmd); -SDL_UploadToGPUTexture( + void *tex_ptr = SDL_MapGPUTransferBuffer(gpu, tex_buffer, false); + memcpy(tex_ptr, upload_data, upload_size); + SDL_UnmapGPUTransferBuffer(gpu, tex_buffer); + + SDL_GPUCommandBuffer *uploadcmd = SDL_AcquireGPUCommandBuffer(gpu); + SDL_GPUCopyPass *copypass = SDL_BeginGPUCopyPass(uploadcmd); + SDL_UploadToGPUTexture( copypass, &(SDL_GPUTextureTransferInfo) { .transfer_buffer = tex_buffer, @@ -3602,23 +3614,20 @@ SDL_UploadToGPUTexture( false ); -SDL_EndGPUCopyPass(copypass); -SDL_SubmitGPUCommandBuffer(uploadcmd); -SDL_ReleaseGPUTransferBuffer(gpu, tex_buffer); + SDL_EndGPUCopyPass(copypass); + SDL_SubmitGPUCommandBuffer(uploadcmd); + SDL_ReleaseGPUTransferBuffer(gpu, tex_buffer); -if (compress) { - free(upload_data); -} + if (compress) { + free(upload_data); + } -ret = SDL_GPUTexture2js(js, tex); -JS_SetProperty(js, ret, width_atom, number2js(js, surf->w)); -JS_SetProperty(js, ret, height_atom, number2js(js, surf->h)); + ret = SDL_GPUTexture2js(js, tex); + JS_SetProperty(js, ret, width_atom, number2js(js, surf->w)); + JS_SetProperty(js, ret, height_atom, number2js(js, surf->h)); -if (dofree) SDL_DestroySurface(surf); -) + if (dofree) SDL_DestroySurface(surf); -JSC_CCALL(gpu_logical_size, - ) static JSValue js_gpu_make_pipeline(JSContext *js, JSValueConst self, int argc, JSValueConst *argv) { @@ -4307,9 +4316,7 @@ static const JSCFunctionListEntry js_SDL_GPUDevice_funcs[] = { MIST_FUNC_DEF(gpu, set_swapchain, 2), MIST_FUNC_DEF(gpu, make_sampler,1), MIST_FUNC_DEF(gpu, load_texture, 2), - MIST_FUNC_DEF(gpu, logical_size, 1), MIST_FUNC_DEF(gpu, texture, 1), -// MIST_FUNC_DEF(gpu, geometry, 2), MIST_FUNC_DEF(gpu, make_sprite_mesh, 2), MIST_FUNC_DEF(gpu, make_quad, 0), MIST_FUNC_DEF(gpu, driver, 0),