//-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void UniformFloat::setArray(const Vec3fArray& values) { size_t numValues = values.size(); CVF_ASSERT(numValues > 0); m_type = FLOAT_VEC3; m_data.resize(3*numValues); m_data.copyData(values.ptr()->ptr(), 3*numValues, 0); }
//-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- TEST(ArrayTest, ptrToIdx) { // Vec3f array Vec3fArray vA; vA.resize(4); ASSERT_EQ(4u, vA.size()); vA[0] = Vec3f(1,2,3); vA[1] = Vec3f(1.1f, 2.2f, 3.3f); vA[2] = Vec3f(0,0,0); vA[3] = Vec3f(4,5,6); Vec3f* p1 = vA.ptr(1); ASSERT_FLOAT_EQ(1.1f, p1->x()); ASSERT_FLOAT_EQ(2.2f, p1->y()); ASSERT_FLOAT_EQ(3.3f, p1->z()); Vec3f* p3 = vA.ptr(3); ASSERT_FLOAT_EQ(4, p3->x()); ASSERT_FLOAT_EQ(5, p3->y()); ASSERT_FLOAT_EQ(6, p3->z()); }
//-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- TEST(ArrayTest, BasicVec3fArray) { // Vec3f array Vec3fArray vA; vA.resize(4); ASSERT_EQ(4u, vA.size()); vA[0] = Vec3f(1,2,3); vA[1] = Vec3f(1.1f, 2.2f, 3.3f); vA[2] = Vec3f(0,0,0); vA[3] = Vec3f(4,5,6); ASSERT_EQ(true, vA[0] == Vec3f(1, 2, 3)); ASSERT_EQ(true, vA[1] == Vec3f(1.1f, 2.2f, 3.3f)); ASSERT_EQ(true, vA[2] == Vec3f(0, 0, 0)); ASSERT_EQ(true, vA[3] == Vec3f(4, 5, 6)); const float* pf = vA.ptr()->ptr(); ASSERT_FLOAT_EQ(1.0f, pf[0]); ASSERT_FLOAT_EQ(2.0f, pf[1]); ASSERT_FLOAT_EQ(3.0f, pf[2]); ASSERT_FLOAT_EQ(1.1f, pf[3]); ASSERT_FLOAT_EQ(2.2f, pf[4]); ASSERT_FLOAT_EQ(3.3f, pf[5]); ASSERT_FLOAT_EQ(0.0f, pf[6]); ASSERT_FLOAT_EQ(0.0f, pf[7]); ASSERT_FLOAT_EQ(0.0f, pf[8]); ASSERT_FLOAT_EQ(4.0f, pf[9]); ASSERT_FLOAT_EQ(5.0f, pf[10]); ASSERT_FLOAT_EQ(6.0f, pf[11]); vA.clear(); ASSERT_EQ(0u, vA.size()); }
//-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void DrawableVectors::createUploadBufferObjectsGPU(OpenGLContext* oglContext) { if (!m_renderWithVBO || m_vertexArray->size() == 0 || m_vectorGlyph.isNull() || m_vectorGlyphPrimSet.isNull()) { return; } if (m_glyphVerticesAndNormalsBO.isNull() || !m_glyphVerticesAndNormalsBO->isUploaded()) { // Build a interleaved VBO for glyphs vertices and normals to get better performance // during the main shader based draw path size_t numVertices = m_vectorGlyph->vertexArray()->size(); Vec3fArray data; data.reserve(numVertices*2); size_t i; for (i = 0; i < numVertices; i++) { data.add(m_vectorGlyph->vertexArray()->get(i)); data.add(m_vectorGlyph->normalArray()->get(i)); } GLuint uiSizeInBytes = static_cast<GLuint>(data.size()*3*sizeof(float)); m_glyphVerticesAndNormalsBO = oglContext->resourceManager()->getOrCreateManagedBufferObject(oglContext, GL_ARRAY_BUFFER, uiSizeInBytes, data.ptr()->ptr()); } if (m_indicesBO.isNull() || !m_indicesBO->isUploaded()) { const UShortArray* indices = m_vectorGlyphPrimSet->indices(); size_t numIndices = indices->size(); if (numIndices > 0) { GLuint uiSizeInBytes = static_cast<GLuint>(numIndices*sizeof(GLushort)); m_indicesBO = oglContext->resourceManager()->getOrCreateManagedBufferObject(oglContext, GL_ELEMENT_ARRAY_BUFFER, uiSizeInBytes, indices->ptr()); CVF_CHECK_OGL(oglContext); } } }