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(); }
public void SetRenderMode(string renderMode) { var drawCalls = DrawCallsOpaque.Union(DrawCallsBlended); foreach (var call in drawCalls) { // Recycle old shader parameters that are not render modes since we are scrapping those anyway var parameters = call.Shader.Parameters .Where(kvp => !kvp.Key.StartsWith("renderMode")) .ToDictionary(kvp => kvp.Key, kvp => kvp.Value); if (renderMode != null && call.Shader.RenderModes.Contains(renderMode)) { parameters.Add($"renderMode_{renderMode}", true); } call.Shader = guiContext.ShaderLoader.LoadShader(call.Shader.Name, parameters); call.VertexArrayObject = guiContext.MeshBufferCache.GetVertexArrayObject( mesh.VBIB, call.Shader, call.VertexBuffer.Id, call.IndexBuffer.Id); } }
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();