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); }
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; }
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); }
// 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; }
// 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 }
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; }