oc_render uses currently selected surface
This commit is contained in:
parent
b223abcd5b
commit
e6a3ac7694
|
@ -65,7 +65,7 @@ oc_canvas_select(canvas); // make the canvas current
|
|||
//... add commands to the canvas command buffer using drawing functions
|
||||
|
||||
oc_surface_select(surface); // select the canvas surface
|
||||
oc_render(surface, canvas); // render the canvas commands into it
|
||||
oc_render(canvas); // render the canvas commands into it
|
||||
oc_surface_present(surface); // display the result
|
||||
```
|
||||
|
||||
|
|
|
@ -16,8 +16,8 @@ oc_surface oc_surface_gles();
|
|||
void oc_surface_destroy(oc_surface surface);
|
||||
|
||||
void oc_surface_select(oc_surface surface);
|
||||
void oc_surface_present(oc_surface surface);
|
||||
void oc_surface_deselect(void);
|
||||
void oc_surface_present(oc_surface surface);
|
||||
|
||||
oc_vec2 oc_surface_get_size(oc_surface surface);
|
||||
oc_vec2 oc_surface_contents_scaling(oc_surface surface);
|
||||
|
@ -32,7 +32,7 @@ bool oc_canvas_is_nil(oc_canvas canvas);
|
|||
oc_canvas oc_canvas_create(void);
|
||||
void oc_canvas_destroy(oc_canvas canvas);
|
||||
oc_canvas oc_canvas_set_current(oc_canvas canvas);
|
||||
void oc_render(oc_surface surface, oc_canvas canvas);
|
||||
void oc_render(oc_canvas canvas);
|
||||
|
||||
//------------------------------------------------------------------------------------------
|
||||
// transform and clipping
|
||||
|
|
|
@ -465,7 +465,7 @@ ORCA_EXPORT void oc_on_frame_refresh(void)
|
|||
oc_matrix_pop();
|
||||
|
||||
oc_surface_select(surface);
|
||||
oc_render(surface, canvas);
|
||||
oc_render(canvas);
|
||||
oc_surface_present(surface);
|
||||
|
||||
oc_arena_clear(oc_scratch());
|
||||
|
|
|
@ -133,6 +133,6 @@ ORCA_EXPORT void oc_on_frame_refresh(void)
|
|||
oc_circle_fill(centerX, centerY, 10 * uiScale);
|
||||
|
||||
oc_surface_select(surface);
|
||||
oc_render(surface, canvas);
|
||||
oc_render(canvas);
|
||||
oc_surface_present(surface);
|
||||
}
|
||||
|
|
|
@ -355,7 +355,7 @@ ORCA_EXPORT void oc_on_frame_refresh(void)
|
|||
oc_canvas_select(canvas);
|
||||
oc_surface_select(surface);
|
||||
oc_ui_draw();
|
||||
oc_render(surface, canvas);
|
||||
oc_render(canvas);
|
||||
oc_surface_present(surface);
|
||||
|
||||
oc_arena_clear(oc_scratch());
|
||||
|
|
|
@ -87,7 +87,7 @@ int main()
|
|||
oc_image_draw_region(image1.image, image1.rect, (oc_rect){ 100, 100, 300, 300 });
|
||||
oc_image_draw_region(image2.image, image2.rect, (oc_rect){ 300, 200, 300, 300 });
|
||||
|
||||
oc_render(surface, canvas);
|
||||
oc_render(canvas);
|
||||
oc_surface_present(surface);
|
||||
|
||||
oc_arena_clear(oc_scratch());
|
||||
|
|
|
@ -180,7 +180,7 @@ int main()
|
|||
frameTime,
|
||||
1. / frameTime);
|
||||
|
||||
oc_render(surface, canvas);
|
||||
oc_render(canvas);
|
||||
oc_surface_present(surface);
|
||||
|
||||
oc_arena_clear(oc_scratch());
|
||||
|
|
|
@ -102,7 +102,7 @@ int main()
|
|||
oc_image_draw(image, (oc_rect){ 100, 100, 300, 300 });
|
||||
oc_image_draw(image2, (oc_rect){ 300, 200, 300, 300 });
|
||||
|
||||
oc_render(surface, canvas);
|
||||
oc_render(canvas);
|
||||
oc_surface_present(surface);
|
||||
|
||||
oc_arena_clear(oc_scratch());
|
||||
|
|
|
@ -95,7 +95,7 @@ int main()
|
|||
oc_set_color_rgba(1, 0, 0, 1);
|
||||
oc_rectangle_fill(100, 100, 300, 150);
|
||||
|
||||
oc_render(surface1, canvas1);
|
||||
oc_render(canvas1);
|
||||
|
||||
//*
|
||||
oc_surface_select(surface2);
|
||||
|
@ -107,7 +107,7 @@ int main()
|
|||
oc_set_color_rgba(0, 0, 1, 1);
|
||||
oc_rectangle_fill(200, 200, 300, 200);
|
||||
|
||||
oc_render(surface2, canvas2);
|
||||
oc_render(canvas2);
|
||||
//*/
|
||||
|
||||
oc_surface_present(surface1);
|
||||
|
|
|
@ -298,7 +298,7 @@ int main()
|
|||
f64 startFlushTime = oc_clock_time(OC_CLOCK_MONOTONIC);
|
||||
|
||||
oc_surface_select(surface);
|
||||
oc_render(surface, canvas);
|
||||
oc_render(canvas);
|
||||
|
||||
f64 startPresentTime = oc_clock_time(OC_CLOCK_MONOTONIC);
|
||||
oc_surface_present(surface);
|
||||
|
|
|
@ -36,7 +36,7 @@ i32 render_thread(void* user)
|
|||
oc_set_color_rgba(1, 0, 0, 1);
|
||||
oc_rectangle_fill(100, 100, 300, 150);
|
||||
|
||||
oc_render(surface, canvas);
|
||||
oc_render(canvas);
|
||||
|
||||
oc_surface_present(surface);
|
||||
|
||||
|
|
|
@ -198,7 +198,7 @@ int main()
|
|||
1. / frameTime);
|
||||
|
||||
oc_surface_select(surface);
|
||||
oc_render(surface, canvas);
|
||||
oc_render(canvas);
|
||||
oc_surface_present(surface);
|
||||
|
||||
oc_arena_clear(oc_scratch());
|
||||
|
|
|
@ -233,7 +233,7 @@ int main()
|
|||
frameTime,
|
||||
1. / frameTime);
|
||||
|
||||
oc_render(surface, canvas);
|
||||
oc_render(canvas);
|
||||
oc_surface_present(surface);
|
||||
|
||||
oc_input_next_frame(&inputState);
|
||||
|
|
|
@ -632,7 +632,7 @@ int main()
|
|||
|
||||
oc_ui_draw();
|
||||
|
||||
oc_render(surface, canvas);
|
||||
oc_render(canvas);
|
||||
oc_surface_present(surface);
|
||||
|
||||
oc_arena_clear(scratch);
|
||||
|
|
|
@ -115,9 +115,11 @@ ORCA_API oc_surface oc_surface_gles(); //DOC: create a surface for use with GL
|
|||
|
||||
ORCA_API void oc_surface_destroy(oc_surface surface); //DOC: destroys the surface
|
||||
|
||||
ORCA_API void oc_surface_select(oc_surface surface); //DOC: selects the surface in the current thread before drawing
|
||||
ORCA_API void oc_surface_select(oc_surface surface); //DOC: selects the surface in the current thread before drawing
|
||||
ORCA_API void oc_surface_deselect(void); //DOC: deselects the current thread's previously selected surface
|
||||
ORCA_API oc_surface oc_surface_get_selected();
|
||||
|
||||
ORCA_API void oc_surface_present(oc_surface surface); //DOC: presents the surface to its window
|
||||
ORCA_API void oc_surface_deselect(void); //DOC: deselects the current thread's previously selected surface
|
||||
|
||||
ORCA_API oc_vec2 oc_surface_get_size(oc_surface surface);
|
||||
ORCA_API oc_vec2 oc_surface_contents_scaling(oc_surface surface); //DOC: returns the scaling of the surface (pixels = points * scale)
|
||||
|
@ -211,10 +213,10 @@ typedef struct oc_text_extents
|
|||
ORCA_API oc_canvas oc_canvas_nil(void); //DOC: returns a nil canvas
|
||||
ORCA_API bool oc_canvas_is_nil(oc_canvas canvas); //DOC: true if canvas is nil
|
||||
|
||||
ORCA_API oc_canvas oc_canvas_create(void); //DOC: create a new canvas
|
||||
ORCA_API void oc_canvas_destroy(oc_canvas canvas); //DOC: destroys canvas
|
||||
ORCA_API oc_canvas oc_canvas_select(oc_canvas canvas); //DOC: selects canvas in the current thread
|
||||
ORCA_API void oc_render(oc_surface surface, oc_canvas canvas); //DOC: renders all canvas commands onto surface
|
||||
ORCA_API oc_canvas oc_canvas_create(void); //DOC: create a new canvas
|
||||
ORCA_API void oc_canvas_destroy(oc_canvas canvas); //DOC: destroys canvas
|
||||
ORCA_API oc_canvas oc_canvas_select(oc_canvas canvas); //DOC: selects canvas in the current thread
|
||||
ORCA_API void oc_render(oc_canvas canvas); //DOC: renders all canvas commands onto surface
|
||||
|
||||
//------------------------------------------------------------------------------------------
|
||||
//SECTION: fonts
|
||||
|
|
|
@ -219,6 +219,14 @@ void* oc_graphics_data_from_handle(oc_graphics_handle_kind kind, u64 h)
|
|||
return (data);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------------------
|
||||
//NOTE(martin): surface nil and is nil
|
||||
//------------------------------------------------------------------------------------------
|
||||
|
||||
oc_surface oc_surface_nil() { return ((oc_surface){ .h = 0 }); }
|
||||
|
||||
bool oc_surface_is_nil(oc_surface surface) { return (surface.h == 0); }
|
||||
|
||||
//------------------------------------------------------------------------------------------
|
||||
//NOTE(martin): graphics canvas internal
|
||||
//------------------------------------------------------------------------------------------
|
||||
|
@ -926,13 +934,14 @@ oc_canvas oc_canvas_select(oc_canvas canvas)
|
|||
return (old);
|
||||
}
|
||||
|
||||
void oc_render(oc_surface surface, oc_canvas canvas)
|
||||
void oc_render(oc_canvas canvas)
|
||||
{
|
||||
oc_surface selectedSurface = oc_surface_get_selected();
|
||||
oc_canvas_data* canvasData = oc_canvas_data_from_handle(canvas);
|
||||
if(canvasData)
|
||||
if(canvasData && !oc_surface_is_nil(selectedSurface))
|
||||
{
|
||||
int eltCount = canvasData->path.startIndex + canvasData->path.count;
|
||||
oc_surface_render_commands(surface,
|
||||
oc_surface_render_commands(selectedSurface,
|
||||
canvasData->clearColor,
|
||||
canvasData->primitiveCount,
|
||||
canvasData->primitives,
|
||||
|
|
|
@ -14,6 +14,11 @@
|
|||
|
||||
oc_thread_local oc_surface oc_selectedSurface = { 0 };
|
||||
|
||||
oc_surface oc_surface_get_selected()
|
||||
{
|
||||
return (oc_selectedSurface);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------
|
||||
// typed handles functions
|
||||
//---------------------------------------------------------------
|
||||
|
@ -98,10 +103,6 @@ bool oc_is_surface_backend_available(oc_surface_api api)
|
|||
return (result);
|
||||
}
|
||||
|
||||
oc_surface oc_surface_nil() { return ((oc_surface){ .h = 0 }); }
|
||||
|
||||
bool oc_surface_is_nil(oc_surface surface) { return (surface.h == 0); }
|
||||
|
||||
oc_surface oc_surface_create_for_window(oc_window window, oc_surface_api api)
|
||||
{
|
||||
if(oc_graphicsData.init)
|
||||
|
|
|
@ -836,7 +836,7 @@ i32 orca_runloop(void* user)
|
|||
oc_clear();
|
||||
}
|
||||
|
||||
oc_render(app->debugOverlay.surface, app->debugOverlay.canvas);
|
||||
oc_render(app->debugOverlay.canvas);
|
||||
oc_surface_present(app->debugOverlay.surface);
|
||||
|
||||
oc_arena_clear(oc_scratch());
|
||||
|
@ -886,24 +886,13 @@ int main(int argc, char** argv)
|
|||
#if OC_PLATFORM_WINDOWS
|
||||
//NOTE(martin): on windows we set all surfaces to non-synced, and do a single "manual" wait here.
|
||||
// on macOS each surface is individually synced to the monitor refresh rate but don't block each other
|
||||
oc_surface_swap_interval(app->debugOverlay.surface, 0);
|
||||
oc_surface_swap_interval(app->debugOverlay.surface, 0);
|
||||
#else
|
||||
oc_surface_swap_interval(app->debugOverlay.surface, 1);
|
||||
#endif
|
||||
|
||||
oc_surface_deselect();
|
||||
|
||||
//WARN: this is a workaround to avoid stalling the first few times we acquire drawables from
|
||||
// the surfaces... This should probably be fixed in the implementation of mtl_surface!
|
||||
|
||||
for(int i = 0; i < 3; i++)
|
||||
{
|
||||
oc_surface_select(app->debugOverlay.surface);
|
||||
oc_canvas_select(app->debugOverlay.canvas);
|
||||
oc_render(app->debugOverlay.surface, app->debugOverlay.canvas);
|
||||
oc_surface_present(app->debugOverlay.surface);
|
||||
}
|
||||
|
||||
oc_ui_init(&app->debugOverlay.ui);
|
||||
|
||||
//NOTE: show window and start runloop
|
||||
|
|
|
@ -77,6 +77,18 @@
|
|||
{"name": "surface",
|
||||
"type": {"name": "oc_surface", "tag": "S"}}]
|
||||
},
|
||||
{
|
||||
"name": "oc_surface_deselect",
|
||||
"cname": "oc_surface_deselect",
|
||||
"ret": {"name": "void", "tag": "v"},
|
||||
"args": []
|
||||
},
|
||||
{
|
||||
"name": "oc_surface_get_selected",
|
||||
"cname": "oc_surface_get_selected",
|
||||
"ret": {"name": "oc_surface", "tag": "S"},
|
||||
"args": []
|
||||
},
|
||||
{
|
||||
"name": "oc_surface_present",
|
||||
"cname": "oc_surface_present",
|
||||
|
|
Loading…
Reference in New Issue