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