Euphoria
spriterender.cc
Go to the documentation of this file.
1 #include "render/spriterender.h"
2 
3 #include "core/bufferbuilder2d.h"
4 
5 #include "render/buffer2d.h"
8 #include "render/gl.h"
9 
10 
11 using namespace eu::convert;
12 
13 
14 namespace eu::render
15 {
17 
18  DrawData::DrawData()
19  : rotation(0.0_rad)
20  , scale(Scale2f(1, 1))
21  , tint(Rgba(NamedColor::white))
22  {
23  }
24 
25 
26  DrawData&
28  {
29  rotation = r;
30  return *this;
31  }
32 
33 
34  DrawData&
36  {
37  scale = s;
38  return *this;
39  }
40 
41 
42  DrawData&
44  {
45  tint = t;
46  return *this;
47  }
48 
49 
51 
52 
54  : sprite_shader(shader)
55  , color_uniform(shader->get_uniform("color"))
56  , model_uniform(shader->get_uniform("model"))
57  , region_uniform(shader->get_uniform("region"))
58  {
59  init_render_data();
60  }
61 
62 
64  {
65  single_quad_buffer.reset();
66  }
67 
68 
69  void
71  (
72  const Texture2& texture,
73  const Rectf& sprite_area,
74  const Rectf& texture_region,
75  const Angle& rotation_angle,
76  const Scale2f& rotation_anchor,
77  const Rgba& tint_color
78  )
79  {
80  use(sprite_shader);
81 
82  vec3f rotation_anchor_displacement
83  {
84  -rotation_anchor.x * sprite_area.get_width(),
85  (rotation_anchor.y - 1) * sprite_area.get_height(),
86  0.0f
87  };
88 
89  const mat4f model = m4_identity
90  .get_translated(vec3f(sprite_area.get_bottom_left(), 0.0f))
91  .get_translated(-rotation_anchor_displacement)
92  // rotate around center
94  (
96  (
98  rotation_angle
99  )
100  )
101  .get_translated(rotation_anchor_displacement)
102  .get_scaled
103  (
104  Scale3f
105  {
106  sprite_area.get_width(),
107  sprite_area.get_height(),
108  1.0f
109  }
110  )
111  ;
112 
113  sprite_shader->set_uniform(model_uniform, model);
114  sprite_shader->set_uniform(color_uniform, tint_color);
115  sprite_shader->set_uniform(region_uniform, texture_region);
116 
117  glActiveTexture(GL_TEXTURE0);
118  use(&texture);
119  single_quad_buffer->draw();
120  }
121 
122 
123  void
125  (
126  const Texture2& texture,
127  const Rectf& position,
128  const DrawData& data
129  )
130  {
131  draw_rect
132  (
133  texture,
134  position,
136  data.rotation,
137  Scale2f{0.5f, 0.5f},
138  data.tint
139  );
140  }
141 
142 
143  void
145  (
146  const ScalableSprite& ninepatch,
147  const Rectf& rect,
148  const Rgba& tint
149  )
150  {
151  ninepatch.render(this, rect, tint);
152  }
153 
154 
155  void
156  SpriteRenderer::init_render_data()
157  {
159 
160  core::BufferPoint2 a(0.0f, 0.0f, 0.0f, 0.0f);
161  core::BufferPoint2 b(1.0f, 0.0f, 1.0f, 0.0f);
162  core::BufferPoint2 c(0.0f, 1.0f, 0.0f, 1.0f);
163  core::BufferPoint2 d(1.0f, 1.0f, 1.0f, 1.0f);
164 
165  data.add_quad(a, b, c, d);
166 
167  single_quad_buffer = std::make_unique<Buffer2d>(data);
168  }
169 }
170 
constexpr unit3f z_axis
Definition: vec3.h:130
Rgba tint_color(const Rgba &c, const Rgb &tint)
Definition: image_draw.cc:481
void use(const ShaderProgram *shader)
Definition: shader.cc:114
constexpr mat4f m4_identity
Definition: mat4.h:118
NamedColor
Definition: colors.h:12
static AxisAngle from_right_hand_around(const unit3f &axis, const Angle &angle)
Definition: axisangle.cc:14
Definition: rect.h:27
float get_width() const
Definition: rect.cc:436
float get_height() const
Definition: rect.cc:430
static Rectf from_top_left_width_height(const vec2f &topleft, float width, float height)
Definition: rect.cc:86
vec2f get_bottom_left() const
Definition: rect.cc:118
Definition: rgb.h:143
float x
Definition: vec2.h:138
float y
Definition: vec2.h:139
void add_quad(const BufferPoint2 &a, const BufferPoint2 &b, const BufferPoint2 &c, const BufferPoint2 &d)
Definition: mat4.h:14
mat4f get_translated(const vec3f &t) const
Definition: mat4.cc:421
mat4f get_rotated(const AxisAngle &aa) const
Definition: mat4.cc:427
mat4f get_scaled(const Scale3f &scale) const
Definition: mat4.cc:433
DrawData & set_scale(const Scale2f &s)
Definition: spriterender.cc:35
DrawData & set_rotation(const Angle &r)
Definition: spriterender.cc:27
DrawData & set_tint(const Rgba &t)
Definition: spriterender.cc:43
void render(SpriteRenderer *renderer, const Rectf &rect, const Rgba &tint) const
void set_uniform(const ShaderUniform &attribute, gl::Int val)
Definition: shader.cc:292
SpriteRenderer(render::ShaderProgram *shader)
Definition: spriterender.cc:53
void draw_ninepatch(const ScalableSprite &ninepatch, const Rectf &rect, const Rgba &tint)
void draw_sprite(const Texture2 &texture, const Rectf &position, const DrawData &data=DrawData{})
void draw_rect(const Texture2 &texture, const Rectf &sprite_area, const Rectf &texture_region, const Angle &rotation_angle, const Scale2f &rotation_anchor, const Rgba &tint_color)
Definition: spriterender.cc:71
Definition: vec2.h:33
Definition: vec3.h:48