Exemplo n.º 1
0
        // Render Loop
        public override void Process(IDictionary <int, Entity> entities)
        {
            foreach (Entity entity in entities.Values)
            {
                MeshRenderer meshRenderer = entity.GetComponent <MeshRenderer>();
                Transform    transform    = entity.GetComponent <Transform>();

                if (RenderConfig.enableFaceCulling)
                {
                    GL.Enable(EnableCap.CullFace);
                    GL.CullFace(RenderConfig.cullFaceMode);
                }
                else
                {
                    GL.Disable(EnableCap.CullFace);
                }

                if (RenderConfig.enableDepthClamp)
                {
                    GL.Enable(EnableCap.DepthClamp);
                }
                else
                {
                    GL.Disable(EnableCap.DepthClamp);
                }

                if (RenderConfig.enableDepthTest)
                {
                    GL.Enable(EnableCap.DepthTest);
                }
                else
                {
                    GL.Disable(EnableCap.DepthTest);
                }

                if (RenderConfig.smoothLines)
                {
                    GL.Enable(EnableCap.LineSmooth);
                    GL.Enable(EnableCap.Blend);
                    GL.BlendFunc(BlendingFactorSrc.SrcAlpha, BlendingFactorDest.OneMinusSrcAlpha);
                    GL.Hint(HintTarget.LineSmoothHint, HintMode.DontCare);
                }
                else
                {
                    GL.Disable(EnableCap.LineSmooth);
                    GL.Disable(EnableCap.Blend);
                }

                Matrix4 modelViewMat = transform.worldMat * RenderConfig.camera.ViewMatrix;

                if (meshRenderer.renderState.doClipping)
                {
                    if ((transform.AbsolutePosition() - RenderConfig.camera.Transform.Position).Length > meshRenderer.renderState.clipDistance)
                    {
                        meshRenderer.renderState.visible = false;
                    }

                    else
                    {
                        meshRenderer.renderState.visible = true;
                    }
                }
                if (meshRenderer.renderState.doBillBoarding)
                {
                    modelViewMat = Utils.Helper.BillboardMatrix(ref modelViewMat);
                }

                GL.FrontFace(meshRenderer.renderState.frontFaceMode);
                GL.PolygonMode(MaterialFace.Front, meshRenderer.renderState.polygonMode);
                GL.MatrixMode(MatrixMode.Modelview);
                GL.LoadMatrix(ref modelViewMat);

                // Renders the vbo if present
                meshRenderer.mesh.VBO.Render(meshRenderer.renderState);

                // Alternative rendering or behavior
                if (meshRenderer.render != null)
                {
                    meshRenderer.render();
                }
            }
        }