renderer now has camera matrix
Some checks failed
Build and Deploy / package-dist (push) Has been cancelled
Build and Deploy / deploy-itch (push) Has been cancelled
Build and Deploy / deploy-gitea (push) Has been cancelled
Build and Deploy / build-windows (CLANG64) (push) Has been cancelled
Build and Deploy / build-linux (push) Has been cancelled

This commit is contained in:
2025-04-21 09:23:50 -05:00
parent b8328657df
commit c8c08d5fbe
3 changed files with 84 additions and 35 deletions

View File

@@ -1,7 +1,5 @@
var render = {} var render = {}
var graphics = use('graphics')
var context var context
render.initialize = function(config) render.initialize = function(config)
@@ -10,7 +8,7 @@ render.initialize = function(config)
title:`Prosperon [${prosperon.version}-${prosperon.revision}]`, title:`Prosperon [${prosperon.version}-${prosperon.revision}]`,
width: 1280, width: 1280,
height: 720, height: 720,
icon: graphics.make_texture(io.slurpbytes('icons/moon.gif')), // icon: graphics.make_texture(io.slurpbytes('icons/moon.gif')),
high_dpi:0, high_dpi:0,
alpha:1, alpha:1,
fullscreen:0, fullscreen:0,
@@ -32,7 +30,8 @@ render.initialize = function(config)
// config[i] ??= default_conf[i] // config[i] ??= default_conf[i]
prosperon.window = prosperon.engine_start({width:500,height:500}) 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 // img here is the engine surface
@@ -84,4 +83,14 @@ render.get_image = function(rect)
return context.get_image(rect) return context.get_image(rect)
} }
render.clear = function()
{
context.clear()
}
render.present = function()
{
context.present()
}
return render return render

View File

