diff --git a/runtime/bindings-generator.cs b/runtime/bindings-generator.cs index 3562604c85..1c140a6dee 100644 --- a/runtime/bindings-generator.cs +++ b/runtime/bindings-generator.cs @@ -1389,6 +1389,101 @@ namespace Xamarin.BindingMethods.Generator } ); + // Required for ModelIO + data.Add ( + new FunctionData { + Comment = " // IntPtr func (Vector3, Vector2i, bool, IntPtr, IntPtr)", + Prefix = "simd__", + Variants = Variants.NonStret, + ReturnType = Types.IntPtr, + Parameters = new ParameterData[] { + new ParameterData { TypeData = Types.Vector3 }, + new ParameterData { TypeData = Types.Vector2i }, + new ParameterData { TypeData = Types.Bool }, + new ParameterData { TypeData = Types.IntPtr }, + new ParameterData { TypeData = Types.IntPtr }, + }, + } + ); + + data.Add ( + new FunctionData { + Comment = " // IntPtr func (Matrix4, bool);", + Prefix = "simd__", + Variants = Variants.NonStret, + ReturnType = Types.IntPtr, + Parameters = new ParameterData[] { + new ParameterData { TypeData = Types.Matrix4f }, + new ParameterData { TypeData = Types.Bool }, + }, + } + ); + + data.Add ( + new FunctionData { + Comment = " // IntPtr func (Vector3, Vector2i, bool, nint, IntPtr)", + Prefix = "simd__", + Variants = Variants.NonStret, + ReturnType = Types.IntPtr, + Parameters = new ParameterData[] { + new ParameterData { TypeData = Types.Vector3 }, + new ParameterData { TypeData = Types.Vector2i }, + new ParameterData { TypeData = Types.Bool }, + new ParameterData { TypeData = Types.NInt }, + new ParameterData { TypeData = Types.IntPtr }, + }, + } + ); + + data.Add ( + new FunctionData { + Comment = " // IntPtr func (IntPtr, nint, UInt32, IntPtr)", + Prefix = "simd__", + Variants = Variants.NonStret, + ReturnType = Types.IntPtr, + Parameters = new ParameterData[] { + new ParameterData { TypeData = Types.IntPtr }, + new ParameterData { TypeData = Types.NInt }, + new ParameterData { TypeData = Types.UInt32 }, + new ParameterData { TypeData = Types.IntPtr }, + }, + } + ); + + data.Add ( + new FunctionData { + Comment = " // IntPtr func (Vector3, Vector2i, bool, bool, nint, IntPtr)", + Prefix = "simd__", + Variants = Variants.NonStret, + ReturnType = Types.IntPtr, + Parameters = new ParameterData[] { + new ParameterData { TypeData = Types.Vector3 }, + new ParameterData { TypeData = Types.Vector2i }, + new ParameterData { TypeData = Types.Bool }, + new ParameterData { TypeData = Types.Bool }, + new ParameterData { TypeData = Types.NInt }, + new ParameterData { TypeData = Types.IntPtr }, + }, + } + ); + + data.Add ( + new FunctionData { + Comment = " // IntPtr func (Vector3, Vector2i, int, bool, nint, IntPtr)", + Prefix = "simd__", + Variants = Variants.NonStret, + ReturnType = Types.IntPtr, + Parameters = new ParameterData[] { + new ParameterData { TypeData = Types.Vector3 }, + new ParameterData { TypeData = Types.Vector2i }, + new ParameterData { TypeData = Types.Int32 }, + new ParameterData { TypeData = Types.Bool }, + new ParameterData { TypeData = Types.NInt }, + new ParameterData { TypeData = Types.IntPtr }, + }, + } + ); + // We must expand functions with native types to their actual type as well. for (int i = data.Count - 1; i >= 0; i--) { if (!data [i].HasNativeType) diff --git a/src/ModelIO/MDLMesh.cs b/src/ModelIO/MDLMesh.cs index 4d7d3d2c83..9fe3eb2b0f 100644 --- a/src/ModelIO/MDLMesh.cs +++ b/src/ModelIO/MDLMesh.cs @@ -14,6 +14,7 @@ using XamCore.Foundation; using XamCore.CoreFoundation; using XamCore.CoreGraphics; using XamCore.ObjCRuntime; +using Vector2i = global::OpenTK.Vector2i; using Vector2 = global::OpenTK.Vector2; using Vector3 = global::OpenTK.Vector3; using Vector4 = global::OpenTK.Vector4; @@ -26,6 +27,53 @@ using MathHelper = global::OpenTK.MathHelper; namespace XamCore.ModelIO { partial class MDLMesh { + internal MDLMesh (Vector3 extent, Vector2i segments, bool inwardNormals, MDLGeometryType geometryType, IMDLMeshBufferAllocator allocator, int? hemisphereSegments, bool? cap, bool? isCone) + { + if (hemisphereSegments.HasValue) { + // initCapsule + InitializeHandle (InitCapsule (extent, segments, hemisphereSegments.Value, inwardNormals, geometryType, allocator), "initCapsuleWithExtent:cylinderSegments:hemisphereSegments:inwardNormals:geometryType:allocator:"); + } else if (cap.HasValue && isCone.HasValue) { + // initHemisphere || initCone + if (isCone.Value) + InitializeHandle (InitCone (extent, segments, inwardNormals, cap.Value, geometryType, allocator), "initConeWithExtent:segments:inwardNormals:cap:geometryType:allocator:"); + else + InitializeHandle (InitHemisphere (extent, segments, inwardNormals, cap.Value, geometryType, allocator), "initHemisphereWithExtent:segments:inwardNormals:cap:geometryType:allocator:"); + } else { + // initSphere + InitializeHandle (InitSphere (extent, segments, inwardNormals, geometryType, allocator), "initSphereWithExtent:segments:inwardNormals:geometryType:allocator:"); + } + } + + internal MDLMesh (MDLMesh mesh, int submeshIndex, uint subdivisionLevels, IMDLMeshBufferAllocator allocator) + { + InitializeHandle (InitMesh (mesh, submeshIndex, subdivisionLevels, allocator), "initMeshBySubdividingMesh:submeshIndex:subdivisionLevels:allocator:"); + } + + public static MDLMesh CreateSphere (Vector3 dimensions, Vector2i segments, MDLGeometryType geometryType, bool inwardNormals, IMDLMeshBufferAllocator allocator) + { + return new MDLMesh (dimensions, segments, inwardNormals, geometryType, allocator, null, null, null); + } + + public static MDLMesh CreateHemisphere (Vector3 dimensions, Vector2i segments, MDLGeometryType geometryType, bool inwardNormals, bool cap, IMDLMeshBufferAllocator allocator) + { + return new MDLMesh (dimensions, segments, inwardNormals, geometryType, allocator, null, cap, false); + } + + public static MDLMesh CreateCapsule (Vector3 dimensions, Vector2i segments, MDLGeometryType geometryType, bool inwardNormals, int hemisphereSegments, IMDLMeshBufferAllocator allocator) + { + return new MDLMesh (dimensions, segments, inwardNormals, geometryType, allocator, hemisphereSegments, null, null); + } + + public static MDLMesh CreateCone (Vector3 dimensions, Vector2i segments, MDLGeometryType geometryType, bool inwardNormals, bool cap, IMDLMeshBufferAllocator allocator) + { + return new MDLMesh (dimensions, segments, inwardNormals, geometryType, allocator, null, cap, true); + } + + public static MDLMesh CreateSubdividedMesh (MDLMesh mesh, int submeshIndex, uint subdivisionLevels, IMDLMeshBufferAllocator allocator) + { + return new MDLMesh (mesh, submeshIndex, subdivisionLevels, allocator); + } + public MDLVertexAttributeData AnisotropyVertexData { get { return GetVertexAttributeDataForAttribute (MDLVertexAttributes.Anisotropy); diff --git a/src/ModelIO/MIEnums.cs b/src/ModelIO/MIEnums.cs index 698415b1af..3f1bec9372 100644 --- a/src/ModelIO/MIEnums.cs +++ b/src/ModelIO/MIEnums.cs @@ -259,5 +259,27 @@ namespace XamCore.ModelIO { } public Vector4 MinimumExtent, MaximumExtent; } + + [Native] + public enum MDLCameraProjection : nuint + { + Perspective = 0, + Orthographic = 1, + } + + [Native] + public enum MDLMaterialFace : nuint + { + Front = 0, + Back, + DoubleSided, + } + + [Native] + public enum MDLProbePlacement : nint + { + UniformGrid = 0, + IrradianceDistribution, + } } #endif diff --git a/src/mobilecoreservices.cs b/src/mobilecoreservices.cs index fd56443fc7..0bc5ff96e5 100644 --- a/src/mobilecoreservices.cs +++ b/src/mobilecoreservices.cs @@ -574,6 +574,11 @@ namespace XamCore.MobileCoreServices { [Field ("kUTTypeStereolithography", "ModelIO")] NSString Stereolithography { get; } + [NoWatch] + [iOS (10,0)][Mac(10,12, onlyOn64 : true)] + [Field ("kUTTypeUniversalSceneDescription", "ModelIO")] + NSString UniversalSceneDescription { get; } + [Watch (2,2)] [iOS (9,1)][TV (9,0)] [NoMac] diff --git a/src/modelio.cs b/src/modelio.cs index 9240a8096a..5dfb19b0ea 100644 --- a/src/modelio.cs +++ b/src/modelio.cs @@ -67,6 +67,11 @@ namespace XamCore.ModelIO { [Export ("initWithURL:vertexDescriptor:bufferAllocator:")] IntPtr Constructor (NSUrl url, [NullAllowed] MDLVertexDescriptor vertexDescriptor, [NullAllowed] IMDLMeshBufferAllocator bufferAllocator); + // Added in iOS 10 SDK but it is supposed to be present in iOS 9. + [NoMac] + [Export ("initWithBufferAllocator:")] + IntPtr Constructor ([NullAllowed] IMDLMeshBufferAllocator bufferAllocator); + [Export ("initWithURL:vertexDescriptor:bufferAllocator:preserveTopology:error:")] IntPtr Constructor (NSUrl url, [NullAllowed] MDLVertexDescriptor vertexDescriptor, [NullAllowed] IMDLMeshBufferAllocator bufferAllocator, bool preserveTopology, out NSError error); @@ -82,6 +87,11 @@ namespace XamCore.ModelIO { [Export ("canExportFileExtension:")] bool CanExportFileExtension (string extension); + // Added in iOS 10 SDK but it is supposed to be present in iOS 9. + [Mac (10,12)] + [Export ("childObjectsOfClass:")] + MDLObject[] GetChildObjects (Class objectClass); + [Export ("boundingBoxAtTime:")] [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] MDLAxisAlignedBoundingBox GetBoundingBox (double atTime); @@ -134,6 +144,24 @@ namespace XamCore.ModelIO { MDLAsset FromScene (SCNScene scene, [NullAllowed] IMDLMeshBufferAllocator bufferAllocator); } + // Added in iOS 10 SDK but it is supposed to be present in iOS 9. + [Mac (10,12)] + [Protocol, Model] + [BaseType (typeof(NSObject))] + interface MDLLightProbeIrradianceDataSource + { + [Abstract] + [Export ("boundingBox", ArgumentSemantic.Assign)] + MDLAxisAlignedBoundingBox BoundingBox { get; set; } + + [Export ("sphericalHarmonicsLevel")] + nuint SphericalHarmonicsLevel { get; set; } + + [Export ("sphericalHarmonicsCoefficientsAtPosition:")] + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] + NSData GetSphericalHarmonicsCoefficients (Vector3 position); + } + [iOS (9,0), Mac(10,11, onlyOn64 : true)] [BaseType (typeof(MDLObject))] interface MDLCamera @@ -143,6 +171,11 @@ namespace XamCore.ModelIO { [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] get; } + // Added in iOS 10 SDK but it is supposed to be present in iOS 9. + [Mac (10,12)] + [Export ("projection", ArgumentSemantic.Assign)] + MDLCameraProjection Projection { get; set; } + [Export ("frameBoundingBox:setNearAndFar:")] [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] void FrameBoundingBox (MDLAxisAlignedBoundingBox boundingBox, bool setNearAndFar); @@ -387,6 +420,11 @@ namespace XamCore.ModelIO { [Export ("count")] nuint Count { get; } + // Added in iOS 10 SDK but it is supposed to be present in iOS 9. + [Mac (10,12)] + [Export ("materialFace", ArgumentSemantic.Assign)] + MDLMaterialFace MaterialFace { get; set; } + [iOS (9,0), Mac(10,11)] [Static] [Export ("materialWithSCNMaterial:")] @@ -396,10 +434,7 @@ namespace XamCore.ModelIO { [iOS (9,0)][Mac (10,11, onlyOn64 : true)] [BaseType (typeof(NSObject))] [DisableDefaultCtor] - // TODO: NSCopying defined but copyWithZone doesn't work - // filled radar://26939747 with Apple - // https://trello.com/c/6aIzLH4a - interface MDLMaterialProperty : MDLNamed + interface MDLMaterialProperty : MDLNamed, NSCopying { [DesignatedInitializer] [Export ("initWithName:semantic:")] @@ -484,12 +519,73 @@ namespace XamCore.ModelIO { [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] get; [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] set; } + + // Added in iOS 10 SDK but it is supposed to be present in iOS 9. + [Mac (10,12)] + [Export ("luminance")] + float Luminance { get; set; } + } + + [iOS (10,0), Mac (10,12)] + [BaseType (typeof(NSObject))] + [DisableDefaultCtor] + interface MDLMaterialPropertyConnection : MDLNamed + { + [Export ("initWithOutput:input:")] + IntPtr Constructor (MDLMaterialProperty output, MDLMaterialProperty input); + + [NullAllowed, Export ("output", ArgumentSemantic.Weak)] + MDLMaterialProperty Output { get; } + + [NullAllowed, Export ("input", ArgumentSemantic.Weak)] + MDLMaterialProperty Input { get; } + } + + [iOS (10,0), Mac (10,12)] + [BaseType (typeof(NSObject))] + [DisableDefaultCtor] + interface MDLMaterialPropertyNode : MDLNamed + { + [Export ("initWithInputs:outputs:evaluationFunction:")] + IntPtr Constructor (MDLMaterialProperty[] inputs, MDLMaterialProperty[] outputs, Action function); + + [Export ("evaluationFunction", ArgumentSemantic.Copy)] + Action EvaluationFunction { get; set; } + + [Export ("inputs")] + MDLMaterialProperty[] Inputs { get; } + + [Export ("outputs")] + MDLMaterialProperty[] Outputs { get; } + } + + [iOS (10,0), Mac (10,12)] + [BaseType (typeof(MDLMaterialPropertyNode))] + [DisableDefaultCtor] + interface MDLMaterialPropertyGraph + { + [Export ("initWithNodes:connections:")] + IntPtr Constructor (MDLMaterialPropertyNode[] nodes, MDLMaterialPropertyConnection[] connections); + + [Export ("evaluate")] + void Evaluate (); + + [Export ("nodes")] + MDLMaterialPropertyNode[] Nodes { get; } + + [Export ("connections")] + MDLMaterialPropertyConnection[] Connections { get; } } [iOS (9,0), Mac(10,11, onlyOn64 : true)] [BaseType (typeof(MDLObject))] interface MDLMesh { + // Added in iOS 10 SDK but it is supposed to be present in iOS 9. + [Mac (10,12)] + [Export ("initWithBufferAllocator:")] + IntPtr Constructor ([NullAllowed] IMDLMeshBufferAllocator bufferAllocator); + [Export ("initWithVertexBuffer:vertexCount:descriptor:submeshes:")] IntPtr Constructor (IMDLMeshBuffer vertexBuffer, nuint vertexCount, MDLVertexDescriptor descriptor, MDLSubmesh [] submeshes); @@ -501,6 +597,12 @@ namespace XamCore.ModelIO { [return: NullAllowed] MDLVertexAttributeData GetVertexAttributeDataForAttribute (string attributeName); + // Added in iOS 10 SDK but it is supposed to be present in iOS 9. + [Mac (10,12)] + [Export ("vertexAttributeDataForAttributeNamed:asFormat:")] + [return: NullAllowed] + MDLVertexAttributeData GetVertexAttributeData (string attributeName, MDLVertexFormat format); + [Export ("boundingBox")] MDLAxisAlignedBoundingBox BoundingBox { [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] get; @@ -510,18 +612,45 @@ namespace XamCore.ModelIO { MDLVertexDescriptor VertexDescriptor { get; set; } [Export ("vertexCount")] - nuint VertexCount { get; } + nuint VertexCount { + get; + // Added in iOS 10 SDK but it is supposed to be present in iOS 9. + [Mac (10,12)] + set; + } [Export ("vertexBuffers", ArgumentSemantic.Retain)] IMDLMeshBuffer[] VertexBuffers { get; } - [Export ("submeshes", ArgumentSemantic.Retain)] - NSMutableArray Submeshes { get; } + [NullAllowed] + [Export ("submeshes", ArgumentSemantic.Copy)] + NSMutableArray Submeshes { + get; + // Added in iOS 10 SDK but it is supposed to be present in iOS 9. + [Mac (10,12)] + set; + } + + // Added in iOS 10 SDK but it is supposed to be present in iOS 9. + [Mac (10,12)] + [Export ("allocator", ArgumentSemantic.Retain)] + IMDLMeshBufferAllocator Allocator { get; } + + // MDLMesh_Modifiers (category) - // These are categories on MDLMesh, so I am inlining them here [Export ("addAttributeWithName:format:")] void AddAttribute (string name, MDLVertexFormat format); + // Added in iOS 10 SDK but it is supposed to be present in iOS 9. + [Mac (10,12)] + [Export ("addAttributeWithName:format:type:data:stride:")] + void AddAttribute (string name, MDLVertexFormat format, string type, NSData data, nint stride); + + // Added in iOS 10 SDK but it is supposed to be present in iOS 9. + [Mac (10,12)] + [Export ("addAttributeWithName:format:type:data:stride:time:")] + void AddAttribute (string name, MDLVertexFormat format, string type, NSData data, nint stride, double time); + [Export ("addNormalsWithAttributeNamed:creaseThreshold:")] void AddNormals ([NullAllowed] string name, float creaseThreshold); @@ -531,9 +660,56 @@ namespace XamCore.ModelIO { [Export ("addTangentBasisForTextureCoordinateAttributeNamed:normalAttributeNamed:tangentAttributeNamed:")] void AddTangentBasisWithNormals (string textureCoordinateAttributeName, string normalAttributeName, string tangentAttributeName); + // Added in iOS 10 SDK but it is supposed to be present in iOS 9. + [Mac (10,12)] + [Export ("addUnwrappedTextureCoordinatesForAttributeNamed:")] + void AddUnwrappedTextureCoordinates (string textureCoordinateAttributeName); + [Export ("makeVerticesUnique")] void MakeVerticesUnique (); + // Added in iOS 10 SDK but it is supposed to be present in iOS 9. + [Mac (10,12)] + [Export ("replaceAttributeNamed:withData:")] + void ReplaceAttribute (string name, MDLVertexAttributeData newData); + + // Added in iOS 10 SDK but it is supposed to be present in iOS 9. + [Mac (10,12)] + [Export ("updateAttributeNamed:withData:")] + void UpdateAttribute (string name, MDLVertexAttributeData newData); + + // Added in iOS 10 SDK but it is supposed to be present in iOS 9. + [Mac (10,12)] + [Export ("removeAttributeNamed:")] + void RemoveAttribute (string name); + + // MDLMesh_Generators (category) + + [Internal] + [Export ("initSphereWithExtent:segments:inwardNormals:geometryType:allocator:")] + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] + IntPtr InitSphere (Vector3 extent, Vector2i segments, bool inwardNormals, MDLGeometryType geometryType, [NullAllowed] IMDLMeshBufferAllocator allocator); + + [Internal] + [Export ("initHemisphereWithExtent:segments:inwardNormals:cap:geometryType:allocator:")] + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] + IntPtr InitHemisphere (Vector3 extent, Vector2i segments, bool inwardNormals, bool cap, MDLGeometryType geometryType, [NullAllowed] IMDLMeshBufferAllocator allocator); + + [Internal] + [Export ("initCapsuleWithExtent:cylinderSegments:hemisphereSegments:inwardNormals:geometryType:allocator:")] + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] + IntPtr InitCapsule (Vector3 extent, Vector2i segments, int hemisphereSegments, bool inwardNormals, MDLGeometryType geometryType, [NullAllowed] IMDLMeshBufferAllocator allocator); + + [Internal] + [Export ("initConeWithExtent:segments:inwardNormals:cap:geometryType:allocator:")] + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] + IntPtr InitCone (Vector3 extent, Vector2i segments, bool inwardNormals, bool cap, MDLGeometryType geometryType, [NullAllowed] IMDLMeshBufferAllocator allocator); + + [Internal] + [Export ("initMeshBySubdividingMesh:submeshIndex:subdivisionLevels:allocator:")] + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] + IntPtr InitMesh (MDLMesh mesh, int submeshIndex, uint subdivisionLevels, [NullAllowed] IMDLMeshBufferAllocator allocator); + [Static] [Export ("newBoxWithDimensions:segments:geometryType:inwardNormals:allocator:")] [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] @@ -758,6 +934,11 @@ namespace XamCore.ModelIO { [NullAllowed, Export ("parent", ArgumentSemantic.Weak)] MDLObject Parent { get; set; } + // Added in iOS 10 SDK but it is supposed to be present in iOS 9. + [Mac (10,12)] + [Export ("path")] + string Path { get; } + [NullAllowed, Export ("transform", ArgumentSemantic.Retain)] IMDLTransformComponent Transform { get; set; } @@ -1050,6 +1231,11 @@ namespace XamCore.ModelIO { [Export ("indexBuffer", ArgumentSemantic.Retain)] IMDLMeshBuffer IndexBuffer { get; } + // Added in iOS 10 SDK but it is supposed to be present in iOS 9. + [Mac (10,12)] + [Export ("indexBufferAsIndexType:")] + IMDLMeshBuffer GetIndexBuffer (MDLIndexBitDepth indexType); + [Export ("indexCount")] nuint IndexCount { get; } @@ -1152,6 +1338,11 @@ namespace XamCore.ModelIO { [Export ("isCube")] bool IsCube { get; set; } + + // Added in iOS 10 SDK but it is supposed to be present in iOS 9. + [Mac (10,12)] + [Export ("hasAlphaValues")] + bool HasAlphaValues { get; set; } } [iOS (9,0)][Mac (10,11, onlyOn64 : true)] @@ -1197,10 +1388,21 @@ namespace XamCore.ModelIO { [Export ("initWithTransformComponent:")] IntPtr Constructor (IMDLTransformComponent component); + // Added in iOS 10 SDK but it is supposed to be present in iOS 9. + [Mac (10,12)] + [Export ("initWithTransformComponent:resetsTransform:")] + IntPtr Constructor (IMDLTransformComponent component, bool resetsTransform); + [Export ("initWithMatrix:")] [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] IntPtr Constructor (Matrix4 matrix); + // Added in iOS 10 SDK but it is supposed to be present in iOS 9. + [Mac (10,12)] + [Export ("initWithMatrix:resetsTransform:")] + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] + IntPtr Constructor (Matrix4 matrix, bool resetsTransform); + [Export ("setIdentity")] void SetIdentity (); @@ -1285,6 +1487,14 @@ namespace XamCore.ModelIO { [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] set; } + // Added in iOS 10 SDK but it is supposed to be present in iOS 9. + [Mac (10,12)] +#if XAMCORE_4_0 + [Abstract] +#endif + [Export ("resetsTransform")] + bool ResetsTransform { get; set; } + [Abstract] [Export ("minimumTime")] double MinimumTime { get; } @@ -1293,6 +1503,14 @@ namespace XamCore.ModelIO { [Export ("maximumTime")] double MaximumTime { get; } + // Added in iOS 10 SDK but it is supposed to be present in iOS 9. + [Mac (10,12)] +#if XAMCORE_4_0 + [Abstract] +#endif + [Export ("keyTimes", ArgumentSemantic.Copy)] + NSNumber[] KeyTimes { get; } + [Export ("setLocalTransform:forTime:")] [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] void SetLocalTransform (Matrix4 transform, double time); @@ -1421,6 +1639,11 @@ namespace XamCore.ModelIO { [Export ("addOrReplaceAttribute:")] void AddOrReplaceAttribute (MDLVertexAttribute attribute); + // Added in iOS 10 SDK but it is supposed to be present in iOS 9. + [Mac (10,12)] + [Export ("removeAttributeNamed:")] + void RemoveAttribute (string name); + [Export ("attributes", ArgumentSemantic.Retain)] NSMutableArray Attributes { get; set; } @@ -1438,17 +1661,32 @@ namespace XamCore.ModelIO { } [iOS (9,0),Mac(10,11, onlyOn64 : true)] - [BaseType (typeof(NSObject))] + [BaseType ( +#if MONOMAC + typeof(NSObject) +#else + typeof(MDLObject) +#endif + )] [DisableDefaultCtor] interface MDLVoxelArray { + [Deprecated (PlatformName.MacOSX, 10, 12, message: "Use new MDLVoxelArray (MDLAsset, int, float)")] + [Obsoleted (PlatformName.iOS, 10, 0, message: "Use new MDLVoxelArray (MDLAsset, int, float)")] [Export ("initWithAsset:divisions:interiorShells:exteriorShells:patchRadius:")] IntPtr Constructor (MDLAsset asset, int divisions, int interiorShells, int exteriorShells, float patchRadius); + [Deprecated (PlatformName.MacOSX, 10, 12, message: "Use new MDLVoxelArray (MDLAsset, int, float)")] + [Obsoleted (PlatformName.iOS, 10, 0, message: "Use new MDLVoxelArray (MDLAsset, int, float)")] [Export ("initWithAsset:divisions:interiorNBWidth:exteriorNBWidth:patchRadius:")] IntPtr Constructor (MDLAsset asset, int divisions, float interiorNBWidth, float exteriorNBWidth, float patchRadius); + // Added in iOS 10 SDK but it is supposed to be present in iOS 9. + [Mac (10,12)] + [Export ("initWithAsset:divisions:patchRadius:")] + IntPtr Constructor (MDLAsset asset, int divisions, float patchRadius); + [Export ("initWithData:boundingBox:voxelExtent:")] IntPtr Constructor (NSData voxelData, MDLAxisAlignedBoundingBox boundingBox, float voxelExtent); @@ -1464,9 +1702,18 @@ namespace XamCore.ModelIO { [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] void SetVoxel (Vector4i index); + // Added in iOS 10 SDK but it is supposed to be present in iOS 9. + [Mac (10,12)] + [Export ("setVoxelsForMesh:divisions:patchRadius:")] + void SetVoxels (MDLMesh mesh, int divisions, float patchRadius); + + [Deprecated (PlatformName.MacOSX, 10, 12, message: "Use SetVoxels (MDLMesh, int, float)")] + [Obsoleted (PlatformName.iOS, 10, 0, message: "Use SetVoxels (MDLMesh, int, float)")] [Export ("setVoxelsForMesh:divisions:interiorShells:exteriorShells:patchRadius:")] void SetVoxels (MDLMesh mesh, int divisions, int interiorShells, int exteriorShells, float patchRadius); + [Deprecated (PlatformName.MacOSX, 10, 12, message: "Use SetVoxels (MDLMesh, int, float)")] + [Obsoleted (PlatformName.iOS, 10, 0, message: "Use SetVoxels (MDLMesh, int, float)")] [Export ("setVoxelsForMesh:divisions:interiorNBWidth:exteriorNBWidth:patchRadius:")] void SetVoxels (MDLMesh mesh, int divisions, float interiorNBWidth, float exteriorNBWidth, float patchRadius); @@ -1507,6 +1754,38 @@ namespace XamCore.ModelIO { [Export ("boundingBox")] MDLAxisAlignedBoundingBox BoundingBox { get; } + + // Added in iOS 10 SDK but it is supposed to be present in iOS 9. + [Mac (10,12)] + [Export ("convertToSignedShellField")] + void ConvertToSignedShellField (); + + // Added in iOS 10 SDK but it is supposed to be present in iOS 9. + [Mac (10,12)] + [Export ("isValidSignedShellField")] + bool IsValidSignedShellField { get; } + + // Added in iOS 10 SDK but it is supposed to be present in iOS 9. + [Mac (10,12)] + [Export ("shellFieldInteriorThickness")] + float ShellFieldInteriorThickness { get; set; } + + // Added in iOS 10 SDK but it is supposed to be present in iOS 9. + [Mac (10,12)] + [Export ("shellFieldExteriorThickness")] + float ShellFieldExteriorThickness { get; set; } + + // Added in iOS 10 SDK but it is supposed to be present in iOS 9. + [Mac (10,12)] + [Export ("coarseMesh")] + [return: NullAllowed] + MDLMesh GetCoarseMesh (); + + // Added in iOS 10 SDK but it is supposed to be present in iOS 9. + [Mac (10,12)] + [Export ("coarseMeshUsingAllocator:")] + [return: NullAllowed] + MDLMesh GetCoarseMeshUsingAllocator ([NullAllowed] IMDLMeshBufferAllocator allocator); } [Static] diff --git a/tests/introspection/ApiProtocolTest.cs b/tests/introspection/ApiProtocolTest.cs index 38c6c68d54..e1cbf69e45 100644 --- a/tests/introspection/ApiProtocolTest.cs +++ b/tests/introspection/ApiProtocolTest.cs @@ -73,10 +73,6 @@ namespace Introspection { case "GKScore": // new in iOS8 and 10.0 case "NSExtensionContext": - // TODO: MDLMaterialProperty has NSCopying defined but copyWithZone doesn't work - // filled radar://26939747 with Apple - // https://trello.com/c/6aIzLH4a - case "MDLMaterialProperty": case "NSLayoutAnchor`1": case "NSLayoutDimension": case "NSLayoutXAxisAnchor": diff --git a/tests/introspection/ApiSelectorTest.cs b/tests/introspection/ApiSelectorTest.cs index ee8dbb6891..1c4ab9c2a5 100644 --- a/tests/introspection/ApiSelectorTest.cs +++ b/tests/introspection/ApiSelectorTest.cs @@ -122,6 +122,13 @@ namespace Introspection { return true; } break; + case "MDLMaterialProperty": + switch (selectorName) { + case "copyWithZone:": + // not working before iOS 10, macOS 10.12 + return !TestRuntime.CheckXcodeVersion (8, 0); + } + break; // Xcode 8 beta 2 case "GKGraph": case "NEFlowMetaData": @@ -156,6 +163,16 @@ namespace Introspection { return true; } break; + case "MDLMesh": + switch (selectorName) { + case "initCapsuleWithExtent:cylinderSegments:hemisphereSegments:inwardNormals:geometryType:allocator:": + case "initConeWithExtent:segments:inwardNormals:cap:geometryType:allocator:": + case "initHemisphereWithExtent:segments:inwardNormals:cap:geometryType:allocator:": + case "initMeshBySubdividingMesh:submeshIndex:subdivisionLevels:allocator:": + case "initSphereWithExtent:segments:inwardNormals:geometryType:allocator:": + return true; + } + break; case "NSImage": switch (selectorName) { case "initByReferencingFile:": diff --git a/tests/monotouch-test/Asserts.cs b/tests/monotouch-test/Asserts.cs index ebe8b4b138..8d468eb504 100644 --- a/tests/monotouch-test/Asserts.cs +++ b/tests/monotouch-test/Asserts.cs @@ -12,6 +12,11 @@ using NUnit.Framework; public static class Asserts { #if !__WATCHOS__ + public static void AreEqual (bool expected, bool actual, string message) + { + Assert.AreEqual (expected, actual, message + " (M)"); + } + public static void AreEqual (float expected, float actual, string message) { Assert.AreEqual (expected, actual, message + " (M)"); diff --git a/tests/monotouch-test/ModelIO/MDLMaterialProperty.cs b/tests/monotouch-test/ModelIO/MDLMaterialProperty.cs index f902fedcda..c536a1d5e4 100644 --- a/tests/monotouch-test/ModelIO/MDLMaterialProperty.cs +++ b/tests/monotouch-test/ModelIO/MDLMaterialProperty.cs @@ -193,7 +193,6 @@ namespace MonoTouchFixtures.ModelIO { } [Test] - [Ignore ("MDLMaterialProperty has NSCopying defined but copyWithZone doesn't work. radar://26939747 - https://trello.com/c/6aIzLH4a")] public void Copy () { using (var obj = new MDLMaterialProperty ("name", MDLMaterialSemantic.AmbientOcclusion)) { diff --git a/tests/monotouch-test/ModelIO/MDLMesh.cs b/tests/monotouch-test/ModelIO/MDLMesh.cs index 25afe296b6..e861021e2a 100644 --- a/tests/monotouch-test/ModelIO/MDLMesh.cs +++ b/tests/monotouch-test/ModelIO/MDLMesh.cs @@ -74,6 +74,14 @@ namespace MonoTouchFixtures.ModelIO { } using (var obj = MDLMesh.CreatePlane (new Vector2 (1, 1), new Vector2i (1, 1), MDLGeometryType.Triangles, null)) { } + using (var obj = MDLMesh.CreateSphere (new Vector3 (1, 2, 3), new Vector2i (4, 5), MDLGeometryType.Triangles, true, null)) { + } + using (var obj = MDLMesh.CreateHemisphere (new Vector3 (1, 2, 3), new Vector2i (4, 5), MDLGeometryType.Triangles, true, true, null)) { + } + using (var obj = MDLMesh.CreateCapsule (new Vector3 (1, 2, 3), new Vector2i (4, 5), MDLGeometryType.Triangles, true, 10, null)) { + } + using (var obj = MDLMesh.CreateCone (new Vector3 (1, 2, 3), new Vector2i (4, 5), MDLGeometryType.Triangles, true, true, null)) { + } // using (var obj = MDLMesh.CreateSubdividedMesh (new MDLMesh (), 0, 0)) { // } @@ -173,6 +181,74 @@ namespace MonoTouchFixtures.ModelIO { } } + [Test] + public void CreateSphereTest () + { + Vector3 V3 = new Vector3 (1, 2, 3); + Vector2i V2i = new Vector2i (4, 5); + + using (var obj = MDLMesh.CreateSphere (V3, V2i, MDLGeometryType.Triangles, true, null)) { + Assert.IsNotNull (obj, "obj"); + Asserts.AreEqual (new MDLAxisAlignedBoundingBox { MaxBounds = new Vector3 (0.9510565f, 2, 2.85317f), MinBounds = new Vector3 (-0.9510565f, -2, -2.85317f) }, obj.BoundingBox, "BoundingBox"); + Assert.AreEqual (1, obj.Submeshes.Count, "Submeshes Count"); + Assert.AreEqual (1, obj.VertexBuffers.Length, "VertexBuffers Count"); + Assert.AreEqual (22, obj.VertexCount, "VertexCount"); + Assert.AreEqual (31, obj.VertexDescriptor.Attributes.Count, "VertexDescriptor Attributes Count"); + Assert.AreEqual (31, obj.VertexDescriptor.Layouts.Count, "VertexDescriptor Layouts Count"); + } + } + + [Test] + public void CreateHemisphereTest () + { + Vector3 V3 = new Vector3 (1, 2, 3); + Vector2i V2i = new Vector2i (4, 5); + + using (var obj = MDLMesh.CreateHemisphere (V3, V2i, MDLGeometryType.Triangles, true, true, null)) { + Assert.IsNotNull (obj, "obj"); + Asserts.AreEqual (new MDLAxisAlignedBoundingBox { MaxBounds = new Vector3 (0.9510565f, 2, 2.85317f), MinBounds = new Vector3 (-0.9510565f, 0.6180339f, -2.85317f) }, obj.BoundingBox, "BoundingBox"); + Assert.AreEqual (1, obj.Submeshes.Count, "Submeshes Count"); + Assert.AreEqual (1, obj.VertexBuffers.Length, "VertexBuffers Count"); + Assert.AreEqual (16, obj.VertexCount, "VertexCount"); + Assert.AreEqual (31, obj.VertexDescriptor.Attributes.Count, "VertexDescriptor Attributes Count"); + Assert.AreEqual (31, obj.VertexDescriptor.Layouts.Count, "VertexDescriptor Layouts Count"); + } + } + + [Test] + public void CreateCapsuleTest () + { + Vector3 V3 = new Vector3 (1, 2, 3); + Vector2i V2i = new Vector2i (4, 5); + + using (var obj = MDLMesh.CreateCapsule (V3, V2i, MDLGeometryType.Triangles, true, 10, null)) { + Assert.IsNotNull (obj, "obj"); + Asserts.AreEqual (new MDLAxisAlignedBoundingBox { MaxBounds = new Vector3 (0.6f, 1.333333f, 1.8f), MinBounds = new Vector3 (-0.6f, -1, -1.8f) }, obj.BoundingBox, "BoundingBox"); + Assert.AreEqual (1, obj.Submeshes.Count, "Submeshes Count"); + Assert.AreEqual (3, obj.VertexBuffers.Length, "VertexBuffers Count"); + Assert.AreEqual (152, obj.VertexCount, "VertexCount"); + Assert.AreEqual (31, obj.VertexDescriptor.Attributes.Count, "VertexDescriptor Attributes Count"); + Assert.AreEqual (31, obj.VertexDescriptor.Layouts.Count, "VertexDescriptor Layouts Count"); + } + } + + [Test] + public void CreateConeTest () + { + Vector3 V3 = new Vector3 (1, 2, 3); + Vector2i V2i = new Vector2i (4, 5); + + using (var obj = MDLMesh.CreateCone (V3, V2i, MDLGeometryType.Triangles, true, true, null)) { + Assert.IsNotNull (obj, "obj"); + Asserts.AreEqual (new MDLAxisAlignedBoundingBox { MaxBounds = new Vector3 (0.5f, -0.5f, 1.5f), MinBounds = new Vector3 (-0.5f, -2.5f, -1.5f) }, obj.BoundingBox, "BoundingBox"); + Assert.AreEqual (1, obj.Submeshes.Count, "Submeshes Count"); + Assert.AreEqual (3, obj.VertexBuffers.Length, "VertexBuffers Count"); + Assert.AreEqual (36, obj.VertexCount, "VertexCount"); + Assert.AreEqual (31, obj.VertexDescriptor.Attributes.Count, "VertexDescriptor Attributes Count"); + Assert.AreEqual (31, obj.VertexDescriptor.Layouts.Count, "VertexDescriptor Layouts Count"); + } + } + // FIXME: figure out valid input arguments for GenerateAmbientOcclusionTexture // [Test] // public void GenerateAmbientOcclusionTextureTest () diff --git a/tests/monotouch-test/ModelIO/MDLTransform.cs b/tests/monotouch-test/ModelIO/MDLTransform.cs index 2bcdc74577..21eecb7221 100644 --- a/tests/monotouch-test/ModelIO/MDLTransform.cs +++ b/tests/monotouch-test/ModelIO/MDLTransform.cs @@ -77,6 +77,18 @@ namespace MonoTouchFixtures.ModelIO { Asserts.AreEqual (Vector3.One, obj.Scale, "Scale"); Asserts.AreEqual (Vector3.Zero, obj.Rotation, "Rotation"); Asserts.AreEqual (id, obj.Matrix, "Matrix"); + Asserts.AreEqual (false, obj.ResetsTransform, "ResetsTransform"); + + obj.Translation = V3; + Asserts.AreEqual (V3, obj.Translation, "Translation 2"); + } + + using (var obj = new MDLTransform (id, true)) { + Asserts.AreEqual (Vector3.Zero, obj.Translation, "Translation"); + Asserts.AreEqual (Vector3.One, obj.Scale, "Scale"); + Asserts.AreEqual (Vector3.Zero, obj.Rotation, "Rotation"); + Asserts.AreEqual (id, obj.Matrix, "Matrix"); + Asserts.AreEqual (true, obj.ResetsTransform, "ResetsTransform"); obj.Translation = V3; Asserts.AreEqual (V3, obj.Translation, "Translation 2");