From ba19328b9879e8d83c443070a373d8cb89763eec Mon Sep 17 00:00:00 2001 From: Aliaksandr Kalenik Date: Tue, 10 Dec 2024 05:18:17 +0100 Subject: [PATCH] LibWeb/WebGL: Implement vertexAttrib{1,2,3,4}fv --- Libraries/LibWeb/WebGL/Types.idl | 3 +++ .../LibWeb/WebGL/WebGLRenderingContextBase.idl | 8 ++++---- .../WebGL/WebGLRenderingContextOverloads.idl | 3 --- .../LibWeb/GenerateWebGLRenderingContext.cpp | 18 ++++++++++++++++++ 4 files changed, 25 insertions(+), 7 deletions(-) diff --git a/Libraries/LibWeb/WebGL/Types.idl b/Libraries/LibWeb/WebGL/Types.idl index f1d662d63bd..f371530e126 100644 --- a/Libraries/LibWeb/WebGL/Types.idl +++ b/Libraries/LibWeb/WebGL/Types.idl @@ -13,3 +13,6 @@ typedef unrestricted float GLclampf; // WebGL 2.0 typedef long long GLint64; typedef unsigned long long GLuint64; + +// FIXME: BufferSource should be a Float32Array +typedef (BufferSource or sequence) Float32List; diff --git a/Libraries/LibWeb/WebGL/WebGLRenderingContextBase.idl b/Libraries/LibWeb/WebGL/WebGLRenderingContextBase.idl index 1049344b03b..ec8ac45c8a9 100644 --- a/Libraries/LibWeb/WebGL/WebGLRenderingContextBase.idl +++ b/Libraries/LibWeb/WebGL/WebGLRenderingContextBase.idl @@ -182,10 +182,10 @@ interface mixin WebGLRenderingContextBase { undefined vertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z); undefined vertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); - [FIXME] undefined vertexAttrib1fv(GLuint index, Float32List values); - [FIXME] undefined vertexAttrib2fv(GLuint index, Float32List values); - [FIXME] undefined vertexAttrib3fv(GLuint index, Float32List values); - [FIXME] undefined vertexAttrib4fv(GLuint index, Float32List values); + undefined vertexAttrib1fv(GLuint index, Float32List values); + undefined vertexAttrib2fv(GLuint index, Float32List values); + undefined vertexAttrib3fv(GLuint index, Float32List values); + undefined vertexAttrib4fv(GLuint index, Float32List values); undefined vertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLintptr offset); diff --git a/Libraries/LibWeb/WebGL/WebGLRenderingContextOverloads.idl b/Libraries/LibWeb/WebGL/WebGLRenderingContextOverloads.idl index 69c7eaa4afa..fb07c3dc8d6 100644 --- a/Libraries/LibWeb/WebGL/WebGLRenderingContextOverloads.idl +++ b/Libraries/LibWeb/WebGL/WebGLRenderingContextOverloads.idl @@ -9,9 +9,6 @@ typedef (ImageBitmap or // FIXME: VideoFrame ) TexImageSource; -// FIXME: BufferSource should be a Float32Array -typedef (BufferSource or sequence) Float32List; - // FIXME: BufferSource should be a Int32Array typedef (BufferSource or sequence) Int32List; diff --git a/Meta/Lagom/Tools/CodeGenerators/LibWeb/GenerateWebGLRenderingContext.cpp b/Meta/Lagom/Tools/CodeGenerators/LibWeb/GenerateWebGLRenderingContext.cpp index abc0ab90daf..fdcb840227c 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibWeb/GenerateWebGLRenderingContext.cpp +++ b/Meta/Lagom/Tools/CodeGenerators/LibWeb/GenerateWebGLRenderingContext.cpp @@ -709,6 +709,24 @@ public: continue; } + if (function.name == "vertexAttrib1fv"sv || function.name == "vertexAttrib2fv"sv || function.name == "vertexAttrib3fv"sv || function.name == "vertexAttrib4fv"sv) { + auto number_of_vector_elements = function.name.substring_view(12, 1); + function_impl_generator.set("number_of_vector_elements", number_of_vector_elements); + function_impl_generator.append(R"~~~( + if (values.has>()) { + auto& data = values.get>(); + glVertexAttrib@number_of_vector_elements@fv(index, data.data()); + return; + } + + auto& typed_array_base = static_cast(*values.get>()->raw_object()); + auto& float32_array = verify_cast(typed_array_base); + float const* data = float32_array.data().data(); + glVertexAttrib@number_of_vector_elements@fv(index, data); +)~~~"); + continue; + } + if (function.name == "getParameter"sv) { generate_get_parameter(function_impl_generator); continue;