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; }
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; }
/// <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; }
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); } }
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)); } }
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; }
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); }
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; } }
public abstract void SetData(ConstantBufferDataProvider dataProvider);
public void ApplyPerObjectInput(ConstantBufferDataProvider dataProvider) { ConstantBindings.ApplyPerObjectInput(dataProvider); }
public ChangeableProvider(ConstantBufferDataProvider dataProvider) { _dataProvider = dataProvider; DataSizeInBytes = dataProvider.DataSizeInBytes; dataProvider.DataChanged += OnParentDataChanged; }
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); } } }
public void ApplyPerObjectInput(ConstantBufferDataProvider dataProvider) { _perObjectBindings[0].SetData(dataProvider); }
public OpenGLConstantBuffer(ConstantBufferDataProvider dataProvider) : base(BufferTarget.UniformBuffer) { dataProvider.SetData(this); }
public override void SetData(ConstantBufferDataProvider dataProvider) { dataProvider.SetData(StorageAdapter); }
public GlobalBindingPair(UniformBinding binding, ConstantBufferDataProvider dataProvider) { Binding = binding; DataProvider = dataProvider; }
public MaterialGlobalInputElement(string name, MaterialInputType type, ConstantBufferDataProvider dataProvider) : base(name, type) { DataProvider = dataProvider; UseGlobalNamedBuffer = false; }