public Renderer(Resource resource, TabControl mainTabs, string fileName, Package currentPackage) { CurrentPackage = currentPackage; CurrentFileName = fileName; block = resource.VBIB; data = (BinaryKV3)resource.Blocks[BlockType.DATA]; modelArguments = (ArgumentDependencies)((ResourceEditInfo)resource.Blocks[BlockType.REDI]).Structs[ResourceEditInfo.REDIStruct.ArgumentDependencies]; tabs = mainTabs; MaterialLoader = new MaterialLoader(CurrentFileName, CurrentPackage); }
public Renderer(TabControl mainTabs, string fileName, Package currentPackage) { MeshesToRender = new List <MeshObject>(); Animations = new List <Animation.Animation>(); cameras = new List <Tuple <string, Matrix4> >(); CurrentPackage = currentPackage; CurrentFileName = fileName; tabs = mainTabs; Debug = new DebugUtil(); Skeleton = new Skeleton(); // Default empty skeleton MaterialLoader = new MaterialLoader(CurrentFileName, CurrentPackage); }
public Renderer(TabControl mainTabs, string fileName, Package currentPackage) { MeshesToRender = new List<MeshObject>(); Animations = new List<Animation.Animation>(); cameras = new List<Tuple<string, Matrix4>>(); CurrentPackage = currentPackage; CurrentFileName = fileName; tabs = mainTabs; Debug = new DebugUtil(); Skeleton = new Skeleton(); // Default empty skeleton MaterialLoader = new MaterialLoader(CurrentFileName, CurrentPackage); }
public Renderer(TabControl mainTabs, string fileName, Package currentPackage, RenderSubject subjectType = RenderSubject.Unknown) { SubjectType = subjectType; PreciseTimer = new Stopwatch(); PreciseTimer.Start(); MeshesToRender = new List <MeshObject>(); Animations = new List <ValveResourceFormat.ResourceTypes.Animation.Animation>(); cameras = new List <Tuple <string, Matrix4> >(); CurrentPackage = currentPackage; CurrentFileName = fileName; tabs = mainTabs; Debug = new DebugUtil(); Skeleton = new Skeleton(); // Default empty skeleton MaterialLoader = new MaterialLoader(CurrentFileName, CurrentPackage); }
private void SetupDrawCallMaterial(DrawCall drawCall, IDictionary <string, bool> shaderArguments, RenderMaterial material) { drawCall.Material = material; // Add shader parameters from material to the shader parameters from the draw call var combinedShaderParameters = shaderArguments .Concat(material.Material.GetShaderArguments()) .ToDictionary(kvp => kvp.Key, kvp => kvp.Value); // Load shader drawCall.Shader = guiContext.ShaderLoader.LoadShader(drawCall.Material.Material.ShaderName, combinedShaderParameters); //Bind and validate shader GL.UseProgram(drawCall.Shader.Program); if (!drawCall.Material.Textures.ContainsKey("g_tTintMask")) { drawCall.Material.Textures.Add("g_tTintMask", MaterialLoader.CreateSolidTexture(1f, 1f, 1f)); } if (!drawCall.Material.Textures.ContainsKey("g_tNormal")) { drawCall.Material.Textures.Add("g_tNormal", MaterialLoader.CreateSolidTexture(0.5f, 1f, 0.5f)); } }
private DrawCall CreateDrawCall(IKeyValueCollection objectDrawCall, VBIB vbib, GPUMeshBuffers gpuMeshBuffers, IDictionary <string, bool> shaderArguments, RenderMaterial material) { var drawCall = new DrawCall(); switch (objectDrawCall.GetProperty <string>("m_nPrimitiveType")) { case "RENDER_PRIM_TRIANGLES": drawCall.PrimitiveType = PrimitiveType.Triangles; break; default: throw new Exception("Unknown PrimitiveType in drawCall! (" + objectDrawCall.GetProperty <string>("m_nPrimitiveType") + ")"); } drawCall.Material = material; // Add shader parameters from material to the shader parameters from the draw call var combinedShaderParameters = shaderArguments .Concat(material.Material.GetShaderArguments()) .ToDictionary(kvp => kvp.Key, kvp => kvp.Value); // Load shader drawCall.Shader = guiContext.ShaderLoader.LoadShader(drawCall.Material.Material.ShaderName, combinedShaderParameters); //Bind and validate shader GL.UseProgram(drawCall.Shader.Program); var indexBufferObject = objectDrawCall.GetSubCollection("m_indexBuffer"); var indexBuffer = default(DrawBuffer); indexBuffer.Id = Convert.ToUInt32(indexBufferObject.GetProperty <object>("m_hBuffer")); indexBuffer.Offset = Convert.ToUInt32(indexBufferObject.GetProperty <object>("m_nBindOffsetBytes")); drawCall.IndexBuffer = indexBuffer; var indexElementSize = vbib.IndexBuffers[(int)drawCall.IndexBuffer.Id].Size; //drawCall.BaseVertex = Convert.ToUInt32(objectDrawCall.GetProperty<object>("m_nBaseVertex")); //drawCall.VertexCount = Convert.ToUInt32(objectDrawCall.GetProperty<object>("m_nVertexCount")); drawCall.StartIndex = Convert.ToUInt32(objectDrawCall.GetProperty <object>("m_nStartIndex")) * indexElementSize; drawCall.IndexCount = Convert.ToInt32(objectDrawCall.GetProperty <object>("m_nIndexCount")); if (objectDrawCall.ContainsKey("m_vTintColor")) { var tintColor = objectDrawCall.GetSubCollection("m_vTintColor").ToVector3(); drawCall.TintColor = new OpenTK.Vector3(tintColor.X, tintColor.Y, tintColor.Z); } if (!drawCall.Material.Textures.ContainsKey("g_tTintMask")) { drawCall.Material.Textures.Add("g_tTintMask", MaterialLoader.CreateSolidTexture(1f, 1f, 1f)); } if (!drawCall.Material.Textures.ContainsKey("g_tNormal")) { drawCall.Material.Textures.Add("g_tNormal", MaterialLoader.CreateSolidTexture(0.5f, 1f, 0.5f)); } if (indexElementSize == 2) { //shopkeeper_vr drawCall.IndexType = DrawElementsType.UnsignedShort; } else if (indexElementSize == 4) { //glados drawCall.IndexType = DrawElementsType.UnsignedInt; } else { throw new Exception("Unsupported index type"); } var m_vertexBuffers = objectDrawCall.GetSubCollection("m_vertexBuffers"); var m_vertexBuffer = m_vertexBuffers.GetSubCollection("0"); // TODO: Not just 0 var vertexBuffer = default(DrawBuffer); vertexBuffer.Id = Convert.ToUInt32(m_vertexBuffer.GetProperty <object>("m_hBuffer")); vertexBuffer.Offset = Convert.ToUInt32(m_vertexBuffer.GetProperty <object>("m_nBindOffsetBytes")); drawCall.VertexBuffer = vertexBuffer; drawCall.VertexArrayObject = guiContext.MeshBufferCache.GetVertexArrayObject( vbib, drawCall.Shader, drawCall.VertexBuffer.Id, drawCall.IndexBuffer.Id); return(drawCall); }
/* Construct a mesh object from it's resource */ public void LoadFromResource(MaterialLoader materialLoader) { if (Resource != null) { var block = Resource.VBIB; var data = (BinaryKV3)Resource.Blocks[BlockType.DATA]; var modelArguments = (ArgumentDependencies)((ResourceEditInfo)Resource.Blocks[BlockType.REDI]).Structs[ResourceEditInfo.REDIStruct.ArgumentDependencies]; var vertexBuffers = new uint[block.VertexBuffers.Count]; var indexBuffers = new uint[block.IndexBuffers.Count]; GL.GenBuffers(block.VertexBuffers.Count, vertexBuffers); GL.GenBuffers(block.IndexBuffers.Count, indexBuffers); for (var i = 0; i < block.VertexBuffers.Count; i++) { GL.BindBuffer(BufferTarget.ArrayBuffer, vertexBuffers[i]); GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(block.VertexBuffers[i].Count * block.VertexBuffers[i].Size), block.VertexBuffers[i].Buffer, BufferUsageHint.StaticDraw); var verticeBufferSize = 0; GL.GetBufferParameter(BufferTarget.ArrayBuffer, BufferParameterName.BufferSize, out verticeBufferSize); } for (var i = 0; i < block.IndexBuffers.Count; i++) { GL.BindBuffer(BufferTarget.ElementArrayBuffer, indexBuffers[i]); GL.BufferData(BufferTarget.ElementArrayBuffer, (IntPtr)(block.IndexBuffers[i].Count * block.IndexBuffers[i].Size), block.IndexBuffers[i].Buffer, BufferUsageHint.StaticDraw); var indiceBufferSize = 0; GL.GetBufferParameter(BufferTarget.ElementArrayBuffer, BufferParameterName.BufferSize, out indiceBufferSize); } //Prepare drawcalls var a = (KVObject)data.Data.Properties["m_sceneObjects"].Value; for (var b = 0; b < a.Properties.Count; b++) { var c = (KVObject)((KVObject)a.Properties[b.ToString()].Value).Properties["m_drawCalls"].Value; for (var i = 0; i < c.Properties.Count; i++) { var d = (KVObject)c.Properties[i.ToString()].Value; var materialName = d.Properties["m_material"].Value.ToString(); if (SkinMaterials.Any()) { materialName = SkinMaterials[i]; } var material = materialLoader.GetMaterial(materialName); // TODO: Don't pass around so much shit var drawCall = CreateDrawCall(d.Properties, vertexBuffers, indexBuffers, modelArguments, Resource.VBIB, material); DrawCalls.Add(drawCall); } } DrawCalls = DrawCalls.OrderBy(x => x.Material.Name).ToList(); // No longer need the resource, we extracted all data Resource = null; } }
//Set up a draw call private DrawCall CreateDrawCall(Dictionary <string, KVValue> drawProperties, uint[] vertexBuffers, uint[] indexBuffers, ArgumentDependencies modelArguments, VBIB block, Material material) { var drawCall = new DrawCall(); switch (drawProperties["m_nPrimitiveType"].Value.ToString()) { case "RENDER_PRIM_TRIANGLES": drawCall.PrimitiveType = PrimitiveType.Triangles; break; default: throw new Exception("Unknown PrimitiveType in drawCall! (" + drawProperties["m_nPrimitiveType"].Value + ")"); } drawCall.Material = material; // Load shader drawCall.Shader = ShaderLoader.LoadShader(drawCall.Material.Parameters.ShaderName, modelArguments); //Bind and validate shader GL.UseProgram(drawCall.Shader.Program); var f = (KVObject)drawProperties["m_indexBuffer"].Value; var indexBuffer = default(DrawBuffer); indexBuffer.Id = Convert.ToUInt32(f.Properties["m_hBuffer"].Value); indexBuffer.Offset = Convert.ToUInt32(f.Properties["m_nBindOffsetBytes"].Value); drawCall.IndexBuffer = indexBuffer; var bufferSize = block.IndexBuffers[(int)drawCall.IndexBuffer.Id].Size; drawCall.BaseVertex = Convert.ToUInt32(drawProperties["m_nBaseVertex"].Value); drawCall.VertexCount = Convert.ToUInt32(drawProperties["m_nVertexCount"].Value); drawCall.StartIndex = Convert.ToUInt32(drawProperties["m_nStartIndex"].Value) * bufferSize; drawCall.IndexCount = Convert.ToInt32(drawProperties["m_nIndexCount"].Value); if (drawProperties.ContainsKey("m_vTintColor")) { var tint = (KVObject)drawProperties["m_vTintColor"].Value; drawCall.TintColor = new Vector3( Convert.ToSingle(tint.Properties["0"].Value), Convert.ToSingle(tint.Properties["1"].Value), Convert.ToSingle(tint.Properties["2"].Value)); if (!drawCall.Material.Textures.ContainsKey("g_tTintMask")) { drawCall.Material.Textures.Add("g_tTintMask", MaterialLoader.CreateSolidTexture(1f, 1f, 1f)); } } if (bufferSize == 2) { //shopkeeper_vr drawCall.IndiceType = DrawElementsType.UnsignedShort; } else if (bufferSize == 4) { //glados drawCall.IndiceType = DrawElementsType.UnsignedInt; } else { throw new Exception("Unsupported indice type"); } var g = (KVObject)drawProperties["m_vertexBuffers"].Value; var h = (KVObject)g.Properties["0"].Value; // TODO: Not just 0 var vertexBuffer = default(DrawBuffer); vertexBuffer.Id = Convert.ToUInt32(h.Properties["m_hBuffer"].Value); vertexBuffer.Offset = Convert.ToUInt32(h.Properties["m_nBindOffsetBytes"].Value); drawCall.VertexBuffer = vertexBuffer; GL.GenVertexArrays(1, out uint vertexArrayObject); drawCall.VertexArrayObject = vertexArrayObject; GL.BindVertexArray(drawCall.VertexArrayObject); GL.BindBuffer(BufferTarget.ArrayBuffer, vertexBuffers[drawCall.VertexBuffer.Id]); GL.BindBuffer(BufferTarget.ElementArrayBuffer, indexBuffers[drawCall.IndexBuffer.Id]); var curVertexBuffer = block.VertexBuffers[(int)drawCall.VertexBuffer.Id]; var texCoordNum = 0; foreach (var attribute in curVertexBuffer.Attributes) { var attributeName = "v" + attribute.Name; // TODO: other params too? if (attribute.Name == "TEXCOORD" && texCoordNum++ > 0) { attributeName += texCoordNum; } BindVertexAttrib(attribute, attributeName, drawCall.Shader.Program, (int)curVertexBuffer.Size); } GL.BindVertexArray(0); return(drawCall); }