Explorar el Código

Properly support texturing

Daniele Bartolini hace 12 años
padre
commit
d0a500e4db

+ 1 - 1
samples/terrain/terrain.cpp

@@ -128,7 +128,7 @@ public:
 		device()->resource_manager()->flush();
 
 		TextureResource* grass_texture = (TextureResource*)device()->data(grass);
-		grass_id = device()->renderer()->load_texture(grass_texture);
+		grass_id = device()->renderer()->create_texture(grass_texture->width(), grass_texture->height(), grass_texture->data(), grass_texture->format());
 
 		//rb_id = device()->renderer()->create_render_buffer(200, 200, PF_RGBA_8);
 	}

+ 0 - 5
src/Device.cpp

@@ -375,11 +375,6 @@ void Device::reload(ResourceId name)
 	m_resource_manager->reload(name);
 
 	const void* new_resource = m_resource_manager->data(name);
-
-	if (name.type == TEXTURE_TYPE)
-	{
-		m_renderer->reload_texture((TextureResource*)old_resource, (TextureResource*)new_resource);
-	}
 }
 
 //-----------------------------------------------------------------------------

+ 5 - 4
src/renderers/Renderer.h

@@ -101,6 +101,11 @@ public:
 	/// Destroys the @id index buffer.
 	virtual void			destroy_index_buffer(IndexBufferId id) = 0;
 
+
+	virtual TextureId		create_texture(uint32_t width, uint32_t height, const void* data, PixelFormat format) = 0;
+	virtual void			update_texture(TextureId id, uint32_t x, uint32_t y, uint32_t width, uint32_t height, const void* data) = 0;
+	virtual void			destroy_texture(TextureId id) = 0;
+
 	//virtual RenderBufferId	create_render_buffer(uint32_t width, uint32_t height, PixelFormat format) = 0;
 	//virtual void			destroy_render_buffer(RenderBufferId id) = 0;
 
@@ -213,10 +218,6 @@ public:
 	virtual void draw_triangles(IndexBufferId id) const = 0;
 
 	virtual void draw_lines(const float* vertices, const float* colors, uint32_t count) = 0;
-
-	virtual TextureId	load_texture(TextureResource* texture) = 0;
-	virtual void		unload_texture(TextureResource* texture) = 0;
-	virtual TextureId	reload_texture(TextureResource* old_texture, TextureResource* new_texture) = 0;
 };
 
 } // namespace crown

+ 45 - 46
src/renderers/gl/GLRenderer.cpp

@@ -276,6 +276,51 @@ void GLRenderer::destroy_index_buffer(IndexBufferId id)
 	m_index_buffers_id_table.destroy(id);
 }
 
+//-----------------------------------------------------------------------------
+TextureId GLRenderer::create_texture(uint32_t width, uint32_t height, const void* data, PixelFormat format)
+{
+	const TextureId id = m_textures_id_table.create();
+
+	GLTexture& gl_texture = m_textures[id.index];
+
+	glGenTextures(1, &gl_texture.gl_object);
+
+	glBindTexture(GL_TEXTURE_2D, gl_texture.gl_object);
+
+	glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
+
+	// FIXME
+	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0,
+				 GL::pixel_format(format), GL_UNSIGNED_BYTE, data);
+
+	gl_texture.format = format;
+
+	return id;
+}
+
+//-----------------------------------------------------------------------------
+void GLRenderer::update_texture(TextureId id, uint32_t x, uint32_t y, uint32_t width, uint32_t height, const void* data)
+{
+	assert(m_textures_id_table.has(id));
+
+	GLTexture& gl_texture = m_textures[id.index];
+
+	glBindTexture(GL_TEXTURE_2D, gl_texture.gl_object);
+
+	glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, width, height, GL::pixel_format(gl_texture.format),
+					GL_UNSIGNED_BYTE, data);
+}
+
+//-----------------------------------------------------------------------------
+void GLRenderer::destroy_texture(TextureId id)
+{
+	assert(m_textures_id_table.has(id));
+
+	GLTexture& gl_texture = m_textures[id.index];
+
+	glDeleteTextures(1, &gl_texture.gl_object);
+}
+
 //-----------------------------------------------------------------------------
 // RenderBufferId GLRenderer::create_render_buffer(uint32_t width, uint32_t height, PixelFormat format)
 // {
@@ -908,52 +953,6 @@ void GLRenderer::draw_lines(const float* vertices, const float* colors, uint32_t
 	glDisableClientState(GL_VERTEX_ARRAY);
 }
 
-//-----------------------------------------------------------------------------
-TextureId GLRenderer::load_texture(TextureResource* texture)
-{
-	const TextureId id = m_textures_id_table.create();
-
-	GLTexture& gl_texture = m_textures[id.index];
-
-	glGenTextures(1, &gl_texture.gl_object);
-
-	glBindTexture(GL_TEXTURE_2D, gl_texture.gl_object);
-
-	glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
-
-	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texture->width(), texture->height(), 0,
-				 GL::pixel_format(texture->format()), GL_UNSIGNED_BYTE, texture->data());
-
-	gl_texture.texture_resource = texture;
-
-	return id;
-}
-
-//-----------------------------------------------------------------------------
-void GLRenderer::unload_texture(TextureResource* texture)
-{
-	// FIXME
-	(void)texture;
-}
-
-//-----------------------------------------------------------------------------
-TextureId GLRenderer::reload_texture(TextureResource* old_texture, TextureResource* new_texture)
-{
-	// for (uint32_t i = 0; i < m_texture_count; i++)
-	// {
-	// 	if (m_textures[i].texture_resource == old_texture)
-	// 	{
-	// 		// Reload texture
-	// 		glBindTexture(GL_TEXTURE_2D, m_textures[i].gl_object);
-
-	// 		glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, new_texture->width(), new_texture->height(),
-	// 			GL::pixel_format(new_texture->format()), GL_UNSIGNED_BYTE, new_texture->data());
-
-	// 		m_textures[i].texture_resource = new_texture;
-	// 	}
-	// }
-}
-
 //-----------------------------------------------------------------------------
 void GLRenderer::check_gl_errors()
 {

+ 5 - 6
src/renderers/gl/GLRenderer.h

@@ -46,8 +46,7 @@ class TextureResource;
 struct GLTexture
 {
 	GLuint				gl_object;
-
-	TextureResource*	texture_resource;
+	PixelFormat			format;
 };
 
 //-----------------------------------------------------------------------------
@@ -88,6 +87,10 @@ public:
 	IndexBufferId		create_index_buffer(const void* indices, size_t count);
 	void				destroy_index_buffer(IndexBufferId id);
 
+	TextureId			create_texture(uint32_t width, uint32_t height, const void* data, PixelFormat format);
+	void				update_texture(TextureId id, uint32_t x, uint32_t y, uint32_t width, uint32_t height, const void* data);
+	void				destroy_texture(TextureId id);
+
 	// RenderBufferId	create_render_buffer(uint32_t width, uint32_t height, PixelFormat format);
 	// void				destroy_render_buffer(RenderBufferId id);
 
@@ -156,10 +159,6 @@ public:
 
 	void				draw_lines(const float* vertices, const float* colors, uint32_t count);
 
-	TextureId			load_texture(TextureResource* texture);
-	void				unload_texture(TextureResource* texture);
-	TextureId			reload_texture(TextureResource* old_texture, TextureResource* new_texture);
-
 private:
 
 	/// Activates a texture unit and returns true if succes