mirror of
https://github.com/odin-lang/Odin.git
synced 2026-07-17 21:21:04 +00:00
Merge pull request #6069 from karl-zylinski/webgl-binding-fixes
WebGL binding additions
This commit is contained in:
@@ -22,6 +22,8 @@ foreign dom_lib {
|
||||
window_set_scroll :: proc(x, y: f64) ---
|
||||
|
||||
set_element_style :: proc(id: string, key: string, value: string) ---
|
||||
|
||||
set_document_title :: proc(title: string) ---
|
||||
}
|
||||
|
||||
get_element_value_string :: proc "contextless" (id: string, buf: []byte) -> string {
|
||||
|
||||
@@ -616,6 +616,9 @@ class WebGLInterface {
|
||||
FramebufferTexture2D: (target, attachment, textarget, texture, level) => {
|
||||
this.ctx.framebufferTexture2D(target, attachment, textarget, this.textures[texture], level);
|
||||
},
|
||||
CheckFramebufferStatus: (target) => {
|
||||
return this.ctx.checkFramebufferStatus(target)
|
||||
},
|
||||
FrontFace: (mode) => {
|
||||
this.ctx.frontFace(mode);
|
||||
},
|
||||
@@ -625,6 +628,47 @@ class WebGLInterface {
|
||||
this.ctx.generateMipmap(target);
|
||||
},
|
||||
|
||||
GetActiveAttrib: (program, index, size_ptr, type_ptr, name_buf_ptr, name_buf_len, name_len_ptr) => {
|
||||
const info = this.ctx.getActiveAttrib(this.programs[program], index);
|
||||
|
||||
if (size_ptr) {
|
||||
this.mem.storeInt(size_ptr, info.size);
|
||||
}
|
||||
|
||||
if (type_ptr) {
|
||||
this.mem.storeI32(type_ptr, info.type);
|
||||
}
|
||||
|
||||
if (name_buf_ptr && name_buf_len > 0) {
|
||||
let n = Math.min(name_buf_len, info.name.length);
|
||||
let name = info.name.substring(0, n);
|
||||
this.mem.loadBytes(name_buf_ptr, name_buf_len).set(new TextEncoder().encode(name));
|
||||
this.mem.storeInt(name_len_ptr, n);
|
||||
} else if (name_len_ptr) {
|
||||
this.mem.storeInt(name_len_ptr, info.name.length);
|
||||
}
|
||||
},
|
||||
|
||||
GetActiveUniform: (program, index, size_ptr, type_ptr, name_buf_ptr, name_buf_len, name_len_ptr) => {
|
||||
let info = this.ctx.getActiveUniform(this.programs[program], index);
|
||||
|
||||
if (size_ptr) {
|
||||
this.mem.storeInt(size_ptr, info.size);
|
||||
}
|
||||
|
||||
if (type_ptr) {
|
||||
this.mem.storeI32(type_ptr, info.type);
|
||||
}
|
||||
|
||||
if (name_buf_ptr && name_buf_len > 0) {
|
||||
let n = Math.min(name_buf_len, info.name.length);
|
||||
let name = info.name.substring(0, n);
|
||||
this.mem.loadBytes(name_buf_ptr, name_buf_len).set(new TextEncoder().encode(name));
|
||||
this.mem.storeInt(name_len_ptr, n);
|
||||
} else if (name_len_ptr) {
|
||||
this.mem.storeInt(name_len_ptr, info.name.length);
|
||||
}
|
||||
},
|
||||
|
||||
GetAttribLocation: (program, name_ptr, name_len) => {
|
||||
let name = this.mem.loadString(name_ptr, name_len);
|
||||
@@ -1260,15 +1304,34 @@ class WebGLInterface {
|
||||
this.assertWebGL2();
|
||||
return this.ctx.getUniformBlockIndex(this.programs[program], this.mem.loadString(uniformBlockName_ptr, uniformBlockName_len));
|
||||
},
|
||||
// any getActiveUniformBlockParameter(WebGLProgram program, GLuint uniformBlockIndex, GLenum pname);
|
||||
GetActiveUniformBlockName: (program, uniformBlockIndex, buf_ptr, buf_len, length_ptr) => {
|
||||
GetActiveUniformBlockName: (program, uniformBlockIndex, name_buf_ptr, name_buf_len, name_length_ptr) => {
|
||||
this.assertWebGL2();
|
||||
let name = this.ctx.getActiveUniformBlockName(this.programs[program], uniformBlockIndex);
|
||||
|
||||
let n = Math.min(buf_len, name.length);
|
||||
name = name.substring(0, n);
|
||||
this.mem.loadBytes(buf_ptr, buf_len).set(new TextEncoder().encode(name))
|
||||
this.mem.storeInt(length_ptr, n);
|
||||
if (name_buf_ptr && name_buf_len > 0) {
|
||||
let n = Math.min(name_buf_len, name.length);
|
||||
name = name.substring(0, n);
|
||||
this.mem.loadBytes(name_buf_ptr, name_buf_len).set(new TextEncoder().encode(name));
|
||||
this.mem.storeInt(name_length_ptr, n);
|
||||
} else if (name_length_ptr) {
|
||||
this.mem.storeInt(name_length_ptr, name.length);
|
||||
}
|
||||
},
|
||||
GetActiveUniforms: (program, uniformIndices_ptr, uniformIndices_len, pname, res_ptr) => {
|
||||
this.assertWebGL2();
|
||||
let indices = this.mem.loadU32Array(uniformIndices_ptr, uniformIndices_len);
|
||||
this.ctx.getActiveUniforms(this.programs[program], indices, pname)
|
||||
this.mem.loadI32Array(res_ptr, indices.length).set(indices)
|
||||
},
|
||||
GetActiveUniformBlockParameter: (program, uniformBlockIndex, pname, params_ptr) => {
|
||||
this.assertWebGL2();
|
||||
let res = this.ctx.getActiveUniformBlockParameter(this.programs[program], uniformBlockIndex, pname);
|
||||
|
||||
if (res instanceof Uint32Array) { // for pname GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES
|
||||
this.mem.loadU32Array(params_ptr, res.length).set(res)
|
||||
} else {
|
||||
this.mem.storeI32(params_ptr, res)
|
||||
}
|
||||
},
|
||||
UniformBlockBinding: (program, uniformBlockIndex, uniformBlockBinding) => {
|
||||
this.assertWebGL2();
|
||||
@@ -1840,6 +1903,7 @@ function odinSetupDefaultImports(wasmMemoryInterface, consoleElement, memory) {
|
||||
return false;
|
||||
},
|
||||
|
||||
// Writes a struct of type `Gamepad_State`, see `core/sys/wasm/js/events.odin`
|
||||
get_gamepad_state: (gamepad_id, ep) => {
|
||||
let index = gamepad_id;
|
||||
let gps = navigator.getGamepads();
|
||||
@@ -1986,6 +2050,11 @@ function odinSetupDefaultImports(wasmMemoryInterface, consoleElement, memory) {
|
||||
}
|
||||
},
|
||||
|
||||
set_document_title: (title_ptr, title_len) => {
|
||||
let title = wasmMemoryInterface.loadString(title_ptr, title_len);
|
||||
document.title = title;
|
||||
},
|
||||
|
||||
get_element_key_f64: (id_ptr, id_len, key_ptr, key_len) => {
|
||||
let id = wasmMemoryInterface.loadString(id_ptr, id_len);
|
||||
let key = wasmMemoryInterface.loadString(key_ptr, key_len);
|
||||
|
||||
Reference in New Issue
Block a user