namespace Script { namespace { void BindVec3(sol::state_view aState) { auto type = aState.new_usertype( "vec3", sol::constructors()); type["x"] = &glm::vec3::x; type["y"] = &glm::vec3::y; type["z"] = &glm::vec3::z; // Bind the common operations type[sol::meta_function::addition] = sol::overload(static_cast(glm::operator+), static_cast(glm::operator+), static_cast(glm::operator+)); type[sol::meta_function::subtraction] = sol::overload(static_cast(glm::operator-), static_cast(glm::operator-), static_cast(glm::operator-)); type[sol::meta_function::multiplication] = sol::overload(static_cast(glm::operator*), static_cast(glm::operator*), static_cast(glm::operator*)); type[sol::meta_function::division] = sol::overload(static_cast(glm::operator/), static_cast(glm::operator/), static_cast(glm::operator/)); type[sol::meta_function::equal_to] = [](const glm::vec3& a, const glm::vec3& b) -> bool { return a == b; }; } void BindVec2(sol::state_view aState) { auto type = aState.new_usertype( "vec2", sol::constructors()); type["x"] = &glm::vec2::x; type["y"] = &glm::vec2::y; // Bind the common operations type[sol::meta_function::addition] = sol::overload(static_cast(glm::operator+), static_cast(glm::operator+), static_cast(glm::operator+)); type[sol::meta_function::subtraction] = sol::overload(static_cast(glm::operator-), static_cast(glm::operator-), static_cast(glm::operator-)); type[sol::meta_function::multiplication] = sol::overload(static_cast(glm::operator*), static_cast(glm::operator*), static_cast(glm::operator*)); type[sol::meta_function::division] = sol::overload(static_cast(glm::operator/), static_cast(glm::operator/), static_cast(glm::operator/)); } #include // TBD void BindVec4(sol::state_view aState) { auto type = aState.new_usertype( "vec4", sol::constructors()); type["x"] = &glm::vec4::x; type["y"] = &glm::vec4::y; type["z"] = &glm::vec4::z; type["w"] = &glm::vec4::w; #if 0 // Bind the common operations type[sol::meta_function::addition] = sol::overload(static_cast(glm::operator+), static_cast(glm::operator+), static_cast(glm::operator+)); type[sol::meta_function::subtraction] = sol::overload(static_cast(glm::operator-), static_cast(glm::operator-), static_cast(glm::operator-)); type[sol::meta_function::multiplication] = sol::overload(static_cast(glm::operator*), static_cast(glm::operator*), static_cast(glm::operator*)); type[sol::meta_function::division] = sol::overload(static_cast(glm::operator/), static_cast(glm::operator/), static_cast(glm::operator/)); #endif } void BindMat3(sol::state_view aState) { auto type = aState.new_usertype( "mat3", sol::constructors()); // Bind the member variables type["[1]"] = sol::property([](const glm::mat3& mat) { return mat[0]; }, [](glm::mat3& mat, const glm::vec3& value) { mat[0] = value; }); type["[2]"] = sol::property([](const glm::mat3& mat) { return mat[1]; }, [](glm::mat3& mat, const glm::vec3& value) { mat[1] = value; }); type["[3]"] = sol::property([](const glm::mat3& mat) { return mat[2]; }, [](glm::mat3& mat, const glm::vec3& value) { mat[2] = value; }); // Bind the common operations type[sol::meta_function::addition] = sol::overload(static_cast(glm::operator+), static_cast(glm::operator+), static_cast(glm::operator+)); type[sol::meta_function::subtraction] = sol::overload(static_cast(glm::operator-), static_cast(glm::operator-), static_cast(glm::operator-)); type[sol::meta_function::multiplication] = sol::overload(static_cast(glm::operator*), // static_cast(glm::operator*), static_cast(glm::operator*), static_cast(glm::operator*)); type[sol::meta_function::division] = sol::overload(static_cast(glm::operator/), static_cast(glm::operator/), static_cast(glm::operator/)); } void BindCoreMath(sol::state_view aState) { // Define type aliases for convenience using vec2 = glm::vec2; using vec3 = glm::vec3; using vec4 = glm::vec4; using mat3 = glm::mat3; using mat4 = glm::mat4; sol::table glm = aState.create_named_table("glm"); // Bind common constants glm["pi"] = glm::pi(); glm["half_pi"] = glm::half_pi(); glm["quarter_pi"] = glm::quarter_pi(); glm["two_pi"] = glm::two_pi(); // Bind common math functions glm["sqrt"] = static_cast(glm::sqrt); glm["pow"] = static_cast(glm::pow); glm["exp"] = static_cast(glm::exp); glm["log"] = static_cast(glm::log); glm["abs"] = static_cast(glm::abs); glm["sign"] = static_cast(glm::sign); glm["floor"] = static_cast(glm::floor); glm["ceil"] = static_cast(glm::ceil); glm["round"] = static_cast(glm::round); glm["min"] = static_cast(glm::min); glm["max"] = static_cast(glm::max); glm["clamp"] = static_cast(glm::clamp); // Bind vector functions glm["dot"] = static_cast(glm::dot); glm["dot"] = static_cast(glm::dot); glm["dot"] = static_cast(glm::dot); glm["cross"] = static_cast(glm::cross); glm["normalize"] = static_cast(glm::normalize); glm["normalize"] = static_cast(glm::normalize); glm["normalize"] = static_cast(glm::normalize); // Bind matrix functions glm["transpose"] = static_cast(glm::transpose); glm["transpose"] = static_cast(glm::transpose); glm["inverse"] = static_cast(glm::inverse); glm["inverse"] = static_cast(glm::inverse); } } // namespace void CreateMathBindings(sol::state_view aState) { BindVec2(aState); BindVec3(aState); BindVec4(aState); BindMat3(aState); BindCoreMath(aState); } } // namespace Script