public static List<Vector2[]> ApplySkinBlend(Uni2DMesh2D a_rMesh2D, Transform[] a_rJointCurrentTransforms, Transform a_rOriginTransform, SkinQuality a_eSkinQuality = SkinQuality.Auto)
    {
        List<Vector2[]> oBlendedShapeVertices = new List<Vector2[]>();
        int iShapeIndex = 0;
        foreach(Uni2DMeshShape2D rShape in a_rMesh2D.shapes)
        {
            Vector2[] rVertices = rShape.vertices;

            int iVertexCount = rVertices.Length;
            Vector3[] oVertices3D = new Vector3[iVertexCount];
            for(int i = 0; i < iVertexCount; ++i)
            {
                oVertices3D[i] = (Vector3)rVertices[i];
            }

            Vector3[] oBlendedVertices3D = new Vector3[iVertexCount];
            ApplySkinBlend(ref oBlendedVertices3D, oVertices3D, a_rMesh2D.bindposes, rShape.GetBoneWeightStructs(), a_rJointCurrentTransforms, a_rOriginTransform, a_eSkinQuality);

            Vector2[] oBlendedVertices = new Vector2[iVertexCount];
            for(int i = 0; i < iVertexCount; ++i)
            {
                oBlendedVertices[i] = (Vector2)oBlendedVertices3D[i];
            }

            oBlendedShapeVertices.Add(oBlendedVertices);

            ++iShapeIndex;
        }

        return oBlendedShapeVertices;
    }
    public static List <Vector2[]> ApplySkinBlend(Uni2DMesh2D a_rMesh2D, Transform[] a_rJointCurrentTransforms, Transform a_rOriginTransform, SkinQuality a_eSkinQuality = SkinQuality.Auto)
    {
        List <Vector2[]> oBlendedShapeVertices = new List <Vector2[]>();
        int iShapeIndex = 0;

        foreach (Uni2DMeshShape2D rShape in a_rMesh2D.shapes)
        {
            Vector2[] rVertices = rShape.vertices;

            int       iVertexCount = rVertices.Length;
            Vector3[] oVertices3D  = new Vector3[iVertexCount];
            for (int i = 0; i < iVertexCount; ++i)
            {
                oVertices3D[i] = (Vector3)rVertices[i];
            }

            Vector3[] oBlendedVertices3D = new Vector3[iVertexCount];
            ApplySkinBlend(ref oBlendedVertices3D, oVertices3D, a_rMesh2D.bindposes, rShape.GetBoneWeightStructs(), a_rJointCurrentTransforms, a_rOriginTransform, a_eSkinQuality);

            Vector2[] oBlendedVertices = new Vector2[iVertexCount];
            for (int i = 0; i < iVertexCount; ++i)
            {
                oBlendedVertices[i] = (Vector2)oBlendedVertices3D[i];
            }

            oBlendedShapeVertices.Add(oBlendedVertices);

            ++iShapeIndex;
        }

        return(oBlendedShapeVertices);
    }
Example #3
0
	public static Vector2[] ApplySkinBlend(Uni2DMesh2D a_rMesh2D, Transform[] a_rJointCurrentTransforms, Transform a_rOriginTransform, SkinQuality a_eSkinQuality = SkinQuality.Auto)
	{		
		Vector2[] rVertices = a_rMesh2D.vertices;
		int iVertexCount = rVertices.Length;		
		Vector3[] oVertices3D = new Vector3[iVertexCount];
		for(int i = 0; i < iVertexCount; ++i)
		{
			oVertices3D[i] = (Vector3)rVertices[i];
		}
		
		Vector3[] oBlendedVertices3D = new Vector3[iVertexCount];
		ApplySkinBlend(ref oBlendedVertices3D, oVertices3D, a_rMesh2D.bindposes, a_rMesh2D.GetBoneWeightStructs(), a_rJointCurrentTransforms, a_rOriginTransform, a_eSkinQuality);
		
		
		Vector2[] oBlendedVertices = new Vector2[iVertexCount];
		for(int i = 0; i < iVertexCount; ++i)
		{
			oBlendedVertices[i] = (Vector2)oBlendedVertices3D[i];
		}
		
		return oBlendedVertices;
	}
