Exemple #1
0
        public void OnDrawFrame(IGL10 gl)
        {
            // Move
            ShellViewModel.Animate();

            mLightDir[0] = -0.5f; mLightDir[1] = -1.0f; mLightDir[2] = -0.5f;                   // in left-handed region
            Vector.normalize(mLightDir);

            mRT["screen"].switchTargetFrameBuffer();
            GLES20.GlClear(GL10.GlColorBufferBit | GL10.GlDepthBufferBit);

            ////////////////////////////////////////////////////////////////////
            //// draw models
            ShellViewModel.LockWith(() => {
                foreach (var shell in ShellViewModel.Shells)
                {
                    if (shell.Loaded)
                    {
                        foreach (var rs in shell.RenderSets)
                        {
                            mRT[rs.target].switchTargetFrameBuffer();
                            GLSL glsl = mGLSL[rs.shader];

                            GLES20.GlUseProgram(glsl.mProgram);

                            // Projection Matrix
                            GLES20.GlUniformMatrix4fv(glsl.muPMatrix, 1, false, ShellViewModel.ProjectionMatrix, 0);

                            // LightPosition
                            GLES20.GlUniform3fv(glsl.muLightDir, 1, mLightDir, 0);

                            bindBuffer(shell.Surface, glsl);
                            if (!rs.shader.EndsWith("alpha"))
                            {
                                drawNonAlpha(shell.Surface, glsl);
                                drawAlpha(shell.Surface, glsl, false);
                            }
                            else
                            {
                                drawAlpha(shell.Surface, glsl, true);
                            }
                        }
                    }
                }
            });

            GLES20.GlFlush();
            checkGlError(TAG);
        }