Procházet zdrojové kódy

Multi texturing bug fixes and some additional small fixes.

Karl Zylinski před 3 měsíci
rodič
revize
513edfa8a0

+ 15 - 0
.sublime/karl2d.sublime-project

@@ -26,6 +26,21 @@
 					"shell_cmd": "odin run . -vet -strict-style -keep-executable -debug",
 					"working_dir": "$project_path/../examples/render_texture"
 				},
+				{
+					"name": "render_texture (gl)",
+					"shell_cmd": "odin run . -vet -strict-style -keep-executable -debug  -define:KARL2D_RENDER_BACKEND=gl",
+					"working_dir": "$project_path/../examples/render_texture"
+				},
+				{
+					"name": "multitexture",
+					"shell_cmd": "odin run . -vet -strict-style -keep-executable -debug -define:KARL2D_RENDER_BACKEND=d3d11",
+					"working_dir": "$project_path/../examples/multitexture"
+				},
+				{
+					"name": "multitexture (gl)",
+					"shell_cmd": "odin run . -vet -strict-style -keep-executable -debug -define:KARL2D_RENDER_BACKEND=gl",
+					"working_dir": "$project_path/../examples/multitexture"
+				},
 				{
 					"name": "snake",
 					"shell_cmd": "odin run . -vet -strict-style -keep-executable -debug",

+ 1 - 1
examples/raylib_ports/shaders_texture_waves/shaders_texture_waves.odin

@@ -18,7 +18,7 @@ main :: proc() {
 
 	WAVE_SHADER_DATA :: #load("wave.hlsl")
 
-	shader := k2.load_shader(string(WAVE_SHADER_DATA), string(WAVE_SHADER_DATA))
+	shader := k2.load_shader_from_memory(WAVE_SHADER_DATA, WAVE_SHADER_DATA)
 	seconds_loc := shader.constant_lookup["seconds"]
 	freq_x_loc := shader.constant_lookup["freqX"]
 	freq_y_loc := shader.constant_lookup["freqY"]

+ 1 - 1
examples/snake/snake.odin

@@ -84,7 +84,7 @@ main :: proc() {
 
 	SHADER_SOURCE :: #load("shader.hlsl")
 
-	shader := k2.load_shader(string(SHADER_SOURCE), string(SHADER_SOURCE), {
+	shader := k2.load_shader_from_memory(SHADER_SOURCE, SHADER_SOURCE, {
 		.RG_32_Float,
 		.RG_32_Float,
 		.RGBA_8_Norm,

+ 9 - 3
karl2d.doc.odin

@@ -219,9 +219,15 @@ get_default_font :: proc() -> Font_Handle
 //---------//
 // SHADERS //
 //---------//
-load_shader :: proc(
-	vertex_shader_source: string,
-	fragment_shader_source: string,
+load_shader_from_file :: proc(
+	vertex_filename: string,
+	fragment_filename: string,
+	layout_formats: []Pixel_Format = {}
+) -> Shader
+
+load_shader_from_memory :: proc(
+	vertex_shader_bytes: []byte,
+	fragment_shader_bytes: []byte,
 	layout_formats: []Pixel_Format = {},
 ) -> Shader
 

+ 36 - 6
karl2d.odin

@@ -94,7 +94,7 @@ init :: proc(window_width: int, window_height: int, window_title: string,
 
 	// The default shader will arrive in a different format depending on backend. GLSL for GL,
 	// HLSL for d3d etc.
-	s.default_shader = load_shader(rb.default_shader_vertex_source(), rb.default_shader_fragment_source())
+	s.default_shader = load_shader_from_memory(rb.default_shader_vertex_source(), rb.default_shader_fragment_source())
 	s.batch_shader = s.default_shader
 
 	// FontStash enables us to bake fonts from TTF files on-the-fly.
@@ -145,6 +145,7 @@ shutdown :: proc() {
 
 // Clear the backbuffer with supplied color.
 clear :: proc(color: Color) {
+	draw_current_batch()
 	rb.clear(s.batch_render_target, color)
 	s.depth = s.depth_start
 }
@@ -944,14 +945,43 @@ get_default_font :: proc() -> Font_Handle {
 // SHADERS //
 //---------//
 
-load_shader :: proc(
-	vertex_shader_source: string,
-	fragment_shader_source: string,
+load_shader_from_file :: proc(
+	vertex_filename: string,
+	fragment_filename: string,
+	layout_formats: []Pixel_Format = {}
+) -> Shader {
+	vertex_source, vertex_source_ok := os.read_entire_file(vertex_filename, frame_allocator)
+
+	if !vertex_source_ok {
+		log.errorf("Failed loading shader %s", vertex_filename)
+		return {}
+	}
+
+	fragment_source: []byte
+	
+	if fragment_filename == vertex_filename {
+		fragment_source = vertex_source
+	} else {
+		fragment_source_ok: bool
+		fragment_source, fragment_source_ok = os.read_entire_file(fragment_filename, frame_allocator)
+
+		if !fragment_source_ok {
+			log.errorf("Failed loading shader %s", fragment_filename)
+			return {}
+		}
+	}
+
+	return load_shader_from_memory(vertex_source, fragment_source, layout_formats)
+}
+
+load_shader_from_memory :: proc(
+	vertex_shader_bytes: []byte,
+	fragment_shader_bytes: []byte,
 	layout_formats: []Pixel_Format = {},
 ) -> Shader {
 	handle, desc := rb.load_shader(
-		vertex_shader_source,
-		fragment_shader_source,
+		vertex_shader_bytes,
+		fragment_shader_bytes,
 		s.frame_allocator,
 		layout_formats,
 	)

+ 1 - 1
render_backend_chooser.odin

@@ -14,7 +14,7 @@ when CUSTOM_RENDER_BACKEND_STR != "" {
 	} else when CUSTOM_RENDER_BACKEND_STR == "d3d11" {
 		RENDER_BACKEND :: RENDER_BACKEND_INTERFACE_D3D11
 	} else {
-		#panic(CUSTOM_RENDER_BACKEND_STR + " is not a valid value for KARL2D_BACKEND. Available backends are: gl, d3d11")
+		#panic(CUSTOM_RENDER_BACKEND_STR + " is not a valid value for KARL2D_RENDER_BACKEND. Available backends are: gl, d3d11")
 		RENDER_BACKEND :: DEFAULT_RENDER_BACKEND
 	}
 } else {

+ 10 - 7
render_backend_d3d11.odin

@@ -598,8 +598,8 @@ create_sampler :: proc(filter: d3d11.FILTER) -> ^d3d11.ISamplerState {
 }
 
 d3d11_load_shader :: proc(
-	vs_source: string,
-	ps_source: string,
+	vs_source: []byte,
+	ps_source: []byte,
 	desc_allocator := frame_allocator,
 	layout_formats: []Pixel_Format = {},
 ) -> (
@@ -865,11 +865,12 @@ reflect_shader_constants :: proc(
 	// configure filters etc on a per-texture level. Since two textures can arrive at a draw call
 	// with different filters set, if they use the same sampler, then it will be impossible to set
 	// that filtering up.
-	for t, t_idx in d3d_texture_bindings {
+	for &t, t_idx in d3d_texture_bindings {
 		found := false
 
 		for sampler_bindpoint in found_sampler_bindpoints {
 			if t.bind_point == sampler_bindpoint {
+				t.sampler_bind_point = sampler_bindpoint
 				found = true
 				break
 			}
@@ -1093,10 +1094,12 @@ log_messages :: proc(loc := #caller_location) {
 
 DEFAULT_SHADER_SOURCE :: #load("render_backend_d3d11_default_shader.hlsl")
 
-d3d11_default_shader_vertex_source :: proc() -> string {
-	return string(DEFAULT_SHADER_SOURCE)
+d3d11_default_shader_vertex_source :: proc() -> []byte {
+	s := DEFAULT_SHADER_SOURCE
+	return s
 }
 
-d3d11_default_shader_fragment_source :: proc() -> string {
-	return string(DEFAULT_SHADER_SOURCE)
+d3d11_default_shader_fragment_source :: proc() -> []byte {
+	s := DEFAULT_SHADER_SOURCE
+	return s
 }

+ 13 - 7
render_backend_gl.odin

@@ -300,9 +300,13 @@ gl_draw :: proc(
 			gl_t := gl_shd.texture_bindings[t_idx]
 
 			if t := hm.get(&s.textures, t); t != nil {
-				gl.ActiveTexture(gl.TEXTURE0)
+				gl.ActiveTexture(gl.TEXTURE0 + u32(t_idx))
 				gl.BindTexture(gl.TEXTURE_2D, t.id)
 				gl.Uniform1i(gl_t.loc, i32(t_idx))
+			} else {
+				gl.ActiveTexture(gl.TEXTURE0 + u32(t_idx))
+				gl.BindTexture(gl.TEXTURE_2D, 0)
+				gl.Uniform1i(gl_t.loc, i32(t_idx))
 			}
 		}
 	}
@@ -424,7 +428,7 @@ Shader_Compile_Result :: union #no_nil {
 	Shader_Compile_Result_Error,
 }
 
-compile_shader_from_source :: proc(shader_data: string, shader_type: gl.Shader_Type, err_buf: []u8, err_msg: ^string) -> (shader_id: u32, ok: bool) {
+compile_shader_from_source :: proc(shader_data: []byte, shader_type: gl.Shader_Type, err_buf: []u8, err_msg: ^string) -> (shader_id: u32, ok: bool) {
 	shader_id = gl.CreateShader(u32(shader_type))
 	length := i32(len(shader_data))
 	shader_cstr := cstring(raw_data(shader_data))
@@ -465,7 +469,7 @@ link_shader :: proc(vs_shader: u32, fs_shader: u32, err_buf: []u8, err_msg: ^str
 	return program_id, true
 }
 
-gl_load_shader :: proc(vs_source: string, fs_source: string, desc_allocator := frame_allocator, layout_formats: []Pixel_Format = {}) -> (handle: Shader_Handle, desc: Shader_Desc) {
+gl_load_shader :: proc(vs_source: []byte, fs_source: []byte, desc_allocator := frame_allocator, layout_formats: []Pixel_Format = {}) -> (handle: Shader_Handle, desc: Shader_Desc) {
 	@static err: [1024]u8
 	err_msg: string
 	vs_shader, vs_shader_ok := compile_shader_from_source(vs_source, gl.Shader_Type.VERTEX_SHADER, err[:], &err_msg)
@@ -828,11 +832,13 @@ gl_destroy_shader :: proc(h: Shader_Handle) {
 	delete(shd.texture_bindings, s.allocator)
 }
 
-gl_default_shader_vertex_source :: proc() -> string {
-	return #load("render_backend_gl_default_vertex_shader.glsl")
+gl_default_shader_vertex_source :: proc() -> []byte {
+	vertex_source := #load("render_backend_gl_default_vertex_shader.glsl")
+	return vertex_source
 }
 
-gl_default_shader_fragment_source :: proc() -> string {
-	return #load("render_backend_gl_default_fragment_shader.glsl")
+gl_default_shader_fragment_source :: proc() -> []byte {
+	fragment_source := #load("render_backend_gl_default_fragment_shader.glsl")
+	return fragment_source
 }
 

+ 14 - 3
render_backend_interface.odin

@@ -1,5 +1,7 @@
 package karl2d
 
+import "base:runtime"
+
 Shader_Constant_Desc :: struct {
 	name: string,
 	size: int,
@@ -48,7 +50,16 @@ Render_Backend_Interface :: struct #all_or_none {
 		mip_filter: Texture_Filter,
 	),
 
-	load_shader: proc(vertex_shader_source: string, pixel_shader_source: string, desc_allocator := context.temp_allocator, layout_formats: []Pixel_Format = {}) -> (handle: Shader_Handle, desc: Shader_Desc),
+	load_shader: proc(
+		vertex_shader_data: []byte,
+		pixel_shader_data: []byte,
+		desc_allocator: runtime.Allocator,
+		layout_formats: []Pixel_Format = {},
+	) -> (
+		handle: Shader_Handle,
+		desc: Shader_Desc,
+	),
+
 	destroy_shader: proc(shader: Shader_Handle),
 
 	resize_swapchain: proc(width, height: int),
@@ -56,6 +67,6 @@ Render_Backend_Interface :: struct #all_or_none {
 	get_swapchain_height: proc() -> int,
 	flip_z: proc() -> bool,
 
-	default_shader_vertex_source: proc() -> string,
-	default_shader_fragment_source: proc() -> string,
+	default_shader_vertex_source: proc() -> []byte,
+	default_shader_fragment_source: proc() -> []byte,
 }