Example #4
0
    public static Vector2[] ApplySkinBlend(Uni2DMesh2D a_rMesh2D, Transform[] a_rJointCurrentTransforms, Transform a_rOriginTransform, SkinQuality a_eSkinQuality = SkinQuality.Auto)
    {
        Vector2[] rVertices    = a_rMesh2D.vertices;
        int       iVertexCount = rVertices.Length;

        Vector3[] oVertices3D = new Vector3[iVertexCount];
        for (int i = 0; i < iVertexCount; ++i)
        {
            oVertices3D[i] = (Vector3)rVertices[i];
        }

        Vector3[] oBlendedVertices3D = new Vector3[iVertexCount];
        ApplySkinBlend(ref oBlendedVertices3D, oVertices3D, a_rMesh2D.bindposes, a_rMesh2D.GetBoneWeightStructs(), a_rJointCurrentTransforms, a_rOriginTransform, a_eSkinQuality);


        Vector2[] oBlendedVertices = new Vector2[iVertexCount];
        for (int i = 0; i < iVertexCount; ++i)
        {
            oBlendedVertices[i] = (Vector2)oBlendedVertices3D[i];
        }

        return(oBlendedVertices);
    }
Example #5
0
 // Shallow copy constructor
 public Uni2DEditorSpriteData(Uni2DEditorSpriteData a_rSpriteData)
 {
     this.spriteWidth        = a_rSpriteData.spriteWidth;
     this.spriteHeight       = a_rSpriteData.spriteHeight;
     this.renderMesh         = a_rSpriteData.renderMesh;
     this.renderMeshMaterial = a_rSpriteData.renderMeshMaterial;
     this.generatedMaterial  = a_rSpriteData.generatedMaterial;
     this.renderMeshVertices = a_rSpriteData.renderMeshVertices;
     this.renderMeshUVs      = a_rSpriteData.renderMeshUVs;
     this.pivotCoords        = a_rSpriteData.pivotCoords;
     this.scaleMode          = a_rSpriteData.scaleMode;
     this.scale                       = a_rSpriteData.scale;
     this.scaleNotUniform             = a_rSpriteData.scaleNotUniform;
     this.colliderTriangleCount       = a_rSpriteData.colliderTriangleCount;
     this.meshCollidersRootGameObject = a_rSpriteData.meshCollidersRootGameObject;
     this.meshCollidersList           = new List <Mesh>(a_rSpriteData.meshCollidersList);
     this.meshColliderComponentsList  = new List <MeshCollider>(a_rSpriteData.meshColliderComponentsList);
             #if AFTER_UNITY_4_3
     this.polygonCollider2D = a_rSpriteData.polygonCollider2D;
     this.mesh2D            = a_rSpriteData.mesh2D;
             #endif
     //this.physicIsDirty = a_rSpriteData.physicIsDirty;
 }
	// NEW
	// Creates/updates colliders according to given new settings
	public static GameObject GenerateCollidersFromSettings( Uni2DEditorSpriteSettings a_rNewSpriteSettings, Uni2DSprite a_rSprite, bool a_bForceRebuild )
	{
		Uni2DEditorSpriteSettings rCurrentSpriteSettings = a_rSprite.SpriteSettings;
		Uni2DEditorSpriteData rCurrentSpriteData = a_rSprite.SpriteData;

		GameObject rSpriteGameObject = a_rSprite.gameObject;

		// Is rebuilding needed?
		bool bRebuild = a_bForceRebuild
			|| a_rSprite.isPhysicsDirty
			|| rCurrentSpriteSettings.DoNewSettingsImplyToRebuildPhysics( a_rNewSpriteSettings );

		if( bRebuild )
		{
			// Clean the sprite (if needed)
			RemoveGeneratedComponents(a_rSprite, a_rNewSpriteSettings);

			List<MeshCollider> oMeshColliderComponentsList = null;
			List<Mesh> rMeshList = null;
			GameObject oColliderParentGameObject = null;
			int iMeshColliderTriangleCount = 0;
			#if AFTER_UNITY_4_3
			PolygonCollider2D rPolygonCollider2D = null;
			Uni2DMesh2D oMesh2D = null;
			#endif
			switch(a_rNewSpriteSettings.dimensionMode)
			{
				case DimensionMode._3D:
				{ 
					// Generate meshes
					rMeshList = PolygonizeTextureToMeshColliderFromSettings( a_rNewSpriteSettings );
					
					if( rMeshList == null )
					{
						rMeshList = new List<Mesh>( );
					}
		
					oMeshColliderComponentsList = new List<MeshCollider>( rMeshList.Count );
		
					// Add collider children
					// Attach a mesh collider collider to current game object
					// if collider is not compound
					oColliderParentGameObject = null;
		
					// Components creation
					if( a_rNewSpriteSettings.physicsMode != Uni2DSprite.PhysicsMode.NoPhysics )
					{
						// Compound
						if( a_rNewSpriteSettings.collisionType == Uni2DSprite.CollisionType.Compound )
						{
							oColliderParentGameObject = new GameObject( "root_Colliders" );
				
							// Create a game object for each mesh collider and attach them to sprite game object
							for( int iColliderIndex = 0, iMeshCount = rMeshList.Count; iColliderIndex < iMeshCount; ++iColliderIndex )
							{
								GameObject oMeshColliderGameObject  = new GameObject( "mesh_Collider_" + iColliderIndex );
								MeshCollider oMeshColliderComponent = oMeshColliderGameObject.AddComponent<MeshCollider>( );
								oMeshColliderComponent.sharedMesh   = rMeshList[ iColliderIndex ];
								oMeshColliderComponent.convex       = true;
								oMeshColliderComponent.isTrigger = rCurrentSpriteSettings.isTrigger;
								
								oMeshColliderComponentsList.Add( oMeshColliderComponent );
				
								// Child -> parent attachment
								oMeshColliderGameObject.transform.parent = oColliderParentGameObject.transform;
		
								iMeshColliderTriangleCount += rMeshList[ iColliderIndex ].triangles.Length;
							}
							Transform rColliderParentTransform = oColliderParentGameObject.transform;
							rColliderParentTransform.parent        = rSpriteGameObject.transform;
							rColliderParentTransform.localPosition = Vector3.zero;
							rColliderParentTransform.localRotation = Quaternion.identity;
							rColliderParentTransform.localScale    = Vector3.one;
						}
						else // Static / Dynamic
						{
							MeshCollider oMeshColliderComponent = rSpriteGameObject.GetComponent<MeshCollider>( );
							if( oMeshColliderComponent == null )
							{
								oMeshColliderComponent = rSpriteGameObject.AddComponent<MeshCollider>( );
							}
		
							oMeshColliderComponent.sharedMesh = rMeshList[ 0 ];
							oMeshColliderComponentsList.Add( oMeshColliderComponent );
		
							// Set whether or not mesh collider is convex
							oMeshColliderComponent.convex = ( a_rNewSpriteSettings.collisionType == Uni2DSprite.CollisionType.Convex );
							oMeshColliderComponent.isTrigger = rCurrentSpriteSettings.isTrigger;
							iMeshColliderTriangleCount = rMeshList[ 0 ].triangles.Length;
						}
					}
				}
				break;
				
				case DimensionMode._2D:
				{
					#if AFTER_UNITY_4_3
					oMesh2D = new Uni2DMesh2D();
					oMesh2D.shapes = PolygonizeTextureToBorder2DVerticesFromSettings(a_rNewSpriteSettings);
					
					if( a_rNewSpriteSettings.physicsMode != Uni2DSprite.PhysicsMode.NoPhysics )
					{
						PolygonCollider2D rPolygonCollider2DComponent = rSpriteGameObject.GetComponent<PolygonCollider2D>( );
						if(rPolygonCollider2DComponent == null)
						{
							rPolygonCollider2DComponent = rSpriteGameObject.AddComponent<PolygonCollider2D>( );
						}
					
						rPolygonCollider2D = rPolygonCollider2DComponent;
						rPolygonCollider2D.isTrigger = rCurrentSpriteSettings.isTrigger;
						oMesh2D.CopyVertices(rPolygonCollider2D);
					}
					#endif
				}
				break;
			}
			// Add rigidbody to sprite game object if any dynamic mode is specified
			Uni2DEditorSpriteBuilderUtils.SetupRigidbodyFor2D( a_rSprite, a_rNewSpriteSettings );

			// Settings
			rCurrentSpriteSettings.alphaCutOff            = a_rNewSpriteSettings.alphaCutOff;
			rCurrentSpriteSettings.collisionType          = a_rNewSpriteSettings.collisionType;
			rCurrentSpriteSettings.extrusionDepth         = a_rNewSpriteSettings.extrusionDepth;
			rCurrentSpriteSettings.isKinematic            = a_rNewSpriteSettings.isKinematic;
			rCurrentSpriteSettings.physicsMode            = a_rNewSpriteSettings.physicsMode;
			rCurrentSpriteSettings.pivotType              = a_rNewSpriteSettings.pivotType;
			rCurrentSpriteSettings.pivotCustomCoords      = a_rNewSpriteSettings.pivotCustomCoords;
			rCurrentSpriteSettings.polygonizationAccuracy = a_rNewSpriteSettings.polygonizationAccuracy;
			rCurrentSpriteSettings.polygonizeHoles        = a_rNewSpriteSettings.polygonizeHoles;

			// Generated data
			rCurrentSpriteData.meshColliderComponentsList  = oMeshColliderComponentsList;
			rCurrentSpriteData.meshCollidersList           = rMeshList;
			rCurrentSpriteData.meshCollidersRootGameObject = oColliderParentGameObject;
			rCurrentSpriteData.colliderTriangleCount       = ( iMeshColliderTriangleCount / 3 );
			rCurrentSpriteData.pivotCoords                 = a_rNewSpriteSettings.PivotCoords;
			#if AFTER_UNITY_4_3
			rCurrentSpriteData.polygonCollider2D           = rPolygonCollider2D;
			rCurrentSpriteData.mesh2D = oMesh2D;
			#endif
		}

		// Is up to date!
		a_rSprite.isPhysicsDirty = false;

		return rSpriteGameObject;
	}
