public void Render(ICamera camera, ICamera lodCamera, Vector3d lightPosition) { var transformation = new Matrix4d( new Vector4d(1, 0, 0, 0), new Vector4d(0, 0, 1, 0), new Vector4d(0, 1, 0, 1), new Vector4d(0, 0, 0, 1)); var visibleChunks = _chunkedLod.Calculate( _tree, lodCamera.Width, lodCamera.HorizontalFieldOfView, Vector3d.Transform(lodCamera.Position, transformation), 30, FrustumPlaneExtractor.ExtractRowMajor(transformation * lodCamera.ComputeCameraMatrix() * lodCamera.ComputeProjectionMatrix())); GL.ClearColor(Color4.White); GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); GL.Enable(EnableCap.DepthTest); GL.CullFace(CullFaceMode.Back); GL.Enable(EnableCap.CullFace); GL.FrontFace(FrontFaceDirection.Cw); _simpleMaterial.Bind(); _simpleMaterial.ProjectionMatrix.Set(camera.ComputeProjectionMatrix().ToMatrix4()); _simpleMaterial.ViewMatrix.Set(camera.ComputeCameraMatrix().ToMatrix4()); _simpleMaterial.LightDirection.Set(new Vector3(1, 1, 0).Normalized()); _simpleMaterial.Color.Set(new Vector4(0.9f, 0.9f, 0.9f, 1.0f)); foreach (var chunkedLodTreeNode in visibleChunks) { var renderableMesh = _cache.GetRenderable(chunkedLodTreeNode.Bounds); if (renderableMesh == null) { continue; } renderableMesh.CreateVAO(); renderableMesh.VertexArrayObject.Bind(); var bounds = chunkedLodTreeNode.Bounds; var translation = Matrix4.CreateTranslation((float)bounds.Center.X, 0, (float)bounds.Center.Y); var delta = bounds.Max - bounds.Min; var scale = Matrix4.CreateScale((float)delta.X, 1, (float)delta.Y); var modelMatrix = scale * translation; _simpleMaterial.ModelMatrix.Set(modelMatrix); _simpleMaterial.NormalToWorld3x3.Set(Matrix3.Identity); _simpleMaterial.LightPosition.Set((Vector3)lightPosition); GL.DrawElements(BeginMode.Triangles, renderableMesh.Faces * 3, DrawElementsType.UnsignedInt, 0); renderableMesh.VertexArrayObject.Unbind(); } _simpleMaterial.Unbind(); }
public void Update(double elapsedTime, EntityManager entityManager) { if (_root == null) { _root = CreateNode(new Box3D(new Vector3d(-100, 0, -100f), new Vector3d(100f, 0, 100f)), 6, entityManager); } _frustumPlanes = FrustumPlaneExtractor.ExtractRowMajor(_camera); var k = _camera.Width / (Math.Tan(_camera.HorizontalFieldOfView / 2)); ComputeLod(_root, k, entityManager); }