// SPDX-FileCopyrightText: 2023 Erin Catto
// SPDX-License-Identifier: MIT

#pragma once

#include "box2d/types.h"

//
struct Camera
{
	Camera();

	void ResetView();
	b2Vec2 ConvertScreenToWorld( b2Vec2 screenPoint );
	b2Vec2 ConvertWorldToScreen( b2Vec2 worldPoint );
	void BuildProjectionMatrix( float* m, float zBias );
	b2AABB GetViewBounds();

	b2Vec2 m_center;
	float m_zoom;
	int32_t m_width;
	int32_t m_height;
};

// This class implements Box2D debug drawing callbacks
class Draw
{
public:
	Draw();
	~Draw();

	void Create();
	void Destroy();

	void DrawPolygon( const b2Vec2* vertices, int32_t vertexCount, b2HexColor color );
	void DrawSolidPolygon( b2Transform transform, const b2Vec2* vertices, int32_t vertexCount, float radius, b2HexColor color );

	void DrawCircle( b2Vec2 center, float radius, b2HexColor color );
	void DrawSolidCircle( b2Transform transform, b2Vec2 center, float radius, b2HexColor color );

	void DrawCapsule( b2Vec2 p1, b2Vec2 p2, float radius, b2HexColor color );
	void DrawSolidCapsule( b2Vec2 p1, b2Vec2 p2, float radius, b2HexColor color );

	void DrawSegment( b2Vec2 p1, b2Vec2 p2, b2HexColor color );

	void DrawTransform( b2Transform transform );

	void DrawPoint( b2Vec2 p, float size, b2HexColor color );

	void DrawString( int x, int y, const char* string, ... );

	void DrawString( b2Vec2 p, const char* string, ... );

	void DrawAABB( b2AABB aabb, b2HexColor color );

	void Flush();
	void DrawBackground();

	bool m_showUI;
	struct GLBackground* m_background;
	struct GLPoints* m_points;
	struct GLLines* m_lines;
	struct GLTriangles* m_triangles;
	struct GLCircles* m_circles;
	struct GLSolidCircles* m_solidCircles;
	struct GLSolidCapsules* m_solidCapsules;
	struct GLSolidPolygons* m_solidPolygons;
	b2DebugDraw m_debugDraw;
};

extern Draw g_draw;
extern Camera g_camera;
extern struct GLFWwindow* g_mainWindow;
