private void Start()
    {
        // Add a mesh filter.
        MeshFilter   filter   = gameObject.AddComponent <MeshFilter> ();
        MeshRenderer renderer = gameObject.AddComponent <MeshRenderer> ();

        // TODO: Set the decal MeshRenderer material.

        decalBounds = GenerateBounds(transform);

        GameObject[] affectedObjects = GetAffectedObjects(decalBounds);

        // Sort the order of affected objects by distance to the decal object.
        affectedObjects = affectedObjects.OrderBy(x => Vector3.Distance(transform.position, x.transform.position)).ToArray();

        // Build a decal mesh based on all the affected GameObjects.
        foreach (GameObject go in affectedObjects)
        {
            DecalBuilder.BuildObjectDecal(this, go);
        }

        DecalBuilder.Push(pushDistance);

        Mesh mesh = DecalBuilder.BuildMesh();

        if (mesh != null)
        {
            mesh.name   = "DecalMesh";
            filter.mesh = mesh;
        }
    }
    private void BuildDecal(Decal decal)
    {
        MeshFilter filter = decal.GetComponent <MeshFilter>();

        if (filter == null)
        {
            filter = decal.gameObject.AddComponent <MeshFilter>();
        }
        if (decal.renderer == null)
        {
            decal.gameObject.AddComponent <MeshRenderer>();
        }
        decal.renderer.material = decal.material;

        if (decal.material == null || decal.sprite == null)
        {
            filter.mesh = null;
            return;
        }

        affectedObjects = GetAffectedObjects(decal.GetBounds(), decal.affectedLayers);
        foreach (GameObject go in affectedObjects)
        {
            DecalBuilder.BuildDecalForObject(decal, go);
        }
        DecalBuilder.Push(decal.pushDistance);

        Mesh mesh = DecalBuilder.CreateMesh();

        if (mesh != null)
        {
            mesh.name   = "DecalMesh";
            filter.mesh = mesh;
        }
    }
Exemple #3
0
    private void GenerateTag(GameObject baseObject, Transform baseTransform, Material decalMaterial, float scale, ref float depth)
    {
        GameObject decalContainer = new GameObject("DecalContainer")
        {
            layer = baseObject.layer
        };
        Transform decalContainerTransform = decalContainer.transform;

        decalContainerTransform.rotation = Random.rotation;
        decalContainerTransform.SetParent(baseTransform, false);

        GameObject decalObj = new GameObject("Decal")
        {
            layer = baseObject.layer
        };
        Transform decalTransform = decalObj.transform;

        float aspectRatio = (float)decalMaterial.mainTexture.height / decalMaterial.mainTexture.width;

        decalTransform.localScale = scale * new Vector3(0.1f, 0.1f * aspectRatio, 3.0f);
        // decalTransform.position -= new Vector3(0.0f, 0.0f, 1.5f);
        decalTransform.SetParent(decalContainerTransform, false);

        Decal decal = decalObj.AddComponent <Decal>();

        decal.maxAngle     = 60;
        decal.pushDistance = depth;
        decal.material     = decalMaterial;

        DecalBuilder.BuildAndSetDirty(decal, baseObject);
        depth += 0.0001f;
    }
Exemple #4
0
    void CreatePrefab()
    {
        // instantiate decal
        if (obj == null)
        {
            obj = Instantiate(ThisDecal, ThisDecal.transform.position, ThisDecal.transform.rotation, this.transform);
        }
        else if (tag == "Player")
        {
            if (obj != null)
            {
                Destroy(obj);
            }
            obj = Instantiate(ThisDecal, ThisDecal.transform.position, ThisDecal.transform.rotation, this.transform);
        }

        //decal implementation!!
        decal = obj.GetComponent <Decal>();
        if (decal) //if this obj has decal script
        {
            var filter = decal.GetComponent <MeshFilter>();
            var mesh   = filter.mesh;
            if (mesh != null)
            {
                mesh.name   = "DecalMesh";
                filter.mesh = mesh;
            }
            DecalBuilder.Build(decal);
        }
    }
