public int RayCast(Ray ray, List <RayCastHit <T> > hits, RayCastFilter <T> filter) { if (hits == null) { throw new ArgumentNullException(nameof(hits)); } return(_currentRoot.RayCast(ray, hits, filter)); }
public GraphicsSystem(OpenTKWindow window, float renderQuality = 1f, GraphicsBackEndPreference backEndPreference = GraphicsBackEndPreference.None) { if (window == null) { throw new ArgumentNullException(nameof(window)); } bool preferOpenGL = backEndPreference == GraphicsBackEndPreference.OpenGL || !RuntimeInformation.IsOSPlatform(OSPlatform.Windows); _window = window; Context = CreatePlatformDefaultContext(window, preferOpenGL); Context.ResourceFactory.AddShaderLoader(new EmbeddedResourceShaderLoader(typeof(GraphicsSystem).GetTypeInfo().Assembly)); MaterialCache = new MaterialCache(this); BufferCache = new BufferCache(this); ShadowMapStage = new ShadowMapStage(Context); _upscaleStage = new UpscaleStage(Context, "Upscale", null, null); _standardStage = new StandardPipelineStage(Context, "Standard"); _alphaBlendStage = new StandardPipelineStage(Context, "AlphaBlend"); _alphaBlendStage.Comparer = new FarToNearIndexComparer(); _overlayStage = new StandardPipelineStage(Context, "Overlay"); _pipelineStages = new PipelineStage[] { ShadowMapStage, _standardStage, _alphaBlendStage, _upscaleStage, _overlayStage, }; _renderer = new Renderer(Context, _pipelineStages); SetPreupscaleQuality(renderQuality); // Placeholder providers so that materials can bind to them. Context.RegisterGlobalDataProvider("ViewMatrix", s_identityProvider); Context.RegisterGlobalDataProvider("ProjectionMatrix", s_identityProvider); Context.RegisterGlobalDataProvider("CameraInfo", s_noCameraProvider); Context.RegisterGlobalDataProvider("LightBuffer", s_noLightProvider); Context.RegisterGlobalDataProvider("PointLights", _pointLightsProvider); window.Resized += OnWindowResized; _freeShapeRenderer = new ManualWireframeRenderer(Context, RgbaFloat.Pink); _freeShapeRenderer.Topology = PrimitiveTopology.LineList; AddFreeRenderItem(_freeShapeRenderer); _mainThreadID = Environment.CurrentManagedThreadId; _taskScheduler = new GraphicsSystemTaskScheduler(_mainThreadID); _rayCastFilterFunc = RayCastFilter; }
public int RayCast(Ray ray, List <RayCastHit <T> > hits, RayCastFilter <T> filter) { if (!ray.Intersects(Bounds)) { return(0); } else { int numHits = 0; foreach (OctreeItem <T> item in _items) { if (ray.Intersects(item.Bounds)) { numHits += filter(ray, item.Item, hits); } } foreach (var child in Children) { numHits += child.RayCast(ray, hits, filter); } return(numHits); } }
public int RayCast(Ray ray, List <RayCastHit <T> > hits, RayCastFilter <T> filter) { return(_currentRoot.RayCast(ray, hits, filter)); }