G2A Many GEOs
SHARE
TWEET

Untitled

a guest Apr 5th, 2020 115 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. using OpenTK.Graphics.OpenGL4;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Runtime.InteropServices;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8.  
  9. namespace SharpEngine
  10. {
  11.     public class SkeletalMesh : IDisposable
  12.     {
  13.         public List<VertexBoneData> Vertices = new List<VertexBoneData>();
  14.         public List<int> Indices = new List<int>();
  15.         public List<Texture> Textures = new List<Texture>();
  16.  
  17.         private int VAO, VBO, EBO;
  18.  
  19.         public SkeletalMesh()
  20.         {
  21.  
  22.         }
  23.  
  24.         public SkeletalMesh(List<VertexBoneData> vertices, List<int> indices, List<Texture> textures)
  25.         {
  26.             Vertices = vertices;
  27.             Indices = indices;
  28.             Textures = textures;
  29.         }
  30.  
  31.         public void SetupMesh()
  32.         {
  33.             unsafe
  34.             {
  35.                 VAO = GL.GenVertexArray();
  36.                 VBO = GL.GenBuffer();
  37.                 EBO = GL.GenBuffer();
  38.  
  39.                 GL.BindVertexArray(VAO);
  40.  
  41.                 GL.BindBuffer(BufferTarget.ArrayBuffer, VBO);
  42.  
  43.                 GL.BufferData(BufferTarget.ArrayBuffer, Vertices.Count * sizeof(VertexBoneData), Vertices.ToArray(), BufferUsageHint.StaticDraw);
  44.  
  45.  
  46.                 GL.BindBuffer(BufferTarget.ElementArrayBuffer, EBO);
  47.                 GL.BufferData(BufferTarget.ElementArrayBuffer, Indices.Count * sizeof(int), Indices.ToArray(), BufferUsageHint.StaticDraw);
  48.  
  49.                 // vertex positions
  50.                 GL.EnableVertexAttribArray(0);
  51.                 GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, sizeof(VertexBoneData), 0);
  52.  
  53.                 // vertex normals
  54.                 GL.EnableVertexAttribArray(1);
  55.                 GL.VertexAttribPointer(1, 3, VertexAttribPointerType.Float, false, sizeof(VertexBoneData), Marshal.OffsetOf(typeof(VertexBoneData), "Normal"));
  56.  
  57.                 // vertex texture coordinates
  58.                 GL.EnableVertexAttribArray(2);
  59.                 GL.VertexAttribPointer(2, 2, VertexAttribPointerType.Float, false, sizeof(VertexBoneData), Marshal.OffsetOf(typeof(VertexBoneData), "TexCoord"));
  60.  
  61.                 // bone ids
  62.                 for (int i = 0; i < 4; i++) // 4 is bone count
  63.                 {
  64.                     GL.EnableVertexAttribArray(3 + i);
  65.                     GL.VertexAttribPointer(3 + i, 1, VertexAttribPointerType.Float, false, sizeof(VertexBoneData),
  66.                         Marshal.OffsetOf(typeof(VertexBoneData), "BoneIDs") + sizeof(float) * i);
  67.                 }
  68.  
  69.                 // bone weights
  70.                 for (int i = 0; i < 4; i++) // 4 is bone count
  71.                 {
  72.                     GL.EnableVertexAttribArray(3+4+i);
  73.                     GL.VertexAttribPointer(3+4+i, 1, VertexAttribPointerType.Float, false, sizeof(VertexBoneData),
  74.                         Marshal.OffsetOf(typeof(VertexBoneData), "BoneWeights") + sizeof(float) * i);
  75.                 }
  76.  
  77.                 GL.BindVertexArray(0);
  78.             }
  79.         }
  80.  
  81.         public void Draw(Shader shader)
  82.         {
  83.             //GL.BindVertexArray(VAO);
  84.             uint diffuseNR = 1; //amount of diffuse textures
  85.             uint specularNR = 1; //amount of specular textures
  86.  
  87.             for (int i = 0; i < Textures.Count; i++) //loop through textures
  88.             {
  89.                 GL.ActiveTexture(TextureUnit.Texture0 + i); //set the texture active
  90.  
  91.                 string number; //this one is needed if we use more than one texture of the same type
  92.  
  93.                 if (Textures[i].Type == "texture_diffuse") //if it is a diffuse texture
  94.                 {
  95.                     number = diffuseNR.ToString(); //this is the diffuseNR`s texture
  96.                     diffuseNR++; //amount of diffuse + 1
  97.                 }
  98.                 else if (Textures[i].Type == "texture_specular")
  99.                 {
  100.                     number = specularNR.ToString(); //this is the specularNR`s texture
  101.                     specularNR++; //amount of specular + 1
  102.                 }
  103.                 else
  104.                 {
  105.                     number = "0";
  106.                 }
  107.  
  108.                 shader.SetInt("material." + Textures[i].Type + number, i);
  109.                 //glUniform1i(glGetUniformLocation(shader->ID, ("material." + textures[i].type + number).c_str()), i); //send the texture to the shader (example: material.texture_diffuse1)
  110.                 //glBindTexture(GL_TEXTURE_2D, textures[i].id); //bind this texture
  111.                 Textures[i].Use();
  112.             }
  113.  
  114.             GL.BindVertexArray(VAO);
  115.             GL.DrawElements(BeginMode.Triangles, Indices.Count, DrawElementsType.UnsignedInt, 0);
  116.             GL.BindVertexArray(0);
  117.         }
  118.  
  119.         public void Dispose()
  120.         {
  121.             GL.DeleteVertexArray(VAO);
  122.             GL.DeleteBuffer(VBO);
  123.             GL.DeleteBuffer(EBO);
  124.         }
  125.     }
  126. }
RAW Paste Data
Ledger Nano X - The secure hardware wallet
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
Top