public void UpdateUVBuffers(NativeArray <float4> uvs)
 {
     if (UVBuffer == null || UVBuffer.count != uvs.Length)
     {
         UVBuffer?.Release();
         UVBuffer = new ComputeBuffer(uvs.Length, 16);
     }
     UVBuffer.SetData(uvs);
     Material.SetBuffer("uvBuffer", UVBuffer);
 }
        public void UpdateBuffers(int numSprites, float[] vertices, float[] uvs, byte[] colors)
        {
            VertexBuffer.Bind();
            //VertexBuffer.Invalidate();
            VertexBuffer.SetSubData(numSprites * 8 * sizeof(float), 0, vertices);

            UVBuffer.Bind();
            //UVBuffer.Invalidate();
            UVBuffer.SetSubData(numSprites * 8 * sizeof(float), 0, uvs);

            ColorBuffer.Bind();
            //ColorBuffer.Invalidate();
            ColorBuffer.SetSubData(numSprites * 16 * sizeof(byte), 0, colors);
        }
        public void Render(int numSprites)
        {
            ElementBuffer.Bind();
            GL.DrawElements(BeginMode.Triangles, numSprites * 6, DrawElementsType.UnsignedInt, IntPtr.Zero);

            // Tell opengl we don't need this data anymore.
            VertexBuffer.Bind();
            VertexBuffer.Invalidate();

            UVBuffer.Bind();
            UVBuffer.Invalidate();

            ColorBuffer.Bind();
            ColorBuffer.Invalidate();
        }
        public SpriteVertexBuffer()
            : base(BufferUsageHint.StreamDraw, 3)
        {
            Bind();

            InitializeArrayBuffer(0, 2, VertexAttribPointerType.Float, false, 0, 0, BufferUsageHint.StreamDraw);
            VertexBuffer.SetData(MAX_SPRITES * 8 * sizeof(float));

            InitializeArrayBuffer(1, 2, VertexAttribPointerType.Float, false, 0, 0, BufferUsageHint.StreamDraw);
            UVBuffer.SetData(MAX_SPRITES * 8 * sizeof(float));

            InitializeArrayBuffer(2, 4, VertexAttribPointerType.UnsignedByte, true, 0, 0, BufferUsageHint.StreamDraw);
            ColorBuffer.SetData(MAX_SPRITES * 16 * sizeof(byte));

            InitializeElementBuffer(BufferUsageHint.StaticDraw);
            ElementBuffer.SetData(MAX_SPRITES * 6 * sizeof(uint), ConstructElementBuffer());

            Unbind();
        }
        public void Update(float[] vertices, uint[] indexes, float[] uvs, float[] normals)
        {
            Bind();

            ElementBuffer.Bind();
            ElementBuffer.SetData(sizeof(uint) * indexes.Length, indexes);

            VertexBuffer.Bind();
            VertexBuffer.SetData(sizeof(float) * vertices.Length, vertices);

            UVBuffer.Bind();
            UVBuffer.SetData(sizeof(float) * uvs.Length, uvs);

            NormalBuffer.Bind();
            NormalBuffer.SetData(sizeof(float) * normals.Length, normals);

            VertexCount = indexes.Length;

            Unbind();
        }
示例#6
0
        public void Clear()
        {
            if (m_SubList != null)
            {
                for (int i = 0; i < m_SubList.Count; ++i)
                {
                    var subMesh = m_SubList[i];
                    if (subMesh != null)
                    {
                        subMesh.Dispose();
                    }
                }
                m_SubList.Clear();
            }

            if (m_VertexBuffer != null)
            {
                m_VertexBuffer.Dispose();
                m_VertexBuffer = null;
            }

            if (m_ColorBuffer != null)
            {
                m_ColorBuffer.Dispose();
                m_ColorBuffer = null;
            }

            if (m_NormalBuffer != null)
            {
                m_NormalBuffer.Dispose();
                m_NormalBuffer = null;
            }

            if (m_UV1Buffer != null)
            {
                m_UV1Buffer.Dispose();
                m_UV1Buffer = null;
            }
        }
示例#7
0
        public void BuildFromMesh(Mesh mesh)
        {
            Clear();
            if (mesh != null)
            {
                Vector3        minVec       = Vector3.zero;
                Vector3        maxVec       = Vector3.zero;
                bool           isInitMinMax = false;
                List <Vector3> vertexs      = new List <Vector3>();
                mesh.GetVertices(vertexs);
                if (vertexs.Count > 0)
                {
                    m_VertexBuffer          = new VertexBuffer();
                    m_VertexBuffer.Capacity = vertexs.Count;
                    for (int i = 0; i < vertexs.Count; ++i)
                    {
                        Vector3 v = vertexs[i];
                        m_VertexBuffer.Add(v);
                        if (!isInitMinMax)
                        {
                            minVec       = v;
                            maxVec       = v;
                            isInitMinMax = true;
                        }
                        else
                        {
                            if (minVec.x > v.x)
                            {
                                minVec.x = v.x;
                            }
                            if (minVec.y > v.y)
                            {
                                minVec.y = v.y;
                            }
                            if (minVec.z > v.z)
                            {
                                minVec.z = v.z;
                            }
                            if (maxVec.x < v.x)
                            {
                                maxVec.x = v.x;
                            }
                            if (maxVec.y < v.y)
                            {
                                maxVec.y = v.y;
                            }
                            if (maxVec.z < v.z)
                            {
                                maxVec.z = v.z;
                            }
                        }
                    }
                }

                if (isInitMinMax)
                {
                    m_BoundSpere.position = (maxVec + minVec) / 2.0f;
                    m_BoundSpere.radius   = (maxVec - minVec).magnitude / 2.0f;
                }
                else
                {
                    m_BoundSpere.position = Vector3.zero;
                    m_BoundSpere.radius   = 0f;
                }

                List <Color> colors = new List <Color>();
                mesh.GetColors(colors);
                if (colors.Count > 0)
                {
                    m_ColorBuffer          = new VertexColorBuffer();
                    m_ColorBuffer.Capacity = colors.Count;
                    for (int i = 0; i < colors.Count; ++i)
                    {
                        m_ColorBuffer.Add(colors[i]);
                    }
                }

                // UV 1坐标
                List <Vector4> uvs = new List <Vector4>();
                mesh.GetUVs(0, uvs);
                if (uvs.Count > 0)
                {
                    if (m_UV1Buffer == null)
                    {
                        m_UV1Buffer = new UVBuffer();
                    }
                    m_UV1Buffer.Capacity = uvs.Count;
                    for (int i = 0; i < uvs.Count; ++i)
                    {
                        m_UV1Buffer.Add(uvs[i]);
                    }
                }

                for (int i = 0; i < mesh.subMeshCount; ++i)
                {
                    if (m_SubList == null)
                    {
                        m_SubList = new List <SoftSubMesh>();
                    }
                    var triangles = mesh.GetTriangles(i);
                    if (triangles != null && triangles.Length > 0)
                    {
                        SoftSubMesh subMesh = new SoftSubMesh(mesh, triangles);
                        m_SubList.Add(subMesh);
                    }
                }
            }
        }