Exemple #5
0
	public static DecalPolygon ClipPolygon (DecalPolygon poly, Plane plane)
	{
		bool[] positive = new bool[9];
		int positiveCount = 0;

		// Iterate through every vertex of the polygon <poly>.
		for (int i = 0; i < poly.vertices.Count; i++)
		{
			// Set if the current vertex is in the positive side of the plane.
			positive[i] = !plane.GetSide(poly.vertices[i]);

			if (positive[i])
				positiveCount++;
		}

		// If there are no vertices on the positive side of the plane, then
		// return null and cancel out the whole triangle polygon.
		if (positiveCount == 0)
			return null;

		// If all the vertices of the this triangle polygon are on the positive
		// side of the plane, just return the polygon as is. Nothing needs to be clipped.
		if (positiveCount == poly.vertices.Count)
			return poly;

		DecalPolygon tempPoly = new DecalPolygon();

		for (int i = 0; i < poly.vertices.Count; i++)
		{
			// <next> will start from the last vertex index and move towards the starting index.
			int next = i + 1;
			next %= poly.vertices.Count;

			// If the current vertex is within the positive side of the plane, then no clipping is needed.
			// So we just add it back to <tempPoly>.
			if (positive[i])
				tempPoly.vertices.Add(poly.vertices[i]);
			
			// If the current vertex and the next vertex are on oposite sides of the plane, then clipe them
			// so the plane and add the new clipped vertex.
			if (positive[i] != positive[next])
			{
				Vector3 v1 = poly.vertices[next];
				Vector3 v2 = poly.vertices[i];

				///Vector3 v = DecalBuilder.LineCast(plane, v1, v2);
				Vector3 v = DecalBuilder.LineCast(plane, v1, v2);

				// Add the new clipped vertex to <tempPoly>.
				tempPoly.vertices.Add(v);
			}
		}

		return tempPoly;
	}
Exemple #6
0
    // Try our best to determine how to apply our mesh.
    public void BuildDecal()
    {
        buildingMesh = true;
        // Clear whatever mesh we might have generated already.
        StartBuildMesh();
        // Separate our affected objects into moving and static objects.
        affectedObjects = GetAffectedObjects();
        List <GameObject> movingObjects = new List <GameObject> ();
        List <GameObject> staticObjects = new List <GameObject> ();

        foreach (GameObject obj in affectedObjects)
        {
            if (obj.GetComponent <Movable> () != null || obj.GetComponent <Rigidbody> () != null)
            {
                movingObjects.Add(obj);
            }
            else
            {
                staticObjects.Add(obj);
            }
        }
        foreach (GameObject obj in movingObjects)
        {
            BSPTree      affectedMesh = obj.GetComponent <BSPTree> ();
            DecalBuilder builder      = new DecalBuilder();
            builder.mat      = transform.worldToLocalMatrix * obj.transform.localToWorldMatrix;
            builder.position = affectedMesh.transform.InverseTransformPoint(transform.position);
            builder.scale    = (transform.lossyScale.magnitude / 2f) / affectedMesh.transform.lossyScale.magnitude;
            builder.tree     = affectedMesh;
            builder.offset   = offset * Random.Range(0.1f, 1f);
            builder.decal    = this;
            builder.target   = obj;
            builder.isStatic = false;
            builder.Start();
            jobs.Add(builder);
        }
        // Try building a mesh for each static object.
        foreach (GameObject obj in staticObjects)
        {
            BSPTree      affectedMesh = obj.GetComponent <BSPTree> ();
            DecalBuilder builder      = new DecalBuilder();
            builder.mat      = transform.worldToLocalMatrix * obj.transform.localToWorldMatrix;
            builder.position = affectedMesh.transform.InverseTransformPoint(transform.position);
            builder.scale    = (transform.lossyScale.magnitude / 2f) / affectedMesh.transform.lossyScale.magnitude;
            builder.tree     = affectedMesh;
            builder.offset   = offset * Random.Range(0.1f, 1f);
            builder.decal    = this;
            builder.target   = obj;
            builder.isStatic = true;
            builder.Start();
            jobs.Add(builder);
        }
    }
Exemple #7
0
 public void Build()
 {
     if (layer == DecalLayer.GROUND)
     {
         DecalBuilder.BuildAndSetDirty(this, EarthManager.Instance.CellsObj.ToArray());
     }
     else if (layer == DecalLayer.SEA)
     {
         DecalBuilder.BuildAndSetDirty(this, new GameObject[1] {
             GameObject.Find("Sea")
         });
     }
 }
