Sfoglia il codice sorgente

Add Gui::draw_rectangle(). Also add color parameter to all Gui::draw methods

Daniele Bartolini 11 anni fa
parent
commit
881df69fb1
3 ha cambiato i file con 65 aggiunte e 6 eliminazioni
  1. 12 2
      engine/lua/LuaGui.cpp
  2. 50 2
      engine/renderers/Gui.cpp
  3. 3 2
      engine/renderers/Gui.h

+ 12 - 2
engine/lua/LuaGui.cpp

@@ -89,13 +89,22 @@ static int gui_hide(lua_State* L)
 	return 0;
 }
 
+static int gui_draw_rectangle(lua_State* L)
+{
+	LuaStack stack(L);
+
+	Gui* gui = stack.get_gui(1);
+	gui->draw_rectangle(stack.get_vector3(2), stack.get_vector2(3), stack.get_color4(4));
+	return 0;
+}
+
 //-----------------------------------------------------------------------------
 static int gui_draw_image(lua_State* L)
 {
 	LuaStack stack(L);
 
 	Gui* gui = stack.get_gui(1);
-	gui->draw_image(stack.get_string(2), stack.get_vector3(3), stack.get_vector2(4));
+	gui->draw_image(stack.get_string(2), stack.get_vector3(3), stack.get_vector2(4), stack.get_color4(5));
 	return 0;
 }
 
@@ -105,7 +114,7 @@ static int gui_draw_text(lua_State* L)
 	LuaStack stack(L);
 
 	Gui* gui = stack.get_gui(1);
-	gui->draw_text(stack.get_string(2), stack.get_string(3), stack.get_int(4), stack.get_vector3(5));
+	gui->draw_text(stack.get_string(2), stack.get_string(3), stack.get_int(4), stack.get_vector3(5), stack.get_color4(6));
 	return 0;
 }
 
@@ -117,6 +126,7 @@ void load_gui(LuaEnvironment& env)
 	env.load_module_function("Gui", "show",				gui_show);
 	env.load_module_function("Gui", "hide",				gui_hide);
 
+	env.load_module_function("Gui", "draw_rectangle",	gui_draw_rectangle);
 	env.load_module_function("Gui", "draw_image",		gui_draw_image);
 	env.load_module_function("Gui", "draw_text",		gui_draw_text);
 }

+ 50 - 2
engine/renderers/Gui.cpp

@@ -148,7 +148,53 @@ void Gui::hide()
 }
 
 //-----------------------------------------------------------------------------
-void Gui::draw_image(const char* material, const Vector3& pos, const Vector2& size)
+void Gui::draw_rectangle(const Vector3& pos, const Vector2& size, const Color4& color)
+{
+	Renderer* r = device()->renderer();
+	TransientVertexBuffer tvb;
+	TransientIndexBuffer tib;
+
+	r->reserve_transient_vertex_buffer(&tvb, 4, VertexFormat::P2);
+	r->reserve_transient_index_buffer(&tib, 6);
+
+	float* verts = (float*) tvb.data;
+	verts[0] = pos.x;
+	verts[1] = pos.y;
+
+	verts[2] = pos.x + size.x;
+	verts[3] = pos.y;
+
+	verts[4] = pos.x + size.x;
+	verts[5] = pos.y - size.y;
+
+	verts[6] = pos.x;
+	verts[7] = pos.y - size.y;
+
+	uint16_t* inds = (uint16_t*) tib.data;
+	inds[0] = 0;
+	inds[1] = 1;
+	inds[2] = 2;
+	inds[3] = 0;
+	inds[4] = 2;
+	inds[5] = 3;
+
+	r->set_layer_view(1, matrix4x4::IDENTITY);
+	r->set_layer_projection(1, m_projection);
+	r->set_layer_viewport(1, 0, 0, m_width, m_height);
+	r->set_state(STATE_COLOR_WRITE
+					| STATE_CULL_CW
+					| STATE_BLEND_EQUATION_ADD 
+					| STATE_BLEND_FUNC(STATE_BLEND_FUNC_SRC_ALPHA, STATE_BLEND_FUNC_ONE_MINUS_SRC_ALPHA));
+
+	r->set_program(render_world_globals::default_program());
+	r->set_uniform(render_world_globals::default_color_uniform(), UniformType::FLOAT_4, color4::to_float_ptr(color), 1);
+	r->set_vertex_buffer(tvb);
+	r->set_index_buffer(tib);
+	r->commit(1);
+}
+
+//-----------------------------------------------------------------------------
+void Gui::draw_image(const char* material, const Vector3& pos, const Vector2& size, const Color4& color)
 {
 	Renderer* r = device()->renderer();
 	TransientVertexBuffer tvb;
@@ -200,13 +246,14 @@ void Gui::draw_image(const char* material, const Vector3& pos, const Vector2& si
 	r->set_program(render_world_globals::default_texture_program());
 	r->set_texture(0, render_world_globals::default_albedo_uniform(), tr->texture(),
 					TEXTURE_FILTER_LINEAR | TEXTURE_WRAP_U_CLAMP_REPEAT | TEXTURE_WRAP_V_CLAMP_REPEAT);
+	r->set_uniform(render_world_globals::default_color_uniform(), UniformType::FLOAT_4, color4::to_float_ptr(color), 1);
 	r->set_vertex_buffer(tvb);
 	r->set_index_buffer(tib);
 	r->commit(1);
 }
 
 //-----------------------------------------------------------------------------
-void Gui::draw_text(const char* str, const char* font, uint32_t font_size, const Vector3& pos)
+void Gui::draw_text(const char* str, const char* font, uint32_t font_size, const Vector3& pos, const Color4& color)
 {
 	Renderer* r = device()->renderer();
 
@@ -324,6 +371,7 @@ void Gui::draw_text(const char* str, const char* font, uint32_t font_size, const
 	r->set_program(render_world_globals::default_font_program());
 	r->set_texture(0, render_world_globals::default_font_uniform(), tr->texture(),
 					TEXTURE_FILTER_LINEAR | TEXTURE_WRAP_U_CLAMP_REPEAT | TEXTURE_WRAP_V_CLAMP_REPEAT);
+	r->set_uniform(render_world_globals::default_color_uniform(), UniformType::FLOAT_4, color4::to_float_ptr(color), 1);
 	r->set_vertex_buffer(vb);
 	r->set_index_buffer(ib);
 	r->commit(1);

+ 3 - 2
engine/renderers/Gui.h

@@ -48,8 +48,9 @@ struct Gui
 	void show();
 	void hide();
 
-	void draw_image(const char* material, const Vector3& pos, const Vector2& size);
-	void draw_text(const char* str, const char* font, uint32_t font_size, const Vector3& pos);
+	void draw_rectangle(const Vector3& pos, const Vector2& size, const Color4& color = Color4::WHITE);
+	void draw_image(const char* material, const Vector3& pos, const Vector2& size, const Color4& color = Color4::WHITE);
+	void draw_text(const char* str, const char* font, uint32_t font_size, const Vector3& pos, const Color4& color = Color4::WHITE);
 
 public: