|
- #include "renderer/renderer_private.h"
- #include "renderer/software_renderer.h"
-
- #include "perf_monitor.h"
- #include "texture_private.h"
-
- #include "sww/app.h"
-
- swwRenderer *swwRenderer_CreateAttachWindow(swwWindow *win,
- swwRendererType type) {
- swwRenderer *o = NULL;
- switch (type) {
- case kSoftwareRenderer:
- default: {
- o = SoftwareRenderer_CreateAttachWindow(win);
- }
- }
-
- if (o != NULL) {
- o->perf_monitor = NULL;
- }
-
- return o;
- }
-
- swwRenderer *swwRenderer_CreateOffscreen(uint32_t width, uint32_t height,
- swwRendererType type) {
- swwRenderer *o = NULL;
- switch (type) {
- case kSoftwareRenderer:
- default: {
- o = SoftwareRenderer_CreateOffscreen(width, height);
- }
- }
-
- if (o != NULL) {
- o->perf_monitor = NULL;
- }
-
- return o;
- }
-
- void swwRenderer_Destroy(swwRenderer *o) {
- if (o != NULL) {
- if (o->perf_monitor != NULL) {
- swwPerfMonitor_Destroy(o->perf_monitor);
- o->perf_monitor = NULL;
- }
- o->destroy(o);
- }
- }
-
- swwRendererType swwRenderer_GetType(swwRenderer *o) { return o->type; }
-
- void swwRenderer_SetFlags(swwRenderer *o, uint32_t flags) {}
-
- uint32_t swwRenderer_GetFlags(swwRenderer *o) { return 0; }
-
- void swwRenderer_GetSize(swwRenderer *o, Sizei *s) { o->get_size(o, s); }
-
- void swwRenderer_DrawPixel(swwRenderer *o, Point2i p, uint32_t color) {
- o->draw_pixel(o, p, color);
- }
-
- uint32_t swwRenderer_GetPixel(swwRenderer *o, Point2i p) {
- return o->get_pixel(o, p);
- }
-
- void swwRenderer_DrawLine(swwRenderer *o, Point2i b, Point2i e,
- uint32_t color) {
- o->draw_line(o, b, e, color);
- }
-
- void swwRenderer_DrawTriangle(swwRenderer *o, Point2i a, Point2i b, Point2i c,
- uint32_t color, int filled) {
- o->draw_triangle(o, a, b, c, color, filled);
- }
-
- void swwRenderer_DrawTriangle3D(swwRenderer *o, Vector3f a, Vector3f b,
- Vector3f c, uint32_t color, int filled) {
- o->draw_triangle3d(o, a, b, c, color, filled);
- }
-
- void swwRenderer_DrawTriangle3DDepth(swwRenderer *o, Vector3f a, Vector3f b,
- Vector3f c, uint32_t color) {
- o->draw_triangle3d_depth(o, a, b, c, color);
- }
-
- void swwRenderer_DrawRectangleCenter(swwRenderer *o, Point2i center, Sizei size,
- uint32_t color, int filled) {
- // mode = 1, center
- o->draw_rectangle(o, center, size, color, 1, filled);
- }
- void swwRenderer_DrawRectangleTopLeft(swwRenderer *o, Point2i topleft,
- Sizei size, uint32_t color, int filled) {
- // mode = 2, topleft
- o->draw_rectangle(o, topleft, size, color, 2, filled);
- }
-
- void swwRenderer_DrawCircle(swwRenderer *o, Point2i c, int32_t r,
- uint32_t color, int filled) {
- o->draw_circle(o, c, r, color, filled);
- }
-
- void swwRenderer_DrawEllipse(swwRenderer *o, Point2i c, int32_t rx, int32_t ry,
- uint32_t color, int filled) {
- o->draw_ellipse(o, c, rx, ry, color, filled);
- }
-
- void swwRenderer_DrawArc(swwRenderer *o, Point2i c, int32_t r, float alpha1,
- float alpha2, uint32_t color, int filled) {
- o->draw_arc(o, c, r, alpha1, alpha2, color, filled);
- }
-
- void swwRenderer_DrawTexture(swwRenderer *o, swwTexture *tex, Point2i topleft) {
- swwImage *img = swwTexture_GetImage(tex);
- o->draw_texture_rect(o, tex, topleft, (Sizei){img->width, img->height});
- }
-
- void swwRenderer_DrawTextureRect(swwRenderer *o, swwTexture *tex,
- Point2i topleft, Sizei s) {
- o->draw_texture_rect(o, tex, topleft, s);
- }
-
- void swwRenderer_ClearDepth(swwRenderer *o, float v) { o->clear_depth(o, v); }
-
- void swwRenderer_ClearWithByte(swwRenderer *o, uint8_t b) {
- o->clear_with_byte(o, b);
- }
-
- void swwRenderer_Present(swwRenderer *o) {
- if (o->perf_monitor != NULL) {
- float cts = swwApp_GetTime();
- swwPerfMonitor_Update(o->perf_monitor, cts - o->perf_monitor_ts);
- o->perf_monitor_ts = cts;
-
- swwPerfMonitor_Render(o->perf_monitor, o, o->perf_monitor_center,
- o->perf_monitor_size);
- }
-
- o->present(o);
- }
-
- uint8_t *swwRenderer_LockBuffer(swwRenderer *o) { return o->lock_buffer(o); }
- void swwRenderer_UnlockBufferAndPresent(swwRenderer *o) {
- o->unlock_buffer_and_present(o);
- }
-
- void swwRenderer_EnablePerfMonitor(swwRenderer *o, int enabled) {
- if (enabled) {
- if (o->perf_monitor != NULL) {
- return;
- }
-
- o->perf_monitor = swwPerfMonitor_Create();
-
- o->perf_monitor_center = (Point2i){70, 30};
- o->perf_monitor_size = (Sizei){100, 40};
- o->perf_monitor_ts = swwApp_GetTime();
- } else {
- swwPerfMonitor_Destroy(o->perf_monitor);
- o->perf_monitor = NULL;
- }
- }
-
- float swwRenderer_PerfMonitorGetAverage(swwRenderer *o) {
- if (o->perf_monitor != NULL) {
- return swwPerfMonitor_GetAverage(o->perf_monitor);
- }
-
- return -1.f;
- }
|