Example #7
0
    // Update Physics Skinning
    public void UpdatePhysicsSkinning()
    {
        if (m_oMeshColliders != null)
        {
            if (m_oBones != null)
            {
                int iColliderCount = MeshColliders.Count;
                if (iColliderCount > 0)
                {
                    // Create Collider meshes arrays if needed
                    if (m_oPoseColliderMeshes == null || m_oPoseColliderMeshes.Length != iColliderCount)
                    {
                        m_oPoseColliderMeshes = new Mesh[iColliderCount];
                    }
                    if (m_oRefManipulatedColliderMeshes == null || m_oRefManipulatedColliderMeshes.Length != iColliderCount)
                    {
                        // Destroy old references
                        DestroyManipulatedColliderMeshReferences();

                        // Recreate
                        m_oRefManipulatedColliderMeshes = new ReferenceContainer[iColliderCount];
                        for (int i = 0; i < iColliderCount; ++i)
                        {
                            ReferenceContainer rReferenceContainer = new ReferenceContainer();
                            rReferenceContainer.Initialize(this, true);
                            m_oRefManipulatedColliderMeshes[i] = rReferenceContainer;
                        }
                    }

                    // Apply the skin blend on each collider
                    int         iColliderIndex  = 0;
                    List <Mesh> rColliderMeshes = m_rSprite.SpriteData.meshCollidersList;
                    foreach (MeshCollider rMeshCollider in m_oMeshColliders)
                    {
                        if (rMeshCollider != null)
                        {
                            // Get The pose and manipulated mesh
                            Mesh rPoseMesh = m_oPoseColliderMeshes[iColliderIndex];
                            ReferenceContainer rRefManipulatedMesh = m_oRefManipulatedColliderMeshes[iColliderIndex];

                            if (ApplySkinBlend(rColliderMeshes[iColliderIndex], rMeshCollider.sharedMesh, ref rPoseMesh, ref rRefManipulatedMesh))
                            {
                                // Update collider mesh
                                rMeshCollider.sharedMesh = null;
                                rMeshCollider.sharedMesh = rRefManipulatedMesh.Reference as Mesh;

                                m_oPoseColliderMeshes[iColliderIndex] = rPoseMesh;
                            }
                        }

                        ++iColliderIndex;
                    }
                }
            }
        }

                #if AFTER_UNITY_4_3
        if (PolygonCollider2D != null)
        {
            Uni2DMesh2D.CopyVertices(Uni2DSkinningUtils.ApplySkinBlend(m_rSprite.SpriteData.mesh2D, m_oBones, transform, quality), PolygonCollider2D);
        }
                #endif
    }
