]> gerrit.simantics Code Review - simantics/3d.git/blob - org.simantics.g3d/scl/G3D/Math/Tuple3d.scl
Refactoring of SCL interfaces for g3d.
[simantics/3d.git] / org.simantics.g3d / scl / G3D / Math / Tuple3d.scl
1 import "JavaBuiltin" as Java
2
3 importJava "javax.vecmath.Tuple3d" where
4   // Immutable mapping
5   data Tuple3d
6   
7   @private
8   @JavaName getX
9   getX' :: Tuple3d -> Double
10   @private
11   @JavaName getY
12   getY' :: Tuple3d -> Double
13   @private
14   @JavaName getZ
15   getZ' :: Tuple3d -> Double
16   
17   // Mutable mapping
18   data MTuple3d
19   
20   @JavaName getX
21   getXM :: MTuple3d -> <Proc> Double
22   @JavaName getY
23   getYM :: MTuple3d -> <Proc> Double
24   @JavaName getZ
25   getZM :: MTuple3d -> <Proc> Double
26   
27   setX :: MTuple3d -> Double -> <Proc> ()
28   setY :: MTuple3d -> Double -> <Proc> ()
29   setZ :: MTuple3d -> Double -> <Proc> ()
30   
31   @JavaName add
32   addM :: MTuple3d -> Tuple3d -> <Proc> ()
33   @JavaName add
34   addM2 :: MTuple3d -> Tuple3d -> Tuple3d -> <Proc> ()
35   
36   @JavaName sub
37   subM :: MTuple3d -> Tuple3d -> <Proc> ()
38   @JavaName sub
39   subM2 :: MTuple3d -> Tuple3d -> Tuple3d -> <Proc> ()
40   
41   @JavaName negate
42   negateM :: MTuple3d -> <Proc> ()
43   @JavaName negate
44   negateM2 :: MTuple3d -> Tuple3d -> <Proc> ()
45   
46   @JavaName scale
47   scaleM :: MTuple3d -> Double -> <Proc> ()
48   @JavaName scale
49   scaleM2 :: MTuple3d -> Double -> Tuple3d -> <Proc> ()
50   
51   @private
52   clone :: Tuple3d -> <Proc> a
53
54 copyMTuple3d :: Tuple3d -> <Proc> MTuple3d
55 copyMTuple3d = Java.unsafeCoerce . clone
56
57 @private
58 applyMOp :: (MTuple3d -> <Proc> ()) -> Tuple3d -> Tuple3d
59 applyMOp f x = runProc let
60   z = copyMTuple3d x
61   f z
62   in freeze z 
63
64 freeze :: MTuple3d -> <Proc> Tuple3d
65 freeze = Java.unsafeCoerce
66
67 addTuple x y = applyMOp (flip addM y) x
68 subTuple x y = applyMOp (flip subM y) x
69 negateTuple = applyMOp negateM
70 scaleTuple x s = applyMOp (flip scaleM s) x
71
72 class Tuple3dClass a where
73   asTuple :: a -> Tuple3d
74   asTuple = Java.unsafeCoerce
75   
76   asMTuple :: a -> <Proc> MTuple3d
77   asMTuple x = copyMTuple3d (asTuple x)
78   
79   getX :: a -> Double
80   getX = getX' . asTuple
81   
82   getY :: a -> Double
83   getY = getY' . asTuple
84   
85   getZ :: a -> Double
86   getZ = getZ' . asTuple
87   
88   add :: a -> a -> a
89   add x y = Java.unsafeCoerce $ addTuple (asTuple x) (asTuple y)
90     
91   sub :: a -> a -> a
92   sub x y = Java.unsafeCoerce $ subTuple (asTuple x) (asTuple y)
93   
94   negate :: a -> a
95   negate x = Java.unsafeCoerce $ negateTuple (asTuple x)
96     
97   scale :: a -> Double -> a
98   scale x s = Java.unsafeCoerce $ scaleTuple (asTuple x) s
99
100 instance Tuple3dClass Tuple3d where
101   asTuple = id
102   getX = getX'
103   getY = getY'
104   getZ = getZ'
105   add = addTuple
106   sub = subTuple
107   negate = negateTuple
108   scale = scaleTuple