#include <SDL2/SDL.h>
-#include <assert.h>
+#include "system/stacktrace.h"
#include <math.h>
+#include <stdbool.h>
#include "camera.h"
#include "sdl/renderer.h"
-#include "system/error.h"
+#include "system/nth_alloc.h"
+#include "system/log.h"
#define RATIO_X 16.0f
#define RATIO_Y 9.0f
struct Camera {
- int debug_mode;
- int blackwhite_mode;
+ bool debug_mode;
+ bool blackwhite_mode;
Point position;
SDL_Renderer *renderer;
Sprite_font *font;
static Vec effective_ratio(const SDL_Rect *view_port);
static Vec effective_scale(const SDL_Rect *view_port);
static Vec camera_point(const Camera *camera,
- const SDL_Rect *view_port,
- const Vec p);
+ const SDL_Rect *view_port,
+ const Vec p);
static Rect camera_rect(const Camera *camera,
- const SDL_Rect *view_port,
- const Rect rect);
+ const SDL_Rect *view_port,
+ const Rect rect);
static Triangle camera_triangle(const Camera *camera,
const SDL_Rect *view_port,
const Triangle t);
Camera *create_camera(SDL_Renderer *renderer,
- Sprite_font *font)
+ Sprite_font *font)
{
- Camera *camera = malloc(sizeof(Camera));
+ trace_assert(renderer);
+ trace_assert(font);
+
+ Camera *camera = nth_alloc(sizeof(Camera));
if (camera == NULL) {
- throw_error(ERROR_TYPE_LIBC);
return NULL;
}
void destroy_camera(Camera *camera)
{
- assert(camera);
+ trace_assert(camera);
free(camera);
}
-
int camera_fill_rect(Camera *camera,
Rect rect,
Color color)
{
- assert(camera);
+ trace_assert(camera);
SDL_Rect view_port;
SDL_RenderGetViewport(camera->renderer, &view_port);
if (camera->debug_mode) {
if (SDL_SetRenderDrawColor(camera->renderer, sdl_color.r, sdl_color.g, sdl_color.b, sdl_color.a / 2) < 0) {
- throw_error(ERROR_TYPE_SDL2);
+ log_fail("SDL_SetRenderDrawColor: %s\n", SDL_GetError());
return -1;
}
} else {
if (SDL_SetRenderDrawColor(camera->renderer, sdl_color.r, sdl_color.g, sdl_color.b, sdl_color.a) < 0) {
- throw_error(ERROR_TYPE_SDL2);
+ log_fail("SDL_SetRenderDrawColor: %s\n", SDL_GetError());
return -1;
}
}
if (SDL_RenderFillRect(camera->renderer, &sdl_rect) < 0) {
- throw_error(ERROR_TYPE_SDL2);
+ log_fail("SDL_RenderFillRect: %s\n", SDL_GetError());
return -1;
}
Rect rect,
Color color)
{
- assert(camera);
+ trace_assert(camera);
SDL_Rect view_port;
SDL_RenderGetViewport(camera->renderer, &view_port);
const SDL_Color sdl_color = color_for_sdl(camera->blackwhite_mode ? color_desaturate(color) : color);
if (SDL_SetRenderDrawColor(camera->renderer, sdl_color.r, sdl_color.g, sdl_color.b, sdl_color.a) < 0) {
- throw_error(ERROR_TYPE_SDL2);
+ log_fail("SDL_SetRenderDrawColor: %s\n", SDL_GetError());
return -1;
}
if (SDL_RenderDrawRect(camera->renderer, &sdl_rect) < 0) {
- throw_error(ERROR_TYPE_SDL2);
+ log_fail("SDL_RenderDrawRect: %s\n", SDL_GetError());
return -1;
}
Triangle t,
Color color)
{
- assert(camera);
+ trace_assert(camera);
SDL_Rect view_port;
SDL_RenderGetViewport(camera->renderer, &view_port);
const SDL_Color sdl_color = color_for_sdl(camera->blackwhite_mode ? color_desaturate(color) : color);
if (SDL_SetRenderDrawColor(camera->renderer, sdl_color.r, sdl_color.g, sdl_color.b, sdl_color.a) < 0) {
- throw_error(ERROR_TYPE_SDL2);
+ log_fail("SDL_SetRenderDrawColor: %s\n", SDL_GetError());
return -1;
}
Triangle t,
Color color)
{
- assert(camera);
+ trace_assert(camera);
SDL_Rect view_port;
SDL_RenderGetViewport(camera->renderer, &view_port);
if (camera->debug_mode) {
if (SDL_SetRenderDrawColor(camera->renderer, sdl_color.r, sdl_color.g, sdl_color.b, sdl_color.a / 2) < 0) {
- throw_error(ERROR_TYPE_SDL2);
+ log_fail("SDL_SetRenderDrawColor: %s\n", SDL_GetError());
return -1;
}
} else {
if (SDL_SetRenderDrawColor(camera->renderer, sdl_color.r, sdl_color.g, sdl_color.b, sdl_color.a) < 0) {
- throw_error(ERROR_TYPE_SDL2);
+ log_fail("SDL_SetRenderDrawColor: %s\n", SDL_GetError());
return -1;
}
}
return 0;
}
+int camera_render_debug_text(Camera *camera,
+ const char *text,
+ Vec position)
+{
+ trace_assert(camera);
+ trace_assert(text);
+
+ if (!camera->debug_mode) {
+ return 0;
+ }
+
+ if (camera_render_text(
+ camera,
+ text,
+ vec(2.0f, 2.0f),
+ rgba(0.0f, 0.0f, 0.0f, 1.0f),
+ position) < 0) {
+ return -1;
+ }
+
+ return 0;
+}
+
int camera_clear_background(Camera *camera,
Color color)
{
const SDL_Color sdl_color = color_for_sdl(camera->blackwhite_mode ? color_desaturate(color) : color);
if (SDL_SetRenderDrawColor(camera->renderer, sdl_color.r, sdl_color.g, sdl_color.b, sdl_color.a) < 0) {
- throw_error(ERROR_TYPE_SDL2);
+ log_fail("SDL_SetRenderDrawColor: %s\n", SDL_GetError());
return -1;
}
if (SDL_RenderClear(camera->renderer) < 0) {
- throw_error(ERROR_TYPE_SDL2);
+ log_fail("SDL_RenderClear: %s\n", SDL_GetError());
return -1;
}
void camera_center_at(Camera *camera, Point position)
{
- assert(camera);
+ trace_assert(camera);
camera->position = position;
}
void camera_toggle_debug_mode(Camera *camera)
{
- assert(camera);
+ trace_assert(camera);
camera->debug_mode = !camera->debug_mode;
}
void camera_disable_debug_mode(Camera *camera)
{
- assert(camera);
+ trace_assert(camera);
camera->debug_mode = 0;
}
void camera_toggle_blackwhite_mode(Camera *camera)
{
- assert(camera);
+ trace_assert(camera);
camera->blackwhite_mode = !camera->blackwhite_mode;
}
Rect camera_view_port(const Camera *camera)
{
- assert(camera);
+ trace_assert(camera);
SDL_Rect view_port;
SDL_RenderGetViewport(camera->renderer, &view_port);
Vec position,
const char *text)
{
- assert(camera);
- assert(text);
+ trace_assert(camera);
+ trace_assert(text);
SDL_Rect view_port;
SDL_RenderGetViewport(camera->renderer, &view_port);
effective_scale(view_port),
vec(rect.w, rect.h)));
}
+
+int camera_render_debug_rect(Camera *camera,
+ Rect rect,
+ Color c)
+{
+ trace_assert(camera);
+
+ if (!camera->debug_mode) {
+ return 0;
+ }
+
+ if (camera_fill_rect(camera, rect, c) < 0) {
+ return -1;
+ }
+
+ return 0;
+}