Changelog for geomancy-0.4.0.0
Changelog for geomancy
0.4.0.0
A generally safe upgrade, but quite a bit of changes across the board.
-
Added double-precision
DVec2,DVec3(withPacked),DVec4,DMat4andDQuaternion. Includes SSE2/NEON kernels forDMat4products andDMat4 !* DVec4. -
Added
DTransform(withDTransform.Tree),Vulkan.DProjectionandVulkan.DView. Compose in double and convert withfromTransform/toTransformto keep precision far from the origin. -
Added
DPoint2,DPoint3,DPoint3PandDPoint4.Point'sAffineSpace,qd,distanceandlerpnow work over any scalar, not justFloat. -
Added 64-bit integer vectors
I64Vec2,I64Vec3(withPacked),I64Vec4,U64Vec2,U64Vec3(withPacked),U64Vec4. -
Added
fromVecN/toVecN,fromMat4/toMat4andfromQuaternion/toQuaternionfor single-precision conversions. -
Added
HasFieldinstances for the lanes of every vector type, forv.x,v.y,v.z,v.wwithOverloadedRecordDot.Packedvectors have them too, and aPointforwards each lane to the vector it wraps.- Optimized code is the same as with
withVecN: one unpack, and only the lanes used get read.
-
Added rewrite rules that fuse
Vec4andDVec4producers into their consumers.- Intermediate vectors in expressions like
dot (a + b) c,lerp t a bor(a + b) * c - dare no longer allocated. - Folds over such expressions got 20-30% faster.
- When the rules fire, only the lanes the consumer uses are evaluated, so a fused expression may avoid forcing an undefined lane.
- Intermediate vectors in expressions like
-
Added
HasFieldswizzles for every vector family, inGeomancy.Swizzle.<Family>.Shuffle,.Downand.Up(families:Vec,DVec,IVec,UVec,I64Vec,U64Vec).Shufflekeeps the size (v.zyx, and the identityv.xyz),Downnarrows (v.xyof aVec4),Upwidens (v.xyxyof aVec2).- The instances are orphans.
import Geomancy.Swizzle ()brings all of them, or import just the modules you need, likeimport Geomancy.Swizzle.Vec.Down (). - Chains like
v.wzyx.zyx.yx.ycompile to a single lane read.
-
Added
Extendswizzles that widen a vector with constant lanes, inGeomancy.Swizzle.<Family>.Extend.- The source lanes stay in order and get
0or1appended:flatPos.xy01,pos.xyz1,uv.xy0. - Masks compose from extending and narrowing:
white.xyz0.wyzis(0, y, z).
- The source lanes stay in order and get
-
Changed
Geomancy.Swizzlelabels to use theHasFieldswizzles, sov .@ #xzyworks for every family. -
Modified Quaternion rotation to use a unit shortcut.
- The contract was already "use normalized" quaternions for rotations.
- Float got a modest speedup, Double is twice-ish as fast. Both are faster than Linear.
-
Added
EqforMat4,DMat4,TransformandDTransform. Elements are compared pointwise with IEEE semantics, like the derivedEqofVec3:0 == -0and a matrix containingNaNis not equal to itself. -
Changed
EqandOrdforVec4from bytewise to pointwise, matchingVec3.Ordis now lexicographic over x, y, z, w. Previously it compared the raw bytes, which is not a numeric order.Map/Setkeyed byVec4will order differently, and keys differing only in the sign of zero now collapse.- Keys containing
NaNare no longer found by lookups, sinceOrdis no longer total for them. - Basically, don't use floats for keys.
- Keys containing
-
Fixed
absforIVec3andIVec4, which returned the vector unchanged. -
Fixed
Blocklayout forIVec3.Packed, whosealignment140andsizeOf140were swapped in 0.3.1.0 (now 16 and 12). -
Fixed
peekforVec4andMat4returning the wrong element under optimization.Data.Vector.Storableindexing runspeekwith a sharedrealWorld#token, which let GHC merge the buffer allocations of neighbouring reads, so every read in a strict context got the last element.peeknow loads on the caller's token and builds the value in a private buffer.Vec4peekandpokeare about twice as fast, since the 16-byte copies they replace were done bytewise.
-
Changed
Vec4andMat4storage from aligned pinned to regular unpinned byte arrays, like the newDVec4andDMat4.- SIMD kernels now use unaligned loads and stores.
- Code reaching into the exported constructors must not take
byteArrayContents#or pass the array tosafeforeign calls, since the GC may now move it.
0.3.1.0
- Fixed Block.sizeOf40 for Packed 3-vectors (was 16, now 12).
0.3.0.1
- Added Lift instances for data.
Opt-out by disabling the
th-liftflag. - Added Serialise instances for data.
Opt-out by disabling the
serialiseflag.
0.3.0.0
[0]releases without row/col-major, handedness, and counter/clockwise confusion.
This release brings sanity and consistency around the transform stack.
Transforms have proper col-major definitions.- Operation ordering follows the GLSL convention.
- The composition order is
(p <> v <> m <> ...)(from global to local). Reverse your transforms to adjust. - The application order is
m !* v(with the operators becoming infixr 5, just under the<>). It will doMᵀ * vinside for SIMD reasons and to match what GLSL does for itsM * vops.
- The composition order is
Geomancy.Vulkan.Projectionis right-handed, BUT produces reverse-depth range ([1; 0], In 3D infinite-Z converges to 0).- Replace your depth tests with
OP_GREATERand clear to0.0- get better precision for your migration troubles.
- Replace your depth tests with
Geomancy.Vulkan.Viewis right-handed, with +Z being forward.- The intended up vector is still
vec3 0 (-1) 0-- +Y down. Silly as it sounds, this matches the XY plane of the window with XY plane in front of a "first person" camera.
- The intended up vector is still
- Axis rotations (using
rotateQ) will appear clockwise when looking along the axis. - Angle rotations follow Tait-Bryan angles (heading/elevation/bank or yaw/pitch/roll) in the y-x-z frame.
rotateZ (time * rate)will follow the clock hands in 2D scenes and roll in 3D.rotateXwill follow the sun from sunrise to sunset, pitching UP / increasing elevation.rotateYwill turn you right, increasing yaw / heading eastwards.
- You're of course free to define your own transforms, just copy the modules and tune to your liking. Just make sure that you use matching row/column constructors and the math layer will do the rest, fast.
- Added
webcolor-labelsinstances for UVec3/Vec3/Vec4.
0.2.6.0
Geomancy.Gl.Blockextract togl-blockpackage asGraphics.Gl.Block.- Added
convertfunction to vector modules to facilitate type-changing operations like rounding. - Added
Ixinstances for integral vectors. - Added
dotfor integral vectors.
0.2.5.0
- Added Geomancy.Gl.Block to derive packed/std140/std430 layouts generically.
Originally a part of the unpublished
glowpackage in thecodexproject by Edward Kmett. Addptrdiff-0to your stack resolvers.
0.2.4.2
- Support ARM/aarch64 SIMD.
0.2.4.1
- Support simple-affine-space-0.2
0.2.4.0
A bunch of experimental code to see what sticks.
- Added
simple-affine-spaceinstances.- The classes are re-exported from
Geomancy, bringing stuff likedotandnormalize.
- The classes are re-exported from
- Added
mono-traversableinstances andGeomancy.Elementwisewrapper. - Added
Pointwrapper andPointNaliases. - Added
Geomancy.Interpolatewith generic linear, quadratic and cubic functions.- ⚠️
VecN.lerphas wrong (flipped) order of vector arguments. This is fixed inlinear.
- ⚠️
- Added
Geomancy.Swizzleoverloaded labels. - Added
Geomancy.Gl.Funswith kinda-GLSL math functions, appropriately overloaded.
0.2.3.0
- Vec4 moved to ByteArray#.
- Mat4 !* Vec4 is now SIMD too.
0.2.2.4
- Add Transform trees.
0.2.2.3
- Add IVec and UVec 32-bit integer vectors.
0.2.2.2
- Fixed using Transform.apply with projection inverses.
0.2.2.1
- Add Vec2.
- Add pattern synonyms to
Geomancyre-exports. - Add Fractional instances.
- Add conversions from tuples and lower-dimension vecs.
0.2.2.0
- Add pattern synonym alternatives to
withVecN. - Add Mat4 converstion from
Linear.M44.
- Hide
toListandtoListTrans.
- Add
toList2dand publish its element-order wrappers.
0.2.1.0
Transform rewrite
- Change perspective FoV to radians.
- Add
infinitePerspective. - Add
Transform.inverse.
- Hide
mat4,withMat4.
0.2.0.0
Mat4 rewrite
- Add
rowMajor,withRowMajor,toListRowMajor. - Add
colMajor,withColMajor,toListColMajor. - Add
Mat4.inverse.
- Expose
matrixProduct.
- Add
scalarMultiply. - Add
Mat4.(!*)to use withVec4.
- Extract transformations to
Geomancy.Transformand use column notation.
- Add
Transform.(!.)andapplyto use withVec3.
- Rename
scaletoscale3.
- Add uniform
scale. - Add
scaleXYfor flat meshes.
- Rename
mkTransformationtodirPos.
- Add
rotateQviadirPoswith empty translation. - Add
Vec3.Packednewtype without extra padding.
0.1.3.0
- Update tests
- Add
zipWith
- Rename
elementwisetopointwise - Rename
colMajortotoList - Rename
rowMajortotoListTrans
0.1.2.1
- Add Mat4 multiplication test via
linear - Add
elementwise,colMajor,rowMajor
0.1.2.0
- Move projections and views to Vulkan namespace.
0.1.1.2
- Fix bug in quaternion rotationBetween.
0.1.1.1
- Add lookAtUp and rotationBetween.