Example #1
0
        public void AssignShader(GlobalGeometryPartBlockNew part, CacheKey cacheKey, TagIdent shaderIdent)
        {
            var glocalKey = new TagGlobalKey(cacheKey, shaderIdent);

            //  Does this work now?
            _shaderDictionary[part] = glocalKey;
        }
Example #2
0
        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]);
        }
Example #3
0
        /// <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 );
            //    }
            //}}
            //}
        }
Example #4
0
 public IEnumerable <GlobalGeometryPartBlockNew> GetOpaqueParts(TagGlobalKey shaderKey)
 {
     return(OpaquePatches.ContainsKey(shaderKey)
         ? OpaquePatches[shaderKey]
         : Enumerable.Empty <GlobalGeometryPartBlockNew>( ));
 }