diff --git a/scripts/modules/sdl_render.js b/scripts/modules/sdl_render.js index 9f9e58de..83e82839 100644 --- a/scripts/modules/sdl_render.js +++ b/scripts/modules/sdl_render.js @@ -1,7 +1,5 @@ var render = {} -var graphics = use('graphics') - var context render.initialize = function(config) @@ -10,7 +8,7 @@ render.initialize = function(config) title:`Prosperon [${prosperon.version}-${prosperon.revision}]`, width: 1280, height: 720, - icon: graphics.make_texture(io.slurpbytes('icons/moon.gif')), +// icon: graphics.make_texture(io.slurpbytes('icons/moon.gif')), high_dpi:0, alpha:1, fullscreen:0, @@ -32,7 +30,8 @@ render.initialize = function(config) // config[i] ??= default_conf[i] prosperon.window = prosperon.engine_start({width:500,height:500}) - context = prosperon.window.make_renderer() + console.log(prosperon.window) + context = prosperon.window.make_renderer("vulkan") } // img here is the engine surface @@ -84,4 +83,14 @@ render.get_image = function(rect) return context.get_image(rect) } +render.clear = function() +{ + context.clear() +} + +render.present = function() +{ + context.present() +} + return render diff --git a/source/jsffi.c b/source/jsffi.c index 6e030064..ccccc2f4 100644 --- a/source/jsffi.c +++ b/source/jsffi.c @@ -1014,9 +1014,15 @@ void SDL_Window_free(JSRuntime *rt, SDL_Window *w) SDL_DestroyWindow(w); } -void SDL_Renderer_free(JSRuntime *rt, SDL_Renderer *r) +typedef struct renderer_ctx { + SDL_Renderer *sdl; + HMM_Mat4 cam; +} renderer_ctx; + +void renderer_ctx_free(JSRuntime *rt, renderer_ctx *ctx) { - SDL_DestroyRenderer(r); + SDL_DestroyRenderer(ctx->sdl); + free(ctx); } void SDL_Surface_free(JSRuntime *rt, SDL_Surface *s) { @@ -1044,7 +1050,7 @@ void SDL_GPUCommandBuffer_free(JSRuntime *rt, SDL_GPUCommandBuffer *c) { } -QJSCLASS(SDL_Renderer,) +QJSCLASS(renderer_ctx,) void SDL_GPUComputePass_free(JSRuntime *rt, SDL_GPUComputePass *c) { } void SDL_GPUCopyPass_free(JSRuntime *rt, SDL_GPUCopyPass *c) { } @@ -2554,11 +2560,16 @@ JSC_SCALL(SDL_Window_make_renderer, SDL_SetNumberProperty(props, SDL_PROP_RENDERER_CREATE_PRESENT_VSYNC_NUMBER, 0); SDL_SetPointerProperty(props, SDL_PROP_RENDERER_CREATE_WINDOW_POINTER, win); SDL_SetStringProperty(props, SDL_PROP_RENDERER_CREATE_NAME_STRING, str); - SDL_Renderer *r = SDL_CreateRendererWithProperties(props); + renderer_ctx *ctx = malloc(sizeof(*ctx)); + ctx->sdl = SDL_CreateRendererWithProperties(props); + ctx->cam = HMM_M4D(1.0); SDL_DestroyProperties(props); - if (!r) return JS_ThrowReferenceError(js, "Error creating renderer: %s",SDL_GetError()); - SDL_SetRenderDrawBlendMode(r, SDL_BLENDMODE_BLEND); - return SDL_Renderer2js(js,r); + if (!ctx->sdl) { + free(ctx); + return JS_ThrowReferenceError(js, "Error creating renderer: %s",SDL_GetError()); + } + SDL_SetRenderDrawBlendMode(ctx->sdl, SDL_BLENDMODE_BLEND); + return renderer_ctx2js(js,ctx); ) SDL_GPUShaderFormat js2SDL_GPUShaderFormat(JSContext *js, JSValue v) @@ -2694,17 +2705,17 @@ static const JSCFunctionListEntry js_SDL_Window_funcs[] = { }; JSC_CCALL(SDL_Renderer_clear, - SDL_Renderer *renderer = js2SDL_Renderer(js,self); + SDL_Renderer *renderer = js2renderer_ctx(js,self)->sdl; SDL_RenderClear(renderer); ) JSC_CCALL(SDL_Renderer_present, - SDL_Renderer *ren = js2SDL_Renderer(js,self); + SDL_Renderer *ren = js2renderer_ctx(js,self)->sdl; SDL_RenderPresent(ren); ) JSC_CCALL(SDL_Renderer_draw_color, - SDL_Renderer *renderer = js2SDL_Renderer(js,self); + SDL_Renderer *renderer = js2renderer_ctx(js,self)->sdl; colorf color = js2color(js,argv[0]); SDL_SetRenderDrawColorFloat(renderer, color.r,color.g,color.b,color.a); ) @@ -2724,7 +2735,7 @@ SDL_GPUColorTargetInfo js2SDL_GPUColorTargetInfo(JSContext *js, JSValue v) } JSC_CCALL(renderer_load_texture, - SDL_Renderer *r = js2SDL_Renderer(js,self); + SDL_Renderer *r = js2renderer_ctx(js,self)->sdl; SDL_Surface *surf = js2SDL_Surface(js,argv[0]); if (!surf) return JS_ThrowReferenceError(js, "Surface was not a surface."); SDL_Texture *tex = SDL_CreateTextureFromSurface(r,surf); @@ -2735,7 +2746,7 @@ JSC_CCALL(renderer_load_texture, ) JSC_CCALL(renderer_get_image, - SDL_Renderer *r = js2SDL_Renderer(js,self); + SDL_Renderer *r = js2renderer_ctx(js,self)->sdl; SDL_Surface *surf = NULL; if (!JS_IsUndefined(argv[0])) { rect rect = js2rect(js,argv[0]); @@ -2747,7 +2758,7 @@ JSC_CCALL(renderer_get_image, ) JSC_CCALL(renderer_line, - SDL_Renderer *r = js2SDL_Renderer(js,self); + SDL_Renderer *r = js2renderer_ctx(js,self)->sdl; if (JS_IsArray(js,argv[0])) { int len = js_arrlen(js,argv[0]); @@ -2763,7 +2774,7 @@ JSC_CCALL(renderer_line, ) JSC_CCALL(renderer_point, - SDL_Renderer *r = js2SDL_Renderer(js,self); + SDL_Renderer *r = js2renderer_ctx(js,self)->sdl; if (JS_IsArray(js,argv[0])) { int len = js_arrlen(js,argv[0]); @@ -2811,7 +2822,7 @@ void Translate2DPoints(HMM_Vec2 *points, int count, HMM_Vec3 position, HMM_Quat // Should take a single struct with pos, color, uv, and indices arrays JSC_CCALL(renderer_geometry, - SDL_Renderer *r = js2SDL_Renderer(js,self); + SDL_Renderer *r = js2renderer_ctx(js,self)->sdl; JSValue pos = JS_GetPropertyStr(js,argv[1], "pos"); JSValue color = JS_GetPropertyStr(js,argv[1], "color"); JSValue uv = JS_GetPropertyStr(js,argv[1], "uv"); @@ -2845,13 +2856,13 @@ JSC_CCALL(renderer_geometry, ) JSC_CCALL(renderer_logical_size, - SDL_Renderer *r = js2SDL_Renderer(js,self); + SDL_Renderer *r = js2renderer_ctx(js,self)->sdl; HMM_Vec2 v = js2vec2(js,argv[0]); SDL_SetRenderLogicalPresentation(r,v.x,v.y,SDL_LOGICAL_PRESENTATION_INTEGER_SCALE); ) JSC_CCALL(renderer_viewport, - SDL_Renderer *r = js2SDL_Renderer(js,self); + SDL_Renderer *r = js2renderer_ctx(js,self)->sdl; if (JS_IsUndefined(argv[0])) SDL_SetRenderViewport(r,NULL); else { @@ -2861,7 +2872,7 @@ JSC_CCALL(renderer_viewport, ) JSC_CCALL(renderer_clip, - SDL_Renderer *r = js2SDL_Renderer(js,self); + SDL_Renderer *r = js2renderer_ctx(js,self)->sdl; if (JS_IsUndefined(argv[0])) SDL_SetRenderClipRect(r,NULL); else { @@ -2871,19 +2882,19 @@ JSC_CCALL(renderer_clip, ) JSC_CCALL(renderer_scale, - SDL_Renderer *r = js2SDL_Renderer(js,self); + SDL_Renderer *r = js2renderer_ctx(js,self)->sdl; HMM_Vec2 v = js2vec2(js,argv[0]); SDL_SetRenderScale(r, v.x, v.y); ) JSC_CCALL(renderer_vsync, - SDL_Renderer *r = js2SDL_Renderer(js,self); + SDL_Renderer *r = js2renderer_ctx(js,self)->sdl; return JS_NewBool(js, SDL_SetRenderVSync(r,js2number(js,argv[0]))); ) // This returns the coordinates inside the JSC_CCALL(renderer_coords, - SDL_Renderer *r = js2SDL_Renderer(js,self); + SDL_Renderer *r = js2renderer_ctx(js,self)->sdl; HMM_Vec2 pos, coord; pos = js2vec2(js,argv[0]); SDL_RenderCoordinatesFromWindow(r,pos.x,pos.y, &coord.x, &coord.y); @@ -2891,9 +2902,12 @@ JSC_CCALL(renderer_coords, ) JSC_CCALL(renderer_camera, - int centered = JS_ToBool(js,argv[1]); - SDL_Renderer *ren = js2SDL_Renderer(js,self); + SDL_Renderer *ren = js2renderer_ctx(js,self)->sdl; + JSValue camera = argv[0]; + SDL_Rect vp; + + int centered = JS_ToBool(js,argv[1]); SDL_GetRenderViewport(ren, &vp); HMM_Mat3 proj; proj.Columns[0] = (HMM_Vec3){1,0,0}; @@ -2918,7 +2932,7 @@ JSC_CCALL(renderer_screen2world, ) JSC_CCALL(renderer_target, - SDL_Renderer *r = js2SDL_Renderer(js,self); + SDL_Renderer *r = js2renderer_ctx(js,self)->sdl; if (JS_IsUndefined(argv[0])) SDL_SetRenderTarget(r, NULL); else { @@ -2990,7 +3004,7 @@ JSC_CCALL(renderer_make_sprite_mesh, JS_SetProperty(js, ret, count, number2js(js, count)); ) -static const JSCFunctionListEntry js_SDL_Renderer_funcs[] = { +static const JSCFunctionListEntry js_renderer_ctx_funcs[] = { MIST_FUNC_DEF(SDL_Renderer, draw_color, 1), MIST_FUNC_DEF(SDL_Renderer, present, 0), MIST_FUNC_DEF(SDL_Renderer, clear, 0), @@ -7060,7 +7074,7 @@ void ffi_load(JSContext *js) QJSCLASSPREP_NO_FUNCS(SDL_Cursor) QJSCLASSPREP_FUNCS(SDL_Camera) - QJSCLASSPREP_FUNCS(SDL_Renderer) + QJSCLASSPREP_FUNCS(renderer_ctx) QJSCLASSPREP_FUNCS(SDL_GPUDevice) QJSCLASSPREP_FUNCS(SDL_GPUTexture) diff --git a/tests/camera.js b/tests/camera.js index 775d37f5..b2890ed7 100644 --- a/tests/camera.js +++ b/tests/camera.js @@ -1,15 +1,41 @@ var render = use('sdl_render') -console.log("HERE") -render.initialize({}) +var os = use('os') -var draw2d = use('draw2d') +render.initialize({ + width:500, + height:500, + resolution_x:500, + resolution_y:500, + mode: "letterboxed" +}) + +var draw = use('draw2d') var camera = { - x: 0, - y: 0, + transform: os.make_transform(), zoom: 1, surface: undefined, viewport: {x:0,y:0,width:1,height:1} } +var hudcam = { + x: 0, + y: 0, + mode: 'ortho', + viewport: {x:0,y:0,width:1,height:1}, + surface:undefined, +} + $_.delay($_.stop, 3) + +function loop() +{ + render.clear() + draw.rectangle({x:50,y:-50,width:50,height:50}) + render.present() + $_.delay(loop, 1/60) +} + +loop() + +