Esempio n. 1
0
            public PreviewModel(
                VertexBuffer vb,
                IndexBuffer ib,
                int elementCount,
                Material regularMaterial,
                Material shadowmapMaterial,
                ConstantBuffer worldBuffer,
                DynamicDataProvider <Matrix4x4> worldProvider,
                ConstantBuffer inverseTransposeWorldBuffer,
                Dictionary <string, ConstantBuffer> buffersDict,
                ShaderTextureBinding surfaceTextureBinding
                )
            {
                _vb                   = vb;
                _ib                   = ib;
                _elementCount         = elementCount;
                _regularMaterial      = regularMaterial;
                _shadowmapMaterial    = shadowmapMaterial;
                _worldProvider        = worldProvider;
                _inverseWorldProvider = new DependantDataProvider <Matrix4x4>(worldProvider, Utilities.CalculateInverseTranspose);
                _textureBinding       = surfaceTextureBinding;

                _worldBuffer = worldBuffer;
                _inverseTransposeWorldBuffer = inverseTransposeWorldBuffer;
                _buffersDict = buffersDict;
            }
Esempio n. 2
0
File: Skybox.cs Progetto: zhuowp/ge
        public void InitializeContextObjects(AssetDatabase ad, RenderContext rc)
        {
            var factory = rc.ResourceFactory;

            _vb = factory.CreateVertexBuffer(s_vertices.Length * VertexPosition.SizeInBytes, false);
            _vb.SetVertexData(s_vertices, new VertexDescriptor(VertexPosition.SizeInBytes, 1, 0, IntPtr.Zero));

            _ib = factory.CreateIndexBuffer(s_indices.Length * sizeof(int), false);
            _ib.SetIndices(s_indices);

            _material = rc.ResourceFactory.CreateMaterial(rc, "skybox-vertex", "skybox-frag",
                                                          new MaterialVertexInput(12,
                                                                                  new MaterialVertexInputElement("in_position", VertexSemanticType.Position, VertexElementFormat.Float3)),
                                                          new MaterialInputs <MaterialGlobalInputElement>(
                                                              new MaterialGlobalInputElement("ProjectionMatrixBuffer", MaterialInputType.Matrix4x4, "ProjectionMatrix")),
                                                          new MaterialInputs <MaterialPerObjectInputElement>(
                                                              new MaterialPerObjectInputElement("ViewMatrixBuffer", MaterialInputType.Matrix4x4, 16)),
                                                          new MaterialTextureInputs(new ManualTextureInput("Skybox")));

            _perObjectInput = rc.GetNamedGlobalBufferProviderPair("ViewMatrix").DataProvider;

            RecreateCubemapTexture();

            _rasterizerState   = factory.CreateRasterizerState(FaceCullingMode.None, TriangleFillMode.Solid, false, false);
            _depthStencilState = factory.CreateDepthStencilState(true, DepthComparison.LessEqual, false);
            _initialized       = true;
        }
Esempio n. 3
0
 /// <summary>
 /// Constructs a <see cref="DependantDataProvider{T}"/> which provides data derived from the given provider.
 /// </summary>
 /// <param name="dataProvider">The parent provider to base data on.</param>
 /// <param name="derivedFunc">The function used to derive data from the parent.</param>
 public DependantDataProvider(ConstantBufferDataProvider <T> dataProvider, Func <T, T> derivedFunc)
 {
     _dataProvider             = dataProvider;
     DataSizeInBytes           = dataProvider.DataSizeInBytes;
     _derivedFunc              = derivedFunc;
     dataProvider.DataChanged += OnParentDataChanged;
 }
Esempio n. 4
0
 public BufferProviderPair(ConstantBuffer buffer, ConstantBufferDataProvider provider)
 {
     ConstantBuffer        = buffer;
     DataProvider          = provider;
     provider.DataChanged += OnDataChanged;
     _dirty = true;
     UpdateData();
 }
        public static ConstantBufferDataProvider <T> GetProvider <T>(string name)
        {
            ConstantBufferDataProvider provider = GetProvider(name);

            if (!(provider is ConstantBufferDataProvider <T> typedProvider))
            {
                throw new InvalidOperationException(
                          $"The provider registered to name {name} is not a provider of type {typeof(T).Name}.");
            }

            return(typedProvider);
        }
        public void ApplyPerObjectInput(ConstantBufferDataProvider dataProvider)
        {
            if (_perObjectBufferBindings.Length != 1)
            {
                throw new InvalidOperationException(
                          "ApplyPerObjectInput can only be used when a material has exactly one per-object input.");
            }

            PerObjectConstantBufferBinding binding = _perObjectBufferBindings[0];

            dataProvider.SetData(binding.ConstantBuffer);
        }
        public static void RegisterGlobalDataProvider(string name, ConstantBufferDataProvider provider)
        {
            if (_rc == null)
            {
                throw new InvalidOperationException("No RenderContext set on SharedDataProviders.");
            }

            Entry entry = new Entry();

            entry.Provider = provider;
            entry.Buffer   = _rc.ResourceFactory.CreateConstantBuffer(provider.DataSizeInBytes);

            s_entries.Add(name, entry);
        }
        public void ApplyPerObjectInputs(ConstantBufferDataProvider[] dataProviders)
        {
            if (_perObjectBufferBindings.Length != dataProviders.Length)
            {
                throw new InvalidOperationException(
                          "dataProviders must contain the exact number of per-object buffer bindings used in the material.");
            }

            for (int i = 0; i < _perObjectBufferBindings.Length; i++)
            {
                PerObjectConstantBufferBinding binding  = _perObjectBufferBindings[i];
                ConstantBufferDataProvider     provider = dataProviders[i];
                provider.SetData(binding.ConstantBuffer);
            }
        }
