public void RaysPhase_Test() { var microphone = new List <MicrophoneSphere>() { new MicrophoneSphere(new System.Numerics.Vector3(2, 1.6f, 1.7f), 0.1f) }; var rayGeometryGenerator = new RayGeometry(new Vector3(0, 0.5f, 0), microphone, 1000, 3, 200); rayGeometryGenerator.GenerateRays(); var rays = rayGeometryGenerator.GetIntersectedRays(microphone[0]); rays.Sort((first, second) => first.GetDistance().CompareTo(second.GetDistance())); var myRays = new Dictionary <int, List <AcousticRay> >(); myRays.Add(microphone[0].Id, rays); var intensityCalculator = new IntensityCalculator(myRays, microphone, 1); intensityCalculator.ComputePower(); var phaseCalculator = new PhaseCalculator(myRays, microphone, intensityCalculator.Intensities); phaseCalculator.ComputePhase(1000); double epsilon = 1e-4; Assert.IsTrue(Math.Abs(phaseCalculator.EchogramMagnitudePhase[microphone[0].Id][0].Real + 0.002589105375) < epsilon); }
public void ComputeIntensityForDirectRay_Test() { var microphone = new List <MicrophoneSphere>() { new MicrophoneSphere(new System.Numerics.Vector3(0, 0, 1.976f), 0.1f) }; var rayGeometryGenerator = new RayGeometry(new Vector3(0, 0, 0), microphone, 3, 3, 200); rayGeometryGenerator.GenerateRays(); var rays = rayGeometryGenerator.GetIntersectedRays(microphone[0]); rays.Sort((first, second) => first.GetDistance().CompareTo(second.GetDistance())); var myRays = new Dictionary <int, List <AcousticRay> >(); myRays.Add(microphone[0].Id, rays); var intensityCalculator = new IntensityCalculator(myRays, microphone, 1); intensityCalculator.ComputePower(); Assert.IsTrue(Math.Abs(intensityCalculator.Intensities[microphone[0].Id][0] - 0.02038056768) < 1e-3); }
public void ZeroIntersectedRaysWithCollision_Test() { var microphone = new List <MicrophoneSphere>() { new MicrophoneSphere(new System.Numerics.Vector3(2, 1.3f, 1.7f), 0.1f) }; var rayGeometryGenerator = new RayGeometry(new Vector3(0, 0, 0), microphone, 2, 3, 200); rayGeometryGenerator.GenerateRays(); var newRays = rayGeometryGenerator.GetIntersectedRays(microphone[0]); newRays.Sort((first, second) => first.GetDistance().CompareTo(second.GetDistance())); Assert.IsTrue(newRays.Count == 1); }
static void Main(string[] args) { Engine.AppName = "Test"; Engine.EnableValidation = true; Engine.RebuildShaders = true; Engine.Initialize(); var graph = new FrameGraph(0); Engine.RenderGraph = graph; int trace_side = 1024; var objLoaderFactory = new ObjLoaderFactory(); var objLoader = objLoaderFactory.Create(); using (var fs = File.OpenRead("sponza.obj")) { var obj_loaded = objLoader.Load(fs); ulong idxCount = 0; for (int i = 0; i < obj_loaded.Groups.Count; i++) { idxCount += (ulong)obj_loaded.Groups[i].Faces.Count * 3; } vertexBuffer = new StreamableBuffer("vbo", (ulong)obj_loaded.Vertices.Count * 3 * sizeof(float), BufferUsage.Storage); indexBuffer = new StreamableBuffer("ibo", idxCount * sizeof(uint), BufferUsage.Index | BufferUsage.Storage); rayIntersections = new RayIntersections("rayInter", (uint)trace_side * (uint)trace_side, 0); geometry = new RayGeometry("rayGeom", (uint)obj_loaded.Vertices.Count); unsafe { float *fp = (float *)vertexBuffer.BeginBufferUpdate(); for (int i = 0; i < obj_loaded.Vertices.Count; i++) { fp[0] = obj_loaded.Vertices[i].X; fp[1] = obj_loaded.Vertices[i].Y; fp[2] = obj_loaded.Vertices[i].Z; fp += 3; } vertexBuffer.EndBufferUpdate(); uint *ui = (uint *)indexBuffer.BeginBufferUpdate(); for (int i = 0; i < obj_loaded.Groups.Count; i++) { for (int j = 0; j < obj_loaded.Groups[i].Faces.Count; j++) { ui[0] = (uint)(obj_loaded.Groups[i].Faces[j][0].VertexIndex - 1); ui[1] = (uint)(obj_loaded.Groups[i].Faces[j][1].VertexIndex - 1); ui[2] = (uint)(obj_loaded.Groups[i].Faces[j][2].VertexIndex - 1); ui += 3; } } indexBuffer.EndBufferUpdate(); float *rp = (float *)rayIntersections.RayBuffer.BeginBufferUpdate(); for (uint x = 0; x < trace_side; x++) { for (uint y = 0; y < trace_side; y++) { //uint i = 0; //for(int j = 0; j < 15; j++) //{ // i |= ((x & (1u << j)) << j) | ((y & (1u << j)) << (j + 1)); //} //i *= 8; uint i = ((uint)trace_side * y + x) * 8; rp[i + 0] = 0.0f; rp[i + 1] = 15.0f; rp[i + 2] = 0.0f; rp[i + 4] = -1.0f; rp[i + 5] = -1.0f + (2.0f / trace_side) * y; rp[i + 6] = -1.0f + (2.0f / trace_side) * x; rp[i + 3] = 0.001f; rp[i + 7] = 100000.0f; } } rayIntersections.RayBuffer.EndBufferUpdate(); geometry.SetupBuild(0, (uint)(idxCount / 3), vertexBuffer.LocalBuffer, 0, indexBuffer.LocalBuffer, 0, false); } } vertS = new SpecializedShader() { Name = "FST_Vert", Shader = ShaderSource.Load(ShaderType.VertexShader, "FullScreenTriangle/vertex.glsl"), SpecializationData = null }; fragS = new SpecializedShader() { Name = "UVR_Frag", Shader = ShaderSource.Load(ShaderType.FragmentShader, "FullScreenTriangle/clear_frag.glsl"), SpecializationData = null, }; depthImages = new Image[GraphicsDevice.MaxFramesInFlight]; depthImageViews = new ImageView[GraphicsDevice.MaxFramesInFlight]; for (int i = 0; i < GraphicsDevice.MaxFramesInFlight; i++) { depthImages[i] = new Image($"depthImage_{i}") { Cubemappable = false, Width = GraphicsDevice.Width, Height = GraphicsDevice.Height, Depth = 1, Dimensions = 2, InitialLayout = ImageLayout.Undefined, Layers = 1, Levels = 1, MemoryUsage = MemoryUsage.GpuOnly, Usage = ImageUsage.DepthAttachment | ImageUsage.Sampled, Format = ImageFormat.Depth32f, }; depthImages[i].Build(0); depthImageViews[i] = new ImageView($"depthImageView_{i}") { BaseLayer = 0, BaseLevel = 0, Format = ImageFormat.Depth32f, LayerCount = 1, LevelCount = 1, ViewType = ImageViewType.View2D, }; depthImageViews[i].Build(depthImages[i]); } Engine.OnRebuildGraph += Engine_OnRebuildGraph; Engine.OnRender += Engine_OnRender; Engine.OnUpdate += Engine_OnUpdate; Engine.Start(0); }