90 lines
2.9 KiB
C++
90 lines
2.9 KiB
C++
#include "Render_Utils.h"
|
|
|
|
#include <algorithm>
|
|
|
|
#include "glew.h"
|
|
#include "freeglut.h"
|
|
|
|
|
|
void Core::RenderContext::initFromOBJ(obj::Model& model)
|
|
{
|
|
vertexArray = 0;
|
|
vertexBuffer = 0;
|
|
vertexIndexBuffer = 0;
|
|
unsigned int vertexDataBufferSize = sizeof(float) * model.vertex.size();
|
|
unsigned int vertexNormalBufferSize = sizeof(float) * model.normal.size();
|
|
unsigned int vertexTexBufferSize = sizeof(float) * model.texCoord.size();
|
|
|
|
size = model.faces["default"].size();
|
|
unsigned int vertexElementBufferSize = sizeof(unsigned short) * size;
|
|
|
|
|
|
glGenVertexArrays(1, &vertexArray);
|
|
glBindVertexArray(vertexArray);
|
|
|
|
|
|
glGenBuffers(1, &vertexIndexBuffer);
|
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vertexIndexBuffer);
|
|
glBufferData(GL_ELEMENT_ARRAY_BUFFER, vertexElementBufferSize, &model.faces["default"][0], GL_STATIC_DRAW);
|
|
|
|
glGenBuffers(1, &vertexBuffer);
|
|
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
|
|
|
|
glEnableVertexAttribArray(0);
|
|
glEnableVertexAttribArray(1);
|
|
glEnableVertexAttribArray(2);
|
|
|
|
glBufferData(GL_ARRAY_BUFFER, vertexDataBufferSize + vertexNormalBufferSize + vertexTexBufferSize, NULL, GL_STATIC_DRAW);
|
|
|
|
glBufferSubData(GL_ARRAY_BUFFER, 0, vertexDataBufferSize, &model.vertex[0]);
|
|
|
|
glBufferSubData(GL_ARRAY_BUFFER, vertexDataBufferSize, vertexNormalBufferSize, &model.normal[0]);
|
|
|
|
glBufferSubData(GL_ARRAY_BUFFER, vertexDataBufferSize + vertexNormalBufferSize, vertexTexBufferSize, &model.texCoord[0]);
|
|
|
|
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)(0));
|
|
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 0, (void*)(vertexDataBufferSize));
|
|
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, (void*)(vertexNormalBufferSize + vertexDataBufferSize));
|
|
}
|
|
|
|
void Core::DrawVertexArray(const float * vertexArray, int numVertices, int elementSize )
|
|
{
|
|
glVertexAttribPointer(0, elementSize, GL_FLOAT, false, 0, vertexArray);
|
|
glEnableVertexAttribArray(0);
|
|
|
|
glDrawArrays(GL_TRIANGLES, 0, numVertices);
|
|
}
|
|
|
|
void Core::DrawVertexArrayIndexed( const float * vertexArray, const int * indexArray, int numIndexes, int elementSize )
|
|
{
|
|
glVertexAttribPointer(0, elementSize, GL_FLOAT, false, 0, vertexArray);
|
|
glEnableVertexAttribArray(0);
|
|
|
|
glDrawElements(GL_TRIANGLES, numIndexes, GL_UNSIGNED_INT, indexArray);
|
|
}
|
|
|
|
|
|
//void Core::DrawVertexArray( const VertexData & data )
|
|
//{
|
|
// int numAttribs = std::min(VertexData::MAX_ATTRIBS, data.NumActiveAttribs);
|
|
// for(int i = 0; i < numAttribs; i++)
|
|
// {
|
|
// glVertexAttribPointer(i, data.Attribs[i].Size, GL_FLOAT, false, 0, data.Attribs[i].Pointer);
|
|
// glEnableVertexAttribArray(i);
|
|
// }
|
|
// glDrawArrays(GL_TRIANGLES, 0, data.NumVertices);
|
|
//}
|
|
|
|
void Core::DrawContext(Core::RenderContext& context)
|
|
{
|
|
|
|
glBindVertexArray(context.vertexArray);
|
|
glDrawElements(
|
|
GL_TRIANGLES, // mode
|
|
context.size, // count
|
|
GL_UNSIGNED_SHORT, // type
|
|
(void*)0 // element array buffer offset
|
|
);
|
|
glBindVertexArray(0);
|
|
}
|