]> gerrit.simantics Code Review - simantics/3d.git/blobdiff - org.simantics.g3d/scl/G3D/Math/Vector3d.scl
Refactoring of SCL interfaces for g3d.
[simantics/3d.git] / org.simantics.g3d / scl / G3D / Math / Vector3d.scl
diff --git a/org.simantics.g3d/scl/G3D/Math/Vector3d.scl b/org.simantics.g3d/scl/G3D/Math/Vector3d.scl
new file mode 100644 (file)
index 0000000..cab2353
--- /dev/null
@@ -0,0 +1,75 @@
+import "./Tuple3d"
+
+import "JavaBuiltin" as Java
+
+importJava "javax.vecmath.Vector3d" where
+  // Immutable mapping
+  data Vector3d
+  
+  dot :: Vector3d -> Vector3d -> Double
+  
+  length :: Vector3d -> Double
+  lengthSquared :: Vector3d -> Double
+  
+  angle :: Vector3d -> Vector3d -> Double
+  
+  @JavaName "<init>"
+  createVector3d :: Double -> Double -> Double -> Vector3d
+  @JavaName "<init>"
+  copyVector3d' :: Tuple3d -> Vector3d
+  @JavaName "<init>"
+  defaultVector3d :: Vector3d
+
+  // Mutable mapping
+  data MVector3d
+  
+  @JavaName cross
+  crossM :: MVector3d -> Vector3d -> Vector3d -> <Proc> ()
+
+  @JavaName normalize
+  normalizeM :: MVector3d -> <Proc> ()
+  
+  @JavaName normalize
+  normalizeM2 :: MVector3d -> Vector3d -> <Proc> ()
+  
+  @JavaName dot
+  dotM :: MVector3d -> MVector3d -> <Proc> Double
+  
+  @JavaName length
+  lengthM :: MVector3d -> <Proc> Double
+  @JavaName lengthSquared
+  lengthSquaredM :: MVector3d -> <Proc> Double
+
+  @JavaName angle  
+  angleM :: MVector3d -> MVector3d -> <Proc> Double
+  
+  @JavaName "<init>"
+  createMVector3d :: Double -> Double -> Double -> <Proc> MVector3d
+  @JavaName "<init>"
+  copyMVector3d' :: Tuple3d -> <Proc> MVector3d
+  @JavaName "<init>"
+  defaultMVector3d :: <Proc> MVector3d
+
+@private
+applyMOp :: (MVector3d -> <Proc> ()) -> (<Proc> MVector3d) -> Vector3d
+applyMOp op gen = runProc let
+    z = gen
+    op z
+    in freeze z
+
+normalize :: Vector3d -> Vector3d
+normalize v = applyMOp normalizeM (copyMVector3d (asTuple v))
+
+cross :: Vector3d -> Vector3d -> Vector3d
+cross x y = applyMOp (\z -> crossM z x y) defaultMVector3d
+
+freeze :: MVector3d -> <Proc> Vector3d
+freeze = Java.unsafeCoerce
+
+instance Tuple3dClass Vector3d
+
+copyVector3d :: Tuple3dClass a => a -> Vector3d
+copyVector3d = copyVector3d' . asTuple
+
+copyMVector3d :: Tuple3dClass a => a -> <Proc> MVector3d
+copyMVector3d = copyMVector3d' . asTuple