/// </inheritdoc> public override CommandBuffer TryRenderSplats(Queue <QueuedSplat> splatsToRender, out List <QueuedSplat> renderedSplats) { renderedSplats = new List <QueuedSplat>(); QueuedSplat splat = splatsToRender.Dequeue(); renderedSplats.Add(splat); // Set Shader Variables SplatSO data = splat.splatData; SplatSO.Frame frame = data.Frames[splat.frame]; splatMat.SetTexture("_Previous", splatMap); splatMat.SetTexture("_PaintMask", paintMask); splatMat.SetTexture("_Mask", frame.mask); splatMat.SetTexture("_Normal", frame.normal); splatMat.SetVector("_Anchor", data.Anchor); splatMat.SetVector("_Rotation", data.CalculateRotation(splat.projectileDir)); splatMat.SetVector("_Position", splat.worldPos); // Set Up Command Buffer CommandBuffer splatBuffer = new CommandBuffer(); splatBuffer.GetTemporaryRT(Shader.PropertyToID("_TEMPORARY"), dims.Width, dims.Height); splatBuffer.SetRenderTarget(Shader.PropertyToID("_TEMPORARY")); splatBuffer.DrawRenderer(renderer, splatMat); splatBuffer.Blit(Shader.PropertyToID("_TEMPORARY"), splatMap); return(splatBuffer); }
/// <summary> /// Queues a Splat up to be rendered. /// </summary> /// <param name="splatData">The SplatSO describing the splat.</param> /// <param name="worldPos">The world position to anchor the splat at.</param> /// <param name="projectileDir">The direction to splat in.</param> public void QueueNewSplat(SplatSO splatData, Vector3 worldPos, Vector2 projectileDir) { Splatter.QueuedSplat splat = new Splatter.QueuedSplat(); splat.splatData = splatData; splat.frame = 0; splat.worldPos = worldPos; splat.projectileDir = projectileDir; splatsToRender.Enqueue(splat); }
/// </inheritdoc> public override CommandBuffer TryRenderSplats(Queue <QueuedSplat> splatsToRender, out List <QueuedSplat> renderedSplats) { List <Texture2D> masks = new List <Texture2D>(); List <Texture2D> normals = new List <Texture2D>(); List <Vector4> anchors = new List <Vector4>(); // must be vec4 in order to set array List <Vector4> rotations = new List <Vector4>(); // must be vec4 in order to set array List <Vector4> positions = new List <Vector4>(); // must be vec4 in order to set array renderedSplats = new List <QueuedSplat>(); int count = 0; while (splatsToRender.Count > 0 && count++ < GoreManager.Instance.NumSplatsToRender) { // Queue Up Data QueuedSplat splat = splatsToRender.Dequeue(); SplatSO data = splat.splatData; SplatSO.Frame frame = data.Frames[splat.frame]; masks.Add(frame.mask); normals.Add(frame.normal); anchors.Add(data.Anchor); rotations.Add(data.CalculateRotation(splat.projectileDir)); positions.Add(splat.worldPos); renderedSplats.Add(splat); } // Set Shader Variables splatMat.SetTexture("_Previous", splatMap); splatMat.SetTexture("_PaintMask", paintMask); splatMat.SetTexture("_Masks", CreateTextureArray(masks, ref this.masks)); splatMat.SetTexture("_Normals", CreateTextureArray(normals, ref this.normals)); splatMat.SetVectorArray("_Anchors", anchors); splatMat.SetVectorArray("_Rotations", rotations); splatMat.SetVectorArray("_Positions", positions); splatMat.SetInt("_Count", count); // Set Up Command Buffer CommandBuffer splatBuffer = new CommandBuffer(); splatBuffer.GetTemporaryRT(Shader.PropertyToID("_TEMPORARY"), dims.Width, dims.Height); splatBuffer.SetRenderTarget(Shader.PropertyToID("_TEMPORARY")); splatBuffer.DrawRenderer(renderer, splatMat); splatBuffer.Blit(Shader.PropertyToID("_TEMPORARY"), splatMap); return(splatBuffer); }
private void QueueDirectionalSplat(Vector3 worldPos, Vector2 projectileDir) { Vector3 raycastDir = new Vector3(projectileDir.x, 0, projectileDir.y); RaycastHit[] collided = Physics.SphereCastAll(worldPos, sphereRadius, raycastDir, castDistance); if (collided.Length != 0) { #if UNITY_EDITOR if (debugSplats) { GameObject hitSphere = GameObject.CreatePrimitive(PrimitiveType.Capsule); hitSphere.transform.SetParent(debugMarkers.transform); hitSphere.transform.up = -raycastDir; hitSphere.transform.position = worldPos + raycastDir / 2F; hitSphere.transform.localScale = new Vector3(sphereRadius, castDistance, sphereRadius); hitSphere.GetComponent <Collider>().enabled = false; } #endif if (GoreEnabled) { SplatSO randomSplat = splats[Random.Range(0, splats.Length - 1)]; foreach (RaycastHit hit in collided) { Collider collider = hit.collider; GameObject obj = collider.gameObject; Splattable canSplat = obj.GetComponent <Splattable>(); if (canSplat) { canSplat.QueueNewSplat(randomSplat, worldPos, projectileDir); } } } } }