Mesh::Mesh(Vertex* vertices, GLushort* indices, GLuint numVertices, GLuint numIndices) : m_numVertices(numVertices), m_numIndices(numIndices), m_vertices(vertices), m_indices(indices) { glGenVertexArrays(1, &m_vertexArrayObjID); glBindVertexArray(m_vertexArrayObjID); glGenBuffers(1, &m_vertexBufferID); glBindBuffer(GL_ARRAY_BUFFER, m_vertexBufferID); glBufferData(GL_ARRAY_BUFFER, vertexBufferSize(), m_vertices, GL_STATIC_DRAW); glGenBuffers(1, &m_indexBufferID); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_indexBufferID); glBufferData(GL_ELEMENT_ARRAY_BUFFER, indicesBufferSize(), m_indices, GL_STATIC_DRAW); glEnableVertexAttribArray(0); glEnableVertexAttribArray(1); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 6, 0); glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 6, (char*)(sizeof(float) * 3)); }
void* StreamedMesh::internalStreamPtr() { if (vertexBufferSize() == 0) { LOG ("Error, internal vertex buffer size is 0"); return 0; } if (!_vertexBufferCpuMemory) { _vertexBufferCpuMemory = (float*)malloc(sizeof(float)*vertexBufferSize()); } // stash the buffer and put it in an array std::map <uint32_t, float*> streamMap; for (auto it = _vertexStreams.begin(); it != _vertexStreams.end(); it++) { streamMap.insert (std::make_pair(it->first, it->second->stream())); } const std::vector <VertexElement>& declaration = _vertexDeclaration->getDeclaration(); float* vb = (float*)_vertexBufferCpuMemory; for (uint32_t i = 0; i < vertexCount(); i++) { for (uint32_t j = 0; j < declaration.size()-1; j++) { VertexElement element = declaration[j]; VertexStream* stream = 0; if (findStream (stream, element)) { uint32_t streamId = VertexStream::id(*stream); auto streamIt = streamMap.find(streamId); if (streamIt != streamMap.end() && streamIt->second) { for (uint32_t k = 0; k < stream->stride(); k++) { *vb++ = streamIt->second[k]; } streamIt->second += stream->stride(); } else { uint32_t stride = IVertexDeclaration::elementToSize(element.type()); for (uint32_t k = 0; k < stride; stride++) { *vb++ = 0; } } } else { // can't find a stream for this element. // warn user, and 0 the buffer for the stride size uint32_t stride = IVertexDeclaration::elementToSize(element.type()); for (uint32_t k = 0; k < stride; stride++) { *vb++ = 0; } } } } return _vertexBufferCpuMemory; }