{- ORMOLU_DISABLE -}
-- Copyright 2014 2015 2016, Julia Longtin (julial@turinglace.com)
-- Copyright 2015 2016, Mike MacHenry (mike.machenry@gmail.com)
-- Implicit CAD. Copyright (C) 2011, Christopher Olah (chris@colah.ca)
-- Released under the GNU AGPLV3+, see LICENSE

module Graphics.Implicit.ObjectUtil.GetImplicit3 (getImplicit3) where

import Prelude (id, (||), (/=), either, round, fromInteger, Either(Left, Right), abs, (-), (/), (*), sqrt, (+), atan2, max, cos, minimum, ($), sin, pi, (.), Bool(True, False), ceiling, floor, pure, (==), otherwise)

import Graphics.Implicit.Definitions
    ( objectRounding, ObjectContext, , SymbolicObj3(Cube, Sphere, Cylinder, Rotate3, Transform3, Extrude, ExtrudeM, ExtrudeOnEdgeOf, RotateExtrude, Shared3), Obj3, ℝ2, , fromℕtoℝ, toScaleFn )

import Graphics.Implicit.MathUtil ( rmax, rmaximum )

import qualified Data.Either as Either (either)

-- Use getImplicit for handling extrusion of 2D shapes to 3D.
import Graphics.Implicit.ObjectUtil.GetImplicitShared (getImplicitShared)
import Linear (V2(V2), V3(V3))
import qualified Linear

