<> <> <> <<>> DIRECTORY Real USING [SqRt]; Vector3: CEDAR DEFINITIONS IMPORTS Real ~ BEGIN VEC: TYPE ~ RECORD[x, y, z: REAL]; Add: PROC[a, b: VEC] RETURNS[VEC]; InlineAdd: PROC[a, b: VEC] RETURNS[VEC] ~ INLINE { RETURN[[a.x+b.x, a.y+b.y, a.z+b.z]] }; <> Sub: PROC[a, b: VEC] RETURNS[VEC]; InlineSub: PROC[a, b: VEC] RETURNS[VEC] ~ INLINE { RETURN[[a.x-b.x, a.y-b.y, a.z-b.z]] }; <> Neg: PROC[a: VEC] RETURNS[VEC]; InlineNeg: PROC[a: VEC] RETURNS[VEC] ~ INLINE { RETURN[[-a.x, -a.y, -a.z]] }; <> Mul: PROC[a: VEC, s: REAL] RETURNS[VEC]; InlineMul: PROC[a: VEC, s: REAL] RETURNS[VEC] ~ INLINE { RETURN[[a.x*s, a.y*s, a.z*s]] }; <> Div: PROC[a: VEC, s: REAL] RETURNS[VEC]; InlineDiv: PROC[a: VEC, s: REAL] RETURNS[VEC] ~ INLINE { RETURN[[a.x/s, a.y/s, a.z/s]] }; <> SqrMag: PROC[a: VEC] RETURNS[REAL]; InlineSqrMag: PROC[a: VEC] RETURNS[REAL] ~ INLINE { RETURN[a.x*a.x+a.y*a.y+a.z*a.z] }; <> Mag: PROC[a: VEC] RETURNS[REAL]; InlineMag: PROC[a: VEC] RETURNS[REAL] ~ INLINE { RETURN[Real.SqRt[InlineSqrMag[a]]] }; <> <<>> Dot: PROC[a, b: VEC] RETURNS[REAL]; InlineDot: PROC[a, b: VEC] RETURNS[REAL] ~ INLINE { RETURN[a.x*b.x+a.y*b.y+a.z*b.z] }; <> Cross: PROC[a, b: VEC] RETURNS[VEC]; <> Unit: PROC[a: VEC] RETURNS[VEC]; InlineUnit: PROC[a: VEC] RETURNS[VEC] ~ INLINE { RETURN[InlineDiv[a, InlineMag[a]]] }; <> END.