Ejemplo n.º 1
0
        protected override void OnRender(ViewportRenderingContext context, Component_RenderingPipeline.IFrameData frameData, ref Component_Image actualTexture)
        {
            var result = Result as CompiledDataSimple;

            //!!!!так?
            if (result == null)
            {
                return;
            }

            if (result.vertexProgram == null || result.fragmentProgram == null)
            {
                return;
            }

            //!!!!валится если файла нет. или не указан.
            //!!!!!!как быстро проверять о том что файла нет? может из кеша шейдеров или типа того. как тогда обновлять
            //string shaderFile = Shader;
            //if( string.IsNullOrEmpty( shaderFile ) )
            //	return;

            //!!!!formats. т.е. эффект поддерживает и LDR и HDR. где еще
            //!!!!!можно по сути у эффекта указывать что он ожидает получить на входе. ну или это EffectsHDR, EffectsLDR
            var outputTexture = context.RenderTarget2D_Alloc(actualTexture.Result.ResultSize, actualTexture.Result.ResultFormat);

            context.SetViewport(outputTexture.Result.GetRenderTarget().Viewports[0]);

            CanvasRenderer.ShaderItem shader = new CanvasRenderer.ShaderItem();
            shader.CompiledVertexProgram   = result.vertexProgram;
            shader.CompiledFragmentProgram = result.fragmentProgram;

            //shader.VertexProgramFileName = shaderFile;
            //shader.VertexProgramFunctionName = "main_vp";
            //shader.FragmentProgramFileName = shaderFile;
            //shader.FragmentProgramFunctionName = "main_fp";

            //{
            //	var defines = new List<GuiRenderer.ShaderItem.DefineItem>();

            //	//defines.Add( new GuiRenderer.ShaderItem.DefineItem( "FRAGMENT_CODE_BODY", "color = float4(0,1,0,1);" ) );

            //	if( defines.Count != 0 )
            //		shader.Defines = defines.ToArray();
            //}

            shader.Parameters.Set(new ViewportRenderingContext.BindTextureData(0 /*"sourceTexture"*/,
                                                                               actualTexture, TextureAddressingMode.Clamp, FilterOption.Point, FilterOption.Point, FilterOption.Point));
            //shader.Parameters.Set( "0"/*"sourceTexture"*/, new GpuMaterialPass.TextureParameterValue( actualTexture,
            //	TextureAddressingMode.Clamp, FilterOption.Point, FilterOption.Point, FilterOption.Point ) );

            var size = actualTexture.Result.ResultSize;

            shader.Parameters.Set("viewportSize", new Vector4(size.X, size.Y, 1.0 / (double)size.X, 1.0 / (double)size.Y).ToVector4F());

            //!!!!типы
            //bool, int, uint, dword, half, float, double
            //Vec2, Vec3, Vec4, VecxF, Mat2, 3, 4
            //Texture
            //Structs
            //arrays?
            //Structured Buffer
            //byte buffers

            //set shader parameters by properties
            foreach (var m in MetadataGetMembers())
            {
                var p = m as Metadata.Property;
                if (p != null)
                {
                    if (CanBeShaderParameter(this, p, out object value))
                    {
                        Component_Image texture = value as Component_Image;
                        if (texture != null)
                        {
                            foreach (Component_Image.BindSettingsAttribute attr in
                                     p.GetCustomAttributes(typeof(Component_Image.BindSettingsAttribute), true))
                            {
                                shader.Parameters.Set(new ViewportRenderingContext.BindTextureData(attr.SamplerIndex,
                                                                                                   texture, attr.AddressingMode, attr.FilteringMin, attr.FilteringMag, attr.FilteringMip));
                                break;
                            }

                            //GpuMaterialPass.TextureParameterValue textureValue = null;

                            //int samplerIndex = -1;

                            //foreach( Component_Image.BindSettingsAttribute attr in p.GetCustomAttributes(
                            //	typeof( Component_Image.BindSettingsAttribute ), true ) )
                            //{
                            //	textureValue = new GpuMaterialPass.TextureParameterValue( texture,
                            //		attr.AddressingMode, attr.FilteringMin, attr.FilteringMag, attr.FilteringMip );
                            //	samplerIndex = attr.SamplerIndex;
                            //	break;
                            //}

                            //if( samplerIndex != -1 )
                            //	shader.Parameters.Set( samplerIndex.ToString(), textureValue );
                        }
                        else
                        {
                            //!!!!
                            //convert to float type
                            value = SimpleTypes.ConvertDoubleToFloat(value);
                            //ColorValuePowered: convert to ColorValue
                            if (value is ColorValuePowered)
                            {
                                value = ((ColorValuePowered)value).ToColorValue();
                            }

                            shader.Parameters.Set(p.Name, value);
                            shader.Parameters.Set(ToLowerFirstCharacter(p.Name), value);
                        }
                    }
                }
            }

            OnSetShaderParameters(context, frameData, actualTexture, shader);
            SetShaderParametersEvent?.Invoke(this, context, shader);

            context.RenderQuadToCurrentViewport(shader);

            //change actual texture
            context.DynamicTexture_Free(actualTexture);
            actualTexture = outputTexture;
        }
        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

        protected override void OnRender(ViewportRenderingContext context, Component_RenderingPipeline.IFrameData frameData, ref Component_Image actualTexture)
        {
            var result = Result as CompiledDataCodeGenerated;

            //!!!!так?
            if (result == null)
            {
                return;
            }

            if (result.vertexProgram == null || result.fragmentProgram == null)
            {
                return;
            }

            //!!!!валится если файла нет. или не указан.
            //!!!!!!как быстро проверять о том что файла нет? может из кеша шейдеров или типа того. как тогда обновлять
            //string shaderFile = Shader;
            //if( string.IsNullOrEmpty( shaderFile ) )
            //	return;

            //!!!!formats. т.е. эффект поддерживает и LDR и HDR. где еще
            //!!!!!можно по сути у эффекта указывать что он ожидает получить на входе. ну или это EffectsHDR, EffectsLDR
            var outputTexture = context.RenderTarget2D_Alloc(actualTexture.Result.ResultSize, actualTexture.Result.ResultFormat);

            context.SetViewport(outputTexture.Result.GetRenderTarget().Viewports[0]);

            CanvasRenderer.ShaderItem shader = new CanvasRenderer.ShaderItem();
            shader.CompiledVertexProgram   = result.vertexProgram;
            shader.CompiledFragmentProgram = result.fragmentProgram;

            //shader.VertexProgramFileName = shaderFile;
            //shader.VertexProgramFunctionName = "main_vp";
            //shader.FragmentProgramFileName = shaderFile;
            //shader.FragmentProgramFunctionName = "main_fp";

            //{
            //	var defines = new List<GuiRenderer.ShaderItem.DefineItem>();

            //	//defines.Add( new GuiRenderer.ShaderItem.DefineItem( "FRAGMENT_CODE_BODY", "color = float4(0,1,0,1);" ) );

            //	if( defines.Count != 0 )
            //		shader.Defines = defines.ToArray();
            //}

            shader.Parameters.Set(new ViewportRenderingContext.BindTextureData(0 /*"sourceTexture"*/,
                                                                               actualTexture, TextureAddressingMode.Clamp, FilterOption.Point, FilterOption.Point, FilterOption.Point));
            //shader.Parameters.Set( "0"/*"sourceTexture"*/, new GpuMaterialPass.TextureParameterValue( actualTexture,
            //	TextureAddressingMode.Clamp, FilterOption.Point, FilterOption.Point, FilterOption.Point ) );

            unsafe
            {
                Vector4F value = Vector4F.One;
                if (!Color.ReferenceSpecified)
                {
                    value = Color.Value.ToVector4F();
                }
                shader.Parameters.Set("u_paramColor", ParameterType.Vector4, 1, &value, sizeof(Vector4F));
            }

            //!!!!пока так
            if (result.fragmentGeneratedCode != null)
            {
                //!!!!copy code из MaterialStandard

                //var materialParameters = materialData.GetShaderParameters();
                var code = result.fragmentGeneratedCode;

                //foreach( var code in codes )
                //{
                if (code.parameters != null)
                {
                    foreach (var item in code.parameters)
                    {
                        //!!!!надо ссылки сконвертить или как-то так? чтобы работало, если это в типе

                        var value = item.component.GetValue();
                        if (value != null)
                        {
                            //!!!!
                            //convert to float type
                            value = SimpleTypes.ConvertDoubleToFloat(value);
                            //ColorValuePowered: convert to ColorValue
                            if (value is ColorValuePowered)
                            {
                                value = ((ColorValuePowered)value).ToColorValue();
                            }

                            shader.Parameters /*container*/.Set(item.nameInShader, value);
                        }
                    }
                }

                if (code.textures != null)
                {
                    foreach (var item in code.textures)
                    {
                        //!!!!надо ссылки сконвертить или как-то так? чтобы работало, если это в типе

                        //!!!!не только 2D

                        Component_Image texture = item.component.Texture;
                        if (texture == null)
                        {
                            texture = ResourceUtility.WhiteTexture2D;
                        }

                        //!!!!options

                        shader.Parameters.Set(new ViewportRenderingContext.BindTextureData(item.textureRegister,
                                                                                           texture, TextureAddressingMode.Wrap, FilterOption.Linear, FilterOption.Linear, FilterOption.Linear));

                        ////!!!!
                        //var textureValue = new GpuMaterialPass.TextureParameterValue( texture,
                        //	TextureAddressingMode.Wrap, FilterOption.Linear, FilterOption.Linear, FilterOption.Linear );
                        ////!!!!
                        //ParameterType parameterType = ParameterType.Texture2D;

                        //shader.Parameters/*container*/.Set( item.textureRegister.ToString(), textureValue, parameterType );
                        ////shader.Parameters/*container*/.Set( item.nameInShader, textureValue, parameterType );
                    }
                }
                //}
            }

            var size = actualTexture.Result.ResultSize;

            shader.Parameters.Set("viewportSize", new Vector4(size.X, size.Y, 1.0 / (double)size.X, 1.0 / (double)size.Y).ToVector4F());

            shader.Parameters.Set("intensity", (float)Intensity.Value);

            //!!!!auto parameters
            //if( result.fragmentGeneratedCode != null )
            {
                //!!!!не так потом

                shader.Parameters.Set("param_viewportSize", new Vector2F(size.X, size.Y));

                //foreach( var item in result.fragmentGeneratedCode.autoConstantParameters )
                //{
                //}
            }

            context.RenderQuadToCurrentViewport(shader);

            //change actual texture
            context.DynamicTexture_Free(actualTexture);
            actualTexture = outputTexture;
        }