private void SetupDrawCalls(Mesh mesh, Dictionary <string, string> skinMaterials)
        {
            var vbib           = mesh.VBIB;
            var data           = mesh.GetData();
            var gpuMeshBuffers = guiContext.MeshBufferCache.GetVertexIndexBuffers(vbib);

            //Prepare drawcalls
            var sceneObjects = data.GetArray("m_sceneObjects");

            foreach (var sceneObject in sceneObjects)
            {
                var objectDrawCalls = sceneObject.GetArray("m_drawCalls");

                foreach (var objectDrawCall in objectDrawCalls)
                {
                    var materialName = objectDrawCall.GetProperty <string>("m_material") ?? objectDrawCall.GetProperty <string>("m_pMaterial");

                    if (skinMaterials != null && skinMaterials.ContainsKey(materialName))
                    {
                        materialName = skinMaterials[materialName];
                    }

                    var material  = guiContext.MaterialLoader.GetMaterial(materialName);
                    var isOverlay = material.Material.IntParams.ContainsKey("F_OVERLAY");

                    // Ignore overlays for now
                    if (isOverlay)
                    {
                        continue;
                    }

                    var shaderArguments = new Dictionary <string, bool>();

                    if (Mesh.IsCompressedNormalTangent(objectDrawCall))
                    {
                        shaderArguments.Add("fulltangent", false);
                    }

                    // TODO: Don't pass around so much shit
                    var drawCall = CreateDrawCall(objectDrawCall, vbib, shaderArguments, material);

                    DrawCallsAll.Add(drawCall);
                    if (drawCall.Material.IsBlended)
                    {
                        DrawCallsBlended.Add(drawCall);
                    }
                    else
                    {
                        DrawCallsOpaque.Add(drawCall);
                    }
                }
            }

            //drawCalls = drawCalls.OrderBy(x => x.Material.Parameters.Name).ToList();
        }
        private void SetupDrawCalls(Mesh mesh, Dictionary <string, string> skinMaterials)
        {
            var vbib           = mesh.VBIB;
            var data           = mesh.GetData();
            var gpuMeshBuffers = guiContext.MeshBufferCache.GetVertexIndexBuffers(vbib);

            //Prepare drawcalls
            var sceneObjects = data.GetArray("m_sceneObjects");

            foreach (var sceneObject in sceneObjects)
            {
                var objectDrawCalls = sceneObject.GetArray("m_drawCalls");

                foreach (var objectDrawCall in objectDrawCalls)
                {
                    var materialName = objectDrawCall.GetProperty <string>("m_material");

                    if (skinMaterials != null && skinMaterials.ContainsKey(materialName))
                    {
                        materialName = skinMaterials[materialName];
                    }

                    var material  = guiContext.MaterialLoader.GetMaterial(materialName);
                    var isOverlay = material.Material.IntParams.ContainsKey("F_OVERLAY");

                    // Ignore overlays for now
                    if (isOverlay)
                    {
                        continue;
                    }

                    var shaderArguments = new Dictionary <string, bool>();
                    if (objectDrawCall.ContainsKey("m_bUseCompressedNormalTangent"))
                    {
                        shaderArguments.Add("fulltangent", !objectDrawCall.GetProperty <bool>("m_bUseCompressedNormalTangent"));
                    }

                    if (objectDrawCall.ContainsKey("m_nFlags"))
                    {
                        var flags = objectDrawCall.GetProperty <object>("m_nFlags");

                        switch (flags)
                        {
                        case string flagsString:
                            if (flagsString.Contains("MESH_DRAW_FLAGS_USE_COMPRESSED_NORMAL_TANGENT"))
                            {
                                shaderArguments.Add("fulltangent", false);
                            }

                            break;

                        case long flagsLong:
                            // TODO: enum
                            if ((flagsLong & 2) == 2)
                            {
                                shaderArguments.Add("fulltangent", false);
                            }

                            break;
                        }
                    }

                    // TODO: Don't pass around so much shit
                    var drawCall = CreateDrawCall(objectDrawCall, vbib, gpuMeshBuffers, shaderArguments, material);

                    if (drawCall.Material.IsBlended)
                    {
                        DrawCallsBlended.Add(drawCall);
                    }
                    else
                    {
                        DrawCallsOpaque.Add(drawCall);
                    }
                }
            }

            //drawCalls = drawCalls.OrderBy(x => x.Material.Parameters.Name).ToList();
        }
 public IEnumerable <string> GetSupportedRenderModes()
 => DrawCallsOpaque
 .SelectMany(drawCall => drawCall.Shader.RenderModes)
 .Union(DrawCallsBlended.SelectMany(drawCall => drawCall.Shader.RenderModes))
 .Distinct();