@@ -1014,9 +1014,15 @@ void SDL_Window_free(JSRuntime *rt, SDL_Window *w)
SDL_DestroyWindow(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) { 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_GPUComputePass_free(JSRuntime *rt, SDL_GPUComputePass *c) { }
void SDL_GPUCopyPass_free(JSRuntime *rt, SDL_GPUCopyPass *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_SetNumberProperty(props, SDL_PROP_RENDERER_CREATE_PRESENT_VSYNC_NUMBER, 0);
SDL_SetPointerProperty(props, SDL_PROP_RENDERER_CREATE_WINDOW_POINTER, win); SDL_SetPointerProperty(props, SDL_PROP_RENDERER_CREATE_WINDOW_POINTER, win);
SDL_SetStringProperty(props, SDL_PROP_RENDERER_CREATE_NAME_STRING, str); 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); SDL_DestroyProperties(props);
if (!r) return JS_ThrowReferenceError(js, "Error creating renderer: %s",SDL_GetError()); if (!ctx->sdl) {
SDL_SetRenderDrawBlendMode(r, SDL_BLENDMODE_BLEND); free(ctx);
return SDL_Renderer2js(js,r); 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) SDL_GPUShaderFormat js2SDL_GPUShaderFormat(JSContext *js, JSValue v)
@@ -2694,17 +2705,17 @@ static const JSCFunctionListEntry js_SDL_Window_funcs[] = {
}; };
JSC_CCALL(SDL_Renderer_clear, JSC_CCALL(SDL_Renderer_clear,
SDL_Renderer *renderer = js2SDL_Renderer(js,self); SDL_Renderer *renderer = js2renderer_ctx(js,self)->sdl;
SDL_RenderClear(renderer); SDL_RenderClear(renderer);
) )
JSC_CCALL(SDL_Renderer_present, JSC_CCALL(SDL_Renderer_present,
SDL_Renderer *ren = js2SDL_Renderer(js,self); SDL_Renderer *ren = js2renderer_ctx(js,self)->sdl;
SDL_RenderPresent(ren); SDL_RenderPresent(ren);
) )
JSC_CCALL(SDL_Renderer_draw_color, 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]); colorf color = js2color(js,argv[0]);
SDL_SetRenderDrawColorFloat(renderer, color.r,color.g,color.b,color.a); 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, 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]); SDL_Surface *surf = js2SDL_Surface(js,argv[0]);
if (!surf) return JS_ThrowReferenceError(js, "Surface was not a surface."); if (!surf) return JS_ThrowReferenceError(js, "Surface was not a surface.");
SDL_Texture *tex = SDL_CreateTextureFromSurface(r,surf); SDL_Texture *tex = SDL_CreateTextureFromSurface(r,surf);
@@ -2735,7 +2746,7 @@ JSC_CCALL(renderer_load_texture,
) )
JSC_CCALL(renderer_get_image, JSC_CCALL(renderer_get_image,
SDL_Renderer *r = js2SDL_Renderer(js,self); SDL_Renderer *r = js2renderer_ctx(js,self)->sdl;
SDL_Surface *surf = NULL; SDL_Surface *surf = NULL;
if (!JS_IsUndefined(argv[0])) { if (!JS_IsUndefined(argv[0])) {
rect rect = js2rect(js,argv[0]); rect rect = js2rect(js,argv[0]);
@@ -2747,7 +2758,7 @@ JSC_CCALL(renderer_get_image,
) )
JSC_CCALL(renderer_line, 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])) { if (JS_IsArray(js,argv[0])) {
int len = js_arrlen(js,argv[0]); int len = js_arrlen(js,argv[0]);
@@ -2763,7 +2774,7 @@ JSC_CCALL(renderer_line,
) )
JSC_CCALL(renderer_point, 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])) { if (JS_IsArray(js,argv[0])) {
int len = js_arrlen(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 // Should take a single struct with pos, color, uv, and indices arrays
JSC_CCALL(renderer_geometry, 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 pos = JS_GetPropertyStr(js,argv[1], "pos");
JSValue color = JS_GetPropertyStr(js,argv[1], "color"); JSValue color = JS_GetPropertyStr(js,argv[1], "color");
JSValue uv = JS_GetPropertyStr(js,argv[1], "uv"); JSValue uv = JS_GetPropertyStr(js,argv[1], "uv");
@@ -2845,13 +2856,13 @@ JSC_CCALL(renderer_geometry,
) )
JSC_CCALL(renderer_logical_size, 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]); HMM_Vec2 v = js2vec2(js,argv[0]);
SDL_SetRenderLogicalPresentation(r,v.x,v.y,SDL_LOGICAL_PRESENTATION_INTEGER_SCALE); SDL_SetRenderLogicalPresentation(r,v.x,v.y,SDL_LOGICAL_PRESENTATION_INTEGER_SCALE);
) )
JSC_CCALL(renderer_viewport, JSC_CCALL(renderer_viewport,
SDL_Renderer *r = js2SDL_Renderer(js,self); SDL_Renderer *r = js2renderer_ctx(js,self)->sdl;
if (JS_IsUndefined(argv[0])) if (JS_IsUndefined(argv[0]))
SDL_SetRenderViewport(r,NULL); SDL_SetRenderViewport(r,NULL);
else { else {
@@ -2861,7 +2872,7 @@ JSC_CCALL(renderer_viewport,
) )
JSC_CCALL(renderer_clip, JSC_CCALL(renderer_clip,
SDL_Renderer *r = js2SDL_Renderer(js,self); SDL_Renderer *r = js2renderer_ctx(js,self)->sdl;
if (JS_IsUndefined(argv[0])) if (JS_IsUndefined(argv[0]))
SDL_SetRenderClipRect(r,NULL); SDL_SetRenderClipRect(r,NULL);
else { else {
@@ -2871,19 +2882,19 @@ JSC_CCALL(renderer_clip,
) )
JSC_CCALL(renderer_scale, 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]); HMM_Vec2 v = js2vec2(js,argv[0]);
SDL_SetRenderScale(r, v.x, v.y); SDL_SetRenderScale(r, v.x, v.y);
) )
JSC_CCALL(renderer_vsync, 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]))); return JS_NewBool(js, SDL_SetRenderVSync(r,js2number(js,argv[0])));
) )
// This returns the coordinates inside the // This returns the coordinates inside the
JSC_CCALL(renderer_coords, JSC_CCALL(renderer_coords,
SDL_Renderer *r = js2SDL_Renderer(js,self); SDL_Renderer *r = js2renderer_ctx(js,self)->sdl;
HMM_Vec2 pos, coord; HMM_Vec2 pos, coord;
pos = js2vec2(js,argv[0]); pos = js2vec2(js,argv[0]);
SDL_RenderCoordinatesFromWindow(r,pos.x,pos.y, &coord.x, &coord.y); SDL_RenderCoordinatesFromWindow(r,pos.x,pos.y, &coord.x, &coord.y);
@@ -2891,9 +2902,12 @@ JSC_CCALL(renderer_coords,
) )
JSC_CCALL(renderer_camera, JSC_CCALL(renderer_camera,
int centered = JS_ToBool(js,argv[1]); SDL_Renderer *ren = js2renderer_ctx(js,self)->sdl;
SDL_Renderer *ren = js2SDL_Renderer(js,self); JSValue camera = argv[0];
SDL_Rect vp; SDL_Rect vp;
int centered = JS_ToBool(js,argv[1]);
SDL_GetRenderViewport(ren, &vp); SDL_GetRenderViewport(ren, &vp);
HMM_Mat3 proj; HMM_Mat3 proj;
proj.Columns[0] = (HMM_Vec3){1,0,0}; proj.Columns[0] = (HMM_Vec3){1,0,0};
@@ -2918,7 +2932,7 @@ JSC_CCALL(renderer_screen2world,
) )
JSC_CCALL(renderer_target, JSC_CCALL(renderer_target,
SDL_Renderer *r = js2SDL_Renderer(js,self); SDL_Renderer *r = js2renderer_ctx(js,self)->sdl;
if (JS_IsUndefined(argv[0])) if (JS_IsUndefined(argv[0]))
SDL_SetRenderTarget(r, NULL); SDL_SetRenderTarget(r, NULL);
else { else {
@@ -2990,7 +3004,7 @@ JSC_CCALL(renderer_make_sprite_mesh,
JS_SetProperty(js, ret, count, number2js(js, count)); 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, draw_color, 1),
MIST_FUNC_DEF(SDL_Renderer, present, 0), MIST_FUNC_DEF(SDL_Renderer, present, 0),
MIST_FUNC_DEF(SDL_Renderer, clear, 0), MIST_FUNC_DEF(SDL_Renderer, clear, 0),
@@ -7060,7 +7074,7 @@ void ffi_load(JSContext *js)
QJSCLASSPREP_NO_FUNCS(SDL_Cursor) QJSCLASSPREP_NO_FUNCS(SDL_Cursor)
QJSCLASSPREP_FUNCS(SDL_Camera) QJSCLASSPREP_FUNCS(SDL_Camera)
QJSCLASSPREP_FUNCS(SDL_Renderer) QJSCLASSPREP_FUNCS(renderer_ctx)
QJSCLASSPREP_FUNCS(SDL_GPUDevice) QJSCLASSPREP_FUNCS(SDL_GPUDevice)
QJSCLASSPREP_FUNCS(SDL_GPUTexture) QJSCLASSPREP_FUNCS(SDL_GPUTexture)

View File

@@ -1,15 +1,41 @@
var render = use('sdl_render') var render = use('sdl_render')
console.log("HERE") var os = use('os')
render.initialize({})
var draw2d = use('draw2d') render.initialize({
width:500,
height:500,
resolution_x:500,
resolution_y:500,
mode: "letterboxed"
})
var draw = use('draw2d')
var camera = { var camera = {
x: 0, transform: os.make_transform(),
y: 0,
zoom: 1, zoom: 1,
surface: undefined, surface: undefined,
viewport: {x:0,y:0,width:1,height:1} 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) $_.delay($_.stop, 3)
function loop()
{
render.clear()
draw.rectangle({x:50,y:-50,width:50,height:50})
render.present()
$_.delay(loop, 1/60)
}
loop()