Change how surface matricies are calculated
This commit is contained in:
		
							parent
							
								
									09faf4ff64
								
							
						
					
					
						commit
						f60b53c6e3
					
				| 
						 | 
				
			
			@ -8,6 +8,7 @@
 | 
			
		|||
#include <wlr/backend.h>
 | 
			
		||||
#include <wlr/backend/session.h>
 | 
			
		||||
#include <wlr/render.h>
 | 
			
		||||
#include <wlr/render/matrix.h>
 | 
			
		||||
#include <wlr/render/gles2.h>
 | 
			
		||||
#include <wlr/types/wlr_output.h>
 | 
			
		||||
#include <wlr/types/wlr_surface.h>
 | 
			
		||||
| 
						 | 
				
			
			@ -41,12 +42,14 @@ void handle_output_frame(struct output_state *output, struct timespec *ts) {
 | 
			
		|||
 | 
			
		||||
	struct wl_resource *_res;
 | 
			
		||||
	float matrix[16];
 | 
			
		||||
	float transform[16];
 | 
			
		||||
	wl_list_for_each(_res, &sample->compositor.surfaces, link) {
 | 
			
		||||
		struct wlr_surface *surface = wl_resource_get_user_data(_res);
 | 
			
		||||
		wlr_surface_flush_damage(surface);
 | 
			
		||||
		if (surface->texture->valid) {
 | 
			
		||||
			wlr_matrix_translate(&transform, 200, 200, 0);
 | 
			
		||||
			wlr_surface_get_matrix(surface, &matrix,
 | 
			
		||||
				&wlr_output->transform_matrix, 200, 200);
 | 
			
		||||
				&wlr_output->transform_matrix, &transform);
 | 
			
		||||
			wlr_render_with_matrix(sample->renderer, surface->texture, &matrix);
 | 
			
		||||
 | 
			
		||||
			struct wlr_frame_callback *cb, *cnext;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -55,7 +55,17 @@ struct wlr_renderer;
 | 
			
		|||
struct wlr_surface *wlr_surface_create(struct wl_resource *res,
 | 
			
		||||
		struct wlr_renderer *renderer);
 | 
			
		||||
void wlr_surface_flush_damage(struct wlr_surface *surface);
 | 
			
		||||
void wlr_surface_get_matrix(struct wlr_surface *surface, float (*matrix)[16],
 | 
			
		||||
		const float (*projection)[16], int x, int y);
 | 
			
		||||
/**
 | 
			
		||||
 * Gets a matrix you can pass into wlr_render_with_matrix to display this
 | 
			
		||||
 * surface. `matrix` is the output matrix, `projection` is the wlr_output
 | 
			
		||||
 * projection matrix, and `transform` is any additional transformations you want
 | 
			
		||||
 * to perform on the surface (or NULL/the identity matrix if you don't).
 | 
			
		||||
 * `transform` is used before the surface is scaled, so its geometry extends
 | 
			
		||||
 * from 0 to 1 in both dimensions.
 | 
			
		||||
 */
 | 
			
		||||
void wlr_surface_get_matrix(struct wlr_surface *surface,
 | 
			
		||||
		float (*matrix)[16],
 | 
			
		||||
		const float (*projection)[16],
 | 
			
		||||
		const float (*transform)[16]);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -353,14 +353,17 @@ struct wlr_surface *wlr_surface_create(struct wl_resource *res,
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
void wlr_surface_get_matrix(struct wlr_surface *surface,
 | 
			
		||||
		float (*matrix)[16], const float (*projection)[16], int x, int y) {
 | 
			
		||||
		float (*matrix)[16],
 | 
			
		||||
		const float (*projection)[16],
 | 
			
		||||
		const float (*transform)[16]) {
 | 
			
		||||
	int width = surface->texture->width / surface->current.scale;
 | 
			
		||||
	int height = surface->texture->height / surface->current.scale;
 | 
			
		||||
	float world[16];
 | 
			
		||||
	float scale[16];
 | 
			
		||||
	wlr_matrix_identity(matrix);
 | 
			
		||||
	wlr_matrix_translate(&world, x, y, 0);
 | 
			
		||||
	wlr_matrix_mul(matrix, &world, matrix);
 | 
			
		||||
	wlr_matrix_scale(&world, width, height, 1);
 | 
			
		||||
	wlr_matrix_mul(matrix, &world, matrix);
 | 
			
		||||
	if (transform) {
 | 
			
		||||
		wlr_matrix_mul(matrix, transform, matrix);
 | 
			
		||||
	}
 | 
			
		||||
	wlr_matrix_scale(&scale, width, height, 1);
 | 
			
		||||
	wlr_matrix_mul(matrix, &scale, matrix);
 | 
			
		||||
	wlr_matrix_mul(projection, matrix, matrix);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue