glNormalPointer(GL_FLOAT, 0, VBO_BUFFER_OFFSET(0));
}
+void GlVBO::BindPtrAsColor(void)
+{
+ glEnableClientState(GL_COLOR_ARRAY);
+ Bind();
+ glColorPointer(3, GL_FLOAT, 0, VBO_BUFFER_OFFSET(0));
+}
+
void GlVBO::BindPtrAsTexcoord(void)
{
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
void AssginBufferi(const std::vector<GLuint>& buf);
void BindPtrAsNoral(void);
+ void BindPtrAsColor(void);
void BindPtrAsTexcoord(void);
void BindPtrAsAttrib3f(GLint buf_id);
m_Vertex(GL_ARRAY_BUFFER),
m_Normal(GL_ARRAY_BUFFER),
m_Texture(GL_ARRAY_BUFFER),
+ m_VCol(GL_ARRAY_BUFFER),
m_Tangents(GL_ARRAY_BUFFER),
m_Index(GL_ELEMENT_ARRAY_BUFFER)
{
m_Vertex.ReleaseBufferElement();
m_Normal.ReleaseBufferElement();
m_Texture.ReleaseBufferElement();
+ m_VCol.ReleaseBufferElement();
m_Tangents.ReleaseBufferElement();
m_Index.ReleaseBufferElement();
if (m_Normal.HasBuffer())
m_Normal.BindPtrAsNoral();
-
+
if (m_Texture.HasBuffer())
m_Texture.BindPtrAsTexcoord();
+ if (m_VCol.HasBuffer())
+ m_VCol.BindPtrAsColor();
+
GLint tbuf_id = -1;
if (m_Tangents.HasBuffer())
{
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
+ glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
if (tbuf_id != -1)
public:
GlVBO m_Vertex;
+ GlVBO m_VCol;
GlVBO m_Normal;
GlVBO m_Tangents;
GlVBO m_Texture;
num_triangles = GetNumTrianglesFG(mesh, fg);
- ClearReserve(num_triangles, tf.HasNormal(), tf.HasUV(), mesh.HasTangent());
+ ClearReserve(num_triangles, tf.HasNormal(), tf.HasUV(), mesh.HasTangent(), mesh.HasVCol());
for (size_t i = 0; i < fg.m_Fids.size(); ++i)
{
if (f.HasUV())
CopyFUV(mesh, f, i0, i1, i2);
+ if (mesh.HasVCol())
+ CopyFVCol(mesh, f, i0, i1, i2);
+
if (mesh.HasTangent())
CopyFT(mesh, f, i0, i1, i2);
tangents.push_back(mesh.m_Tangents[ti2]);
}
+void GeomVBOTriCache::CopyFVCol(lib_geo::BaseMesh& mesh, lib_geo::BaseFace& f, int i0, int i1, int i2)
+{
+ int vi0 = f.m_VertIds[i0];
+ int vi1 = f.m_VertIds[i1];
+ int vi2 = f.m_VertIds[i2];
+ vcol.push_back(mesh.m_Col[vi0]);
+ vcol.push_back(mesh.m_Col[vi1]);
+ vcol.push_back(mesh.m_Col[vi2]);
+}
+
size_t GeomVBOTriCache::GetNumTrianglesFG(lib_geo::BaseMesh& mesh, const geom::FaceGroup& fg) const
{
size_t triangles = 0;
indexbuf.push_back(indexbuf.size());
}
-void GeomVBOTriCache::ClearReserve(size_t num_triangles, bool enable_normal, bool enable_uv, bool enable_tangent)
+void GeomVBOTriCache::ClearReserve(size_t num_triangles, bool enable_normal, bool enable_uv, bool enable_tangent, bool enable_vcol)
{
size_t buf_len = num_triangles * 3;
if (enable_normal)
norms.reserve(buf_len);
+ if (enable_vcol)
+ vcol.reserve(buf_len);
+
if (enable_uv)
uvs.reserve(buf_len);
cache.Create(mesh, fg);
vbo->NumTriangles = cache.num_triangles;
-
+
if (!cache.verts.empty())
vbo->m_Vertex.AssginBuffer3f(cache.verts);
+ if (!cache.vcol.empty())
+ vbo->m_VCol.AssginBuffer3f(cache.vcol);
+
if (!cache.norms.empty())
vbo->m_Normal.AssginBuffer3f(cache.norms);
private:
size_t GetNumTrianglesFG(lib_geo::BaseMesh& mesh, const geom::FaceGroup& fg) const;
- void ClearReserve(size_t num_triangles, bool enable_normal, bool enable_uv, bool enable_tangent);
+ void ClearReserve(size_t num_triangles, bool enable_normal, bool enable_uv, bool enable_tangent, bool enable_vcol);
void IncrementTriangleIndex(void);
void CopyFN(lib_geo::BaseMesh& mesh, lib_geo::BaseFace& f, int i0, int i1, int i2);
void CopyFUV(lib_geo::BaseMesh& mesh, lib_geo::BaseFace& f, int i0, int i1, int i2);
void CopyFT(lib_geo::BaseMesh& mesh, lib_geo::BaseFace& f, int i0, int i1, int i2);
+ void CopyFVCol(lib_geo::BaseMesh& mesh, lib_geo::BaseFace& f, int i0, int i1, int i2);
public:
std::vector<lm::vec3f> verts;
+ std::vector<lm::vec3f> vcol;
std::vector<lm::vec3f> norms;
std::vector<lm::vec3f> tangents;
std::vector<lm::vec2f> uvs;