Esempio n. 9
0
        public void RegisterGlobalDataProvider(string name, ConstantBufferDataProvider provider)
        {
            BufferProviderPair pair;

            if (_bufferProviderPairs.TryGetValue(name, out pair))
            {
                ChangeableProvider changeable = (ChangeableProvider)pair.DataProvider;
                changeable.DataProvider = provider;
            }
            else
            {
                var constantBuffer = ResourceFactory.CreateConstantBuffer(provider.DataSizeInBytes);
                var newProvider    = provider is ChangeableProvider ? provider : new ChangeableProvider(provider);
                _bufferProviderPairs.Add(name, new BufferProviderPair(constantBuffer, newProvider));
            }
        }
Esempio n. 10
0
 public PreviewModel(
     VertexBuffer vb,
     IndexBuffer ib,
     int elementCount,
     Material regularMaterial,
     Material shadowmapMaterial,
     DynamicDataProvider <Matrix4x4> worldProvider,
     ShaderTextureBinding surfaceTextureBinding = null)
 {
     _vb                   = vb;
     _ib                   = ib;
     _elementCount         = elementCount;
     _regularMaterial      = regularMaterial;
     _shadowmapMaterial    = shadowmapMaterial;
     _worldProvider        = worldProvider;
     _inverseWorldProvider = new DependantDataProvider <Matrix4x4>(worldProvider, Utilities.CalculateInverseTranspose);
     _perObjectInputs      = new ConstantBufferDataProvider[] { _worldProvider, _inverseWorldProvider };
     _textureBinding       = surfaceTextureBinding;
 }
Esempio n. 11
0
        public void ChangeRenderContext(AssetDatabase ad, RenderContext rc)
        {
            var factory = rc.ResourceFactory;

            _vb = factory.CreateVertexBuffer(s_vertices.Length * VertexPosition.SizeInBytes, false);
            _vb.SetVertexData(s_vertices, new VertexDescriptor(VertexPosition.SizeInBytes, 1, 0, IntPtr.Zero));

            _ib = factory.CreateIndexBuffer(s_indices.Length * sizeof(int), false);
            _ib.SetIndices(s_indices);

            _material = ad.LoadAsset <MaterialAsset>("MaterialAsset/Skybox.json").Create(ad, rc);

            var viewProvider = (ConstantBufferDataProvider <Matrix4x4>)((ChangeableProvider)rc.GetNamedGlobalBufferProviderPair("ViewMatrix").DataProvider).DataProvider;

            _perObjectInput = new DependantDataProvider <Matrix4x4>(
                viewProvider,
                Utilities.ConvertToMatrix3x3);

            using (var frontPin = _front.Pixels.Pin())
                using (var backPin = _back.Pixels.Pin())
                    using (var leftPin = _left.Pixels.Pin())
                        using (var rightPin = _right.Pixels.Pin())
                            using (var topPin = _top.Pixels.Pin())
                                using (var bottomPin = _bottom.Pixels.Pin())
                                {
                                    var cubemapTexture = factory.CreateCubemapTexture(
                                        frontPin.Ptr,
                                        backPin.Ptr,
                                        leftPin.Ptr,
                                        rightPin.Ptr,
                                        topPin.Ptr,
                                        bottomPin.Ptr,
                                        _front.Width,
                                        _front.Height,
                                        _front.PixelSizeInBytes,
                                        _front.Format);
                                    _cubemapBinding = factory.CreateShaderTextureBinding(cubemapTexture);
                                }

            _rasterizerState = factory.CreateRasterizerState(FaceCullingMode.None, TriangleFillMode.Solid, false, false);
        }
Esempio n. 12
0
 public void Render(TextureAtlas atlas, ConstantBufferDataProvider offsetProvider)
 {
     if (_vb != null) // If the VertexBuffer hasn't been created, then no text has been appended yet.
     {
         var previousDSS = _rc.DepthStencilState;
         _rc.DepthStencilState = _dss;
         var previousBlendState = _rc.BlendState;
         _rc.VertexBuffer            = _vb;
         _rc.IndexBuffer             = _ib;
         _rc.Material                = _material;
         _screenOrthoProjection.Data = Matrix4x4.CreateOrthographicOffCenter(0, _rc.Window.Width, _rc.Window.Height, 0, -1f, 1f);
         _providers[1]               = offsetProvider;
         _providers[2]               = atlas.AtlasInfo;
         _material.ApplyPerObjectInputs(_providers);
         _rc.SetTexture(0, atlas.TextureBinding);
         _rc.BlendState = _rc.AlphaBlend;
         _rc.DrawIndexedPrimitives(_characterCount * 6, 0);
         _rc.BlendState        = previousBlendState;
         _rc.DepthStencilState = previousDSS;
     }
 }
