mirror of
https://github.com/Relintai/sfw.git
synced 2025-04-07 17:01:48 +02:00
203 lines
7.0 KiB
C++
203 lines
7.0 KiB
C++
//--STRIP
|
|
#ifndef RENDERER_H
|
|
#define RENDERER_H
|
|
//--STRIP
|
|
|
|
//--STRIP
|
|
#include "core/color.h"
|
|
#include "core/rect2.h"
|
|
#include "core/transform.h"
|
|
#include "core/transform_2d.h"
|
|
#include "core/vector2i.h"
|
|
|
|
#include "object/object.h"
|
|
#include "object/reference.h"
|
|
//--STRIP
|
|
|
|
class Mesh;
|
|
class Material;
|
|
class Texture;
|
|
class Font;
|
|
class FontMaterial;
|
|
class TextureMaterial2D;
|
|
class ColorMaterial2D;
|
|
class TextureMaterial;
|
|
class ColorMaterial;
|
|
class ColoredMaterial;
|
|
class ColoredTextureMaterial2D;
|
|
|
|
class Renderer : public Object {
|
|
SFW_OBJECT(Renderer, Object);
|
|
|
|
public:
|
|
bool get_depth_buffer_enable() const;
|
|
void set_depth_buffer_enable(const bool p_depth_buffer);
|
|
|
|
enum FaceCulling {
|
|
FACE_CULLING_OFF = 0,
|
|
FACE_CULLING_FRONT,
|
|
FACE_CULLING_BACK,
|
|
FACE_CULLING_FRONT_AND_BACK,
|
|
};
|
|
|
|
FaceCulling get_face_culling() const;
|
|
void set_face_culling(const FaceCulling p_face_culling);
|
|
|
|
void draw_point(const Vector2 &p_position, const Color &p_color = Color(1, 1, 1));
|
|
void draw_line(const Vector2 &p_from, const Vector2 &p_to, const Color &p_color = Color(1, 1, 1), const real_t p_width = 1);
|
|
void draw_line_rect(const Rect2 &p_rect, const Color &p_color = Color(1, 1, 1), const real_t p_width = 1);
|
|
void draw_rect(const Rect2 &p_rect, const Color &p_color = Color(1, 1, 1));
|
|
|
|
void draw_texture(const Ref<Texture> &p_texture, const Rect2 &p_dst_rect, const Color &p_modulate = Color(1, 1, 1));
|
|
void draw_texture_clipped(const Ref<Texture> &p_texture, const Rect2 &p_src_rect, const Rect2 &p_dst_rect, const Color &p_modulate = Color(1, 1, 1));
|
|
void draw_texture_tr(const Transform2D &p_transform_2d, const Ref<Texture> &p_texture, const Rect2 &p_dst_rect, const Color &p_modulate = Color(1, 1, 1));
|
|
void draw_texture_clipped_tr(const Transform2D &p_transform_2d, const Ref<Texture> &p_texture, const Rect2 &p_src_rect, const Rect2 &p_dst_rect, const Color &p_modulate = Color(1, 1, 1));
|
|
|
|
void draw_mesh_2d(const Ref<Mesh> &p_mesh, const Ref<Texture> &p_texture, const Vector2 &p_position);
|
|
void draw_mesh_2d_tr(const Ref<Mesh> &p_mesh, const Ref<Texture> &p_texture, const Transform2D &p_transform_2d);
|
|
void draw_mesh_2d_mat(const Ref<Mesh> &p_mesh, const Ref<Material> &p_material, const Vector2 &p_position);
|
|
void draw_mesh_2d_mat_tr(const Ref<Mesh> &p_mesh, const Ref<Material> &p_material, const Transform2D &p_transform_2d);
|
|
|
|
void draw_text_2d(const String &p_text, const Ref<Font> &p_font, const Vector2 &p_position, const Color &p_color = Color(1, 1, 1));
|
|
void draw_text_2d_tf(const String &p_text, const Ref<Font> &p_font, const Transform2D &p_transform_2d, const Color &p_color = Color(1, 1, 1));
|
|
void draw_text_2d_tf_material(const String &p_text, const Ref<Font> &p_font, const Ref<Material> &p_material, const Transform2D &p_transform_2d, const Color &p_color = Color(1, 1, 1));
|
|
|
|
void draw_mesh_3d(const Ref<Mesh> &p_mesh, const Ref<Material> &p_material, const Transform &p_transform = Transform());
|
|
void draw_mesh_3d_colored(const Ref<Mesh> &p_mesh, const Color &p_color, const Transform &p_transform = Transform());
|
|
void draw_mesh_3d_vertex_colored(const Ref<Mesh> &p_mesh, const Transform &p_transform = Transform());
|
|
void draw_mesh_3d_textured(const Ref<Mesh> &p_mesh, const Ref<Texture> &p_texture, const Transform &p_transform = Transform());
|
|
|
|
//2D Camera API
|
|
|
|
void camera_2d_bind();
|
|
|
|
Transform camera_2d_get_current_projection_matrix() const;
|
|
void camera_2d_push_projection_matrix(const Transform &p_transform);
|
|
void camera_2d_pop_projection_matrix();
|
|
int get_camera_2d_projection_matrix_stack_size() const;
|
|
|
|
Transform2D camera_2d_get_current_model_view_matrix() const;
|
|
void camera_2d_push_model_view_matrix(const Transform2D &p_transform_2d);
|
|
void camera_2d_pop_model_view_matrix();
|
|
int get_camera_2d_model_view_matrix_stack_size() const;
|
|
|
|
void camera_2d_projection_set_to_window();
|
|
void camera_2d_projection_set_to_size(const Size2i &p_size);
|
|
void camera_2d_projection_set_to_render_target();
|
|
|
|
//3D Camera API
|
|
|
|
void camera_3d_bind();
|
|
|
|
Transform camera_3d_get_current_camera_transform_matrix() const;
|
|
void camera_3d_push_camera_transform_matrix(const Transform &p_transform);
|
|
void camera_3d_pop_camera_transform_matrix();
|
|
int get_camera_3d_camera_transform_matrix_stack_size() const;
|
|
|
|
Transform camera_3d_get_current_model_view_matrix() const;
|
|
void camera_3d_push_model_view_matrix(const Transform &p_transform);
|
|
void camera_3d_pop_model_view_matrix();
|
|
int get_camera_3d_model_view_matrix_stack_size() const;
|
|
|
|
// Aspect Ratio = w / h
|
|
void camera_3d_projection_set_to_orthographic(float aspect_ratio, float size = 1.0, float znear = 0.05, float zfar = 100, bool vaspect = false);
|
|
void camera_3d_projection_set_to_perspective(float aspect_ratio, float size = 1.0, float znear = 0.05, float zfar = 100, bool vaspect = false, float fov = 70);
|
|
void camera_3d_projection_set_to_frustum(float aspect_ratio, float size = 1.0, float znear = 0.05, float zfar = 100, bool vaspect = false, float offset = 0);
|
|
|
|
Projection camera_3d_get_projection_matrix() const;
|
|
void camera_3d_set_projection_matrix(const Projection &p_projection);
|
|
|
|
// 3d Camera Helpers
|
|
Vector3 camera_3d_project_ray_normal(const Point2 &p_pos) const;
|
|
Vector3 camera_3d_project_ray_origin(const Point2 &p_pos) const;
|
|
Vector3 camera_3d_project_local_ray_normal(const Point2 &p_pos) const;
|
|
Point2 camera_3d_unproject_position(const Vector3 &p_pos) const;
|
|
bool camera_3d_is_position_behind(const Vector3 &p_pos) const;
|
|
Vector3 camera_3d_project_position(const Point2 &p_point, float p_z_depth) const;
|
|
|
|
Vector<Vector3> camera_3d_get_near_plane_points() const;
|
|
|
|
// Other Helpers
|
|
|
|
void clear_screen(const Color &p_color);
|
|
|
|
Vector2i get_window_size() const;
|
|
float get_window_aspect() const;
|
|
|
|
static void initialize();
|
|
static void destroy();
|
|
|
|
Renderer();
|
|
~Renderer();
|
|
|
|
static Renderer *get_singleton();
|
|
|
|
private:
|
|
static Renderer *_singleton;
|
|
|
|
bool _depth_buffer;
|
|
FaceCulling _face_culling;
|
|
|
|
Ref<Mesh> _2d_mesh;
|
|
Ref<Mesh> _3d_mesh;
|
|
Ref<Mesh> _font_mesh;
|
|
|
|
Ref<ColoredTextureMaterial2D> _texture_material_2d;
|
|
Ref<FontMaterial> _font_material;
|
|
Ref<ColorMaterial2D> _color_material_2d;
|
|
|
|
Transform _camera_2d_projection_matrix;
|
|
Transform2D _camera_2d_model_view_matrix;
|
|
|
|
Vector<Transform> _camera_2d_projection_matrix_stack;
|
|
Vector<Transform2D> _camera_2d_model_view_matrix_stack;
|
|
|
|
Projection _camera_3d_projection;
|
|
Transform _camera_3d_camera_transform_matrix;
|
|
Transform _camera_3d_model_view_matrix;
|
|
|
|
Vector<Transform> _camera_3d_camera_transform_matrix_stack;
|
|
Vector<Transform> _camera_3d_model_view_matrix_stack;
|
|
|
|
Ref<TextureMaterial> _texture_material_3d;
|
|
Ref<ColorMaterial> _color_material_3d;
|
|
Ref<ColoredMaterial> _colored_material_3d;
|
|
|
|
struct LastCamera3DData {
|
|
enum Type {
|
|
TYPE_ORTOGRAPHIC,
|
|
TYPE_PERSPECTIVE,
|
|
TYPE_FRUSTUM,
|
|
};
|
|
|
|
Type type;
|
|
//all
|
|
float size;
|
|
float aspect_ratio;
|
|
float znear;
|
|
float zfar;
|
|
bool vaspect;
|
|
//persp
|
|
float fov;
|
|
//frustum
|
|
float offset;
|
|
|
|
LastCamera3DData() {
|
|
type = TYPE_ORTOGRAPHIC;
|
|
size = 0;
|
|
aspect_ratio = 0;
|
|
znear = 0;
|
|
zfar = 0;
|
|
vaspect = false;
|
|
//persp
|
|
fov = 0;
|
|
//frustum
|
|
offset = 0;
|
|
}
|
|
} _last_camera_3d_data;
|
|
};
|
|
|
|
//--STRIP
|
|
#endif
|
|
//--STRIP
|