12 public static readonly
GLTF.Math.Vector3 CoordinateSpaceConversionScale =
new GLTF.Math.Vector3(-1, 1, 1);
13 public static bool CoordinateSpaceConversionRequiresHandednessFlip
17 return CoordinateSpaceConversionScale.X * CoordinateSpaceConversionScale.Y * CoordinateSpaceConversionScale.Z < 0.0f;
21 public static readonly
GLTF.Math.Vector4 TangentSpaceConversionScale =
new GLTF.Math.Vector4(-1, 1, 1, -1);
35 Matrix4x4 unityMat = node.Matrix.ToUnityMatrix4x4Convert();
36 unityMat.GetTRSProperties(out position, out rotation, out scale);
40 position = node.Translation.ToUnityVector3Convert();
41 rotation = node.Rotation.ToUnityQuaternionConvert();
42 scale = node.Scale.ToUnityVector3Raw();
53 node.Translation = transform.localPosition.ToGltfVector3Convert();
54 node.Rotation = transform.localRotation.ToGltfQuaternionConvert();
55 node.Scale = transform.localScale.ToGltfVector3Raw();
66 public static void GetTRSProperties(
this Matrix4x4 mat, out Vector3 position, out Quaternion rotation,
69 position = mat.GetColumn(3);
71 Vector3 x = mat.GetColumn(0);
72 Vector3 y = mat.GetColumn(1);
73 Vector3 z = mat.GetColumn(2);
74 Vector3 calculatedZ = Vector3.Cross(x, y);
75 bool mirrored = Vector3.Dot(calculatedZ, z) < 0.0f;
77 scale =
new Vector3(x.magnitude * (mirrored ? -1.0f : 1.0f), y.magnitude, z.magnitude);
79 rotation = Quaternion.LookRotation(mat.GetColumn(2), mat.GetColumn(1));
89 public static void GetTRSProperties(
this GLTF.Math.Matrix4x4 gltfMat, out Vector3 position, out Quaternion rotation,
92 gltfMat.ToUnityMatrix4x4Convert().GetTRSProperties(out position, out rotation, out scale);
107 return new GLTF.Math.Vector4(mat.M11, mat.M21, mat.M31, mat.M41);
111 return new GLTF.Math.Vector4(mat.M12, mat.M22, mat.M32, mat.M42);
115 return new GLTF.Math.Vector4(mat.M13, mat.M23, mat.M33, mat.M43);
119 return new GLTF.Math.Vector4(mat.M14, mat.M24, mat.M34, mat.M44);
122 throw new System.Exception(
"column num is out of bounds");
134 Vector3 origAxis =
new Vector3(gltfQuat.X, gltfQuat.Y, gltfQuat.Z);
135 float axisFlipScale = CoordinateSpaceConversionRequiresHandednessFlip ? -1.0f : 1.0f;
136 Vector3 newAxis = axisFlipScale * Vector3.Scale(origAxis, CoordinateSpaceConversionScale.ToUnityVector3Raw());
139 return new Quaternion(newAxis.x, newAxis.y, newAxis.z, gltfQuat.W);
150 Vector3 origAxis =
new Vector3(unityQuat.x, unityQuat.y, unityQuat.z);
151 float axisFlipScale = CoordinateSpaceConversionRequiresHandednessFlip ? -1.0f : 1.0f;
152 Vector3 newAxis = axisFlipScale * Vector3.Scale(origAxis, CoordinateSpaceConversionScale.ToUnityVector3Raw());
155 return new GLTF.Math.Quaternion(newAxis.x, newAxis.y, newAxis.z, unityQuat.w);
165 Matrix4x4 rawUnityMat = gltfMat.ToUnityMatrix4x4Raw();
166 Vector3 coordinateSpaceConversionScale = CoordinateSpaceConversionScale.ToUnityVector3Raw();
167 Matrix4x4 convert = Matrix4x4.Scale(coordinateSpaceConversionScale);
168 Matrix4x4 unityMat = convert * rawUnityMat * convert;
179 Vector3 coordinateSpaceConversionScale = CoordinateSpaceConversionScale.ToUnityVector3Raw();
180 Matrix4x4 convert = Matrix4x4.Scale(coordinateSpaceConversionScale);
181 GLTF.Math.Matrix4x4 gltfMat = (convert * unityMat * convert).ToGltfMatrix4x4Raw();
192 Vector3 coordinateSpaceConversionScale = CoordinateSpaceConversionScale.ToUnityVector3Raw();
193 Vector3 unityVec3 = Vector3.Scale(gltfVec3.ToUnityVector3Raw(), coordinateSpaceConversionScale);
204 Vector3 coordinateSpaceConversionScale = CoordinateSpaceConversionScale.ToUnityVector3Raw();
205 GLTF.Math.Vector3 gltfVec3 = Vector3.Scale(unityVec3, coordinateSpaceConversionScale).ToGltfVector3Raw();
211 GLTF.Math.Vector3 gltfVec3 =
new GLTF.Math.Vector3(unityVec3.x, unityVec3.y, unityVec3.z);
217 GLTF.Math.Vector4 gltfVec4 =
new GLTF.Math.Vector4(unityVec4.x, unityVec4.y, unityVec4.z, unityVec4.w);
223 Vector4 rawUnityCol0 = gltfMat.GetColumn(0).ToUnityVector4Raw();
224 Vector4 rawUnityCol1 = gltfMat.GetColumn(1).ToUnityVector4Raw();
225 Vector4 rawUnityCol2 = gltfMat.GetColumn(2).ToUnityVector4Raw();
226 Vector4 rawUnityCol3 = gltfMat.GetColumn(3).ToUnityVector4Raw();
227 Matrix4x4 rawUnityMat =
new UnityEngine.Matrix4x4();
228 rawUnityMat.SetColumn(0, rawUnityCol0);
229 rawUnityMat.SetColumn(1, rawUnityCol1);
230 rawUnityMat.SetColumn(2, rawUnityCol2);
231 rawUnityMat.SetColumn(3, rawUnityCol3);
238 GLTF.Math.Vector4 c0 = unityMat.GetColumn(0).ToGltfVector4Raw();
239 GLTF.Math.Vector4 c1 = unityMat.GetColumn(1).ToGltfVector4Raw();
240 GLTF.Math.Vector4 c2 = unityMat.GetColumn(2).ToGltfVector4Raw();
241 GLTF.Math.Vector4 c3 = unityMat.GetColumn(3).ToGltfVector4Raw();
242 GLTF.Math.Matrix4x4 rawGltfMat =
new GLTF.Math.Matrix4x4(c0.X, c0.Y, c0.Z, c0.W, c1.X, c1.Y, c1.Z, c1.W, c2.X, c2.Y, c2.Z, c2.W, c3.X, c3.Y, c3.Z, c3.W);
248 return new Vector2(vec2.X, vec2.Y);
253 Vector2[] outVecArr =
new Vector2[inVecArr.Length];
254 for (
int i = 0; i < inVecArr.Length; ++i)
256 outVecArr[i] = inVecArr[i].ToUnityVector2Raw();
263 return new Vector3(vec3.X, vec3.Y, vec3.Z);
268 Vector3[] outVecArr =
new Vector3[inVecArr.Length];
269 for (
int i = 0; i < inVecArr.Length; ++i)
271 outVecArr[i] = inVecArr[i].ToUnityVector3Raw();
278 return new Vector4(vec4.X, vec4.Y, vec4.Z, vec4.W);
283 Vector4[] outVecArr =
new Vector4[inVecArr.Length];
284 for (
int i = 0; i < inVecArr.Length; ++i)
286 outVecArr[i] = inVecArr[i].ToUnityVector4Raw();
293 return new UnityEngine.Color(color.R, color.G, color.B, color.A);
298 return new GLTF.Math.Color(color.r, color.g, color.b, color.a);
304 for (
int i = 0; i < inColorArr.Length; ++i)
306 outColorArr[i] = inColorArr[i].ToUnityColorRaw();
313 int[] intArr =
new int[uintArr.Length];
314 for (
int i = 0; i < uintArr.Length; ++i)
316 uint uintVal = uintArr[i];
317 Debug.Assert(uintVal <=
int.MaxValue);
318 intArr[i] = (int)uintVal;
326 return new GLTF.Math.Quaternion(unityQuat.x, unityQuat.y, unityQuat.z, unityQuat.w);
331 return new Quaternion(quaternion.X, quaternion.Y, quaternion.Z, quaternion.W);
340 for (var i = 0; i < attributeAccessor.AccessorContent.AsVec2s.Length; i++)
342 attributeAccessor.AccessorContent.AsVec2s[i].Y = 1.0f - attributeAccessor.AccessorContent.AsVec2s[i].Y;
353 var returnArray =
new UnityEngine.Vector2[array.Length];
355 for (var i = 0; i < array.Length; i++)
357 returnArray[i].x = array[i].x;
358 returnArray[i].y = 1.0f - array[i].y;
371 for (
int i = 0; i < attributeAccessor.AccessorContent.AsVertices.Length; i++)
373 attributeAccessor.AccessorContent.AsVertices[i].X *= coordinateSpaceCoordinateScale.X;
374 attributeAccessor.AccessorContent.AsVertices[i].Y *= coordinateSpaceCoordinateScale.Y;
375 attributeAccessor.AccessorContent.AsVertices[i].Z *= coordinateSpaceCoordinateScale.Z;
387 var returnArray =
new UnityEngine.Vector3[array.Length];
389 for (
int i = 0; i < array.Length; i++)
391 returnArray[i].x = array[i].x * coordinateSpaceCoordinateScale.X;
392 returnArray[i].y = array[i].z * coordinateSpaceCoordinateScale.Y;
393 returnArray[i].z = array[i].y * coordinateSpaceCoordinateScale.Z;
406 for (
int i = 0; i < attributeAccessor.AccessorContent.AsVec4s.Length; i++)
408 attributeAccessor.AccessorContent.AsVec4s[i].X *= coordinateSpaceCoordinateScale.X;
409 attributeAccessor.AccessorContent.AsVec4s[i].Y *= coordinateSpaceCoordinateScale.Y;
410 attributeAccessor.AccessorContent.AsVec4s[i].Z *= coordinateSpaceCoordinateScale.Z;
411 attributeAccessor.AccessorContent.AsVec4s[i].W *= coordinateSpaceCoordinateScale.W;
423 var returnArray =
new Vector4[array.Length];
425 for (var i = 0; i < array.Length; i++)
427 returnArray[i].x *= coordinateSpaceCoordinateScale.X;
428 returnArray[i].y *= coordinateSpaceCoordinateScale.Y;
429 returnArray[i].z *= coordinateSpaceCoordinateScale.Z;
430 returnArray[i].w *= coordinateSpaceCoordinateScale.W;
440 public static void FlipFaces(ref AttributeAccessor attributeAccessor)
442 for (
int i = 0; i < attributeAccessor.AccessorContent.AsTriangles.Length; i += 3)
444 uint temp = attributeAccessor.AccessorContent.AsUInts[i];
445 attributeAccessor.AccessorContent.AsUInts[i] = attributeAccessor.AccessorContent.AsUInts[i + 2];
446 attributeAccessor.AccessorContent.AsUInts[i + 2] = temp;
457 int[] returnArr =
new int[triangles.Length];
458 for (
int i = 0; i < triangles.Length; i += 3)
460 int temp = triangles[i];
461 returnArr[i] = triangles[i + 2];
462 returnArr[i + 1] = triangles[i + 1];
463 returnArr[i + 2] = temp;
static Vector2 ToUnityVector2Raw(this GLTF.Math.Vector2 vec2)
static GLTF.Math.Color ToNumericsColorRaw(this UnityEngine.Color color)
static void ConvertVector3CoordinateSpace(ref AttributeAccessor attributeAccessor, GLTF.Math.Vector3 coordinateSpaceCoordinateScale)
Converts vector3 to specified coordinate space
static GLTF.Math.Quaternion ToGltfQuaternionConvert(this Quaternion unityQuat)
Convert unity quaternion to a gltf quaternion
static int [] ToIntArrayRaw(this uint[] uintArr)
static Quaternion ToUnityQuaternionConvert(this GLTF.Math.Quaternion gltfQuat)
Convert gltf quaternion to a unity quaternion
static Vector4 [] ToUnityVector4Raw(this GLTF.Math.Vector4[] inVecArr)
static Matrix4x4 ToUnityMatrix4x4Convert(this GLTF.Math.Matrix4x4 gltfMat)
Convert gltf matrix to a unity matrix
static Vector2 [] ToUnityVector2Raw(this GLTF.Math.Vector2[] inVecArr)
static UnityEngine.Color ToUnityColorRaw(this GLTF.Math.Color color)
static void GetTRSProperties(this Matrix4x4 mat, out Vector3 position, out Quaternion rotation, out Vector3 scale)
Get unity translation, rotation, and scale from a unity matrix
static Vector3 ToUnityVector3Convert(this GLTF.Math.Vector3 gltfVec3)
Convert gltf Vector3 to unity Vector3
static Quaternion ToUnityQuaternionRaw(this GLTF.Math.Quaternion quaternion)
static void SetUnityTransform(this Node node, Transform transform)
Set a gltf node's converted translation, rotation, and scale from a unity transform ...
static Vector4 [] ConvertVector4CoordinateSpaceAndCopy(Vector4[] array, GLTF.Math.Vector4 coordinateSpaceCoordinateScale)
Coverts and copies based on the specified coordinate scale
static GLTF.Math.Vector3 ToGltfVector3Raw(this Vector3 unityVec3)
static Vector4 ToUnityVector4Raw(this GLTF.Math.Vector4 vec4)
static void ConvertVector4CoordinateSpace(ref AttributeAccessor attributeAccessor, GLTF.Math.Vector4 coordinateSpaceCoordinateScale)
Converts vector4 to specified coordinate space
static GLTF.Math.Vector4 ToGltfVector4Raw(this Vector4 unityVec4)
static Vector3 ToUnityVector3Raw(this GLTF.Math.Vector3 vec3)
static void GetUnityTRSProperties(this Node node, out Vector3 position, out Quaternion rotation, out Vector3 scale)
Get the converted unity translation, rotation, and scale from a gltf node
static UnityEngine.Color [] ToUnityColorRaw(this GLTF.Math.Color[] inColorArr)
static GLTF.Math.Matrix4x4 ToGltfMatrix4x4Raw(this Matrix4x4 unityMat)
static UnityEngine.Vector2 [] FlipTexCoordArrayVAndCopy(UnityEngine.Vector2[] array)
Flip the V component of the UV (1-V)
static GLTF.Math.Vector4 GetColumn(this GLTF.Math.Matrix4x4 mat, uint columnNum)
Get a gltf column vector from a gltf matrix
static GLTF.Math.Vector3 ToGltfVector3Convert(this Vector3 unityVec3)
Convert unity Vector3 to gltf Vector3
static int [] FlipFacesAndCopy(int[] triangles)
Rewinds the indices from glTF space to Unity space
static void FlipFaces(ref AttributeAccessor attributeAccessor)
Rewinds the indices into Unity coordinate space from glTF space
static GLTF.Math.Quaternion ToGltfQuaternionRaw(this Quaternion unityQuat)
static GLTF.Math.Matrix4x4 ToGltfMatrix4x4Convert(this Matrix4x4 unityMat)
Convert gltf matrix to a unity matrix
static UnityEngine.Vector3 [] ConvertVector3CoordinateSpaceAndCopy(Vector3[] array, GLTF.Math.Vector3 coordinateSpaceCoordinateScale)
Coverts and copies based on the specified coordinate scale
static Vector3 [] ToUnityVector3Raw(this GLTF.Math.Vector3[] inVecArr)
static Matrix4x4 ToUnityMatrix4x4Raw(this GLTF.Math.Matrix4x4 gltfMat)
static void FlipTexCoordArrayV(ref AttributeAccessor attributeAccessor)
Flips the V component of the UV (1-V) to put from glTF into Unity space
static void GetTRSProperties(this GLTF.Math.Matrix4x4 gltfMat, out Vector3 position, out Quaternion rotation, out Vector3 scale)
Get converted unity translation, rotation, and scale from a gltf matrix