Esempio n. 13
0
 public abstract void SetData(ConstantBufferDataProvider dataProvider);
Esempio n. 14
0
 public void ApplyPerObjectInput(ConstantBufferDataProvider dataProvider)
 {
     ConstantBindings.ApplyPerObjectInput(dataProvider);
 }
Esempio n. 15
0
 public ChangeableProvider(ConstantBufferDataProvider dataProvider)
 {
     _dataProvider             = dataProvider;
     DataSizeInBytes           = dataProvider.DataSizeInBytes;
     dataProvider.DataChanged += OnParentDataChanged;
 }
Esempio n. 16
0
        public OpenGLShaderConstantBindings(
            RenderContext rc,
            ShaderSet shaderSet,
            MaterialInputs <MaterialGlobalInputElement> globalInputs,
            MaterialInputs <MaterialPerObjectInputElement> perObjectInputs)
        {
            var programID         = ((OpenGLShaderSet)shaderSet).ProgramID;
            int globalInputsCount = globalInputs.Elements.Length;
            int bindingIndex      = 0;

            _globalUniformBindings = new GlobalBindingPair[globalInputsCount];
            for (int i = 0; i < globalInputsCount; i++)
            {
                var element = globalInputs.Elements[i];

                ConstantBufferDataProvider dataProvider = element.UseGlobalNamedBuffer
                    ? rc.GetNamedGlobalBufferProviderPair(element.GlobalProviderName).DataProvider
                    : element.DataProvider;
                int blockIndex = GL.GetUniformBlockIndex(programID, element.Name);
                if (blockIndex != -1)
                {
                    ValidateBlockSize(programID, blockIndex, dataProvider.DataSizeInBytes, element.Name);
                    _globalUniformBindings[i] = new GlobalBindingPair(
                        new UniformBlockBinding(
                            programID,
                            blockIndex,
                            bindingIndex,
                            new OpenGLConstantBuffer(dataProvider),
                            dataProvider.DataSizeInBytes),
                        dataProvider);
                    bindingIndex += 1;
                }
                else
                {
                    int uniformLocation = GL.GetUniformLocation(programID, element.Name);
                    if (uniformLocation == -1)
                    {
                        throw new InvalidOperationException($"No uniform or uniform block with name {element.Name} was found.");
                    }

                    _globalUniformBindings[i] = new GlobalBindingPair(
                        new UniformLocationBinding(
                            programID,
                            uniformLocation),
                        dataProvider);
                }
            }

            int perObjectInputsCount = perObjectInputs.Elements.Length;

            _perObjectBindings = new UniformBinding[perObjectInputsCount];
            for (int i = 0; i < perObjectInputsCount; i++)
            {
                var element = perObjectInputs.Elements[i];

                int blockIndex = GL.GetUniformBlockIndex(programID, element.Name);
                if (blockIndex != -1)
                {
                    _perObjectBindings[i] = new UniformBlockBinding(
                        programID,
                        blockIndex,
                        bindingIndex,
                        new OpenGLConstantBuffer(),
                        element.BufferSizeInBytes);
                    bindingIndex += 1;
                }
                else
                {
                    int uniformLocation = GL.GetUniformLocation(programID, element.Name);
                    if (uniformLocation == -1)
                    {
                        throw new InvalidOperationException($"No uniform or uniform block with name {element.Name} was found.");
                    }

                    _perObjectBindings[i] = new UniformLocationBinding(
                        programID,
                        uniformLocation);
                }
            }
        }
Esempio n. 17
0
 public void ApplyPerObjectInput(ConstantBufferDataProvider dataProvider)
 {
     _perObjectBindings[0].SetData(dataProvider);
 }
 public OpenGLConstantBuffer(ConstantBufferDataProvider dataProvider) : base(BufferTarget.UniformBuffer)
 {
     dataProvider.SetData(this);
 }
Esempio n. 19
0
 public override void SetData(ConstantBufferDataProvider dataProvider)
 {
     dataProvider.SetData(StorageAdapter);
 }
Esempio n. 20
0
 public GlobalBindingPair(UniformBinding binding, ConstantBufferDataProvider dataProvider)
 {
     Binding      = binding;
     DataProvider = dataProvider;
 }
Esempio n. 21
0
 public MaterialGlobalInputElement(string name, MaterialInputType type, ConstantBufferDataProvider dataProvider)
     : base(name, type)
 {
     DataProvider         = dataProvider;
     UseGlobalNamedBuffer = false;
 }