X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.g3d%2Fscl%2FG3D%2FMath%2FTuple3d.scl;fp=org.simantics.g3d%2Fscl%2FG3D%2FMath%2FTuple3d.scl;h=f7779405c2613994860108d35dbacfa349c97936;hb=0f296670cc492cef317342832d3e131fd6d76aba;hp=0000000000000000000000000000000000000000;hpb=333af611947bc5cf7f7212b2fa36d6b7f3b37899;p=simantics%2F3d.git diff --git a/org.simantics.g3d/scl/G3D/Math/Tuple3d.scl b/org.simantics.g3d/scl/G3D/Math/Tuple3d.scl new file mode 100644 index 00000000..f7779405 --- /dev/null +++ b/org.simantics.g3d/scl/G3D/Math/Tuple3d.scl @@ -0,0 +1,108 @@ +import "JavaBuiltin" as Java + +importJava "javax.vecmath.Tuple3d" where + // Immutable mapping + data Tuple3d + + @private + @JavaName getX + getX' :: Tuple3d -> Double + @private + @JavaName getY + getY' :: Tuple3d -> Double + @private + @JavaName getZ + getZ' :: Tuple3d -> Double + + // Mutable mapping + data MTuple3d + + @JavaName getX + getXM :: MTuple3d -> Double + @JavaName getY + getYM :: MTuple3d -> Double + @JavaName getZ + getZM :: MTuple3d -> Double + + setX :: MTuple3d -> Double -> () + setY :: MTuple3d -> Double -> () + setZ :: MTuple3d -> Double -> () + + @JavaName add + addM :: MTuple3d -> Tuple3d -> () + @JavaName add + addM2 :: MTuple3d -> Tuple3d -> Tuple3d -> () + + @JavaName sub + subM :: MTuple3d -> Tuple3d -> () + @JavaName sub + subM2 :: MTuple3d -> Tuple3d -> Tuple3d -> () + + @JavaName negate + negateM :: MTuple3d -> () + @JavaName negate + negateM2 :: MTuple3d -> Tuple3d -> () + + @JavaName scale + scaleM :: MTuple3d -> Double -> () + @JavaName scale + scaleM2 :: MTuple3d -> Double -> Tuple3d -> () + + @private + clone :: Tuple3d -> a + +copyMTuple3d :: Tuple3d -> MTuple3d +copyMTuple3d = Java.unsafeCoerce . clone + +@private +applyMOp :: (MTuple3d -> ()) -> Tuple3d -> Tuple3d +applyMOp f x = runProc let + z = copyMTuple3d x + f z + in freeze z + +freeze :: MTuple3d -> Tuple3d +freeze = Java.unsafeCoerce + +addTuple x y = applyMOp (flip addM y) x +subTuple x y = applyMOp (flip subM y) x +negateTuple = applyMOp negateM +scaleTuple x s = applyMOp (flip scaleM s) x + +class Tuple3dClass a where + asTuple :: a -> Tuple3d + asTuple = Java.unsafeCoerce + + asMTuple :: a -> MTuple3d + asMTuple x = copyMTuple3d (asTuple x) + + getX :: a -> Double + getX = getX' . asTuple + + getY :: a -> Double + getY = getY' . asTuple + + getZ :: a -> Double + getZ = getZ' . asTuple + + add :: a -> a -> a + add x y = Java.unsafeCoerce $ addTuple (asTuple x) (asTuple y) + + sub :: a -> a -> a + sub x y = Java.unsafeCoerce $ subTuple (asTuple x) (asTuple y) + + negate :: a -> a + negate x = Java.unsafeCoerce $ negateTuple (asTuple x) + + scale :: a -> Double -> a + scale x s = Java.unsafeCoerce $ scaleTuple (asTuple x) s + +instance Tuple3dClass Tuple3d where + asTuple = id + getX = getX' + getY = getY' + getZ = getZ' + add = addTuple + sub = subTuple + negate = negateTuple + scale = scaleTuple