public void AssignShader(GlobalGeometryPartBlockNew part, CacheKey cacheKey, TagIdent shaderIdent) { var glocalKey = new TagGlobalKey(cacheKey, shaderIdent); // Does this work now? _shaderDictionary[part] = glocalKey; }
public MaterialShader GetMaterial(TagGlobalKey key) { if (_materialDictionary.ContainsKey(key.TagKey)) { return(_materialDictionary[key.TagKey]); } var shaderBlock = ( ShaderBlock )key.Get( ); ShaderPostprocessBitmapNewBlock[] bitmaps; _materialDictionary[key.TagKey] = new MaterialShader(shaderBlock, out bitmaps); foreach (var bitmap in bitmaps) { var bitmapKey = GetBitmapKey(bitmap); if (TextureDictionary.ContainsKey(bitmapKey)) { continue; } var layer = bitmap.BitmapIndex; var bitmapBlock = ( BitmapBlock )bitmap.BitmapGroup.Get(key.CacheKey); if (bitmapBlock == null) { continue; } var texture = new TextureHandle( ); texture.Load(bitmapBlock.Bitmaps[layer]); TextureDictionary.Add(bitmapKey, texture); } return(_materialDictionary[key.TagKey]); }
/// <summary> /// Draws each patch with an individual call. /// </summary> private void DrawPatchElements(IEnumerable <GlobalGeometryPartBlockNew> patches, TagGlobalKey shaderKey) { //var patchDatas = patches as GlobalGeometryPartBlockNew[] ?? patches.ToArray( ); //var patchData = patchDatas.FirstOrDefault( ); //if ( patchData == null ) return; //MaterialShader material = null; //if ( shaderKey.TagKey != TagIdent.NullIdentifier ) //{ // material = _materialManager.GetMaterial( shaderKey ); //} //Bucket bucket = null; //var cmdBuffer = new byte[DrawIndirectCmd.CmdSize * patchDatas.Length]; //using (var binaryWriter = new BinaryWriter(new MemoryStream(cmdBuffer))) // foreach ( var item in patchDatas ) // { // if ( // !item.GlobalGeometryPartNewFlags.HasFlag( GlobalGeometryPartBlockNew.Flags.OverrideTriangleList ) ) // { // } // int vertexBaseIndex; // int indexBaseOffset; // var instanceInfo = InstancesBuffer[ item ]; // bucket = _bucketManager.GetBucketResource( item, out indexBaseOffset, out vertexBaseIndex ); // DrawIndirectCmd indirectCmd = new DrawIndirectCmd( item.StripLength, instanceInfo.Count, // indexBaseOffset/2 + item.StripStartIndex, vertexBaseIndex, instanceInfo.BaseInstance ); // indirectCmd.Write( binaryWriter ); // } //if ( bucket == null ) return; //using ( material == null ? null : _materialManager.Bind( material ) ) //{ // using (CurrentBucketVao == bucket.VertexArrayObject ? null : bucket.Bind()) // using (CurrentBucketVao == bucket.VertexArrayObject ? null : InstancesBuffer.Bind()) // GL.MultiDrawElementsIndirect( All.Triangles, All.UnsignedShort, IntPtr.Zero, patchDatas.Length, // 0 ); //foreach ( var item in patchDatas ) //{ // int vertexBaseIndex; // int indexBaseOffset; // var bucket = _bucketManager.GetBucketResource( item, out indexBaseOffset, out vertexBaseIndex ); // using ( CurrentBucketVao == bucket.VertexArrayObject ? null : bucket.Bind( ) ) // using ( CurrentBucketVao == bucket.VertexArrayObject ? null : InstancesBuffer.Bind( ) ) // { // var primitiveType = // item.GlobalGeometryPartNewFlags.HasFlag( // GlobalGeometryPartBlockNew.Flags.OverrideTriangleList ) // ? PrimitiveType.Triangles // : PrimitiveType.TriangleStrip; // CurrentBucketVao = bucket.VertexArrayObject; // GL.DrawElementsInstancedBaseVertexBaseInstance( // primitiveType, item.StripLength, DrawElementsType.UnsignedShort, // ( IntPtr ) ( indexBaseOffset + item.StripStartIndex * 2 ), // InstancesBuffer[ item ].Count, vertexBaseIndex, InstancesBuffer[ item ].BaseInstance ); // } //}} //} }
public IEnumerable <GlobalGeometryPartBlockNew> GetOpaqueParts(TagGlobalKey shaderKey) { return(OpaquePatches.ContainsKey(shaderKey) ? OpaquePatches[shaderKey] : Enumerable.Empty <GlobalGeometryPartBlockNew>( )); }