Explorar o código

Scissor support

Karl Zylinski hai 6 meses
pai
achega
32d5552418
Modificáronse 3 ficheiros con 23 adicións e 4 borrados
  1. 4 2
      karl2d.odin
  2. 18 1
      render_backend_d3d11.odin
  3. 1 1
      render_backend_interface.odin

+ 4 - 2
karl2d.odin

@@ -197,7 +197,7 @@ set_window_size :: proc(width: int, height: int) {
 // TODO: Name of this proc? submit_current_batch, flush_current_batch, draw_current_batch
 draw_current_batch :: proc() {
 	shader := s.batch_shader.? or_else s.default_shader
-	rb.draw(shader, s.batch_texture, s.proj_matrix * s.view_matrix, s.vertex_buffer_cpu[:s.vertex_buffer_cpu_used])
+	rb.draw(shader, s.batch_texture, s.proj_matrix * s.view_matrix, s.batch_scissor, s.vertex_buffer_cpu[:s.vertex_buffer_cpu_used])
 	s.vertex_buffer_cpu_used = 0
 }
 
@@ -759,7 +759,8 @@ get_camera_world_matrix :: proc(c: Camera) -> Mat4 {
 //------//
 
 set_scissor_rect :: proc(scissor_rect: Maybe(Rect)) {
-	panic("not implemented")
+	draw_current_batch()
+	s.batch_scissor = scissor_rect
 }
 
 // Restore the internal state using the pointer returned by `init`. Useful after reloading the
@@ -946,6 +947,7 @@ State :: struct {
 	shape_drawing_texture: Texture_Handle,
 	batch_camera: Maybe(Camera),
 	batch_shader: Maybe(Shader),
+	batch_scissor: Maybe(Rect),
 	batch_texture: Texture_Handle,
 
 	view_matrix: Mat4,

+ 18 - 1
render_backend_d3d11.odin

@@ -80,6 +80,7 @@ d3d11_init :: proc(state: rawptr, window_handle: Window_Handle, swapchain_width,
 	rasterizer_desc := d3d11.RASTERIZER_DESC{
 		FillMode = .SOLID,
 		CullMode = .BACK,
+		ScissorEnable = true,
 	}
 	ch(s.device->CreateRasterizerState(&rasterizer_desc, &s.rasterizer_state))
 
@@ -168,7 +169,7 @@ d3d11_present :: proc() {
 	s.odd_frame = !s.odd_frame
 }
 
-d3d11_draw :: proc(shd: Shader, texture: Texture_Handle, view_proj: Mat4, vertex_buffer: []u8) {
+d3d11_draw :: proc(shd: Shader, texture: Texture_Handle, view_proj: Mat4, scissor: Maybe(Rect), vertex_buffer: []u8) {
 	if len(vertex_buffer) == 0 {
 		return
 	}
@@ -242,6 +243,22 @@ d3d11_draw :: proc(shd: Shader, texture: Texture_Handle, view_proj: Mat4, vertex
 	dc->RSSetViewports(1, &viewport)
 	dc->RSSetState(s.rasterizer_state)
 
+	scissor_rect := d3d11.RECT {
+		right = i32(s.width),
+		bottom = i32(s.height),
+	}
+
+	if sciss, sciss_ok := scissor.?; sciss_ok {
+		scissor_rect = d3d11.RECT {
+			left = i32(sciss.x),
+			top = i32(sciss.y),
+			right = i32(sciss.x + sciss.w),
+			bottom = i32(sciss.y + sciss.h),
+		}
+	}
+	
+	dc->RSSetScissorRects(1, &scissor_rect)
+
 	dc->PSSetShader(d3d_shd.pixel_shader, nil, 0)
 
 	if t := hm.get(&s.textures, texture); t != nil {

+ 1 - 1
render_backend_interface.odin

@@ -22,7 +22,7 @@ Render_Backend_Interface :: struct {
 	shutdown: proc(),
 	clear: proc(color: Color),
 	present: proc(),
-	draw: proc(shader: Shader, texture: Texture_Handle, view_proj: Mat4, vertex_buffer: []u8),
+	draw: proc(shader: Shader, texture: Texture_Handle, view_proj: Mat4, scissor: Maybe(Rect), vertex_buffer: []u8),
 	set_internal_state: proc(state: rawptr),
 
 	load_texture: proc(data: []u8, width: int, height: int) -> Texture_Handle,