bool rGeometryUtil::CreateCircleVerticies(const rCircle2& circle, size_t segments, rImmediateBuffer& geometry, float zValue){ if (geometry.GeometryType() != rGeometryType::Triangles) return false; geometry.PushVertex(circle.center.x, circle.center.y, zValue); float step = 360.0f / (float)segments; unsigned short index = 1; rVector3 vertex; rVector3 circleCenter(circle.center.x, circle.center.y, zValue); for (float angle = 0.0f; angle <= 360.0f; angle += step){ float radians = rMath::DegreeToRad(angle); vertex.Set(std::cos(radians),std::sin(radians), 0.0f); vertex *= circle.radius; vertex += circleCenter; geometry.PushVertex(vertex); if (index > 1){ geometry.PushIndex(index, index - 1, 0); } index++; } return true; }
void CircleSweep(float x, float y, float radius, float start, float end, size_t count, rImmediateBuffer& geometry, float zValue, CircleIndexFunc indexFunc){ unsigned short centerIndex = geometry.VertexCount(); unsigned short currentIndex = centerIndex; rVector3 center(x,y, zValue); geometry.PushVertex(center); float deg = start; float step = (end - start) / (float)count; rVector3 vertex; for (uint16_t i = 0; i <= count; i++){ float rad = rMath::DegreeToRad(deg); vertex.Set(std::cos(rad), std::sin(rad), 0.0); vertex.x *= radius; vertex.y *= -radius; vertex = center + vertex; geometry.PushVertex(vertex); currentIndex += 1; indexFunc(centerIndex, i, currentIndex); deg += step; if (deg > end) deg = end; } }
void AppendRectVerticies(const rRect& rect, rImmediateBuffer& geometry, float zValue){ unsigned short offset = geometry.VertexCount(); CreateRectVerticies(rect, geometry, zValue); for (size_t i = 0; i < 6; i ++) geometry.PushIndex(offset + rectIndicies[i]); }
bool rGeometryUtil::CreateWireRectVerticies(const rRect& rect, rImmediateBuffer& geometry, float zValue){ if (geometry.GeometryType() != rGeometryType::Lines) return false; uint16_t baseIndex = (uint16_t)geometry.VertexCount(); for (uint16_t i = 0; i < 8; i++){ geometry.PushIndex(wireRectIndicies[i] + baseIndex); } CreateRectVerticies(rect, geometry, zValue); return true; }
bool rGeometryUtil::CreateRectVerticies(const rRect& rect, rImmediateBuffer& geometry, bool texCoords, float zValue){ if (geometry.GeometryType() != rGeometryType::Triangles) return false; if (texCoords && !geometry.HasTexCoords()) return false; uint16_t baseIndex = (uint16_t)geometry.VertexCount(); for (uint16_t i = 0; i < 6; i++){ geometry.PushIndex(rectIndicies[i] + baseIndex); } if (texCoords){ CreateRectVerticiesWithTexCoords(rect, geometry, zValue); } else{ CreateRectVerticies(rect, geometry, zValue); } return true; }
bool rGeometryUtil::CreateRoundedRectVerticies(const rRect& rect, float radius, int detail, rImmediateBuffer& geometry, float zValue){ if (geometry.GeometryType() != rGeometryType::Triangles) return false; CircleIndexFunc indexFunc = [&](uint16_t centerIndex, uint16_t vertexNum, uint16_t currentIndex){ geometry.PushIndex(centerIndex, currentIndex - 1, currentIndex); }; GenerateRoundedBorders(rect, radius, detail, geometry, zValue, indexFunc); rRect r(rect.x + radius, rect.y, rect.width - (2* radius), rect.height); AppendRectVerticies(r, geometry, zValue); r.Set(rect.x, rect.y+ radius, radius, rect.height - (2* radius)); AppendRectVerticies(r, geometry, zValue); r.x = rect.Right() - radius; AppendRectVerticies(r, geometry, zValue); return true; }
void rGeometryUtil::CreateWireAlignedBoxVerticies(const rAlignedBox3& box, rImmediateBuffer& geometry){ unsigned short indicies[] = { 0,1,1,2,2,3,3,0,4,5,5,6,6,7,7,4,0,4,1,5,2,6,3,7 }; geometry.Reset(rGeometryType::Lines, 3, false); geometry.SetIndexBuffer(indicies, 24); geometry.PushVertex(box.min.x, box.max.y, box.max.z); geometry.PushVertex(box.max.x, box.max.y, box.max.z); geometry.PushVertex(box.max.x, box.min.y, box.max.z); geometry.PushVertex(box.min.x, box.min.y, box.max.z); geometry.PushVertex(box.min.x, box.max.y, box.min.z); geometry.PushVertex(box.max.x, box.max.y, box.min.z); geometry.PushVertex(box.max.x, box.min.y, box.min.z); geometry.PushVertex(box.min.x, box.min.y, box.min.z); }
bool rGeometryUtil::CreateRoundedWireRectVerticies(const rRect& rect, float radius, size_t detail, rImmediateBuffer& geometry, float zValue){ if (geometry.GeometryType() != rGeometryType::Lines) return false; CircleIndexFunc indexFunc = [&](uint16_t centerIndex, uint16_t vertexNum, uint16_t currentIndex){ if (vertexNum) geometry.PushIndex(currentIndex - 1, currentIndex); }; size_t offset = geometry.VertexCount(); GenerateRoundedBorders(rect, radius, detail, geometry, zValue, indexFunc); geometry.PushIndex(offset + detail + 1, offset + detail + 3); geometry.PushIndex(offset + (2 * detail) + 3, offset + (2 * detail) + 5); geometry.PushIndex(offset + (3 * detail) + 5, offset + (3 * detail) + 7); geometry.PushIndex(offset + (4 * detail) + 7, offset + 1); return true; }
void rOpenGLGraphicsDevice::RenderImmediate(const rImmediateBuffer& geometry, const rMatrix4& transform, rMaterial* material){ if (material && geometry.VertexCount() > 0){ size_t vertexElementSize = geometry.VertexSize(); bool texCoords = geometry.HasTexCoords(); GLsizei vertexStride = texCoords ? (vertexElementSize + 2) * sizeof (GLfloat) : 0; glBindBuffer(GL_ARRAY_BUFFER, 0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); SetActiveMaterial(material); GLint programId = material->Shader()->ProgramId(); GLuint gPositionLoc = glGetAttribLocation ( programId, "recPosition" ); GLuint gMatrixLoc = glGetUniformLocation ( programId, "recMVPMatrix" ); GLuint gTexCoordLoc = 0; glUniformMatrix4fv(gMatrixLoc, 1, GL_FALSE, transform.m); glVertexAttribPointer ( gPositionLoc, vertexElementSize, GL_FLOAT, GL_FALSE, vertexStride, geometry.VertexData() ); glEnableVertexAttribArray ( gPositionLoc ); if (texCoords){ gTexCoordLoc = glGetAttribLocation ( programId, "recTexCoord" ); glVertexAttribPointer ( gTexCoordLoc, 2, GL_FLOAT, GL_FALSE, vertexStride, geometry.VertexData() + (vertexElementSize * sizeof (GLfloat))); glEnableVertexAttribArray ( gTexCoordLoc ); } glDrawElements ( GLGeometryType(geometry.GeometryType()), geometry.IndexCount(), GL_UNSIGNED_SHORT, geometry.IndexData() ); glDisableVertexAttribArray ( gPositionLoc ); if (texCoords) glDisableVertexAttribArray ( gTexCoordLoc ); } }
void CreateRectVerticiesWithTexCoords(const rRect& rect, rImmediateBuffer& geometry, float zValue){ geometry.PushVertex(rect.x, rect.y, zValue, 0.0f, 1.0f); geometry.PushVertex(rect.x + rect.width, rect.y, zValue, 1.0f,1.0f); geometry.PushVertex(rect.x + rect.width, rect.y + rect.height, zValue, 1.0f, 0.0f); geometry.PushVertex(rect.x , rect.y + rect.height, zValue, 0.0f, 0.0f); }