Esempio n. 1
0
    // Rebuild mesh
    public void UpdateUvs()
    {
        Material rSpriteMaterial = m_rSpriteData.renderMeshMaterial;

        // Handle the case where the atlas doesn't contains the texture anymore
        if (m_rSpriteSettings.ShouldUseAtlas(m_rSpriteSettings.textureContainer.GUID))
        {
            rSpriteMaterial   = m_rSpriteSettings.atlas.GetMaterial(m_rSpriteSettings.textureContainer.GUID);
            atlasGenerationID = m_rSpriteSettings.atlas.generationId;
        }
        else
        {
            m_rSpriteSettings.atlas = null;
            rSpriteMaterial         = m_rSpriteData.renderMeshMaterial;
            atlasGenerationID       = "";
        }

        // Update UVs
        Mesh rSpriteMesh = m_rSpriteData.renderMesh;

        rSpriteMesh.uv = Uni2DSpriteUtils.BuildUVs(m_rSpriteSettings.textureContainer,
                                                   m_rSpriteData.renderMeshUVs,
                                                   m_rSpriteSettings.atlas);

        // Update material
        Renderer rSpriteRender = this.renderer;

        if (rSpriteRender != null)
        {
            rSpriteRender.sharedMaterial = rSpriteMaterial;
        }

        EditorUtility.SetDirty(this);
    }
	// NEW
	// Creates/updates the quad mesh material of a sprite according to given new settings.
	public static GameObject GenerateSpriteMatFromSettings( Uni2DEditorSpriteSettings a_rNewSpriteSettings, Uni2DSprite a_rSprite )
	{
		Material oSpriteRendererMaterial;
		Material oSpriteMeshMaterial;

		Uni2DEditorSpriteData rCurrentSpriteData         = a_rSprite.SpriteData;
		Uni2DEditorSpriteSettings rCurrentSpriteSettings = a_rSprite.SpriteSettings;

		Texture2D rNewSpriteTexture = a_rNewSpriteSettings.textureContainer;

		GameObject rSpriteGameObject = a_rSprite.gameObject;
		
		// If a shared material is used with a texture different from the sprite texture
		// or if an atlas is used
		if(a_rNewSpriteSettings.ShouldUseAtlas( ) 
			|| (a_rNewSpriteSettings.sharedMaterial != null && a_rNewSpriteSettings.textureContainer.Texture != a_rNewSpriteSettings.sharedMaterial.mainTexture) )
		{
			// don't use the shared material
			a_rNewSpriteSettings.sharedMaterial = null;
		}
		
		Material rGeneratedMaterial = null;
		if(a_rNewSpriteSettings.sharedMaterial == null && a_rNewSpriteSettings.ShouldUseAtlas( ) == false)
		{
			// If the material doesn't exist yet, create it
			rGeneratedMaterial = rCurrentSpriteData.generatedMaterial;
			if( rGeneratedMaterial == null )
			{
				// create a new one
				rGeneratedMaterial = new Material( Shader.Find( mc_oSpriteDefaultShader ) );
	
				// Set mat name
				rGeneratedMaterial.name = "mat_Generated_Sprite_" + rNewSpriteTexture.name;
				
				rCurrentSpriteData.generatedMaterial = rGeneratedMaterial;
			}
		}
		rCurrentSpriteData.generatedMaterial = rGeneratedMaterial;
		
		Material rSharedMaterial = a_rNewSpriteSettings.sharedMaterial;
		if(rSharedMaterial == null)
		{
			oSpriteMeshMaterial = rGeneratedMaterial;
		}
		else
		{
			oSpriteMeshMaterial = rSharedMaterial;
		}
		
		// If no atlas...
		if( a_rNewSpriteSettings.ShouldUseAtlas( ) == false )
		{
			oSpriteRendererMaterial = oSpriteMeshMaterial;
			a_rNewSpriteSettings.atlas = null;
			
			// Set mat texture
			oSpriteMeshMaterial.mainTexture = rNewSpriteTexture;
		}
		else
		{
			oSpriteRendererMaterial = a_rNewSpriteSettings.atlas.GetMaterial( rNewSpriteTexture );
			oSpriteMeshMaterial = oSpriteRendererMaterial;
		}
		
		// Init. rendering component
		// Add it if not created
		Renderer rSpriteMeshRendererComponent = a_rSprite.renderer;// a_rSprite.GetComponent<MeshRenderer>( );

		if( rSpriteMeshRendererComponent == null )
		{
			if( a_rSprite.Bones.Length > 0 )
			{
				rSpriteMeshRendererComponent = rSpriteGameObject.AddComponent<SkinnedMeshRenderer>( );
			}
			else
			{
				rSpriteMeshRendererComponent = rSpriteGameObject.AddComponent<MeshRenderer>( );
			}
		}

		// Set new material to mesh renderer
		rSpriteMeshRendererComponent.sharedMaterial = oSpriteRendererMaterial;

		// Update sprite settings
		rCurrentSpriteSettings.textureContainer = new Texture2DContainer( rNewSpriteTexture, a_rNewSpriteSettings.atlas == null );
		rCurrentSpriteSettings.atlas            = a_rNewSpriteSettings.atlas;

		// Update sprite generated data
		rCurrentSpriteData.renderMeshMaterial   = oSpriteMeshMaterial;

		return rSpriteGameObject;
	}
	// NEW
	// Creates/updates the quad mesh of a sprite according to given new settings.
	public static GameObject GenerateSpriteMeshFromSettings( Uni2DEditorSpriteSettings a_rNewSpriteSettings, Uni2DSprite a_rSprite )
	{
		GameObject rSpriteGameObject = a_rSprite.gameObject;

		Uni2DEditorSpriteData rCurrentSpriteData         = a_rSprite.SpriteData;
		Uni2DEditorSpriteSettings rCurrentSpriteSettings = a_rSprite.SpriteSettings;

		Texture2DContainer rTextureContainer = a_rNewSpriteSettings.textureContainer;
		Texture2D rSpriteTexture = rTextureContainer;

		// Init. mesh filter component
		// Add it if not created
		MeshFilter rSpriteMeshFilter = a_rSprite.GetComponent<MeshFilter>( );
		if( rSpriteMeshFilter == null )
		{
			rSpriteMeshFilter = rSpriteGameObject.AddComponent<MeshFilter>( );
		}

		// Retrieve pivot coords
		Vector2 f2ScaledPivotCoords = a_rNewSpriteSettings.ScaledPivotCoords;

		// Quad mesh
		Mesh oSpriteMesh;
		Uni2DTextureAtlas rTextureAtlas = a_rNewSpriteSettings.atlas;
		Vector3[ ] oRenderMeshVertices = null;
		Vector2[ ] oRenderMeshNormalizedUVs = null;
		int iVertexCount;

		SpriteRenderMesh eRenderMesh = a_rNewSpriteSettings.renderMesh;

		// Check if using atlas and texture is well included in this atlas
		if( a_rNewSpriteSettings.ShouldUseAtlas( ) == false )
		{
			// No atlas => clean settings
			a_rNewSpriteSettings.atlas = null;
			rTextureAtlas = null;
		}

		// Render Mesh
		switch( eRenderMesh )
		{
			// Quad
			default:
			case SpriteRenderMesh.Quad:
			{
				// Mesh creation
				oSpriteMesh = new Mesh( );
				
				// Quad vertices
				oRenderMeshVertices = Uni2DSpriteUtils.GenerateQuadVertices( a_rNewSpriteSettings.SpriteWidth,
					a_rNewSpriteSettings.SpriteHeight,
					f2ScaledPivotCoords );
				
				oSpriteMesh.vertices = oRenderMeshVertices;
				iVertexCount = 4;
				
				// Quad triangles
				oSpriteMesh.triangles = new int[ 6 ]
				{
					1, 0, 2,
					2, 0, 3
				};
				
				// Quad UVs
				oRenderMeshNormalizedUVs = new Vector2[ 4 ]
				{
					new Vector2( 0.0f, 0.0f ),
					new Vector2( 1.0f, 0.0f ),
					new Vector2( 1.0f, 1.0f ),
					new Vector2( 0.0f, 1.0f )
				};
			}
			break;

			// Create a sprite via texture polygonization
			case SpriteRenderMesh.Grid:
			case SpriteRenderMesh.TextureToMesh:
			{
				oSpriteMesh = PolygonizeTextureToMeshFromSettings( a_rNewSpriteSettings );
				
				// Copy render mesh vertices/UVs (.vertices & .uv return a copy)
				oRenderMeshNormalizedUVs = oSpriteMesh.uv;
				oRenderMeshVertices      = oSpriteMesh.vertices;
				iVertexCount             = oSpriteMesh.vertexCount;
			}
			break;
		}


		// Build UVs from various settings (atlasing, render mesh, etc)
		oSpriteMesh.uv = Uni2DSpriteUtils.BuildUVs( rTextureContainer, oRenderMeshNormalizedUVs, rTextureAtlas );

		// Re-iterate vertices and unapply pivot in order to have
		// a copy of all mesh vertices in ( 0; 0 ) base
		Vector3 f3ScaledPivotCoords = f2ScaledPivotCoords;
		for( int iVertexIndex = 0; iVertexIndex < iVertexCount; ++iVertexIndex )
		{
			oRenderMeshVertices[ iVertexIndex ] += f3ScaledPivotCoords;
		}

		// Set vertex color array (32bits)
		Uni2DSpriteUtils.UpdateMeshVertexColor( oSpriteMesh, a_rNewSpriteSettings.vertexColor );


		// Optim. mesh
		oSpriteMesh.RecalculateBounds( );
		oSpriteMesh.RecalculateNormals( );
		oSpriteMesh.Optimize( );
		
		oSpriteMesh.name = "mesh_Sprite_";
		
		if(rSpriteTexture != null)
		{
			oSpriteMesh.name += rSpriteTexture.name;	
		}
		else
		{
			oSpriteMesh.name += "MissingTexture";
		}
		
		// Set new sprite settings
		rCurrentSpriteSettings.pivotType         = a_rNewSpriteSettings.pivotType;
		rCurrentSpriteSettings.pivotCustomCoords = a_rNewSpriteSettings.pivotCustomCoords;
		rCurrentSpriteSettings.spriteScale       = a_rNewSpriteSettings.spriteScale;
		rCurrentSpriteSettings.atlas             = rTextureAtlas;
		rCurrentSpriteSettings.textureContainer  = new Texture2DContainer( rSpriteTexture, rTextureAtlas == null );

		rCurrentSpriteSettings.renderMeshAlphaCutOff            = a_rNewSpriteSettings.renderMeshAlphaCutOff;
		rCurrentSpriteSettings.renderMeshPolygonizationAccuracy = a_rNewSpriteSettings.renderMeshPolygonizationAccuracy;
		rCurrentSpriteSettings.renderMeshPolygonizeHoles		= a_rNewSpriteSettings.renderMeshPolygonizeHoles;
		rCurrentSpriteSettings.usePhysicBuildSettings           = a_rNewSpriteSettings.usePhysicBuildSettings;
		rCurrentSpriteSettings.renderMesh                       = a_rNewSpriteSettings.renderMesh;
		rCurrentSpriteSettings.renderMeshGridHorizontalSubDivs  = a_rNewSpriteSettings.renderMeshGridHorizontalSubDivs;
		rCurrentSpriteSettings.renderMeshGridVerticalSubDivs    = a_rNewSpriteSettings.renderMeshGridVerticalSubDivs;

		// Set new sprite generated data
		rCurrentSpriteData.renderMesh         = oSpriteMesh;
		rCurrentSpriteData.renderMeshVertices = oRenderMeshVertices;
		rCurrentSpriteData.renderMeshUVs      = oRenderMeshNormalizedUVs;
		if(rSpriteTexture != null)
		{
			rCurrentSpriteData.spriteWidth        = rSpriteTexture.width;
			rCurrentSpriteData.spriteHeight       = rSpriteTexture.height;
		}
		// Set computed pivot coords
		rCurrentSpriteData.pivotCoords        = a_rNewSpriteSettings.PivotCoords;
		rCurrentSpriteData.scale              = a_rNewSpriteSettings.ScaleFactor;

		a_rSprite.atlasGenerationID = ( rTextureAtlas != null )
			? rTextureAtlas.generationId
			: "";

		// Set mesh to mesh filter component
		rSpriteMeshFilter.sharedMesh = oSpriteMesh;

		// Compute bone weights if needed
		GenerateBoneWeightsFromSettings( a_rNewSpriteSettings, a_rSprite );

		
		return rSpriteGameObject;
	}