import {-# SOURCE #-} Graphics.Implicit.Primitives (getImplicit)

default ()

-- Get a function that describes the surface of the object.
getImplicit3 :: ObjectContext -> SymbolicObj3 -> Obj3
-- Primitives
getImplicit3 :: ObjectContext -> SymbolicObj3 -> Obj3
getImplicit3 ObjectContext
ctx (Cube (V3 dx dy dz)) =
    \(V3 x y z) -> ℝ -> [ℝ] -> ℝ
rmaximum (ObjectContext -> ℝ
objectRounding ObjectContext
ctx) [ℝ -> ℝ
forall a. Num a => a -> a
abs (xℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
-dxℝ -> ℝ -> ℝ
forall a. Fractional a => a -> a -> a
/2) ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
- dxℝ -> ℝ -> ℝ
forall a. Fractional a => a -> a -> a
/2, ℝ -> ℝ
forall a. Num a => a -> a
abs (yℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
-dyℝ -> ℝ -> ℝ
forall a. Fractional a => a -> a -> a
/2) ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
- dyℝ -> ℝ -> ℝ
forall a. Fractional a => a -> a -> a
/2, ℝ -> ℝ
forall a. Num a => a -> a
abs (zℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
-dzℝ -> ℝ -> ℝ
forall a. Fractional a => a -> a -> a
/2) ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
- dzℝ -> ℝ -> ℝ
forall a. Fractional a => a -> a -> a
/2]
getImplicit3 ObjectContext
_ (Sphere r) =
    \(V3 x y z) -> ℝ -> ℝ
forall a. Floating a => a -> a
sqrt (xℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
*x ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
+ yℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
*y ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
+ zℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
*z) ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
- r
getImplicit3 ObjectContext
_ (Cylinder h r1 r2) = \(V3 x y z) ->
    let
        d :: ℝ
d = ℝ -> ℝ
forall a. Floating a => a -> a
sqrt (xℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
*x ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
+ yℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
*y) ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
- ((r2ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
-r1)ℝ -> ℝ -> ℝ
forall a. Fractional a => a -> a -> a
/hℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
*zℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
+r1)
        θ :: ℝ
θ = ℝ -> ℝ -> ℝ
forall a. RealFloat a => a -> a -> a
atan2 (r2ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
-r1) h
    in
        ℝ -> ℝ -> ℝ
forall a. Ord a => a -> a -> a
max (d ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
* ℝ -> ℝ
forall a. Floating a => a -> a
cos θ) (ℝ -> ℝ
forall a. Num a => a -> a
abs (zℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
-hℝ -> ℝ -> ℝ
forall a. Fractional a => a -> a -> a
/2) ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
- (hℝ -> ℝ -> ℝ
forall a. Fractional a => a -> a -> a
/2))
-- Simple transforms
getImplicit3 ObjectContext
ctx (Rotate3 Quaternion ℝ
q SymbolicObj3
symbObj) =
    ObjectContext -> SymbolicObj3 -> Obj3
getImplicit3 ObjectContext
ctx SymbolicObj3
symbObj Obj3 -> (V3 ℝ -> V3 ℝ) -> Obj3
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Quaternion ℝ -> V3 ℝ -> V3 ℝ
forall a.
(Conjugate a, RealFloat a) =>
Quaternion a -> V3 a -> V3 a
Linear.rotate (Quaternion ℝ -> Quaternion ℝ
forall a. Conjugate a => a -> a
Linear.conjugate Quaternion ℝ
q)
getImplicit3 ObjectContext
ctx (Transform3 M44 ℝ
m SymbolicObj3
symbObj) =
    ObjectContext -> SymbolicObj3 -> Obj3
getImplicit3 ObjectContext
ctx SymbolicObj3
symbObj Obj3 -> (V3 ℝ -> V3 ℝ) -> Obj3
forall b c a. (b -> c) -> (a -> b) -> a -> c
. V4 ℝ -> V3 ℝ
forall a. Fractional a => V4 a -> V3 a
Linear.normalizePoint (V4 ℝ -> V3 ℝ) -> (V3 ℝ -> V4 ℝ) -> V3 ℝ -> V3 ℝ
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((M44 ℝ -> M44 ℝ
forall a. Fractional a => M44 a -> M44 a
Linear.inv44 M44 ℝ
m) M44 ℝ -> V4 ℝ -> V4 ℝ
forall (m :: * -> *) (r :: * -> *) a.
(Functor m, Foldable r, Additive r, Num a) =>
m (r a) -> r a -> m a
Linear.!*) (V4 ℝ -> V4 ℝ) -> (V3 ℝ -> V4 ℝ) -> V3 ℝ -> V4 ℝ
forall b c a. (b -> c) -> (a -> b) -> a -> c
. V3 ℝ -> V4 ℝ
forall a. Num a => V3 a -> V4 a
Linear.point
-- 2D Based
getImplicit3 ObjectContext
ctx (Extrude SymbolicObj2
symbObj h) =
    let
        obj :: V2 ℝ -> ℝ
obj = SymbolicObj2 -> V2 ℝ -> ℝ
forall obj (f :: * -> *) a. Object obj f a => obj -> f a -> a
getImplicit SymbolicObj2
symbObj
    in
        \(V3 x y z) -> ℝ -> ℝ -> ℝ -> ℝ
rmax (ObjectContext -> ℝ
objectRounding ObjectContext
ctx) (V2 ℝ -> ℝ
obj (ℝ -> ℝ -> V2 ℝ
forall a. a -> a -> V2 a
V2 x y)) (ℝ -> ℝ
forall a. Num a => a -> a
abs (z ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
- hℝ -> ℝ -> ℝ
forall a. Fractional a => a -> a -> a
/2) ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
- hℝ -> ℝ -> ℝ
forall a. Fractional a => a -> a -> a
/2)
getImplicit3 ObjectContext
ctx (ExtrudeM Either ℝ (ℝ -> ℝ)
twist ExtrudeMScale
scale Either (V2 ℝ) (ℝ -> V2 ℝ)
translate SymbolicObj2
symbObj Either ℝ (V2 ℝ -> ℝ)
height) =
    let
        r :: ℝ
r = ObjectContext -> ℝ
objectRounding ObjectContext
ctx
        obj :: V2 ℝ -> ℝ
obj = SymbolicObj2 -> V2 ℝ -> ℝ
forall obj (f :: * -> *) a. Object obj f a => obj -> f a -> a
getImplicit SymbolicObj2
symbObj
        height' :: V2 ℝ -> ℝ
height' (V2 x y) = case Either ℝ (V2 ℝ -> ℝ)
height of
            Left n -> n
            Right V2 ℝ -> ℝ
f -> V2 ℝ -> ℝ
f (ℝ -> ℝ -> V2 ℝ
forall a. a -> a -> V2 a
V2 x y)
        -- FIXME: twist functions should have access to height, if height is allowed to vary.
        twistVal :: Either  ( -> ) ->  ->  -> 
        twistVal :: Either ℝ (ℝ -> ℝ) -> ℝ -> ℝ -> ℝ
twistVal Either ℝ (ℝ -> ℝ)
twist' z h =
          case Either ℝ (ℝ -> ℝ)
twist' of
                   Left twval  -> if twval ℝ -> ℝ -> Bool
forall a. Eq a => a -> a -> Bool
== 0
                                  then 0
                                  else twval ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
* (z ℝ -> ℝ -> ℝ
forall a. Fractional a => a -> a -> a
/ h)
                   Right ℝ -> ℝ
twfun -> ℝ -> ℝ
twfun z
        translatePos :: Either ℝ2 ( -> ℝ2) ->  -> ℝ2 -> ℝ2
        translatePos :: Either (V2 ℝ) (ℝ -> V2 ℝ) -> ℝ -> V2 ℝ -> V2 ℝ
translatePos Either (V2 ℝ) (ℝ -> V2 ℝ)
trans z (V2 x y) = ℝ -> ℝ -> V2 ℝ
forall a. a -> a -> V2 a
V2 (x ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
- xTrans) (y ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
- yTrans)
          where
            (V2 xTrans yTrans) = case Either (V2 ℝ) (ℝ -> V2 ℝ)
trans of
                                 Left  V2 ℝ
tval -> V2 ℝ
tval
                                 Right ℝ -> V2 ℝ
tfun -> ℝ -> V2 ℝ
tfun z
        scaleVec ::  -> ℝ2 -> ℝ2
        scaleVec :: ℝ -> V2 ℝ -> V2 ℝ
scaleVec z (V2 x y) = let (V2 sx sy) = ExtrudeMScale -> ℝ -> V2 ℝ
toScaleFn ExtrudeMScale
scale z
                               in ℝ -> ℝ -> V2 ℝ
forall a. a -> a -> V2 a
V2 (x ℝ -> ℝ -> ℝ
forall a. Fractional a => a -> a -> a
/ sx) (y ℝ -> ℝ -> ℝ
forall a. Fractional a => a -> a -> a
/ sy)
        rotateVec ::  -> ℝ2 -> ℝ2
        rotateVec :: ℝ -> V2 ℝ -> V2 ℝ
rotateVec θ (V2 x y)
          | θ ℝ -> ℝ -> Bool
forall a. Eq a => a -> a -> Bool
== 0    = ℝ -> ℝ -> V2 ℝ
forall a. a -> a -> V2 a
V2 x y
          | Bool
otherwise = ℝ -> ℝ -> V2 ℝ
forall a. a -> a -> V2 a
V2 (xℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
*ℝ -> ℝ
forall a. Floating a => a -> a
cos θ ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
+ yℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
*ℝ -> ℝ
forall a. Floating a => a -> a
sin θ) (yℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
*ℝ -> ℝ
forall a. Floating a => a -> a
cos θ ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
- xℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
*ℝ -> ℝ
forall a. Floating a => a -> a
sin θ)
        k :: 
        k :: ℝ
k = ℝ
forall a. Floating a => a
piℝ -> ℝ -> ℝ
forall a. Fractional a => a -> a -> a
/180
    in
        \(V3 x y z) ->
          let
            h :: ℝ
h = V2 ℝ -> ℝ
height' (V2 ℝ -> ℝ) -> V2 ℝ -> ℝ
forall a b. (a -> b) -> a -> b
$ ℝ -> ℝ -> V2 ℝ
forall a. a -> a -> V2 a
V2 x y
            res :: ℝ
res = ℝ -> ℝ -> ℝ -> ℝ
rmax r
                (V2 ℝ -> ℝ
obj
                 (V2 ℝ -> ℝ) -> (V2 ℝ -> V2 ℝ) -> V2 ℝ -> ℝ
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ℝ -> V2 ℝ -> V2 ℝ
rotateVec (-kℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
*Either ℝ (ℝ -> ℝ) -> ℝ -> ℝ -> ℝ
twistVal Either ℝ (ℝ -> ℝ)
twist z h)
                 (V2 ℝ -> V2 ℝ) -> (V2 ℝ -> V2 ℝ) -> V2 ℝ -> V2 ℝ
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ℝ -> V2 ℝ -> V2 ℝ
scaleVec z
                 (V2 ℝ -> V2 ℝ) -> (V2 ℝ -> V2 ℝ) -> V2 ℝ -> V2 ℝ
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Either (V2 ℝ) (ℝ -> V2 ℝ) -> ℝ -> V2 ℝ -> V2 ℝ
translatePos Either (V2 ℝ) (ℝ -> V2 ℝ)
translate z
                 (V2 ℝ -> ℝ) -> V2 ℝ -> ℝ
forall a b. (a -> b) -> a -> b
$ ℝ -> ℝ -> V2 ℝ
forall a. a -> a -> V2 a
V2 x y )
                (ℝ -> ℝ
forall a. Num a => a -> a
abs (z ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
- hℝ -> ℝ -> ℝ
forall a. Fractional a => a -> a -> a
/2) ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
- hℝ -> ℝ -> ℝ
forall a. Fractional a => a -> a -> a
/2)
          in
            res
getImplicit3 ObjectContext
_ (ExtrudeOnEdgeOf SymbolicObj2
symbObj1 SymbolicObj2
symbObj2) =
    let
        obj1 :: V2 ℝ -> ℝ
obj1 = SymbolicObj2 -> V2 ℝ -> ℝ
forall obj (f :: * -> *) a. Object obj f a => obj -> f a -> a
getImplicit SymbolicObj2
symbObj1
        obj2 :: V2 ℝ -> ℝ
obj2 = SymbolicObj2 -> V2 ℝ -> ℝ
forall obj (f :: * -> *) a. Object obj f a => obj -> f a -> a
getImplicit SymbolicObj2
symbObj2
    in
        \(V3 x y z) -> V2 ℝ -> ℝ
obj1 (V2 ℝ -> ℝ) -> V2 ℝ -> ℝ
forall a b. (a -> b) -> a -> b
$ ℝ -> ℝ -> V2 ℝ
forall a. a -> a -> V2 a
V2 (V2 ℝ -> ℝ
obj2 (ℝ -> ℝ -> V2 ℝ
forall a. a -> a -> V2 a
V2 x y)) z
getImplicit3 ObjectContext
ctx (RotateExtrude totalRotation Either (V2 ℝ) (ℝ -> V2 ℝ)
translate Either ℝ (ℝ -> ℝ)
rotate SymbolicObj2
symbObj) =
    let
        tau :: 
        tau :: ℝ
tau = 2 ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
* ℝ
forall a. Floating a => a
pi
        obj :: V2 ℝ -> ℝ
obj = SymbolicObj2 -> V2 ℝ -> ℝ
forall obj (f :: * -> *) a. Object obj f a => obj -> f a -> a
getImplicit SymbolicObj2
symbObj

        is360m ::  -> Bool
        is360m :: ℝ -> Bool
is360m n = tau ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
* Integer -> ℝ
forall a. Num a => Integer -> a
fromInteger (ℝ -> Integer
forall a b. (RealFrac a, Integral b) => a -> b
round (ℝ -> Integer) -> ℝ -> Integer
forall a b. (a -> b) -> a -> b
$ n ℝ -> ℝ -> ℝ
forall a. Fractional a => a -> a -> a
/ tau) ℝ -> ℝ -> Bool
forall a. Eq a => a -> a -> Bool
/= n
        capped :: Bool
capped
             = ℝ -> Bool
is360m totalRotation
            Bool -> Bool -> Bool
|| (V2 ℝ -> Bool)
-> ((ℝ -> V2 ℝ) -> Bool) -> Either (V2 ℝ) (ℝ -> V2 ℝ) -> Bool
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either ( V2 ℝ -> V2 ℝ -> Bool
forall a. Eq a => a -> a -> Bool
/= ℝ -> V2 ℝ
forall (f :: * -> *) a. Applicative f => a -> f a
pure 0) (\ℝ -> V2 ℝ
f -> ℝ -> V2 ℝ
f 0 V2 ℝ -> V2 ℝ -> Bool
forall a. Eq a => a -> a -> Bool
/= ℝ -> V2 ℝ
f totalRotation) Either (V2 ℝ) (ℝ -> V2 ℝ)
translate
            Bool -> Bool -> Bool
|| (ℝ -> Bool) -> ((ℝ -> ℝ) -> Bool) -> Either ℝ (ℝ -> ℝ) -> Bool
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either ℝ -> Bool
is360m (\ℝ -> ℝ
f -> ℝ -> Bool
is360m (ℝ -> ℝ
f 0 ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
- ℝ -> ℝ
f totalRotation)) Either ℝ (ℝ -> ℝ)
rotate
        round' :: ℝ
round' = ObjectContext -> ℝ
objectRounding ObjectContext
ctx
        translate' ::  -> ℝ2
        translate' :: ℝ -> V2 ℝ
translate' = (V2 ℝ -> ℝ -> V2 ℝ)
-> ((ℝ -> V2 ℝ) -> ℝ -> V2 ℝ)
-> Either (V2 ℝ) (ℝ -> V2 ℝ)
-> ℝ
-> V2 ℝ
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
Either.either
                (\(V2 a b) θ -> ℝ -> ℝ -> V2 ℝ
forall a. a -> a -> V2 a
V2 (aℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
*θℝ -> ℝ -> ℝ
forall a. Fractional a => a -> a -> a
/totalRotation) (bℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
*θℝ -> ℝ -> ℝ
forall a. Fractional a => a -> a -> a
/totalRotation))
                (ℝ -> V2 ℝ) -> ℝ -> V2 ℝ
forall a. a -> a
id
                Either (V2 ℝ) (ℝ -> V2 ℝ)
translate
        rotate' ::  -> 
        rotate' :: ℝ -> ℝ
rotate' = (ℝ -> ℝ -> ℝ)
-> ((ℝ -> ℝ) -> ℝ -> ℝ) -> Either ℝ (ℝ -> ℝ) -> ℝ -> ℝ
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
Either.either
                (\t θ -> tℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
*θℝ -> ℝ -> ℝ
forall a. Fractional a => a -> a -> a
/totalRotation )
                (ℝ -> ℝ) -> ℝ -> ℝ
forall a. a -> a
id
                Either ℝ (ℝ -> ℝ)
rotate
        twists :: Bool
twists = case Either ℝ (ℝ -> ℝ)
rotate of
                   Left 0  -> Bool
True
                   Either ℝ (ℝ -> ℝ)
_       -> Bool
False
    in
        \(V3 x y z) -> [ℝ] -> ℝ
forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
minimum ([ℝ] -> ℝ) -> [ℝ] -> ℝ
forall a b. (a -> b) -> a -> b
$ do
            let
                r :: ℝ
r = ℝ -> ℝ
forall a. Floating a => a -> a
sqrt (ℝ -> ℝ) -> ℝ -> ℝ
forall a b. (a -> b) -> a -> b
$ xℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
*x ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
+ yℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
*y
                θ :: ℝ
θ = ℝ -> ℝ -> ℝ
forall a. RealFloat a => a -> a -> a
atan2 y x
                ns :: []
                ns :: [ℕ]
ns =
                    if Bool
capped
                    then -- we will cap a different way, but want leeway to keep the function cont
                        [-1 .. ℝ -> ℕ
forall a b. (RealFrac a, Integral b) => a -> b
ceiling (ℝ -> ℕ) -> ℝ -> ℕ
forall a b. (a -> b) -> a -> b
$ (totalRotation ℝ -> ℝ -> ℝ
forall a. Fractional a => a -> a -> a
/ tau) ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
+ 1]
                    else
                        [0 .. ℝ -> ℕ
forall a b. (RealFrac a, Integral b) => a -> b
floor (ℝ -> ℕ) -> ℝ -> ℕ
forall a b. (a -> b) -> a -> b
$ (totalRotation ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
- θ) ℝ -> ℝ -> ℝ
forall a. Fractional a => a -> a -> a
/ tau]
            n <- [ℕ]
ns
            let
                θvirt :: ℝ
θvirt = ℕ -> ℝ
fromℕtoℝ n ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
* tau ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
+ θ
                (V2 rshift zshift) = ℝ -> V2 ℝ
translate' θvirt
                twist :: ℝ
twist = ℝ -> ℝ
rotate' θvirt
                rz_pos :: V2 ℝ
rz_pos = if Bool
twists
                        then let
                            (c,s) = (ℝ -> ℝ
forall a. Floating a => a -> a
cos twist, ℝ -> ℝ
forall a. Floating a => a -> a
sin twist)
                            (r',z') = (rℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
-rshift, zℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
-zshift)
                        in
                            ℝ -> ℝ -> V2 ℝ
forall a. a -> a -> V2 a
V2 (cℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
*r' ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
- sℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
*z') (cℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
*z' ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
+ sℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
*r')
                        else ℝ -> ℝ -> V2 ℝ
forall a. a -> a -> V2 a
V2 (r ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
- rshift) (z ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
- zshift)
            ℝ -> [ℝ]
forall (f :: * -> *) a. Applicative f => a -> f a
pure (ℝ -> [ℝ]) -> ℝ -> [ℝ]
forall a b. (a -> b) -> a -> b
$
              if Bool
capped
              then ℝ -> ℝ -> ℝ -> ℝ
rmax round'
                    (ℝ -> ℝ
forall a. Num a => a -> a
abs (θvirt ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
- (totalRotation ℝ -> ℝ -> ℝ
forall a. Fractional a => a -> a -> a
/ 2)) ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
- (totalRotation ℝ -> ℝ -> ℝ
forall a. Fractional a => a -> a -> a
/ 2))
                    (V2 ℝ -> ℝ
obj V2 ℝ
rz_pos)
              else V2 ℝ -> ℝ
obj V2 ℝ
rz_pos
getImplicit3 ObjectContext
ctx (Shared3 SharedObj SymbolicObj3 V3 ℝ
obj) = ObjectContext -> SharedObj SymbolicObj3 V3 ℝ -> Obj3
forall obj (f :: * -> *).
(Object obj f ℝ, VectorStuff (f ℝ), ComponentWiseMultable (f ℝ),
 Metric f) =>
ObjectContext -> SharedObj obj f ℝ -> f ℝ -> ℝ
getImplicitShared ObjectContext
ctx SharedObj SymbolicObj3 V3 ℝ
obj