Example #8
0
	private void SetSkinWeight(Uni2DMesh2D a_rMesh2D, Matrix4x4[] a_rBindPoses, Dictionary<Uni2DSmoothBindingBone,int> a_rBonesIndices)
	{
		foreach(Uni2DMeshShape2D rShape in a_rMesh2D.shapes)
		{
			Vector2[] rVertices = rShape.vertices;
			// Compute bone weights for each vertex
			int iVertexCount = rVertices.Length;
			Uni2DBoneWeight[] oBoneWeights   = new Uni2DBoneWeight[iVertexCount];
			for( int iVertexIndex = 0; iVertexIndex < iVertexCount; ++iVertexIndex )
			{
				oBoneWeights[iVertexIndex] = ComputeBoneWeight((Vector3)rVertices[iVertexIndex], a_rBonesIndices);
			}
			
			// Set bindposes and weights
			rShape.boneWeights = oBoneWeights;
			
		}
		a_rMesh2D.bindposes = a_rBindPoses;
	}
	// Shallow copy constructor
	public Uni2DEditorSpriteData( Uni2DEditorSpriteData a_rSpriteData )
	{
		this.spriteWidth                 = a_rSpriteData.spriteWidth;
		this.spriteHeight                = a_rSpriteData.spriteHeight;
		this.renderMesh                  = a_rSpriteData.renderMesh;
		this.renderMeshMaterial          = a_rSpriteData.renderMeshMaterial;
		this.generatedMaterial			 = a_rSpriteData.generatedMaterial;
		this.renderMeshVertices          = a_rSpriteData.renderMeshVertices;
		this.renderMeshUVs               = a_rSpriteData.renderMeshUVs;
		this.pivotCoords                 = a_rSpriteData.pivotCoords;
		this.scaleMode                   = a_rSpriteData.scaleMode;
		this.scale                       = a_rSpriteData.scale;
		this.scaleNotUniform             = a_rSpriteData.scaleNotUniform;
		this.colliderTriangleCount       = a_rSpriteData.colliderTriangleCount;
		this.meshCollidersRootGameObject = a_rSpriteData.meshCollidersRootGameObject;
		this.meshCollidersList           = new List<Mesh>( a_rSpriteData.meshCollidersList );
		this.meshColliderComponentsList  = new List<MeshCollider>( a_rSpriteData.meshColliderComponentsList );
		#if AFTER_UNITY_4_3
		this.polygonCollider2D = a_rSpriteData.polygonCollider2D;
		this.mesh2D = a_rSpriteData.mesh2D;
		#endif
		//this.physicIsDirty = a_rSpriteData.physicIsDirty;
	}