private static double ConvertToRadians(JObject transformMap, string key) { var value = default(double); var inRadians = true; var mapValue = transformMap.GetValue(key); if (mapValue.Type == JTokenType.String) { var stringValue = mapValue.Value <string>(); if (stringValue.EndsWith("rad")) { stringValue = stringValue.Substring(0, stringValue.Length - 3); } else if (stringValue.EndsWith("deg")) { inRadians = false; stringValue = stringValue.Substring(0, stringValue.Length - 3); } value = double.Parse(stringValue); } else { value = mapValue.Value <double>(); } return(inRadians ? value : MatrixMathHelper.DegreesToRadians(value)); }
private static void setTransformProperty(TView view, JArray transforms) { TransformHelper.processTransform(transforms, sTransformDecompositionArray); MatrixMathHelper.decomposeMatrix(sTransformDecompositionArray, ref sMatrixDecompositionContext); //Log.Info(ReactConstants.Tag, $"setTransformProperty view[{view.GetTag()}] \n" + // $"\t\tTranslationX={sMatrixDecompositionContext.translation[0]} TranslationY={sMatrixDecompositionContext.translation[1]} \n" + // $"\t\trotationX={sMatrixDecompositionContext.rotationDegrees[0]} rotationY={sMatrixDecompositionContext.rotationDegrees[1]} rotationZ={sMatrixDecompositionContext.rotationDegrees[2]} \n" + // $"\t\tScaleX={sMatrixDecompositionContext.scale[0]} ScaleY={sMatrixDecompositionContext.scale[1]}"); view.SetMatrix(sMatrixDecompositionContext, false); }
public static Matrix3D ProcessTransform(JArray transforms) { var result = Matrix3D.Identity; var firstToken = transforms.First; if (firstToken.Type != JTokenType.Object) { ApplyMatrix(ref result, transforms); return(result); } foreach (var transform in transforms) { var helperMatrix = Matrix3D.Identity; var transformMap = (JObject)transform; var transformType = transformMap.Properties().SingleOrDefault().Name; switch (transformType) { case "matrix": ApplyMatrix(ref helperMatrix, (JArray)transformMap.GetValue(transformType)); break; case "perspective": MatrixMathHelper.ApplyPerspective(ref helperMatrix, transformMap.Value <double>(transformType)); break; case "rotateX": MatrixMathHelper.ApplyRotateX( ref helperMatrix, ConvertToRadians(transformMap, transformType)); break; case "rotateY": MatrixMathHelper.ApplyRotateY( ref helperMatrix, ConvertToRadians(transformMap, transformType)); break; case "rotate": case "rotateZ": MatrixMathHelper.ApplyRotateZ( ref helperMatrix, ConvertToRadians(transformMap, transformType)); break; case "scale": var scale = transformMap.Value <double>(transformType); MatrixMathHelper.ApplyScaleX(ref helperMatrix, scale); MatrixMathHelper.ApplyScaleY(ref helperMatrix, scale); break; case "scaleX": MatrixMathHelper.ApplyScaleX(ref helperMatrix, transformMap.Value <double>(transformType)); break; case "scaleY": MatrixMathHelper.ApplyScaleY(ref helperMatrix, transformMap.Value <double>(transformType)); break; case "translate": var value = (JArray)transformMap.GetValue(transformType); var x = value.Value <double>(0); var y = value.Value <double>(1); var z = value.Count > 2 ? value.Value <double>(2) : 0.0; MatrixMathHelper.ApplyTranslate3D(ref helperMatrix, x, y, z); break; case "translateX": MatrixMathHelper.ApplyTranslate2D(ref helperMatrix, transformMap.Value <double>(transformType), 0.0); break; case "translateY": MatrixMathHelper.ApplyTranslate2D(ref helperMatrix, 0.0, transformMap.Value <double>(transformType)); break; case "skewX": MatrixMathHelper.ApplySkewX( ref helperMatrix, ConvertToRadians(transformMap, transformType)); break; case "skewY": MatrixMathHelper.ApplySkewY( ref helperMatrix, ConvertToRadians(transformMap, transformType)); break; default: throw new InvalidOperationException( Invariant($"Unsupported transform type: '{transformType}'")); } MatrixMathHelper.MultiplyInto(ref result, helperMatrix); } return(result); }
public static void processTransform(JArray transforms, double[] result) { double[] helperMatrix = sHelperMatrix.Value; MatrixMathHelper.resetIdentityMatrix(ref result); var firstToken = transforms.First; if (firstToken.Type != JTokenType.Object) { for (int i = 0; i < 16; i++) { helperMatrix[i] = transforms.Value <double>(i); } MatrixMathHelper.multiplyInto(ref result, result, helperMatrix); return; } foreach (var transform in transforms) { var transformMap = (JObject)transform; var transformType = transformMap.Properties().SingleOrDefault().Name; MatrixMathHelper.resetIdentityMatrix(ref helperMatrix); switch (transformType) { case "matrix": JArray matrix = (JArray)transformMap.GetValue(transformType); for (int i = 0; i < 16; i++) { helperMatrix[i] = matrix.Value <double>(i); } break; case "perspective": MatrixMathHelper.applyPerspective(ref helperMatrix, transformMap.Value <double>(transformType)); break; case "rotateX": MatrixMathHelper.applyRotateX( ref helperMatrix, convertToRadians(transformMap, transformType)); break; case "rotateY": MatrixMathHelper.applyRotateY( ref helperMatrix, convertToRadians(transformMap, transformType)); break; case "rotate": case "rotateZ": MatrixMathHelper.applyRotateZ( ref helperMatrix, convertToRadians(transformMap, transformType)); break; case "scale": var scale = transformMap.Value <double>(transformType); MatrixMathHelper.applyScaleX(ref helperMatrix, scale); MatrixMathHelper.applyScaleY(ref helperMatrix, scale); break; case "scaleX": MatrixMathHelper.applyScaleX(ref helperMatrix, transformMap.Value <double>(transformType)); break; case "scaleY": MatrixMathHelper.applyScaleY(ref helperMatrix, transformMap.Value <double>(transformType)); break; case "translate": var value = (JArray)transformMap.GetValue(transformType); var x = value.Value <double>(0); var y = value.Value <double>(1); var z = value.Count > 2 ? value.Value <double>(2) : 0.0; MatrixMathHelper.applyTranslate3D(ref helperMatrix, x, y, z); break; case "translateX": MatrixMathHelper.applyTranslate2D(ref helperMatrix, transformMap.Value <double>(transformType), 0.0); break; case "translateY": MatrixMathHelper.applyTranslate2D(ref helperMatrix, 0.0, transformMap.Value <double>(transformType)); break; case "skewX": MatrixMathHelper.applySkewX( ref helperMatrix, convertToRadians(transformMap, transformType)); break; case "skewY": MatrixMathHelper.applySkewY( ref helperMatrix, convertToRadians(transformMap, transformType)); break; default: throw new InvalidOperationException( Invariant($"Unsupported transform type: '{transformType}'")); } MatrixMathHelper.multiplyInto(ref result, result, helperMatrix); } }