Преглед изворни кода

Added nil renderer and worked on getting wasm build running using it, rather than getting webgl up right away

Karl Zylinski пре 2 месеци
родитељ
комит
37ffcfacb1

+ 3 - 3
.sublime/karl2d.sublime-project

@@ -17,9 +17,9 @@
 					"working_dir": "$project_path/../examples/minimal"
 				},
 				{
-					"name": "minimal (web)",
-					"shell_cmd": "odin build . -vet -strict-style -keep-executable -debug -target:js_wasm32",
-					"working_dir": "$project_path/../examples/minimal"
+					"name": "web example",
+					"shell_cmd": "odin build . -out:build/main.wasm -vet -strict-style -keep-executable -debug -target:js_wasm32 -define:KARL2D_RENDER_BACKEND=nil",
+					"working_dir": "$project_path/../examples/web"
 				},
 				{
 					"name": "fonts",

+ 2 - 0
examples/web/.gitignore

@@ -0,0 +1,2 @@
+build/main.wasm
+build/odin.js

+ 16 - 0
examples/web/build/index.html

@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html lang="en" style="height: 100%;">
+	<head>
+		<meta charset="UTF-8">
+		<meta name="viewport" content="width=device-width, initial-scale=1">
+		<title>Karl2D Minimal</title>
+	</head>
+	<body id="body" style="height: 100%; padding: 0; margin: 0; overflow: hidden;">
+		<canvas id="webgl-canvas" style="height: 100%; width: 100%;"></canvas>
+	
+		<script type="text/javascript" src="odin.js"></script>
+		<script type="text/javascript">
+			odin.runWasm("main.wasm", null);
+		</script>
+	</body>
+</html>

+ 62 - 0
examples/web/minimal.odin

@@ -0,0 +1,62 @@
+package karl2d_minimal_example
+
+import k2 "../.."
+import "core:mem"
+import "core:log"
+import "core:fmt"
+import "base:runtime"
+
+_ :: fmt
+_ :: mem
+tex: k2.Texture
+default_context: runtime.Context
+track: mem.Tracking_Allocator
+
+main :: proc() {
+	when ODIN_DEBUG {
+		mem.tracking_allocator_init(&track, context.allocator)
+		context.allocator = mem.tracking_allocator(&track)
+	}
+
+	context.logger = log.create_console_logger()
+	default_context = context
+
+	k2.init(1080, 1080, "Karl2D Minimal Program")
+	k2.set_window_position(300, 100)
+	tex = k2.load_texture_from_file("sixten.jpg")
+
+	when ODIN_OS != .JS {
+		for !k2.shutdown_wanted() {
+			step(0)
+		}
+			
+		k2.destroy_texture(tex)
+		k2.shutdown()
+	}
+}
+
+shutdown :: proc() {
+	if len(track.allocation_map) > 0 {
+		for _, entry in track.allocation_map {
+			fmt.eprintf("%v leaked: %v bytes\n", entry.location, entry.size)
+		}
+	}
+	mem.tracking_allocator_destroy(&track)
+}
+
+@export
+step :: proc(dt: f64) {
+	context = default_context
+	k2.process_events()
+	k2.clear(k2.BLUE)
+
+	k2.draw_rect({10, 10, 60, 60}, k2.GREEN)
+	k2.draw_rect({20, 20, 40, 40}, k2.BLACK)
+	k2.draw_circle({120, 40}, 30, k2.BLACK)
+	k2.draw_circle({120, 40}, 20, k2.GREEN)
+	k2.draw_text("Hellöpe!", {10, 100}, 64, k2.WHITE)
+	k2.draw_texture_ex(tex, {0, 0, f32(tex.width), f32(tex.height)}, {10, 200, 900, 500}, {}, 0)
+
+	k2.present()
+	free_all(context.temp_allocator)
+}

BIN
examples/web/minimal.wasm


BIN
examples/web/sixten.jpg


+ 18 - 11
karl2d.odin

@@ -777,22 +777,27 @@ create_texture :: proc(width: int, height: int, format: Pixel_Format) -> Texture
 //
 // The `options` parameter can be used to specify things things such as premultiplication of alpha.
 load_texture_from_file :: proc(filename: string, options: Load_Texture_Options = {}) -> Texture {
-	load_options := image.Options {
-		.alpha_add_if_missing,
-	}
+	when FILESYSTEM_SUPPORTED {
+		load_options := image.Options {
+			.alpha_add_if_missing,
+		}
 
-	if .Premultiply_Alpha in options {
-		load_options += { .alpha_premultiply }
-	}
+		if .Premultiply_Alpha in options {
+			load_options += { .alpha_premultiply }
+		}
+
+		img, img_err := image.load_from_file(filename, options = load_options, allocator = s.frame_allocator)
 
-	img, img_err := image.load_from_file(filename, options = load_options, allocator = s.frame_allocator)
+		if img_err != nil {
+			log.errorf("Error loading texture %v: %v", filename, img_err)
+			return {}
+		}
 
-	if img_err != nil {
-		log.errorf("Error loading texture %v: %v", filename, img_err)
+		return load_texture_from_bytes(img.pixels.buf[:], img.width, img.height, .RGBA_8_Norm)
+	} else {
+		log.errorf("load_texture_from_file failed: OS %v has no filesystem support!", ODIN_OS)
 		return {}
 	}
-
-	return load_texture_from_bytes(img.pixels.buf[:], img.width, img.height, .RGBA_8_Norm)
 }
 
 // TODO should we have an error here or rely on check the handle of the texture?
@@ -1905,3 +1910,5 @@ get_next_depth :: proc() -> f32 {
 	s.depth += s.depth_increment
 	return d
 }
+
+FILESYSTEM_SUPPORTED :: ODIN_OS != .JS && ODIN_OS != .Freestanding

+ 6 - 2
render_backend_chooser.odin

@@ -5,7 +5,9 @@ when ODIN_OS == .Windows {
 } else when ODIN_OS == .Linux || ODIN_OS == .Darwin {
 	DEFAULT_RENDER_BACKEND :: RENDER_BACKEND_INTERFACE_GL
 } else when ODIN_OS == .JS {
-	DEFAULT_RENDER_BACKEND :: RENDER_BACKEND_INTERFACE_WEBGL
+	//DEFAULT_RENDER_BACKEND :: RENDER_BACKEND_INTERFACE_WEBGL
+} else when ODIN_OS == .Freestanding {
+	DEFAULT_RENDER_BACKEND :: RENDER_BACKEND_NIL
 }
 
 CUSTOM_RENDER_BACKEND_STR :: #config(KARL2D_RENDER_BACKEND, "")
@@ -15,9 +17,11 @@ when CUSTOM_RENDER_BACKEND_STR != "" {
 		RENDER_BACKEND :: RENDER_BACKEND_INTERFACE_GL
 	} else when CUSTOM_RENDER_BACKEND_STR == "d3d11" {
 		RENDER_BACKEND :: RENDER_BACKEND_INTERFACE_D3D11
+	} else when CUSTOM_RENDER_BACKEND_STR == "nil" {
+		RENDER_BACKEND :: RENDER_BACKEND_NIL
 	} else {
 		#panic(CUSTOM_RENDER_BACKEND_STR + " is not a valid value for KARL2D_RENDER_BACKEND. Available backends are: gl, d3d11")
-		RENDER_BACKEND :: DEFAULT_RENDER_BACKEND
+		//RENDER_BACKEND :: DEFAULT_RENDER_BACKEND
 	}
 } else {
 	RENDER_BACKEND :: DEFAULT_RENDER_BACKEND

+ 134 - 0
render_backend_nil.odin

@@ -0,0 +1,134 @@
+#+build js
+#+private file
+
+package karl2d
+
+@(private="package")
+RENDER_BACKEND_NIL :: Render_Backend_Interface {
+	state_size = rbnil_state_size,
+	init = rbnil_init,
+	shutdown = rbnil_shutdown,
+	clear = rbnil_clear,
+	present = rbnil_present,
+	draw = rbnil_draw,
+	resize_swapchain = rbnil_resize_swapchain,
+	get_swapchain_width = rbnil_get_swapchain_width,
+	get_swapchain_height = rbnil_get_swapchain_height,
+	flip_z = rbnil_flip_z,
+	set_internal_state = rbnil_set_internal_state,
+	create_texture = rbnil_create_texture,
+	load_texture = rbnil_load_texture,
+	update_texture = rbnil_update_texture,
+	destroy_texture = rbnil_destroy_texture,
+	create_render_texture = rbnil_create_render_texture,
+	destroy_render_target = rbnil_destroy_render_target,
+	set_texture_filter = rbnil_set_texture_filter,
+	load_shader = rbnil_load_shader,
+	destroy_shader = rbnil_destroy_shader,
+
+	default_shader_vertex_source = rbnil_default_shader_vertex_source,
+	default_shader_fragment_source = rbnil_default_shader_fragment_source,
+}
+
+import "core:log"
+
+rbnil_state_size :: proc() -> int {
+	return 0
+}
+
+rbnil_init :: proc(state: rawptr, window_handle: Window_Handle, swapchain_width, swapchain_height: int, allocator := context.allocator) {
+	log.info("Render Backend nil init")
+}
+
+rbnil_shutdown :: proc() {
+	log.info("Render Backend nil shutdown")
+}
+
+rbnil_clear :: proc(render_texture: Render_Target_Handle, color: Color) {
+}
+
+rbnil_present :: proc() {
+}
+
+rbnil_draw :: proc(
+	shd: Shader,
+	render_texture: Render_Target_Handle,
+	bound_textures: []Texture_Handle,
+	scissor: Maybe(Rect),
+	blend_mode: Blend_Mode,
+	vertex_buffer: []u8,
+) {
+}
+
+rbnil_resize_swapchain :: proc(w, h: int) {
+}
+
+rbnil_get_swapchain_width :: proc() -> int {
+	return 0
+}
+
+rbnil_get_swapchain_height :: proc() -> int {
+	return 0
+}
+
+rbnil_flip_z :: proc() -> bool {
+	return false
+}
+
+rbnil_set_internal_state :: proc(state: rawptr) {
+}
+
+rbnil_create_texture :: proc(width: int, height: int, format: Pixel_Format) -> Texture_Handle {
+	return {}
+}
+
+rbnil_load_texture :: proc(data: []u8, width: int, height: int, format: Pixel_Format) -> Texture_Handle {
+	return {}
+}
+
+rbnil_update_texture :: proc(th: Texture_Handle, data: []u8, rect: Rect) -> bool {
+	return true
+}
+
+rbnil_destroy_texture :: proc(th: Texture_Handle) {
+}
+
+rbnil_create_render_texture :: proc(width: int, height: int) -> (Texture_Handle, Render_Target_Handle) {
+	return {}, {}
+}
+
+rbnil_destroy_render_target :: proc(render_target: Render_Target_Handle) {
+	
+}
+
+rbnil_set_texture_filter :: proc(
+	th: Texture_Handle,
+	scale_down_filter: Texture_Filter,
+	scale_up_filter: Texture_Filter,
+	mip_filter: Texture_Filter,
+) {
+}
+
+rbnil_load_shader :: proc(
+	vs_source: []byte,
+	fs_source: []byte,
+	desc_allocator := frame_allocator,
+	layout_formats: []Pixel_Format = {},
+) -> (
+	handle: Shader_Handle,
+	desc: Shader_Desc,
+) {
+	return {}, {}
+}
+
+rbnil_destroy_shader :: proc(h: Shader_Handle) {
+}
+
+rbnil_default_shader_vertex_source :: proc() -> []byte {
+	return {}
+}
+
+rbnil_default_shader_fragment_source :: proc() -> []byte {
+	return {}
+}
+

+ 1 - 1
render_backend_webgl.odin

@@ -1,4 +1,4 @@
-#+build js
+#+build ignore
 #+private file
 
 package karl2d