Skip to content

Commit 6ebeb38

Browse files
AmityWilderTSnake41
authored andcommitted
Get load_shader and load_shader_from_memory working with Option ergonomics (#169)
* Replace match statement with map_or_else * Remove resolved comments
1 parent ff27443 commit 6ebeb38

File tree

1 file changed

+8
-36
lines changed

1 file changed

+8
-36
lines changed

raylib/src/core/shaders.rs

+8-36
Original file line numberDiff line numberDiff line change
@@ -29,17 +29,10 @@ impl RaylibHandle {
2929
let c_vs_filename = vs_filename.map(|f| CString::new(f).unwrap());
3030
let c_fs_filename = fs_filename.map(|f| CString::new(f).unwrap());
3131

32-
// Trust me, I have tried ALL the RUST option ergonamics. This is the only way
33-
// to get this to work without raylib breaking for whatever reason
34-
// UPDATE FOR 2024 FROM ANOTHER PERSON: Yes this is still true, doing although "for some reason" is likely due to the pointer getting freed too early if you don't do it this way.
35-
let shader = match (c_vs_filename, c_fs_filename) {
36-
(Some(vs), Some(fs)) => unsafe { Shader(ffi::LoadShader(vs.as_ptr(), fs.as_ptr())) },
37-
(None, Some(fs)) => unsafe { Shader(ffi::LoadShader(std::ptr::null(), fs.as_ptr())) },
38-
(Some(vs), None) => unsafe { Shader(ffi::LoadShader(vs.as_ptr(), std::ptr::null())) },
39-
(None, None) => unsafe { Shader(ffi::LoadShader(std::ptr::null(), std::ptr::null())) },
40-
};
32+
let vs = c_vs_filename.as_ref().map_or_else(std::ptr::null, |s| s.as_ptr());
33+
let fs = c_fs_filename.as_ref().map_or_else(std::ptr::null, |s| s.as_ptr());
4134

42-
return shader;
35+
Shader(unsafe { ffi::LoadShader(vs, fs) })
4336
}
4437

4538
/// Loads shader from code strings and binds default locations.
@@ -51,32 +44,11 @@ impl RaylibHandle {
5144
) -> Shader {
5245
let c_vs_code = vs_code.map(|f| CString::new(f).unwrap());
5346
let c_fs_code = fs_code.map(|f| CString::new(f).unwrap());
54-
return match (c_vs_code, c_fs_code) {
55-
(Some(vs), Some(fs)) => unsafe {
56-
Shader(ffi::LoadShaderFromMemory(
57-
vs.as_ptr() as *mut c_char,
58-
fs.as_ptr() as *mut c_char,
59-
))
60-
},
61-
(None, Some(fs)) => unsafe {
62-
Shader(ffi::LoadShaderFromMemory(
63-
std::ptr::null_mut(),
64-
fs.as_ptr() as *mut c_char,
65-
))
66-
},
67-
(Some(vs), None) => unsafe {
68-
Shader(ffi::LoadShaderFromMemory(
69-
vs.as_ptr() as *mut c_char,
70-
std::ptr::null_mut(),
71-
))
72-
},
73-
(None, None) => unsafe {
74-
Shader(ffi::LoadShaderFromMemory(
75-
std::ptr::null_mut(),
76-
std::ptr::null_mut(),
77-
))
78-
},
79-
};
47+
48+
let vs = c_vs_code.as_ref().map_or_else(std::ptr::null, |s| s.as_ptr());
49+
let fs = c_fs_code.as_ref().map_or_else(std::ptr::null, |s| s.as_ptr());
50+
51+
Shader(unsafe { ffi::LoadShaderFromMemory(vs, fs) })
8052
}
8153

8254
/// Get default shader. Modifying it modifies everthing that uses that shader

0 commit comments

Comments
 (0)