Exemple #8
0
    public void GenerateTags(GameObject baseObject, int ammountOfTags)
    {
        Transform baseTransform = baseObject.transform;
        float     depth         = 0.0001f;

        for (int i = 0; i < ammountOfTags; i++)
        {
            GameObject decalContainer = new GameObject("DecalContainer_" + i)
            {
                layer = baseObject.layer
            };
            Transform decalContainerTransform = decalContainer.transform;

            decalContainerTransform.rotation = Random.rotation;
            decalContainerTransform.SetParent(baseTransform, false);

            GameObject decalObj = new GameObject("Decal")
            {
                layer = baseObject.layer
            };
            Transform decalTransform = decalObj.transform;

            int      idx = Random.Range(0, decalMaterials.Length);
            Material mat = decalMaterials[idx];

            float aspectRatio = (float)mat.mainTexture.height / mat.mainTexture.width;
            Debug.Log(mat.mainTexture.name + ", " + aspectRatio);

            decalTransform.localScale = new Vector3(0.1f, 0.1f * aspectRatio, 3.0f);
            decalTransform.position  -= new Vector3(0.0f, 0.0f, 1.5f);
            decalTransform.SetParent(decalContainerTransform, false);

            Decal decal = decalObj.AddComponent <Decal>();
            decal.maxAngle     = 60;
            decal.pushDistance = depth;
            decal.material     = mat;

            DecalBuilder.BuildAndSetDirty(decal, baseObject);

            depth += 0.0001f;
        }
    }
Exemple #9
0
    void CreatePrefab()
    {
        // instantiate decal

        GameObject obj = Instantiate(ThisDecal, ThisDecal.transform.position, ThisDecal.transform.rotation);

        //decal implementation!!
        var decal = obj.GetComponent <Decal>();

        if (decal)     //if this obj has decal script
        {
            var filter = decal.GetComponent <MeshFilter>();
            var mesh   = filter.mesh;
            if (mesh != null)
            {
                mesh.name   = "DecalMesh";
                filter.mesh = mesh;
            }
            DecalBuilder.Build(decal);
        }
    }
Exemple #10
0
        private static bool BuildDecal(GameObject decal, Bounds bounds, Texture2D texture)
        {
            MeshFilter filter = decal.GetComponent <MeshFilter>();

            if (filter == null)
            {
                filter = decal.gameObject.AddComponent <MeshFilter>();
            }
            if (decal.GetComponent <Renderer>() == null)
            {
                decal.gameObject.AddComponent <MeshRenderer>();
            }
            GameObject[] affectedObjects = GetAffectedObjects(bounds, (1 << LayerMask.NameToLayer("Player"))
                                                              | (1 << LayerMask.NameToLayer("Vehicle"))
                                                              /* | (1 << LayerMask.NameToLayer("Default"))*/
                                                              );
            foreach (GameObject go in affectedObjects)
            {
                DecalBuilder.BuildDecalForObject(decal, go, texture);
            }
            DecalBuilder.Push(0.009f);

            Mesh mesh = DecalBuilder.CreateMesh();

            if (mesh != null)
            {
                mesh.name   = "DecalMesh";
                filter.mesh = mesh;
                return(true);
            }
            else   /*创建失败*/
                   //if (decal != null) {
                   //    GameObject.Destroy(decal);
                   //}
            {
            }
            return(false);
        }
Exemple #11
0
    public void BuildDecal(List <GameObject> affectedObjects)
    {
        MeshFilter filter = GetComponent <MeshFilter>();

        if (filter == null)
        {
            filter = gameObject.AddComponent <MeshFilter>();
        }
        if (GetComponent <Renderer>() == null)
        {
            gameObject.AddComponent <MeshRenderer>();
        }

        GetComponent <Renderer>().material = material;
        if (material == null || sprite == null)
        {
            filter.mesh = null;
            return;
        }

        int len = affectedObjects.Count;

        for (int i = 0; i < len; i++)
        {
            DecalBuilder.BuildDecalForObject(this, affectedObjects[i]);
        }

        DecalBuilder.Push(pushDistance);

        Mesh mesh = DecalBuilder.CreateMesh();

        if (mesh != null)
        {
            mesh.name   = "DecalMesh";
            filter.mesh = mesh;
        }
    }
    void Start()
    {
        //initialise le mesh
        var decal = this.GetComponent <Decal>();

        if (decal)
        {
            var filter = decal.GetComponent <MeshFilter>();
            var mesh   = filter.mesh;
            if (mesh != null)
            {
                mesh.name   = "DecalMesh";
                filter.mesh = mesh;
            }
            DecalBuilder.Build(decal);
        }
        rend = GetComponent <MeshRenderer>();
        Color c = rend.material.color;

        c.a = 0f;
        rend.material.color = c;
        StartCoroutine("FadeIn");
        attente();
    }