Hello community,
here is the log from the commit of package graphene for openSUSE:Factory checked in at 2019-04-01 12:31:20
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/graphene (Old)
and /work/SRC/openSUSE:Factory/.graphene.new.25356 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "graphene"
Mon Apr 1 12:31:20 2019 rev:9 rq:689310 version:1.8.6
Changes:
--------
--- /work/SRC/openSUSE:Factory/graphene/graphene.changes 2018-06-22 13:27:00.897209069 +0200
+++ /work/SRC/openSUSE:Factory/.graphene.new.25356/graphene.changes 2019-04-01 12:31:25.633765517 +0200
@@ -1,0 +2,40 @@
+Mon Mar 25 23:24:28 UTC 2019 - Bjørn Lie
+
+- Update to version 1.8.6:
+ + Bug fixes, bug fixes everywhere! Also: documentation changes to
+ clarify what we do behind the veil of the various matrix
+ multiplication functions. Hopefully, this should help people
+ using Graphene especially when it comes to integration with
+ other libraries.
+ + Fix matrix multiplication when the result matrix is also one of
+ the operands.
+ + Fix check when converting a 4x4 matrix into an affine
+ transformation matrix.
+ + Fix interpolation between matrices with a perspective
+ component.
+ + Documentation fixes for matrix/matrix and matrix/vector
+ multiplication operators.
+- Changes from version 1.8.4:
+ + Mostly a bug fixing release, with an especially glaring bug fix
+ in the point transformation function of graphene_matrix_t that
+ was found thanks to GTK 4. Now the function is covered by the
+ test suite, so it should not regress.
+ + Another major fix is the ensuring that we have a description of
+ the SIMD types through introspection, which means that language
+ bindings can finally know how big every other structure using
+ them is. The SIMD API is still not available through
+ introspection, as it's a pure C convenience.
+ + Require Meson ≥ 0.48.0.
+ + Fix matrix/point transformation.
+ + Build fixes for MSVC.
+ + Introspection fixes for bool.
+ + Fix the InitOnce checks on Windows.
+ + Correctly parse SIMD types for introspection.
+ + Build fixes for the pkg-config file.
+ + Documentation fixes:
+ - Clarify matrix/vector/point multiplication.
+ - Clarify plane description.
+ - Clarify the units for the matrix skew factors.
+ - Document use of graphene-gobject with Meson.
+
+-------------------------------------------------------------------
Old:
----
graphene-1.8.2.tar.xz
New:
----
graphene-1.8.6.tar.xz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ graphene.spec ++++++
--- /var/tmp/diff_new_pack.VxNpdJ/_old 2019-04-01 12:31:27.357766053 +0200
+++ /var/tmp/diff_new_pack.VxNpdJ/_new 2019-04-01 12:31:27.361766055 +0200
@@ -1,7 +1,7 @@
#
# spec file for package graphene
#
-# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -12,12 +12,12 @@
# license that conforms to the Open Source Definition (Version 1.9)
# published by the Open Source Initiative.
-# Please submit bugfixes or comments via http://bugs.opensuse.org/
+# Please submit bugfixes or comments via https://bugs.opensuse.org/
#
Name: graphene
-Version: 1.8.2
+Version: 1.8.6
Release: 0
Summary: Thin type layer for graphic libraries
License: MIT
@@ -29,7 +29,7 @@
BuildRequires: fdupes
BuildRequires: gobject-introspection-devel
BuildRequires: gtk-doc
-BuildRequires: meson >= 0.43.1
+BuildRequires: meson >= 0.48.0
BuildRequires: pkgconfig
BuildRequires: python3-base
BuildRequires: pkgconfig(gobject-2.0) >= 2.30.0
@@ -78,18 +78,18 @@
This subpackage contains the development files for the Graphene library.
%prep
-%autosetup
+%autosetup -p1
%build
%meson \
- -D gtk_doc=true \
- -D gobject_types=true \
- -D introspection=true \
- -D gcc_vector=true \
- -D sse2=true \
- -D arm-neon=true \
- -D tests=true \
- -D benchmarks=true \
+ -Dgtk_doc=true \
+ -Dgobject_types=true \
+ -Dintrospection=true \
+ -Dgcc_vector=true \
+ -Dsse2=true \
+ -Darm-neon=true \
+ -Dtests=true \
+ -Dbenchmarks=true \
%{nil}
%meson_build
++++++ graphene-1.8.2.tar.xz -> graphene-1.8.6.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-1.8.2/.appveyor/msvc.bat new/graphene-1.8.6/.appveyor/msvc.bat
--- old/graphene-1.8.2/.appveyor/msvc.bat 2018-06-13 18:51:25.000000000 +0200
+++ new/graphene-1.8.6/.appveyor/msvc.bat 2019-03-05 18:32:19.000000000 +0100
@@ -4,12 +4,12 @@
mkdir _build
mkdir graphene-shared-%MSVC_PLATFORM%
cd _build
-curl -LsSO https://github.com/mesonbuild/meson/releases/download/0.44.1/meson-0.44.1.ta...
-7z x meson-0.44.1.tar.gz
-move dist\meson-0.44.1.tar .
-7z x meson-0.44.1.tar
+curl -LsSO https://github.com/mesonbuild/meson/releases/download/0.49.0/meson-0.49.0.ta...
+7z x meson-0.49.0.tar.gz
+move dist\meson-0.49.0.tar .
+7z x meson-0.49.0.tar
rmdir dist
-del meson-0.44.1.tar meson-0.44.1.tar.gz
+del meson-0.49.0.tar meson-0.49.0.tar.gz
curl -LsSO https://github.com/ninja-build/ninja/releases/download/v1.7.2/ninja-win.zip
7z x ninja-win.zip
del ninja-win.zip
@@ -19,7 +19,7 @@
cd _build
call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" %MSVC_PLATFORM%
@echo on
-C:\Python36\python.exe meson-0.44.1\meson.py .. . --backend=ninja --prefix=%APPVEYOR_BUILD_FOLDER%\graphene-shared-%MSVC_PLATFORM% || goto :error
+C:\Python36\python.exe meson-0.49.0\meson.py .. . --backend=ninja --prefix=%APPVEYOR_BUILD_FOLDER%\graphene-shared-%MSVC_PLATFORM% || goto :error
ninja || goto :error
ninja test || goto :error
ninja install || goto :error
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-1.8.2/README.md new/graphene-1.8.6/README.md
--- old/graphene-1.8.2/README.md 2018-06-13 18:51:25.000000000 +0200
+++ new/graphene-1.8.6/README.md 2019-03-05 18:32:19.000000000 +0100
@@ -29,7 +29,7 @@
### Dependencies
-Graphene has little dependencies.
+Graphene has minimal dependencies.
Graphene contains optimizations for speeding up vector operations; those
optimizations are optional, and used only if both Graphene was compiled
@@ -37,6 +37,7 @@
Currently, Graphene supports the following platform-specific fast paths:
* Streaming SIMD Extensions (SSE) 2
+ * Optionally using SSE 4.1
* ARM NEON
* GCC vector extensions
@@ -53,6 +54,7 @@
In order to build and install Graphene you will need development tools and
the headers of the dependencies. You will also need:
+ * [python3](https://www.python.org)
* [meson](http://mesonbuild.com)
* [ninja](https://ninja-build.org/)
@@ -63,7 +65,7 @@
Then run:
- $ meson _build # on Windows, it's "meson.py"
+ $ meson _build # on Windows, it may be "meson.py"
$ cd _build
$ ninja test
# ninja install
@@ -80,39 +82,40 @@
Graphene, use `-Dgobject_types=false`. Disabling GObject types will also
automatically disable generating introspection data.
-You can also disable building the test suite and the benchmark suite,
+You can explicitly disable building the test suite and the benchmark suite,
using the `-Dtests=false` and `-Dbenchmarks=false` configuration switches
-respectively.
+respectively. The test and benchmark suites depend on [GLib][glib]; if it is
+not available at configuration time, tests and benchmarks will be disabled
+automatically.
#### Building on Windows
-In order to build on Windows, it's recommended to use the
-[MSYS2](http://sourceforge.net/projects/msys2/) environment.
+Graphene supports the Microsoft Visual C compiler 2017 and later versions.
-First, [install MSYS2](https://msys2.github.io/) and update it fully
-as documented.
+Graphene also supports the [MSYS2 toolchain](http://sourceforge.net/projects/msys2/).
-Then use `pacman` to set up the build environment by installing the
-necessary prerequisites for your target. For all build systems, you
-will need a standard development environment and the appropriate native
-toolchain. You also need a Python interpreter for Meson and introspection
-builds, which are the default.
+When using MSYS2, it's recommended to have an up to date installation;
+in order to build Graphene you will need to use the `pacman` command
+to install the necessary build dependencies first:
$ pacman -S base-devel
$ pacman -S python3
- $ pacman -S mingw-w64-x86_64-meson # only MINGW64 target
- $ pacman -S mingw-w64-i686-meson # only MINGW32 target
+ $ pacman -S mingw-w64-x86_64-meson # only MINGW64 target
+ $ pacman -S mingw-w64-i686-meson # only MINGW32 target
-There are a number of optional dependencies too:
+For the optional support for testing, GObject introspection, and
+documentation, you will need to install additional dependencies:
$ pacman -S gtk-doc # optional
$ pacman -S mingw-w64-x86_64-glib2 # optional, MINGW64 target only
$ pacman -S mingw-w64-i686-glib2 # optional, MINGW32 target only
$ pacman -S glib2 glib2-devel # optional, MSYS target only
-Then clone the Graphene repository and build as usual by following the
-instructions in the section above. If you're using Meson, please note
-that the tool may be installed as "meson.py" on MSYS2.
+After installing all dependencies, you can now clone the Graphene
+repository locally, and follow the build instructions above.
+
+Please note that on some MSYS2 installations the Meson binary may be called
+`meson.py`.
## Documentation
@@ -156,4 +159,5 @@
See the [LICENSE](./LICENSE) file for more details.
+[glib]: https://gitlab.gnome.org/GNOME/glib
[gobject-api]: https://developer.gnome.org/gobject/stable/
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-1.8.2/doc/graphene-sections.txt new/graphene-1.8.6/doc/graphene-sections.txt
--- old/graphene-1.8.2/doc/graphene-sections.txt 2018-06-13 18:51:25.000000000 +0200
+++ new/graphene-1.8.6/doc/graphene-sections.txt 2019-03-05 18:32:19.000000000 +0100
@@ -1,6 +1,5 @@
<SECTION>
<FILE>graphene-box</FILE>
-<INCLUDE>graphene.h</INCLUDE>
graphene_box_t
graphene_box_alloc
graphene_box_free
@@ -37,7 +36,6 @@
<SECTION>
<FILE>graphene-euler</FILE>
-<INCLUDE>graphene.h</INCLUDE>
graphene_euler_t
graphene_euler_order_t
graphene_euler_alloc
@@ -60,7 +58,6 @@
<SECTION>
<FILE>graphene-frustum</FILE>
-<INCLUDE>graphene.h</INCLUDE>
graphene_frustum_t
graphene_frustum_alloc
graphene_frustum_free
@@ -76,7 +73,6 @@
<SECTION>
<FILE>graphene-gobject</FILE>
-<INCLUDE>graphene-gobject.h</INCLUDE>
<SUBSECTION Standard>
GRAPHENE_TYPE_BOX
GRAPHENE_TYPE_EULER
@@ -116,7 +112,6 @@
<SECTION>
<FILE>graphene-matrix</FILE>
-<INCLUDE>graphene.h</INCLUDE>
graphene_matrix_t
graphene_matrix_alloc
graphene_matrix_free
@@ -182,7 +177,6 @@
<SECTION>
<FILE>graphene-plane</FILE>
-<INCLUDE>graphene.h</INCLUDE>
graphene_plane_t
graphene_plane_alloc
graphene_plane_free
@@ -201,7 +195,6 @@
<SECTION>
<FILE>graphene-point</FILE>
-<INCLUDE>graphene.h</INCLUDE>
GRAPHENE_POINT_INIT
GRAPHENE_POINT_INIT_ZERO
graphene_point_t
@@ -220,7 +213,6 @@
<SECTION>
<FILE>graphene-size</FILE>
-<INCLUDE>graphene.h</INCLUDE>
GRAPHENE_SIZE_INIT
GRAPHENE_SIZE_INIT_ZERO
graphene_size_t
@@ -236,7 +228,6 @@
<SECTION>
<FILE>graphene-point3d</FILE>
-<INCLUDE>graphene.h</INCLUDE>
GRAPHENE_POINT3D_INIT
GRAPHENE_POINT3D_INIT_ZERO
graphene_point3d_t
@@ -261,7 +252,6 @@
<SECTION>
<FILE>graphene-quad</FILE>
-<INCLUDE>graphene.h</INCLUDE>
graphene_quad_t
graphene_quad_alloc
graphene_quad_free
@@ -275,7 +265,6 @@
<SECTION>
<FILE>graphene-quaternion</FILE>
-<INCLUDE>graphene.h</INCLUDE>
graphene_quaternion_t
graphene_quaternion_alloc
graphene_quaternion_free
@@ -302,7 +291,6 @@
<SECTION>
<FILE>graphene-ray</FILE>
-<INCLUDE>graphene.h</INCLUDE>
graphene_ray_t
graphene_ray_alloc
graphene_ray_free
@@ -320,7 +308,6 @@
<SECTION>
<FILE>graphene-rect</FILE>
-<INCLUDE>graphene.h</INCLUDE>
GRAPHENE_RECT_INIT
graphene_rect_t
graphene_rect_alloc
@@ -357,7 +344,6 @@
<SECTION>
<FILE>graphene-simd4f</FILE>
-<INCLUDE>graphene.h</INCLUDE>
graphene_simd4f_t
graphene_simd4f_init
graphene_simd4f_init_zero
@@ -433,7 +419,6 @@
<SECTION>
<FILE>graphene-simd4x4f</FILE>
-<INCLUDE>graphene.h</INCLUDE>
graphene_simd4x4f_t
graphene_simd4x4f_init
graphene_simd4x4f_init_identity
@@ -468,7 +453,6 @@
<SECTION>
<FILE>graphene-sphere</FILE>
-<INCLUDE>graphene.h</INCLUDE>
graphene_sphere_t
graphene_sphere_alloc
graphene_sphere_free
@@ -487,7 +471,6 @@
<SECTION>
<FILE>graphene-triangle</FILE>
-<INCLUDE>graphene.h</INCLUDE>
graphene_triangle_t
graphene_triangle_alloc
graphene_triangle_free
@@ -507,7 +490,6 @@
<SECTION>
<FILE>graphene-vectors</FILE>
-<INCLUDE>graphene.h</INCLUDE>
GRAPHENE_VEC2_LEN
graphene_vec2_t
graphene_vec2_alloc
@@ -611,7 +593,6 @@
<SECTION>
<FILE>graphene-version</FILE>
-<INCLUDE>graphene.h</INCLUDE>
GRAPHENE_MAJOR_VERSION
GRAPHENE_MINOR_VERSION
GRAPHENE_MICRO_VERSION
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-1.8.2/doc/meson.build new/graphene-1.8.6/doc/meson.build
--- old/graphene-1.8.2/doc/meson.build 2018-06-13 18:51:25.000000000 +0200
+++ new/graphene-1.8.6/doc/meson.build 2019-03-05 18:32:19.000000000 +0100
@@ -38,6 +38,9 @@
'--ignore-decorators=_GRAPHENE_PUBLIC|GRAPHENE_ALIGN16',
'--ignore-headers=' + ' '.join(private_headers),
],
+ mkdb_args: [
+ '--default-include=graphene.h',
+ ],
fixxref_args: [
'--html-dir=@0@'.format(docpath),
'--extra-dir=@0@'.format(join_paths(glib_docpath, 'glib')),
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-1.8.2/meson.build new/graphene-1.8.6/meson.build
--- old/graphene-1.8.2/meson.build 2018-06-13 18:51:25.000000000 +0200
+++ new/graphene-1.8.6/meson.build 2019-03-05 18:32:19.000000000 +0100
@@ -1,7 +1,7 @@
project('graphene', 'c',
- version: '1.8.2',
+ version: '1.8.6',
license: 'MIT',
- meson_version: '>= 0.43.1',
+ meson_version: '>= 0.48.0',
default_options: [
'buildtype=debugoptimized',
'c_std=c99',
@@ -114,11 +114,7 @@
common_ldflags = []
if host_system == 'linux'
ldflags = [ '-Wl,-Bsymbolic-functions', '-Wl,-z,relro', '-Wl,-z,now', ]
- if meson.version().version_compare('>= 0.46.0')
- common_ldflags += cc.get_supported_link_arguments(ldflags)
- elif cc.get_id() == 'gcc'
- common_ldflags += ldflags
- endif
+ common_ldflags += cc.get_supported_link_arguments(ldflags)
endif
# Maintain compatibility with Autotools on macOS
@@ -230,7 +226,7 @@
return 0;
}
'''
- conf.set10('HAVE_INIT_ONCE',
+ conf.set('HAVE_INIT_ONCE',
cc.compiles(init_once_prog, name: 'InitOnceExecuteOnce'),
description: 'Define if InitOnceExecuteOnce is available',
)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-1.8.2/src/bench/graphene-bench-utils.c new/graphene-1.8.6/src/bench/graphene-bench-utils.c
--- old/graphene-1.8.2/src/bench/graphene-bench-utils.c 2018-06-13 18:51:25.000000000 +0200
+++ new/graphene-1.8.6/src/bench/graphene-bench-utils.c 2019-03-05 18:32:19.000000000 +0100
@@ -166,7 +166,7 @@
graphene_bench_run_test (const char *impl,
const char *path,
GrapheneBenchFunc func,
- gint64 num_rounds,
+ int num_rounds,
double *round_min,
double *round_max,
double *round_avg)
@@ -224,7 +224,7 @@
free (round_elapsed);
if (bench_verbose)
- g_printerr ("# '[%s]:%s': %.6f usecs/round after %" G_GINT64_FORMAT " rounds\n",
+ g_printerr ("# '[%s]:%s': %.6f usecs/round after %i rounds\n",
impl,
path,
elapsed,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-1.8.2/src/bench/matrix.c new/graphene-1.8.6/src/bench/matrix.c
--- old/graphene-1.8.2/src/bench/matrix.c 2018-06-13 18:51:25.000000000 +0200
+++ new/graphene-1.8.6/src/bench/matrix.c 2019-03-05 18:32:19.000000000 +0100
@@ -86,16 +86,17 @@
for (i = 0; i < N_ROUNDS; i++)
{
+ float j = (float) i;
graphene_simd4f_t p, q;
- p = graphene_simd4f_init (i, i, i, i);
- q = graphene_simd4f_init (N_ROUNDS - i, N_ROUNDS - i, N_ROUNDS - i, N_ROUNDS - i);
+ p = graphene_simd4f_init (j, j, j, j);
+ q = graphene_simd4f_init (N_ROUNDS - j, N_ROUNDS - j, N_ROUNDS - j, N_ROUNDS - j);
res->a[i] = graphene_simd4x4f_init (p, p, p, p);
res->b[i] = graphene_simd4x4f_init (q, q, q, q);
- res->pa[i] = graphene_simd4f_init (i, i, 0.f, 0.f);
- res->qa[i] = graphene_simd4f_init (N_ROUNDS - i, N_ROUNDS - 1, 1.f, 0.f);
+ res->pa[i] = graphene_simd4f_init (j, j, 0.f, 0.f);
+ res->qa[i] = graphene_simd4f_init (N_ROUNDS - j, N_ROUNDS - 1, 1.f, 0.f);
}
return res;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-1.8.2/src/graphene-gobject.c new/graphene-1.8.6/src/graphene-gobject.c
--- old/graphene-1.8.2/src/graphene-gobject.c 2018-06-13 18:51:25.000000000 +0200
+++ new/graphene-1.8.6/src/graphene-gobject.c 2019-03-05 18:32:19.000000000 +0100
@@ -25,6 +25,7 @@
* SECTION:graphene-gobject
* @Title: GObject integration
* @short_description: Types for GObject properties and signals
+ * @Include: graphene-gobject.h
*
* Graphene optionally provides information for using its own types with
* GObject properties and signals.
@@ -33,8 +34,17 @@
*
* In order to discover at compile time if Graphene exposes type information
* for the GType type system, you need to check if the `graphene-gobject-1.0`
- * pkg-config file exists. In build systems using autotools, you can use
- * the `PKG_CHECK_EXISTS` m4 macro, for instance:
+ * pkg-config file exists.
+ *
+ * If you're using Meson to build your project, you can use a typical
+ * `dependency()` object, for instance:
+ *
+ * |[<!-- language="plain" -->
+ * graphene_dep = dependency('graphene-gobject-1.0')
+ * ]|
+ *
+ * If you're using Autotools to build your project, you can use the
+ * `PKG_CHECK_EXISTS` m4 macro, for instance:
*
* |[<!-- language="plain" -->
* PKG_CHECK_EXISTS([graphene-gobject-1.0],
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-1.8.2/src/graphene-macros.h new/graphene-1.8.6/src/graphene-macros.h
--- old/graphene-1.8.2/src/graphene-macros.h 2018-06-13 18:51:25.000000000 +0200
+++ new/graphene-1.8.6/src/graphene-macros.h 2019-03-05 18:32:19.000000000 +0100
@@ -71,7 +71,6 @@
# define GRAPHENE_END_DECLS
#endif
-#ifndef __GI_SCANNER__
#if defined(_MSC_VER) && !defined(__bool_true_false_are_defined) && (_MSC_VER < 1800)
typedef int bool;
# define false 0
@@ -79,7 +78,6 @@
#else
# include
#endif
-#endif
#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)
#define _GRAPHENE_DEPRECATED __attribute__((__deprecated__))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-1.8.2/src/graphene-matrix.c new/graphene-1.8.6/src/graphene-matrix.c
--- old/graphene-1.8.2/src/graphene-matrix.c 2018-06-13 18:51:25.000000000 +0200
+++ new/graphene-1.8.6/src/graphene-matrix.c 2019-03-05 18:32:19.000000000 +0100
@@ -33,10 +33,10 @@
* w) representing rows, and elements of each vector are a column:
*
* |[<!-- language="plain" -->
- * | x | | x.x x.y x.z x.w |
- * | y | -\ | y.x y.y y.z y.w |
- * | z | -/ | z.x z.y z.z z.w |
- * | w | | w.x w.y w.z w.w |
+ * ⎡ m.x ⎤ ⎛ x.x x.y x.z x.w ⎞
+ * ⎜ m.y ⎟ -\ ⎜ y.x y.y y.z y.w ⎟
+ * ⎜ m.z ⎟ -/ ⎜ z.x z.y z.z z.w ⎟
+ * ⎣ m.w ⎦ ⎝ w.x w.y w.z w.w ⎠
* ]|
*
* It is possible to easily convert a #graphene_matrix_t to and from an array
@@ -386,8 +386,8 @@
/**
* graphene_matrix_init_skew:
* @m: a #graphene_matrix_t
- * @x_skew: skew factor on the X axis
- * @y_skew: skew factor on the Y axis
+ * @x_skew: skew factor, in radians, on the X axis
+ * @y_skew: skew factor, in radians, on the Y axis
*
* Initializes a #graphene_matrix_t with a skew transformation
* with the given factors.
@@ -560,13 +560,13 @@
* The arguments map to the following matrix layout:
*
* |[<!-- language="plain" -->
- * | xx yx | | a b 0 |
- * | xy yy | = | c d 0 |
- * | x0 y0 | | tx ty 1 |
+ * ⎛ xx yx ⎞ ⎛ a b 0 ⎞
+ * ⎜ xy yy ⎟ = ⎜ c d 0 ⎟
+ * ⎝ x0 y0 ⎠ ⎝ tx ty 1 ⎠
* ]|
*
- * This function can be used to convert between a matrix type from
- * other libraries and a #graphene_matrix_t.
+ * This function can be used to convert between an affine matrix type
+ * from other libraries and a #graphene_matrix_t.
*
* Returns: (transfer none): the initialized matrix
*
@@ -605,13 +605,13 @@
* The returned values have the following layout:
*
* |[<!-- language="plain" -->
- * | xx yx | | a b 0 |
- * | xy yy | = | c d 0 |
- * | x0 y0 | | tx ty 1 |
+ * ⎛ xx yx ⎞ ⎛ a b 0 ⎞
+ * ⎜ xy yy ⎟ = ⎜ c d 0 ⎟
+ * ⎝ x0 y0 ⎠ ⎝ tx ty 1 ⎠
* ]|
*
* This function can be used to convert between a #graphene_matrix_t
- * and a matrix type from other libraries.
+ * and an affine matrix type from other libraries.
*
* Returns: `true` if the matrix is compatible with an affine
* transformation matrix
@@ -629,38 +629,22 @@
{
float res[4];
- graphene_simd4f_dup_4f (m->value.x, res);
- if (!graphene_approx_val (res[2], 0.f) &&
- !graphene_approx_val (res[3], 0.f))
+ if (!graphene_simd4x4f_is_2d (&m->value))
return false;
+ graphene_simd4f_dup_4f (m->value.x, res);
if (xx != NULL)
*xx = res[0];
if (yx != NULL)
*yx = res[1];
graphene_simd4f_dup_4f (m->value.y, res);
- if (!graphene_approx_val (res[2], 0.f) &&
- !graphene_approx_val (res[3], 0.f))
- return false;
-
if (xy != NULL)
*xy = res[0];
if (yy != NULL)
*yy = res[1];
- graphene_simd4f_dup_4f (m->value.z, res);
- if (!graphene_approx_val (res[0], 0.f) &&
- !graphene_approx_val (res[1], 0.f) &&
- !graphene_approx_val (res[2], 1.f) &&
- !graphene_approx_val (res[3], 0.f))
- return false;
-
graphene_simd4f_dup_4f (m->value.w, res);
- if (!graphene_approx_val (res[2], 0.f) &&
- !graphene_approx_val (res[3], 1.f))
- return false;
-
if (x_0 != NULL)
*x_0 = res[0];
if (y_0 != NULL)
@@ -783,8 +767,8 @@
*
* Multiplies two #graphene_matrix_t.
*
- * Remember: matrix multiplication is not commutative, except for the
- * identity matrix; the product of this multiplication is (A * B).
+ * Matrix multiplication is not commutative in general; the order of the factors matters.
+ * The product of this multiplication is (@a × @b)
*
* Since: 1.0
*/
@@ -824,6 +808,12 @@
*
* Transforms the given #graphene_vec3_t using the matrix @m.
*
+ * This function will multiply the X, Y, and Z row vectors of the matrix @m
+ * with the corresponding components of the vector @v. The W row vector will
+ * be ignored.
+ *
+ * See also: graphene_simd4x4f_vec3_mul()
+ *
* Since: 1.0
*/
void
@@ -842,6 +832,8 @@
*
* Transforms the given #graphene_vec4_t using the matrix @m.
*
+ * See also: graphene_simd4x4f_vec4_mul()
+ *
* Since: 1.0
*/
void
@@ -861,6 +853,12 @@
*
* Transforms the given #graphene_point_t using the matrix @m.
*
+ * Unlike graphene_matrix_transform_vec3(), this function will take into
+ * account the fourth row vector of the #graphene_matrix_t when computing
+ * the dot product of each row vector of the matrix.
+ *
+ * See also: graphene_simd4x4f_point3_mul()
+ *
* Since: 1.0
*/
void
@@ -870,8 +868,8 @@
{
graphene_simd4f_t vec3;
- vec3 = graphene_simd4f_init (p->x, p->y, 0.0f, 0.0f);
- graphene_simd4x4f_vec3_mul (&m->value, &vec3, &vec3);
+ vec3 = graphene_simd4f_init (p->x, p->y, 0.0f, 1.0f);
+ graphene_simd4x4f_point3_mul (&m->value, &vec3, &vec3);
res->x = graphene_simd4f_get_x (vec3);
res->y = graphene_simd4f_get_y (vec3);
@@ -886,7 +884,8 @@
* Transforms the given #graphene_point3d_t using the matrix @m.
*
* Unlike graphene_matrix_transform_vec3(), this function will take into
- * account the fourth row vector of the #graphene_matrix_t.
+ * account the fourth row vector of the #graphene_matrix_t when computing
+ * the dot product of each row vector of the matrix.
*
* Since: 1.2
*/
@@ -897,7 +896,7 @@
{
graphene_simd4f_t vec3;
- vec3 = graphene_simd4f_init (p->x, p->y, p->z, 0.f);
+ vec3 = graphene_simd4f_init (p->x, p->y, p->z, 1.f);
graphene_simd4x4f_point3_mul (&m->value, &vec3, &vec3);
res->x = graphene_simd4f_get_x (vec3);
@@ -912,8 +911,9 @@
* @res: (out caller-allocates): return location for the
* transformed quad
*
- * Transforms a #graphene_rect_t using the given matrix @m. The
- * result is a coplanar quad.
+ * Transforms each corner of a #graphene_rect_t using the given matrix @m.
+ *
+ * The result is a coplanar quadrilateral.
*
* Since: 1.0
*/
@@ -950,8 +950,10 @@
* @res: (out caller-allocates): return location for the bounds
* of the transformed rectangle
*
- * Transforms a #graphene_rect_t using the given matrix @m. The
- * result is the bounding box containing the coplanar quad.
+ * Transforms each corner of a #graphene_rect_t using the given matrix @m.
+ *
+ * The result is the axis aligned bounding rectangle containing the coplanar
+ * quadrilateral.
*
* Since: 1.0
*/
@@ -1047,8 +1049,10 @@
* @res: (out caller-allocates): return location for the bounds
* of the transformed box
*
- * Transforms a #graphene_box_t using the given matrix @m. The
- * result is the bounding box containing the transformed box.
+ * Transforms the vertices of a #graphene_box_t using the given matrix @m.
+ *
+ * The result is the axis aligned bounding box containing the transformed
+ * vertices.
*
* Since: 1.2
*/
@@ -1138,8 +1142,8 @@
*
* Projects a #graphene_rect_t using the given matrix.
*
- * The resulting rectangle is the bounding box capable of containing
- * fully the projected rectangle.
+ * The resulting rectangle is the axis aligned bounding rectangle capable
+ * of containing fully the projected rectangle.
*
* Since: 1.0
*/
@@ -1214,7 +1218,7 @@
* untransformed point
*
* Undoes the transformation of a #graphene_point_t using the
- * given matrix, within the given rectangular @bounds.
+ * given matrix, within the given axis aligned rectangular @bounds.
*
* Returns: `true` if the point was successfully untransformed
*
@@ -1258,8 +1262,8 @@
* @res: (out caller-allocates): return location for the
* untransformed rectangle
*
- * Undoes the transformation on the points of a #graphene_rect_t
- * using the given matrix, within the given rectangular @bounds.
+ * Undoes the transformation on the corners of a #graphene_rect_t using the
+ * given matrix, within the given axis aligned rectangular @bounds.
*
* Since: 1.0
*/
@@ -1343,6 +1347,9 @@
* Adds a translation transformation to @m using the coordinates
* of the given #graphene_point3d_t.
*
+ * This is the equivalent of calling graphene_matrix_init_translate() and
+ * then multiplying @m with the translation matrix.
+ *
* Since: 1.0
*/
void
@@ -1363,6 +1370,9 @@
* Adds a rotation transformation to @m, using the given
* #graphene_quaternion_t.
*
+ * This is the equivalent of calling graphene_quaternion_to_matrix() and
+ * then multiplying @m with the rotation matrix.
+ *
* Since: 1.2
*/
void
@@ -1415,6 +1425,9 @@
* Adds a rotation transformation to @m, using the given @angle
* and @axis vector.
*
+ * This is the equivalent of calling graphene_matrix_init_rotate() and
+ * then multiplying the matrix @m with the rotation matrix.
+ *
* Since: 1.0
*/
void
@@ -1433,6 +1446,8 @@
* Adds a rotation transformation around the X axis to @m, using
* the given @angle.
*
+ * See also: graphene_matrix_rotate()
+ *
* Since: 1.0
*/
void
@@ -1451,6 +1466,8 @@
* Adds a rotation transformation around the Y axis to @m, using
* the given @angle.
*
+ * See also: graphene_matrix_rotate()
+ *
* Since: 1.0
*/
void
@@ -1469,6 +1486,8 @@
* Adds a rotation transformation around the Z axis to @m, using
* the given @angle.
*
+ * See also: graphene_matrix_rotate()
+ *
* Since: 1.0
*/
void
@@ -1489,6 +1508,9 @@
* Adds a scaling transformation to @m, using the three
* given factors.
*
+ * This is the equivalent of calling graphene_matrix_init_scale() and then
+ * multiplying the matrix @m with the scale matrix.
+ *
* Since: 1.0
*/
void
@@ -1822,7 +1844,7 @@
graphene_point3d_t *translate_r,
graphene_vec4_t *perspective_r)
{
- graphene_matrix_t local, perspective;
+ graphene_matrix_t local;
float shear_xy, shear_xz, shear_yz;
float scale_x, scale_y, scale_z;
graphene_simd4f_t perspective_v;
@@ -1840,17 +1862,20 @@
* but it also provides an easy way to test for singularity of
* the upper 3x3 component
*/
- perspective = local;
- perspective.value.w = graphene_simd4f_init (0.f, 0.f, 0.f, 1.f);
-
- if (graphene_approx_val (graphene_matrix_determinant (&perspective), 0.f))
- return false;
-
perspective_v = graphene_simd4f_init (graphene_simd4f_get_w (local.value.x),
graphene_simd4f_get_w (local.value.y),
graphene_simd4f_get_w (local.value.z),
graphene_simd4f_get_w (local.value.w));
+ /* Clear the perspective component */
+ local.value.x = graphene_simd4f_merge_w (local.value.x, 0.f);
+ local.value.y = graphene_simd4f_merge_w (local.value.y, 0.f);
+ local.value.z = graphene_simd4f_merge_w (local.value.z, 0.f);
+ local.value.w = graphene_simd4f_merge_w (local.value.w, 1.f);
+
+ if (graphene_approx_val (graphene_matrix_determinant (&local), 0.f))
+ return false;
+
/* isolate the perspective */
if (!graphene_simd4f_is_zero3 (perspective_v))
{
@@ -1864,14 +1889,8 @@
* check if the matrix is invertible here because we just checked
* whether the determinant is not zero.
*/
- graphene_matrix_inverse (&perspective, &tmp);
- graphene_matrix_transpose_transform_vec4 (&tmp, perspective_r, perspective_r);
-
- /* Clear the perspective component */
- local.value.x = graphene_simd4f_merge_w (local.value.x, 0.f);
- local.value.y = graphene_simd4f_merge_w (local.value.y, 0.f);
- local.value.z = graphene_simd4f_merge_w (local.value.z, 0.f);
- local.value.w = graphene_simd4f_merge_w (local.value.w, 1.f);
+ graphene_matrix_inverse (&local, &tmp);
+ graphene_matrix_transform_vec4 (&tmp, perspective_r, perspective_r);
}
else
graphene_vec4_init (perspective_r, 0.f, 0.f, 0.f, 1.f);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-1.8.2/src/graphene-plane.c new/graphene-1.8.6/src/graphene-plane.c
--- old/graphene-1.8.2/src/graphene-plane.c 2018-06-13 18:51:25.000000000 +0200
+++ new/graphene-1.8.6/src/graphene-plane.c 2019-03-05 18:32:19.000000000 +0100
@@ -26,9 +26,11 @@
* @Title: Plane
* @Short_Description: A plane in 3D space
*
- * #graphene_plane_t is a structure representing a plane in 3D space, using
- * a normal vector pointing towards the origin, and a constant distance from
- * the origin along the normal vector.
+ * #graphene_plane_t is a structure representing a plane that extends
+ * infinitely in 3D space, described using the [Hessian normal
+ * form](http://mathworld.wolfram.com/HessianNormalForm.html)
+ * of a unit length normal vector pointing towards the origin, and a
+ * constant distance from the origin along the normal vector.
*/
#include "graphene-private.h"
@@ -78,9 +80,11 @@
/**
* graphene_plane_init:
* @p: the #graphene_plane_t to initialize
- * @normal: (nullable): a normal vector defining the plane pointing towards the origin
- * @constant: the negative distance from the origin to the plane along the
- * normal vector
+ * @normal: (nullable): a unit length normal vector defining the plane
+ * pointing towards the origin; if unset, we use the X axis by default
+ * @constant: the distance from the origin to the plane along the
+ * normal vector; the sign determines the half-space occupied by the
+ * plane
*
* Initializes the given #graphene_plane_t using the given @normal vector
* and @constant values.
@@ -221,7 +225,8 @@
* @p: a #graphene_plane_t
* @res: (out caller-allocates): return location for the normalized plane
*
- * Normalizes the vector and constant of a #graphene_plane_t.
+ * Normalizes the vector of the given #graphene_plane_t,
+ * and adjusts the constant accordingly.
*
* Since: 1.2
*/
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-1.8.2/src/graphene-simd4x4f.h new/graphene-1.8.6/src/graphene-simd4x4f.h
--- old/graphene-1.8.2/src/graphene-simd4x4f.h 2018-06-13 18:51:25.000000000 +0200
+++ new/graphene-1.8.6/src/graphene-simd4x4f.h 2019-03-05 18:32:19.000000000 +0100
@@ -218,8 +218,30 @@
* @b: a #graphene_simd4f_t
* @res: (out): return location for a #graphene_simd4f_t
*
- * Multiplies the given #graphene_simd4x4f_t with the given
- * #graphene_simd4f_t using a dot product.
+ * Left multiplies the given #graphene_simd4x4f_t with the given
+ * #graphene_simd4f_t row vector using a dot product:
+ *
+ * |[<!-- language="plain" -->
+ * res = b × A
+ *
+ * = ⎡x⎤ ⎛ x.x x.y x.z x.w ⎞
+ * ⎜y⎟ ⎜ y.x y.y y.z y.w ⎟
+ * ⎜z⎟ ⎜ z.x z.y z.z z.w ⎟
+ * ⎣w⎦ ⎝ w.x w.y w.z w.w ⎠
+ *
+ * = [ x.x × x x.y × x x.z × x x.w × x ]
+ * + + + +
+ * [ y.x × y y.y × y y.z × y y.w × y ]
+ * + + + +
+ * [ z.x × z z.y × z z.z × z z.w × z ]
+ * + + + +
+ * [ w.x × w w.y × w w.z × w w.w × w ]
+ *
+ * = ⎡ x.x × x + y.x × y + z.x × z + w.x × w ⎤
+ * ⎜ x.y × x + y.y × y + z.y × z + w.y × w ⎟
+ * ⎜ x.z × x + y.z × y + z.z × z + w.z × w ⎟
+ * ⎣ x.w × x + y.w × y + z.w × z + w.w × w ⎦
+ * ]|
*
* Since: 1.0
*/
@@ -246,9 +268,31 @@
* @v: a #graphene_simd4f_t
* @res: (out): return location for a #graphene_simd4f_t
*
- * Multiplies the given #graphene_simd4x4f_t with the given
+ * Left multiplies the given #graphene_simd4x4f_t with the given
* #graphene_simd4f_t, using only the first three row vectors
- * of the matrix, and the first three components of the vector.
+ * of the matrix, and the first three components of the vector;
+ * the W components of the matrix and vector are ignored:
+ *
+ * |[<!-- language="plain" -->
+ * res = b × A
+ *
+ * = ⎡x⎤ ⎛ x.x x.y x.z ⎞
+ * ⎜y⎟ ⎜ y.x y.y y.z ⎟
+ * ⎣z⎦ ⎝ z.x z.y z.z ⎠
+ *
+ * = [ x.x × x x.y × x x.z × x ]
+ * + + +
+ * [ y.x × y y.y × y y.z × y ]
+ * + + +
+ * [ z.x × z z.y × z z.z × z ]
+ *
+ * = ⎡ x.x × x + y.x × y + z.x × z ⎤
+ * ⎜ x.y × x + y.y × y + z.y × z ⎟
+ * ⎜ x.z × x + y.z × y + z.z × z ⎟
+ * ⎣ 0 ⎦
+ * ]|
+ *
+ * See also: graphene_simd4x4f_vec4_mul(), graphene_simd4x4f_point3_mul()
*
* Since: 1.0
*/
@@ -260,10 +304,12 @@
const graphene_simd4f_t v_x = graphene_simd4f_splat_x (*v);
const graphene_simd4f_t v_y = graphene_simd4f_splat_y (*v);
const graphene_simd4f_t v_z = graphene_simd4f_splat_z (*v);
+ graphene_simd4f_t r;
- *res = graphene_simd4f_add (graphene_simd4f_add (graphene_simd4f_mul (m->x, v_x),
- graphene_simd4f_mul (m->y, v_y)),
- graphene_simd4f_mul (m->z, v_z));
+ r = graphene_simd4f_add (graphene_simd4f_add (graphene_simd4f_mul (m->x, v_x),
+ graphene_simd4f_mul (m->y, v_y)),
+ graphene_simd4f_mul (m->z, v_z));
+ *res = graphene_simd4f_zero_w (r);
}
/**
@@ -276,7 +322,29 @@
* #graphene_simd4f_t.
*
* Unlike graphene_simd4x4f_vec3_mul(), this function will
- * also use the fourth row vector of the matrix.
+ * use the W components of the matrix:
+ *
+ * |[<!-- language="plain" -->
+ * res = b × A
+ *
+ * = ⎡x⎤ ⎛ x.x x.y x.z x.w ⎞
+ * ⎜y⎟ ⎜ y.x y.y y.z y.w ⎟
+ * ⎜z⎟ ⎜ z.x z.y z.z z.w ⎟
+ * ⎣w⎦ ⎝ w.x w.y w.z w.w ⎠
+ *
+ * = [ x.x × x x.y × x x.z × x x.w × x ]
+ * + + + +
+ * [ y.x × y y.y × y y.z × y y.w × y ]
+ * + + + +
+ * [ z.x × z z.y × z z.z × z z.w × z ]
+ * + + + +
+ * [ w.x w.y w.z w.w ]
+ *
+ * = ⎡ x.x × x + y.x × y + z.x × z + w.x ⎤
+ * ⎜ x.y × x + y.y × y + z.y × z + w.y ⎟
+ * ⎜ x.z × x + y.z × y + z.z × z + w.z ⎟
+ * ⎣ x.w × x + y.w × y + z.w × z + w.w ⎦
+ * ]|
*
* Since: 1.0
*/
@@ -428,10 +496,14 @@
* the order is correct if we want to multiply A with B; remember
* that matrix multiplication is non-commutative.
*/
- graphene_simd4x4f_vec4_mul (b, &a->x, &res->x);
- graphene_simd4x4f_vec4_mul (b, &a->y, &res->y);
- graphene_simd4x4f_vec4_mul (b, &a->z, &res->z);
- graphene_simd4x4f_vec4_mul (b, &a->w, &res->w);
+ graphene_simd4f_t x, y, z, w;
+
+ graphene_simd4x4f_vec4_mul (b, &a->x, &x);
+ graphene_simd4x4f_vec4_mul (b, &a->y, &y);
+ graphene_simd4x4f_vec4_mul (b, &a->z, &z);
+ graphene_simd4x4f_vec4_mul (b, &a->w, &w);
+
+ *res = graphene_simd4x4f_init (x, y, z, w);
#endif
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-1.8.2/src/meson.build new/graphene-1.8.6/src/meson.build
--- old/graphene-1.8.2/src/meson.build 2018-06-13 18:51:25.000000000 +0200
+++ new/graphene-1.8.6/src/meson.build 2019-03-05 18:32:19.000000000 +0100
@@ -69,7 +69,7 @@
)
# External configuration header
-configure_file(
+graphene_config_h = configure_file(
input: 'graphene-config.h.meson',
output: 'graphene-config.h',
configuration: graphene_conf,
@@ -94,12 +94,19 @@
install_headers(headers + simd_headers + [ 'graphene.h' ], subdir: graphene_api_path)
-pkgconfig_files = [ graphene_api_path ]
+# pkg name, extra requires
+pkgconfig_files = [
+ [ graphene_api_path, [], ],
+]
+
platform_deps = []
if build_gobject
- pkgconfig_files += [ graphene_gobject_api_path ]
- platform_deps += [ gobject ]
+ pkgconfig_files += [
+ [ graphene_gobject_api_path, gobject ],
+ ]
+
+ platform_deps += gobject
endif
libgraphene = library(
@@ -115,29 +122,33 @@
link_args: common_ldflags,
)
-foreach simd: [ 'sse2', 'gcc', 'neon' ]
+foreach simd: [ 'sse2', 'gcc', 'neon', 'scalar', ]
set_variable('has_' + simd, graphene_simd.contains(simd) ? '1' : '0')
endforeach
pkgconfig = import('pkgconfig')
foreach p: pkgconfig_files
+ pkg_name = p[0]
+ pkg_requires = p[1]
+
pkgconfig.generate(
+ libgraphene,
name: 'Graphene',
description: 'Math classes for graphic libraries',
url: 'https://ebassi.github.io/graphene',
version: meson.project_version(),
- filebase: p,
+ filebase: pkg_name,
variables: [
'graphene_has_sse2=@0@'.format(has_sse2),
'graphene_has_gcc=@0@'.format(has_gcc),
'graphene_has_neon=@0@'.format(has_neon),
- 'graphene_has_scalar=1',
+ 'graphene_has_scalar=@0@'.format(has_scalar),
],
subdirs: graphene_api_path,
+ requires: pkg_requires,
extra_cflags: [
'-I${libdir}/@0@/include'.format(graphene_api_path),
] + sse2_cflags + neon_cflags,
- libraries: libgraphene,
)
endforeach
@@ -155,8 +166,9 @@
'--warn-all',
'-DGRAPHENE_COMPILATION',
]
+
graphene_gir = gnome.generate_gir(libgraphene,
- sources: headers + sources,
+ sources: [graphene_config_h] + headers + sources,
namespace: 'Graphene',
nsversion: graphene_api_version,
identifier_prefix: 'Graphene',
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-1.8.2/src/tests/graphene-test-compat.h new/graphene-1.8.6/src/tests/graphene-test-compat.h
--- old/graphene-1.8.2/src/tests/graphene-test-compat.h 2018-06-13 18:51:25.000000000 +0200
+++ new/graphene-1.8.6/src/tests/graphene-test-compat.h 2019-03-05 18:32:19.000000000 +0100
@@ -108,6 +108,21 @@
} \
} G_STMT_END
+#define graphene_assert_fuzzy_point3d_equal(p1,p2,epsilon) \
+ G_STMT_START { \
+ graphene_point3d_t *__p1 = (p1); \
+ graphene_point3d_t *__p2 = (p2); \
+ float __epsilon = (epsilon); \
+ if (graphene_point3d_near (__p1, __p2, __epsilon)) ; \
+ else { \
+ char *s = g_strdup_printf (#p1 " == " #p2 " (+/- " #epsilon "): " \
+ "{ x:%.7g, y:%.7g, z:%.7g } == { x:%.7g, y:%.7g, z:%.7g }", \
+ __p1->x, __p1->y, __p1->z, __p2->x, __p2->y, __p2->z); \
+ g_assertion_message (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, s); \
+ g_free (s); \
+ } \
+ } G_STMT_END
+
#define graphene_assert_fuzzy_size_equal(s1,s2,epsilon) \
G_STMT_START { \
if (graphene_fuzzy_equals ((s1)->width, (s2)->width, epsilon) && \
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/graphene-1.8.2/src/tests/matrix.c new/graphene-1.8.6/src/tests/matrix.c
--- old/graphene-1.8.2/src/tests/matrix.c 2018-06-13 18:51:25.000000000 +0200
+++ new/graphene-1.8.6/src/tests/matrix.c 2019-03-05 18:32:19.000000000 +0100
@@ -455,6 +455,78 @@
}
GRAPHENE_TEST_UNIT_END
+GRAPHENE_TEST_UNIT_BEGIN (matrix_interpolate_perspective)
+{
+ graphene_matrix_t m1, m2, m3, mr;
+
+ graphene_matrix_init_identity (&m1);
+ graphene_matrix_perspective (&m1, 200, &m1);
+ graphene_matrix_init_identity (&m2);
+ graphene_matrix_perspective (&m2, 800, &m2);
+
+ graphene_matrix_interpolate (&m1, &m2, 0.0, &mr);
+ graphene_assert_fuzzy_matrix_equal (&mr, &m1, 0.1);
+
+ graphene_matrix_interpolate (&m1, &m2, 1.0, &mr);
+ graphene_assert_fuzzy_matrix_equal (&mr, &m2, 0.1);
+
+ graphene_matrix_init_identity (&m3);
+ graphene_matrix_perspective (&m3, 400, &m3);
+ graphene_matrix_interpolate (&m1, &m2, 0.5, &mr);
+ graphene_assert_fuzzy_matrix_equal (&mr, &m3, 0.1);
+}
+GRAPHENE_TEST_UNIT_END
+
+GRAPHENE_TEST_UNIT_BEGIN (matrix_multiply_self)
+{
+ graphene_matrix_t a, b, res, test;
+ float floats[16] = { 0, 0, 0, 2,
+ 0, 0, 2, 0,
+ 0, 2, 0, 0,
+ 2, 0, 0, 0 };
+
+ graphene_matrix_init_from_float (&a, floats);
+ graphene_matrix_init_from_float (&b, floats);
+ graphene_matrix_multiply (&a, &b, &res);
+
+ graphene_matrix_init_from_float (&test, floats);
+ graphene_matrix_multiply (&test, &b, &test);
+ graphene_assert_fuzzy_matrix_equal (&test, &res, G_MINDOUBLE);
+
+ graphene_matrix_init_from_float (&test, floats);
+ graphene_matrix_multiply (&a, &test, &test);
+ graphene_assert_fuzzy_matrix_equal (&test, &res, G_MINDOUBLE);
+
+ graphene_matrix_init_from_float (&test, floats);
+ graphene_matrix_multiply (&test, &test, &test);
+ graphene_assert_fuzzy_matrix_equal (&test, &res, G_MINDOUBLE);
+}
+GRAPHENE_TEST_UNIT_END
+
+GRAPHENE_TEST_UNIT_BEGIN (matrix_to_2d)
+{
+ graphene_matrix_t matrix;
+ float f[16];
+ guint i;
+ bool valid[16] = {
+ true, true, false, false,
+ true, true, false, false,
+ false, false, false, false,
+ true, true, false, false };
+
+ for (i = 0; i < 16; i++)
+ {
+ /* Take the identity matrix and change one member to a different value */
+ graphene_matrix_init_identity (&matrix);
+ graphene_matrix_to_float (&matrix, f);
+ f[i] = 0.5f;
+ graphene_matrix_init_from_float (&matrix, f);
+
+ g_assert_cmpint (graphene_matrix_to_2d (&matrix, NULL, NULL, NULL, NULL, NULL, NULL), ==, valid[i]);
+ }
+}
+GRAPHENE_TEST_UNIT_END
+
GRAPHENE_TEST_UNIT_BEGIN (matrix_2d_interpolate)
{
graphene_matrix_t m1, m2, m3, mr;
@@ -498,6 +570,32 @@
}
GRAPHENE_TEST_UNIT_END
+GRAPHENE_TEST_UNIT_BEGIN (matrix_3d_transform_point)
+{
+ graphene_matrix_t m;
+ graphene_point_t p;
+ graphene_point3d_t p3;
+ graphene_vec3_t v;
+
+ graphene_matrix_init_translate (&m, &GRAPHENE_POINT3D_INIT (50.f, 70.f, 0.f));
+
+ g_test_message ("mat(translation) * point(zero) = point(translation)");
+ graphene_point_init (&p, 0.f, 0.f);
+ graphene_matrix_transform_point (&m, &p, &p);
+ graphene_assert_fuzzy_point_equal (&p, &GRAPHENE_POINT_INIT (50.f, 70.f), 0.01f);
+
+ g_test_message ("mat(translation) * point3d(zero) = point3d(translation)");
+ graphene_point3d_init (&p3, 0.f, 0.f, 0.f);
+ graphene_matrix_transform_point3d (&m, &p3, &p3);
+ graphene_assert_fuzzy_point3d_equal (&p3, &GRAPHENE_POINT3D_INIT (50.f, 70.f, 0.0f), 0.01f);
+
+ g_test_message ("mat(translation) * vec3(zero) = vec3(zero)");
+ graphene_vec3_init (&v, 0.f, 0.f, 0.f);
+ graphene_matrix_transform_vec3 (&m, &v, &v);
+ graphene_assert_fuzzy_vec3_equal (&v, graphene_vec3_zero (), 0.01f);
+}
+GRAPHENE_TEST_UNIT_END
+
GRAPHENE_TEST_SUITE (
GRAPHENE_TEST_UNIT ("/matrix/identity", matrix_identity)
GRAPHENE_TEST_UNIT ("/matrix/scale", matrix_scale)
@@ -508,9 +606,13 @@
GRAPHENE_TEST_UNIT ("/matrix/look_at", matrix_look_at)
GRAPHENE_TEST_UNIT ("/matrix/invert", matrix_invert)
GRAPHENE_TEST_UNIT ("/matrix/interpolate", matrix_interpolate)
+ GRAPHENE_TEST_UNIT ("/matrix/interpolate-perspective", matrix_interpolate_perspective)
+ GRAPHENE_TEST_UNIT ("/matrix/multiply_self", matrix_multiply_self)
+ GRAPHENE_TEST_UNIT ("/matrix/to-2d", matrix_to_2d)
GRAPHENE_TEST_UNIT ("/matrix/2d/identity", matrix_2d_identity)
GRAPHENE_TEST_UNIT ("/matrix/2d/transforms", matrix_2d_transforms)
GRAPHENE_TEST_UNIT ("/matrix/2d/round-trip", matrix_2d_round_trip)
GRAPHENE_TEST_UNIT ("/matrix/2d/interpolate", matrix_2d_interpolate)
GRAPHENE_TEST_UNIT ("/matrix/2d/transform_bound", matrix_2d_transform_bound)
+ GRAPHENE_TEST_UNIT ("/matrix/3d/transform_point", matrix_3d_transform_point)
)